From 91988812891c6eeee16c8467f7a022a349bbecd3 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Mon, 4 Jul 2022 22:32:33 +0300 Subject: [PATCH 01/17] Intermediate commit. --- .github/FUNDING.yml | 4 +- .github/workflows/docs.yml | 40 ++++ .gitignore | 21 +- CODE_OF_CONDUCT.md | 135 +++++++++++++ LICENSE | 2 +- README.md | 69 +++++-- assets/gddocs-icon.png | Bin 14802 -> 0 bytes assets/icons/gd.docs.png | Bin 0 -> 40371 bytes docs/.nojekyll | 0 docs/CREDITS.md | 36 +++- docs/ProjectCard.css | 189 ------------------ docs/README.md | 42 ---- docs/_404.md | 5 - docs/_sidebar.md | 120 ----------- docs/endpoints/acceptGJFriendRequest20.md | 60 ------ docs/endpoints/accept_friend_request.md | 56 ++++++ .../accounts/{loginGJAccount.md => login.md} | 0 docs/endpoints/accounts/register.md | 47 ++++- docs/endpoints/accounts/registerGJAccount.md | 46 ----- docs/endpoints/accounts/register_web.md | 3 + docs/endpoints/blockGJUser20.md | 56 ------ docs/endpoints/block_user.md | 54 +++++ docs/endpoints/deleteGJAccComment20.md | 56 ------ docs/endpoints/deleteGJComment20.md | 59 ------ docs/endpoints/deleteGJFriendRequests20.md | 57 ------ docs/endpoints/delete_account_comment.md | 56 ++++++ docs/endpoints/delete_friend_request.md | 52 +++++ ...deleteGJLevelUser20.md => delete_level.md} | 0 docs/endpoints/delete_level_comment.md | 52 +++++ ...eleteGJMessages20.md => delete_message.md} | 0 ...downloadGJLevel22.md => download_level.md} | 0 ...loadGJMessage20.md => download_message.md} | 0 ...tComments20.md => get_account_comments.md} | 0 .../{getAccountURL.md => get_account_url.md} | 0 .../{getGJRewards.md => get_chests.md} | 0 ...mmentHistory.md => get_comment_history.md} | 0 ...ndRequests20.md => get_friend_requests.md} | 0 .../{getGJGauntlets21.md => get_gauntlets.md} | 0 .../{getGJScores20.md => get_leaderboard.md} | 0 ...tGJComments21.md => get_level_comments.md} | 0 ...lScores211.md => get_level_leaderboard.md} | 0 .../{getGJLevels21.md => get_levels.md} | 0 .../{getGJMapPacks21.md => get_map_packs.md} | 0 .../{getGJMessages20.md => get_messages.md} | 0 .../{getGJChallenges.md => get_quests.md} | 0 .../{getGJSongInfo.md => get_song.md} | 0 .../{getGJDailyLevel.md => get_timely.md} | 0 .../{getTop1000.md => get_top_1000.md} | 0 ...{getGJTopArtists.md => get_top_artists.md} | 0 .../{getGJUserInfo20.md => get_user.md} | 0 .../{getGJUserList20.md => get_user_list.md} | 0 .../{likeGJItem211.md => like_item.md} | 0 .../{getSaveData.md => load_data.md} | 0 ...ploadGJAccComment20.md => post_comment.md} | 0 .../{rateGJDemon21.md => rate_demon.md} | 0 .../{rateGJStars211.md => rate_level.md} | 0 .../{suggestGJStars.md => rate_stars.md} | 0 ...endRequest20.md => read_friend_request.md} | 0 .../{removeGJFriend20.md => remove_friend.md} | 0 .../{reportGJLevel.md => report_level.md} | 0 docs/endpoints/request.md | 2 +- ...requestUserAccess.md => request_access.md} | 0 .../{restoreGJItems.md => restore_items.md} | 0 .../{getGJUsers20.md => search_users.md} | 0 ...endRequest20.md => send_friend_request.md} | 0 ...adGJComment21.md => send_level_comment.md} | 0 .../{uploadGJMessage20.md => send_message.md} | 0 docs/endpoints/testSong.md | 45 ----- .../{unblockGJUser20.md => unblock_user.md} | 0 ...teGJAccSettings20.md => update_account.md} | 0 ...{updateGJUserScore22.md => update_data.md} | 0 ...JDesc20.md => update_level_description.md} | 0 .../{uploadGJLevel21.md => upload_level.md} | 0 docs/index.html | 84 -------- docs/index.md | 69 +++++++ docs/playground.md | 63 ------ docs/reference.md | 58 ------ docs/resources/server/secrets.md | 8 + docs/topics/encoding/base64.md | 10 + docs/topics/encoding/random_string_and_id.md | 64 ++++++ docs/topics/encoding/xor.md | 68 +++++++ docs/topics/{encryption => encoding}/zip.md | 0 .../{encryption/chk.md => encoding/~check.md} | 52 +++-- docs/topics/encryption/base64.md | 33 --- docs/topics/encryption/id.md | 71 ------- docs/topics/encryption/xor.md | 104 ---------- docs/topics/tags.md | 8 +- generator.js | 19 -- mkdocs.yml | 43 ++++ package.json | 26 --- pyproject.toml | 36 ++++ scripts/installPackages.js | 14 -- 92 files changed, 927 insertions(+), 1267 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 CODE_OF_CONDUCT.md delete mode 100644 assets/gddocs-icon.png create mode 100644 assets/icons/gd.docs.png delete mode 100644 docs/.nojekyll delete mode 100644 docs/ProjectCard.css delete mode 100644 docs/README.md delete mode 100644 docs/_404.md delete mode 100644 docs/_sidebar.md delete mode 100644 docs/endpoints/acceptGJFriendRequest20.md create mode 100644 docs/endpoints/accept_friend_request.md rename docs/endpoints/accounts/{loginGJAccount.md => login.md} (100%) delete mode 100644 docs/endpoints/accounts/registerGJAccount.md create mode 100644 docs/endpoints/accounts/register_web.md delete mode 100644 docs/endpoints/blockGJUser20.md create mode 100644 docs/endpoints/block_user.md delete mode 100644 docs/endpoints/deleteGJAccComment20.md delete mode 100644 docs/endpoints/deleteGJComment20.md delete mode 100644 docs/endpoints/deleteGJFriendRequests20.md create mode 100644 docs/endpoints/delete_account_comment.md create mode 100644 docs/endpoints/delete_friend_request.md rename docs/endpoints/{deleteGJLevelUser20.md => delete_level.md} (100%) create mode 100644 docs/endpoints/delete_level_comment.md rename docs/endpoints/{deleteGJMessages20.md => delete_message.md} (100%) rename docs/endpoints/{downloadGJLevel22.md => download_level.md} (100%) rename docs/endpoints/{downloadGJMessage20.md => download_message.md} (100%) rename docs/endpoints/{getGJAccountComments20.md => get_account_comments.md} (100%) rename docs/endpoints/{getAccountURL.md => get_account_url.md} (100%) rename docs/endpoints/{getGJRewards.md => get_chests.md} (100%) rename docs/endpoints/{getGJCommentHistory.md => get_comment_history.md} (100%) rename docs/endpoints/{getGJFriendRequests20.md => get_friend_requests.md} (100%) rename docs/endpoints/{getGJGauntlets21.md => get_gauntlets.md} (100%) rename docs/endpoints/{getGJScores20.md => get_leaderboard.md} (100%) rename docs/endpoints/{getGJComments21.md => get_level_comments.md} (100%) rename docs/endpoints/{getGJLevelScores211.md => get_level_leaderboard.md} (100%) rename docs/endpoints/{getGJLevels21.md => get_levels.md} (100%) rename docs/endpoints/{getGJMapPacks21.md => get_map_packs.md} (100%) rename docs/endpoints/{getGJMessages20.md => get_messages.md} (100%) rename docs/endpoints/{getGJChallenges.md => get_quests.md} (100%) rename docs/endpoints/{getGJSongInfo.md => get_song.md} (100%) rename docs/endpoints/{getGJDailyLevel.md => get_timely.md} (100%) rename docs/endpoints/{getTop1000.md => get_top_1000.md} (100%) rename docs/endpoints/{getGJTopArtists.md => get_top_artists.md} (100%) rename docs/endpoints/{getGJUserInfo20.md => get_user.md} (100%) rename docs/endpoints/{getGJUserList20.md => get_user_list.md} (100%) rename docs/endpoints/{likeGJItem211.md => like_item.md} (100%) rename docs/endpoints/{getSaveData.md => load_data.md} (100%) rename docs/endpoints/{uploadGJAccComment20.md => post_comment.md} (100%) rename docs/endpoints/{rateGJDemon21.md => rate_demon.md} (100%) rename docs/endpoints/{rateGJStars211.md => rate_level.md} (100%) rename docs/endpoints/{suggestGJStars.md => rate_stars.md} (100%) rename docs/endpoints/{readGJFriendRequest20.md => read_friend_request.md} (100%) rename docs/endpoints/{removeGJFriend20.md => remove_friend.md} (100%) rename docs/endpoints/{reportGJLevel.md => report_level.md} (100%) rename docs/endpoints/{requestUserAccess.md => request_access.md} (100%) rename docs/endpoints/{restoreGJItems.md => restore_items.md} (100%) rename docs/endpoints/{getGJUsers20.md => search_users.md} (100%) rename docs/endpoints/{uploadFriendRequest20.md => send_friend_request.md} (100%) rename docs/endpoints/{uploadGJComment21.md => send_level_comment.md} (100%) rename docs/endpoints/{uploadGJMessage20.md => send_message.md} (100%) delete mode 100644 docs/endpoints/testSong.md rename docs/endpoints/{unblockGJUser20.md => unblock_user.md} (100%) rename docs/endpoints/{updateGJAccSettings20.md => update_account.md} (100%) rename docs/endpoints/{updateGJUserScore22.md => update_data.md} (100%) rename docs/endpoints/{updateGJDesc20.md => update_level_description.md} (100%) rename docs/endpoints/{uploadGJLevel21.md => upload_level.md} (100%) delete mode 100644 docs/index.html create mode 100644 docs/index.md delete mode 100644 docs/playground.md delete mode 100644 docs/reference.md create mode 100644 docs/resources/server/secrets.md create mode 100644 docs/topics/encoding/base64.md create mode 100644 docs/topics/encoding/random_string_and_id.md create mode 100644 docs/topics/encoding/xor.md rename docs/topics/{encryption => encoding}/zip.md (100%) rename docs/topics/{encryption/chk.md => encoding/~check.md} (69%) delete mode 100644 docs/topics/encryption/base64.md delete mode 100644 docs/topics/encryption/id.md delete mode 100644 docs/topics/encryption/xor.md delete mode 100644 generator.js create mode 100644 mkdocs.yml delete mode 100644 package.json create mode 100644 pyproject.toml delete mode 100644 scripts/installPackages.js diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 02fb2d2d6..6bc9a5b33 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1 @@ -# Why the hell not? - -github: Homurasama, SMJSgaming, NeKitDS, Altenhh, GDColon, 13laze \ No newline at end of file +github: SMJSGaming, nekitdev, naoei, Wyliemaster diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..45d5e8dd3 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,40 @@ +name: docs + +on: + push: + branches: + - main + +jobs: + docs: + name: Docs + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python 3.10 + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Update PATH + run: echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Install Poetry + run: curl -sSL https://install.python-poetry.org/ | python - + + - name: Update Poetry + run: poetry self update --preview + + - name: Configure Poetry + run: poetry config virtualenvs.in-project true + + - name: Install dependencies + run: poetry install --with docs + + - name: Pull + run: git pull + + - name: Deploy the documentation + run: poetry run mkdocs gh-deploy diff --git a/.gitignore b/.gitignore index cae7906eb..3063c7ea5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,22 @@ -node_modules +# editors + .idea/ .vs/ -package-lock.json \ No newline at end of file +# virtual environments + +.env +env/ +env.bak/ + +.venv +venv/ +venv.bak/ + +# documentation + +site/ + +# remove if lock file should be included + +poetry.lock diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..d983f0a58 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,135 @@ +# Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement to +[][Email]. + +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][Home], +version 2.1, available at +[https://contributor-covenant.org/version/2/1/code_of_conduct][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's Code of Conduct enforcement ladder][Mozilla Code of Conduct]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://contributor-covenant.org/faq][FAQ]. Translations are available at +[https://contributor-covenant.org/translations][Translations]. + +[Home]: https://contributor-covenant.org/ +[v2.1]: https://contributor-covenant.org/version/2/1/code_of_conduct + +[Mozilla Code of Conduct]: https://github.com/mozilla/diversity + +[FAQ]: https://contributor-covenant.org/faq +[Translations]: https://contributor-covenant.org/translations diff --git a/LICENSE b/LICENSE index 5c3cd9117..4961e0493 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 GD Programming +Copyright (c) 2020-present, GD Programming Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e25170e98..10f386bef 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,68 @@ -
- book -
+![gd.docs][Icon] -# GDDocs +# `gd.docs` -**Some documentation for Geometry Dash's servers, and the game itself.** +[![gd.docs][Badge]][gd.docs] -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/9badf0ef98b242a7883c6dbd4e6c9443)](https://www.codacy.com?utm_source=github.com&utm_medium=referral&utm_content=gd-programming/gddocs&utm_campaign=Badge_Grade) +**Documentation for Geometry Dash.** ----- +`gd.docs` is a project built to openly give advanced information for aspiring developers looking to interface +with *Geometry Dash*. We primarily aim to create this as a website for people to learn more about the inner +workings of *Geometry Dash* along with its data. -**GDDocs** is a project built to openly give advanced information and readable information for aspiring developers looking to interface with Geometry Dash. Primarily, we aim to create this as a website for people to learn more about the inner workings of geometry dash, along with it's data. +You can find the website over [here][gd.docs]. -The GDDocs website can be found [here](https://docs.gdprogra.me/#/) +## Installing -## Running/Building -**You will require Node.js `>=12` to debug and run this project.** +**Python 3.7 is required to build the documentation.** -GDDocs is built off of the `docsify` engine, outputted to a generator file to be able to work well on server environments, rather than GitHub pages. This is primarily to allow for easy domain usage and development in a place where it can always update, and be hosted upon locally rather than over GitHub's servers. +Firstly, you need to clone the `gd.docs` repository: -As such, rather than having to install using the package.json; (which we would recommended doing anyways using `npm install`,) the installation and such has been included in `generator.js`. +```console +$ git clone https://github.com/gd-programming/gd.docs +$ cd gd.docs +``` + +Then you can install the dependencies via: + +```console +$ python -m pip install . +``` -```plain -node generator.js +Alternatively, if you are using poetry: + +```console +$ poetry install ``` -To debug it, you will need to properly clone or pull this repository. +## Building + +`gd.docs` is built using `mkdocs` library. Building the documentation is as simple as: + +```console +$ mkdocs build +``` + +The result will be placed in the `site` directory. + +## Serving + +In order to make the documentation easier to work on, one can use the following command: + +```console +$ mkdocs serve +``` + +It will run a local server, updating all changes to documentation on-the-fly. ## Contributing -Contributions are preferably made to the documentation, rather than the simple `generator.js` file; unless need be. Contributions to all aspects of this project are preferred to be made over pull requests and issues. Ideas on what to contribute or read over can be read in the [issues](https://github.com/gd-programming/gddocs/issues) section of this repository. +Contributions to all aspects of this project are preferred to be made over pull requests and issues. +Ideas on what to add or improve can be found in the [issues][Issues] section of this repository. + +[gd.docs]: https://docs.gd-programming.org/ +[Discord]: https://gd-programming.org/discord +[Issues]: https://github.com/gd-programming/gd.docs/issues +[Badge]: https://github.com/gd-programming/gd.docs/workflows/docs/badge.svg +[Icon]: https://github.com/gd-programming/gd.docs/blob/main/assets/icons/gd.docs.png?raw=true diff --git a/assets/gddocs-icon.png b/assets/gddocs-icon.png deleted file mode 100644 index 0c3e1efb238ea0f873f4447f33c7597795025c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14802 zcmV;@IW5MCP){008<31^@s6XD%@V00009a7bBm000Gv z000Gv0c~iV`Tzg`0drDELIAGL9O(c600d`2O+f$vv5yPMg zZ_S<7NE%I7cUO1c&pAa^_dL{0_qTq}`@4*3G#ZUYqtR$InkK_wnpTIu$DZdg!zjPq zxE6Ru`ALsyS{|EeS_vs!LwQ`jFx1Pk{%^nic9Vqf(qofV2%etzl%LVG04CEkHNr|m zmBzB`=c%bF2wy%nA%6L@;s(HfhvErnnizfSZeINN z4k8z4bKkywY++%+SXx>#jvP6nT6kk*WQ2{6kITnW!Ja&J@7~SmXFU2H{A&je9Prey zv$F8D#n))+fnv#}6^3O-I2IwXM(G@*qhok@I8NtoarE@{_4U#@Aq_?Y;XFMtnWe8=`2Iv9VdnFB zlYY*epPx5L^aie(2=&Ot_xA7K&qa0BiHl?~!@oP;h`ZmKdw$lCKTKdMVYyD#K6HYPL!|^XAC;u;JUK#rrdfKfx9J2P_ z*w~l@7hk&f6gD7qkS@L^_i@4NSU%k7 zYPuR@0OGHhIa2m zgcf_aFxEJ@1*OcnH9b9TktMf`4kMKq9DV>6nAH*2b-%halX)<|xOl>{tPXme%5)Gt?uCv!3xk$yg z0yLZHsiATa3mv0nV zs+*peIKfsdz3j+yWfG4n5T0nem1s*}1GLx!Ml_S)a#c*u%1caTT+W+fdIx(`iJ{Hp zvRfZwEsRrgA6m{XKbD`JJ+ZK`;LwfEp&Omwf=f3;NA&!=I*zX$TI|81)|5@+p8&DV!_Z63U(Z^y{rHEUeHQ4r5ZW6?(_omK%q>woznFP2Kesq0R@SL8ePw-KTlxUdV&4EtT+XxXByidN<|p7%sT9g+rWcL& zCkFd|k1YB7+R2iy7ZUwLb0<$fNFhy$Tze$!N^tG5l$LIoT<{p2Av^KJk7>bg04?@Q zK(6ExXFvJ2d-rb4d-Kuqvjg47w*-^_jCbN)CCRsclH&32CY0%$UhDnUB#m|&SW8ry7%h~G1Dk!C)#r4C@(&8Fc$hCih;`vV@o~OU1gQc{? z!^2KjSC{YF%L8-oSy}tq%3lPXjXw`EyDmGtkY%T9E^1_s>1_A)_3^2$B=Ui+yRZ6# z)aJ{6q=jBRrfu$zCz9VtY~At)By@D&MJ6UDA|!Nm+N~+F_7+)owWmRI9<&>OF0%8D zH^NZDh_5d{bLNami6dLAFXv)kT3U(@zu}6TyOPPTQUdO+^ihj3O(2wAd*jB$rolV9 z`VtEZ({o3uK932w2IWQ!N`M-rQc12csGRVlSp)rtS1nIsdhXLp^SM9H&(FVBS*nwxv6QU6F4e7p7CT!>zQLmJ-@o4!eeCM`a+|CO z#xzr0KA1{wPJM*DNA0dRfO36)>A?bto|1ZQBoZmvw(XLe&s%RR`t7CYwcuHsZ|o>V zF3V_YIgKgFH!(=U+Ir1Z@27aOZCYHz2@<5OI>-$W&$PtecoVVcl@`n
!$2F%EgTZD@@t_6!mfvI;O=$My|T@uGIF+4(iyv`M`U|>+@SS-zn=yx3XCzuDun(Js5vw(|evIlHTfRcU_mjk4^f$gnwcT<*6f zkDoY94;{LpJF!@-L|J>;fhVm!sI>MiNlS`djmyzxg$v5knz>w#Z%ZsUV8Ai3b@=km zMDM*+#;NP>Dw_IGZoOUl)LK(-$;vxDJw5)ew5?vIYpK$k6uH_yNo5%Hv9BtnF$|N~ zv?j(?cvh(d*B4!sQ6@R*k z*n9y?Pff8QB9G0*5xwlnE8dY9>N{ZRxV&w!ZRn8jzp zI&|oeO_pBW61(MM`KJD#QFaPlE5ptYB;PPZq8yiBaZ@B3xz{jti)%YWw&A7R{QPg_ z=Xus%Zcyn@$iX~3G7{Y4%eLEASU=yiZoIm_oUKtxlSi>ww2Y39zHNKn@L@x*NYgN0 zpWl<(viXPRR_m)vvvUuU*vFWN<*}4DoleVd_4e=I&s};cbRl}yj5On`Hk3d3Dxr^z zj6mEb1U@@E8=+E~mD+LHhfPDr<(d_uogK`MM#LlURH@*8?%4AO|AL*{fu~x0{>{yt z#A_z8tF>|_T3pv03B^LV>!~IjtQNWoi9TO=aN@}E$0>>DZ(X%x#|~#~Y)l=P;d-v`ml?gyX+{Xse7fdidAV0n=cFw_VsQ`-AixG`Tp%i@R#Ji0h@Nn)9=9p{sbO3fZL(9)ID*XP9Wcr3A2y=hfC*d8o}fp&>M4ue9W{kDdOY zd}K3Q5xYIGZQJ&EBL1iz38lFZ!3cc?x8yvLnVbLA;_0*4pt6JwDrGz$kH_VFd$siz zKNcFnhe7Q8H6SL(7$H_(nWVP3%4Mgx?&}>H{yp8|s<{|J3th!27C${VKJ}MVMJGRM{hqov&U_wN1-$ z9E-lK&rWndV4BAMwSHH$BgP^zZQwO4)J^DXfciXIZ>dywf|cER?%I>+UBvSkbBoyn2b?{LQabr8XDpYRba`}>9my`-gJ{4 zi9AZ*x$YKMEqF~BguV(7{q}_ikNw~$kCE|mFx!55dYUKiFffAz-;iynYc2M2?Lpa2 ziHYtv2z_#LlFtWA4E6u49gBTpqop)0`1U1qLRTPf{rlGh4Oj)yEu3B?U0GXMYu|#tWZ;Xi# zBrcD~yT3uNU@Hp_R`?=>b8c)ND(a>(GhJ9qAMWxK7?j1xFD z`K?OU-FMrEhlefH%dyV9|FX?*H*E7!c98_!M$m$9eVR|`Wstxt7MAZm{)59$v6YOy zI@i9Y^Y3cm#;aQ^`CV}2!bG^xM~3e-Z0k$45IWEIs~Gm^TXc$9B37dNPTMjcVRb-T_|~JDgdculHt&Q>rG73FwH{-2LU-D= z7Of<7U|80_>q;dLh}?SXt%1ApL0Wb{qlknYMmRH+)e?yai$t!l zsP57pyOk4^kSW_)~_9u;@&*ijPGaOCW}a9VbmltaTzS63GX zKBDzCl1`_iUHwV4y*6Z9C2irGo0b(iFpNZZqWjAHT;}f!g#vo%E7!ya`_HjpkdtLB zY|Jn>H)msurJkOiScKwq(=s1s4Mtn|=A)&Bu8_~>eq-v`iSI5fEFiOdPW;XSBCu?{ zYz&}y-6)kxJOfWJ-ZC&QDg@{(eRI(+LI<&U=fk8Gu9?BXL7ttLyVC@@D@`E3h!P5> z7zk-0DVNLTBIp>3bjR;9qxPS(5TPx6_-QAhOG<^}$6h}&`q@Y%Qi#Xn#qsg+wd(Ix z5ro*~7%7uppfx%=ir_d(aeK70KlvlpfTY~T(1H&y?I`pz-l?O{{P23Z$dh$1O-)U$ zS~150ATT!`gD6Po{vK;~Z`Yf{D0HA*`f$>|LI=jyojl{e&%_o-5OtaELjujWO{OfqUd}f+y>PJvQx4S!; z)e~nOoBR2-Jgn|G|9WUia;o~NN>&(k1{O8KY6o0I#j`a#XHr&re z+_AZj#c&=j3t9>r&#jlqZ$HaUeDPZ>|N0CI3x;LAm5I^mx70AM?i)E@#(p4J^$c{Nahyq#o zLZQ$RO?H34w5*S_kWee3UyQQwr}#}^_D4tgW9#G}|1>mieX&ry@Aa3CeRgqiF;A7Pq8M~h3Sz)TATj&W(vm?|-AE>rCcQ}3 zm+B2{je51jM>aJ?=%DASZT#4D>t6pkY4vA+c$9ktb3b~SwF4bn23X&9*RbBJxAQap zE@1#6z?R$J!cKniA6OW$O!HdO5KnSDj>G#_uo^CiMKRU7@knsVWqJ|x!Kc&dSpU{7 z-!M$$1{MPLK6E$Re%mjwFaxU(@#EYo;+Nv?yY6b%cl~bGNsq${tojf4|4}HcyXSh( zo%->SciOg{CoL7&N=F^vE}B(ARhFINb#*vCqZeny<8dQQyR{^D?_^=8EQ)LRHQaoN ze)69VlJJjmPoP;y(f`BHTlR8KCd}fl1j)U`o8G`?zV{Q>aHw3J&1U7iMt^;~7(dOb zp(?S9?V9{oK=B33WHLsar9vb2^=96~0%BQ+MY{eF{^`GeCX~X*YwfveJG<;x-%KLE zjz4Zzte#F5CVF~$3`)`&-QC?7wa%2yPB-k%R~xgdD|8GJy0|0NWYJDrqFVj12wz(8 z%YOByrWUwLM-8(58>O?e(^yzoU^plvFP}E5olh6kx=(LlU;r;nE4+rN!ax1ZXGr+p zty_!_QE$KNmq_3@He?$u)3hQh+(HN5c??_;|@@UB2b50UTsz&m|UA`C#t%dgLJ5$7jn>6m7vY+2NJ z-dR}U-=nhaw|}J>#SWvnYNr_F$1rM|RY4$bJcOP~rHr|`IgjEE)+*%2&+-FIKlkFA ztL0EHmcoZHa3koY=j@*PdImv>9>3>W`aO*lImEj-I?e^19X;h=R|>gRfrf-D?~RO% z@ZFBZml~R&W735up(BHcq=FZ22YBOPwH#0dkFGcz;KbkjAOCrI6TrFe`fKWT15ibO z=$=3KU)#liiw;Y^{m!?tdLb=!`p~hq6!rOl(1n)Jtj2;O2+Qu@X^=f+EuM{EOYmzU zZvtok-$8c#FTTN_gAh@w;)%BFujbda0{_;HPkfTS{Hd?3x(S`{d$0feAJ#l9fr#gS ze2isY_$gaFKF+eoPPe_V&j*CAJ{E2~tA@a)F!uHJd9$;#!p&&yr2KjXUx{2ThZ_KZ zHHGj|Q-}EB2?Px+JTmte>dC)?zNZ#KhmaRXPqW$Y{+P}Ggsk_m;H*?DBi#6NV)lk6 z=`;;|&O1WaC*ouu;LQK!6aw6h8#V8)_)~9aPLLn{+M|!v`6kL*SF&exA*I z@5kD52Ztwii)mbf4q`_(UcLw+^tP$B2O)SBSbezMIAp?a%dg!Os*Lzrr~*g)t*H)? zoKtmVJo)64ZYWm03HS>k7sP9)4!WQPFM;rR;|v`T{uS?kSIu1gje?H8Q(yiz%lu@N zX@Z3kbY3J9VdOFM#|@9!W&0kL2UsqblP|0(>+ID~E5S=3{1-p=SNs~yEmu(1yiuYr zEo9k=uY8A%{ms+NEV*qwGp@EkT2kmhOmA*n=}q0PRV3$lVxd(_Zx^E0f|p2Z57++M zPyB9OMUU_THGJe6+Iu);?UA`J)Y*rIhS<)XJJ}OYJW*9|d?3?hQ42&i9@l8%XKhM7 zr`F0f@b%=xSDw~FuM=?NafY@i0q#-E?p50xAB5Ot->#uPZdY1;OtltzeL$U^3@E>* zB)Gq6DyxF3#LhR7rWb&i9UXLnwqNd zEM0mSNhN1SR7+K2R~EuBOsWx2>umf5(1O>j2Qik)kmKH}?TZIhi(Q>mg9Kf!6`^v~(`5ro(BXxk&aRiZR!^-2uZ7+`2sfS!T=udwG(iV2GDlvo zjFQ%Rua=+%uZ7-RC>uLsWhpnN)h6hIu{u!l zEOA{~&#n`6K@o)D4O71#%>>HVvNs-&;l|&7`|Ye+0%?~eJXm(&#%s$SFuJw2?eI`% zM>bwAgu!%KRwaQ96+@jp$gO2H=b}ekwGUz@gdyDbz>H^Ami@l_?vt~vc>;lHYKpe- zZNoWQlDoK8L$yscIPus5eY|q8y{2|(!M6oQrIvzN;###EkFiv8%Vv6LsKfF!wL!Y{ zn$|^(rQ+H6{{DV!|J2x~8f-R)Od-7>S8o5L*R$6L2;M0qRDQ?{xuh9gAXsY33sjx`|t{d7x zS21u>ZW5uBbQ(=Skk>5RWveETfsyW= zX5;0;dUbiLr*m`~O?9ZFq!F`+VUq|h^5NlO{ut!~JzZ9#sUCRD6*K5SLrZVml3SML zFNDz@bm7A(6q%-Z5E{Y^x>W;V8XdFqet5C{lcA2%(S(Pkg+-Q4FECBh;fcN8q#NJR z(i;~y>g*`JX~Ih`oza4C5-NM+nb_E|+5}y-z489scz~E)XXL{R1P{6rJxmi`gd6X- z%l7y88^VjOYB5CMb#}ePHQZSLKr|Uh~6ZkNzj51EiM+l z2+PjP+9E;MxZxF*T|HO`<2ZVHN;3h$>xnm^gO{<rG&+oV9V+Xf}$>d%?0x>yC{b8=Z}p!z(x_z3FyYjV2KImTF?v8-L6ixt^UV zt$Y|Itrx*)G{JxlI#_kAdJ`J+j4EqyRoB_EHH}>2x-wl>$Lt!-MuB&Xz1}b*LV3F3 zd%f`&A(yzWSauz=w<62g9MjYu8MBL|w-<_4Z)**~(@iz4i|(bb4>Ios%PufqQyNoTs%D!(pY;PyD;De=dueYG6y7VUYjy7aX zP>-c*Pqg5J12H??cxBl*XzY4+S!btgyuZM{TxZvoy&chl4-UBTie(REPDItK-jFFA z9UaA8$XgkZSGgZu__^kuJNP*}ewO9v05}&jS$=5NN24~Phz<8MyE{%tC+pbU$Ili$ zPQK|%*36)(hN@kG?BZIr*o7Mp6m>VBWxwX0cVF=9IdKz!@aK=bD$cL*vwU7tCTPJ! z$Q_&exrk#pb76O~?p@`n#(1ukK+H}avfOPcu$Z{&>9Q4foR$sN<0G5+0fv9^=g;{% z#GWScmpy|?ej~t50ME4}mnwLOx9iHST+m%4Vh9>yZZ#pV2f2%@GF?{I*+VnDBCx@D z%}AuTiw)dxEgM+lYiS|;sptNc-vrXaBWQKbCwN$DxYttD3A%<0-bj{TpJ8DEmff~( zK3#UljvaiNtFnvhh6P`(W%p;$<#IVzC=^0BHy$FB7P(O*c3;j9)gyr5A^d6O2GEKW zJ%{yPe>J}mc9Z4q+I3mOg}oN}*Mlu{Rf}BWDt2*|G}N;5h4qt@lgJ$M-gvkmT`WAD z_}V{SG#+mR@&>T|wzu%dG7LELo#)5{c(G~44-W@7wIuz&ZTZC;8h)c)53uU#LqBC< zp>m0<@}-7ac7CWEJCX|$sMsFo%v+LDgc1Wf%SN+_FRPVUiU@bM)cI*w1|I zcUUtaEu?h)rSQ*u=lO;UU%obo8zK+;jr2lfN5|R8Fa84y8NR47gHBYus;;#MlAseY zyN8%PjKI2sW)r-MwEFmefQygtBtA04>IuY+umje+nFTJH|M4+)^uPTj3n2zt&z0VI zQ1x`#s>Keg4zUN_#~U;dJgg#`XSUz=3#^%e*cx%;+WXMmtQA-!Ykua5e`1qQhtGXi zQAbH*ZhR<8Z|CmM9?lLrxW5PQeUu&klh6Cs2}e|%<#5lorNtZ_OFY>o zGwaI}<#JkHl-2OHW%^ovB0OcbwGd4;{91I-d3*Nk@hE0z)ljY2c^m=DE(ch!CfFoG zCcoB8S@h)_KvLW!XG^%WVMYoW7CAowu}-s6cF7m7v#`X!r&WN^W&TSVQp%4( zR8`H32%_|6p!CK>@}LzriI8P6u+~jN-VAWyCV&IixDja955y}4ogF>J1-v+VI`oz} zXrQ4r_F!my%#QW!5Id3yD+^)T3wblZF+q6&m4p!fASKt5ytb}A0f3fb*-wC`qQa>u z7PEqE=xlDFD@xMI416GCse+2xez^g0$*#fA&DevFURd(a-3X_5vExea`~*Z z{?h70`~xKZW&i?5?H>ZKW}#2J3*K|xjJ#w*TM)bq*jc06WiiGY|31AK{sMY?ds(Se zqF3dO8+uyJhLM&Zy#cWDXr|e5+gm~>e8k-+$U8yoeJRzAi~im=7QEwmM_4)QE-kx^ z*BhIS$G=a-e(%tsL+ImmDN)Dc_71oAC1$bPn5JrA@!{^{kix(6z3*sPoUdB&AO&7Y zy9(ZO+*3Fw5($=0r`fJuyV&UHXdt0+)d@OL=;tm+DwT5iN}ZB(gjp8T1dA$sxca+D z^y}#coWIBly6ifZ0b?mH1P)7HueJE?D0nAV;Fg_)&JCyXrK$yAm9H(r2$O2<=D~vp zBlHxGDAft0@lB~CKHo_OL3x7tN8psKm?vZH5kaFDwgrfKpsxgl

Wv+Nn4sZJOiUo5;845) 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 literal 0 HcmV?d00001 diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/CREDITS.md b/docs/CREDITS.md index 59c0b2d31..68ba3a6b9 100644 --- a/docs/CREDITS.md +++ b/docs/CREDITS.md @@ -1,12 +1,28 @@ # Credits -Thanks to the **Geometry Dash Programming** experts, and the **GDDocs** contributors for making this project a reality. Without you guys, this project wouldn't have even been possible. - -*-- Team professionally led by [SMJS](https://github.com/SMJSGaming)* -- [nekit](https://github.com/nekitdev) -- [Wylie](https://github.com/Wyliemaster) -- [Andre](https://github.com/AndreNIH) -- [Cvolton](https://github.com/Cvolton) -- [Colon](https://github.com/GDColon) -- [AlFas](https://github.com/AlFasGD) -- [zmx](https://github.com/kyurime) +Thanks to the **Geometry Dash Programming** experts, and the **GDDocs** contributors for +making this project a reality. Without you, this project wouldn't have even been possible. + +## Staff Team + +- [SMJS][SMJS] +- [nekit][nekit] +- [zmx][zmx] +- [Wylie][Wylie] + +## Experts + +- [Rekkon][Rekkon] +- [Andre][Andre] +- [Cvolton][Cvolton] +- [Colon][Colon] + +[SMJS]: https://github.com/SMJSGaming +[nekit]: https://github.com/nekitdev +[zmx]: https://github.com/qimiko +[Wylie]: https://github.com/Wyliemaster + +[Rekkon]: https://github.com/AlFasGD +[Andre]: https://github.com/AndreNIH +[Cvolton]: https://github.com/Cvolton +[Colon]: https://github.com/GDColon diff --git a/docs/ProjectCard.css b/docs/ProjectCard.css deleted file mode 100644 index 7d71eb6c1..000000000 --- a/docs/ProjectCard.css +++ /dev/null @@ -1,189 +0,0 @@ -/*html, body { - font-family: Torus, "Helvetica Neue",Tahoma,Arial,"Hiragino Kaku Gothic ProN",Meiryo,"Microsoft YaHei","Apple SD Gothic Neo",sans-serif !important; - font-weight: 300; -}*/ - -*, :before, :after { - position: relative; - box-sizing: border-box; -} - -.project_cards { - display: grid; - grid-gap: 10px; - grid-template-columns: repeat(auto-fill, minmax(200px, 290px)); - justify-content: center; -} - -.projects_card { - display: inline-block; - width: 100%; - height: 120px; - background-color: hsl(160, 20%, 20%); - border-radius: 10px; - overflow: hidden; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25); - transition: all .22s ease-in-out; -} - -.project_card_background-container { - position: absolute; - top: 0; - left: 0; - height: 100%; - width: 100%; -} - -.project_card-background { - border-radius: 10px; - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - object-fit: cover; - transition: opacity .22s ease-in-out; -} - -.project_card-background-overlay { - background: hsla(160, 20%, 15%, .7); - position: absolute; - top: 0; - left: 0; - height: 100%; - width: 100%; - border-radius: 10px; -} - -.projects_card-card { - color: white; - text-decoration: none; - display: flex; - flex-direction: column; - justify-content: space-between; - pointer-events: none; - height: 100%; -} - -.projects_card_content { - padding: 10px; -} - -.projects_card_content-details { - display: grid; - grid-template-columns: minmax(min-content, auto) 1fr; -} - -.projects_card_logo { - display: flex; - align-items: center; - width: 60px; - height: 60px; - flex: none; -} - -.projects_card_logo-image { - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - border-radius: 6px; - -o-object-fit: contain; - object-fit: contain; - background-color: hsl(160,20%,20%); - transition: opacity .22s ease-in-out; -} - -.projects_card_details { - display: grid; - grid-template-rows: 26px 1fr; - margin-left: 10px; -} - -.projects_card_title { - display: flex; - align-items: center; - min-width: 0; - font-size: 15px; -} - -.projects_card_authors { - display: flex; - min-width: 0; - font-size: 12px; - top: 0; - left: 0; -} - -.projects_card_content-stats { - display: flex; - flex-direction: row; - align-items: center; - padding-top: 0; -} - -.projects_card_stats { - display: flex; - align-items: center; - min-width: 0; - margin-right: 15px; -} - -.projects_card_language-icon-container { - display: inline-flex; - justify-content: center; - align-items: center; - flex: none; - width: 10px; -} - -.projects_card_language-icon { - border-radius: 50%; - width: 10px; - height: 10px; -} - -.projects_card_language-icon--cs { - background: #BDFF00; -} - -.projects_card_language-icon--js { - background: #FFC700; -} - -.projects_card_language-icon--html { - background: #FF7F66; -} - -.projects_card_language-icon--py { - background: #66B6FF; -} - -.projects_card_language-message { - display: flex; - flex-direction: column; - margin-left: 5px; - font-size: 12px; - min-width: 0; -} - -.projects_card:hover:after { - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; - content: ""; - border: 2px solid hsl(160,40%,80%); - border-radius: 10px; - pointer-events: none; -} - -.projects_card:hover { - box-shadow: 0 3px 6px rgba(0, 0, 0, 0.25); -} - -.project_cards-compact { - display: block; -} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index e2658c90e..000000000 --- a/docs/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Introduction - -Welcome to the Geometry Dash Programming **[Discord](https://discord.gg/jEwtDBK)** server's online iteration of documentation for Geometry Dash. Here, you'll find all sorts of information, documents, and resources for interacting with **[Geometry Dash](http://robtopgames.com)**. We aim to make **[GDDocs](https://github.com/gd-programming/gddocs)** the most comprehensive and open source of information for the game, created by many people who have interacted with the game and wish to share such with others. - -The provided documentation is available on it's repository, over [here](https://github.com/gd-programming/gddocs). For all issues regarding information found here, please consult us by creating an issue. - -## Projects - -### Geometry Dash Wrappers - -A few people, or teams have gone out of their way to create proper wrappers and API's around the **Geometry Dash** servers and it's client. All of the known and endorsed projects will find their way here, as a listing of resources people can use for their own projects. - -#### Python - -* [gd.py](https://github.com/NeKitDS/gd.py) by [NeKitDS](https://github.com/NeKitDS) - -#### C# - -* [GDAPI](https://github.com/gd-edit/GDAPI) by the [GDEdit Team](https://github.com/gd-edit) -* [GDNET](https://github.com/GDdotNET/GDNET) by the [GD.NET Team](https://github.com/GDdotNET) - -### Geometry Dash Projects - -These are generally projects that generally interface over the Geometry Dash servers, and overall have built up their own recognition and traction along the community, and developers alike. - -#### Node.js - -* [GDBrowser](https://github.com/GDColon/GDBrowser) by [GDColon](https://github.com/GDColon) -* [GD-NodeJS-API](https://github.com/SMJSGaming/GD-NodeJS-API) by [SMJS](https://github.com/SMJSGaming) - -#### C# - -* [GDEdit](https://github.com/gd-edit/GDE) by the [GDEdit Team](https://github.com/gd-edit) - -#### C++ - -* [GDAddon](https://github.com/Keenlos/GDAddonSDK) by the [Keenlos Team](https://github.com/Keenlos/Keenlos/blob/master/ABOUT.md) -* [GDCrypto](https://github.com/Cos8o/GDCrypto) by [Cos8o](https://github.com/Cos8o) - -## Outside Remarks - -With this documentation, the Geometry Dash Programming staff team would love to see your interesting ideas with this project, and the kinds of things you create with the information provided. Make sure to hit us up on our discord, and show us of such! diff --git a/docs/_404.md b/docs/_404.md deleted file mode 100644 index cbafc5a4c..000000000 --- a/docs/_404.md +++ /dev/null @@ -1,5 +0,0 @@ -# Uh oh, you did a fucky wucky - -Wonder how you got here. Maybe an invalid link? - -I'd suggest reporting about it to [the team](https://github.com/gd-programming/gddocs/issues) as best as you can. diff --git a/docs/_sidebar.md b/docs/_sidebar.md deleted file mode 100644 index 327414df7..000000000 --- a/docs/_sidebar.md +++ /dev/null @@ -1,120 +0,0 @@ - - -- [Intro](/) -- [Reference](/reference.md) -- [Credits](/CREDITS.md) - -## **Resources** - -- **Server** - - [Comment](/resources/server/comment.md) - - [Friend Request](/resources/server/friendrequest.md) - - [Gauntlet](/resources/server/gauntlet.md) - - [Leaderboard Score](/resources/server/leaderboardscore.md) - - [Level](/resources/server/level.md) - - [Map Pack](/resources/server/mappack.md) - - [Message](/resources/server/message.md) - - [Song](/resources/server/song.md) - - [User](/resources/server/user.md) - - [Restore](/resources/server/restore.md) -- **Client** - - [Gamesave](/resources/client/gamesave.md) - - [Encoder Keys](resources/client/gamesave/kCEK.md) - - [GS Values](/resources/client/gamesave/GS_Value.md) - - [GLM](/resources/client/gamesave/GLM.md) - - [Value Keeper](/resources/client/gamesave/valueKeeper.md) - - [Game Variables](/resources/client/gamesave/gv.md) - - [Achievements](/resources/client/gamesave/achievement.md) - - [Quests](/resources/client/gamesave/quests.md) - - - [Level](/resources/client/level.md) - - [Capacity String](/resources/client/level-components/capacity-string.md) - - [Level Colors](/resources/client/level-components/level-colors.md) - - [Inner Level String](/resources/client/level-components/inner-level-string.md) - - [Level Object](/resources/client/level-components/level-object.md) - - [Color String](/resources/client/level-components/color-string.md) - - [Guideline String](/resources/client/level-components/guideline-string.md) -**Endpoints** - -- Comments - - [deleteGJAccComment20](/endpoints/deleteGJAccComment20.md) - - [deleteGJComment20](/endpoints/deleteGJComment20.md) - - [getGJAccountComments20](/endpoints/getGJAccountComments20.md) - - [getGJCommentHistory](/endpoints/getGJCommentHistory.md) - - [getGJComments21](/endpoints/getGJComments21.md) - - [uploadGJAccComment20](/endpoints/uploadGJAccComment20.md) - - [uploadGJComment21](/endpoints/uploadGJComment21.md) -- Level Packs - - [getGJGauntlets21](/endpoints/getGJGauntlets21.md) - - [getGJMapPacks21](/endpoints/getGJMapPacks21.md) -- Levels - - [deleteGJLevelUser20](/endpoints/deleteGJLevelUser20.md) - - [downloadGJLevel22](/endpoints/downloadGJLevel22.md) - - [getGJDailyLevel](/endpoints/getGJDailyLevel.md) - - [getGJLevels21](/endpoints/getGJLevels21.md) - - [rateGJDemon21](/endpoints/rateGJDemon21.md) - - [rateGJStars211](/endpoints/rateGJStars211.md) - - [reportGJLevel](/endpoints/reportGJLevel.md) - - [suggestGJStars](/endpoints/suggestGJStars.md) - - [updateGJDesc20](/endpoints/updateGJDesc20.md) - - [uploadGJLevel21](/endpoints/uploadGJLevel21.md) -- Messages - - [deleteGJMessages20](/endpoints/deleteGJMessages20.md) - - [downloadGJMessage20](/endpoints/downloadGJMessage20.md) - - [getGJMessages20](/endpoints/getGJMessages20.md) - - [uploadGJMessage20](/endpoints/uploadGJMessage20.md) -- Miscellaneous - - [getAccountURL](/endpoints/getAccountURL.md) - - [getTop1000](/endpoints/getTop1000.md) - - [getGJSongInfo](/endpoints/getGJSongInfo.md) - - [getGJTopArtists](/endpoints/getGJTopArtists.md) - - [getSaveData](/endpoints/getSaveData.md) - - [testSong](/endpoints/testSong.md) - - [likeGJItem211](/endpoints/likeGJItem211.md) - - [requestUserAccess](/endpoints/requestUserAccess.md) - - [restoreGJItems](/endpoints/restoreGJItems.md) -- Relationships - - [acceptGJFriendRequest20](/endpoints/acceptGJFriendRequest20.md) - - [blockGJUser20](/endpoints/blockGJUser20.md) - - [deleteGJFriendRequests20](/endpoints/deleteGJFriendRequests20.md) - - [getGJFriendRequests20](/endpoints/getGJFriendRequests20.md) - - [getGJUserList20](/endpoints/getGJUserList20.md) - - [readGJFriendRequest20](/endpoints/readGJFriendRequest20.md) - - [removeGJFriend20](/endpoints/removeGJFriend20.md) - - [unblockGJUser20](/endpoints/unblockGJUser20.md) - - [uploadFriendRequest20](/endpoints/uploadFriendRequest20.md) -- Rewards - - [getGJChallenges](/endpoints/getGJChallenges.md) - - [getGJRewards](/endpoints/getGJRewards.md) -- Scores - - [getGJLevelScores211](/endpoints/getGJLevelScores211.md) - - [getGJScores20](/endpoints/getGJScores20.md) -- Users - - - [getGJUserInfo20](/endpoints/getGJUserInfo20.md) - - [getGJUsers20](/endpoints/getGJUsers20.md) - - [updateGJAccSettings20](/endpoints/updateGJAccSettings20.md) - - [updateGJUserScore22](/endpoints/updateGJUserScore22.md) - -- **Accounts** - - - [Login](/endpoints/accounts/loginGJAccount.md) - - [Registration](/endpoints/accounts/registerGJAccount.md) - -- [Request](/endpoints/request.md) - -**Topics** - -- [Level Passwords](/topics/level_passwords.md) -- [Level Encoding/Decoding](/topics/levelstring_encoding_decoding.md) -- [Game Save Files Encryption/Decryption](/topics/localfiles_encrypt_decrypt.md) -- [Status Codes](/topics/status_codes.md) -- [Vault Codes](/topics/vault_codes.md) -- [Shop](/topics/shop) -- [Tags](/topics/tags) -- **Encryption** - - [Base64 Encoding](topics/encryption/base64.md) - - [CHK Generation](topics/encryption/chk.md) - - [RS, UDID and UUID](topics/encryption/id.md) - - [XOR Cipher](topics/encryption/xor.md) - - [Data Zipping](topics/encryption/zip.md) diff --git a/docs/endpoints/acceptGJFriendRequest20.md b/docs/endpoints/acceptGJFriendRequest20.md deleted file mode 100644 index 0b8c6bda5..000000000 --- a/docs/endpoints/acceptGJFriendRequest20.md +++ /dev/null @@ -1,60 +0,0 @@ -# acceptGJFriendRequest20.php - -Accepts an incoming friend request - -## Parameters - -### Required Parameters - -**accountID** - Account ID of the user accepting the friend request - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user accepting the friend request - -**targetAccountID** - Account ID of the user who sent the friend request - -**requestID** - ID of the friend request (Returned by [uploadFriendRequest20](/endpoints/uploadFriendRequest20.md)) - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -1, regardless of if the friend request exists or not - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is accepted a friend request -# from PasswordFinders, whose account ID is 5317656 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "targetAccountID": 5317656, - "requestID": 43248797, - "secret": "Wmfd2893gb7", -} - -r = requests.post('http://boomlings.com/database/acceptGJFriendRequest20.php', data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/accept_friend_request.md b/docs/endpoints/accept_friend_request.md new file mode 100644 index 000000000..264fa38d4 --- /dev/null +++ b/docs/endpoints/accept_friend_request.md @@ -0,0 +1,56 @@ +# Accept Friend Request + +*Accepts an incoming friend request.* + +## Endpoint + +The current endpoint is `acceptGJFriendRequest20.php`. + +## Parameters + +| name | description | +|-------------------|--------------------------------------------------------------| +| `accountID` | Account ID of the user to accept the friend request from. | +| `gjp` | The [password][passwords] of the user accepting the request. | +| `targetAccountID` | Account ID of the user who sent the friend request. | +| `requestID` | ID of the friend request to accept. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the level is in *Geometry Dash World*. | + +## Response + +Always returns `1`, regardless of whether the friend request exists or not. + +## Example + +### Code + +```python +import requests + +# with this code, DevExit is accepting a friend request from PasswordFinders + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's encoded password + "targetAccountID": 5317656, # PasswordFinders' account ID + "requestID": 43248797, # request ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/acceptGJFriendRequest20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions diff --git a/docs/endpoints/accounts/loginGJAccount.md b/docs/endpoints/accounts/login.md similarity index 100% rename from docs/endpoints/accounts/loginGJAccount.md rename to docs/endpoints/accounts/login.md diff --git a/docs/endpoints/accounts/register.md b/docs/endpoints/accounts/register.md index c44f8c084..0d46d5510 100644 --- a/docs/endpoints/accounts/register.md +++ b/docs/endpoints/accounts/register.md @@ -1,3 +1,46 @@ -# accounts/register.php +# accounts/registerGJAccount.php -Account registration via a webpage +Registers an account + +## Parameters + +### Required Parameters + +**userName** - The username of the account to be added + +**password** - The password of the account to be added + +**email** - The email of the account to be added + +**secret** - Wmfv3899gc9 + +## Response + +1 if the account ID was successfully created, otherwise an [error code](/topics/status_codes) + +## Example + + + +### **Python** + +```py +import requests + +data = { + "userName": "GDDocsTestAcc", + "password": "********", + "email": "gddocsemail@gmail.com", + "secret": "Wmfv3899gc9" +} + +req = requests.post("http://boomlings.com/database/accounts/registerGJAccount.php", data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + diff --git a/docs/endpoints/accounts/registerGJAccount.md b/docs/endpoints/accounts/registerGJAccount.md deleted file mode 100644 index 0d46d5510..000000000 --- a/docs/endpoints/accounts/registerGJAccount.md +++ /dev/null @@ -1,46 +0,0 @@ -# accounts/registerGJAccount.php - -Registers an account - -## Parameters - -### Required Parameters - -**userName** - The username of the account to be added - -**password** - The password of the account to be added - -**email** - The email of the account to be added - -**secret** - Wmfv3899gc9 - -## Response - -1 if the account ID was successfully created, otherwise an [error code](/topics/status_codes) - -## Example - - - -### **Python** - -```py -import requests - -data = { - "userName": "GDDocsTestAcc", - "password": "********", - "email": "gddocsemail@gmail.com", - "secret": "Wmfv3899gc9" -} - -req = requests.post("http://boomlings.com/database/accounts/registerGJAccount.php", data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - diff --git a/docs/endpoints/accounts/register_web.md b/docs/endpoints/accounts/register_web.md new file mode 100644 index 000000000..c44f8c084 --- /dev/null +++ b/docs/endpoints/accounts/register_web.md @@ -0,0 +1,3 @@ +# accounts/register.php + +Account registration via a webpage diff --git a/docs/endpoints/blockGJUser20.md b/docs/endpoints/blockGJUser20.md deleted file mode 100644 index 6ae93f424..000000000 --- a/docs/endpoints/blockGJUser20.md +++ /dev/null @@ -1,56 +0,0 @@ -# blockGJUser20.php - -Blocks a user. - -## Parameters - -### Required Parameters - -**accountID** - The blocking person's account ID - -**gjp** - The blocking person's [GJP](/topics/encryption/gjp.md) - -**targetAccountID** - The account ID of the person being blocked - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Always returns 1, regardless of if the target account exists or not. - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is blocking RobTop - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "targetAccountID": 71, # Robtop's account ID - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/blockGJUser20.php", data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/block_user.md b/docs/endpoints/block_user.md new file mode 100644 index 000000000..6e15b3678 --- /dev/null +++ b/docs/endpoints/block_user.md @@ -0,0 +1,54 @@ +# Block User + +*Blocks a given user.* + +## Endpoint + +The current endpoint is `blockGJUser20.php`. + +## Parameters + +| name | description | +|-------------------|------------------------------------------------------| +| `accountID` | The blocking person's account ID. | +| `gjp` | The blocking person's [encoded password][passwords]. | +| `targetAccountID` | The account ID of the person being blocked. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the users are in *Geometry Dash World*. | + +## Response + +Always returns `1`, regardless of whether the target account exists or not. + +## Example + +### Code + +```python +import requests + +# with this code, DevExit is blocking RobTop + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "targetAccountID": 71, # Robtop's account ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/blockGJUser20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions diff --git a/docs/endpoints/deleteGJAccComment20.md b/docs/endpoints/deleteGJAccComment20.md deleted file mode 100644 index 9cbe05008..000000000 --- a/docs/endpoints/deleteGJAccComment20.md +++ /dev/null @@ -1,56 +0,0 @@ -# deleteGJAccComment20.php - - - -## Parameters - -### Required Parameters - -**accountID** - Account ID of the user deleting the comment - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user deleting the comment - -**commentID** - The ID of the comment being deleted (Returned by [uploadGJAccComment20](/endpoints/uploadGJAccComment20.md)) - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -1 if the comment was deleted, -1 if there was an error - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is deleting his account comment with ID 1772717 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "commentID": 1772717, - "secret": "Wmfd2893gb7" -} - -r = requests.post('http://boomlings.com/database/deleteGJAccComment20.php', data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/deleteGJComment20.md b/docs/endpoints/deleteGJComment20.md deleted file mode 100644 index 384d07642..000000000 --- a/docs/endpoints/deleteGJComment20.md +++ /dev/null @@ -1,59 +0,0 @@ -# deleteGJComment20.php - -Deletes a level comment. - -## Parameters - -### Required Parameters - -**accountID** - The account ID of the user who is deleting the comment - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the comment - -**commentID** - ID of the comment - -**levelID** - ID of the level the comment is on - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Returns 1 if deleted, -1 if not. - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is deleting the comment with ID 31415926 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "commentID": 31415926, - "levelID": 54953085, - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/deleteGJComment20.php", data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/deleteGJFriendRequests20.md b/docs/endpoints/deleteGJFriendRequests20.md deleted file mode 100644 index 5d1825d8e..000000000 --- a/docs/endpoints/deleteGJFriendRequests20.md +++ /dev/null @@ -1,57 +0,0 @@ -# deleteGJFriendRequests20.php - -Deletes a friend request - -## Parameters - -### Required Parameters - -**accountID** - The account ID of the user who is deleting the friend request - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the friend request - -**targetAccountID** - ID of the person whose friend request is being deleted - -**isSender** - 1 if the user who deleted the friend request is the sender, otherwise 0 - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -## Response - -Always returns 1, regardless of whether the request exists or not. - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is deleting a friend request to the person with ID 314159 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "targetAccountID": 314159, - "isSender": 1, # DevExit sent the friend request, so this is 1 - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/deleteGJFriendRequests20.php", data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/delete_account_comment.md b/docs/endpoints/delete_account_comment.md new file mode 100644 index 000000000..888094f5b --- /dev/null +++ b/docs/endpoints/delete_account_comment.md @@ -0,0 +1,56 @@ +# Delete Account Comment + +*Deletes an account comment.* + +## Endpoint + +The current endpoint is `deleteGJAccComment20.php`. + +## Parameters + +| name | description | +|------------------|---------------------------------------------------------------------| +| `accountID` | The account ID of the user deleting the comment. | +| `gjp` | The [encoded password][passwords] of the user deleting the comment. | +| `commentID` | The ID of the comment being deleted. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the comment is in *Geometry Dash World*. | + +## Response + +`1` if the comment was deleted, `-1` if there was an error. + +## Example + +### Code + +```py +import requests + +# with this code, DevExit is deleting one of her account comments + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "commentID": 1772717, # comment ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post('http://boomlings.com/database/deleteGJAccComment20.php', data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions + +[post_comment]: /endpoints/post_comment diff --git a/docs/endpoints/delete_friend_request.md b/docs/endpoints/delete_friend_request.md new file mode 100644 index 000000000..cfb7c92a7 --- /dev/null +++ b/docs/endpoints/delete_friend_request.md @@ -0,0 +1,52 @@ +# Delete Friend Request + +*Deletes a friend request.* + +## Endpoint + +The current endpoint is `deleteGJFriendRequests20.php`. + +## Parameters + +| name | description +|-------------------|-----------------------------------------------------------------------------------| +| `accountID` | The account ID of the user who is deleting the friend request. | +| `gjp` | The [encoded password][passwords] of the user who is deleting the friend request. | +| `targetAccountID` | The account ID of the person whose friend request is being deleted. | +| `isSender` | `1` if the user who deleted the friend request is the sender, otherwise `0`. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the friend request is in *Geometry Dash World*. | + +## Response + +Always returns `1`, regardless of whether the request exists or not. + +## Example + +### Code + +```python +import requests + +# With this code, DevExit is deleting a friend request to the person with ID 314159 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "targetAccountID": 314159, # person's account ID + "isSender": 1, # DevExit sent the friend request, so this is 1 + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/deleteGJFriendRequests20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` diff --git a/docs/endpoints/deleteGJLevelUser20.md b/docs/endpoints/delete_level.md similarity index 100% rename from docs/endpoints/deleteGJLevelUser20.md rename to docs/endpoints/delete_level.md diff --git a/docs/endpoints/delete_level_comment.md b/docs/endpoints/delete_level_comment.md new file mode 100644 index 000000000..6de904fed --- /dev/null +++ b/docs/endpoints/delete_level_comment.md @@ -0,0 +1,52 @@ +# Delete Level Comment + +*Deletes a level comment.* + +## Endpoint + +The current endpoint is `deleteGJComment20.php`. + +## Parameters + +| name | description | +|------------------|----------------------------------------------------------------------------| +| `accountID` | The account ID of the user who is deleting the comment. | +| `gjp` | The [encoded password][passwords] of the user who is deleting the comment. | +| `commentID` | ID of the comment. | +| `levelID` | ID of the level the comment is on. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions] | +| `binaryVersion`? | The current [binary version][versions] | +| `gdw`? | Whether the level comment is in *Geometry Dash World*. | + +## Response + +Returns `1` if deleted, `-1` if failed. + +## Example + +### Code + +```python +import requests + +# with this code, DevExit is deleting the comment on a level + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "commentID": 31415926, # comment ID + "levelID": 54953085, # ID of the level the comment is on + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/deleteGJComment20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` diff --git a/docs/endpoints/deleteGJMessages20.md b/docs/endpoints/delete_message.md similarity index 100% rename from docs/endpoints/deleteGJMessages20.md rename to docs/endpoints/delete_message.md diff --git a/docs/endpoints/downloadGJLevel22.md b/docs/endpoints/download_level.md similarity index 100% rename from docs/endpoints/downloadGJLevel22.md rename to docs/endpoints/download_level.md diff --git a/docs/endpoints/downloadGJMessage20.md b/docs/endpoints/download_message.md similarity index 100% rename from docs/endpoints/downloadGJMessage20.md rename to docs/endpoints/download_message.md diff --git a/docs/endpoints/getGJAccountComments20.md b/docs/endpoints/get_account_comments.md similarity index 100% rename from docs/endpoints/getGJAccountComments20.md rename to docs/endpoints/get_account_comments.md diff --git a/docs/endpoints/getAccountURL.md b/docs/endpoints/get_account_url.md similarity index 100% rename from docs/endpoints/getAccountURL.md rename to docs/endpoints/get_account_url.md diff --git a/docs/endpoints/getGJRewards.md b/docs/endpoints/get_chests.md similarity index 100% rename from docs/endpoints/getGJRewards.md rename to docs/endpoints/get_chests.md diff --git a/docs/endpoints/getGJCommentHistory.md b/docs/endpoints/get_comment_history.md similarity index 100% rename from docs/endpoints/getGJCommentHistory.md rename to docs/endpoints/get_comment_history.md diff --git a/docs/endpoints/getGJFriendRequests20.md b/docs/endpoints/get_friend_requests.md similarity index 100% rename from docs/endpoints/getGJFriendRequests20.md rename to docs/endpoints/get_friend_requests.md diff --git a/docs/endpoints/getGJGauntlets21.md b/docs/endpoints/get_gauntlets.md similarity index 100% rename from docs/endpoints/getGJGauntlets21.md rename to docs/endpoints/get_gauntlets.md diff --git a/docs/endpoints/getGJScores20.md b/docs/endpoints/get_leaderboard.md similarity index 100% rename from docs/endpoints/getGJScores20.md rename to docs/endpoints/get_leaderboard.md diff --git a/docs/endpoints/getGJComments21.md b/docs/endpoints/get_level_comments.md similarity index 100% rename from docs/endpoints/getGJComments21.md rename to docs/endpoints/get_level_comments.md diff --git a/docs/endpoints/getGJLevelScores211.md b/docs/endpoints/get_level_leaderboard.md similarity index 100% rename from docs/endpoints/getGJLevelScores211.md rename to docs/endpoints/get_level_leaderboard.md diff --git a/docs/endpoints/getGJLevels21.md b/docs/endpoints/get_levels.md similarity index 100% rename from docs/endpoints/getGJLevels21.md rename to docs/endpoints/get_levels.md diff --git a/docs/endpoints/getGJMapPacks21.md b/docs/endpoints/get_map_packs.md similarity index 100% rename from docs/endpoints/getGJMapPacks21.md rename to docs/endpoints/get_map_packs.md diff --git a/docs/endpoints/getGJMessages20.md b/docs/endpoints/get_messages.md similarity index 100% rename from docs/endpoints/getGJMessages20.md rename to docs/endpoints/get_messages.md diff --git a/docs/endpoints/getGJChallenges.md b/docs/endpoints/get_quests.md similarity index 100% rename from docs/endpoints/getGJChallenges.md rename to docs/endpoints/get_quests.md diff --git a/docs/endpoints/getGJSongInfo.md b/docs/endpoints/get_song.md similarity index 100% rename from docs/endpoints/getGJSongInfo.md rename to docs/endpoints/get_song.md diff --git a/docs/endpoints/getGJDailyLevel.md b/docs/endpoints/get_timely.md similarity index 100% rename from docs/endpoints/getGJDailyLevel.md rename to docs/endpoints/get_timely.md diff --git a/docs/endpoints/getTop1000.md b/docs/endpoints/get_top_1000.md similarity index 100% rename from docs/endpoints/getTop1000.md rename to docs/endpoints/get_top_1000.md diff --git a/docs/endpoints/getGJTopArtists.md b/docs/endpoints/get_top_artists.md similarity index 100% rename from docs/endpoints/getGJTopArtists.md rename to docs/endpoints/get_top_artists.md diff --git a/docs/endpoints/getGJUserInfo20.md b/docs/endpoints/get_user.md similarity index 100% rename from docs/endpoints/getGJUserInfo20.md rename to docs/endpoints/get_user.md diff --git a/docs/endpoints/getGJUserList20.md b/docs/endpoints/get_user_list.md similarity index 100% rename from docs/endpoints/getGJUserList20.md rename to docs/endpoints/get_user_list.md diff --git a/docs/endpoints/likeGJItem211.md b/docs/endpoints/like_item.md similarity index 100% rename from docs/endpoints/likeGJItem211.md rename to docs/endpoints/like_item.md diff --git a/docs/endpoints/getSaveData.md b/docs/endpoints/load_data.md similarity index 100% rename from docs/endpoints/getSaveData.md rename to docs/endpoints/load_data.md diff --git a/docs/endpoints/uploadGJAccComment20.md b/docs/endpoints/post_comment.md similarity index 100% rename from docs/endpoints/uploadGJAccComment20.md rename to docs/endpoints/post_comment.md diff --git a/docs/endpoints/rateGJDemon21.md b/docs/endpoints/rate_demon.md similarity index 100% rename from docs/endpoints/rateGJDemon21.md rename to docs/endpoints/rate_demon.md diff --git a/docs/endpoints/rateGJStars211.md b/docs/endpoints/rate_level.md similarity index 100% rename from docs/endpoints/rateGJStars211.md rename to docs/endpoints/rate_level.md diff --git a/docs/endpoints/suggestGJStars.md b/docs/endpoints/rate_stars.md similarity index 100% rename from docs/endpoints/suggestGJStars.md rename to docs/endpoints/rate_stars.md diff --git a/docs/endpoints/readGJFriendRequest20.md b/docs/endpoints/read_friend_request.md similarity index 100% rename from docs/endpoints/readGJFriendRequest20.md rename to docs/endpoints/read_friend_request.md diff --git a/docs/endpoints/removeGJFriend20.md b/docs/endpoints/remove_friend.md similarity index 100% rename from docs/endpoints/removeGJFriend20.md rename to docs/endpoints/remove_friend.md diff --git a/docs/endpoints/reportGJLevel.md b/docs/endpoints/report_level.md similarity index 100% rename from docs/endpoints/reportGJLevel.md rename to docs/endpoints/report_level.md diff --git a/docs/endpoints/request.md b/docs/endpoints/request.md index 317cc963a..95548956c 100644 --- a/docs/endpoints/request.md +++ b/docs/endpoints/request.md @@ -132,7 +132,7 @@ public class Main { ``` -### **NodeJS** +### **Node JS** ```js const http = require("http"); diff --git a/docs/endpoints/requestUserAccess.md b/docs/endpoints/request_access.md similarity index 100% rename from docs/endpoints/requestUserAccess.md rename to docs/endpoints/request_access.md diff --git a/docs/endpoints/restoreGJItems.md b/docs/endpoints/restore_items.md similarity index 100% rename from docs/endpoints/restoreGJItems.md rename to docs/endpoints/restore_items.md diff --git a/docs/endpoints/getGJUsers20.md b/docs/endpoints/search_users.md similarity index 100% rename from docs/endpoints/getGJUsers20.md rename to docs/endpoints/search_users.md diff --git a/docs/endpoints/uploadFriendRequest20.md b/docs/endpoints/send_friend_request.md similarity index 100% rename from docs/endpoints/uploadFriendRequest20.md rename to docs/endpoints/send_friend_request.md diff --git a/docs/endpoints/uploadGJComment21.md b/docs/endpoints/send_level_comment.md similarity index 100% rename from docs/endpoints/uploadGJComment21.md rename to docs/endpoints/send_level_comment.md diff --git a/docs/endpoints/uploadGJMessage20.md b/docs/endpoints/send_message.md similarity index 100% rename from docs/endpoints/uploadGJMessage20.md rename to docs/endpoints/send_message.md diff --git a/docs/endpoints/testSong.md b/docs/endpoints/testSong.md deleted file mode 100644 index 48d6acf37..000000000 --- a/docs/endpoints/testSong.md +++ /dev/null @@ -1,45 +0,0 @@ -# testSong.php - -Gets whitelist/artist info about a song. **THIS IS A GET REQUEST.** - -## Parameters - -### Required Parameters - -**songID** - The ID of the song on newgrounds - -## Response - -A human-readable response stating who the artist is, whether they're whitelisted and scouted, the song name, and whether they allow external API use - -## Example - - - -### **Python** - -```py -import requests - -songID = 787311 - -req = requests.post(f'http://boomlings.com/database/testSong.php?songID={songID}') -print(req.text) -``` - -**Response** -```html -Artist: DePianoman
Artist is NOT Whitelisted.
Artist is Scouted.

Song: Newbie - Space
External API allowed. -``` - -**Human-Readable Response** -``` -Artist: DePianoman -Artist is NOT Whitelisted. -Artist is Scouted. - -Song: Newbie - Space -External API allowed. -``` - - \ No newline at end of file diff --git a/docs/endpoints/unblockGJUser20.md b/docs/endpoints/unblock_user.md similarity index 100% rename from docs/endpoints/unblockGJUser20.md rename to docs/endpoints/unblock_user.md diff --git a/docs/endpoints/updateGJAccSettings20.md b/docs/endpoints/update_account.md similarity index 100% rename from docs/endpoints/updateGJAccSettings20.md rename to docs/endpoints/update_account.md diff --git a/docs/endpoints/updateGJUserScore22.md b/docs/endpoints/update_data.md similarity index 100% rename from docs/endpoints/updateGJUserScore22.md rename to docs/endpoints/update_data.md diff --git a/docs/endpoints/updateGJDesc20.md b/docs/endpoints/update_level_description.md similarity index 100% rename from docs/endpoints/updateGJDesc20.md rename to docs/endpoints/update_level_description.md diff --git a/docs/endpoints/uploadGJLevel21.md b/docs/endpoints/upload_level.md similarity index 100% rename from docs/endpoints/uploadGJLevel21.md rename to docs/endpoints/upload_level.md diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 6df068a0c..000000000 --- a/docs/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - Geometry Dash Documentation - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..c5136d599 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,69 @@ +# Introduction + +Welcome to the Geometry Dash Programming [Discord][Discord] server's online iteration +of documentation for *Geometry Dash*. Here you can find all sorts of information, +documents, and resources for interacting with the game and its servers. We aim to make +[`gd.docs`][gd.docs] the most comprehensive open source of information for the game, +created by many people who have interacted with the game and wish to share knowledge with others. + +The provided documentation is available in the [repository][GitHub]. +For all issues regarding information found here, please consult us by creating an issue. + +## Projects + +### Geometry Dash Wrappers + +A few people and teams have gone out of their way to create proper wrappers and APIs around +the *Geometry Dash* servers and its client. All of the known and endorsed projects will find +their way here, as a listing of resources people can use for their own projects. + +#### Python + +- [gd.py][gd.py] by [nekit][nekit] + +#### JS + +- [gd.js][gd.js] by [101arrowz][101arrowz] + +#### Java + +- [jdash][jdash] by [Alex1304][Alex1304] + +### Geometry Dash Projects + +These are projects that generally interface over the *Geometry Dash* servers and client, +and overall have built up their own recognition and traction along the community and developers alike. + +#### Node JS + +- [GDBrowser][GDBrowser] by [Colon][Colon] + +#### C++ + +- [GDCrypto][GDCrypto] by [cos8o][cos8o] + +## Outside Remarks + +With this documentation, the Geometry Dash Programming staff team would love to see your +interesting ideas with this project, and kinds of things you create with the information provided. +Make sure to hit us up on our discord, and show us of such! + +[gd.docs]: https://docs.gd-programming.org/ + +[Discord]: https://gd-programming.org/discord +[GDDocs]: https://docs.gd-programming.org/ +[GitHub]: https://github.com/gd-programming/gd.docs + +[gd.py]: https://github.com/nekitdev/gd.py +[gd.js]: https://github.com/101arrowz/gd.js +[jdash]: https://github.com/Alex1304/jdash + +[GDBrowser]: https://github.com/GDColon/GDBrowser +[GDCrypto]: https://github.com/cos8oih/GDCrypto + +[nekit]: https://github.com/nekitdev +[101arrowz]: https://github.com/101arrowz +[Alex1304]: https://github.com/Alex1304 + +[Colon]: https://github.com/GDColon +[cos8o]: https://github.com/cos8oih diff --git a/docs/playground.md b/docs/playground.md deleted file mode 100644 index d0ca052d4..000000000 --- a/docs/playground.md +++ /dev/null @@ -1,63 +0,0 @@ -# Miko's Playground - -You're able to use this publicly, just like a sandbox. Please make sure ***not*** to commit this ***EVER***. - - - -### **python** - -import this - -```py -import base64 - -def decode_level_password(password: str) -> str: - # decode the password from base64 - decoded_base64 = base64.b64decode(password.encode()).decode() - # put it through the xor cipher with the key "26364") - decoded = xor_cipher(decoded_base64, "26364") - - return decoded -``` - -### **java** - -fuck it - - - -\* = do you like disclaimers, i don't - -
- - background -
-
-
-
- -
-
-
- GDDocs -
-
-
-
- Team GDProgramming -
-
-
-
-
-
-
-
-
-
HTML
-
-
-
-
\ No newline at end of file diff --git a/docs/reference.md b/docs/reference.md deleted file mode 100644 index fb26ff068..000000000 --- a/docs/reference.md +++ /dev/null @@ -1,58 +0,0 @@ -# Geometry Dash References - -### Audio Track - -Part of levels and requests for them is a term known as `audio track`, or the id of the track of a song in the game. - -| ID | Server ID | Track Name | Track Author | -|------|-----------|--------------------------|--------------| -| - | -1 | Practice: Stay Inside Me | OcularNebula | -| 1 | 0 | Stereo Madness | Foreverbound | -| 2 | 1 | Back on Track | DJVI | -| 3 | 2 | Polargeist | Step | -| 4 | 3 | Dry Out | DJVI | -| 5 | 4 | Base after Base | DJVI | -| 6 | 5 | Cant Let Go | DJVI | -| 7 | 6 | Jumper | Waterflame | -| 8 | 7 | Time Machine | Waterflame | -| 9 | 8 | Cycles | DJVI | -| 10 | 9 | xStep | DJVI | -| 11 | 10 | Clutterfunk | Waterflame | -| 12 | 11 | Theory of Everything | DJ-Nate | -| 13 | 12 | Electroman Adventures | Waterflame | -| 14 | 13 | Clubstep | DJ-Nate | -| 15 | 14 | Electrodynamix | DJ-Nate | -| 16 | 15 | Hexagon Force | Waterflame | -| 17 | 16 | Blast Processing | Waterflame | -| 18 | 17 | Theory of Everything 2 | DJ-Nate | -| 19 | 18 | Geometrical Dominator | Waterflame | -| 20 | 19 | Deadlocked | F-777 | -| 21 | 20 | Fingerdash | MDK | -| 1001 | 21 | The Seven Seas | F-777 | -| 1002 | 22 | Viking Arena | F-777 | -| 1003 | 23 | Airborne Robots | F-777 | -| 3001 | 24 | The Challenge | RobTop | -| 2001 | 25 | Payload | Dex Arson | -| 2002 | 26 | Beast Mode | Dex Arson | -| 2003 | 27 | Machina | Dex Arson | -| 2004 | 28 | Years | Dex Arson | -| 2005 | 29 | Frontlines | Dex Arson | -| 2006 | 30 | Space Pirates | Waterflame | -| 2007 | 31 | Striker | Waterflame | -| 2008 | 32 | Embers | Dex Arson | -| 2009 | 33 | Round 1 | Dex Arson | -| 2010 | 34 | Monster Dance Off | F-777 | -| 4001 | 35 | Press Start | MDK | -| 4002 | 36 | Nock Em | Bossfight | -| 4003 | 37 | Power Trip | Boom Kitty | - -### Secrets - -To interact with the Geometry Dash API you need a 11 character long string called `secret`. As of 2.1 there are `4` secrets that are currently known of. - -| Secret | type | Usage | -|:-------|:-----|:------| -| `Wmfd2893gb7` | **Common Secret** | Used in the majority of requests | -| `Wmfv3899gc9` | **Account Secret** | Used for all account related requests | -| `Wmfv2898gc9` | **Level Secret** | Used in level deletion | -| `Wmfp3879gc3` | **Mod Secret** | Used in moderator only requests | diff --git a/docs/resources/server/secrets.md b/docs/resources/server/secrets.md new file mode 100644 index 000000000..94c235db2 --- /dev/null +++ b/docs/resources/server/secrets.md @@ -0,0 +1,8 @@ +# Secrets + +| name | value | description | +|-------------------|---------------|----------------------------------------| +| Common Secret | `Wmfd2893gb7` | Used in the majority of endpoints. | +| Account Secret | `Wmfv3899gc9` | Used in all account-related endpoints. | +| Level Secret | `Wmfv2898gc9` | Used in level deletion endpoint. | +| Moderation Secret | `Wmfp3879gc3` | Used in moderator-only endpoints. | diff --git a/docs/topics/encoding/base64.md b/docs/topics/encoding/base64.md new file mode 100644 index 000000000..3780fcf4a --- /dev/null +++ b/docs/topics/encoding/base64.md @@ -0,0 +1,10 @@ +# Base64 + +[Base64][Base64] encoding is widely used amongst different endpoints in Geometry Dash. + +It is used to encode fields like level data, level descriptions, comments, etc. + +GD uses *URL-safe* Base64 encoding, which uses `[A-Z]` and `[a-z]` letters +along with `_` and `-` as special characters. + +[Base64]: https://en.wikipedia.org/wiki/Base64 \ No newline at end of file diff --git a/docs/topics/encoding/random_string_and_id.md b/docs/topics/encoding/random_string_and_id.md new file mode 100644 index 000000000..366f4ce71 --- /dev/null +++ b/docs/topics/encoding/random_string_and_id.md @@ -0,0 +1,64 @@ +# Random String, UUID and UDID + +These are the parameters that can be frequently noticed when sending a request. + +## Random String + +Random Seed, or Random String, is essentially just a string containing *n* (often *10*) +random alphanumeric characters. It is mainly sent as `rs` in requests. + +Generating it is quite simple: + +```python +from random import choices +from string import ascii_letters, digits + +CHARSET = ascii_letters + digits + +EMPTY = str() +LENGTH = 10 + +concat = EMPTY.join + + +def generate_random_string(length: int = LENGTH, charset: str = CHARSET) -> str: + return concat(choices(charset, k=length)) +``` + +## UUID + +[UUID][UUID] stands for Universally Unique Identifier. It is sent as `uuid` in requests. + +It can be randomly generated using `uuid` module: + +```py +from uuid import uuid4 + +def generate_uuid() -> str: + return str(uuid4()) +``` + +## UDID + +[UDID][UDID] is an abbreviation for Unique Device Identifier that is sent as `udid` in requests. +It does not really have a defined format, but frequently has structure like `S` followed by digits, +or it can be the same as user ID. + +Generating UDID means merely generating a random integer: + +```python +from random import randrange as random_range + +PREFIX = "S" +DEFAULT_START = 100_000 +DEFAULT_STOP = 100_000_000 + + +def generate_udid( + prefix: str = PREFIX, start: int = DEFAULT_START, stop: int = DEFAULT_STOP +) -> str: + return prefix + str(random_range(start, stop)) +``` + +[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier +[UDID]: https://en.wikipedia.org/wiki/UDID diff --git a/docs/topics/encoding/xor.md b/docs/topics/encoding/xor.md new file mode 100644 index 000000000..edf51ddda --- /dev/null +++ b/docs/topics/encoding/xor.md @@ -0,0 +1,68 @@ +# XOR + +[XOR][XOR] is a *bit-wise* binary operation that is commonly written as `^` in programming languages. + +Each character in a string is essentially represented as bytes, to which *XOR* is applied. + +## XOR Cipher + +*XOR Cipher* elaborates on the idea of applying *XOR* to each to byte, +one in the string and one in the key. + +Here are our *XOR Cipher* empty functions: + +```python +def xor(data: bytes, key: bytes) -> bytes: + ... + + +def xor_string(string: str, key: str, encoding: str = ..., errors: str = ...) -> str: + ... +``` + +*XOR Cipher* pairs each byte in the string with a byte in the key (which is cycled), +then applies *XOR* operation for each pair. + +Returning back to the function: + + + +```python +from itertools import cycle + +DEFAULT_ENCODING = "utf-8" +DEFAULT_ERRORS = "strict" + + +def xor(data: bytes, key: bytes) -> bytes: + return bytes(byte ^ key_byte for byte, key_byte in zip(data, cycle(key))) + + +def xor_string( + string: str, key: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + result = xor(string.encode(encoding, errors), key.encode(encoding, errors)) + + return result.decode(encoding, errors) +``` + +## XOR Keys + +Here is a list of XOR keys currently used in GD: + +| Key | Usage | +|---------|-------------------| +| `14251` | Messages | +| `26364` | Level Password | +| `37526` | Account Password | +| `39673` | Level Leaderboard | +| `41274` | Level Seed | +| `29481` | Comment Check | +| `19847` | Challenges | +| `59182` | Rewards | +| `58281` | Like and Rate | +| `85271` | User Profile | +| `19283` | Vault Codes | +| `48291` | Load Data | + +[XOR]: https://en.wikipedia.org/wiki/Bitwise_operation#XOR diff --git a/docs/topics/encryption/zip.md b/docs/topics/encoding/zip.md similarity index 100% rename from docs/topics/encryption/zip.md rename to docs/topics/encoding/zip.md diff --git a/docs/topics/encryption/chk.md b/docs/topics/encoding/~check.md similarity index 69% rename from docs/topics/encryption/chk.md rename to docs/topics/encoding/~check.md index d2184bcb2..9283c3882 100644 --- a/docs/topics/encryption/chk.md +++ b/docs/topics/encoding/~check.md @@ -1,15 +1,15 @@ -# CHK +# Check -CHK is a common parameter in requests, which is intended to improve security. -CHK is sent in request often as `chk`. +Check is a common parameter in requests, which is intended to "improve security". +It is often sent in request as `chk`. -CHK is generated like so: +Check is generated like so: -1. Take arbitrary amount of values. +1. Take an arbitrary amount of values. 2. Combine them and add *salt* if there is one. -3. Apply [SHA-1](https://en.wikipedia.org/wiki/SHA-1) hashing to combined values and get its hexdigest. -4. Apply [XOR-Cipher](topics/encryption/xor.md) to the hexdigest with desired key. -5. [Base64](topics/encryption/base64.md) encode the result. +3. Apply [SHA-1][SHA-1] hashing to combined values and get its hexadecimal digest. +4. Apply [XOR Cipher][XOR Cipher] to the digest with the desired key. +5. [Base64][Base64] encode the result. CHK generator can be implemented like this: @@ -18,17 +18,25 @@ CHK generator can be implemented like this: ### **Python** ```py -import base64 -import hashlib # sha1() lives there +from typing import Iterable +from hashlib import sha1 as standard_sha1 +EMPTY = str() -def generate_chk(values: [int, str] = [], key: str = "", salt: str = "") -> str: +concat = EMPTY.join + + +def sha1(data: bytes) -> str: + return standard_sha1(data).hexdigest() + + +def generate_check(values: Iterable[Any], key: str = "", salt: str = "") -> str: values.append(salt) - string = ("").join(map(str, values)) # assure "str" type and connect values + string = concat(map(str, values)) # assure "str" type and connect values hashed = hashlib.sha1(string.encode()).hexdigest() - xored = xor_cipher(hashed, key) # we discuss this one in encryption/xor + xored = xor_string(hashed, key) # we discuss this one in encryption/xor final = base64.urlsafe_b64encode(xored.encode()).decode() return final @@ -176,10 +184,14 @@ For example, `0%` - `13%` - `100%` -> `(13 - 0), (100 - 13)` -> `13,87` ## Salts -| Value | Type | -|--------------|-------------------| -| xI25fpAapCQg | Level | -| xPT6iUrtws0J | Comment | -| ysg6pUrtjn0J | Like or Rate | -| xI35fsAapCRg | User Profile | -| yPg6pUrtWn0J | Level Leaderboard | +| Salt | Usage | +|----------------|-------------------| +| `xI25fpAapCQg` | Level | +| `xPT6iUrtws0J` | Comment | +| `ysg6pUrtjn0J` | Like or Rate | +| `xI35fsAapCRg` | User Profile | +| `yPg6pUrtWn0J` | Level Leaderboard | + +[Base64]: /topics/encoding/base64 +[XOR Cipher]: /topics/encoding/xor#xor-cipher +[SHA-1]: https://en.wikipedia.org/wiki/SHA-1 \ No newline at end of file diff --git a/docs/topics/encryption/base64.md b/docs/topics/encryption/base64.md deleted file mode 100644 index 7de27ae92..000000000 --- a/docs/topics/encryption/base64.md +++ /dev/null @@ -1,33 +0,0 @@ -# Base64 - -Base64 encoding is widely used amongst different endpoints in Geometry Dash. - -It is used to encode fields like level data, level descriptions, comments, etc. - -GD uses *URL-safe* Base64 encoding, which uses A-Z and a-z letters, along with `_` and `-` as special characters. (Main Base64 uses `+` and `/` special characters) - -Here is an example of using Base64 decoding and encoding: - - - -### **Python** - -```py -import base64 - -# For unknown reasons, people tend to use base64.b64(decode|encode) functions -# and replace "+" with "-" and "/" with "_" manually, -# even though "base64" module implements base64.urlsafe_b64(decode|encode). - -# encode and decode functions return "bytes" type in python so we might want to use -# bytes.decode() to convert them to "str" type. - -def base64_encode(string: str) -> str: - return base64.urlsafe_b64encode(string.encode()).decode() - - -def base64_decode(string: str) -> str: - return base64.urlsafe_b64decode(string.encode()).decode() -``` - - diff --git a/docs/topics/encryption/id.md b/docs/topics/encryption/id.md deleted file mode 100644 index c8bf5fcd8..000000000 --- a/docs/topics/encryption/id.md +++ /dev/null @@ -1,71 +0,0 @@ -# RS, UUID and UDID - -These are the parameters that can be frequently noticed when sending a request. - -## RS - -RS stands for Random Seed, or Random String, which is essentially just a string containing *n* (often *10*) random alphanumeric characters. -RS is mainly sent as `rs` in requests. - -Generating RS is quite simple: - - - -### **Python** - -```py -import random -from string import ascii_letters, digits # so we don't have to type [A-Za-z0-9] by hand - -# this code works only on python 3.6 and above - -possible_letters = ascii_letters + digits - - -def generate_rs(n: int) -> str: - return ("").join(random.choices(possible_letters, k=n)) -``` - - - -## UUID - -[UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) stands for Universally Unique IDentifier. -It has format of `aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeee` and is sent as `uuid` in requests. - -It can be randomly generated using our `generate_rs()` function: - - - -### **Python** - -```py -def generate_uuid(parts: [int] = (8, 4, 4, 4, 10)) -> str: - # apply generate_rs to each number in parts, then join results - return ("-").join(map(generate_rs, parts)) -``` - - - -## UDID - -[UDID](https://en.wikipedia.org/wiki/UDID) is an abbreviation for Unique Device IDentifier that is sent as `udid` in requests. -It does not really have a defined format, -but frequently has structure like `Sxxx...` where `x` are digits, -or it is the same as PlayerID of a user. - -Generating UDID should be simpler because we can just generate a random integer: - - - -### **Python** - -```py -import random - - -def generate_udid(start: int = 100_000, end: int = 100_000_000) -> str: - return "S" + str(random.randint(start, end)) -``` - - diff --git a/docs/topics/encryption/xor.md b/docs/topics/encryption/xor.md deleted file mode 100644 index 96d4d141e..000000000 --- a/docs/topics/encryption/xor.md +++ /dev/null @@ -1,104 +0,0 @@ -# XOR - -[XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) is a _bit-wise_ binary operation that is commonly written as `^` in programming languages. - -Each character in a string is essentially represented by a number, -so-called _codepoint_, to which XOR operation can be applied. - - - -### **Python** - -In python, you can use `ord()` function to get the codepoint of a character, -and `chr()` to convert the codepoint to a character. - -```py ->>> ord("N") -78 ->>> chr(78) -"N" -``` - - - -## XOR Cipher - -**XOR-Cipher** elaborates on the idea of applying _XOR_ to each to characters, -one in the string and one in the key. - -Here is our **XOR-Cipher** stub (empty) function: - - - -### **Python** - -```py -def xor_cipher(string: str, key: str) -> str: ... -``` - - - -Suppose we have a string `"GD"` (how original), and key `"42069"` (rather original as well). - -Here is what will happen to our string if we apply **XOR-Cipher**: - - - -### **Python** - -```py ->>> chr(ord("G") ^ ord("4")) + chr(ord("D") ^ ord("2")) -"sv" -``` - - - -**XOR-Cipher** connects each character in given string with character in key (key is cycled), then applies _XOR_ operation on each pair. - -Returning back to the function: - - - -### **Python** - -```py -import itertools - -# we are going to use itertools.cycle() on our key, which will basically -# repeatedly yield "1234512345..." for key "12345" - -def xor_cipher(string: str, key: str) -> str: - result = "" - for string_char, key_char in zip(string, itertools.cycle(key)): - result += chr(ord(string_char) ^ ord(key_char)) - return result -``` - -This function is quite good, but adding new characters to strings in python is quite slow. -Here is a better function that implements **XOR-Cipher** (and hey, it is written in one line!): - -```py -def xor_cipher(string: str, key: str) -> str: - return ("").join(chr(ord(x) ^ ord(y)) for x, y in zip(string, itertools.cycle(key))) -``` - - - -## XOR Keys - -Here is a list of XOR keys currently used in GD: - -| Key | Usage | -| ----- | ----------------- | -| 14251 | Messages | -| 26364 | Level Password | -| 37526 | Account Password | -| 39673 | Level Leaderboard | -| 41274 | Level Seed | -| 29481 | Comment CHK | -| 19847 | Challenges | -| 59182 | Rewards | -| 58281 | Like and Rate | -| 85271 | User Profile | -| 19283 | Vault Codes | -| 48291 | Load data | diff --git a/docs/topics/tags.md b/docs/topics/tags.md index f5669ec32..892761838 100644 --- a/docs/topics/tags.md +++ b/docs/topics/tags.md @@ -6,7 +6,7 @@ Throughout Geometry Dash there are various interfaces in which the player an see > - `` tags manipulate the delay before a piece of text is sent within a dialog box. The speed you can set is within a range of `000` to `999` ms.

> - `` tags are the simplest tags out of everything and all they do is make text appear immediately. `` tags must be closed with `` otherwise the game will crash. -## \ Tags +## `` Tags There are `9` different colour tags that are usable in Geometry Dash. below is a table of them all @@ -24,10 +24,10 @@ There are `9` different colour tags that are usable in Geometry Dash. below is a | `` | ![Red](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/red.png) | `0xFFA548` | | `` | ![dark Red](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/any.png) | `0xFF0000` | -## \ Tags +## `` Tags `` tags are used to create a delay before a specific string in dialog boxes. The game detects a `Delay Tag` if the string contains a ` Tags +## `` Tags -`` tags are the complete opposite to `Delay Tags` as they display text instantly rather than after a delay. `` tags also require a closing tag which is `` so the game does not crash when parsing the string. An example of an `` tag can be found [here](https://github.com/Wyliemaster/gddocs/blob/client/assets/examples/tags/I%20tags%20example.mp4?raw=true) \ No newline at end of file +`` tags are the complete opposite to `Delay Tags` as they display text instantly rather than after a delay. `` tags also require a closing tag which is `` so the game does not crash when parsing the string. An example of an `` tag can be found [here](https://github.com/Wyliemaster/gddocs/blob/client/assets/examples/tags/I%20tags%20example.mp4?raw=true) diff --git a/generator.js b/generator.js deleted file mode 100644 index d166c0e1a..000000000 --- a/generator.js +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ -const childProcess = require("child_process"); -const chalk = require("chalk"); -const os = require("os"); - -require("./scripts/installPackages.js"); // install packages - -// serve data -let command = "node ./node_modules/docsify-cli/bin/docsify serve ./docs --port 9505"; - -if (os.platform() === "win32") { - command = "node \"./node_modules/docsify-cli/bin/docsify\" serve ./docs --port 9505"; -} - -console.log(`${chalk.hex("#66d9ff")("Running Command: ")} ${command}\n`); - -const docsProcess = childProcess.exec(command); - -docsProcess.on("exit", () => process.exit(0)); \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..22979ef62 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,43 @@ +site_name: gd.docs +site_author: nekitdev +site_description: Documentation for Geometry Dash. + +repo_name: gd-programming/gd.docs +repo_url: https://github.com/gd-programming/gd.docs + +remote_branch: github-pages + +watch: + - docs + +theme: + name: material + palette: + - media: "(prefers-color-scheme: dark)" + scheme: slate + + primary: deep purple + accent: light blue + + toggle: + icon: material/toggle-switch-off-outline + name: Switch to light mode + + - media: "(prefers-color-scheme: light)" + scheme: default + + primary: deep orange + accent: light blue + + toggle: + icon: material/toggle-switch + name: Switch to dark mode + +plugins: + - search + +markdown_extensions: + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences diff --git a/package.json b/package.json deleted file mode 100644 index 3039af308..000000000 --- a/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "gddocs", - "version": "0.0.1", - "description": "GD Documentation", - "main": "generator.js", - "scripts": { - "run": "node generator.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/gd-programming/gddocs.git" - }, - "keywords": [ - "gd" - ], - "author": "GD Programming", - "license": "MIT", - "bugs": { - "url": "https://github.com/gd-programming/gddocs/issues" - }, - "homepage": "https://github.com/gd-programming/gddocs#readme", - "dependencies": { - "chalk": "^4.0.0", - "docsify-cli": "^4.4.0" - } -} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..9a3e1b8ec --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,36 @@ +[tool.poetry] +name = "gd.docs" +version = "0.1.0" +description = "Documentation for Geometry Dash." +authors = ["gd-programming"] +license = "MIT" + +readme = "README.md" + +homepage = "https://docs.gd-programming.org/" +repository = "https://github.com/gd-programming/gd.docs" + +keywords = ["gd", "docs", "documentation"] + +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + "Topic :: Documentation", +] + +[tool.poetry.urls] +Discord = "https://gd-programming.org/discord" +Issues = "https://github.com/gd-programming/gd.docs/issues" + +[tool.poetry.dependencies] +python = ">= 3.7" + +mkdocs = ">= 1.3.0" +mkdocs-material = "8.3.8" + +mkdocstrings = ">= 0.19.0" + +[build-system] +requires = ["poetry-core >= 1.1.0b2"] +build-backend = "poetry.core.masonry.api" diff --git a/scripts/installPackages.js b/scripts/installPackages.js deleted file mode 100644 index abd31377f..000000000 --- a/scripts/installPackages.js +++ /dev/null @@ -1,14 +0,0 @@ -// install_packages.js -// made by Homura -const chalk = require("chalk"); -const fs = require("fs"); -const childProcess = require("child_process"); - -const package = require("../package.json"); -const missing = Object.keys(package.dependencies) - .filter((package) => !fs.existsSync(`../node_modules/${package}`)); - -if (missing.length > 0) { - console.log(chalk.hex("#79b0fc")("Installing Packages: ") + missing.join(", ")); - childProcess.exec(`npm i --save ${missing.join(" ")}`); -} \ No newline at end of file From 447dc817561e2ff021fb68afcf52e7ffa74a89dc Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Mon, 4 Jul 2022 22:34:44 +0300 Subject: [PATCH 02/17] Temporarily add `docs` branch to build. --- .github/workflows/docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 45d5e8dd3..542fb9479 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - docs jobs: docs: From 62cfaeabad9060b03c73f498424e056a4e5f68d1 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 5 Jul 2022 13:26:36 +0300 Subject: [PATCH 03/17] Add navigation. --- .../{ => comments}/delete_account_comment.md | 6 +- .../{ => comments}/delete_level_comment.md | 8 ++- docs/endpoints/delete_level.md | 56 ------------------- .../accept_friend_request.md | 4 +- .../delete_friend_request.md | 8 ++- docs/endpoints/levels/delete_level.md | 56 +++++++++++++++++++ docs/endpoints/{ => users}/block_user.md | 4 +- docs/resources/server/versions.md | 6 ++ mkdocs.yml | 19 +++++++ 9 files changed, 104 insertions(+), 63 deletions(-) rename docs/endpoints/{ => comments}/delete_account_comment.md (92%) rename docs/endpoints/{ => comments}/delete_level_comment.md (88%) delete mode 100644 docs/endpoints/delete_level.md rename docs/endpoints/{ => friend_requests}/accept_friend_request.md (93%) rename docs/endpoints/{ => friend_requests}/delete_friend_request.md (87%) create mode 100644 docs/endpoints/levels/delete_level.md rename docs/endpoints/{ => users}/block_user.md (93%) create mode 100644 docs/resources/server/versions.md diff --git a/docs/endpoints/delete_account_comment.md b/docs/endpoints/comments/delete_account_comment.md similarity index 92% rename from docs/endpoints/delete_account_comment.md rename to docs/endpoints/comments/delete_account_comment.md index 888094f5b..4d7e8f995 100644 --- a/docs/endpoints/delete_account_comment.md +++ b/docs/endpoints/comments/delete_account_comment.md @@ -4,7 +4,9 @@ ## Endpoint -The current endpoint is `deleteGJAccComment20.php`. +| method | endpoint | +|--------|----------------------------| +| `POST` | `deleteGJAccComment20.php` | ## Parameters @@ -52,5 +54,3 @@ print(response.text) [passwords]: /resources/server/passwords [secrets]: /resources/server/secrets [versions]: /resources/server/versions - -[post_comment]: /endpoints/post_comment diff --git a/docs/endpoints/delete_level_comment.md b/docs/endpoints/comments/delete_level_comment.md similarity index 88% rename from docs/endpoints/delete_level_comment.md rename to docs/endpoints/comments/delete_level_comment.md index 6de904fed..847842fcf 100644 --- a/docs/endpoints/delete_level_comment.md +++ b/docs/endpoints/comments/delete_level_comment.md @@ -4,7 +4,9 @@ ## Endpoint -The current endpoint is `deleteGJComment20.php`. +| method | endpoint | +|--------|-------------------------| +| `POST` | `deleteGJComment20.php` | ## Parameters @@ -50,3 +52,7 @@ print(response.text) ```console 1 ``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions diff --git a/docs/endpoints/delete_level.md b/docs/endpoints/delete_level.md deleted file mode 100644 index ed1791316..000000000 --- a/docs/endpoints/delete_level.md +++ /dev/null @@ -1,56 +0,0 @@ -# deleteGJLevelUser20.php - -Deletes a level from the server. - -## Parameters - -### Required Parameters - -**accountID** - The level author's account ID - -**gjp** - The level author's [GJP](/topics/encryption/gjp.md) - -**levelID** - The ID of the level being deleted - -**secret** - Wmfv2898gc9 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Returns 1 if deleted, -1 if it failed or the level does not exist. - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is deleting the level with ID 62689548 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "levelID": 62689548, - "secret": "Wmfv2898gc9" -} - -req = requests.post("http://boomlings.com/database/deleteGJLevelUser20.php", data=data) -print(req.text) -``` - -**Response** -```py -1 -``` - - diff --git a/docs/endpoints/accept_friend_request.md b/docs/endpoints/friend_requests/accept_friend_request.md similarity index 93% rename from docs/endpoints/accept_friend_request.md rename to docs/endpoints/friend_requests/accept_friend_request.md index 264fa38d4..dd2cbfd76 100644 --- a/docs/endpoints/accept_friend_request.md +++ b/docs/endpoints/friend_requests/accept_friend_request.md @@ -4,7 +4,9 @@ ## Endpoint -The current endpoint is `acceptGJFriendRequest20.php`. +| method | endpoint | +|--------|-------------------------------| +| `POST` | `acceptGJFriendRequest20.php` | ## Parameters diff --git a/docs/endpoints/delete_friend_request.md b/docs/endpoints/friend_requests/delete_friend_request.md similarity index 87% rename from docs/endpoints/delete_friend_request.md rename to docs/endpoints/friend_requests/delete_friend_request.md index cfb7c92a7..b5e0e7434 100644 --- a/docs/endpoints/delete_friend_request.md +++ b/docs/endpoints/friend_requests/delete_friend_request.md @@ -4,7 +4,9 @@ ## Endpoint -The current endpoint is `deleteGJFriendRequests20.php`. +| method | endpoint | +|--------|--------------------------------| +| `POST` | `deleteGJFriendRequests20.php` | ## Parameters @@ -50,3 +52,7 @@ print(response.text) ```console 1 ``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions \ No newline at end of file diff --git a/docs/endpoints/levels/delete_level.md b/docs/endpoints/levels/delete_level.md new file mode 100644 index 000000000..3d0a9ad63 --- /dev/null +++ b/docs/endpoints/levels/delete_level.md @@ -0,0 +1,56 @@ +# Delete Level + +*Deletes a level.* + +## Endpoint + +| method | endpoint | +|--------|---------------------------| +| `POST` | `deleteGJLevelUser20.php` | + +## Parameters + +| name | description | +|------------------|----------------------------------------------------| +| `accountID` | The level creator's account ID. | +| `gjp` | The level creator's [encoded password][passwords]. | +| `levelID` | The ID of the level being deleted. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the level is in *Geometry Dash World*. | + +## Response + +Returns `1` if deleted or `-1` if failed or the level does not exist. + +## Example + +### Code + +```python +import requests + +# with this code, DevExit is deleting one of her levels + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "levelID": 62689548, # level ID + "secret": "Wmfv2898gc9", # common secret +} + +response = requests.post("http://boomlings.com/database/deleteGJLevelUser20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions diff --git a/docs/endpoints/block_user.md b/docs/endpoints/users/block_user.md similarity index 93% rename from docs/endpoints/block_user.md rename to docs/endpoints/users/block_user.md index 6e15b3678..aa9bbddf4 100644 --- a/docs/endpoints/block_user.md +++ b/docs/endpoints/users/block_user.md @@ -4,7 +4,9 @@ ## Endpoint -The current endpoint is `blockGJUser20.php`. +| method | endpoint | +|--------|---------------------| +| `POST` | `blockGJUser20.php` | ## Parameters diff --git a/docs/resources/server/versions.md b/docs/resources/server/versions.md new file mode 100644 index 000000000..3480ffe57 --- /dev/null +++ b/docs/resources/server/versions.md @@ -0,0 +1,6 @@ +# Versions + +| name | version | +|----------------|---------| +| Game Version | `21` | +| Binary Version | `35` | diff --git a/mkdocs.yml b/mkdocs.yml index 22979ef62..cb7fb8669 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,6 +10,25 @@ remote_branch: github-pages watch: - docs +nav: + - "Index": "index.md" + - "Credits": "credits.md" + - "Endpoints": + - "Comments": + - "Delete Account Comment": "endpoints/comments/delete_account_comment.md" + - "Delete Level Comment": "endpoints/comments/delete_level_comment.md" + - "Friend Requests": + - "Accept Friend Request": "endpoints/friend_requests/accept_friend_request.md" + - "Delete Friend Request": "endpoints/friend_requests/delete_friend_request.md" + - "Levels": + - "Delete Level": "endpoints/levels/delete_level.md" + - "Users": + - "Block User": "endpoints/users/block_user.md" + - "Resources": + - "Server": + - "Secrets": "resources/server/secrets.md" + - "Versions": "resources/server/versions.md" + theme: name: material palette: From 8db6fb65c6aec5a50d7b2cad0916a8934da401b9 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 5 Jul 2022 16:27:49 +0300 Subject: [PATCH 04/17] Update encoding section, fix credits. --- .editorconfig | 17 ++ docs/endpoints/delete_message.md | 61 ------ docs/endpoints/download_level.md | 66 ------ docs/endpoints/levels/download_level.md | 62 ++++++ docs/endpoints/messages/delete_message.md | 57 +++++ docs/topics/encoding/aes.md | 1 + docs/topics/encoding/base64.md | 79 ++++++- docs/topics/encoding/checks.md | 176 ++++++++++++++++ .../{random_string_and_id.md => ids.md} | 0 docs/topics/encoding/robtop.md | 1 + docs/topics/encoding/seeds.md | 40 ++++ docs/topics/encoding/xor.md | 12 +- docs/topics/encoding/zip.md | 1 + docs/topics/encoding/~check.md | 197 ------------------ mkdocs.yml | 11 + 15 files changed, 448 insertions(+), 333 deletions(-) create mode 100644 .editorconfig delete mode 100644 docs/endpoints/delete_message.md delete mode 100644 docs/endpoints/download_level.md create mode 100644 docs/endpoints/levels/download_level.md create mode 100644 docs/endpoints/messages/delete_message.md create mode 100644 docs/topics/encoding/aes.md create mode 100644 docs/topics/encoding/checks.md rename docs/topics/encoding/{random_string_and_id.md => ids.md} (100%) create mode 100644 docs/topics/encoding/robtop.md create mode 100644 docs/topics/encoding/seeds.md delete mode 100644 docs/topics/encoding/~check.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..43ebb20c9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +indent_style = space +indent_size = 4 + +charset = utf-8 + +[*.yaml] +indent_size = 2 + +[*.yml] +indent_size = 2 diff --git a/docs/endpoints/delete_message.md b/docs/endpoints/delete_message.md deleted file mode 100644 index 5a37fff0e..000000000 --- a/docs/endpoints/delete_message.md +++ /dev/null @@ -1,61 +0,0 @@ -# deleteGJMessages20.php - -Deletes a message between two users. - -## Parameters - -### Required Parameters - -**accountID** - The account ID of the user who is deleting the message - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the message - -**messageID** - ID of the message being deleted - -**isSender** - 1 if the user who deleted the message is the sender, otherwise this parameter isn't sent - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Always returns 1, regardless of whether the message was deleted or not. - -## Example - - - -### **Python** - -```py -import requests - -# With this code, DevExit is deleting a message with the ID 3141592 -# DevExit received this message, and therefore the isSender parameter is not needed - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "messageID": 3141592, - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/deleteGJMessages20.php", data=data) -print(req.text) - - -``` - -**Response** -```py -1 -``` - - \ No newline at end of file diff --git a/docs/endpoints/download_level.md b/docs/endpoints/download_level.md deleted file mode 100644 index dc551a9e9..000000000 --- a/docs/endpoints/download_level.md +++ /dev/null @@ -1,66 +0,0 @@ -# downloadGJLevel22.php - -Downloads a user level and info so it can be played. - -## Parameters - -### Required Parameters - -**levelID** - The ID of the level to download. Use -1 for the daily level and -2 for the weekly. - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -**accountID** - The account ID of the user who is downloading the level - -**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is downloading the level - -**udid** - The [udid](/topics/encryption/id?id=udid) of the user who is downloading the level - -**uuid** - The [uuid](/topics/encryption/id?id=uuid) of the user who is downloading the level - -**inc** - Unknown function. Set to 1 - -**extras** - Unknown function. Set to 0 - -**rs** - [See here](topics/encryption/id?id=rs) - -**chk** - [See here](/topics/encryption/chk?id=download-level) - -## Response - -Returns a [level object](/resources/server/level.md). - -## Example - - - -### **Python** - -```py -import requests - -# With this code we are getting the level info of Test by DevExit - -data = { - "levelID": 62687277, - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/downloadGJLevel22.php", data=data) -print(req.text) -``` - -**Response** -```py -1:62687277:2:Test:3:QSB0ZXN0IGxldmVsIGZvciB0aGUgR0QgRG9jcyE=:4:H4sIAAAAAAAAC6WQwQ3DIAxFF3IlfxsIUU6ZIQP8AbJChy_GPSZqpF7-A4yfDOfhXcCiNMIqnVYrgYQl8rDwBTZCVbkQRI3oVHbiDU6F2jMF_lesl4q4kw2PJMbovxLBQxTpM3-I6q0oHmXjzx7N0240cu5w0UBNtESRkble8uSLHjh8nTubmYJZ2MvMrEITEN0gEJMxlLiMZ28frmj:5:1:6:3935672:8:0:9:0:10:1:12:0:13:21:14:0:17::43:0:25::18:0:19:0:42:0:45:1:15:0:30:55610687:31:0:28:1 hour:29:1 hour:35:546561:36::37:0:38:0:39:50:46::47::40::27:AQcHBwEL#1bae6491cc87c72326abcbc0a7afaee139aa7088#f17c5a61f4ba1c7512081132459ddfaaa7c6f716 -``` - - diff --git a/docs/endpoints/levels/download_level.md b/docs/endpoints/levels/download_level.md new file mode 100644 index 000000000..a3ace2ecc --- /dev/null +++ b/docs/endpoints/levels/download_level.md @@ -0,0 +1,62 @@ +# Download Level + +*Downloads a level and related information.* + +## Parameters + +| name | description | +|------------------|---------------------------------------------------------------------------------------| +| `levelID` | The ID of the level to download. See [special level IDs][special_level_ids] for more. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the level is in *Geometry Dash World*. | +| `accountID`? | The account ID of the user downloading the level. | +| `gjp`? | The [encoded password][passwords] of the user downloading the level. | +| `udid`? | The [UDID][udid] of the user who is downloading the level. | +| `uuid`? | The [UUID][uuid] of the downloading the level. | +| `inc`? | Unknown functionality. Set to `1`. | +| `extras`? | Unknown functionality. Set to `0`. | +| `rs`? | Random string. See [here][random_string]. | +| `chk`? | Check. See [here][download_level]. | + +## Response + +Returns a [level][levels]. + +## Example + +### Code + +```python +import requests + +# with this code we are getting the level Test by DevExit + +data = { + "levelID": 62687277, # level ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/downloadGJLevel22.php", data=data) + +print(response.text) +``` + +### Output + +```console +1:62687277:2:Test:3:QSB0ZXN0IGxldmVsIGZvciB0aGUgR0QgRG9jcyE=:4:H4sIAAAAAAAAC6WQwQ3DIAxFF3IlfxsIUU6ZIQP8AbJChy_GPSZqpF7-A4yfDOfhXcCiNMIqnVYrgYQl8rDwBTZCVbkQRI3oVHbiDU6F2jMF_lesl4q4kw2PJMbovxLBQxTpM3-I6q0oHmXjzx7N0240cu5w0UBNtESRkble8uSLHjh8nTubmYJZ2MvMrEITEN0gEJMxlLiMZ28frmj:5:1:6:3935672:8:0:9:0:10:1:12:0:13:21:14:0:17::43:0:25::18:0:19:0:42:0:45:1:15:0:30:55610687:31:0:28:1 hour:29:1 hour:35:546561:36::37:0:38:0:39:50:46::47::40::27:AQcHBwEL#1bae6491cc87c72326abcbc0a7afaee139aa7088#f17c5a61f4ba1c7512081132459ddfaaa7c6f716 +``` + +[special_level_ids]: /resources/server/special_level_ids +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions +[passwords]: /resources/server/passwords + +[levels]: /resources/server/levels + +[udid]: /topics/encoding/ids#udid +[uuid]: /topics/encoding/ids#uuid +[random_string]: /topics/encoding/ids#random-string +[download_level]: /topics/encoding/checks#download-level diff --git a/docs/endpoints/messages/delete_message.md b/docs/endpoints/messages/delete_message.md new file mode 100644 index 000000000..99721bbbb --- /dev/null +++ b/docs/endpoints/messages/delete_message.md @@ -0,0 +1,57 @@ +# Delete Message + +*Deletes a message between two users.* + +## Endpoint + +| method | endpoint | +|--------|--------------------------| +| `POST` | `deleteGJMessages20.php` | + +## Parameters + +| name | description | +|------------------|---------------------------------------------------------------------| +| `accountID` | The account ID of the user who is deleting the message. | +| `gjp` | The [encoded password][passwords] of the user deleting the message. | +| `messageID` | The ID of the message being deleted. | +| `secret` | The [common secret][secrets]. | +| `isSender`? | Whether the user is the sender. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the message is in *Geometry Dash World*. | + +## Response + +Always returns `1`, regardless of whether the message was deleted or not. + +## Example + +### Code + +```python +import requests + +# with this code, DevExit is deleting one of her recievied messages + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "messageID": 3141592, # message ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/deleteGJMessages20.php", data=data) + +print(response.text) +``` + +### Output + +```console +1 +``` + +[passwords]: /resources/server/passwords +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions diff --git a/docs/topics/encoding/aes.md b/docs/topics/encoding/aes.md new file mode 100644 index 000000000..de3bad2fc --- /dev/null +++ b/docs/topics/encoding/aes.md @@ -0,0 +1 @@ +# AES diff --git a/docs/topics/encoding/base64.md b/docs/topics/encoding/base64.md index 3780fcf4a..287e5427a 100644 --- a/docs/topics/encoding/base64.md +++ b/docs/topics/encoding/base64.md @@ -1,10 +1,85 @@ # Base64 -[Base64][Base64] encoding is widely used amongst different endpoints in Geometry Dash. +[Base64][base64] encoding is widely used amongst different endpoints in Geometry Dash. It is used to encode fields like level data, level descriptions, comments, etc. GD uses *URL-safe* Base64 encoding, which uses `[A-Z]` and `[a-z]` letters along with `_` and `-` as special characters. -[Base64]: https://en.wikipedia.org/wiki/Base64 \ No newline at end of file +## Code + +```python +# taken from gd.py + +from base64 import b64decode as standard_decode_base64 +from base64 import b64encode as standard_encode_base64 +from base64 import urlsafe_b64decode as standard_decode_base64_url_safe +from base64 import urlsafe_b64encode as standard_encode_base64_url_safe + +# encoding + +DEFAULT_ENCODING = "utf-8" +DEFAULT_ERRORS = "strict" + +# padding + +BASE64_PAD = 4 +BASE64_INVALID_TO_PAD = 1 +BASE64_PADDING = b"=" + + +def enforce_valid_base64(data: bytes) -> bytes: + required = len(data) % BASE64_PAD + + if required: + if required == BASE64_INVALID_TO_PAD: + data = data[:LAST] + + else: + data += BASE64_PADDING * (BASE64_PAD - required) + + return data + + +def decode_base64(data: bytes) -> bytes: + return standard_decode_base64(enforce_valid_base64(data)) + + +def encode_base64(data: bytes) -> bytes: + return standard_encode_base64(data) + + +def decode_base64_url_safe(data: bytes) -> bytes: + return standard_decode_base64_url_safe(enforce_valid_base64(data)) + + +def encode_base64_url_safe(data: bytes) -> bytes: + return standard_encode_base64_url_safe(data) + + +def decode_base64_string( + string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + return decode_base64(string.encode(encoding, errors)).decode(encoding, errors) + + +def encode_base64_string( + string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + return encode_base64(string.encode(encoding, errors)).decode(encoding, errors) + + +def decode_base64_string_url_safe( + string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + return decode_base64_url_safe(string.encode(encoding, errors)).decode(encoding, errors) + + +def encode_base64_string_url_safe( + string: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + return encode_base64_url_safe(string.encode(encoding, errors)).decode(encoding, errors) +``` + +[base64]: https://en.wikipedia.org/wiki/Base64 diff --git a/docs/topics/encoding/checks.md b/docs/topics/encoding/checks.md new file mode 100644 index 000000000..0c5fb003a --- /dev/null +++ b/docs/topics/encoding/checks.md @@ -0,0 +1,176 @@ +# Checks + +Check is a common parameter in requests, which is intended to "improve security". +It is often sent in request as `chk`. + +Check is generated like so: + +1. Take an arbitrary amount of values. +2. Combine them and add *salt* if there is one. +3. Apply [SHA-1][sha1] hashing to combined values and get its hexadecimal digest. +4. Apply [XOR Cipher][xor_cipher] to the digest with the desired key. +5. [Base64][base64] encode the result. + +## Code + +The generator can be implemented like this: + +```python +from hashlib import sha1 as standard_sha1 +from typing import Any, Iterable + +EMPTY = str() + +concat = EMPTY.join + +DEFAULT_ENCODING = "utf-8" +DEFAULT_ERRORS = "strict" + + +def sha1(data: bytes) -> str: + return standard_sha1(data).hexdigest() + + +def generate_check( + values: Iterable[Any], + key: str, + salt: str = EMPTY, + encoding: str = DEFAULT_ENCODING, + errors: str = DEFAULT_ERRORS, +) -> str: + values.append(salt) + + string = concat(map(str, values)) + + hashed = sha1(string.encode(encoding, errors)) + + xored = xor_string(hashed, key) + + encoded = encode_base64_string_url_safe(xored) + + return encoded +``` + +[XOR][xor] keys can be found [here][xor_keys]. + +Here is a summary of *Check* values and explanations on their generation: + +## [Download Level][download_level] + +| name | description +|-------------|-----------------------------------------------| +| `levelID` | ID of the level to download. | +| `inc` | Unknown functionality. Set to `1`. | +| `rs` | [Random String][random_string]. | +| `accountID` | Account ID of the user downloading the level. | +| `udid` | [UDID][udid] of the user. | +| `uuid` | [UUID][uuid] of the user. | + +## [Upload Level][upload_level] + +| name | description | +|---------|-----------------------------------------------------------------| +| `seed2` | See [generating upload seed][upload_seed] for more information. | + +## [Post Comment][post_comment] + +| name | description | +|------------|---------------------------------------------------------------------| +| `userName` | Name of the user commenting. | +| `comment` | The content of the comment. | +| `levelID` | The ID of the level containing the comment (`0` for user comments). | +| `percent` | The percentage on the level (`0` for user comments). | +| `cType` | The comment type (`0` for level comments, `1` for user comments). | + +## [Get Quests][get_quests] + +| name | description | +|-------|-----------------------------------------------------------------------------------------------| +| `chk` | To generate: [random string][random_string] of length `5` + [encoded random integer][robtop]. | + +## [Get Chests][get_chests] + +| name | description | +|-------|-----------------------------------------------------------------------------------------------| +| `chk` | To generate: [random string][random_string] of length `5` + [encoded random integer][robtop]. | + +## [Like Item][like_item] + +| name | description | +|-------------|---------------------------------------------------------------------------------------------| +| `special` | Special value. `0` for levels, `levelID` for level comments, `commentID` for user comments. | +| `itemID` | ID of the level comment, level or user comment. | +| `like` | Whether to like the item. | +| `rs` | [Random String][random_string]. | +| `accountID` | Account ID of the user (dis)liking an item. | +| `udid` | [UDID][udid] of the user. | +| `uuid` | [UUID][uuid] of the user. | + +## [Update Data][update_data] + +| name | description | +|----------------|--------------------------------------| +| `accountID` | The account ID of the user updating. | +| `userCoins` | The user coins count. | +| `demons` | The demons beaten count. | +| `stars` | The stars count. | +| `coins` | The secret coins count. | +| `iconType` | The icon type. | +| `icon` | ID of the icon. | +| `diamonds` | The diamonds count. | +| `accIcon` | ID of the cube selected. | +| `accShip` | ID of the ship selected. | +| `accBall` | ID of the ball selected. | +| `accBird` | ID of the UFO selected. | +| `accDart` | ID of the wave selected. | +| `accRobot` | ID of the robot selected. | +| `glow` | Whether to enable glow. | +| `accSpider` | ID of the spider selected. | +| `accExplosion` | ID of the explosion selected. | + +## [Level Leaderboard][get_level_leaderboard] + +| name | description | +|---------------|---------------------------------------------------------------------------| +| `accountID` | The account ID of the user requesting. | +| `levelID` | ID of the level to find leaderboard for. | +| `percent` | The record percentage on the level. | +| `jumps` | The total count of jumps on the level. | +| `attempts` | The total count of attempts spent. | +| `seed` | See [generating leaderboard seed][leaderboard_seed] for more information. | +| `differences` | Personal best differences, e.g `0 -> 13 -> 100 => 13,87`. | +| `unknown` | Unknown functionality. Set to `1`. | +| `coins` | The coins count on the level. | +| `timelyID` | The timely ID of the level (`0` if not timely). | +| `seed` | [Random String][random_string]. | + +## Salts + +| salt | usage | +|----------------|-------------------| +| `xI25fpAapCQg` | Level | +| `xPT6iUrtws0J` | Comment | +| `ysg6pUrtjn0J` | Like or Rate | +| `xI35fsAapCRg` | User | +| `yPg6pUrtWn0J` | Level Leaderboard | + +[sha1]: https://en.wikipedia.org/wiki/SHA-1 + +[base64]: /topics/encoding/base64 +[xor_cipher]: /topics/encoding/xor#xor-cipher +[xor]: /topics/encoding/xor +[xor_keys]: /topics/encoding/xor#xor-keys +[random_string]: /topics/encoding/ids#random-string +[udid]: /topics/encoding/ids#udid +[uuid]: /topics/encoding/ids#uuid +[upload_seed]: /topics/encoding/seeds#upload-seed +[leaderboard_seed]: /topics/encoding/seeds#leaderboard-seed + +[upload_level]: /endpoints/levels/upload_level +[download_level]: /endpoints/levels/download_level +[post_comment]: /endpoints/comments/post_comment +[get_quests]: /endpoints/quests/get_quests +[get_chests]: /endpoints/chests/get_chests +[like_item]: /endpoints/likes/like_item +[update_data]: /endpoints/users/update_data +[get_level_leaderboard]: /endpoints/levels/get_level_leaderboard diff --git a/docs/topics/encoding/random_string_and_id.md b/docs/topics/encoding/ids.md similarity index 100% rename from docs/topics/encoding/random_string_and_id.md rename to docs/topics/encoding/ids.md diff --git a/docs/topics/encoding/robtop.md b/docs/topics/encoding/robtop.md new file mode 100644 index 000000000..06eaa8a9a --- /dev/null +++ b/docs/topics/encoding/robtop.md @@ -0,0 +1 @@ +# RobTop Encoding diff --git a/docs/topics/encoding/seeds.md b/docs/topics/encoding/seeds.md new file mode 100644 index 000000000..8bc8a893c --- /dev/null +++ b/docs/topics/encoding/seeds.md @@ -0,0 +1,40 @@ +# Seeds + +## Upload Seed + +```python +from typing import AnyStr as AnyString + +COUNT = 50 + + +def generate_upload_seed(data: AnyString, count: int = COUNT) -> AnyString: + length = len(data) + + if length < count: + return data # not enough data + + return data[:: length // count][:count] +``` + +## Leaderboard Seed + +```python +HAS_PLAYED_MULTIPLY = 1482 +JUMPS_ADD = 3991 +PERCENTAGE_ADD = 8354 +SECONDS_ADD = 4085 + +SUBTRACT = JUMPS_ADD * PERCENTAGE_ADD + SECONDS_ADD * SECONDS_ADD + + +def generate_leaderboard_seed( + jumps: int, percentage: int, seconds: int, has_played: bool = True +) -> int: + + return ( + HAS_PLAYED_MULTIPLY * (has_played + 1) + + (jumps + JUMPS_ADD) * (percentage + PERCENTAGE_ADD) + + pow((seconds + SECONDS_ADD), 2) - SUBTRACT + ) +``` diff --git a/docs/topics/encoding/xor.md b/docs/topics/encoding/xor.md index edf51ddda..63118db78 100644 --- a/docs/topics/encoding/xor.md +++ b/docs/topics/encoding/xor.md @@ -7,16 +7,16 @@ Each character in a string is essentially represented as bytes, to which *XOR* i ## XOR Cipher *XOR Cipher* elaborates on the idea of applying *XOR* to each to byte, -one in the string and one in the key. +one in the data and one in the key. Here are our *XOR Cipher* empty functions: ```python -def xor(data: bytes, key: bytes) -> bytes: +def cyclic_xor(data: bytes, key: bytes) -> bytes: ... -def xor_string(string: str, key: str, encoding: str = ..., errors: str = ...) -> str: +def cyclic_xor_string(string: str, key: str, encoding: str = ..., errors: str = ...) -> str: ... ``` @@ -25,8 +25,6 @@ then applies *XOR* operation for each pair. Returning back to the function: - - ```python from itertools import cycle @@ -34,11 +32,11 @@ DEFAULT_ENCODING = "utf-8" DEFAULT_ERRORS = "strict" -def xor(data: bytes, key: bytes) -> bytes: +def cyclic_xor(data: bytes, key: bytes) -> bytes: return bytes(byte ^ key_byte for byte, key_byte in zip(data, cycle(key))) -def xor_string( +def cyclic_xor_string( string: str, key: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS ) -> str: result = xor(string.encode(encoding, errors), key.encode(encoding, errors)) diff --git a/docs/topics/encoding/zip.md b/docs/topics/encoding/zip.md index e69de29bb..6491272bd 100644 --- a/docs/topics/encoding/zip.md +++ b/docs/topics/encoding/zip.md @@ -0,0 +1 @@ +# ZIP diff --git a/docs/topics/encoding/~check.md b/docs/topics/encoding/~check.md deleted file mode 100644 index 9283c3882..000000000 --- a/docs/topics/encoding/~check.md +++ /dev/null @@ -1,197 +0,0 @@ -# Check - -Check is a common parameter in requests, which is intended to "improve security". -It is often sent in request as `chk`. - -Check is generated like so: - -1. Take an arbitrary amount of values. -2. Combine them and add *salt* if there is one. -3. Apply [SHA-1][SHA-1] hashing to combined values and get its hexadecimal digest. -4. Apply [XOR Cipher][XOR Cipher] to the digest with the desired key. -5. [Base64][Base64] encode the result. - -CHK generator can be implemented like this: - - - -### **Python** - -```py -from typing import Iterable -from hashlib import sha1 as standard_sha1 - -EMPTY = str() - -concat = EMPTY.join - - -def sha1(data: bytes) -> str: - return standard_sha1(data).hexdigest() - - -def generate_check(values: Iterable[Any], key: str = "", salt: str = "") -> str: - values.append(salt) - - string = concat(map(str, values)) # assure "str" type and connect values - - hashed = hashlib.sha1(string.encode()).hexdigest() - xored = xor_string(hashed, key) # we discuss this one in encryption/xor - final = base64.urlsafe_b64encode(xored.encode()).decode() - - return final -``` - - - -XOR keys can be found [here](topics/encryption/xor.md?id=xor-keys). - -Here is a list of CHK values and explanations on their generation: - -## Download level - -- LevelID -- Inc -- [RS](topics/encryption/id.md?id=rs) -- AccountID -- [UDID](topics/encryption/id.md?id=udid) -- [UUID](topics/encryption/id.md?id=uuid) - -## Upload level - -- seed2 - -seed2 is generated from level data: - - - -### **Pseudocode** - -```plain -seed2 = "" -space = length of levelString / 50 - -for i in range 50: - seed2 += levelString[space * i] - -seed2 += "xI25fpAapCQg" -sha1 encode seed2 -xor encrypt seed2 with key 41274 -``` - -### **Python** - -```py -def generate_upload_seed(data: str, chars: int = 50) -> str: - # GD currently uses 50 characters for level upload seed - if len(data) < chars: - return data # not enough data to generate - step = len(data) // chars - return data[::step][:chars] -``` - - - -## Comment - -- Username -- Comment Content -- LevelID -- Percentage -- Comment Type (0 = Level, 1 = User). - -## Challenges - -- Random Number - -Random number consisting of *5* digits. - -## Rewards - -- Random Number - -Random number consisting of *5* digits. - -## Like - -- Special (0 = Level, LevelID = Level Comment, CommentID = Other Comment) -- ItemID -- Like (0 = dislike, 1 = like) -- Type (1 = Level, 2 = Level Comment, 3 = Other Comment) -- [RS](topics/encryption/id.md?id=rs) -- AccountID -- [UDID](topics/encryption/id.md?id=udid) -- [UUID](topics/encryption/id.md?id=uuid) - -## User Profile - -- AccountID -- UserCoins -- Demons -- Stars -- Coins -- IconType -- Icon -- Diamonds -- CubeID -- ShipID -- BallID -- UFOID -- WaveID -- RobotID -- Glow (0 = disabled, 1 = enabled) -- SpiderID -- ExplosionID - -## Level Leaderboard - -- AccountID -- LevelID -- Percentage -- Jumps -- Attempts -- Seed - -Seed can be generated like this: - - - -### **Python** - -```py -def generate_leaderboard_seed( - jumps: int, percentage: int, seconds: int, has_played: bool = True -) -> int: - - return ( - 1482 * (has_played + 1) - + (jumps + 3991) * (percentage + 8354) - + ((seconds + 4085) ** 2) - 50028039 - ) -``` - - - -- Best Differences - -For example, `0%` - `13%` - `100%` -> `(13 - 0), (100 - 13)` -> `13,87` - -- Unknown (always 1) - -- Coins -- TimelyID -- [RS](topics/encryption/id.md?id=rs) - -## Salts - -| Salt | Usage | -|----------------|-------------------| -| `xI25fpAapCQg` | Level | -| `xPT6iUrtws0J` | Comment | -| `ysg6pUrtjn0J` | Like or Rate | -| `xI35fsAapCRg` | User Profile | -| `yPg6pUrtWn0J` | Level Leaderboard | - -[Base64]: /topics/encoding/base64 -[XOR Cipher]: /topics/encoding/xor#xor-cipher -[SHA-1]: https://en.wikipedia.org/wiki/SHA-1 \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index cb7fb8669..00cd48c56 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,6 +22,9 @@ nav: - "Delete Friend Request": "endpoints/friend_requests/delete_friend_request.md" - "Levels": - "Delete Level": "endpoints/levels/delete_level.md" + - "Download Level": "endpoints/levels/download_level.md" + - "Messages": + - "Delete Message": "endpoints/messages/delete_message.md" - "Users": - "Block User": "endpoints/users/block_user.md" - "Resources": @@ -29,6 +32,14 @@ nav: - "Secrets": "resources/server/secrets.md" - "Versions": "resources/server/versions.md" + - "Topics": + - "Encoding": + - "Base64": "topics/encoding/base64.md" + - "Checks": "topics/encoding/checks.md" + - "Random String, UUID and UDID": "topics/encoding/ids.md" + - "Seeds": "topics/encoding/seeds.md" + - "XOR": "topics/encoding/xor.md" + theme: name: material palette: From bd5836c34715bfa9aee2a6b4132cf1f6c57423ff Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 5 Jul 2022 23:03:51 +0300 Subject: [PATCH 05/17] Make GitHub Pages fully compatible. --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 000000000..9cb50b9df --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +docs.gd-programming.org From ae6328c00781d5c03e75c919bbe0ba7cef6ef11c Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Wed, 6 Jul 2022 23:32:06 +0300 Subject: [PATCH 06/17] Update server items to plural form, add read_message. --- docs/endpoints/download_message.md | 56 ------------------ docs/endpoints/levels/download_level.md | 4 +- docs/endpoints/messages/read_message.md | 58 +++++++++++++++++++ .../server/{comment.md => comments.md} | 0 .../{friendrequest.md => friend_requests.md} | 0 .../server/{gauntlet.md => gauntlets.md} | 0 .../{leaderboardscore.md => leaderboards.md} | 0 docs/resources/server/{level.md => levels.md} | 0 .../server/{mappack.md => map_packs.md} | 0 .../server/{message.md => messages.md} | 0 docs/resources/server/{song.md => songs.md} | 0 docs/resources/server/{user.md => users.md} | 0 mkdocs.yml | 3 + 13 files changed, 63 insertions(+), 58 deletions(-) delete mode 100644 docs/endpoints/download_message.md create mode 100644 docs/endpoints/messages/read_message.md rename docs/resources/server/{comment.md => comments.md} (100%) rename docs/resources/server/{friendrequest.md => friend_requests.md} (100%) rename docs/resources/server/{gauntlet.md => gauntlets.md} (100%) rename docs/resources/server/{leaderboardscore.md => leaderboards.md} (100%) rename docs/resources/server/{level.md => levels.md} (100%) rename docs/resources/server/{mappack.md => map_packs.md} (100%) rename docs/resources/server/{message.md => messages.md} (100%) rename docs/resources/server/{song.md => songs.md} (100%) rename docs/resources/server/{user.md => users.md} (100%) diff --git a/docs/endpoints/download_message.md b/docs/endpoints/download_message.md deleted file mode 100644 index c90b35b31..000000000 --- a/docs/endpoints/download_message.md +++ /dev/null @@ -1,56 +0,0 @@ -# downloadGJMessage20.php - -Download a message. - -## Parameters - -### Required Parameters - -**accountID** - The person's account ID - -**gjp** - The blocking person's [GJP](/topics/encryption/gjp.md) - -**messageID** - The ID of the message to read - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Returns a [message object](/resources/server/message.md) separated by colons `:` - -## Example - - - -### **Python** - -```py -import requests - -# With this code we are getting the message info of the message with ID 54109536 - -data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # This would be DevExit's password encoded with GJP encryption - "messageID": 54109536, - "secret": "Wmfd2893gb7" -} - -req = requests.post("http://boomlings.com/database/downloadGJMessage20.php", data=data) -print(req.text) -``` - -**Response** -```py -6:DevExit:3:3935672:2:173831:1:54109536:4:WW91J3JlIGR1bWIgbG9s:8:1:9:0:5:TWhtIHllcCB5b3UncmUgcCBkdW1iIGxtYW8=:7:19 minutes -``` - - diff --git a/docs/endpoints/levels/download_level.md b/docs/endpoints/levels/download_level.md index a3ace2ecc..8f952de11 100644 --- a/docs/endpoints/levels/download_level.md +++ b/docs/endpoints/levels/download_level.md @@ -15,8 +15,8 @@ | `gjp`? | The [encoded password][passwords] of the user downloading the level. | | `udid`? | The [UDID][udid] of the user who is downloading the level. | | `uuid`? | The [UUID][uuid] of the downloading the level. | -| `inc`? | Unknown functionality. Set to `1`. | -| `extras`? | Unknown functionality. Set to `0`. | +| `inc`? | Whether to count the download towards total downloads. Usually set to `1`. | +| `extras`? | Currently not used. Set to `0`. | | `rs`? | Random string. See [here][random_string]. | | `chk`? | Check. See [here][download_level]. | diff --git a/docs/endpoints/messages/read_message.md b/docs/endpoints/messages/read_message.md new file mode 100644 index 000000000..b45d93707 --- /dev/null +++ b/docs/endpoints/messages/read_message.md @@ -0,0 +1,58 @@ +# Download Message + +*Downloads a message, effectively reading it.* + +## Endpoint + +| method | endpoint | +|--------|---------------------------| +| `POST` | `downloadGJMessage20.php` | + +## Parameters + +| name | description | +|------------------|--------------------------------------------------| +| `accountID` | The user's account ID. | +| `gjp` | The user's [encoded password][passwords]. | +| `message` | The ID of the message to read. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the message is in *Geometry Dash World*. | + +## Response + +Returns a [message][messages]. + +## Example + +### Code + +```python +import requests + +# with this code we are downloading the message with a given ID + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "messageID": 54109536, # message ID + "secret": "Wmfd2893gb7", # common secret +} + +response = requests.post("http://boomlings.com/database/downloadGJMessage20.php", data=data) + +print(response.text) +``` + +### Output + +```console +6:DevExit:3:3935672:2:173831:1:54109536:4:WW91J3JlIGR1bWIgbG9s:8:1:9:0:5:TWhtIHllcCB5b3UncmUgcCBkdW1iIGxtYW8=:7:19 minutes +``` + +[secrets]: /resources/server/secrets +[versions]: /resources/server/versions +[passwords]: /resources/server/passwords + +[messages]: /resources/server/messages diff --git a/docs/resources/server/comment.md b/docs/resources/server/comments.md similarity index 100% rename from docs/resources/server/comment.md rename to docs/resources/server/comments.md diff --git a/docs/resources/server/friendrequest.md b/docs/resources/server/friend_requests.md similarity index 100% rename from docs/resources/server/friendrequest.md rename to docs/resources/server/friend_requests.md diff --git a/docs/resources/server/gauntlet.md b/docs/resources/server/gauntlets.md similarity index 100% rename from docs/resources/server/gauntlet.md rename to docs/resources/server/gauntlets.md diff --git a/docs/resources/server/leaderboardscore.md b/docs/resources/server/leaderboards.md similarity index 100% rename from docs/resources/server/leaderboardscore.md rename to docs/resources/server/leaderboards.md diff --git a/docs/resources/server/level.md b/docs/resources/server/levels.md similarity index 100% rename from docs/resources/server/level.md rename to docs/resources/server/levels.md diff --git a/docs/resources/server/mappack.md b/docs/resources/server/map_packs.md similarity index 100% rename from docs/resources/server/mappack.md rename to docs/resources/server/map_packs.md diff --git a/docs/resources/server/message.md b/docs/resources/server/messages.md similarity index 100% rename from docs/resources/server/message.md rename to docs/resources/server/messages.md diff --git a/docs/resources/server/song.md b/docs/resources/server/songs.md similarity index 100% rename from docs/resources/server/song.md rename to docs/resources/server/songs.md diff --git a/docs/resources/server/user.md b/docs/resources/server/users.md similarity index 100% rename from docs/resources/server/user.md rename to docs/resources/server/users.md diff --git a/mkdocs.yml b/mkdocs.yml index 00cd48c56..e103b36fb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -13,6 +13,7 @@ watch: nav: - "Index": "index.md" - "Credits": "credits.md" + - "Endpoints": - "Comments": - "Delete Account Comment": "endpoints/comments/delete_account_comment.md" @@ -25,8 +26,10 @@ nav: - "Download Level": "endpoints/levels/download_level.md" - "Messages": - "Delete Message": "endpoints/messages/delete_message.md" + - "Read Message": "endpoints/messages/read_message.md" - "Users": - "Block User": "endpoints/users/block_user.md" + - "Resources": - "Server": - "Secrets": "resources/server/secrets.md" From c8a8b57f99d40f54ddc388c9451a379040c12d4c Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Wed, 6 Jul 2022 23:44:10 +0300 Subject: [PATCH 07/17] Rename `CREDITS` to `credits`. --- docs/{CREDITS.md => credits.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{CREDITS.md => credits.md} (100%) diff --git a/docs/CREDITS.md b/docs/credits.md similarity index 100% rename from docs/CREDITS.md rename to docs/credits.md From 501f0637336f60c593a51c552263df8883462ac9 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 12 Jul 2022 04:17:34 +0300 Subject: [PATCH 08/17] Add error codes docs. --- docs/endpoints/load_data.md | 45 --------------- docs/topics/level_passwords.md | 31 ---------- docs/topics/status_codes.md | 67 ---------------------- docs/topics/vault_codes.md | 101 +++++++++++++++++++++------------ mkdocs.yml | 6 ++ 5 files changed, 71 insertions(+), 179 deletions(-) delete mode 100644 docs/endpoints/load_data.md delete mode 100644 docs/topics/level_passwords.md delete mode 100644 docs/topics/status_codes.md diff --git a/docs/endpoints/load_data.md b/docs/endpoints/load_data.md deleted file mode 100644 index 55a3deebd..000000000 --- a/docs/endpoints/load_data.md +++ /dev/null @@ -1,45 +0,0 @@ -# getSaveData.php - -Unknown - -## Parameters - -### Required Parameters - -**secret** - Wmfd2893gb7 - -### Optional Parameters - -**gameVersion** - 21 - -**binaryVersion** - 35 - -**gdw** - 0 - -## Response - -Returns seemingly random [urlsafe base64](/topics/encryption/base64.md) encoded text - -## Example - - - -### **Python** - -```py -import requests - -data = { - "secret": "Wmfd2893gb7", -} - -req = requests.post('http://boomlings.com/database/getSaveData.php', data=data) -print(req.text) -``` - -**Response** -```py -UmysuWpDzKaglTFZR65eeJxEnVei5DoOQzd0P2xl7X9jzQPA1ZOex9dlK1CMIPm2_r5jnL_597Z29xntb9Vlf29v-7tcbf5dLsd7zvk7XD7rzP63ddlX63_vo1fMOa5-1859n_03uKxH5vDbev2fqVe8e-0x8uXR-_LlrOFMvfjdp97hl627dy7b80x_oj9ttlVDO-M-47xcnfd5nsWf37Xa24-f5AvjN7V3_HXN5-z3zeWt2xptf56ahu-ufv2yGsHcZ3mWoz3t1cM1hzGaHn536-edPPzM-rhGfu5aI_OtNajRefVmZwx-2bP3eTT3d549M8t7dp_1ifvW43v-tfpC_XzUMtUb6tl3ZUH6O98agl72zvZkpUerb18t5HPedpp_N976Hz_w3H6z3fveN6_ojQ1nPO-9o_ZArxjPu2em_9x9m99cDz_9avBPZ_6-bKsW_O_VTGuJv2fbs9jvIrN3j62XvTW3WmV-9tRKvN-cavZP42e1kLVwJojxzpGZvmOde59aoDbq0Tm-oZ07dx4es32XczdT2iiqmMf7_NbK5Xe1G3OHhsc87fWJGGO9W4Mrwu3nud875s0xqFOyV9a7jZtX9HVqZn54v4N7_Kd2tNZDPxy1l_3ROCDC4QP23FWnMcM446ycsLft0bNpfdSlTuOZRV56G_RWZ8Lf7vtZ27fbWe2EMnY9rg8WGY33-lyMXUdoehh1Glv77hbd69Nz1uE3ddY-sXRa0NrX5zsMNb0rsn_HM8b0asyabPOJHqtWqekb8_S9PPp5e43D31gc6frZ5oHXbGfesetX2uvasztWnp21zh5E_X779BbTOUM08sw6u-d7tvf5ZiWKIF8PuIa2ThboGdvEV0xhPkffu099-Ojhycl6s7CzWFOtCtMes0gur1vPOR9za08tNNN72-3wOS7Pe9azPzrbtd3-4Hh-m1Mb9f6GN4oBevFHkegy3dYE4BjanV4blR-OYg8rBDP3Hh-F1vaNvK9IuKjOL9n18q3lL65U_9b7VhH2zhyLY9ZT3oDTz_IOzrffne2upYap-nqd_pH8LKb5mkZrcW7PDOaEw-olY59mvl1Evl5T0qyJb5_HYuXn-sDWeo11M-biRitMoTiPqaeGUNSmPVxFoo83fBXLm82Xc57Rv0nB0U11o8FstYy3KLdZ5tTBDOt6R00pcmDUIy2rLwptGk-JgiaqWxw2n421dltet6LV3V-Pslj_44VYZ-3HR38Vy1yZ5y7CDn8ZTzthwWu-iFwdqVruzbLWKhXP3DWGU2Q26-B7CJc1W6bDkkV-7buKefhd-xR7ZftPf_YRn6lPsiLcq5PbJJ6KpIrWGStHbUrKL32dVYZFFw3UX8eG17DctTynnq2rdvZ9nhzK2otuMqj5vmbcT7GkGR5eZ7wEhZby6SV_YAwlXOb7-CjvWdLFUrTI-YTt7aKjsJNV293Np0qMtOWt33Xo-3ci68Q172EJ7SfUU0y25LYYYG1QcR-9rVgBR0IEoVNtvjCLjXQJzF1U13LCSs2owxLl5Z5PHUDYvZDErcmVUpOH5__B1Vo9O9T6PmYAJZH7c8TgS-q9s47x0KrdohtdloQ44TJIwfua1uptJfs9vSIa6wb1tnuLKCzY1huZWyTRzNTZgD3EDZ86nmySv1HiM9NbddKunnhL5l4rWaVMTTQGCbASy8WqNJEjOZiplmx5vDunVIZX524he7bpvH5WwjgPn_3kvN6n6NCTuo9Uy1yiaviSE5vLIqz2m9Tju0V4t3GeS8QUp-B4lIwtSQeFlVy5EFhRPxKtZtw18FvUFIGMHivJU2SAiKnPduQ1Z3KVfvBKaawVqHdBJevU7j2w5NJ-933Nz04Jg24qO_O2bz032pPpF83tiKCK4kqMmuJ2MYpzPurc0rrqzOy-2d4xJbXrar4l0h-IYsJcDqOr7xT1aPGely2VhH1qwqUDaaKl3Ozi61zWo6WEQ6HF3Up5M9crihK3vBzlq6nU2oi3SESsZ0YulFQtVmRRWootxCy63u3j7iWtS8573pBAC2mUWC1e_12XfqOVv0Vcda2Z310D_Z6YiEtYVH2k-DOMqRj5GjmLpR3cN0pFEbyVn9JiSzRbhPTS8t_cRePxcS_y84jf2ryc4Bf29H5KYZHkNVmX3jE5n4dF6zenD13CDLWU4lJZLUTrugwEva3kR_MS1j966SY6lEVpRVc-qqUbdLPAy9HwNIqGWG4fjPXUpL2aJRi2BEcZI7U1Zo23OFH3wa9LlDW97dwWOY0SL3LWID5hemEMOu31strIlveW_PfP6rT1bYm1i-NPRGzt1bN8kMuMKDpFL68Xldj8-NtdZQ56NLU-yC4t-2G_9V2U--gVRVYlBEL_A4V_aQzP_yeKmfUc9YlF4yf6Lo7yewKTR0_0kjyZ3QvH9JQmvCq7L81EK9Eb5-R4JdbNqtWG9J5L7EgeqH92bAaReY3tG2aR_Fm-HLUfj5-tB27ze1ftqJhXf7Afry832-iR1amOfVUqzLO_ARdRjCeirCxnk2DRPXbkNHdm7EvCslTi_KwWMCYF85gx4oqSig9omG8tRDfRnFLuGkRTx6T4fvPYi8gtQurRjiLIyyCPdUJ2xaP6yu06oraC6tPFZl8vRVlarz_HsX7ePNzQnv2VUs9P9LVXvMSrObBn8xE2TKxklAqW-b-rllE6cqk8y7YxXy57vh44JW_LEsli1veGKb52_z4nB6zUPJ-kVepeP54pngfvnVT1_l3WpDWcukS_7LocNzq2rqdNNRSZ4q7XRLH3jEbyMDSd8l5SHYFcqnN9DXnEC94pXbuYS5m4w4cK6RT75hRRrbCUYv5TIgFrv0Yv7lJy_sTwv01G8vCyv0_LsqNBLa8ULgeTYB3AR1ZDrUhxohER3UesuzoNzUtd-gM6lKb2lqm7fxSKANZunnp0f3watVIrVcQxLVDeLhs4R7FUv-0Fro0dO8PBExGV6EH4iFjLzDHd4njon304eLNNuuJJ28uDGHxMPC_UOnIqS1Xa_nCf83f-yoCJdlESroXesUFR1mojcFeFzaxuJxiOADxFHm7vXvX6FXLbl6XLPUN7UQrwiBAqFrHvyAN7SAiVDdbgLF7Ie01x0oB8tIoVlEDLVhURPeFCxQoaq1DDR1DqVxxN6wql3hUh5si-thb1BvSBxzv4yonmJ8pcHTlDJXeevKNoYFsovKV4fD6TdeNxQ3qifIg0Nta6dYpzureC90IPJsTidNs_m_Cpz4-Gx8R-mTpv8SRhwL_Hp2yWom5VqH5XjDxDK2Z6s1lFBj0yuIwSmzqQzs52FUHtG1lRe9jMb4tdr_NddkSwl2JvvDV6cx0SM_LartoaWy8lV1Z2vMGFwgBxXH2LdTknfqLOt5wOowbcPmZZj36HoBSs-T55dmNBT_-sOKcUE1xbMpRrMDUg_V03X7-gZAJ-K5vMH5_vcKl1v6_V__NBhGNFj6rr4tPfRrdukwQdtEjW5FjK7jYDLJUCZlmHtTam-cuQ7bIB3rnX4laoWfQ3g6gl8dBe_DsnMqHkptl8wxCWFsSz5_2WpzavZyGwpx6PvUi6h5YWqoeHXlwrRFMW5opuVBrM-gykiULjz5W8aubzZcg-NuHR32trPIjFyvuBUsC9rF1mN187WOoRCaUasLEaI5rdN_RSxGwqytaYksAb4-fZZtgsaphTnZlQWjHFEsYoR_UGlCq_4aD2xgookrII32iqM6fynZLFZ9UhsAOnjngbvWc4ZcRat8QXf_tHEfW2aD51RlZ7Qkkbw1RTKtVoebs6ur4fQA3_DmvN49i_C-28tpQ74nw_v6XA2DK3Y65aisd-UUhtFC9bYUCtNlyeWr5SmuiTb9dDJkbM4N4--kC39ZgH1OIdQS3_bcOaw9oY3oYwe6gtHB5d1MZ0LcZ7bejip8U3qbftE89PXY4boSZOsXOWynSd3bbyi78NQ6TEyenNf69XFF1dH7vX1PZgRLXPkVbKdR_RCdgIH7vN4dZilUVS-lqR5ipe3m3ml91aZtq3kbX9LcNBV49sqIdvaPeR78YKWLdViJOshJaffWsfL2eiprVwlZoplV0Xkd_xFXsdUHG8Zp3ADGYjvhMzpTIQipV7CkWYxRtsa-56gXWKOjonpCb949vNAwMXr6vltaVecqPkzbu_Y4tzX9ZNie7tHUSgn--s4jv6uFqpauxKrWKtnzWUjvWXHYRXdetcKP3vR9rrqWlij5W8beISZe6_j-0Uwj2r2eQthYoxlNKFvRd-y3qeiNtSGMa3QXAtueInJGv_aCshXGZlnL1ocKxfGXxFyXkFxkZ_fZwvLDMfObj42W1CJn64NLaJ3aA1eeEDltJjJbLRpU37ZXVS4bLbl79F6-x8dqZjL7CfcNuRZyfGgC9LZ7ALty6LnUFFJVNGj1TtePqtIpYOMx2-QEV6FDVUgEHhjRJQZVLfTIxQVc5oqXLhIKV-1G54i88pCWpXeem5LZRRQoeAk5UONHu-W5ZPC2tm-adZWr_8V4s30CRG7uJA0ci5u3yWhv7gu-g4w-_FaZafvRJLkhkPklDBvYN_SvZJzRfj2ltV7MO-HI5lD_kOVjqSuJ4g_tX8RB0NP1zS5vU36rLJs1pir1i3j-Mo2gwXLNX3SeCtlNjxDqueRZz7xmzBV_BmsaUv6hUlz2Cqmhwb47t4zMzDCNUcH72nobN-qj0iOgy4RJePbB2XJePqcHIUmCwlBsXPlNG0qBpCnUCvOpbiMauprR_Nvs6u4N52wK_eFu_sQbBHhS_Wes20ixwwAupwlip1PnWsBoYGifG58CtqGYqKiz1YNcVz_23AA9t4vVsKiVrzLOXPvkmUwkfaQA1ljs8cv-fYmQ7JjSi3Hf9SxlsMaPDaovR32pC7JRS2ot8LYSH3AmGRu7MI8_00u1LJiAnJcVuqurWRF3O4J75ZP_-04AfF98QLsD7FrhP2WGHZZWH5WQY7jofwoI2EVa1PBGHBvnn2YAuG_8ta1XosuGsWjw2wvOrzcxkUS34Zmk9pnaFhjrvEcbW6aIQ5miWwohyi_TSWbHVQAvP_AbEHDEcNIUHrZbMP71qN7Ikn68E5O6K1EuTwQpR4e0xbxQg-EQ23uVmeu27Y7BwYX7l7no9_lDUaTaNsu9omT-hgdZkGyvB3AJmjCQ7gu5z9u1x3mpUUS152Rx5ReITBgzPjO8d1MBLzHrfHVVGDX-K5-CaLVBz-xnJ1QKWuym58c1mSzlTFGwzKKMHR9vpcyyWUZLiX3XVbIqn1z43LwAwLD-ifA559SwLuhRvTWvBAjbbCRFAnNFyLsmPYl2zC6yMmVoe7VGNtF76KrCW8Il6vUqSGD1TJAJzYiPG3RJ64-S663xEYQxyYwRx0Vnb-4OLs0O8kKC4JUfSBEgrjLMMFF2lWCyVVbLrY-M6WIF7lnyy-O39m3cAT9wV3y1jdwlsQHcFa-Vvyyr8ayS2m9f2qDKcdxbXMNrOyDmTkUwzQuuzL4_LKoETVwqhfqMm8rn4FImIRW-LIAImA2Mq226uH7Iqyu1la6VdoDYTnik0oukOovGYDdyzGV4crfksMkpyRRiBPb2JO2QqcVTvEjK0qXU8BSEc4XiJ8Ese3GO38kD1F9a8P0ThoIL4squ9d0cX60RvpVvSWoHQ98MV3Qdg81vhfWQeZ40VQRWS19vmzcKlNzMeFgTnlXSst-X0-E6RIb3dLn-KxI76XOkstXosyVe_9whd1_q05Iuns1i3edpd93ZegyqMoKAFwTR4_U7AInVCE48o1hLrrUAvh0dW-lcamst-gDIpv-9oKf8XRIflZ0hzjSANY2FGR1tgpN9438ENx_7YejaHjDIXU6vCUGLPmVDYGoZMihTJiofDrsRzjd-omMWNEW-mzNUn9feIcsNE08aT8NmpuB7twVli8nmOqqA8AD7HuB8TIi0kwV64ufbY9N5ieB0UUiwbt8Xl_RuPA4o-GBD15YmWObK146VWTkIN2epbcsWo2a2YxQfcrn4L3X3I5Kh0hCv-uWHpO5CQ0YJE2B_guu8Nr-6Z1gBJB70dYpfEdERO2yfPFRkvbFYEwHhQg0S5CKhyw-N8-nwO2TN-Oq-GWMtuaIu5l4F0b-R3WbR9xR0_-JEER0LDtzxhO1nJshZ819LK2orvV5W3f8cAsz9E-D_gTzahMysCHOsG_9uFgnm01q554ACkVpREHuzbzSud2vFSAKM0dafQFL6ATM7ySbO1NfJvJF1fy8uFnyFks9cKhbsldOyEJCj3rkYDB7x1hfbY1o1nyeSbAUvt-P0V8olpZzbvNd2sJxrIvCRNjjO-k4ULPTtXdrOhlxbyV63kMMKi7y1CNBb7wybdKFwiehN098Q4U-7SLGQHzxuXY5ba1k-YIPMl4wEAs-wEenuBZqe69SYKsZndqCav99gywjt_9lrP23BEHghf7izY2rLrQIOHE14RXs5jfD8tCMDKobr7LKAnCWMsYrzo9guMsa0I9GstLaDy0UupacWndruHuuNTqchjAiXf8ia9p4n1ceXaiuXZfDgdf6rK0rRx5uTUd7-BRI2-eUi8_w2yCtntiubXARepnTCXTKzOiTz9xcOhEVIxvl4EvLY9tb9zLHhAO85AykWnz6VrkdWMolgreLcSKJEc80nKqWWssU5aIrpB2HU7qob1bXtbv7JoRL2TBVYSnuIM9JcRvXuEYVv2rfXYDwAq59UoQPU_IG-biiREUim-qww4jde5F5k85XeRrsDjEjPcDtTT2DtRsBIvTxEori4kA7qTNbJskuaZbOo_hm7Vp54nrtpYI5bL58nye7dI8Zpa_Llu8IzWJdrIKtxZhhNBuTIsGisdoDb7bHb8vZWidrXUsQS0nx_GuPXEjLawxm8jAI_sHg3ve-xEXvglzjWJvT4hy15qcj3YmDiZjAEooPXm4JLS4a-3aXiF2kBhWnbsCRD4vC4hwyPPiTw2Fv8NBx5qRwLsZj8TQq0UZ86fsT7mf_JEzjHvrdYZAyw5forWLN4H8srK_0aNPdA7cc35xje1TMzf0ZVa6QX0YStQFeYpE6W-2FN_n-KJHC9C0vkzgw4rT_oUa6sslsyORkYE7S_x8bAZcUkJVWDgOmNfhG2_YDBAXR7AxMVE8r_jQu98vmHPBfGcexkW_evOPdzw4v6LglR61Pi_tBFkesw1LFf2pvi3sbc0Km0HYgfrtmnLMgnm8WpKiuWJ7DGyB_Rshd6AUWdNzCTCGg8DSs7UHEyDDLU64HNgoS2gZ_F0jmNdAYPgtMUrfBZKY2Xe-0hXNJYKnHajF2wk5Q3XvNwywkNmNiVOMIdf6v3EfgFnLcSfQbO5WDEXkfEyXN_6L0kK-mNaA-yR8cHZD3dCAaxrRsHCpGRAL3PecYN9Z_xj8OGqycUchmnykuHreXJ-zAYyN_pNvwHA-mx9oXJw9JTR34tZlNj_xFG4UV5-wiy1rnlGc8UyfDgS3Y-N19xeWIcB1LZBQ_j9n2nyJh7PcpY3doATrYRG_Xkw8qH0U8HSbX0S7cEFqmE2hMy1t3XOw_hEm05H0MoP253IqneH54BCXeefVHT6eJa8j9o0fJd5s_mJYSeQUAQ1jz1gMnBm_V0-jZLoQUgHcLjlm9YpxP0_crZdEquN4NGr84XR2k3WNEhB9Blo2aaJMdwOB9zvwMsl9iYj6_AFIwQRB64GS23qg_oy-ppUrSa6ZLiHkbeIiSWRYQ-uTAdfDuGMStRwPi_wRUWmXcXuOpz8fRKXe_IApEWAdzL7Wgu-hizYNaHC4Xv0OEesBSaj52WKcWnowMF0xI8yYraBtEcU517rbeoLrZmCPjOMJdl4aFsZsjgdKCag1f2cPw-_Awi97E_EMg8cduoty6IFglXT_DJPawu6U5Rk2MEA-CPp2CKT8nBkDM1oTBNzyeohGFflnZcI31mgV19pmbXW08BizZ6BqmxEMdVm8t3tkpSQbi_Bs_t5yBo79iTz73PVtw5BX3w7qWuXrKdcbrJuguccTDZpyyJdXW11j9IeVQeTNwyJfGfo7bjJg6ogvUFfy5xIhsIu1BjQVSC-FEkeEPyaFxC8TlkOrUwr3tDNwEOBZUv_R03v3Zr0ABmBryJ3i3zp4pSYE_zGKqHoLgZUp_DSPHFHZM9w1p6POQzHWjzGCYR7fIyehqgGIJGelNuPYY8vlu0yapZasBEgGbzNokbSY13pVvUJcdHh0WAaa6awxbx_CS-6JBtoefAkR9AetUvO7ANCyoYKZ62VlQVmqFnHdJnQiYQ6MaZb9Yr_G8sbjPcRl4QkttlItazNzHuhojl4MwKinmb5Qw4VfV8YEHxu1NF2wmgXGwErXg9YW7FUdO45GWEJ74B_iwfU1u0qBmrZwgVLHibV0M_pi1JpwW4M4uTjQg6nrvC2Q9yfy_xZfznF4ZmwzxO0wiBq7PPHpehv4_zgqn_VN8wp6F46Pd9tPd_CvH2_vy_yiTtpaT_PObRxCOUeExK00kRqyswIXS9xUTPKFX6FIsoANAy-QQyCoe8MyfQh1IGZbD4Bw_AY0SZ7T70b7HNLFtl6g_CxXHaVuoV5c9Y73i-RefFEeBhHk5XdsRUn1bZjGm8u13-8Qn2YnQd2teYi_4CAh40SfOzue9bokyu83lPJie3N0QZY1JwZk2VaXwqX5sqySaQJY7KXJsTbbfrqBwrVXAnqHgOswmb83kvRRWEf62CkV44lmUmTTMvQysmdmPF8HPGAqscdxZ82VnWlYQVnt0uMMhsJaVeBYakBx3fhiMcIj8UmT6pKUYLcwZ_gI6XoGJSgO4KhKPbuaMSU1rvVaDSAShj3IsyWr1zbvw2Af30RPD58sOn4NKwZaMG0JFx1DOd7l_Yas8K8uo6o7gHyrJZDVuqGIuXAaaH2K636kKy-e2VLxtRGLfoCy_bgjjzhRrvb7acYwEBz7MqbI1wnMnYj9Gud3LAibCllwFTuQ8xWUWfeWrPdDoBDpwKvbsiWjRV_BQfQneP9DPkxN_MVPw2trE881vO0h7VUYUsLqwXM_AC0EbQB6s-VPX8U8xue8KmK3yAeuihFlNnvf_Z05YlWxdUpp6e_viBanCO03sOum8hrZsFd4bY5uHh6gvmxgbPBm3qX13wdGbDjsA8PWfK5ObU_A6x7dFY0Spc0JBV5pTlJ01J3wVLopGXq67MS7PtMRyJrHUzJ_fDs3iZbO0OuOdTQgvcgfIL82K4hr348c57vHl_iHuhpo2XynJXAp2iXPpk8KyT62PwmM2ocLa3ssO7E_t47gwpe2fPaPNOZMFMU3foHnOl24rCu8CJ5GncYRF0itzsHclRx9iOzHtGv4s_w0-ls8ghcRXaMA-z-i2MJ0cYXiXS_DN6lOdRTXVZgUTdRA0tp5Icsi-7AY6l3FGuT5qiscEmazJTNHSyCgTqJtD-VPmnoA7rb5qViEorpfVfrLiGoCltjKKhEk-VqJ2HwuwussXOi5hMmOS7qsAKx7bXEdPJtTA7dmpHMdh9doNJj-cFIbZ7Pvb2ZlxDiXGhK_jrQPQlAjKg9-6rCyl9hYDGfSkrTOOFvNntCJcDlPc5zeLRYn2aoWFmXTv-fbqrWSUVRPrI8bgv51wivYm99pRYHqMxJpXPu1a6cUtQu5A8jSEyULjuGMtSrjcS5ayaAimGwCjkj7Vgc-n_sxqjrczgcE9oFbs04bZoAdSEPK9M1yLhQRaS1zjRwpXOlOTR5SF2xe1MEPVJq8y-OUnfrCl-M_OHw93mI8OnJOwA4COcLQ-jD3pW3IPa23oWSYY8zzoEFmZd8kgUEXnP7sNWDLlcdJUdHx2agcFiREwZyzTjbUsnpfpuIrz8ifwgMtD9SHP4UTn3PELyn_prLSQtreJrhFtNgCfCnDx3oYDNbDAd0dNaSeXfalDVREQ6eLju_nOhmE0h45bcD2kFrqF7f1ibVBwtvn_ztEwfSS7URUXxb_DDGUpHoT4j81jPbDMjxGOLCEj_3DY5PGZ2sLjNYjo7Hublxrot89LMv4xk5Ng6FEzvNpIr1nz7qSlPXeA-V4PBu8wEjM6X4piEz7dxwIXJ6A2DCnDV8EwRAN7oBelU9pkBGxP40In8kIn6mfPf8dUJY2IMjeb0i4qHJJqp4p_CgxRTMhG8KW8MGFnMXfgEtMTyRTxFczQI_AQUscKPtxCu-946jEAD8ri_UoaK-XlSb2Rbzq7_-56KnZvZEQWNkxGQ9R8kTuamEeCQg0m2u03JBH3ioYPqzvFRxmp6kM_P8O4NeTyv9mJrWy28nnA03caLdaFBLXw6HKZAnaAkTIytEupXoaacRH1vjceOS7-3Vld2wxkgk4tHuykyyF-CFKPVLGvF9NCMWf4aCceKZgbSQwilwPIAJ5WGAxUrweIEqp3VCrpPwcff2pxfbaXTQunyXyQBy9KtsNt4EfQOK-Hz9e70ccteExXkqd6M-H2tzrW11ivieSHU_Q-b1j-NzhVJ7xME9ViEioj7Tv_huokYfyTEXh4XoYBz_hbT0k_wt_DLRXQVfIAWpWON-iVnKQ_bZnBDc1KZ_gyhNTAQQlc6guhoOb-Ace-_GItEQpLwpt7fsE8G_bWyXH-7eBZW2d8ancHeX5Ux_XB6IY8Fh7C4t8HoPMNKfogZtzmo0vA-axnl3_PMN1HMpmGdsgKLbqOlxawlR2glb5kW_VNICSwGLcg34yP9nyJLpVLy7l15ek10RVnsol_OiyDNQc1AmSONOahPmXDOwp2Jk441TkZ4RCBaRkofEM2eTBG3jD-ckatL-QEP_coZJJxq4vNwogxFokUCfSu0bVl3ytjjZAMp15MgF1okFEdgN6J56oc7zvF-eqXlZviLceTj6c6FBERJTewwF_dTLnB-LQ2pOf2wN6x0r-yJNDn01roFQsJMq2vcmgfhDbMV2XCM0RjwtyT1MtxjTsDp5UUnnMWosPBDxeS1-UdnKJpv_tyEiWPZUzlh0TE1eqzep5hIkLna0khRO4jj0PUgvce9dlqUyP33ABVeYbRSLTelSpjl-AYVLjwy5_Cu1cJ8PX3XYNUwAzsWxsTkH-viGX9J_-dj06Iu2mUcXe4Xqz42RTdqy-PbEnDImp1dpvGAyb-dhoK1YJQMR2fK1cBHCxT5JwxXvnCZx5kpFqjYFvrHgVa7lx-2g12lBtGDvr3y961fazUjqETw8BHsAqn5AciVXv4xFvbLy82PANWd5zriigIGCtCE80UGOWyMoDCKxBzA9DW6ehCEBW9atkD-NOcLbN5mcfXFrfPFY7cXh20PeaP5p5YsO3jklUUI510scn2uHzDaiUChNRI5nOivkpgfk8tlRLCxrb2nExzbatJSzqeHhAFzQuvIpTZJ8q5Q8SNRtgVwLMuQYgMc96f_cC14XKUGRk7XFOhC6X2SEOTUNooP7jIFZp-8qM4ayfCShQPyv5SrDgaud-KLhZp_QNw6knmtkFYZ-9EqohcHs-W4yyB11Kxj39k9GlzMUfNeVtMfGWAH4-bo4l8LFOglHOi8DltZ24WSKuHSuVE6CwY3cyQSJ4p5LMccu_lLD6VLWFXnv1uS_bZ5ZgWnYJwiMf41VmM-pSdxfVvszscB_mEA5isy38EoPa87gkOFvmXJClIia5S2zaSRfJ5JAp8xN9ADVMWWT3J12whN37eXIn-F3XyJmYh1Hua9ve4yA9IBNwoXxygl7Ju08XfsUrB6LQmjmZgd8pel6zdp2GcHmZFboEd3A_l8ImlGIBikX3_naqKPSJ9kLQS6s7yVuGsxPQeByimRDPp7Bg9R1RWvGhc52JiKNuWHMnbDM_atD1-_mFy0h2GBnjxuUiOLe-XFSF8olZAp5qJxbpkHbfLZjOkd6KwbMCm0Did3nU7wZ6-GQQQcsytL3soOLu20IkIBKtYGwyNedP5gx72UtQsl42Axq4b_vDiMhPv7i2z-YfaLppKE9dvo-R1ROIlOEhdYoIw3_S4JLQrIdxpYTZL1BGFndFImdmx96dxE7VtbOeAwud7_c7-TIs5NCot-C4uMs_jQfuGR5I9SLLO1ANmFL6HZhQD3QZ4SRmdZ4nQndh6D7Z6bK8P12-f4HeWlpVhpC29d4V5goFvdZcLsk_3RtZrMgitTSn69UqOUwikOUQsdFECieBZxda4LJ9C37bjFSmiJStEvjBdWIBEqfLo3VlasbzVKrPzYyo0WaqKG1uhqsVTxt2f7AKM25EAjWv_UbUilt2QZCW96ysGrqMyZgiEQZKQSgtiilF16LMDGbxXrM1JPkwSZe17USHRag2oFdO0BtXF-b_zVKUrFuWgaStxiHIbZWh0xNEA5oXq47TCmrtlX7sFBYhcptJbyQMCfCjeZuKCc7kCRc5zhspsICY2e9FGlk0sCFF3SQJgm_7nC2knIdR-3i6NRRca9DszjA-Dwjum2Mqgx_4mAH16BH3TWrntoDutvtKyHBbE9nCh4qmi7gB58u7AaY6KZYPcit7dvv8XNQKc8dPM5z0P0DK2RVLqYXp6iyT0NT6FBigw7pbooCKhRLFVDMKORGZ9pE-wCL9YbB0AnXyM4LxfgM18czS6-ef9xhvxc6aDOJ7EfeEEaxH47vzuWJGb8BdeKFKyfPDk_BF9HmqYzSvVVlbz-sncA6EbNDAPWkgb04gnVQJcXonfsXkZ8HcWyxP4rux8Kmb9sSyhJbCcMHK92yNzEldHv0hb6Msm4U5HnNLcDIKHXSYFPexbTqpWfNExwdllQEDStYaL2CAzqYDuNvs7YcFfz4JmRzvtwsPBSCv7qqsIpJHpaGyecSNzDUvaCAfPGz0YB8kASx5672PsyMY8DWQCwD1Yz82Jkc74bBgr-yBG1SelKeDacSxtSiMkNgs8tU6i0CQRk8SZF6uxbF8zjWGV0kcmecRw9L1C9vwMJWFez_9TUVHdJvUZXPIQ9bY8gfLGrejA3ncrZ8CfkwwlIp0ibPgVTm26yixE7zVUpHRcH8SwTOIMlx31KxXeVOW6C4WJxY68UH6FUPVGAdglvPRaANWGKXhUh_EPhOKS7xmqyXFZg7mVcB6-gvHmAn8Zs0yrL6K9aGfqRhC8yXpH7EFpepp8rtMYZsNqxllozcoqdTSYeKtNQ9Eae--fNprG6TEh9KfzCSpvWFa7M_OeMuyHgp445td9tVTi_Fk0YthJC-eKrPNfvQFMuZTKUiNeeVQmXKDfRiE-ybVdAC6tAFJOY9ECOuczA-kV_zrpq7lSzrmsAeEvPiAp-qyDZtpWGBBj3AJ4x--jPm7ziFLOG8mR7jlmqSonMwDTNEKJLX6vlQgko6SU1mXLSh-0f1XPljId-thKhJlSkbwDLOT-hF-B28bkBvJevIzk_eNy-HjyJek3_e_IeVynDUgahZE3mKsR_YeuKhs0Tq27Qs0T-oCe80W0U3H8KmPED8bMNHRU_UAYwv6wpl8XXjngU6wRKkhBZZazuiS2MeFQqksnAqymFmJ1FOH7QQKV8PZ9rLi4079gEkhVNnkpOx11-h5XvKYbTk_fX7FgUZTgp8DHQSpgmrAzx0H_KAowucTBOwax-kmLzoBG7nj5Jau9QkkQ3ZrQiG1DLbggNve43Ca_OefL1EYNvvU3nU-F9VdMRiRD6N_njSlIVsB3jOVpLEd--6_25-3lGyVx3JKdb0kcLbS94J5p0LGyAO9xbHDN7qN2WVUXMjwpRaKSWuK4CUZQHJ_T6zbE0f0tfXImkt2sESc9CmRk9iriA9vxbTft_RwYySBoX1lKhal_lz5jdTmx14XDOLzqQBn_2pMIn57jE6yXWvP9RVgQpbxmzjEsLpDOMgG0SZeYg_LIlWxRd71VkYVbyhOcR4HEDbFxOwOB8m27N5cYGBdtHhR3DAq7iIPwbHBhTfYTn4Ute5ybQuu-LkmsF-c-reE_4qwKpn5eSY2nlVz9Ak8yMK4jlw3SJvlGqqigVqL_1xz4oFPfg7ifR6-jFz_bhGSt4W6ps6v775Ju-Vus3_IVsvH55T18fE8FV3W0yrPoOEjx5wtpVSaQFCoeeZUV23m26J_k_hkNWcBLApZcvczj8mK--ayiTacz4sGkYqBK3axPg6qzMouEUf4RWsDGsp-_jo-J0n9NTHQlP76wKWiu6X0jkhRUjesQpXVTC0KEQSRhSHXN1iFFpTuRmX12zbs1goAEZtjI4tSblS_fnmgn2ksBs7SL6ezyIwSHJkrUHPPdbPQrvS8lSFiwqT2lgPuunScaWsm_XvgdSGBuiQFMg8AOdNUQUvYtFybXAgrF5uytd6qPUEwhrzO-rxhqn2qnx3OgSV7jXjFTVia4On5BEkYOaEg8Y1k4CQ9IRjgqG_OIrllHg9gipltx80WJwteQgfG6nK-5h8bfMPz0YitPrMV3OMs-CKYZ2hkbf9pv--VrPbZuJiLGSexBgfZF1hRR9YXyXzG2S-8izYAAAHt2Jv3fOFmdqvfEKcMHNPbAeSouxsv2_j0hecDQokC4ssBsPNlqC1K9tsZvSCX1DajePnjFCky1ILx2s-gkFleQhEQmQl1eJ5pC32DOrX-SD3QuXMX6JHZ8N0g330XH7QngJVpy5-i_tsJt1QEHNaCt5AKfhmZpK8PIimNFr-1iIJ-Su0i4fzkayr-oqNT3Mp5C2ULq1yK5lyc2aEbJUu5uHYJ3LX93lnne5rLEQ4YjgZucEGWK5s4vSvx4EJrTpelJt1w0SuqUzeXm1-k1tpiL3LtKWQ_YY429MGS7x6ChNNOM8HV508Y4ZXLPuLg6B9nWyd5D0VY-8YRtVXhpUV3HUbgvapFbiTcKgXwrqigxeA-0YvHdA4z9yaznQmW-TmzY4ihJEpSXGWt90dPzU0gNkV_fq4oGUc6O-iZ3p2jel96lvNpR1Jxc-wRLTMiNixaZTLsuNTvnvCGR7kAQ8eP0AOEU3bASMOIWpUV-QfS4TWKs3RhHBCfSG-u_bAHWtDxl2vbkhJMAcL3huAYnMB54O0_UYKpOT5NG3oyYgSdM8D_TVZorAJyqp6PTap4clwb7zXHQDW8ISOAfhYOaJ2uR0gm5etaDOg8PygOpX8i3hHZAVTs2t_4jCUIv9ra04VJ0OHIunNGHNkFiSmTBrNXirY8b-rXUXNsGLpf9hhpodDteVRG3-Ry1TqEb5xGuZ2sEa4kp1OV1iLohxlsD4YWyFj74R-OqotrhoBD5IMAB91jTw0A9AZFk-niYtB10hQ6GtpLFbEQ1VIJ2GyEHJ8YnGSp7Rj0_aZ3AEj611q8ykX7LG6JM3kE2b1r0CaF01_rUBOssbOHFvCqyBf6mqww4622EmEZBEByhg_ItO0h1zBcyhAHwRNPB4BQwwBggnNH5INyO16KGrR53KK-nNNL9sTgCzNXICDHiDpdcT0QnbLFTBWjAJNKRfo8NsXWXhfs5hXvjhq5sfiefHrdbORoMr-3yfODqgLGe-ODbujzER6A0OdHJBvoiC3_JZSeB837cgKnyqVZGSKhNEuKt8-BmPqOKiox1PkVMmE9GuaSCO1h6jYMu0zMJcTPTTlo9npG7aM82wxDpuqFzyKFVLqDoEQxb1S9OgVT76Vgx2dv11btr6Zf8WNiPKLgOvgj0Q66xADQeWXdfJk-hAwJu9Uw8Ak_9tscqi-YqRwi5knc2OAcYrQBRLyfxuvabzoRZQkYOE0d_8dmA0UQqKd3vHAk5UsDBHjrxVgCQ2X4bBcLU-ofiRz2xDe5uI4S6SnR7U9QpNgaPwCKcVxlTBLQ77VzSCeN6smm4E1bAfFJkH7obDxASOrTU4F6-4TC2ZqN3a2uNna-kgC3bYIBjLWXdWP9jNDyFMZfqGLqDFkCEQCyqgBv_Ar1jakyAyIbEtDckEiC3Nu4l6AWbAd1T5w6Uq-d0yK49NEJnANZVN_64sE43FLSkafHhxzatYLLpY84UDcycf8y7UvW0t_FygsJBE6CJfaw4tRpbwqIHjKE7XFHgSoRbLuTIoDz0_rvsUOBGhjd-E25iOIBQlW3xJM37_00YBVI9TA55fF28JWkQdAIwmybMl0G6WGM7ucLuXblEy7J4L6yyghQVQeE1Z5lDZ_E3xSB30cpwZBQ8VCyp-quoJdueHEIdIW3AHUe8etyYIOoJe0V7fxzkhl4hFndo7JJfXes95EH34yv3895jIJoJaYeRWn7DiEAZOtVW74_XVIZxLIfcPSJjlKK5St_msoyWeun-unXZ6rMO-q0eibYhkZkHuDZzvqjycN1yt3B3rB2R834ZZd6_Ww-roIvIPz5QmD3pn9XqYRPTzCXIIgz52twNwkLhzlb9qM-rpalX0oT4cVlkSTvjdqej7WcQx3P-FI5eSm1QtmkEZ5NyYzHSgOWbDd9A-bJrh_aFyRWc_BrxcYF3xU_E4Uimy4pvDus05KoH417q9BP0h_KhDDaagPXdAlYcGevbYFFsb8VIqNAlLeMeqRx_HflFHuByECL7OTNNpx1pm0h4Gh3XLuGs76hH1o2eUb1xEi7FS7fIABnzdSoquIc5x0f9bq-Zrjwc-K9XsQ73AgHGZEGTpea99YKQdCm_OXuonEbcv35ivehmp73U9_5k6XkdTEsA4seZxILWNfHZxiqVu53uhR30hyPylpe8W2SSk0w94TRHCBiMxM_5PeF8z_DaQW4lj6-Rp03KyZXxYwlyuh59zjzCj2-x5NaFzQziVpBcPoLxpKh8mnwR1Uzr9XQ4cr4e9EEbxpj0oWikauUMufWN2s7KZwi2f7KD8LPSGsxqOssp0KILRf9meuu8QvdFcNPJhTWxzg57zWRx-bJEczlxmh5r_UqFJ9UqyBK9RrOX0qokv71XpXV0Rgwvu0coLzEc6Ox4j00U2LCjhSdl4iXROMhr92QPRqvuJrqqwCD84gBVwzLWcqiDB9UyixPK-aqeb3zsvZfBSdZw0UDCPoETHQocCTT62gBreBQ0s-yU90xvBdHNZhMNKQNbXN4QQhfGxvkkjimQ_ptzL-OMLenusv_mU_0gAcoE9bs3IRvTJfnoMb7SUSsZEK376JMSeXhewv3dCYuhfzD_2ZzAXrZCfIqeqE46t7NRhmnmdAKe-C45hWQbsnEaTubtV2J1DO-w8zkoAtYIanDQwSEu6DAht2dmyxK69bQDoh3CXrAN8_nbws6vowyJU9OGSUjbFd-rBnF66g_mb-2p3UC7IMAddisZmPg0O3BBUEfPKH2Rx21TszQgdaYJuEeLe_FKeb1rUcTCyaiMRymOaruaqqmVKHTGbhMtQUun1jRSruIU7pWzPrcpSqEs_m38lTfhCRJQ8oYpisP4umm5K2dGUO1sbo-oQToLV1Upd0UXFxnGtBAlf50GTnU9p4f2Y_kwB2qJjl8STCn2cYGCnyDAyj-fWOQHrJeHfGhh9swcGPLL2n96wJ5Mzb1US65Y5nUz4i7RAsQ0_P_A8KPmaQc99TQKC3p3SoRokpQlpzTB44mBcOZbZPUSbvb0SeG4_kI05RJpcbkkGNXWk0PT-0z7wIqfAzMJbVmGtBKib6RjWUP7UEEFvU66RRzJYARnE09_hgO__1MQAKy0RDqpM_P80ItYfvnDtUfV8A1tKKyRS8PrU8UGNyc9ZImgIoUyEFeHavtBOZNzYziJ7P3dOwUVanbxY1_5fEWULw9UfUtG8ii66EorR_AFHfFvEt1AaUe8gY1t-JlGzDjzct-2XyX0IY9DJTD7M7QKKUZc94sgAIEy98gX9tHdcHofBf3nSOrl2i8I9r4rR6bHigbVFZnPCSX2CPE4bzxCh6qvXr3Aa11A-cv9VlcQ4vK0zcaCxUIrpue0U80QP6reqCPf0dwtHnSoEC9vXQ9GVFTSEigJ0uu6YPp4ckv7_EXA195CUkX3j2q8dkHwCpP-8YPtShzSSVeNzY5YHrRbsQ-KPLkaRNYElsC7XZtDd3uYAYPHGo7e074aKyFAtaLE7mUc46eHqCfqOMaNJKK_4WM1xZWc53Ld6TSzqPqq_UsQl4RbnSLYO4AX13rQZcojA4m2TRrxtdYNtpJshH19Laxy8V9pCiYmoRB1kdwAKS_GKX4HhE96XTvxyoQSV4rDIhpw_dSVs9MlV2KeKoZrR739KXgqsN41EJ5Am1pD1UB9I0XbdmsX217LaevDFGr97S6svCgin6Om9vZWth1IFMaGvLUXbOInAzHIKH_aZ8vroVUySIVZp-ggC8LEwv3ADqww47S3VSb5S2XGn2uvViWF-vxqWZP677blVY1RZuwLa_4-JXWPgPBkWM0FUD0ZDEZIYf2qOzq0WbSKEIaGe1oVqxLmsg-rjxM5kFzzOyC77eetsi-tvZG07jjcq2XcgMyWxsK_VTpZl02SxtCKM_rHXmctgR1NoV79DN1U_tYC8FG330l2cW-znUlNui0pNf00B-1Kpq6S7VLPdAds9c0sahMvp36Go-fpT-vsrsfFY_rusSGttJ3gbCFFYKANJ9H8sSmq0Gu50TeT-o2-WXtDT4XN_ITuAcfAbJuWmhAu-BZ3Fb3U4l88vsk30qhGu5jhsy8rtt9H-V71aPAKY4jnHRJW94tauHvm6AYtdeijFNKvUWqqj310FtV21AjKw1S5Zls5yHaLRXFY69Mz9Wt61GZkEMqvkJZbi8gR0L1LhrQsuf9zHQs_SzrTlkO9I8AR-ktcaIX9rIdVCUSTxnVcAyGXKpNmFHS3kYEv1UayrcXzTdzrPbzpFbCFQateaNpjXqzCWTUm5vg1UrUkm6GVw3SANoAIcyY1N0IJYOqTyfYtqlGnrJdev_MI4K9r5z08JiUPscVcB0-oBPUcYGAhz7iqgrFQSDT04yuNKHt8wOMQ-oRKa-3xU_Dst2IbITGNUmrIGvoeBHZt65PEWMPYt2ZkuEMYtzPskBh8dC6ZiT_T1_B4VCWbriGCYGR46wx3ImYu5ev0Y3i5Gfv54SpsQCsafK8rZvqKeokmkOBrqnM_0adqtbWd3sY2I1Lq_SNbLujGJrepqbS9xI5tnVbUA8Ea1P_BdlTevV2TXGSjpIQQd_dp7VcU3tLEPWikYeGsDmc84t9w2-eZiZCu83XvGf1n7_kOGPV71Or6ZDlKAHmbmwqtebswUN5I_liwN-eHKkSxdfgb-j3iskSFEOKCK2FAut-9_BdxXjRoEZmekBEDw1S7ajM29mT7VWht6_rlT-o8wQGeAA11W9AeQn3KoN2ut4T1sOJyoZy9q28sDKZMXnfzohh6N2hJHzMpFDR-lMVFH2zq0Sw9KNXBfik81DN10QP4io-RGa0WgCoNDtWTOxiXboOEFkijucRMDqfhUbKp6rqNNqfB5dKMaOY9PR1fpyEiC-Uwmk8W-wVBeKVXjXtZESW0ESISxW_N3wF6slZuZzi13LyoWrNFvdSRWmMLvlMr-HQlx40uNVYP0dVm3j3jhoAOPc8LrYCKD09wQQ5tL_rEBNcsqSWAiSpl01K8pZ9VdY2pt8VOQ_jUBCfysvqSp0BcmIjsDNrfZkixs9ntm5FXeXAOlh8PFHb2W3EXLJ2VhA7rbnyF_YHCAt5GAmSenkIrN2vZgo1_ZzCWO86R12wcTTNz2F58TwnutMfQYolrrtCh12ESX8vh1CaWt_5PLdfPVVULZiMPFuUTtF6q_WtoHLk9c0QxYEEwxPAcVjLycPxJiuT16MjuaYFXIR__uS00UHBjIz6DWYUGwhx7m5yjezeQbX0gNKXtvZ60v9aMqHGQOZm4rPERi0ILsEHvwsd1TozSeTeXarqLEXY9Nrm-CYLfARo5L1f49KGjyp1HHiaMnq53ygSrMgKRYQNIpGtkNMmfOnVMNAD1RSbeNRpzl8jLr8CBTnqiP5-eg4AlnzlUv_aqyxvscanSulW3rYaN-RhGdxhqxOkie8DXpDE5RG1j1QJpJKXzroh2Jx6VMCm7QJAd6DTtu2QLi-ZICKULl6e1lVaht6LyyKubvTj7sni-Io_mtB9MnYvvGFmhlMQTqu9TpJesqiBZX7B03YdtCf_cTRXLKcDw45QcilJr81CPfCyy-RFnDQV-lRuPE1JSXAyD1NRP_1MPT9j5FLEQkZnU1UAcSPq4FAQV5egMrKg0q_N5JWQt0I2Ov9Z_xIT2wlAgLNf6WNNXeNUUBA7og3lzMqwMfy10f9mia_gugMgJOJlTWfkpYLaXjsqaDpKV2ukvs5swH5UF1XWg1mToFvkZ31KHJ2AwhbI5WhmBYdMPLN0DN3P7KLKfxRg9cHMmSYnT_lZjTxS16dsqlyrTJyGB3Q1Uwp9ANSL-qgBoFefqKczsqgJMNYnmMnZtxnUBFPXPkA9XvyFTWhSO_Q7shZLVTH5jGqDVaBJS0h1Ndv2ZaJPFwinXmJP4wucGdf8AQe_TF_itupYxMewBp3Xu1VcUf1uMSQygobUtgNL0WHtMk7_I42RST5rxbleTLCZSBGdyj1XuperJkEyyw0DKGtwezfdYf_ID9zgrkfVVxkYexuDtH8eN9qXjhY3rnohREt41X1KrgHAK7LrVC3KhPKCjut-M3XUorUg5ub0YYI6QoI4SfuywL_jRjwyJtXYad7bJFmpxEv7XogPQtaWGspNxUfV5PKoEDFH8hjbwHaQNu4TiZbrRRLyR0QKgv5pPiBbHahtwzaaKeQBakBxaeMQ6c8lxaE1zEbldW8JJd8VE26CaMuz0agNm3xxfreNcyDYhdpkKsZQ9sFTt-HXm0YJSYu2Z6qQWj3QsLXfKPH0lXxz_Gl11fIRim7O2DZ3jm_Fi69_nL30ld29g4eAvZRUTKxjikFquLAQNLLdGko7dV38gd6nIAC0MBDg9aWUhYyj4Yx4fRunpz9yVNFT9DBIbJt-gCZiO_xNtcb9ClCU4hX0xx374_2b2Kpf15YLHjY1G_dOkKnsduRar3PyuqKBfrzQS91ItKS1Ddv4Hb4yQxosvk87s5qGKTZ12nryMG1uVByLbVHxZJGJSs3rzWRKxYn6UGwc9oVlM9yciBfTa8yfK_IVlK7J4dzNwAmD9jyAFPBakO8bPYM-WK-0bN62Z5jdJVKaSBW6wLRGrnjOZ4X3lFY68japhh24oGNNnwis0jBIABKqTkeHymdeH0qhxNChJPc0faoFnTZdjWHjT1D3X6vL9KhclvMUm0F10iWucK0PFR3PY1EGGnP5cwNRNuJJe1PaEwCxo2xNnaSlkrEZgjbWG9Cwt1eYplYpeQKTUY-ubCMtP_g0ltlV3x76Ka5uGoMjpVhOo5PI102aBm5hjxQDV1vBxi_pYKqRlpC4rh1tyymeyvrem7ovFItUs9GhT5KTxCFQcV4hEiHaGKdUDFAvrKEFHVtJIhQ_UXa03qYka42a-q_WvRj04He8GDaBpeFLp083tLDlZxsVUEPggHGQniwHXeq-241i31KvKWc9lY3ctL5q_N6or3AUTVeRA4cK1ap2WdVmFZ0M0mh0mihBffptbl1Bqe895ZRvxLceE2VXw77rjaUMkBegv8sdiCnZI4yWV-is8b14qcRR96fHtdSjBo5MtAaa37WKeDbVqNiQPYX30Kpc9bhtimeGHFRv1QokgiLmw5BbRoNXjpt541C-pHgcUvOdO0JjxNVBx0DcFOwNCdLbpNCF5_LLHlvtzG5S8c6DWFg7xxRSMqhn0l1BPu0eaQ4mnCE0bH5Izq4xSjx9tjR8tTU3gENsuSvMrVo_Q9W0eKA3eeUaqXlvVgsYu9s3QG7OTGwKLwxJTdzX5_pnxKstX0qBVXty-bvIoDFPAmBp7jIO6321Fqcp54rFInqoeLVG5jwCtkmFAjXnJvSKPZGoD2K5KqJtPoL9vHaOxVF7Ji8nKru4PVViunGZDdtwWWKAx3XyI4mzr6t_4f0_DtryLOa_nqWMt7kBFS0IImvZgN17Q2gkpnKFUKHceSIhZIsUSMCxU7VTmf_72slLAbvXqPVLjEGdbdqrDjRSV6hU51a0UGnvFrR4TrdgKngZz1Zv16ZaKiEVbE4rscT69rHwoQKHYjIEgIeUgLoEBio3E148NZLpPEB1Kn9NZf93llV5golgobuFFTeQT2Zf9UUCe_5M324xU-_GErp5YqoUvFSzrar62oVHQDk9QQWEMNcS8SvNgQlRThc5YgoIPf1yqE0GG0HdNDdnYCulHRwd1Tavf4alOe3oqTWY91tnEoeshbX1BRJoHGkkCEDKyHt86s_PdKeKgAU-fQFVgZd27cONErgkYyGXYM3ZHxUVixyZFCYUAofba4egtno4ZeVew1ga5fs-E2wqmrLMiUC-m_0c6fv-HvUJdH7Zbof562e1EF327aRsmjKEG3UOHkXuGKaSqvmZfFDfLpBwKjUdP-IrlCYjTlQdMoHnxlTsx8FNSEQsXqNf0jvEftEUnyzAkd91ahjg1fxtgsPDd2EO-R65OT5cxBVjQVKLLG7koqzpPAGxV3dqbNTmICf3wg2X7O0jFkBQ2N8gc9YkRFupK_OF1InuSAE57I9dVxOkivV7kk6HYDg8e0ip6Brah10lOWZEp59KCRn-3aYBRy6f9vhtoLiu2Aw9xHvLlOajvHRfy2zJdVcFKqh6eA0ZKIAOZXchXZDhet8g2XeZysiu1o5QNNSpV1zeHebQ1RBCdzEF7E292j5TMgnlVu4mgZKYuPRvCiORn1cybpbhPc1FSzKqqpjUK-qZRYml-IhjbFOpaWEjWyaoRixnoMl3NeWuDY2iP_G4zOFOvLomCbWNSD6Vvrw6RcMltnC8UQ4m2lFT0tPSx6VaeqSqnpNVpve6fgiyxnrxFEj0hGiptyeKA1gU9fV1QqiN4HZa2BNZVNeSZqjTno0Jha7lQwQFJm16SiCYGupQ325uQL9OC5Kp4J2pcw45J7v2n8S4LMXGg5Cx12KYt1PH0U6UqUrMO9_YDtNr-3bLPHF1asA4aV2fiPdKY3w1HtSnEDij-D7tEoreShqqhG0VqxrWOyfNTrKyA9yYTq2YVsbf1KkqP-TkW6LTovBMUxpJSvbRcfJ7__GUc1Ymjmaxo1g2Nw1qopdts29o2P7dZXg6MZRBxqnEK4o-iTp0PdDOxxLrQFBtvKay6Dv6mIwWSmZ-V_MzJZIbv9RNs-7ias44L6Wnvd3AhO2vICbtRLS20o5aPKw-4nAfcq0LK9vk8XROTwMt1yMpibe571dTysMwrV5VadA4S5Y8728YYFzzQ9RCcRUSma5wopRzV6MRv25sCxOmTaPwy7ePIrDe-9vdRpqHd5dbkSIt-_24Bs10RHZ0ryDO3bUw092UGmVWnpU3lAbXzHdIRlVmCsRIRpKpgZbUXlrhOf0Jyo7YfFw4Kw2C4CD1uDY3sLSThaOE9AcEn-sjVmr5LSdIQDFi9SLR4qt-4SLiYDWbmPJylBbLqtncm1Q9Uko65T8o3_xRcOvmtvhBtreVaoxvqAjlxotMb2xvnzr12sAmy1cl0vS1uxUuZVPHfRNrOclJg_mrr5v1o-1q1J6c9YOlon3SpUqeAc3xhg2lHGolOjSibVoAMe3Gxgkw1M254aR7Q9W4Ldz-gdvvczJ4IOrD37Oy64dfgds0okcpd92k7LoY9cBVjTwtZp-p6kekcRn0QMITFeN12UjUjpq5FXsJn9-fPw1QqlMCRTrdx48METdqaktoNW8kaTUtJ5E6hMPDEI14c8b8tD5QwYpHsi4PxXavNkd2je4OoSaHVmg6obUtdeVsfpamS8eOEPQGRcPVTs0sbnX36tP8i5Z6Jt2JwJu3cw79CmEmfPQeTO4lYQSAH_St1GaaoYm3lBSYBvji3d7OXkeTHu_2QtSxOe5mQp2Y12FuCPJ5w7-ooWCzhmpw7eNJ5EM6_MXCHyMh4PwhTopH1E5q0wkFK4wLZ7nNCKQ16eqWFz9YlLqLF1OYSJVLxUGsI4ZACmFhAlttXC656N2_SaklgI9FpHk84qkeD6LNl6-y4n0sICZxIXDifZrw0Eys6FO23Fm7KB1peseMdsuHKTO1M8qeduSKh8ypL8CxlJdVl0RE87Hz9f_GPTXnD0VBMmJCf-Ce40kE2fHaEF2wdzn7mwD0n2CgMtr6PHrFL56P75e4zVsmXRDeuO3fD4HBT-_zkVypzpZLi76o1mkWJvH2edrCC-kuoPWsx5QeqUluNUjUZgMKi9pP6amQANBjYX5J3qdXjj9RX3gsckicVCSGetbIYn9tKINcYyCt3KtPrabtnUIbu15dFYPwz9ZQfQRTmYIuTcSAi8pcAZ_94w-XBmlGrhIY2wen0ezzyYdLqY9sWUu2l-UJPvZwVHLT7H8h8-zH1lAP4uFfwIyt1RVbpNNObtNMzOdIDbT1TXyrbuSlM3cfj-SokpX3qRQ44beZQFnm3r3Sg4a9ShRM_fTi-t4Y39EHhXi_FX_dck9P9-sF2xMfrl5H1fzIl0nLnSxYcbjhPSGh9Pu0yySyArgjXtPqdslqbQ_9FywxtqKn-QSpY1n940KZ_KyngBwM6jH8glXGBeFv0AvV5xZB-pqDcewiaGsW09oD2_o4jkTM--yPvNt-no9LuFqfulXvQC7qq847aCrMr7znpgwFJZ_Qnm8vO1VpOPtEVyEBclj2kDYchlBKrisGNqLMx1o4meQuzkXrjevOizxbC2zRArBOpUzIfMeayHaRfevzSN2g7ZN3h6rC87v7nHhoqauwHERdKuYY9YzCFy3jkaamQVBwQsF1mMb9DTi1SjWj5eKB4JyfqH3nCCiuoV0MYB1IOitvo5voxNp2z9BWejryvWdF-6TwSxSjUk5dVUjz2O3jK3VbC1_srz_f90pOreOtIaYRfkTo-KNtaqEI0sgldQA9ZmpuRpedFH_NytLmx2PeVCaz3KfSkP3Z-_kVpODUqOqmWehudkwvOvRMH3RVk_L3cMUkcH6AnzwfVyDu8SkBZImy-rW2b8wD_IdXRavadmhTD1Of5bF7iY71Y5h07lo3Z5O64vZSU2_GDZ_xixCENruhF8nwi0f_Ar4qXRDdb9PjKg4P8muH_Z-kuze1eqPJGkVddVexdk0WV9tQP9JG7vhSdTcqts8W5egid_ORR0oRHBrwaVNyJdUK2rVbkZ5d116nrQ5x4vxkHy_bBOT7N6WlA5wEL6y7ahG_PD8SaaVqUIv1OIhL6NGtORr9rpctIvAqj2MQpeIqr9cEXCLlejWXMnJ4b0mJpn5qrDEoKF3Sbs_HjOyUYRwuXc_eFj1AfZVN4LDI5THg7_RlEc3OqqrLrWXSoouAxwDw1yj2WhL1XtWzVLxcGe_Th5evu2-1lk-tK2U-gxG5iclTIN_I9NWF43W6xTMdsARGE1z5Zg72uOJDHcp7a1vhSK8ZTirHlDAA1WqFMVDY17ISr4s7GtQTj1oJaP1g7t649l9qEhvpVh3r4ccpjXAWms_5IzTs86rN39g2IUTjWAA_HnP_TYNmK_WkNDRn1h9KbhuwTO_tlD5BGM00YCTE6lQJupQ5axIXMeqp97OPSDkqZI3wPFDVY4RkXqfD4vlYxk97vOoW31Tz4AQTCrPMQtQ6qZ40FNyHSrtxXs6MCXG3yhj4E5IqkhSqFOfTR2VPv6xU96meIRQ2OE-c_Ry5_q3JQZ_2Um7qudgVbKi876rTu44nSFpJOYpYJVcZQmivUrDaVslhsSKgjU4OYr7q9KYBnTG_jaEKk0UiW98tM--SENP03xTg4VmAISYDMm_uJ2tG7tLhdZmoVDnX555iIglI0DPJ3WLxFz4x-fRwTvBUdqZnR1EIsxkV6zeDe8Qxo_gQ3ghL2q7pyyjJy7MQuNt5e01FU64fAMdm6CIM8D4WmUgGp2IAWz_3Y3Uqt7lMSdfuvtINznce6BGeI87BDZse857wLMCKdkLtNVOvUlLyOZlbY5G9JHTcND8m1u1VlWCMY40EmmlABTU1ukF_6GFX6FgCHioDcuTYVVtmvrEFRdChLA3mGspBt5RhNAtgBzc9564Ao3qgK5gcof1JAhWPMYOTGhEeKgEtPyy9QMcn0-jk8EEWUQ0-QrjULxLnowZ7zoGSXt9IvdP7ybTRc66pAnyQg-F7CJDmpXVCqebalBy4PJWYM7RHON2brkqTry9tSmsj63c2ZyCQbW8FrlxVINPR7U53RJy-TYl4NK6aLToCzslppoKHwR5LMsuP0wg2ZeObiQm4qxFYZSHgvfQiL6HdeRnG3uvzswFVrbzsuMgPDzzvmw0pLmCXAVlfyzILv_hr3xglCk_cLyolGP6Nep9tol5zLC2MjDd6Ha2-bHtQUQzVUGNb4Cn86bv377gCB4mWQl0LT_T8Emmw9gIowlfXrGM84OdsGKsZm-NdlFQdSasemLCOGuPZc17nIurkMv5HGotz6-gA40RUvNRJ176K2RoUiz_HNYfuob-8UWf3_TQsHKnLKIbnWG8w6unz91FTPNtB7NRNygROeh9LQOT_vtm6NqI0bTza3hmCAdExlG8QFg9GNNzsgqSM2nUT5QaLst6fG3yvL_r6RsdWIaYgqJxXrfUt8_GNcigz7kMXUhDrc9cTEBuf616-B1ECtSbtL9gE4x1HJOEg1iLK6LXDk-BMj_pHn8BthAElOWzLIHyHN5cc2hsWTdtg-1Rx17h_Op6d16VDkCm0dBBP1KRfkyB1GL1CuMDCBdDH7STcAltkvOqqoeNRtqA7Z1EWd8cXQib9-3pClI1zaIOSjY8xA3IMRRvYl7brfoAUCQv74skfH9yP4h1SDCjjN7Nm53Eiaz2we-gHFeEztg8Vkb2UdOZJuGYvF5k0h53TvoTaIro1hMM-LW2j4CV9fIosPYrDSmuYLlzKS570xUF2sT9-4dHCWKLRqdnq9A20lyXY7iMmBnvywJR-4btD7c01QzCnSb7BsZ2aCVetZFRT7LZURqKT2TKc8FFJ92G81ujuRdFUENR4jZIex73XSC7Z7v9DlzkFWpZAtf3xERpG_-guaBwr2YAr7vtZk8cpgLjmWmjwIRXcYvdBetpsdOuPDw6r2lpTwfe-DPKiSVOyXNG9hrX7TZWsgG-Zhw9h8Y7jFoagNqYrTypq6tZWjRTl1oLuw83osBXQt4yM_DflvIPebsPbAjSxO2hKWtXrGAviq1mawzzHSQoD2Ge9rJaS9HCzkqebeSr39VopUaD_TUrPUm3AJVDW7vaDbA6PjeApn1O8CkO6g6lV4zWFylmi5ZGWEDY4U_2Jk3IDPd60SIwFQoKqQUsEaGPCberwfZcUEw19OgNxm_Cx22QwllaXB67RxGK6Ta2OxOFwnk6L76vkYrEfihQpBLVx0Yy8oQyJYV5WbOYNB79b7bp9CUPM8qQJE4xx9JW7pNyLeFAE3vmZkXiVLE4B0Zq7oGaFy9JixC5tQsTHWIWNo2LeCPXpwhDAxMnu-EzktqJrY4_Lt7LVtK7HqlUtyO3VGZ8qQHOgqGaEI-2eobDZY3wnSXhE-MUh6LFrO6lo47WdVN9t4_3gLECJTg7tcdo6wf5nWRVQf3frDTCvbb_fi1QfgRwAtfaJIsTcEhAizGEIC80HrTY9lKq1CCRHgvxlh_OQMjwLItxZ1E1tFHYOV33rjeCgspDNbHpCGF0kMvCBgfL7yX4SSDD7K1Ya1xPMbdv5tpX2d0JpanLkTZzfGaCAcbshr_Usq1IUKotaSrWp6IF4N58nXyPHyIRUOvDOh4EbbJPBSK90iuk-z6eAEbh_c5cEvtwVtEbvpcdHzxuaKzUzeXJX42mi-V94fzu-C7LNrVoAdLzBzQtykIwcuI29Z-CRXd1NGPvlkUnzO9_XttO_OWb7dxcKdPQKjJWd9QNUVwuXB_YTSBMs1JBThHQ8t9hZpvY6fGeHjxGn678Zdwc_qESVsMwmi8SzANjTXI1OSYGupn0USvUlIJeb4iiktHtJ2BWnmVCoY-1oUfSw395CGqR2f8IdnY6-Nlzxk4ZP2GLZLFV20pKQpLg93kVqoj_xpgsLZESlnhBXi1cfhuWsF4DHzxypHk1ClOtCPDTqSFKbm7iq6ij1nkM7R719Vmj92Hg1fzRnL5q2MUGgbYTJX0pGvh7vOYHlUUf8dZllLUSS-Qip9bhEgGmGgut1Pa9jzs1YNFhh39EyaUQgtkmd8MdBFvJMHwcfEAmRo3X0CP9_FBErHeNxGWmHARWjl9Jaj6obcakcgaFnxztz4i5gDD-raqb5GeFlv5fe3tbk6PgTaBza4nC4qRF97v7EooqyP8HexrPYvh6jesUIlo2ccBeYZ_dJnPqU4fnYe0QEybEgOXPMV4GADvs3S8tfrtPcXFvse5aMaV-SGTOyPrWGzYRA7uXxA_O6cQQj3s2IaO7ic-r-xKNqgGzicCclEInPdzZIzhw-EKyUE8sPyv36PtHdVEnD2Taqj5IddhaCMk3fgFuynZR8OzMjMj1MPqq44btNJbb8uSGwskiCfPSeb-yxP9GG1uGXndc9Dlip6cLNfHi6mUb97KFeRNST-Y1yk0J8FFmh8NwbxIUCsvZd6x0zUr6p34HHpsShHt3enjhUwee3FIC__b1i04FvgIE_nyZGSQ77jygadq0QHTpCvOZxQHRD8vAch-25vM5OonolcHZd9h23-XHQwwehU8zyR5n3ZHupKdxyGrdb1bPIhO_8ClBnYYh4XC3pkOxCefON_WTpSdjYoYounLjuol5NLz0w1GwTzY3yCbxjK18DuK8H1KvKlNmpPeot7Ti5TPFoBzZXqP661VW0UZzVdZcAsu83SznVikzPAh-fpiWyjq1QAj64ZuBUNxlG4ZA6HM_pkSvdq0Py-sqzd_Sw36m6PH4vQtHjVaNUkwSI7Ddu_mcH5nronhqljOxLtzZm7B-Qo3jomwxgOt8G_kuRjpOxr2e7YLG-_GRo4H9tt9NwjZLPPFt6y_MxKHWDzBmlKrAtd23y9zqaYZrscHwaQXskMH1GaRll4BSRjRbmSHufEO6iypHfUHffkweoOmHGRl8Ju-nRzyifvz27T8oCPFG9PPl63AuTu8W3_EBt0rUqSwrBnj6sytDzJTq_8TGHso1R9Rft6XeWdQRaWevQ43_A5Iw-CEcOzg8I2zkZA5akaZFApAos8DPV7NPGUB38zQMr-DFcZN3WxKFYXbarTCqWpOVuFEaagriQJ9YPPj34EyKn-URR7Mr4Ojbg2sF1FBAPbzl0bxEI51DjYscgIdzjJ9SKKLDBTbgrmOk6Gm_wUQe4XstU5_yA_iQGNxvY6OfPOr_LCERKsm7jjciypc4370DPszUOnmLZJwvKYtwcx9JZ7NUtZYdzqgcI1kVg3p_LoM4tmZla--Oju7zK03iIw_apED_DeZ-Ppdamx5UPfmyEJ9CyxYow2IDXvgh08U9hKBa0d3ZH1fo8CJJsJV8oP9cNuEVILpXVJF9yxsF_gA7buqXqi6uRcwns2i8j1pSfUTlSrOQS6XWoF3AkEObjpWz9uzvcsEaOyntMhMASzDEpZbC9JlSDel3tBQv8-UT1nXILHx6-akfKpRqRiw3e152lr363UzsPiKdayuuaogY-N6V5UkDbDA10iI4bJSyCNSSyF2WQDOtxv1fg2fNAG60flheWWI6Wm5ks6311V9hNvRhW4WdxbI5cLhon6gEME6M1yI8alh6XqKTDmVeBDn-igdcffgNm8fES7je-V8oCTasfEONyKsKllMqQ54xqgss57XWX6XtNLrh0XVKYwVHQslLJU9cb-rsT80ebeNVszqzN4oUKUV_K8cV9nShNvY7G336EpNLXrwNr6MGTS2etRXfVlHCQCyjuqH5iFjSXcI6pSkzQzEZ4JWNk7qsmr_4W4BpvJ6VKkhF1cWi6iDSCQ75p5kwSiA1Cti0V4lSpOmeGImDqVo1FOl1oggR8-sx7C15h5LRH9fFsDEXEbOdc0iqvNDlsxCebOGQI6i4Gqk8dzUG7CvgXnwU1kZWkprHUG-BISai5pEPZg0CS8jGe49KkrQWDRQduRWCuatXOyNYXfLFl1fxlOarag6Hf1PV_T07uMcJXGtDb7EoiLwrL4xXD7KlBzeGgaqHpbmBj6cRTn97gAxBJe2VSFDX94t3o985KoYPId3Q3xWz2l-M-1YLLP-00JfTMAUV7I-AEDjNQrf6xRnlBrNsZBEh_Wm3n7rSKT4qBW_U0OEy31XeVteETvZTsoPeC8Arzwmc6n4wHTKEsy0suy87nqAJonoYu5qgNNUfwKLPve4JB9nhGGtzL8Jy2_q_ykhyn065tJ363ZeQDegm9qS2MpM9ZP920Gc_ppsarSABYfpx3oKu_zHhazNygsmAhr72maGBuu4AKcZshyFTEf52cC78ZxrjxgJtXI1UpE-ZnocnoAqR4RxovlQTSWlE9K5Mm_vRERi8S1nPChcnhktCHC1ch59KLYaoz0k0ds94feyw6GC93MaZ6xE4hTgqfutJS6RrTPUXID3aHDpS47S4I0v26MURHUJXQbH04eaPXrmsNngZzzoHCM3mNHkGxfUIrqDw2AvADr_cjY1pTm1MtoVz0BE6uN9_A4--3UdbUA0JkxAF_j2uW6_KCJvDlap-6dUtZCV7yqpqK2WWNLT6fizltlBAFXD_2dfA52Dy79B6yCgIzCLesxeruFMc31ORFYwMX5gFd9T7JKNZIfjSY8maUkBJ9HCKCQYww-Lr-AY32-ZXPoWGMK1HyND21_DQhE1hBVwlDR0SoTrAkC-sumRWgJ1UZ8C7nJRYtXGOcUUFcyx1Q9ngNu68_dmpfHW0ICGNdXvVPEPGCfDaM9EJBom6-dg20pADonp8onHiAu28vJb8yYILL5oDdoBkoEhDl4yqBgIkTwKT8ygR8zKeB6bl6SFdkXaVK6xWIolfDICYdU4AK11a9yjafjtlqcKmfhGMdZ7VHhBrlhaX0yfE4n2e5Kl8n27jJUqxLvH6e9VBQSM8CaVCDA-CgVFTVXRy-yemirPppDmQA7nCSSle90_195BraWuNE5hy_eas5Ad_ro4VEqA4DCka_o8uP63bw6ftajNB3nJKdmdV0mXB2baRlESGLlQSnC_wmm0lcu3lBcYMvf7wm3nwcys4D3KdvL7BeEQd1fl8Jl7rdiUHDc4A-95kcRbyyll_7ESZOoyBv-M2I8BZ075Xc5VNrvlQhWHc3qYv-yLE9Pb3QTbKqo52e0Nw-AWqRzkl9en9DzfW2J-USIxoyFcf9u4mP_Y1UOs4Q7prz-y3z2CPmMtXWZA13dX6wEUXFBae3duoRtutR4AdqmTVQLGnJDOi8MltrTq_wp5npbP7dqHk8HiawQXHMTvkTw6RYiukaZ12pGSvfoPj1d00n3-01pL4aageX2GThGFRrm6K5q-QQDejSJfTV3RJQbWUN8RbZhcY75P3N_cc5LmA6u4F2nZh-VwgElybxAz2AS0pHlAdo1QhxlepGFwRT7ZJ9KvcWht2j1boAbHiAssLo9voEndSlX3P32gbm8Ej7PapCs87wat0hEEcTQ1AFN6-hCo-zZSgET5ae6hiZ3AsOv_sbNJry_Mm8DcaCArfTJTNIQTlOhlWhy3lMcbSRUUBeDTTH8JzeL12MbZ_uykAyG2Wr_Tb0Q4GNOllAU1YXd1UVrw7Bo0aNJpw93U2xTtUrVAwjbmrIkRfEFunK-vvMPRwmdrxfAMgxqih62UbWeI_uV4ANm0N7R768Ks4R4RyvDycVLocz5-kOeT4PzSGQ5OWsJ-_4EJxXyTko1hQZtCh5wXsLgd0pPOtGTF0134QhIb9E3gW9rW_VG9f1BJ3wZBvIqffC6Ns9j6_HFZeoSHuuEsn5oQrYd2Fjx-_dwyArTAYl1n51EIAdzBCPak5JQNSeqegQi68SQBYb4sCay6V0QZQ-kHEZEjgbaeQdfMcanu58BODmcnnButZjjjdbSATYHEFKe6rcqfypcylPc_d3OPjrcnUgbbdzAFwfJ9jzKS-dP0Fz36UHtoWwpkR5bp9q6pIOH0RO5PNtK70qw3VxzZgS0Rs_eqAV8vreQYEScRqamMkpqAGBym7iqWAzsmfsg3SaZ6mig1_heu_uG5IWOF0gBQGqSK7C-cbSUzorkpKWMf2YjKguv_snjyn74kewb56cZjU1DNUdsqi1qxy1mxcO6kg-JiP6crvSB-0jgtmkOsQIo6RZ0Z0mulViNhQvbPowH6BvZWqlEc7fJlb633TT3P26ivoyYewSrJ_eTsP1p2UyJLL07-Mnud9FuLcZCClgvktsEqWmd5zdZITeog1QbV5WOuUnnrm-N1-Xh1IDl-c1zWCYDK_Seq6BmTUaSvabIvABdtuJwsRaxw1AWfKGAnU9Ho09X896si3xKIJdG-Z5NFUKeVFk2mrGEP445YyoJRXtiSL8ronTKRd-rPHW4JvrJsPqx1JrMXgoVUN9LMdYryUW4msGFoeqYhcd1O8R0aaimVk-6o0TFnS7Cwxwxte7P4kFxEl3sUbktusqNNjMbqkrIVApisk4jvUXy4tnopN0bggQGc3THTrpe4rdoZ8pTmNSUOnpab-lgmnWQhSaXP6dSvkKrshBWzY0VNsqfBIWZqZUjMaNoNCmlkPfTENtwEQTWPMWCjhudiQTqfE7b9gfoyHia62W0onTlgF0kgSyRjRRWKiuNo5W_6gZ6y6V4HTXGB9DJXnh-GG6L2sTeS3p9rok4Adsh1d0h12pwqWywnYBAH9lAesM9v1pPK1LlzCrUtdPMSL04te8kxGJPVGKtgl9oCIRU54ROlCfN8OEOa-TazJM3bwKX-Rrti3Mmv0WjIMkX71kPLLsxSYpb2JS6MADh_QYMglti3U275pbUIutKU7XER0uWox7RR27PVCSDy0b8L5re4UFiTrSEBPNEkEtsL34D8slsnC1DQ-Iuon2tNDu93QHPBioXNsseSnRjk3z9Ls_oAlqvThqw9qjwQmzJiIkEeVcuUeXhF12PD4lA3zc2NWWsyAT3GMr0o06Sp7eyQOLBkFv1CoSUbQUNDX8LT2eNq8FxYlypHHsHNtqVAhYFgEwJMeHX3W0vh7wuG3mc6h0WYmlAsOhAHx8kdZCRmbIA_tS-_QIqnMZxVZriuX6qk55pR7jNGvqcNum8lSYRwBac-DGmk77uXT7tFsCL-2HX0TZNq3juVrbbGFh5GaYW0XI9GaK684ugqP4przUnRIPb_OWAp81_4eVXqtdTc5ov5gk08cLS-MVlyTq0s7ViKITq7CvGJFwhsWv3NiWdR3XxYxwJSC_Tl5N3p2OKi9pZhgI66MUJ-4KTa1vk84vChC7PXnzkYcsX7lfX2WKRFKs1OQAotpcmw5sCnfTKqynhU-nMJGbQ3bh7VUOiGQ4AFJiQCR0RDehcG6aSHdK17bpjT2qNeSN7So0efSOMcO31T94eYaqvJFVmo6xAD9D0TZh03IxP3PYaCr9bsVYFRTDKm1XVxF3PaMQs1ACXUX2lKlM5cJ749JB3Z-qatkpCvL07-SrHJduUxRQPjuKYFHcQue61Mn2mmzpPWjGTXVNhw4o3oi3DDqjh_w7LAbA-J0QDFmAAgnBqJKLrw4gsHbRHD2cImpKF1GYDiCe8my7OS1FFvVlgHRmd1xHp2XhHjlAOV3X7XCYB5W1eQXX8zFTGhxVUTvpneszfOj1fUM4pRpYpaJx4nuzhjV8o8hV8W68VingmIrM8wBxEM2JLHshrrraMtuF1ilAIP8_Lujt8oYQCL2Q84093cKss2gnbAl7WA1oO50aXzMPxSZ9rkn2-JIyXvUn14aALre2g8gYgpZaKzEJAVR9fZeKnddKLgVCt-qLdEICZ9qxQ66rcea0CnyygjB2oaG6pPz9-CUHZ4TQL9iPLhOjG7jBxqguB6-gtYwAcrjlyWsVF-3uOXG8d8vqBenB7ijL0KjjzyktEjzu8KIeya4NzrECI6ChqSqN1Bb8LMeOQH7nKp2iteOoMtVrjW1mQtPIBbhQc-c4tuiJitipKeldptxj0JNS3g3UASAfuEKZO9h5epaTFD2DAR-HbgDqU7WMc0efp2t9gfJ8y4ebYPXaJkzE5euTQjrxp0VeUt1yPkgmVHSjw5xf62JU0HqsJnVafw-vG_m7x-VurmAj8nXAQcMTih09qhMFWZFTorv7qDozn7iy9r2N41mvmRTmv6OenVzg5u3H1UEik4gUzUdHCSXqmvuxso_fBs7vWuDSWmyrTA5f3S74xNhhBB5PVyKCHNMIUZMKxXTNrVFwXfq7k6KI1g8BXfUDzIYgj8IeadC0LBSAhR47whcJHqJdUPvKUteAVF6Rpdhtp3cGZUJ32o7z9E52PouBk9KzmuKmjSeAB8jGprb0VdDSBZisHDNDlwLjqqjIS0Rxr2t7gBCEFR_1PVRaKUmc6qg0udz0qNYavtZ2tJyLDt1675WR4-EozuqfgUbw9Ah--JTCzU5YF23TEiCFyABFZdaUgLMMHa9KQZrLvNOdULpapQuEoge6nN-Q72qGqmPJxmXB0TsK6nDA6fcXzYcmjuYRIEFU5ALfapGvyL4oklQsTwUNd_pA4e_UGg5So95Ei_Z165ZOkahr5oTjfscMogLAMZ8iVd-L0SnPcj0GvLKCQnRVoFWObV2WanjM02hxozQZ7c3nD1D1PeuZFJk-CmR1BJbL1HVKPLp7mL4xMzk6kD0ezytng8_QM_uPqoUoth-VhjcjdNPTnEkzbfZYFV2RdOYFItW3m4aU-ufFfOmn4enhgF8ZRbFsi5CJGPezpDXc_T37el0HUHrByrgk3U80j4HfTJAQh_UDAFPXtqrqk6sGSr0MDcx3Kd9ii4NeRs6GU6ujN4oeXacf53_Q4cd5kR77-Ori9NSxUPlxF5GB4ajwuW-XBq68c1gWDegApF2NMztW0n1a8yAHKiEaAOsuXHtBN6k-e68tom6ydcznK9ONgtAxjk0L6vGsc-hYnhfZMUZWoMt7rL1R6U5Ne1B2TFhDeRpcZLur0WiLAJjq1MnLkC19fD-7glajr9XuzPDI1ndOPY6IFSG7XfwKNq3SkHqZgM9fLacdA_bFnky9uy1NQBoWzTb8AEFBK6z0e4mXGS_NY72CVEG3qVFl9te1eOGflFTJ9UN-iRdFrWFtA1LpOqwXevLo6W8Y7YUCbU_uTpLkzCw5eip70lX02xrAIAd7Zqb7vqkuQ2DgOV4sGl8bP4qIbE5A6ZTn6d-gyYW3Oj3UFSpsccr3oHfTllfpSXxxj-_skaO3vEh3uCkb6tKMNjRoeHQyVzZyeXsowWsVcciG95EktG57giLqr50tnY3ISZ5E6p9vbDisIn5f-_B4BfkXHibmx7Qfesg5dmSorPv4y0s9FXwu1JXI2_rMOCipZP-YYw-1ypN0ojFqUyq8CvRt4z-wUVaInpJkjw8kDaKPL8FIRSSR2jessaM37QhDBLTdC5TH7Eo4A-At1NaQE_AZynGtuyTl-megUVyRn7qEd6RY0ZwjXom5tstVAJOkkJI56KW6mmUFmZ-WwvgLu2dPCSc7q6gVPgykBkvQHdwGQLL6ygOqAyeTtlTTHEKxmM_m3dM61iA9xKYEjP2YMw38tMsUTRb-Dr3SXcdawXA-o6ZxHH2UVwMxZhmEBap6UZ3K9K442-n14HofKDS17FLCKTuPjPaztwSd-Bldr4xuY-rD5ho4425LnxqnPw1qqOO5r6-7HWtsLrFqcr0u488D29hnAJOIHu0ixemWhcn5cMc8S3KFyyRiN0WxRNcz4Y5Gm2RvPq0QzXah22Zae7dKEHk4dN204QHuPbyG6tkKaqpxyjA5k1mzw9yAm4nq0DSHVR-VeVPqOr3nqPRjQgG7KCtmPnKccHdiirf7-eO2g7u0YughNVUL09coONKtBk4aQUeygd_eXtV6W-qjdbrCAJI3cPM4qQopiHtHgwDvc7wmxDxsaw0itr37ZYoh6y4loq2hcvdm9iU5HZtnyvSI0kLg2zIjKgpey04q0mRc5Y7-snOoIjmE2NxPh7vXQBx-1q9QxH2qDK0451SrHs-eKsAe-nSqiOhWvn3_rETEsvdhKlipr1HVInU_aPwyokcQR16uS8CnlWzCKPBA7nyPqmhijBMgrdrOcLdo-2TwdA0OkR_C7SH-qSLqejWmtMDxXVA8-9JwrhiXhcBYbgxG7Ygzjd1ELtHfS6rxaiGxTiVIh1UGhSCHd3dKM9NlCeuphmMwTJoCeA17f76JEEMQZVLduwm3VXfnm6g6SWvOGaOd2nqVbYTZ_o-pM8mS3AZi6IVqwXm4_8WsD4DZ9ipfOVspUWSMCGAOAVd5IQsK7qstiFfVR6Y-RObBU4hsyuv95S1W01ZVYiWyhY91iNbo-_PVejZ9AzYf3fIAZ95yoJkm8y0j-OwVDCuUAL2fWc936ceNmLYxk4xOJnidRoCHvF7MCfTPeRLSA8t2EnRP03AP7fgXiU3gh059p7QQbSiokqzs2CEDpL0J4tCHDRCszRKTqTd22xAb_zIoOqfBWsKaDQmqJCVtiBx6eqdqJPeSN7mCNyDo_DxIyVcWqdv7jBajfXRDB-oFrPdht0Sff-_7pW52nj5VFRx-9gsBiX4TFFewRlMccX5ioKAuiE-ctDqN30ckcK59810PMzTRwE6LeIooND8-oe3IM1BE_UXwfZk2kFODr8zH2R2sQpvvUcOuoM3lQG5kxTATAL1cdpN-5QlgHEip9duxx9sJRl6xdbMhNcER50Zdyc9IecQ5PJIpfXsf4wcMJ6KJfpyVIRzQEuJNNDDdlp_ihfR5OqjV2SCzlWeazNBElZcnk_29qBnd-izZpROlzAtBASNsSdGH2cPYaDA5ecHQQ_aCfZc2o6q2bT8-W0ClqwOEyzR52JEEiUidk7t-YEqYSt8rFXrKx1LjY7bytDZ3osKVqeoOu4z143Bss2XNNSl1_ZFQUbVpZBkh7m46ocrjuzf4iLHeQ6wlXPdIgULLzwD7fZHpiUCe2o735HxRlHqH5EJAp60u2uXtf8kc8Y2pYdThHYtRp4seYJf7b7_Oly3M5h523jiqB2_fwyXpJzigtb0c_Nv2EttkhlPYfa8Xt5o3NCEx9Emg4HT9juF_L25uKu3K_iGWSHuFa3y-TsqIeEbn4quaPN-XgxLWOxMJ6pp9ri7l9JkwF3Qnst5uvS6sTt77d1CO4b7AgaZV7OEuPxaC6xbaOi8rFypV364AK7qXn_7usHWrMLH7gAzlWf6HTCr2_EMuuO3tvyyuxxHTkPUDDIvPc73vRgABGr4A253LtHC3FKO6aFgtZ6ywWAQZAtN-UAakHY9BEzKulHF0HoXB7oiWbEdqIP7v9aNcAET-DQroCqFpEN6axuCSz83O_D4Ww-hQFz_TlWXGod1nRX_4OtEfQgTMZyNaqFGJAi4ZtwJYRiKdp1wmjX3GwOukwCuhMmmPsV3B3uuFUzd9GS1hf8urZZRYbn7RgjWQZEXb-NjjzJ7dURGp89pqZklgaYKO-L7PwI0k0yJdTJUVwevx9hI3teNPDPbXD4q-UC-Wxv3w-VAO4zRCxVXfHFXrZMgXtEHcyjKt6QulV-yupgjOi1iYmVJ8AwM8LZOr06uaYxoBkvasZp-ZkQ5gRL2MvHIGzKAUZ5mqmVRwA2BubYKJvR0BXDMGDj0hCYC-y47IkR2a7_EVmKGRHQWl8TaYTHs2x3rAN6y8Z7G6SPfSGluosxgVM8V26LcSXny9wRGiL26YMCv_TkKn73N7iTvVjGDNFyNPNnYL6n8h_mHWKS3nEVCnjQ_dEY89E_PCEeqntpOSnxg1XVeI76OmrKD1eqidJSBIiTeCdz26NbBor3fKmmphvm1N8vx5svCckjWl6-Dm3QX46lVYtF4V8MLtYb5j-erT8rFJKEg_TjInVQEFMdvFd6aCussJME6VsmPj-nGHYHLIpq2uABj2dGSMiVupDhkOJu1j3-UU4Xn3i91Sv7XbYXs5gvlecUoLU4MVtuHomLvoMcHSuyak8SifaORILPdN5Uss_zp2TAvL6i2Z4uqjMb6fUGQB8XseA1ZbU9LTbygeWMCqwk__GpaWeECgYoQDm8JtzZDu95kC0U4sDhWdu5dLEtMqaXd46V0iQfdzvTMsaIHyc1j9cuQh-3bowWkuqbZRenY-txhjTXUSObMy8mcyNO9gZmx8TmA7D94LVEcZ3vgMo7uHAHHafUdtQ75oewSVVJrFFFrdFlHkF6PC6FHJKagoLGmLwCIUzBjEtMfVA6hzAxFgNXuQo1NsZfltsrzr03-kohZjCaLRPm4L2-a9Dt--vivBPS0-dfZ6fW6Z2DfKfUEV7pgAfrkep0VzrT4DMyUm5XfJMua0ChTuH0Q5xiUGdsF070Ra6y7RfOv2ZGWBKrTfO76oEno5rlWRdKdXlCi6_yMAsl4gI-Dvt5c1NfVWxq_ZQEj2rAnksF0iGNCkCmXoa0_TlBDwUj3wuQO2ZJdOAd2gpl0NV9hcAflnLZPIkF0YgT_meOBFbPvp_rLpXlsJMSgTNXX68im5aD5dFKXQqaHhpjNIfpVNzP-254YQGJBl0xohFs8rZLRvpyUkiZpMpjGeEIcIuWA3EEa0j6LxhrVhT6OqN5CYYc_I7F4OLz94XQxcTKYb7IQiV6tZl7PmSyvF9_Qetedkfs-3tgvIm03sStQSld_JzUEoZtMj2Jsux9_WSOzIXEByPAL68xb0Tk9ec-k3-UCV43o2aTERU2VkvheBoIU5xMp4wf3WtJ9NZAVKmvVqkPCf9ytfvqQcAtaMVDBZxulaCizqxU4cPuvZnUk2i2k76NEN5tIg6n20LiQjJ-u_TdzT4cGvebOcDmN5ABpYVJm46YvTphfpX8AoztF0fulOIeP8fRvi6CXGWBzzSrq9GHAzegAWhRRIKJ-8HHVrL-pIAIbHwrFlhDXZeZsA9XQ1SExdtV_ittk-akx_xOIuyiL6-K0-5SGfLwb-sspfqu-4ECLJec9bLZhltLZ0XXteJtai-NzRldNybrXPY6n06r1bYY_XFCgjGjM-TBx2hiAMnfj8HuiyRN1gx7pDBrAdy051A16o7-72nC97ORQPeh5GcHAfkCUasJNnkXATN6Ju6zZA5rpHtVHuai9UpVDtSwxmowwXpL-yhfUsVWM77iUeyiRKzKtGWm24D_TPMdxDRHbaJ7CIVu9cMsqjTbVpJtjTgx2e7lKirFGe9uVUb9UPKH2-hHgQ5fhdQAqR1zI_CyHOQ83N3zRvYCQ0aOd7QWVHvJS6fn3ojKsZER17gviUNhmMNJwKyC1YMD7O71TbEW5414rCtA2AMz8C2Hh4Uwm-Q5ABQ_s4mrfGeN3rjTurGPNsb8QlF_biNt8pprDtWiyv5HX9qaK8XXJwp0lm0VtYDrVBChfvRYQwFAkwiGQieHU6ritGqLQOlya20p84sAVewqfqi4qmM1xC4aTXlKea7x6FmyxbN0VGmg7DeCICUgY54g0xYw7Kv-VZ3kT09CQwKuBBF4su9n1GVmkjSZRmuaalnQKDyxspQ4qqKiOBm6b01kWYhbbEBc15qYbpmQazDz6ihblKezAohmKRi6ir8AzAEGno-FXeR4MA0ni5r_1tbzCgeiUKrV0LqsJO6Pc2-rveOEflM9_nZowj98ygtRviyCxvXw7xk-4dvsY81pvFmY30xiHLH4agMwK0jg-2hDH8qBsoY3l250U_6E8-gJKUCg0eovpfDD-S1bfd3CLzUWVvCfBmMyHq0Nz99_kkedATekzhc1_LFIlc-eYoMkQfIk3p3LhIpgnKlqIPTcVnp6GYi8-F2ltX-2LT9QqayCUEJgFE-RaHnDiIxMNbhcdgWIYIk7RvmYS8aV_0zFsiM3xs5hZspTVRnEeYqzLT4sWHi4F-kdttXzodtAq72T4Z7Z82XmRW6yuxE5JHHZJtAv1mlhH5VJvK3Ym9XGcj-c4qsqJCMTB5d8UwQFoFmZKDt-8VJ8T6wpLoaor-7JW9vld_349DFDOu9wyiq4a68ea302xIuaneHt3cPAILYmFqX_bKDLF7GhDG6uXqFTyuZjXuKiUZ87nUqLZhqiLpdUrE7eQ-P9v36vbMWaR4QE50w0cDD5YrwSxGmzH_u9545S_YfyBktuV26Cwe0USkdJqMR6YQfwIAohJv_SrsI-0_Ww1Y5rUJaK4UBxVbG3C8skDrvxMtNb13rE4KwHBdXvf9yWG6cTincth-pgBVcr_5Nk0LjM-D5s-GsUDf5LIXMpw-B18etF71BMJvT8NTV772s3SUT-AwsNwVvzZGd0oLmhEmt3yjmctrazkg5ucaILJPMzICjaWUKr60_2yPrh0xCejNHsnT3zwgk1c6d7CFZl6BAt9w2xh6PbNZdGlxebBRoMvrCPEzPHu8nBRR65PfZtJh-e7OOEba0-hrHlRCAvCIuISw97UJAD5lCGNT1bu-i4pe-M6hUV1fd78fpcAGA-0ZNbKxfmvSkmmJaD30chvnkIrbSR5QwP61M9QF0BcIrW2kgCovF_SgUl8i0QK1u19isEih38v5gqrj6irc_9W1j02zwBURdtyOySas8bwOQ4rHE_vkFd2lWnxPc8bEbs-5ZQR2u2B0pDLp9hxadH58uOcexBEMW89pRgt25Oa_I_qKFgyse1NrLNfLRun0_IKk4j3GZLdlwzpONhJ1IErhMdILU4vU56mRdfmYwfZSMhUuJeTm50Ng4jp1OiLl0z9cSyRP1eaxp_L6Xa--zjKlxD1sur4gfNktIHYb9DNAkuF5awpfVmj5boPUNTnqlDqKPCcIpOaj2sXapqovUXpqHN85LJai5xoYSC052-X2d_JXDD3IHZdkt7hbbSWA1NqegdIYLTEACJuSj_1mqx-Ya53fQJTmuhzuNhE4NLmIyyp2gi_Z9vzbp6PHe1Pl797qm_vQO2Oe1rvlSFTZR5NOjyVamog1o7oBsETpHbFVt81iqgWe4SqQP0OPBth_KUFapRdmej1QEd_XTKerLJu6qeKUSy0VSMaRvyZ-FWqTOhyNUG9C8ArV92vaGh8xm3h9XkTd8UU0zmLvjwhIXM3j3NekwNShQhIJRcZ0uauYAHv6xFlnnj3GvIHXmx_1alXz6A3EnhhnEf1VUf9hJZ3p6S5-Jh2dGx4QmewvgyImpY_E_F-D-LkIlAeVuMC2_jVBkJ7Rq-af4q93iNkHwM8JTBieh-nD9O3h-c7HEfY5S7H7r235_UtUdhw0FERRs03XvTk30nLXksPvHWgJbB9SUe4AS4obedAoDgMCvpBjBq0qgXFnGnB3VImMycssww_Vq3XjEG289HKOZEgcRO8mdR3d8EXz0eKyRdPSfxKXguHDepXkH8s2GwsnYQ0mEGY3EAxmsuV5W3Gt9-2HqyXdY5FrGzdzy1nWSAa-KDXFxmN06e90fXemUXiOqnu6ywsEWNLZONtjlsR-NH_T_MsTL8mLxoVkfnqJ0iKc20csHtPZSc17hD7O5AnC-FqnrMMOv0NJyiyCRGMQyAKTkyMyafu-99-6O86MSr_C43f7MMDl601v3T_5OW07fjHLi6iXwQOaD1zk0qa3pYb-ortIf0E7uCx6NaehkgYCA9e0LnoPmhmgZwTGIJ7hMFHtnwaSYMDhhagjVUH0x_N-hqIHfYE5gbB_ValHCoICpnlbNwStJPH7cTFYXP1aj9jIuJhQz96-ZFpSfeTM3p0YQNZ5ZTeMN7sDj3Erz_wQrOVdgV90eEUQvoRHhbNggB66fCSlvfbbd4dQj5-R1ok30oEUx9-eCqr02uDFrN5IAHISojAFbYtxmZJN9DAib8_iQ_yl-wczlyson_NtQqLobI7lbIm8J2wvCY_h5nxo4yr_6fukxphNgrTnFpIDqr7hPXAIwfys8O1NZ6N3zb5fELOUdW5t5zUcmFy5Np0euLtC2MT4zrXbPjD0Z_PxMo0Fh3qwGrhGe6j5oWlXlGwzuNfMBCsRorIT-54a7iPtsoCUYEXtHlRF4en2_N7smXTBNVS3Zan1m4GZmHUE3K12qOeQAGflYouSjeG7aFhnsn9PwdddTh8SnFhJ-rJ9hwGjqkdVsuDsPVr287lBmAgdJ-Hu2rMf7FZVwO5nPNKsAApTp43fltKoPsJaRyrKxwZpul-kyMz8EWbm2FdUqZ0gze_-t7fWhYeFABs5rtbd_BG_p8OHK3KP6l-TGo29KwwhMtZXkEiP6oEn8CwkIX4XUQB9k1KVs34f-5v5RK4-dBfQdR2Tl8DWaokLtXK6slCmxWH3sjWHksy7GMSCGi4M0JSlrfJ95FCwUAOmgqZ1QIANihm5NSb97Ox4-dMLxaZ5MAcY67YhKQPhpDtWEmAGFWICQUX1Z5VL-23Dik3Ji-xopvkyZUzH9Cxzt2Il_KQEwH5RgvJ8a1C3kngjtcS9baAPDBpSHxylm8CyqzPcy68fJFZRGeuLeILNb5mmI-_Axbur_9_GYxpCC4roXfwLhSTPvbB2EEDZ5IyHZ8b3TxUJBgov0bRkpIk2ek7tflg68as-YNEXQDysL3Kaw-0SPl55B6ay0J3RjoE_pfgdDmgD_FEDnd3fnZJ-UMG4IlIrd8VkmJGcfGM1MQhQKeJ8aeUYYlcip3pV6f4reBhNBEB2V5pRn5t2t4f7Eei73XdZyF7sHY9qIj5QFVysn44BXJfQBrXMPV6RAC3z9foKtQuaNCD_SV_6YNlNToMazzgxZ4vCvHfxt4883U-GV1OthYDazcsrweLq90Nu6eyGYFkDgYMJ59LenoSicHuJkPYtvh9Qfgp7IPEsw7aBpmJPORRo6vUlKMnt_DTdrmbfTdU47or2gH0KXt5gEYY8DDbwaWg-GJ3ubtEGAAzsQizJyZCxZqlmMzYbFqTw6UG8AJYzzhg0VrYZCvFuARHpN8tXiMt-nhSsgGCdlI8wKM6YW6jGCZb2dpeMkVdr1Xc1uHP7mjy0F_ssV_r2n43TAigTZ1jOG4oQxGt4VP33PlzUxHyuVz_nvekr_mw7CoYN67MpEGDlmTQhpfVCIdKAQNLvmgiIOYyZsBDozYpNaYEJkr8Po3Kp5heXIogrhrEIqKKUnirBt3GMpqs0D08i3NvMUksMHGAOw4ptehCe1u44xr2jlu4cSey52ws0q5QcNN0CMbdBKlCUO6qHtt_c6KrwmNt0UKa-moMfkil3bv6ZkmFqX4k4E3XpqGtsWikys5TlpOpYdsqgh-Jit4UgkF96BwCvrg31lwD35aOyuvJt1QeAWeZEQ-P2nAOOWM8BBR08g_qHm9TCDk8yLs8FfF4lluOL7XbJy4VMY8aKoODguiR8X31564GPVBsHqyUti8N3qQfU_DtKDe6JDw_3yjnAS-SrabhE9YALoUGNm0f9t9k5GN4wbS3MxmF6dQG_OVdUEnQTi1jTB_WzslbOE7Bn3CdTA_DtwQrB6KTJ8RnP4bUb0g5RFqjBoKLxdKjUWoS4oCtLVlNREeumpaTm60MtnFzAsTIBblGDBTkPAvIr1bQp3FRXCD0ysv2FeeSXfpK9I_UjTnNThDNeYh1XmMBoEXrpgb053NgEgN6HkKoaFQqpWX-9IZHFxWU2pgK3vg2Q1TgNIJjvPUHglXlz7PDJ-MyQdBhnWjAG43bUo_Ohr18oVbIXQBgF1LFUaIqfRIYi2cvZSpRZ7_LZ2jg8lOe2zxwVnemzcYEo2GWKBrW-1QrCdwHqu4Eu7Z2tBV338NgFhtGyZcTNanvLIs0ZgjwIkLrr3dB1jGrDyDyn2v0QQ8HQ9WfNolYCEbaue9753Bk02WTX3qcFAWS7Dia1akukx7Pt93frMfg0fx6x95-_y_wQWiLdmFC5Gcuq0Uo4ZhjDKIt0Qq0YarC_31nM-zf__EhEc_C19oO3q0y9-QJCY_LAlbaBVxGmv1ttVBgD2OonD8nj3FxhZkaHrnjxkDgCvdDaqIgLKjs5SWHGPTMMFIhvunhsghQpqWOk6UQhvCbbAf_tBBY64POSdStCEYUOU8xyFwA8bKv68egAKzirccMIy5yEil-00iIBrZj7AdWQU3sp5WdKAokYNJQMpOSs96K4l63IztbHBRkcoSxfAP2YUdSa-XMmldMWAYdt3qJhirmjKzDnVO1p6UaOnAw0k_L2vtc-bBEB5AjVzBwpVfs_q0gwFsO9V4LlHXo3lAlMNKSWjWlk0K7XPxuMsb13gzBEjcVAFOg6aEc8bb0pbthNr68C9X2ZCYC_uF2NY3bR9WgZtgP6Wn3sEo2QUVH9wFuZDC84JIQZxm8sgx5QAK2wMaX9hFZk-hZDTO_u-87x4GZCghrMxBxhc92PSbQqIUKGP3bodI-4VVOqg1usvYjzUpbXSkMJLS5pokil8f42qq2xemiPvM_YyLtjk3HdvFrCkCL6QM_FppSFaspxfL6BrE0tHgwuro1eqeHYD1eN43nHf7_uiiC5T01hE4x9evgHLo_54m-ws_694CbYa1h6Z8CfM4FIJ5Ga5OJVzYUTLWNunAhXEiFFVygH58cZK5XfhiVLfflb_YD3j2hd9wuTZ_XkAKae3r4qVWWHKxBBuNLcQVtqDrvuCkf60AqQSRkjhGLm49-pIgxLL7eqcGq0AROZ7u5B_HRTRgFHO91VWWgFu0UjvL632nBy6n5UKy96gHNqOdvg3s52stjkCP0r30N5VF_QLpNAHAG7W3osI9wXKALe7k4AIbp7IQjx3Jb6w6kJjgWXURpOXKvhcHYRY5jyv-yt6gYTMHkGLbyLnHTwrinlXB9BfAK9Sb77PY7oF8D_BG4Hvcs1CJcxaYAx-gLKiMW2jalToU1k5jyVzdnDs-gKAP6ESBZLwY2L6UylDN_vEimkzABsnjaq1AHUz1DKmQIQEalLPQMK4wBMvryiWzeHCuFYLxBF7cXBB8qStz_ThVKDnwnDTFcNc8UVU-IZ0sSLT54n3ORAqGATzUWMu9VncHAScxrsPnfteXBVKPUETCAo2xKTxvQqwp6UqRuU5dp89RCgoQk2pECWHFr1BDllGEiGfg-gbElpASScnQhDBc2nBLDT9F18-_pqcBNc_36xGOw_7SkzTFIZG4oKhNuYMBLH4xFWlX-vOlWw_52ddwg5nzcaY2cnFY4v47j-7W_tdo4fNV7tOcmEbs-AY9oIlTTAaW0nHT_A6C3hEVpS1TuJm5CKYhVPsAp2VTmbO260dczBg3CTXqyW6IqKX2s4EVDSU8M9ada4Ji1R1ROGqKlPTgGpuU8BA3zFr_II9-OPAGeKvnDuNbiFNV6E5gJvYh-dWU4NTTlMkjaAy0xXeB05cBpZCS3oamtTfpkLrIesFfyQgZBrpC3TX9ekaMtG68w31Uwp3Sn4ebNYzClXR8QL73MzmwQxqBLEClWa_Q-hhUmuBl2zfuzM2BQ7JTRoRR05qAvgjjbNj-MlucrNU7LS9I9yXkan7PM3QYaqP-ANlsEpjEVeTx6Jcsu5Ci9gu_4quU4FMsxKvjlTIF-z_05pi_cF-x78DsSHePnj6oCzPZrfGs01NkFx4ZSNBRvpqzFkVvVInrCWkW3E09s-kNEu8318W-BYc4b2kUbzt_J8idkoWsYwelteo111kC4TzqJJhyTmF73Tvkw2wPS056_hml7qJtJymVdRgrictqIEJkjn_rU7qPC62FYlpHv1z5CJ86sBPBsKK5roLi4zst6MPvqe7yJKEVQjlak_mUMo6VPjJ_2xHjWe-lgNnqirWAYFibxVooNLidBSY0w5jQgqbuZv_wS9m6BmTZ8CF48hUIVwxn6fgoAhAgx59ZqB7QP7rEsewE6NgEf5JmWAQRbn10B64-re905vQA9DuqojuTjnw7kxubP1YArAXoUkTejG-8RGwSeQrH82vDyqlS-jtJCSgsfyPAiyDy5fYzSoBeozqfiKyJtEDTwLzj902s0wwrRwxBR-0LM8EtR-ReZhpkkOwHb2ohyxLe9TZFplCYCNFoO6mDggEdPHKpZG_xUIjauV4PBDTlBAmL_ZvlOKoVkQ8xkNp-a1MChSdXfDnsm4-Uwb7MhhNaItmPLppgsYR03P-Kh0R1VmBD2MXvnIsBrQzPWmSxmJdcXvQOCgoObbheVkVHCIc3O4AEUNDm043KcZsvEtHgUYqjSt5HwAE8prRnsGkxYE9T_n28jy-PDWqtRTzv_kYig4EDa8LnALxJn4NSS3311wrlIFQtwiBAGDcangpKXuHEc47GJlcaibKZFojfuLnd4aQ9WbPGIn1xcQd8J1Q7OnmjavhIMldAfAYjCWviPCG5UAyIpfbZIx9BljmOa-XtqEQMxbGeIxS8ATrXFBXe97J6-jzZiyS140I7tjTmYR3-zVt013SH8InXczsOeSSXjNEUkeI2mHOLn5OKgpKZ2RFrlr5dA00EpT_IkIrN7wt-0xYZ6TayI0Pdrrw-0NVrj0k-EaVIZd5t5yVW6drWqcMgdHM_lNL0GgAF2BTRAWjC_uT9edF2aA7ZHUnEtt1L0U2tAlxz57LxBTv8r8NlZGfIBXBSheY_ih6c_TAdNfK0C3m6dg-NtvoPTgu9mde5e8L4TJ1EyBik9DDv7zRFxZf6a73u324NCwp4IQOO9_EJrcHvO1pQis5eQaywVucMGGqgwx3g4vOD2d6UWcKPMpoIDhfC-bpy_xdqeR419G9XcpJ3grIAvtyV0FYSF328hItKONBbOx9AZpMJBisMqEW6Y-41jsEN8zDNDj6hr8f2YyJw9zggIMPwNa8ACezHV9azE1YscSdmu6DLV2RnoQYMFsTnGQw-kbt2jvhQaoMfSApB-_P_CC2FCmTgI8K4BbPaMD2hSFgOay9Rxv-hJqsvTvmfRT0PhZ_JIoTRwvbsBcYU0e9mU6yBX364irYNXOg9iu7uMDo4_3FUrqZ8QUghTyot5yjVcjXiEBcgx20e9wcrs1bjDEMlfDGjWZUo2zgU1HRTMSVsHaj9qjUODJNHxxQnV9kOpZ08QqNqyFflCpg80kw7SoDVxtSomc85gwT_t8ubjug0KErjevxxzHuUVlc5BrC1w39WKRABL2HAG4pg4MYYAGnSxDRwDvsB40xjUKHTlwXrLeJvhJCxkuEJMOkwtranilOZIDQB5ULpIkQp2WTo3E2HNumQ7sskWoRkzN7LDwDHx6MYeUY_goOgynajjdYBJAA92YalPRC4VDXnMMNh-ipFC5j-6_6RhAAfZwlEjeWLnVorEtyBWBxImVIAJbT6lOOyyl7i9Igw4sn1EHcTIqcWU3MZqYcBRP0ygTFHbztN9GTEIOeQGZgz9LLJaH7KA1lLA2Jmm7SfY_a1lL5HyLmFH-hNO8gHgUslK_3gnlj-QRhcNeyxyV2Kua1JztWw0fQZHlvAEEMw4pnoCQwbq0aAMLCjngfEhcVIhfgj0_8FC5XwmPqPc9c9htuWGy0d3xnVFVDdSDO6s3-caAf_6KoECD_dwvlU93mkRybcvE-OrMX7_goPqBoAYtTuMaVYfjM6Jh0elb_xxW8N91SJ8ZqyvJRdcGIBpKTRzGzaEWAq3DaRcu0WqnStCnHZePUUmaw35JlQZ9t0ve-ubNVsWVV8ldf90VJFTiMhiO7D4B8EpZg4JrzJQCqcbDDXHtmGdADJ9lJzxWXRSNQ7-Yc0jMnbDNZsUHgXmPqy6VCYXtchxg_CSQ4PXdHJYiiPVuK7VgIfOJqM4JUVSD-NY8Jt-rjWICxEM98ccUrs2FdNXI_qQk850HcTm2LvEWKx0CodqJNAqs3S4jfcuXGAhBRmdBjUHG6cSewZPuFwNSLABlRYYulDHhZNxKVzMsoxgtOu30pcbtfvcUgq87uQiHVsv6fKH4iNh46zMz8geleG-ky2F34F8TUJEDVtAcbuMxO-sqKeNIL14aggT5KZTuuRgGQbArbsw9WEGeAb4byt_K9L5J4hCyOCGSWccjAkQ9d5_XIdf4Yz6T2qfEDoVdOucQ40-xHA10ETKMNwEo31xwLwGt9V2Gj7RbkWSLxAewqu7wGxbrbovSYUNf6SWUDMBD7AfzPw9Ief2aChVoiREOGPGbSBQNw5t0gA3o6rGIFHxrpNY3k_WXaQ7LcwxG1MeIeUVqycAFSaKI4pfttKJDJjMY9sMhktP3d1ECr_zLm_JPHyaTYb0GPMEruw_WTO4PJs4zvEjUhZ2uQDLe3ZukhWK5FoZ28S1_gocLVZPrNusKqRh7m6_LHLJKKd9dAgZcKpoUhjPlX5jluMZwFDRCHO-Byu4O3GAsn9NPwdiwi4vA5kznQyTW3CHpkqWR7KaclTXr5SauqtsMY1Gx9xUQ30is9RlNl3hZhmU6H4qwphsZDPnUwMC2sCZv9IXZx5qYm5bN9a-0kxqUVHyMxZIciBi-YVm-HBjqxBSihySZIW9qO3XdDdGlq-ZgQe121hC1gvD-pWWoQP6svQouykU7ymsKy7ODGX1fjudhknUPDHkJ48BJadA2Nr4ckHd9AXSbrv8xseltQQumv4-SQdGjqjLT7Aq-47ySVo2V-mCD_bTZV8B-NH0Fyu83RXX4QZffTpWishwdikA1nodfvnmk77gYxSZK-VhU4Ji2RTD1TfUb9PgnTwfuw8A0RtSMpyWGgT3eISmUhf7rctIwbDqSR1H6mgIuIQM7-0ilea9X2JeggGdphXI8J4cTCncPi9zKQKdtVakRGdMSpW5IW3D-86xmMOLIQj-tZ6KZdLNakG75IywM3kQM5HVjI6R46WQBBG9VIwEOlPE2C72BnoCu0rxK7wK4isk3uQhUAboIiHi_VXV5T-5oFc9QDNED59RSIpwn72mVdxst1GFQfSBf5b3Z1JvjYjT6ve_pv_bidJYiW0mgon5MHloOk2WjN-DmPfCW4eRYM6J-p2DvrQlIjfLbLYo3BLg4rtHwR4ceghjEBwwk59VqoC12PQ6AYR1up0rsYlhofIN7ns7QmbFyyNLVPrn-blETn5uo0jzzxSiP5FzB2mBjQR93-59Nz5q5OQegwOkUfV_vcwDyaeQpJT75601DXUQZGn2DsQXgne-hFc95mejcSwnyC8-K7QIKtBWvUeQ44p2Vr5mamh_CuVS7OlIhRXxAJOvZbyMBJPQvfzt_u8ND7urBLrQHy0rU89lV99uxbDQf8zYEwdHWBk-0dcoZJzDTMlMtY3j3UHJOsIDHdZgmrEDxDMWgUuEkfgjLuXNv33vR_LaKmecF_L2nvdiojeWGuOeTj5UOtN8tmbtR0GAKXe-Fi9IzlXw81XAr3cT1pvq-3FzXGIA5hGAkfW7xcwNmyyz8hNtWbnfQivJOapC_GgOiCpV9DXpq49oZbwdFCmOwHT4FoF1O3sbRruPhGWpPwQlYeX1Te5D-F2-r72B7RIj1a6azGbjroj7RAJjhHhhriQ3WFyiS-HDwAo5qj9zmttA55BbbbNbKNJarjFLRdKuTdvARyn0MzRv4h6f8gK5A1U-jnFDfrpNeFdWeeHSBQIuvBh7IB4XdPw33oapVlXfDkYW4sCu191olcqgJW3xuKafZ3VFoP04fBgzyw8EIuHDHGgNTbqPUMNUBnY3qKXd9JtARZIKfPqVkVYZYWrmhLakvv37qKrnG99KLuwADgT_bOwj7izF21IyOS5yMAd0ZQ0uZWbHGgMfuOvQ7mCg_Hs1Fl7IZ9CrGt38vrMaW0zkpx7u4IqIcb8c4juoqggSe2LtJXn_9HEPKibxHqp3zZ4E8nwdnRztOE0U0tt7IpRjRVMptQm1p5kMT2voJyAbtoNW-7C94qOJj0BsTE64uTJnMMEcC4zlTztFwoI5KERW7vgtawzWVL_KQOK9ukx6zC15YlM_K6GpAhlxQIU5QdcwdCjrDASI06jEBTcBtcmObmII0woRHMFsibN7XPTxWsZT8Ok2pEacqqufEo5Ra7f0WPAA-4d96vJoyiKud84t8uKsCdsc-JBusurccLBI1nhC4-7L1obTdsimXCuFHH3fJdj_SMONBmL_t0j5k56vbr_APBL99U5lRucRig2v1q0I-3g4dKcAEm1REbp5DoyIJmppmTaZu_rMGvzcxep6_VQuTYp1QB3a0sjVB44C2tG6Di5xjkk96-KW9N08fT8eIKNXiS4KBt_vsHtMD_B5sdx7H5z2d5v4Bvb3hwQ0BZaSLLQGHattBaaaYYP4oY5bZh2atJgDbgM1jGOsv4t1CIPjYgycfjhrUmEzjp4mkwmFeKS0bFHThy2TgZxyuTXHYh9sAqAlY8hKPsqNADGPHdJkajGnx7AOjcc0YBKiVvovr9mm1_DxcOcM2B2jjtBNlIC0JC0d0BrU7wQSYFQa51hY27sFkftDY39K0kasw0mPQLmHxtfIo9aS6vVNhorMrnqovTG_PW2OBUUqiC_WO6whnLi-rma6XVgEzzvpIlJTQGcd0nQVrTt57Edy5CVcBi7IRXIqjyKIdCvRiupgHcKJqtpyLISbjKAd1lPqKH2BDbaXpw3iTh4lkyBuvxOFTkobaU9SfR02WO8K1xW9geHxhyiDpgLL7rxgoWds3yQKZwZiJmSaC19lrdfskYbGHw-8JSN1DHcN0xHo82hN5O6Bt0p5Xz8UQIuacS3I8nNQy7gtg83GpgWr9dhfExFX2JqgovK1IbU6BxwRPO_J7yJ_dVD5K6Al48ePll2Bao5VG0WWbD5eXBgGBPqrfK8PLqN283gILoa-R84q4ajrN0nDeMUFOeClApB2IIN9ZOVOfkR8OhT4bdhy9UKCd3taIo2ZKbkI6ng7-F06QE-UQM8iau4fAaeQVN8Y-vfqM_sTQ1VLTDWTkysqIRAAA3vTvVgvlNlejnOCPW_BiBV_1DTNJMNcaUXxc3WhNQCues4KzrpsJbMhHlvgVqDFfyh-eKAeqznMoLJ6SA4X0r-8H5mcj6oZOWVrjvOLwLrDkvbjkhiBJ9YyljteybQbo7YgBJpLpIOm7zyP9AD4eeXA9k7Xfh_76AAEIRWxjuEBPNJdDJ2CL17fWRFCiz8KMnr_RHv6QyYxtUDgjKyOJHv3-mv25kBHNWwWnv_KsWNvjI4Oequu2DJF0g0EpZFenMlP5r5-ayePjYGUZz6h4QprwvNWp_pxKVhD1j_l-jkELhyffGtFJk_mGw9XpUFM04_DyMv1WnC_u7lF8JmUlMnPkC6gj6vcUq4-cM6kcecftITINBFeFqnMM9wXPgWkxUxWm0QHL47ZDYYSvOBf50qTuOUBGxmYVOQMfmZjgB2kTTm-BpeZ98RfK9HQ55Yqyaq5A3quVBeZpQiZ2wx52uVDbW9hPVY5-3rTW_NWzEVU4P5NHV_vtVcxYHoUhb78rhrGXHcBkzzlEgatllxTw1KL1s07BE7h_WiOaNGcxQF15p915nPp_ieStieYggYmkjkXV4qy_LG8mdRfSf8ZMfQay-iLQOZmnDN_V6jvQ6Ct5PS6k_LbYi9DYC1ZVoNIXarWkF7dcM3eEoQwuAurnJdIzkKKwuOpJvxd5a0tMCaxNN8zlSgoXwD4E2mBuvYs3eAC1LUnyO9UX2ZfPSVXXiWluzPIOnQTjfZfSEvUTSTjBgMrjVHkZATbygrGS87wgvmw3nocKtO5ByMW6bEVXII51UvpcfjwmEpsmIMmkW_IN6fO4qwwiZRpFRIHSaEB9rO5d4CjMT48RB-vj11s1IpupTwB0-jI4wpqTQTigPs1SnHh9tR_ZH73mnX0Nl0YiZcSir3P-xaDOMhwO9YDhNSRzTv-8CKmU9YTJwpt6CFTvj9-2cbkPCnWTVOCmJZut2OtoaNkXLp61gGpjj52tKbyb1gouPO966mizOwAXacvxzoPI_XqPNW0sP90QlkAL9CXNTh_ImpP_LsBlRmFD6u_BDNAbb8CEBKQaSzCYUrw2gkt8stNXY0TFP4072zdboVoUkxetxoQPyBce5GqLvoutFtUzd5eZFO3OuuAgTF1_DaMYFKahSBcQA4MUCbIWAFbnHSiodwdOkKIekfBDSkxDW5kbiZnPHtVThkG7XDAQJ2fvhAr-CP-fiI2_NBE377eAVGDzvSFgVbxuq4inkZtnmDBrdRoGwDcv154tBmpVN7k9VarXD5-pDTHDuS5Y8Jauyy10hrbrPF8I0z13yUeE4RxWbdqqujNmG908pl88_AXd70hac9ovgLxIFyccq5S6ckAooh9lbrRATD80pA918tDflnS9EjGYYgsKsqDG0jMY45wLdecSn0TpKSuIhcwRY5RW6EumE8V_qbgTUa6T-urToyKFXaGzIJps21xFQ3QI5VcT7hLiI7ZQ_T2WZRu_JTCrXSNww9TxoAyrnktZcGv5lVGBOvHxpNfZyJSgIhv_vZ4vXHZ6gtZhd12eqnPxXPQkwU7uUeSAbQDJ2L1EReW7uB5mZH2oCX7jZCaMf4pVJuWMlePE6K0XAHDAdeq0Pp-cIRagoxZAYC0U5OidXQ3ILv8zj6xy77VnLchsQ87emb2PJZde_Eyti56InTZAERsDhkuuy16bA2Ovxuia4cdTCJaE422F-pUeNGiKPBTBiBZuwyJgj7vrQ8FhT6F49t3PV8dGou44aeNj6F3EpZzVQoixhAYDtbqSd7krNqL-VnEMWyVqo7bV6mJ56JwGSfE28oM7EqRuYFw21a9H8_2drfnGBBHJAZPRdVNEZ36soTDoKhB85c75hcoeDcf0A_7SZiZvi3lhFNHmRWKvcWaiJHbeitdtLyYki9CvoT4aO4oqzkqu1jQ041oJ_Nv-62Bmz_8OQnNf4gu_9puM_5ZlrzyH9Kv80vqc5mIAaaVDyUb8RxYDA35ztXd_bivFfML8KmFKvis4iHYq2HZ5JZg5E_FiBEt2QC3q-LGssDmGOhoCqBPQjxo8qVaz59IWBvw_4wa_g1PEjcSkbPHgMB9ZA_1204iIN5dQI7wQvnD3uzDd8vfKCJD8Ec4tf4QB-uZq92S8g9Hlvv1XJuvEAMvwnwZ-juwPtILZK9tDKIOobcZgfKfebGbKKlLIg2PTQ_kE9stj2oQqYuLQy5sQ5PvdMNXpphVkZ8u5NaKLmVvaUsn1gaLj-7Y0X3aQS5uKEYur54CtSl-GjNU2acCUIa4JHC76hnpli0EyX2Ev6Uzxy6totHQpj1vWZGcc7lR3WDc1bhcDgLlauZQnQlokt8aJzWc6P27riY0xJVnQw64CiT7ZPBFbdPyKVcFUn-3lXvgZ-1eQXLnj76WbNIjXqKq8VhCfk5W3GpYcg0SuYwn2O25c-PhJt3gnbb_gkzACBOWGLgQT0WsJYRP9yJGQE5Vl8yKQXKSt_AUMcvLLfjQAOeaWTup6SPVMRziFnrfqZUyv3ZKPDfK8RNGU3n1Qtui15SIAGXgTf0emOi3d-82cIRofJc1BGmJsyvcFpBuUSYP4PLEZ0sqxSWBKX2MrvIEa6Td28Xy1tU1eavvwXU7cCvozlcbs6G9vb1d04WkOYGMjt5MVhEt95Y5EbJ0rDwaO_RmO-_b-jtKaXyoK156834hPOLFhGK1L4VqnqWanMyFit70VBHnfXMGefBsr4rUqa5p9jOmqkTl4NOJmDhPhsOtsminOOKcEa_UaVK42yIipHM4uAZyOjb8wf910KHnK8I7ehD03URv0QYmcmPLwkZ-hE8w7tXlguN4D4kfdOyX7eDnPTnC_gOv4LmyJzVUxUs_iKhbSwJk1Zo66Ja3fSMQ8C_O5l4euExW2Q6fPA-_uhT9VWiH6iA6ogS78ipV0pUQNKKxpVVgO3dwWmXBe7pWomH6ktZtZaYSxl7MZosEYbDrnU6inbycNAS7df7tTKo1Ds_UGUR7A3LnjL8CdBrdBhkPn5fwZd9aclEHllnoOyVf2NN57B-eML7iZ1IdtarlUtMWm1bwuIsLRrzCj5V85gPkcDh3crTHRuyORrHgEtkhPaWHbpiUgxFU3HIkiprAfmkRpkN2CGOqSUzI47nCeDr8LAt4uzxr0gFe2mMxnbDoVbfsYOrF2QujOedAWno_jGOt8UX2TbC4XI0aw02_bUld4hZ4QEQdx63MQfSXibpr1zovePYn2MUeAXh5SHgk4dxHzgKwJB6T65cFNrAPATFJiXYLQYyACTMqp2iOydt1osYmxA4WZ2EUEYHy1ZY6GtF7balM1vLFu9Bj9RBfAd3b_nhl2oUpafOuM85zmM4Z4jidcCI-Wy2w4z5_zhxgztu2Qn439ttXc_pXZf1E2XeuVEAMGFfdKKRJEnHdAOx6BJk7kHq40IE5mNVS2ZrEw34BufBn5cADVO_OHZLEtH1lqJ8bTcKXqzXRCQqD9KGUk7VJ6_PbSQJB6YoUJpdL1EoFc9w9DV-0WKpDccb2v5hZxt_56qFX6wNLbm37RzJcp4jvSkFGYw06YKXwe1bX8nqi0SkaHv56kw4CQViJFXMIyUSPx3Jfk5-8b5L1f4EJ-0EvIrIEoj5m0xrPkHwL8UdWYt20RL8bhwFf4I1oN9nWTGf7j-7hhocftSawh7q2FCvHbyDy4Dern1ZdDcj4GmMAs8cqLoklZ5WZgDZfE7Z8KvymhE9w0Y_C2BIFPbtOU3fq5SpKez1eS3UOXax724WOf06_qcoB9zsh1HGTDn5Fs9qDzajcM4mAam3iuJ3H4uGHyk6v61luEzEc_UUxqz5zmDGRkit0jwRnSOSU2lmKLngO6L5_1Q-XK5g0VpfLM9DoC8PIbqEMbLXeE2vJf8YbvEDHX4y4f-jYJHKBMPO_dfLHuDtD6gAJP--zAZhQ7QWBmZT94hIcZi20m1U92DOwU_Lse7JLvGsdDLchj0mhgFUEkmrWd0udcwy4MUJmTnc8YPiMnmUwfW9A6zcUPdsB07nw0K-iLXfgNFFMgY9I14sUa7ZMUqClCexa87rx1uAZjzhh19YpTxrpvifp5neCjSRJfmQ54YgMdpGkHxuSpNzj6rC5H6zS0FLdYWhdQmev30dFoalo5n4-s117y4juM2iUdGjFxkEodmwyarS3rKg7pvITlcWls4PfQ-o3bjKTTlCIdtZS8zk_4nZTCil1FX5e0wPZtTAdxKPsuI2mOptxkw6FAyGwHJGEtKRNPktI7ZBHXCF5IoS1tpGVuw7nqHZKx4gvAmMS7q6tZJZrfuKH95GPvdtaUYF1sgs-xz_xEg_9M-wY4kovil8pkPkoT3uHeXDD_e2EJd3LvbYnKXY-EHqTqTgS7mVSnRpDfkFCyEz_KLM1lUcDC5PJNe75aDuW7wt5hsqAiNttDZBSPVglam04J2IdmJldIT-PjoaM8786aFGG308yMFGKnjjcQfM7uagq1ujxXeyQtl0N_qE_llXMf3izooHcjweaSRIReB-J5yyNXvCRXrTQn46oiFqfuvKQGBtrvoNcAUuBrHzvNn14tNjeYtE7sCRMqaa0SRkRE7LQ5-3b7cHSaMo-zS6_I1xWA7j0Seyyft2aFuQu4JFe6k0OFGiUodGm0WJ-9RtzRkDegu85VPs9Z_BJAd29vhC2aThtCWjuO8Cg5htWMobdwbqFfGuDGEbZPH6FY6zkczphZ1ivEkcOX0sRU1BVvw3qgj4ir2TBDbYN1l7upoV7jidf11BsT3ce1Iko3t8bUUupxhEAgkwkvlsf0grBxYLxUhkTaxB6ESXtLU3HQigULoflTcUIl5SPUrhP8ag5s2ijbxOdU_tvwsDbuyFRYqv9l-ugy9nO81cqVSj2cjcTetoLEqdv8TwaaOuZn6DWB0wK0kY3AXHc0lwfjNNfRC0QodzkAYl27CwaNyUAnMniKVAOI_w0d2x3ooyN50f27AtJhV6ypFp2E5Gjkpf0NFDw0NyKwNxHGVAHYNo5gavqhkdgcOYANPXQjK-Bcs3thSMqlWchjq7MJGvtzxoRB4pDtIcEyGpi0LIM3v3DGmI0CNazuAaBvOUbcvUQQDAxmaqH09IPoysltgX2IZo5mqraLn2BCbg3QjyA9qTCNgUDGjGp5wC3mPh1sgNiwLhAm93NGPq8AOCViNrhEooNLcmq06iVDdCGbkKKJpYUSKvSX_oIqLrHn6Cz7_QPctV25MK26JnWRGF2ZT9yam8CgFXJr77JFCczlFBhkbuIqyAl3ghw4tP0RAlK7XSi4zNV-ATgZoUYdYzrTp3FCw5gvgHFypo8e87EjORzdACW--zo1s05XLeMEvUDfjK6nLNB9OCvifMPNEyYt0xuCV8A4MWhnHtRRGhcWgJpU0x01XepaPZVcbIUrBJ-PGy4-4Dzf1CtYyB51TQgLHJiJFEFuDhBReRpFBnhCyHI0MK5YGe6Pxu5kjBqF8j_GNkVeIsasLYSQvaPITOUp0N_Afyhr6Mwy2LNTb05U0njtXtiWKXtFRF88Jg8t_hzX4EHtv6XcmibTC6PgqC98CywuBp2bLr0MHazCoIqXEvHnOCby7Xhr9uD0i0YSysE9IKZWYoLFpaILg2BxD_SiDetS-b3ibkoiQE-r5zdKqtu0OI_t9ZeKUZzyJRgTCBJdiBr3kSEF9YjgFybO6gWimDKSmyPQM-orMnQpv6JRWVORvZRpW04YUayxE9zm292c7G17Q6XLDp_MoNnIODiYr4QyH-PLJeyS0JMux1zk9WpZaHBI37z47X0rO6W2pkd9VdEK26i3Lum2YUKXxLMbDLzhdLTf3Zq-0TN9G5DiVrNp9nwo2ANuKDVtqTO_8Kmk1IsbL5lbAGBldQ3YENpQ5XyK2T4DGEdD9CPJIuRjvn365w6gmJVyMAEzgfVusSB4Q6ebUyMD8vTAxZ5NhsF3vvyXloP3MqZoxULs93tl7-uJmAtI0t4J7ojMPlAkq4H1QQvlOekJSbLP_xYy0LEbrWavMlpyQ7VcYERi8dcx7KKqMDBwhhSKSmd3KXzxltYxRKkpwLS7Bffnguu9gSggEwmxe9MD0RHP_l77jUbTsliOBL_bgBbnlYlrmAIv_Gbyog3aLHAp0F-pgJOmM4fkdYmhODCUjOaK4YkVOSo7SXCdM1CKKUYjtTWukJODe-Af5oAzO-XYDLpgI1SQA6qzpNoA5YC3DVIBbuQsMyjoiSAvbs_icEO86MYEWPcQ-DnWVhG-8cAFbDt0RMekOu1gTsBZtbpdXm8BXr6_Yh-kLLtU626v9cCoQ3l1jFsdAWwxU_wCYZi_m3s91dAIett9OJ2FhcN5wLf865kFuPoTjn4x9WqxXkVcWlbc0bgYxOigbxUgdR7SZqqRwlzFxMgJFbPnDL0W8dwZ2DIzsKHCp5_4CsqhuNxqB450dqgF7v1xkOJpa8oP4HBM0Sz40g68dYuQ7TUcDA2JfdPoqUsJIghOGA6s8Gaf0lveeu-iuSzZAtOU25Phi5NIltzGxSCakz3FMBoCM7U-jUw7DgUNyyZCn7pGbIECSc-k_fcjFGG2vvKFGfX64_ehqkLCQTjJBhjq7vUVdxpxT7eBG5KBmnDemWiCi-2brVyvBuqHviCbrC9IT0T_rC1h1KX7QrUpgkhMkplZjXkEC4xjZCKH-hlIKUcuzYtDs8qm15CkQWU0fapheaitNUMEGAoOphxN02nQdkXNtYcNdo4cPQiLjpkXJQKUyZkjwXMvK2wrADCZu1ZbXOOi0Nu5hLEAxEw9ZtcY1PexWtEl9LbIKMWz3K1sQhkCQ0JUgNkSiEtrKYmPuuJjpDkjPAo99XKpAb3G5cyL3l0AYWKVMhzhe1fkcYEZ3enEnfhprp9ZqaEp52DcESRShmiV09BwX4Z3fP7YCwQlzGvPQfbszPNSOV9mY1ya1cLuVjB3lvtlStl1pI7ZHFYl-WwiNTOxsqFPZv35zzdPe0oS4heCwmBYbKQm_VrXuwinEvPQErg1aKjbPBMN8DX8iYiKTqu5DBWo3UviZofo-wGswyBpuDYjgn54qg6OkyftxsCge5eyc5cdFH2_-qMr4hOqARV3ri79nFcDnF2VDUWxUFy6bfAFq6_jQRnKFKX3qkjtowpqt-kjIqZ6zRDZzq2GLjQk3aIlnwOAgOfIQ9P88L2jNVZTkzxT9CXagE4ElVPVYrwtDT6RA3CWcTmCIYLM7BZX5EAMR6DSkxyZGpngQt0SZvTWW0qKsgEVgL5vgReBeO_eMQw6EqxyKQypozlIMrtNCwRIP2MMstifmSWbPnW8OSd2-MV5c5CQf74-ltB4La8lAFEDHBdtfoNnGIFqNobMZemFTtzL8iTZ9-ddXe7_Di1UrBISncyCrtBxic3wsw0MroKidY1sXbN9MslVpntG3MyNjtciyBejDWbtaAIdHQhGCf-s5SQOhIGA42Lw0O8Ayk3bpy7iCoVRoIHCT0T38CTMhNTUi8kwokbfeU4x52LeBfUeWqnJkK4_Ilwx7KawvOrOTAg6mFtpWlWqMtpqnKieK-zveXxnCx6x2MjCUL0vBtp06Yc_p75mfq2BrtOziZHArhLZru4nlpZMfu1LN5dfkbhFfO6rRtec1VxUB920W2AGbacgD_I6AKHybPS9UiHQknz7sqRfCr7N6Qub_DuiceN4d5F2TBye6RZpDLfuIgPYyZMaNaLwBjZebriq9AYzWtNwkbZaJsZxy93Nx29z1epDh2p0YDYIzZkMAcOhXuhwld8KYpqpOEbcAFc6wewcF939avvTQTgWCErGSRqlqBjcwwgeFMD8thWo7ZoTmkMX-d_v4xc6VYcuu2Ss6fu4rgFXLNtrTy9NXqaEshMWevCy-SdwoM5X2DPzXQxJhSCkGvGgkz4Omht6TOCke_LlIqav4lDPTCWCmig6BSBTnqQ5NTRuM7CQ9kpd1AzTHuT1p_jLLNVJfWi3dLqV8w8HPP0nKoZciQJ9Z4KSzkjyJrqmF98z1O0HHDu6Q67Puc8F69J2Fr0hLk3ej0ie81coglXeJLaTsKxtMRQ-L0jbGR1GjTYD07woDp9PgDJDf1xlJR5lekJt66lG9XTAjMEzwIVWqWX_5Abs45h3nK9IwqRBabHXXzTRRrZLUatQxAxgmd7c615hh4LrA3gdlg7VxW4OGHpetuik7-IY8D4bFqmcMKyOmAtx0tqpVloP570VqFrthJjD9O8BaBpqDKJGsU3KDUxCdsZ0hfRt9SMHIQBbtYsk6pUFZDBK_Z0JRX5XlZgN0edT9CjsLoW1IFzbCPuqRW-14oUOpy9Bpc4vG2ByWv8gTm-x8_qOhgnJ8GOEAvoIKkNhGydmm7V7Eul7VuJ7_i0UpL77rWv3S2MTW2KNVujNUMzesmpSwgUEI4pGST4pau06AhZTQ8u-l8inIv83day_0K-WiL106aFbL3pDAq6yLsKNO-ISTGyNBHZrmBqposjM44ul4EwVwWCwisQHOMWVPLNpQsC8JYWx2GWShm_7KHlRia_nTAKd7Q7gj1hv5zuS4F-07Y-YObWYUgLueqZbtME7dzEeV-zWAXAXQdGfrfr34koCCDj3hi0ct7EdLxN2ZcNieo-3MfNKN391jCIHCPfqyNm8NVUryMkUh09SvqM4fIoWUdx3AngOBRjGeip9ZziwGXDLuLnIsnQFshAMi_5qNMwUBY7PGmxvt3jPKHnxP2N5rg05rRyVWL6_MjpsT8hgsOgAZxWT3vTFBFrx_UIc6mhlwWpj3k-mh0r3kNsXiT7mExj-TNtCwXZIhIrK3DVfDP2m6EiAECMmkBErKmjxkunAepBwCo4u5j_2-nR_bAKFKp4HQ6DiNOe-lJ38z76VaqasYIyjmMcL2pjttjzIgWNiPPVKZgpMW2LG_mejppfENDGgRtXEeLHuRiAAFAAsOOmd4vahZ5MtLL0tPxLT1arNamy_u-ohXb4djCwDXHZeIp_IR8arDXNhwDsAIoCQKhqJytQSuWwJjUDpkT6nWW3iPiPvXEjEBUaYA9Xp0SXFVb6dBI4kI-LqOoxnnur7tarxWbaPXrmH4eBvNBYHbcq06L4HowCcknAhqOg-v5ZdweUs44FI91ZJnnIETLclN5G-7hddFkWXFYLItnUPSFIYcUEceTKLfCX9erLu-l_ZNBo71s0fBtt8uSXtDC9VM9SS7tlNE2NNpgBC7lGYcX3T-SgZJ0pBg_ZlO2CXlL6iOSlt-ypRgNWClZTCqsPYJhpMHzHW3A74Egn4uSmOirALz_2GjTEPcilyNKCr_aIYUxBjqQziDUzmiNnSZWf49bfzLMDC12v7PXf2NBOjxq6Bxt43G4dGsONnzFwGRj9vR16vRSxQMWx_t0t3Y-qfzTneR6Hf0LaH5Fxnl6bo2dv4C4CgKRB8fr3INxDLrBSbIenAFF8dIOQs_ZEGg62yOkg2usQTrpMfpNbSsKnYCnVCwNJTxaego_lrcZZOKO66G6u64-GomjlUAOld36CfpC_DUZv6ObOaNbZrzuNpXhnm-jL1qRq9wivDtH0XxdmnPvaYpnkjlo7iRtmmjUG44hoUS0O_uHHBgJtFQMXiMkdyJlrm5cUhW46PE9sJS7Ou1yDlS4ja_eq61NXswYhix_toVT3-mZgUrzxY8Jywt-4AfpkqeqOXFGky9sdcQU3hH1FWZwSfOSzeM6RJro_oztp41FPfmpz4fRSqyjthU_y3Od-9PJSq9Id-qholnAUUTUsZb-YAjLCDBjZqs-lEKOD7lzhWxewKH6Xn0-2EBXTx5SjBWsSW1ANMhVIZUI_L-QvAYXVhTDLTi38DBJ7iDjLaevy84rH02nBYbnpdOlzeZle8-7qCehLGaXAEnEHgs9zHIIPeDiShKlsrtrOFc5c33E3URBvoeDaYOZc7Db1WrFGGE2HI6F2AqF30z04gt7vYSomMK1Fc69E0WZOZW5eGqyM7jlZ5dxb6GaAtst8ObUqIMJF6asbro_jVXMqqR6KOWlRo8aafbU2Fqnq2C5dXdvo0SJJfgwpKP7E1R-uaKfe5PL4OBsw5NYXS9Ffm1TaUVYV5xYdJWs_d723dF5d8S77cGaA3YqYoHmiY139Kos6pGoMUIaxjvqS9UvN3tcy0fntnHRNTXU_TpBYW0CKVGCRKsv1q6j4VbIFmhrgfsb7xyCQv294PHVGXVOj2ItzOblfO7Mc4YCDdluZAz8DwvpRub1t51u14hTvdmvku_DadPEK2OHj1mVujZJLfmA52USeDpFZ3eRi39ku8wKSH8W0MRL48jipZvntb9Qoj8hoHBeVPtT8_lnVyvEOZyAsBA5ndHe1WawQBljatwBTIeDs24lQ7364q88YhQFvultKUfphxLeyP8u870vrOmz5WqZ26t0xuMSa5hruSlV1kMEfv1voi9llRl2JgInBZBqEzuQUr_xhOdYoqiqnJIR-iCGsxl-RgHkyNUkiIEjSVt9NUEwiMzlI3hcS3xqS0eY0oH61soJN6EYzQCVA-M4u34SdasYfCkTJGlME35tzTckDoafs1bsdi-meQRihUaWIuUBoLPdcVMnlqNrP5dhgBygaDtK07oqCZ7AAGu8p1u_ba7rE-kCO6gtII_LciLi1Jkgg5MW-7RhMIC_h9F-hQ90cUJZefeElWRz_MWfWvabfG76PR5NCQKXKNmd0_o0rFLjqZiy2qFn5XFv20zsFnc9u1iUMJ0Hf8PdAGY-mpvX5ey8_lzWnwmZmq6WFiXxzVEeT4xaA-kT4V0pmvCY_fjR_loT2ZDx0GmY_uYqPe5XjoXEq9vjeS7eaNsJRWbxn7_uI-SnXH-52RCkX-ernpYkpsZ6qKDUtGijGgKk5--ArQrZh1vjiCmtFaIiPjQbda70KFPVnkeSUjmmBnrHgZGJJLNYM0YIPMEFVksO1lSg2xMljLex8A6GaC9KK-3S1Sd-BhdSNGmok3qdfKvDnOHflef2ay0BK6wNVWOAV4ali19dTS6ZTxgybBOm1TXF7TawzhdsiQCJjUW4dxgPav66mqzv4Z98RYkt80w2w1DSGoYR1xkg6lPQCc1IoXdMMkEoDgDzE5R5Bk8u4V7wxngPc8qnleC0YNFJ03mRq1qr5I_ssrlN506kFrnWfNH9zwMArmiXypQltpe1LGH66xN7rFTlobmgGasqVpRVauvw4NF2mp6DvFp3wWddiBsx8znsqeQV5I160i-LpawO0m9QQIYyoWPkIlp7cB0EuDBHhI0n41ayTbnjoRsEkbGB7UaFvMM91mhdb0Rb0HD-0R_xpTfxnoQShIHUAxKI5tk_oZ6Om4ipjnalJc_6yrsACFEuzkWT9WLX4WOghn75Re7OFRhzLEShfuRqhfRlunw6LvhovrI61qvCJblNpCZmUhBBHyHxLnanQ4KwUlgf4huWfzgyB-7R4XM1YxCXALjuxnhjQDjqDDEGv0GUxkdf3bYNdcE2t609UMCjAdaDcBQa7OX-ivuY3IlctyFYElmg6ghYMUoxDXvT2uEUiM8lj17Nb7ZfqeHpuisrmuwe2N1OqEAwM4anUAUuEXzt4FDaUfcZTttWD2sPgu7jTpLtdt28WH77Iaou56pMFtftuFqbGjMVwW9rad60KuY5fJ8K07cA3tp-VfY1uUdASoriTVk_OzBQYpEKtT5FN1Z5p4sDnXf1rLz_EXUyR_RnPFLZUGitcFNGqJOj8NmLTzY4rB7BtXlMF_Z5cWURX7syfa8qKnpk3luq66y18sKgVTQT5QQ6VwQCm66x3k7RI6nvRRx0sMiQx7wEB99vt2FlJXRgXTXR7OnGEO8djfd8SgxSi5OyI4e6kjzqCsxto1f6WunpN8rrWceDnTCnzAQ2A29uv9wpzlYygpEtUCAKxsVUV5eyJPWvrhWrrvR_3DmYstK7rz0nuNpQQfVvwFmCLUbMRSbEOegYQgAJV2Djh9x7uWNJSxWFa7_V4qLZUmPS6E8XbEVuHT9DwuR3obmKPtZhU8vDH3Zm81pVa0cpc9NyGpFdtH5mFs0sCgOnFiUKm6CMkEtoHAXzBYmRlzjNdo5rtM11WwVCwmdk09stRcV66wzA_JMR9vG2Mz1-upgaR-dYO7HtLqi_h6eIYwFs0q0-Ly2schH90cZ9AYm6ERWnG4NvvHb93guMre3C6GerGaH2qZ0334Y_difcGc6k18pETcFJcK6a-A5ruFljIt_-RUi8NB7R-45gHc--qbYHRfyapqLjZAt_GIMyaMeGqw6cdrWfZvX0y40sUAx6tjiCG7qUNRV6ccqrsTb6J0pWrrhsAIjWQFOcSPKHC7ezRDdwan8bSaEoJWqgUu6coBG9Nfhykdu_rcKyB8iE6qZo1YY4a8tJqUbOXTGBMQ5fqWGdpHQSMcPcOVLAgGSA_4CahNjDyCZYnOM__sIKNZLKlM_cRafIwwVeUUMGsBalWbEdWMbRw8QaXlQ9HBMGhqFGENg11itsukTkiDGaLWKLAO615fqoL6LgCPE4r4xZIYu1Q8JabWBjUPp04URwQkUJ3vwQsgoVsOv3Glvb8kaU8XGC_cdTZWkJrF-NOucNrbiMli2Ahy1YtghlY0DyjCVM4V9wBRGE1uRgO-YLdaYWgIDPkYmLQqzy6LYtmFV1jI3AihotPfqJBYJ5NGI7pZ1kNgbg3sXhk1DRnZhQ7rfTK12YtR73hTaYUcxbGAhvTvvhNnhXIWQwKavGAyN5WW9NrbCPP7pIah0ipu82bqn2qFWU0IGyxI2BqUBSpks4hNOSGlyeHoDdN8ZqZrRWQTG0NCMpII0MnpL95gXCYb_MJoybuAcGyIU1iR-9zOdL60YoVq7YuUpjmUwJVcIz67uMe3Py5x0QmyN6Poy8TGua_qjzFIXsU0dqyoSS9kyVljXYxjbh1oCFbAbLgocVTBURNl6hyrbwa58M6JBZjEX0E_W1WGOjdI3bT7Twm6Q1ND6rlPcMnNMM7Rn5tivnoXsyYdUvTtRgeTqCqzQNGFYLzfx3eWXdqFQCqsUWg7NTeUKknjlk9DHuhzPhy-xq7fCovQsPvOXrOUXttOFXhvxIJvAznmpf2uuW1hwDBzFiWFj62YNn2NsK33zz8yxecw7ru3N1VOETbHSBqc9hBDgu8v5hVlMZWW79A8zi_sReuJsholmJeRzmF6OTQOyUL1JkX3rHcm8JyaD03qEYbxsml28f1TrbcWHrPTT5WifIfsaugDpoDrNyKqkFrSyDo1KBZCiCB5kES4b84V7PlMzgG_Q81-IHUuxu-DiRjmX4Bxof8gf-e60EzUv7QTGwh3B_4EqM3VcPIQdGf8rNRznRgibt_DziW6Ou_atVI3AkHj4ZqpQqimxrkCJGleQ7iMvVMh6HGspx2nmgbauOLG02BJJ_FzyRRyQKicMU5SPdIGB9TVfLGugQT-Cg-9lBWhSOopxjVIY6tJsolpzZiKrtTKHMNnErqpP4nIbsgdKCCE1QmUZ0oFkjXzDJrIR_QFBDhDok1UcMKnM3Gu0zAlPSnTxj7A-2fxOzId6gNNyctUV5gxSoYTUiFb6nbCVkCvSUVYpleU4iD13iw0NyWM7QAWyRwPJ8JfwtiL13sIEyMnBp--0mHFC8P7m5xeRHWK366zM1SYm0RV9EqLK7Q4tEiPTqTFt5sS6F97BJTS0kvVBUOojkoxTxpTmeIldtkDwuyiKbIpmlPZi0lvfNeUIfaX7iRT_4LyW70V9k65ka4WeofdyYB9GgZ_oVPQBCFso7kGBwH_cG5KZmIsltR_U7z5drPFBojZJXqmogcC464ASIXNuQlAwOQbqnmVvM7eVfpl5J76nisEX3zayyNnY4Q6pF2IYVjiYYoeV7PFCnGPjCDNubOPfdYQDClnDO-q1RTlgUNyWtUGBlK88wQV7phjmNBnjeHuAPw_1yeaqT8F1FTrCY44eYxTn-zjnjjJoa4uvOX24EDSYy-NLOlcSATEj4Fslltv3SQxunfIm1xwkL6XExgGko5vAtEEy2nJGs2SM3-HRRm1UsYSQsrR0zHB3iVgpzc1TpYHzyh7Rp2nP1osqF28ocmQ7ZDJR81_xD0Ut32nVBA054UO9zQdIR-X-Xm5HTRCfWdfTOOcWA0yV7bB06_VnrOBJS7mYSFerr7hFbL7VQAoSWZTMG5s8y8AhJNoqWc5seMIVU-vmcze74aRLnuvhvSp6RE00u-gho0wHLOgqRNQXRP4Vjqsi4Qp80Iksmv-blo9bH3-orblzv-IyvrSX2tqgAa8jJxvJVFN5_tag5zazEl1jdLRcg8Po2laVvq8lOhsQkGVmwpkSoFrv8_Wk9f1vjUwIkJ0tC4iowlhnT1JcfXtSr7ZJVWrqxZ59vhlvZkmAi5lpOf3TuqrravLnwrmFsGB4jqGPbwfmDhOUIJuVc1SeO7PewcWUN3kkh6TDhzti-39-8VG1v1WEeA0Jy6oTM6VIHEF3E67r8aO87MlTwx2r-UeYD7QwrO_XUz_9uTKGKJf40iMAePUTfu-IR5su7bAlPntAY1JSWWXzA9MzS8KfzIhOlkCbdNiRJrTRTmIzs0TXJuSXf3evtPTN6Sn8xg3SG-0ZX9zwqtXk_7qzhrvJCICn9AIvT7sEN91bdlRHXIzBTNcfRBv33Rssm902PXCjltWotxqfmGaey6-M6DRSnwPjZ5U8PCPb2GJALxSTIinDidpennbIdhOzAVwi5XbkT7J8MPfWI49S3l__Tx77hdsg90qf-0GKcNA1KZlWDuVfie-t-70h9B6qzvIZV70iWGBldK3OaBjSUXpTmElh2t6xw0SohFAdDbT4lrSyURxo-aZqwl_oIzNUBNj5SArdagYrTIEDs5IQ2Yn2clwiAphjDnkJsDz1owBmDAEy7ZRTTsrJh30jf0OA73nJqpYJuxlLZmJ9fqgBen7PQLXZU8hH-CFoJxSEq8B6E86BfuhD7z0AESxMaUhlV3OHJt5ksjurgEMQvBktwLE9sWY110iyyOqop4chzUtDSGH1XyIoWgNfkFcwf5hWDd6yPskHXB_Wm1w3gRyRwE708RFauo5xjA4xpqgRaejQFNwJJw-TRoo-gj_Yma1aq81cSXD9XE3RzToytrqNKnxFz8eSdbySq4Fs1lDMjiX5CXRoPIVpLDdUmtT0wnOrDV8UPPdHmoB3WR6t58_r0v7hiamcmG_sgG_Y8LwL5qQPBfLfJ0eiQn6tnRLjmAr3Bt4b2tyMXm6455hgOjPxZCHuVDEuIjlshCZhZXXJuT0aG1A9AME8Z2tM1bK4V9E7-BcM0KeaiATnZqcoTgNL4m_QH7X_RH4jF7Z1ECOfSFG0fM0DSI2E0p8BhhyCV4ZGZRrp5AmzQi4fbnSfbJujAOPHJ2uYWgd6s__ud9MwHVOzktRtNy4h8_nudSp6oWcG-EjoppKWSdDXI-JFvb0cBoxvhoRFSB6Urlr8sI05vxeac9Gtnf24Nxo0QTQQ3PyuG01VUCT8cVOTQu3o3aangS6bSXZMpXAk0H7L2RhzlNOHdri9gCtIegUCGwaGCH0xk3d2uyZuZxIbnQbdEnktKmOR7ATrYhhaPhnkzNoDlXvvEYzg39vN4EvVWf3XPcMayERSy3hgWdCe8Q_s7fmfE81RWrmnQEXsFsQQPHc8Toss90WqmyaZUOqmtoWOTdNqmrULVZniT6WHT49fa0ZGhNFCoHWR_AQTWT5DlEHvH0zd0Sx8x0Zg6X9gqA_8B7fzULeU-1Uh1TC6-W9VpUg_HHBTJ3zIFxp0z8jmktsz80m0OzmCcDtA0fUK2FApxY_lEYu9WutzrQreGfNaRIJbhHh96QgUD2V12T4nNp92ROVS77A3I9_GOLm3d5RTqY-ZwA-egrmQVZ-eFjqgY8rES7orO4GPcf-xrtCxetWE4iSPnOT51p3dsoru_QnzSWXQ8WBn86G0NE-lMqT6n00v1toBX2nXeBcWfllEgcJywR-9F17WSvM66bePh-75b_EdVhd46m9CWog018h_rMDYjg8FANTg5bZLcxwps4uIlcfd5ajJbiBJvAmshPMRX8FrhTQ75d5G2UOlGb3lkbe6b3_EhOEoUd-8TzNuKnpFvMGLSuKmZlwk2b6cSGGkEcyA5b3UUegXokaJfn2IvqicZzpJy-G9DDmlEIXQ2ikTdqJV4Xj5mc13xZvlkli_ZUJJinmsrtXFhfe0C7ENS1kDH3aVEu9TlvbIXVqAxGqyP2y6Oeux9_AWSkxheKMeS-DyZPEbbdn6zECk9gaRejA2WGcWo-4rBrKpt-5iiN0PcKfIyvKFuqeEabnVwy1UvboRGyavdy9VCS43mHYRt1MsbLFanTEh653aeH46lVwYoPOa03od79jkXr7teg__TuGiB1UqN7lsFy2zgHIRBC9-iYgoLszuQP-10d245OcRDYGrbLVSMXrS0qBiXprQnqUGsRk8RK7btGIalMxGW6g3BeAlGfIrvJIObOzV6JqYfVK3k4CF7DaIFHfViti0pN3uu6f64UESyBuCA_3cI0eg6IxFZMt1HqiM6MMA5CWVnmudKyp4qyRNSSYycd9MmHB5Y5Jqsmd21uirlDS7_fsFFOqhk-2o45G0qgSRTO5te3UHlH95jY4N36qz0W4_88e6p4bAAqTHrNQCmYBQYDBWgGSPI8GFuHKfIhi6nuxnkjbzf70fr9ocZXYEKiRRxwlJjiPu-jhekkpX-u1MVkUKAO9hJJKwLnCuuyEuklE4JjMxi7M3HjTfWd4vqBRJBB-bKv6KjpQtJG2xkXXPrVFZprn44IlRgrf1bfNE-JypGXG7a_vSUZtvGfOCjNY0x_FqWl72CORNZUHOVPnZt1gnvIrzbe9mGJy_ApsXOxCc4bP3shrkHLcBM0CdI_0jFQzm9kxilj4XcGkw2L8BFuFehjRPn3LZt9dRe1lN16t-szt9AfPrJQnjZ1UmTWYGuj5_LHtmRzv-wJpi9qdoPl__Ez0q58CswYXbQuhoowtpPjU_ikS7Sw_G4Xz6eUnfou9JOqpa7_Q6ZxXeOlbMkgOCU6QSBqlHElCxgMFS1u5aYiQ-YkZf1-EF3yh647MGw3VuoZrfYCojMkS-6YxTugxFgNfmCgyrYmOe8qJtFaL641zgU5ylEO5pTnao8ly8l4mJU5vb6StfGzQCc_2_g5tKMlY_hs5LpUeZ1rcYwxxyvncdtUGvs_AhAT-YAuRBO7Yf24lrOI8jTqBMt_E-k5yxJ5jqyFRaJ-65eFQlV3YEDcVGMQ0HU5_6XMyAKQ2Mv-jkWMbU1ilPBJC146GGetBq3nccLStWlIZRCppJrq4KR2ijBQ9YZiYHsdDJylzEFo0IOIAew97TY70spzilK7sQ7mAnnk5BOoWBs4jc7sTHBWln4-XUZ3EeIu-oEqvWc-8TyTeDKziofeKu-wgxb1Pvvfj7oCeqtxYDlF8TJuLtXMxgDeRXzxKk35p4sOmNXST-is8i4buRbb0XxPElPlylC-TwvS4VLNeBZ9O545x3oCsx4tWpzsOwL3MtsxOF3Pm0ADmeUg8tI3nfkOTlZTaP76Ruve_PBC0-qSuMTMJIl1eVzI_Z4cyub67QQb7PmHvTvG1qfQsUw7FvzIlHWbIgMsjKf2e9i1VJys7Hgqu6nNoP31OemXlP9ewc08QEynWY_BmeYBBEAV3fvXuxnthlPncdGJg9XlB-dt4ml5HAClTbKpeSVhsXR7FD0btktHmHVpyBjQeOhdxlbpixqg27iDL-u0ZR1jSe9SvnFmevV_oWDmnWoSRfsKj5qRBVlASiksanrvh8TsgFmYbhZnrztwnkyu72nTBdDrdLLqw4XpLQETr8e_vDS-xBxBQljSsaIqVnR2IwluKc8wPnNSHgBwuo1rwC2DD31M1iyJiUqRnt1WpvdeTSx2erpt6oCZNffhpEh0vuQIAj70hInxiKMAJOafRzGReFQG97bRYQla247IeEoFO97Qif4XLWn-9TBXawcKKGge7MAF2Bd9bzcwZKpFD6bUmW7qLNOBtl6kyoAKMfnMRI6WnVi8qM9Mx4JR0O_fAiJe4PuHTq066hVJ3htQNrIv-w-d2RmqvrZsiRarrIUMFZpaZf4gu53Cnn5qhIm6AsP3s9DO-MHVb9odWu7VBAcUfhb0QcUNoJKzsZ6DLSimYaCDToJC4uxL-LaklVAQmincUN3zJqtNODLuGMDLxg8CwxgsQvqhRxwIdRvIWoRekkKQC1BUkOZrxUMWbZRVGZTHws9Ppvet1kE8bF1_Y9O4aoaXtgQTKfeuBhZcbCwJ6I2doc4FYfVgzYVLy4OVg7s-iCxK7NNX6pXzcQ2h0w2FOy6xGAhJIajUco4GQdqeE2dzu5i41tO0S-1wSuLFPp0xYBFOkCuNGKVMXcL7krJm2X9H9lwB4VB0QTM8EKerRx2NwrGTvdhQS9yM1ZyaGqXVzUEKc69224G7wFej5tpNCwBfAJnQnVXPEz1xWtX-udI3cijymd5TBJettyXW71f3IvFRPAUzADKBuEn4wftHQFYr7xjYwOCjmK8jNeOVutlDuT82O9mM8EZDEGgPETFjSCppcY5_02Edg0fihZRI0HTFzQk3RhDk-_3bND92PzHoUhXtPxgZ7bTcGjxzx2Lh3KULYZUFnXozfJKcSpJ_OoTrXXbrOy7gU5kDuCCwaGL7ZZ8Q3oOntzpCSKcd4X2rGTfNPzvSH0Jm1-0AaYApu3TXInSLkZ_mKUMwQCdAq8P75IvRiJLSC5J1giWPpbahtc7bDZ-2Aniz0WMIbmwnpQWrcpTuPZUhyjvjpJZqYLqMqevxt-zqy2y5UM1fwKaTDH_phgl7gnyGtehyawec_TPZGkgBChN0Ebq6pIwBYf5gIFRzRSiOhiPyo2GnCvGXyDhJiz6SSMFwVenlJO0TwpM9XCRVy1BAd6CPcJx7qBGp6rIiDLk3alTTXe_iEAH-a8aOKxcMEixSTxafXgRW7vIZc0DVap0O5cvOcW_wBCaLgI7F-AJ9VwNdnsEhxiWqRXrsY5g3WE9WAvyQJlOadXchbss9xdO0FkMBFvSfRNt2u5y9O8opTlIqxKwH71IRcUJnMp9kJXMS3B7l2i9kHN1NOWhdL_AJyGEx6OuZGdz5jcZ83bPasfQiR4YUECZbMtYpmNSli7z_44We3RgJtof4y77EA8HjsFYC9uVamSuhiJeX2bmYKv5fPEJJPGBXpm_U4IfARM9BLlcBl6lGWpmZmgrljivJp3VYTcDR0rON0oDXd_uHvpXkjlNK3J5E-dwLXiJCkDMYV1cwqtG81bouR8DiS3kQiNKUCsCytBNJBc9VKDrvQULxKWFYNGwFPf000U4nYLB2nlr1BgoAYTjUxtIRZZryoKPnkW27pykoxdZDLa_MZMcsmZyCr6OEF7msKkeFdbobcUv-pxepN4FGnNc6-Nb-e-hvS7rjhsDwPNkbo5vj2e_VFWobK3aEJqYmF-hDmoUO-mv5wRS23P77eL79SENZhtI4qJPiZprihSt9LTwHbPudeGsjMFukALTiWRBfK7_aMxn8fNafUvZ-vaSIPVUR7PfR0-qOwQpPbWw6Ej3lKQDndVziFI_V_3ZcUnEcJOwF175Iw_nvXLTVN6g_TwBbA8U4T2Wf1pZpXeGpnzmBxdjrsxNfl5WpdNI22G108Q44nKCpkLzG1prhHmI2U99oKXIni2Z65varhTOxshTin2TFekSVeCbuXmT52hyJK8RRif90EwVDW9xOkI4fOzUqKAMeMtFzCFNsXPtkeemtNyWm9CT1MDsDLhWz98nFKCKba_19jbb6AH1ZluSFSapH_NazFUB-OGYSacUOI-26oNhERnM5hKjlMsPLk-UfAciQ_nW4CRtNsYhV3fQEukE7IEfW6Pmu2NKkqIXWI_PDfJ8rX1C2foAQH-ambA2BYaXQu2DgMQCAFD9k15CHjWS-Vo72HGeOtJr-hmuRy4obJwiwE0-6RR4OJ0cNfQ4g6WaTFpLXLVZTmjjeuNI7FOsTHkdshkN4nH5mBP150KXf6CuNB61B_H0ZDkJQHqYFYSHUP8nPrZ6TzDk2tRxG4nZOHhwDzZic36X_RtOLF-STSygv-D0DtMKcOfdndziv1bXddF3ATkwx8a6bSkBAZ8_TQIdO5fPVVzGq8ER39nXIAkV1NuVCj2s_doBxw8rEsF32X-gsttw9ntg3foiqWj72lsaruhyuVg7ZXmtFQtDtP_25jOnFeoKtcZPo-tjCpIPuzgxJaR6yW8omQeMplL1hQXAmCI9-hJleYp_f89WTABQr9FJBQO7bmJh-X49bvu9CyuHhL-GJozQK17CHZ77owOnq5L0zRfvsQf79dDhzBNg6gf04I74wXlDLb94OvGQP_xHsPQkMkXS3stJPIAVLe-e7bYoRUlcRPor9i2VYCXeJ0G2FANY6EtyS2HXWtay59dUSGp2YUuQVQcqn9lFjaetyVKVARqcerGb76phjZXOf1yP_VbkilH6soY9MrACJmJDPHCtDEFISkKcPFmAUQfjrpu-SnWckK2DCroSlzn8u-a5hJWeuSa1DFT0ONTms6TMz0-7TKpugoQT6yRnLdrXFAvaLvnyO5vJwDAwtc78e_rwQMtuiDJstBWaN67oVW0RseHkJqCQeByIkdLYT9J8w9NBgdT4BKuw9zdx_IUsGnEzSgWq4m0WApLYPo6I-HWUSTTc5gPx9vJMWXsZf55ESo24fPBWKzSKucZkQiuJZr9Drc88OxHQHaGlE9olDmjxLcDe8KHNZRTfss07Tu2iK1NHJwCbjl1rdU9WyZ2J8lB16BZ2oh-JWcBzCLokCkEnIsVCOJkEB7NiwTJ9LajTnHyH7R5Y0vkwDA_nXVpUmq14f2gikIF52w4WNNPcdmdnUziG3pGrVzXMIoSJj42MFcZe5RzpKlUcWibEFRqijoqOYw1pvvVhGy2xTaIk-bwjeKRr00G0A8I8aWgr3w_dJIHMHQGdrhWA3dyAyzdamaqTSArG1QIv3MMMUSQi1TTW0Eg734JPzP6MFG23wYQFmUdwCQJ3kHoK9oSOJmdubAmf7ErPvfwuzt2Z6uulPEv5ZmZTMLe0Wb4JfyGQVPkADATwVxwXnx4INA3Jbrf6cUzYeprV6d4gDGDsHOgnfMGDdZyKRZyJ-pb47ib0llrkATnNC-S1jO_wxUiZ0HM1Plh-yWMfcYC9psRpgU3ly-zPjQs1d3z58pvA9kw5jbzGzGJrVWY5d73nY2zOkSxvYXe2c4fzU3s5i8qyXuCtKukRq7Ft3ZL9WbZ4aH-e54LNIMN1Xgn-oeilm0Ej2RsyhEercqVIuNEjWrHSwYwBhhMfPYclE7CoYY3irDeICcrEcyQJ-5ZDOKPP-60F80IEsghfqJvrCALAXBBYbKGApoXjxiuzAh2SsSYfbGZSoom3KZ9jKfrybr85nx3OT54xc9fpa9JO4CYWC4-ffSrUCL8b8WZ-M-RzjzF_h_D3dNCe849Vq1_Bwgb6rbvMDvEnbWxaTrfTvqM1fpyNHULZHyRe27tKerekmzvXkoVDyjphkQN876UNYvf7fFFClAEih2v0K1nx05TQ8Pac0ottsUTg3Yx5Cd8uJQcOupJkgDWOtB9mDID5IO9fgV0kTwKCNRTIlKPCfQ3WHut6edz4xcibn_ogSYKRI6bQ0V643fE6CepkslRKoN2F98RDG9-drgmLo4FdmXI2U8qnAWnMWwRq1vEvZVl9LHUuV2iguNyVmXfK8GMaQBioSThQaYb39Lj49bmhlHzmRE8fBQbfNBwf6fWG3UQw3HW6AHEnMqE85Roz4x_XLAuOQsIoLwapsnpOxU_2qmK9CqWsEjfpb0_MJPQZLiSifQe3-nmJnfa35XxJ_p40cpGbjCJns6-sgwZ-5POFS9-i8QMi3Ot_pox3gfwV6sBJmqybdXnNfte59NhyJYRQYyl-oNIbWG5DPLTL1UTXC0O82EQjZngPUtI_w_UI_ErjCjdp1HfF_oO1aB3eLlooDQ_cOUQ91fW_AAuQEH_mKmb01GGuAiM4NJE4ZIixRpdSkTaTNQ5o3hoVz5QmGNwtZn82nN-dhOD_H42HpsTK-no06azvXnLNpr1F723Xudjc2ZV8XUbUwHmOGXfUBFNrKSDQ1TrS_u0SE_H9fDDzADZlLksvoPZwJ7lh-THvwIqayY7_TXtVT5SKn9hH2Uc-5aICNSwyM1C3dhRjXcJ21EIQVBHBhMtMANuE-rHX8TC6_tqAhZ0OHs7UvAtyftOZj6wpEQWbpPAPZFz6ZNC2dCzz3c7TbS0v60fhHloqcXweS-w-Ivwj3p29_RQ8IuwVmDzEhqXnMB0i-T6zJYGH4aJFO6F5V9cQyoWyITHPmIBoGsEq-oNLsFiOKdnEAztTIXA4OLzcgkN_lRhN33jpcIjhVCIye4Xun3Z6GXSgneDzI5okVp4vmjSSCRDdV7v6ChVQNkmzBgCV-o3wWTTuHwYYkWxtqA9-8umN7zagNbsEtQK3Nm4UmivBfh65_pmg8rHZIuljszsFthi9FDY6lbWI_gq1N-CiGkxyY44N2Fa8iJYUTIrd2dlr9Eba1NAofENcTzu8kTgZjvC-VE4LGLU8jpMBmfnAB0Otf81jjEUH0hXzczCbyEJ1TeRV3jPkZaWkr6K5jNx2BaV0YYmNveYXiFQ8v0ogq8UtLtpMsOWamdbJQQu_sBLcvePWlJg7x1Fd3h8KDvJ6f1eQvz1ZFxluPi-Oe_Tj9WX_qWdIiLoAstrzFIJpib26bMShTraFPDVUjLX5s1T2kSbOrKpg1CTaqadwf4vqUjoGl1PEsqMz2tLKHApYkZpiEBpPoddqmqsA4kWR4NQjmC0lJ_L8vB6iID3c_ajgBdVRt_f-eo9PJisH1LmP4_I7hLYAFAPmcwQ6iXBfLJvSyCEdYZakpPDi6Uo1P0QQky902ua3K97wgWk1po_7fx2_8jNXAGmuKePn-78l3Jje88OYqU_gKitDv_DB3V3Bqoam_kPUlMZUIoTRgVyKZ_oBimu45HADELb3Z6dZVjc0RKSA_QAbHyPB930BdL5LDOQdm9b0yLJEiiGOBE5zE3FLI37bpCIsKJxznzXY7BXi_Svmar0T3VNO7VA7TDot8ZepEFR5uZ0plq7qZ25xvb7Rf4g6s7ENBsWA-djzOM8IvecMky0tl17lfgi32_gYpINh6DpPYccBi23ObSy_aXqRvb8H_v6mGE6cKF-mTRt96vHgioKmUugS5jVZtq3XpuOBy8Tw6oEJs2RmgSWBysX75QJNJHw-xCCed7Zs7Y4z8LRfTz9okHAHT_VFBa_MDYLlXhQ4OHAo1YhdHg467FUSiEls5AJcnzvDrbPR51R2BAviiEufzEeIX8GxEsDkHZmXwXiKPHIdYbgQRorHYCrwMZ3UqALEVYB3T7ZUnE2_VFrowWvNCISrorxgyiDbfV6LDtRNnUxJPmVYryOUnM9XibrW_pw9CyBQSWM_oMZ3glv3R33_0q-FK5dr-gdNXfuwgkDYnC8gfmcZZQCO7DlhWUsKQE0qggQS9vJ0AlrHU77Sn5LI2R_9fUmSRIjkIx9EK1YDLD_S_WPElEdq4ol8PGDJ8_Sm_O-_Oe4cpZ0fSII2b1QuJwnmCrX89El_GyH8jPT62IONeeR5qCXXsViIOtV5tGuabTMa4GHQBnsA-7xYsSyiNSxlTES79j-yapm2T8tp7lh4vYWXwV6IPkFkwQO97eFwSEFVfqxKJu3Dmb0TW38hJ8FZ-TpTT0nz5wyd54p8sW4rkHugqdQs01UkVCKdR4C1QMoicjTTqvFwkFV17jmxxQKxaHIbVVSma284-hvzAJO03qk_2wazy-vtdwjFKgNocLoAlXf7G_N9XJXpI63zMQpBbHQbRWQApITlrjROGlQt77ZeH0iHMHw9xyiAWTXLC5ArF0LV2ohJyt-72qPvJQht0j-GNGCvPlhrOnEaXStQ4TXdJpygoxxFN0TDHqryBzNsNHKXU-UzRvuiou5X-moxGunhxMdxfNhLkBwE1IiiLg0OrwgDfJn_URnssSk06JvVtjCGLxvZFU2d92f9sryCyUKmYZtCOvpj8JtSGr47Tx3MgbQNWXgQrNpSLIFFyclLzcRfjNnKXXnksKCiGX6mo_vhs7iU7BTu8CDZozQ3vKL-YBC0O3y2EPwU6p2Umi9cOubePUvInW7VpWcvpbXDxXmvTdXjOxOjCe-1OQ5E2M7CC1Mn6zVgWzYFMWHKxQUhOte94oVdkljkdYtWVLDukeUkPgdX_qy0xdGuXDtfwegYPkN9ThOZiq9_BKwlIz9OUdaJFH2LswUhDpLRfV78At508XFYBy8YWWIpoc1oSSJ2heS1xGNj8jPyrDv0QNpW-aSpBZWRGv2QA8zYfUVPGIrEESkSpDjiivNSH4-F5AkE9-tlZoNoAQKb97R8QXEdgEk--aDFeAUF1dBei6Ze0ucGyK0bkImT8rjHSuOLMpKRVUlrjXv2SGXuV2v7ovFQ9k2CkKsbNb4KivGmyVt5dXUaAcxBCIyHXaATFmMkQoE86XcC0klPM5lkskKKpDbOl7Y6iaJoyVLeMAPJIm-Uq82mb8ml84Owip9m-8IA98fkYhm3h1k1mCWWIuH4YqWdHK800FGUlZz3NM3oJz0yBY389FCYTSypQ7g28ozqfyCw3WkgTL0j0Pkh2YyVE8e2BczFgWgFy7kEbEFBYM4Ld258BS9P5AkLZo2HQV7SIoGp-Wrir_SIwNQBApQNmnUP4aoHACa5-SDtSV5xoDzS2-kiH2ZcGMtGVwcY6Abl6vQY1SSfhuUtnpiBwJ_M40vF1XDdvkk-uDTbtf_8QMA5H49ILo0lKP5udlcX-2mkME1w7FRe1184khTmdWaWErJJgSoOLFRzr74TZxrjHWNE1XTlOmrBQfmHrW72eWxxPtpEeQEK1P1xGxsZ--bTYLro6YRHquU2_BM3tASkt1tMrpwee_nm-fzWhVQLSN3vyL_IEZhQVnb1Z6B__N94KLLwAJ-Oi_WIKyYOLVxaJtkdmEDJo3Eevrp3JRCvkkD-ZW_JZbYgH4B85kEy-ChbcN9oVL8DjX3QFXuc0oMpnFGXIOdvwzicu1Bg2bgeLupHUyLOp-4_lA6694FFuSN5P4p91L8FDna49f_OoQOa6e1vsW-ytXgWE7I_OJOl1vkaHtSfmeSnabFLD7Z4KwzOB_8YM6Ezly4VvR_BeoKN9vWueUykUNufwzS3bgWilG64bG9vlNYaUfsXFI-s1Q0qc_ZIs4hj5Uc89yWUWBrSyoOd46lDtbAwuFqjPS5BY0oTNejOG4BeWK3dCKePpOzanRhN4nPmJAsDOUlOxvN4coC_TitXb4FmUQLI8J1RfhV70KUA5HIoU9yVGU4M4I5IcEqmX3_A6gydnntwCANnDcogzSJs5tykPmTlBjlhuUHeUpIAHQexrcTVP0YJ4W4U0K__TF17sQSTVHZCvFii6owNXyavcsUkj2XLlzT8a5emgRBZXjObrboxvdkvzDMtr7jGOP-p259bNUiRdFVvRXCYOTPPCiq4pEQbU0haESuexRyphcb-BuLydqk6DcjMYIucOyVcETzpNii8whj5QM1SjLYHJYtjEh7i--3S-rkmBMvmLJWsmq9PEjGqbm4_w0qjvpL2KGwoOsSlK05TYQNXDMDsBjAlB6Z9B9wJNv5EvI9lTITNwd7NDpEPwBGUgvJoP_dBexoBKYiaaTZiMSWeGedbncHblzMAADu0u9oxq8mBGMZJd1SkpxKKB_gqObJ4wxe_TlE_LHk5EEnsLMXSrnfLpxEyezvTh3tadCdIFlkTAM7S9JrNTE7vYSBked66kdJRbEuvYL6Tw6unbbMTDXPa1cxcfknsBxYD1023ycz9u6H26DOJ7ZS_N_6orJ44dYOPY7KmCT2Xk5CTVZUEXIwHoIdb8WEHAuGMGFtwSCD8in3zlGVp2FlB5W_bAhdmutOJxgedgYJgfmYfu4fPW-Ypo_Wrtpb2uNFBlmSVJQ7ywYuoP1cDRu3atTtt4x4i2UCeQcal6nYPPVB_BGj982lbmkTk6x0TrjARUkN_S1M5gkoTx3GvGpZPDhHY5zZcmR3_zCLcSJESll-5WrIVzkS3u0H_Z_z0rr3cgKemFwKBblTc4_hcN-vA-htD2DuUXeMPx58SWQqjQcjlji1Noeq61kCneYJfTSqk37Irz4A8JW3J2w0r7VibbzFt-e-6d7CMiFNQ6q1tlv7VNjnWhvF6Csu9LOzhgQtBKEsirW3-I7xKfea_Ahv_b3cH8Rc6HVVLvNqIkYDzsDBUC4ho8kq5bVfHtRpF5RrNJdYA2NYH3bZxMITj_GeKfLHV-bWSotLol_wteZdduF5cu9rak0Vq-gndnEGI-khKn9yzm7QN1pUhFQpNwdkrYsjIncWmRQRVBmXkGhrtVBYY95P-CfNAQiFHTFnnIApFfO1rsanu6lLLfqJ4AplRsqOJ6-CljAIwEdxQzHqLInylQDEMTKbgPLOWtBykeOZwg2nMxObNJcAzRXqvJ4SezfhTuzZbXvFQbMxTHgTH4QeWICkgAaLOwlBGSLRnDNzcsLwt9vJIpQQTUSuInsGNH69Se1_jC2xb578ja-OVfxZWZviec794IZ5lmmKu19m8Sph3XZKOp4_6rr8HCn1qjjlfKq6WHFdeH8fuyR847y00wy3Uh1iksEJoufyKbIa2QAN0UN7iYO6KxLir1zAy7hHBcQziQqRHw0ef9SopJ-twjO9gwcmVoj34o9KZMbK7smeeIqDzuf3UTxa6nVuoEolSnp5G6FFNZ7RxEJttucfO_6QXH19Bz4JPxLMMVHVsAMsyKzGwBzYhjLxMYamDj_KLVIfOgARpzddATc02Jx1Gyssx-GKqvh2VxYhlF8YVHqMSPJO3wivjfDKJu2LObplQ7fc2BM4NO-OIjcH2Axv26dHQh8YVXK9DopPkY3d5nXUm2JzPtrl5R3BvYqcJKhZn1RLEZi_gb5fEFuW8BJZoGT5ZGtBx9OHd6mSkDU13HDZya6o2xQO4NYfcW2LKkv0a2JG7run-QFB4dIqMYEOPYiBvVQPr8RmBAgtFf6ALGPv-Oq74YFWwphl6yrs7KuCC9HYPU-A1pKbYiRQ4UDMRxSuX2o5e84aiWOR8IgNQrFhgLXAp8S1gTa4CVeP0NlOPa6AAKIc_j2c_UZqdfrwwfBIKh_ixrzwOoMSO7231wbCDZDX73GRby5FThb71qoMk0-ueD-tisHaof6pp104tePT8Vuvqy8hlwWCJHnWpmGasppnHE-JYpdR2Xa6SbIB9Gkdq9ZIpCJ2lIgZOAQx-rGSlECpoiG3yEyDZo1Bb-UEPgUzkSXTQD0hq4SSZRMwqWzUwvDoT-c2IA1PCx8KWhM5S8o2ttgXOSv7m0D91tfKhvmEdWnXAHdWNhaQ6BkRFTUX6bUIiRsCshrIX8vN475XSUjT75nRoKCZmsvd_0T2chI7HfDeHT2i-QIY8_fB5_gid8mO_UXMViq0BKJT7yPRE8ehAG1SzUkrQtix3-GcgBN0okdICnaw_kdAeVgHm3H0vXmK2IMC74oZIy_gTrEAI0QEH5Z8WRSfs1sLyRxmGOHELu9hUMOy263LrEF49LNTVWidXVUMBuKSwlisjkoJd0qpMfiI7Gfb646Gs1GC9e7TcIFp7gjUZABzuMlj6yYr1kTtSIAf2xn00yqGNreZ37PhdXlUB_mZ9CQoVnqBn3nnK_RpYjx22HDNqgza0Jw6m9_uWfEd-bjwCIlYLwgPxQv_Q1sB7lTDyFgFqDIRVF5_V3-XNgOgUEyGsjTTogeEOkTPQ2h4AgeW5dCyuNjIcReQmNNyW-BkjPQhNBAptSyo7THuYZP5skygZyPh0dTz3Nyg9DcWhyT96QZTsOV6FDcaVH9YeBAmiiPblYyb1hzQ3kI0fZ0aOfkry_vBhyElwxB6WlSzAQfX8KVABN6YA-WIIiseAqSI13l-DRB2x3Ksp7q0kpSVpnSAG0uFXRbv4A0Zb-JoSbste9JEMUbdtYoG5Q3xt9B3lfkSnVxn1eeoOf0kjsEOWPIKz_K-ibZ_IkSoh4l65Hq2yzucnbsADH6WuqSpfhlRZ8Vn5budZYUme7r9UHJ1l5UuIDyFeS16m0V4ec4bG12kPuDJKI0f229GCjJOv0Zerqe04OUsZ6VK2QMmkJi8elPZm0Odxw4mQQE2vOLX3G0f2HG_eXQBEmrtQc3TGrPSKoFpfLZkp3c9cxIgV1TwyVKCMdNrhJlyUNSaXimIGia20kg-LBcMFsBuXWZ9V1xUtg4TM5QwGGZn7ApfZ4Mtf2ZnAMzzxXtFE1sA3kPVcS7dp1C3JW6cbTicLynDtLS5Evu0wJsr8sOxKO_o_N8EEZmw3wqpck0KHPMn0-q0btlKKbuNuqGpZqSUvsbobkiDHcL4O9Cf4g3neLCLz9jKq31UIaWI034yeUnWWueQBplS3M8pYFigiiew9xL-tQpOsj8LBXO6nscGICVPOPt7DCuspJDrbbEGDI9WOsHyL7IDvA2FfMbDgndQWAnd2CmZ8Dnerl--PACP7WE753LwModC1kOofLjCEmeKaZlfenEpDm-MlWgAXhanyIa0SIT8pjDmggtqxuMyspeRxUyxhsVuyenFz36jbFEN01qcKOZDOHRuZOorNl7ACBEFrZjJBKawGF48R7FNyMsZwQHifjZvZAC2V5ZqkrNEpukuKZovR5zJRF0YWNEZM1nsH9CeneHQdWznAJR1kk2ZAcHIkkAlfZ4CGjGQXNKvIeF6dUkyCDXLgYB7OhwKWSim6UaKE6DC0JTSUaiNjS6ikEBNmwLywkZ4r81nM7nFFmP6k5IgwqVQGOSZvDcdKq9zyK-8npE5IGMkvUM8oih6EAQmu9q6a71gNKvxn1CQU2Qs2Habp_BoI_gVjWHpR0DZgIJdFJGIzdQ1sYHNpWn_pNie7x4vsw3ZJsOE39i0vDKV5DMPp4pnht_EJwHFq6kqK5fM4ntizz6WMNgbozccDdMTqjM0PtZxPPU8Zm37RRlqpctwXhYMlbcw3e6XvyN2NqXu1GvXKNFbG09vRXNomS5nu8hzyzywxIMofguCStM5HPAkcH27iBJt-TRtb-9D7RnNsUicuK34EDrlqQ4qWJKkFFXrewINzcj01v9KdiYEs9785dDzyZdsQ7vyjtvd39nx12Me9pR-iUMZ4tu1ZDFN0VA1qsIH8PLjkHS2TyCOS8Jy703F1igf-6RvG9qq7_6XJQBlF_FhAVyn3SKOOy5AKr2YUTtE_r3u7qb1fVlh51DMfcoVQ4yBHLdcYUhvF4Re4pY3JiVQFDKy0F4GDJEowLyubEIrugnyU4WAZASyfGh4rElea1B2WwPBaW4D3a8xaf4yfHue-GwDCEcSXXeWA2y02XCr0UnHlUyuXK6QcAcukGUz4HbJ8fyQU7eJWG_DjXjyxuryiHikgCU29SHAmdm8AlwGavkB5XHxZUEpFL2R-4IyI1UlQ4edTU6D9j_1QgHiwPMpGOU2NSTLTECW3Ob-IPiyQInRHEAPFo96oLA0evLpgUi-7k-wI15KQPUSkYpBGHpt7HuLKxtVGuSfddTWDCFstAFOekelvnc0RM0yfHr4cmpcDiafYJAOb0iRL8dH7_gTmsUpP6cg1cj6pEiVx97eRN3V-044HHt_iQHXo72ug-tafpJidDIriYtz9ueGvIM9RLMscUZ1RoWBvuBtt0njBl9euFk8D6mrDq61NqCE7Q2Rt2Mp2VIjjqGVnpCGKRomHzz_uwX4aUaMIKsKflN925R2esI2MSvfC9N-yXhR1vd_d1FpoA-mVLyVJJyd3EMjJcU59hS-viww8HvnDkNlenfX4_6jhBFpc1aHEoncDdYojEW9s6JsYnNRzUTHnPNcJ9qvzKDZeeGpunkxMUGiTP5PuN8kdOzfM-QU_aSNVpS9J4kB0Fq5uY2H20YpXgtmk5_PkaSHkpOPlA_TYKxYYixfNucCzP31uqSjnuM1t0jpQt9i2X1JeF24do1zBUZIT9zuHyqobTNTTThzci1yPYbLTJl0_xChiBBnpAsBFfrjZuwFaVnVKxMzxjAWG8isVjS3oKOfu1vxd-ApWPRRjeWq1qW-CL321zvkGxHeJByojb5CT77QmZ79Tx9Oi2Gapmk1ytDP840oCafnr5Fq-vLhINLmgJtOvpUxtSmKtHXLHY8iO8RRWQyXnwv22NJKHpVb0MQ-WYqpTMTRN1f7hRZ1ycjgCtXOhp3n3iXr5w8b4lvIYP46vgSpyDf6bkZKfN_hSMbvTzDX3G4_iCJNXF-u2M-fiIVB-4IxJN5-9ynvGFaocFbAsPOhIM7ZUG4937mhUixsofJOnVPt9R4P-GMZ7nDfJc8gHspdPQCJUlMjTz6hOIO6PSOZ923rfq72sylTgL62JFWpz8E4nvz-Oqv3db7ug0WZprzcQYsqOJ6cunvgZpc6kWubkv1bl_zvUV1RvqQJg4JroKGGKXqnm0l6xrqp8RRecH3YPbOCzWAf-jKTm6obwUccjNyde6ELSGCtieCtOCVvF7QYJJIS26Do4ewou8U-kj7tf2wVREq1YVs7L6fpXCCp7TB8HZ96kfCtPX8a84c19MCxlteBi-nr7VE7JIVnrj-CHDwBSznDECwecIjqoI8q91UdiS8fXpphtviIEqxEZReQKE031DMy8E4xDnZl8pU0oQu0s1PhNF6LpDjI83ymY6AF7ewUnTszYcdBP6lOklk4uSGLyXnVI7W7YODhP9jryg8xKniapSFusATCmbnGlFaiybk5tXZXUVB1HxaGW7k0ro4j04-cXSoDsjScHmvm9RP8rMrwl92FcUHM0XVs5CA5S_eK5B2CwIBF7oAFhIUKzOHeHuCweZaECYA27PrZ6Ij8w3QtHkCnEKtaVmcTnlFX_tNLHaP713EVfKE8hKb1lF9hu-gTDUfh3NbN9-N8_K60LCOIdNo4j_ruqElXZkN9xPLXRg2QzeQheht6LovPxcAvNcJECRzM2pwmif82cKNiV18tgCYtqcg9JkbR4Bj2Fsmkfpzm8CT-gbyHT6_uVPpwNQCChNgXZpR6jlRDGbBz1aKezfE4zNP4FOXmyLhzhPewsdp-Rn9gD40J4Eju8POwbn-MpfJAy45k9tcyetg2bv-lIeVmp5RmDnf8QXYhdp69QtWgrkWECt4Qme0XyV0f697Utj0VZSY5yrYR8uvpLybJNUqPDDHBiF_LjNzQ3go9-6WI-s2odv2VRJdM6WETyMF5oPAYOvvtye6ytoifobjiEjk4pySTUTAcSJenDp38REnyQ7HvYNDvHifX_Mk5wBGcHAeM1p9xryhFnK4-h86-ifvFt6ZX11nLeetJ2JveQiJiU-tIpr0kppZBe_hVza50mqDUXjyHsrBNB73lThB9Qn1amGWwdTFJ46PoNv2tZB3sZ7_l5y8rPEq-Jd_0F7XIZlVdRVACQ__aSkzvoOHl0vzDqi_822UWDKyl4_4vRw0Euzy-0C0Of-whMuQldan2ZooqCh2I-Bl_2zhqShJ6ZYwJjx-Y-6Nvxk4qpUYEJ0bI5OMty6LH97WLL8Fxr_6WYW95f7MHu6aK_QUTXMqxD1E3hij396fUd8H5NDWRqI00zuA5fP2DkKg5fSDUOBpAf4Mjfa38p2H6EqEnWBCdFUpIu7vlVTxWvHmBxLEDwM1DU1BdW3nbZaA8e0qNFZ_aNHcNM9jsOCwPGBwkoucLBZ_aCvCbNCrhZbrOcB-ibRbrBFPHSthRALAcBq51gOnukHKdCLiFkWfH3bF4VyZuvqnRoLxndML8nV_PiAqyRk45L2Op3K6SpYbRvIkkE0rz21VpcpDzRYUpqXqDK865IqV4Q04sKEA4d1MFv9WhWvJWfAgOmUqR-oDLBGJVcW-5XEANbBlLtqxWXIHldq1NMmk0VxU8n1qNraMFTUnw67uUCqyjrfieuD1TPeYWSekqe4IUG1FpvuuqDB4cl6HCgZ5NXa6A0SlxbU4ynOgb73Ye1JFeTMaa1wNAyiObBJyCpWTgLt5BWECEfyqKeuXEBawSqQAKBFD9pl0Xogs92MumYHXUs6wta-Nw9AHVtGfhUFTjMfjsFrymZHLJpJoVNr8gjaQQ4wHPwDD4_fCwOuLpCXgXAJRwIzt2Hv42wOjtMVg6rVNNYrpBBQas70FImKcKc729nJsE5veM4J4UfEgDwOkRE2gczKnR4e67gXj0TKumdnbixSe-ixSSkGjQHHyZvbG-HL8re-ZdIcMxKxiCOleNJ24wIsCGmLRH01G-RuA--44pLcSwTwC98nJJb3NGtj-HV5L9__g_9AHQvqRhQhsto9k3C5Jbb1raNrwuw8T7ZEdtQ9eYX2GA_FwzkQU6E7tUQuww6IAkAebGrUGVYWXPdIxqpXwWhMz3j3RG5GZ5lAF-9CIwUpRsZJxbStBROUGY4KDHFZ7REEH0j7q-BiJ11PCU6L1gfZusI179bz-dErMLCvwntkkoHBx-2jEqFvvam0JEEFtPlx4RjHKevOC8rbSrMsVvfcJ--3_TkqdRQwQNU4SI50qxhUTviJ4wMaPs-7ArhzF8hDPE_SnaklMCY2BkRRPIpUn8CJLgH9T9Wyyu9V1Vem4O4rXeU8LSkgrBry7eFa2WLZSjEnhfiI95AC-3HTKL1bPsGyghzJCM7YCV4cLaYFY_Lm2cFpHGwa9PCrYFg_T9x69T9u_BeAQF8s0fARgCSWWeptk0tndytnl-W3AUkx_l8BS8uCTfK4PbyvBna6rJCznKvEJP3iJhTtv3uG-uu-THZL2_d4oCIOsOM_m1ZOCrShYEp-hlNauiDKiUHZc3Q0ym9GJNjCFFiNiLXMaMpBXJWhJULFlF4GfjV__3R2M7vvkHVw60vTKeHM1VKb9Kf4NwICaiFkfS5DdL2cY4lb4fHzgR0saVgMlvQfBra2nzMNDFOg4LG_L5NbF7qt7r5Hx-YCHzeAkVoNwinWP6-MRE1KLZCsc2Rm-nGPPJFeXkCUc4hFBgsI2-PBULAd8U2k2kQkDbNc_w1XWdlYTqJWWyRR6OO_u3vBi-3zQEEgIACcl2L6gWHQnpmwo9xQUGDIiPdYUSmOR6m3wS3tbDIJ3lmNDnh_P1popsab5dDTCU10h4s0p9VYS9WaWN5zfOXLHmfutmX3CiAFnY_LgWdApDwJFNiojGJPD2UFbtRU-H8Gyti8eMtxuJ5xytZxcsZWhZpuQULd04y4gMRsiZDgoWwleny3aTtDvSB9Sk5xE581SjbGcA7Y1890o1lCHLzu6YCOYP0eXh58QW1K52GLVeRrM8HIp0oaLLEVfG-z02F5g_0eK4Ux-Bb9E_EiSnm4W56rg5WxOF6WeaRl5YsMZ8b0tDoqtdyVBQ7n4NzwxE8E7GIYIcbT7He181_l0lX3irLgC_FVRHinBjKmcJAlvkJFtrVb5rz6_hHPE6Cid10fvFhhsPubbLxq4Pzt-3UZeel4J1NR8wpWEOz8kKTr6BupJsv1oGyp-mvHTJW7gPMi57w7Z-vkcmtOKwtvhJQdJhGOB6MD1C4QcsDU6wUTRHth5iAS8UtneLci6pauGx73cw-5ig3DYPaNswS_L4Ek5ltd2fAwYiRa5-8EDlxk60lXpGfXaNZJ0y4nuDSl6AW2c9crYWV2jRkZ_wEXmuSLvcBNQtpxMyomcPkumjWdheoZQGa3fEPXUpWfuC9jfVkJYOs1CV7j_lg9lSCvnCaUrgqhXiD1jpAlljnYsxQ7eWxuRaW8cNzRrVYCEnGg00DS8g54zIIERtlFf9bd1HqD8HhLIuU6t63q_Ff-0lsLVOdpvRUKXkFvg0LMxAvFMTbeaNpC1DvDSsndVA-xFCzmr4UXJHSLkWjVtOLx8Ax6bL195Ak-oEYlnTABTNsipD4txOUUG6CeQnpyB_AT1q0UCcqCthKkEVl-dPfUYMLW_qk1CEUncuXoKKF7uzxbIl8eOeNAbDNgUrF2D2-okUJTWYiRicPtbtB1i8rP9Vlp9M1cS-xCFl01CEmCSp0azxSanxG6-JvZs7sUQ9IsBkZjpQzOhpAiI3jajXsH-zq3i_plNIh6W7Q_dOX7meSCTuho3nJDiyhvi8uagf9EgNGaGCQK6I1Q1wAF98ovDhyX3UNXPRphEoIFuz1tKkdV5ap9426J-lvKQBnlKTXurIsGDTK73l2-tIi7T0OMyztCPGTDPvcQ8np81Mlntlu4RVQu2wyhn2Fw7oryCGBA5DAa7n4vOkhkTAI5_BnrS95rF-X2AYXUHuUBlGi6cI0MuPCZXf-nH0V1-Vt_0b7GQ-AYKfPwwFCcLRuWSnnfvtDONQGpieZuQtcUPW_C5-ciID3IGjwiZFBbpSg4BO7q2-UZ7NmMDU9D1vVgrhS4pGwXpgiWpKW5gdESM9BnE_TuIs7vMBNICrLyuZv95Fagmj2uQr_lsmoO_ut42A-M2n8u73cSflfA7IF77OZ5RnFwEA1T05zgbXBrjs1DagGZYP7mvq8nZB0qhxzeMAXE8WfcwP7F-8cbHHsVwzELkvHPQGi7OufJgUlV_q1bMX_nA9dLjiZiv_V7eCEqnT8Rc3dNGIMuvEcOlu4Rb2W_cgCh4eYhiyAJYapenHIumR1Ac0aR4bBUK8kfN8JdQXDqdS7S3QOLTbCmeun0ogS3mZw8QCh_DYxNhEH9WGHLjTSwCOeo7OnL2B4IjAY5NAYwlBG9cVnzJYtCSvmdR7QEq4qtPfPt7KFlEJwWVi9EAhjgY9Ip76MdPxel8bAsckEx7mjUYARuEkZjIB9yV9zOxqqnrClv73nGHJT8jLNbzhHHe0jrUpPpnWwVIfsJKneQWgN56q6W8RVbHM6sVJf7yXOo23YRr1jL8EG7JvVejjo8bqCWHp8HBK06aoShvJP6_yZX4smQVyffNMLpnGk95Wd638yPQVVtA7K9JPW1uhrLWs0hqYs4EACKjbF4l9wtiCY8bNYviQHqVgdsnzOv3h-BO0ASHv3up4MjrjjjdpoCDdMMvx5QUSrgEFaaFb3j5Z20GHHuDVvFkBNz1OXgO9QFOYDxFoXC-hLj_ciX0Iezp9EO8vstJWLcXK2lTtxfrIe0fsQlniRy5yI6aZRgM-na3dVvmvPkVGxDYycmFnkCSoF5NQVaWIbnr6SY1Pt8bi8Bz3r5p16tJ8rYlLfnCTzHcVAi-flYdvfqShYbnxxG-jnjtIiFfvpr0bKbymAaB514V30sH_2tN5wlqZdxWguGMd-qGgLHY8WleNerEp3Pupv_e_O9gNlDYDLZE83LqCRGQW-NNBrnleIN5zw6TZW9YSI0OBst8sKlIWP-SWIm6XBK-5Rnxypsr8yUgldRVwMLbnWgCQUiYam-zJ6tia1l8PxfxeG_ZkIh4nirxP-3P-8Orha_s5YMQObqBwvg8bqbumkQdXDOayE19vxc1gBIWyWQBWTqTDovu7iaAvv6kOkwGrc1ZHDUDn7Ha3cL-md0Pg7vvi0wTH527jp7s_VhJMi65SthH3QHdMm_D-297i6Tf48NQR7bVAWqc68muwd2SGxbOAWuV_cF0Q6H6CupO0bZxu0KO5ulVZpDnDi33y9QsVaB3XZ19p2_r1WBQMH4eCiPM9mVkagid56vx6xw_Y7RUxRFXK9a2jni7_KlqZmDBK7TqRpl4Akp3tJpd3bcXK-x5qD3F4E1s48_IwFro5UnTGnTLrSy5HL2g2Wb9YLH666gf6a9ZjXnA-Fxh6zGmiLtm54I0YEnRlFqhb2tVUUU1wRR4sq33noAomcRfvjgUpwzUSrrmIUVlviHZxRlZYHt2V4_SnemaS7Jde3YdmQ3WM28T3HTPC4hN0e_c7vlhqfvd0kYY16ZA5nsuX9EUDzgAvvsNEU6ndO-eoQ63kKUSxqfT9BiPy1U5fZDdZm8nkuCICdeL880u-kFxKdl9xQ-Rl_bDJNrnB6WA62HEwgTt-DvvLVSH6LCgsiieHpy7-1k_lYyS_Rb7TOrE3cvCdnenZnBrsDvL2-HK60WKCvd0LgvUu-QSL-IgyilTgCGNvOQvT8DR-DuooAeRW4wKv7j1RW7z4AJeIGppmCW0QUVoPjnRblsieBQmrpipkOql7_1L_Oo7qrhKWJIkn1f3iFnrHlUATByubcDNeuFCmoHQoVpa2OUmfiCfwBWHgHaGHxM0n_XlQKUG9FdEN11FdUiBdwIPoEW4_bxVyQbAR0ZCadRbYK6sfB8hYez3q6SsQd8czsHbXIFkA0AEj4ZWOJD2mVy2Q9Q2CH2TvIDEWTZsDj708h4HRL_6DtSn_dM8eVuXoxc53w6-hPXkG4Xaftg1mQ37SLaiAUfVXEleOJ98az4LZ6qkNkUm8XCT7rhzWFK8kC2CiztmCCVTWq4gpfQE-JWvvvO241pS1MCXHAn4Z0AXdIOxpQ6akuH2DiQoX75Y1QsZNF4zfRmPQIu_se0vfpkOEYoFHDwo75C5D44TB420ZyPAPEznh7gpYpABPOMFeF9HSeMT2cVg2uRNnaRP7yVwrqkoLD5sNe_ULpex4mpJwhX-ujBGVXL7vX2AZw7kY4GPXXDhQFYotAMc4aEWLqixDTw9XR1U_4qBe8MrVswccQ8KImJbw7OSbH_wApesS2JpIemAAce6JoBJsQ8pG3u5bZ84iEQDXaURXgUazNDPfnBmrj_B3JVA-lvZDwsMDNIXh78vZD_7jVOjqadMgPBzFeezO6rKy9dMUch9y0vt4t618wRy9LMotrAvfZUCpryZLMJUbI0SmDYoN9ZbpffszhEJL0CkLgwiI09Tzk9265cM6PsspcPTNaL8NuTu1RZeTToRlgHERNCKuTd8YETH48cWMlgOWRBFmvcER-iUpwNdJOgSOFwDMo8ZNDI8UFA7PnNYdXbB87AQGRwKy-ztgpPje10neOXjuJgyw18hpjw1wSlwJ6mNVcSFiiOAa3x1lmAy3L3M1vbPCHdaKFEoZg8nmdn7eD0DPuP9hxNkPC_rFGFOTl0ohd0eyudKG4989AMAEefT0amAzHEMQILtHDy43i2foh8j44nqZIk25KXzBxBmsmgaSg3IF3LU5wPQTT29Zwb5DM0-pPSoGClo2th5rpk_eBprngs8qnUQNCgLeUAfWxSCD1C2_IyoSjbZB4hp5oG09Uz1oWDu3dwD9Awu5DBizm3uJHwf0rinrNgDDs98V1t9TVIrLHjp8dTZCBBHT7hFTi9WSxMnnd0UmmDXXcGQNw3rw2k3A1cMyKID22zLba0EyW8sMoU8jT8AP0Jb0iPUDFj3dwR1eO-FoyMeL3jzigm1gMVpXbytHS_RaK4bxITRthL4bBLTjrBhOPkahkHK7w9qpytbWSXdCIyHkgXxm-qGoE8T7-05tIE_nL8npCD0qEI4UwvSUfFBDJ6Utgd3LNEoHsWPbTkKMONz83zJHzuSmJljRLtXIrS439sF-zFuHUURs4HoRIqI7qD8sLqvuTRegQ84p-XvnjJTMcRWeVrZUY1afW2Ky98mE81k2uWbb_PBZvzup3bpdbPCjZf3XoUhYkVEZdaXQEF_qj8n_JPhHHgxy_BC2-ZW5r-BDOlKzYEGFULJ4whceqPApuJAzQFoMk4HCGvsBrv3QhzjJrDuFrDsYGfpaaQchaCb0zkbBwKvGIETrrH6hlVb2-3vhVQoh5jZ5hR-PQ0F0pf9vA5I_8dOQr2Gw-UqicycUanyIodtnvC5HVKm6-_9M9UWRmDyoiKb6GlTA1-YKyQbOWuZuw770flFyn6GGDlOUSkoZGtp7pmkjdsULDpNwFtcGAFrcgqNYcw-26Y8kFY5q-5QBm3qcE7H4wAsV6z3CQJvpghDLWO9-tMsJVusQ4BTaHv6GhvfN7Orupg9_TCcU34b_si3wc7KBqN-PLo0zvSTD2qqcNZAUGL3JmIpCkcbWPEz3mCt9plEWo6YOp-jDhyS6EOElobMN8rT47ah183x-UM9cLXrECwCZ3_gUF1OJzp4juLWJPU1pwDgLN97xxonGhNDmlOA2kUHZggWLmemHeHd5GsrVJDuGui-2QnE2FZ2wjiu3GZTpLj4zh1euQh5KMz9sF_24SEQWnz6YpBFBQQV7W22MgILjrndy9sdB4TPfFIBOfQtyR8XBz7z5aprVlzKu9mFx5hDjHfIhFh9sJuqeHH0FFXgRu5ZUWD4JtpxqKqL4Sc-IgUdbnMmt4dU7Z3XcSq05uwrSszTN1WeaIk3DM2Sk7LKyNHThK2mR0BR4qQ7mBjK9pSRousaHozXcTynW_mj_hmZH14hRLmcaEf2S-x7oC4fasmRw_QRsDidxp8K-poXH7m7OX3IwYh6h5gwFAbQKmtmCXRhFGgMofr63owIdjwSsLxMmft2atci1kt7-P9oViWJflCpnfasPlLvn3FBnVrsGsJMOR2IXdozfIT6lq-HEaflG0royDVz6a34z70ksLvNR6-quriLrkE5jJxOqde3Mvegb2Wsq7LptH8ozs4GGzXIfCzd3_EBIXmNc5aN50DqohZHRuYdrh0nI57FVDSr2jpxNXLPVoJprThORdnKU0MhCY6DjOSm2B6UGziNSoyDby73w1fDiAglgMgGRh52FISZOmNKGIdguX1WGoxO9v3c5oN3J9uWunpfBenaV52AVWluUS3oKh5fbx1qaHemhRzi_Ax4izfJ7ZSwmh1hCsUfBzyzuUI1dca6PkTcnvqi-lxvr0P-cgyAIXASmqeOoMLeZjPqPfeSfJivltLq4e5JMmSTHJNwsPC_mGQYEIYC2ZjmXXh-1I98M-Yv7CDPYf2JEkftI9B5vw8HW2QRcJwjvr1ZsvoT9HSP11Nh-M5EJogA5gmUL78NdLrizXkf4Zu0vz_TCS10qEhSSRrxREsd9awc1wL55kmStlYqrv_oaDxu93d2zUg8iCy-9_I5AoB9pAD7VNdxkvcBEZHR_0QR4YFRpr5Pwn7iK8UtKmk1qDxz7tKVnST7ytaEvGKYh6d8opFXE1xVpbWTxwp0JnbCUsxRCYIwaW6leynh3KDGAqaxTx5qW6xmrT34OHJyz-8EeO2IYePEPIPUQlugUZr02YWG1e7wXidhwyHrtnEzeGUBQGiYT6Y_e-9-W0tOAoWl668tvH63h4qsInSPKJ3sD3lhREAXxs8_jdayspznq1VCxKVOiEqb_RbJ_eXTgsgC-L6XQbFVViKPaklc_v4QTzk3A-Ttmqur_pSf2gNPxJvL86gZKZ6t8TYhzA38i6s-EA_S2t4agcwpy_PavtkbHSaIk0UkoJXNi6tKbVmrsGcfLU_1Z8sko1lbNFEieIl9HeEZeV7J3Z_2KbVendgBwHpY3I7g8ZOfefpDeCakGmhMfBIlBPZ0Q7Bky73rDkaRJvkSaqkDqw8ugVISq5pTPdU76TV0uHfwqVZtaCJd5ZijtPb28FZEi5e_mmdUSiPucHW9SA4Y_dE-0BgFWMQN0-xYn6pgTBZAzX9yLDlAdtJtgDVVCEY_6_H4Kjs2DCxlJwigN2_TmEBfd-3o7k-6UtWeWRKVp9mEOPJcP8e9rdXMH5yMWVrOhFETpO_iG7qKujTBHTyWjPdOygdiuZyskSHIVN0rz6mvLqVpar_jRXAhzFgioZCfHLT37DlSl_b7JCWNuRdUZKH402yfcgN5SdsrnQcenBm9c9-SD1ygcMwyBO91SSPApErCIGvP9DvaIWN6_OClELLn_b8DKok_w2QrzV9v6kfGhPQZifJCYWj38GDAFDdxFFd_EKQy7xDbwP3xjGvDkoqdVIQ6fnoeURkhOVDjD9GmegT_kvJxedwypxJNLLMM1SlG0rz6TpDV9DPDiNO5kIUOGHxGe527i7v8TjlcUtZHlijjEHxy9ljg3_Ecoe7W2JcUMhI-6_M9cBgKjOa0_k11uMKwGQ_RJHp-quGwYEEjN8_f3Ymc5-p21beaS_hAbta3DeHD9Tvgx_Qmuq8zgj5Xi90IPHfmMOZybZ83w118LaW7C8Q-TzFOASUQ8rRWv_U-T97CaAjLNER6XFfJM3X8o75XAxjgvu1mJQQIYyWp6yppo18evGdwd7llm6iTZrz-NCtBFpaD4KE9AFc0OC5-m-af3G7u4XEj61IlCvqZAThoChFfrwOvaVkEsCy791Y9n6MQXAV8yF0GIHqnSYFBekyFbLq55RvUwBHh-Z9dE7Fd4X-I7gl4084zkLkjg68If3f3p6KYU4Ti8X-QyN-9sEnqyoZpRRCqenBX1rB-Bnrj8Vc3aaT6mYCYnhrXDAapAWjbE9UEj-CbRXeTbuJ0zmog8tq9Q5s5VzLZ30iPBijBEVtn7vYT1bEtDokY-ZCrYuZ4ul0e2bcw0XyZkaqDSH2bAsBykwpVN2GITI-nwImpiqhwS2RcBVsY700PNgxn0v7yswYyk8dK4Dl5xXxuEKrp5i-hThA3z9wMebdynQPjQtyrPE9PXT24hpYHs1ie9c-HOPM3UoiBUbJ2FAjAp57lW8mn_SfSrdl3-TJTRHP9ATvIqgLg-Vq2AwaKJQqh5W15Dd3o9rIGladYjDTZmb4B3BdPA4hVCUVRK9DfE8qIliCt2FKXb_4sAroqv31vOyfnGlx-n0e5M6vHfcBN0DUmXbRDuSrqTf2sS_vQDR0GHL-N5H6v9A6RiU0rSKKXBQDsWS37tFF-UTIQKoPWgykt6boZTPPsENUeeo11ol3Lb97ioNBVlqZPIthTW3ppDL2uq2S5-OtBvfDp2h6ewxR1Y-8ZNFBtdO9AqbT4I4Vyn_QM21NjQjAwfQBAps80leCssgQDkMUrNV7EdU9n4mT1AoSotmgQynxDJCAka5IbgRHV_X_Jk5-xznT_ELCqezB_YnlQT-51eM9AK-9cVbovo0A6YGQxFUwZR1xJWb6gLL3nLsAaNPxjzbeSq1yqan4Sxn4F4jdzeQdsZ2zQ6fOBICNESlw71fnX6mWfv6dx3qWX8x0TQ2BPeonKqBwhKIp6Sw0YnGBV74MA5viYANx91XzSMSk4FZuQ4vl1wMNnfX5d-qEu43O2NvUJa9yvU65p3gE_Wx4xvzd_nFpVegkR47LzZFg113lfIth4rUCcyGwkaNComvTzrnCJBsKxNVtGiwozDS3xrWahBbfhemP41eOrYyj5xnnbwQzQ9NbpLaWiR48QtSWZBeUHZm42yrJuuP_ovxuCmE4MSWh4ehhx20werkebZiB5lvwMGDNrtCoN9XyAHB2tRFPW43Rpr5PXFq6RLbONkdGh6Gp5q2LwDctN_BHly9VqVrxZTCX3HjbeDCh-Gn2QsahZY9ScPH0A8eD8aX5bTzQQMpurJ0Qo4dY6BJaQTwGJ6z1jXF0rGxUmO0Fm160AkAXTlGvKTdx_ln3Th8Dwh-9ty2OKKccjLv4Mv28CxGf3IPVSFm2gED_3Anxnu71ejHgDWDqUuL39sKZ3MHp15gpm5m3Tap6dQBa_A2bKLz_x0fhLvpMmngQ_Yp_5C5PAXZUbgjKVe9NcxdE3ut_sZ0fcwGyddaZF6zkuK3onCEUZC7I4v5CR7mF4NYYQxdnrQcgB2QHd7LGskm0vD982jcEsuegYh84BU8ZyDuDT9dlIEpMnTEi2FnuoTjVzvkzylTvOU7CpP-v5IYDdPsKhnojuR228VCJFrc4TIveAntMiUBQdM08Gm8LNlhQbHtwMZ89g1vk6N3Ef-gkEpdL82nz2ryjTXj-pjFwRo-XZVfDTT58i0D3hLtJKEPawN0NJnRE9mr_PxkQ-b2cA653dCLjaqjJyl_km8rVnPXtpwhWU2hKWvuUuSEZPBItKUmcU5GzVC-YOAgwodBWwU9X80SxGIeALiXq52YbJTBmPOmIMgqA_Th4G7aKF2J3h7WUE8Ff18Up-U_XB9bEQvaKwK7-Mc6Ww0BNxxsxRLPIfPwx8pJw_4PeU9Pdc3cSCHwSF6PbXTv-a5aRgqGeaZy6Li63qRo_fxouepxG0zvokWeDk8wk8eRVtYkBf3re_ODtUs2TJvpVw514sgZZxgPVr1S-vlq06d4f779mwM-kb4JNsB5Cetp-2i7FIwbFvPRJpU_-dUVnCFl1qzpbDjPr82GCiE7WZc42g9lmeQjy9e67OHtsGgNmY6VQIRaXTskvfSe8auQrMZsaEKkxdFYhmDozTdYTJwCIj2UMMF95n-b5VC-gmeXGeRhyfefNBB8_cIWTfzOz1kyLUIHw-fYCxeAcUWBJPcaGIIAc3MfYVOPv26MRYFOf4eMQzP7zISMbo7jNh5eVNQVR1uEv3LHdIkaui1dDPJoqSbyBzPjec_lQ4XudErgq1hSNHszrAjFeHp5aZzX2USaR2JW1WcGw0x-dNRrMZDH7LkyGP_BKr8cm9IgrLI3p5RwN-y5nLaP7Lj-Ow8lq_1u-nqiWuAsHk-cEZFbICCg585lDNNXw2IL3eVeekezAAHnVlCblPr_oCaPh08ziTDtWnGLb9NkfNJqNKpSjqRbOZusNqUjRbUOyWdHGegFjXE7oi4v7O9jlHHkJzaF3yunfwVQIrK03A_rdvuDqpBbyeYDQFWZK27gHHc84mPyspAr1r-x5ESkyYIvQrrxecHLoFHrjmNHUuV9dhMdxK_tEQ7ll-zepiYw74ZaBYUJq-7F9ADQ25L-ymYex3blbmyPBHnbHeVv2iKnK2tgznkUeCMWTkVpbQCkwNDybU5eZ5ZaTqhblJ1Ys1s2zAD_iyTLtxZ4Vk_MXrYTejZw_uTEtnvFTHcgjOyNjuALZ-EUmVgdOJhqcjPyMBId5uToVWIk_6yuE7hP2v7lQRK6o7eGJ9EOLK7aJgowk_sQfi2sdWLfClrZFNUyGY9QqqrPSR5t5ZNgyKkihpEkv0gwWh49cBKR2TAmxKTx0e0uXB5gZbOPfNFFalE_uZFFjYlkHCYI3xQJpYnORXvx0r23lACuSvh67WY6LM6ezAIbwJ9ZeUqEztVZDmzFCJ4dn9WRzCbs49s3PrBJLW7wAzvvk7p37WdJU8PLnnKf-ynVlFUpGJIZugZI6K6bE4H8Sk4T48VgPuaP03HcQq2mvXQIByD4Gf1y59v99WFSS4rVJrfzn-snzX3VnxyJCqYF8Gyg1hItVFkCf7RgmWzJ3P3ebYYwJJQMh-Gy78VDeaMli5ASwD_-z8hBqRBnuWYBqfPvaha512ahMtsw-R5mfcAZok8-fqMs8Gzb4dJ7kPa-_YaHKQ-t57VHxR5s0LrnEeCaSIFChrughaoQqFBciwkKCTEPglleG24VzT1-EAtrUJTUspL9uPILomlgCfC9xYUZBP-d3i8stQtD28yyCRU1mWmt2Wpj7keASbCNV8A8m-MwIAR6w_ulPhlCa8Pm4u0of84nsA5LhBO7YVwbhW8TEB4qziel0FrGj4bYLC90KA0XLmdxQn5jMgBs85jjCYmUeg1FY6RHlKrgZdWPbkjIhQBlbMTLLtSrpBoMySA3tCdYhcXYZyptlPjrcm3fGNNthSzVImDvkKXenxuqr9Fb3fO78Wc78CsRrB2fYXTxJisdvyw1yp0zIUeSzGX5qgGOsdpIlVr7yO7zJrl9DZSFRgju5OwBETGxrdzWHE2qky8agpE8RT01WGmeemyoSrKvT1vuS88RNwW1lkNUNh62EVHpnXnPPNxp1x74mrxE_bFRUkRMPZUplvcj_8LCCzvdW67A7E-9Icu7pNcu_1sHvSrGbJe4V_i8ZXZT98PznWold0YD99CAng7xdZXhbkQMb2F7Gimup7_hx2_fNq4IJX9kbHcJhRogl1DIu_-7jWd7q6nf_KVZGM6btBmbJY705D9dW27CKuiu54wJtyo3wvriERDy-we4yPQ0zeoIM8IXj3mjJT4moaSvWKrqSyfhEawnTw244r63FNQOAUkQcQY0RJa19O3ms22FNVi_UOK3et5duugt330-iVxmKjp1eLEoUghcsDF7ey79VJfIszCwRXjr-CArL8bDdD7dHss46EGEeLBLp7_NipeZ9bXY41Sb4wDoCae1oLxL6IglnBVt3eSqhrkTX45hwbARp6ReDBiVYVoiCk3ewmuE3syuj4peREh9o1ImMYgUBN8ojSNbhDIs7w80eED0rwY0fMFYAWfkjEzncoUqglQZLBylX4muMgASnD5yjhCtv2FWyLXt-rS4T8aL9TmVKgLCrq2QiqcBWfQEaQHHOv8Wteuibc39ytog3B77hnI-zxXD31CQoKHHwSgevx5bmdtLu8AuQsrYMPF7h_RtNqK46TkVNrwFRgOTAEn-CJmcol0VXgAVhfFAOKOnz43vrMwbHlQDuerzkyPLv2KOJUidvrWAXgGAl-dSoD49G3sFBNRcmLjy1C1Xb5EaVreQS5ub3kkwLEpabhom5zKJliqjlq9tSHYZ-j8aPMr-fmUuzmu93tT2MmP6JnMO-XviEeirFYNIyVXXcF44yx0xQy9x4nQGflA8fOznOL2G-duQOdmc3la9REpAJYfiwlyAw4XlQoNStNceHl3uIiWs2iYcHU9ZdoAZG7GLtpkl0abzopqglVcz6vP_H7OS8TV-wOqZwOseKfDhyk4-nV9yT44ikgffvHOm1wpNtuWB41b-XTvqjOwsvOBwMz-wIQ-Dg9TrM6_Ub3ZktW8thXrDhwKgLkI6KmvGOH_Yfmjr-tcgbGXyF2X285pP5bUgQxvB-UtJJFedqI-sxRGDF9P858AzSLOUP0ihpxglX4Po4y6Z4pLM-zcXeIWSzV_AwwJgRMw4NO4mL78aVBmqpkMHm9DSRJiKA4jon3qtnlg3VjbnSao8eaQtpGnYfB-aTvxM-9t6Cgjx40t_jONZZXbqLad6-__XZtm9h1_qEo1rN2vjKi07A0BLHIHeu0kRfWJK3zmvo5EsMzjOSgF67pM_aqITjnPN6jRjWbRNFmOkoaiq5eEdhy6k3V0Xro72kxM_04U7-8LWmlGvopkG2PUE4vypB3RM6SuuUjn5CYmgsr5_lPgJvIO0jF9LKB3DjzD3PVZx3lXq3OzLn7ht7rZ7hSZ3-LtGQAqSaMICJTKEcva9Txpuq07yxdWEp9b48eBwUnaGT2bOGl9MKjluOZiZOIRMn8jzYd6dgSchlhNCT_DnDP_aaOJFsPBbrrm1Hs_2z02-eRQDLFZcb24_ZvOAkHSIHkDVVIsJTAKARIF-ISyzkvD-Qe8G3HBhUOv9ceIL79y--gjszWAoQgN6DIuf_oJ1bI4aypeR15iFlCuNW9TBeKqedUuuZrlpLdsqgpSR4m2VnPXwfEgl_xnbeMlzg4_rmabJmOlpCl2LJ8BgLllrYw951JQApwsNW5jjM4fT6vJg3mzOPUFJKNXDcmCtj1vU-ZJ7JO-KUrj7h778u9IlLPV31O74AzeBybUJM0yTxMyWdZtKov9kS2GmkJ2clzb7K2onVgcny_D9Rp4Ltx9-Ry7wa1oHkSMSTJqiemxvy050ZB1S_RPARN7kVA8r0zsUCFfNsSOofovrv36NR4r0v0etUH5oUgie00CWVHmpe23DmYEhy4q6oKsm2BqrW3pB05uk_F2P2sqCbQ4ET5u50YLTnY5Ih5A4Id_24AhsRDJLhojzgp4SMfB-ynT0a4zSI6F_lU-TjFqrIAmquZtRL7U8Vx7OczKDp--5ATLM02Yw-QvxxZdvWSGrcA5TLNK_xuhloiUvZVwMZ-7c_FFdSJzp8dOYCN91ug9zolA1vbU9G5O69hz6T7AgGx7nCsQrkfyCjf61oddRRa7-TIscJzboGIFDFyinICbGsA5-szp_cVlwvAVu-solZ-ePcBGfsKd4Fan14iB-Xf-2FjavujKKeNuCM6HAN7b4VRnCkwTo4lnL3TW1kFL34d5U6RSsR13riJXDwjGxB1rtaTFbthTMjCgtLNPwPOOx5l_K8nw3YFY4yqM6STeblRue61sMiEyMPGs3fIBcuyYDOuEWv4q9GqSe7P4XFU-ZlOrvVefFAkfO-qxiSD-hEYIV9V1gL3QjLcZctSaAeXbDRwgMZ8QxXFxVBzFAM0LOFG7shHgiGRE6TmeaA-VX1YKCpbON0xEzojKQfi-mcEz6eQGglmcvWugi99AD5opztw7KS5THFAUyBSRx9_EkEFS2WXvILc45mvuMZRPp6K37wNe8AWqQqFZn62vxf8OEbNoX17TOTltedT63jNiuXGaAWSjTXfv_3W_Brte9cBEcrJflRLF1UbitFs2nt07OR8V6D0zdvEtpeLXJ3_BO-hrxN9oK-S-NZywwolEifU2hlWIiX5UJoyM_E_G9OBZo2zpSk1PQ8bqi_SE9Yy1Z7qNJed1Voytbh5tUqVzqu_16bBjEIXO0qD5WFlNi98ArA7S7wD3-LZaKW-STQGlz7ziDdNDzvFPOU0watzzwDxy-IA_mO9TroAdoI1NpxIDZTYM1MpBYr5T56F6rewvgD00ujg1m2SJmraVobqezq0cZ-7DTOlF5eZ5SXazIzZTnEDV6vjAg3XeavRHDjUoie2NSI3qo5NvY3cPa-aRmjUhzDA_csyTx0e70wv3YVqvHq-4DlZpl8czeStm2qcpuB-rcSPcPNc0_yMXxRQ_LNWZzakWeet0xqhUhWD8nbsA7zZF2N6maAyqmtOgVbFfokXpCil_Q16qEj4spfrdDXUHtnWAL9aOc3mKZaDd0wx6yJBSswUxmav3-vq8ynAKeDVdwfy6pB5891N0YIaCtR5w9QFg6DDD8VlpRtXSke8iQou4yhY2OmlOK0eNBncb7bWjuzBo5bgFbRYxzVAYulKJAh4AwdTK-ikUVeWDke_DmM3X70ElqBxA_QCnGR2H-XYDrN1hdgxBcBNScKkYs3F_bmLPSY9bvz-VgxMCdOrVfRvbpKa7r2M39wWBNAY02cJ-FDN8VjdYHcPXg8SAzUSdy87Ot7kRdveaBC5ZL1T5q9TGR9QzpKmoogvL16wNHfvuWYlobkmx45eIcvkM84XfEe1ewL9OH0jFysYipka1W761bXFCAeExtzkNHf8elwtnjoAAqsDACRobCc_UCmy5luEVXh8fkT_HNvhEW2nnxAFvlqfA85MWM9xL47sZznx4kiCfPxhOuDaC9kJgfP5gg7ED_L08UpRoB1zkShXwZTMlwt1hzHlJXY8tiZTOd9YVkRaFQZXpFuJ5kmI3Dkwyjlqwz53sPfd5LlmRAJDi3I-dwcEi-_tPqEFqj9QzmbMr2SKSts4iJ9TBYyIPl4_y3r9HOX8Vo-ROLSYp_WTJl1le8OAIe6Tq6FjZoAwqb3ommBEcsOMi6vhtskCrTqWs66VDqQYCUy1Xqu9HDM38QQVA2xdXV_i3a0rHpjPoz50vesT_wpnHpUTJcWPfaSsoVHs4ahdE0dVngGM8Oqv3RIdu008w2mupM2CdYhlyLT3u0C_TPs9CqzrNmAGrMrCbTwcBLw_-0bUgz6m2YC54UtQlo_aWbX6vs8Dt4_1EprU7Pln4K6vNMUi4IedIPjgc5rJrG8E3O0g5_vjdmH2ioMfFI-Wmi8Cvt_a8EB0pj9U_y5PAwWSVisoBH6DqYo-3ztl3bhZzNBDc56oQRxJhpGegst0XhRuageDAY1cO0uBbFav7ibA5N8r6heB0VMgg5g1QkRuiKrw9Z3krS1gEcvAU9fwIiX1DA-0Pmi_Gt4GGEkcW-jpTh28g15LzIKuzGf35-7daJT87M09wDmvw7hl3hd92WuDgpuSZjVxJPtcWGeSKi1QobyYxCG9eAAkkiZRan_yoP7AB-vgwPEGI_Sxc5xACeCDg3C8Y4xN4HI1K-0zdQeQUOOb2VMDJNcsKiCfnli5D3mFljBOikJIHR1VcId8KvS57lLR7tbLSbXJ4TImmce-42rBsVpw4Dvv9b78M1P4JHE8lU6EbXaxZAI9buWzR4kxqa_auVcFRb63K5Dgwfj6swGoZo6YW_g0XvR2RBtSYWvOEJLJ5jvtFYz4_tfubzTwRDgi0xVLpHIb4vadrwLw8OEskf-vMMwEkMWgm_csCSAZkNkvU_keTs2s08Khzak8cGyHwvqskRVHvk2Jli4qblJVJqkY2_MEEok9Fo2cVGuJAjoaGS1A2t6K2z7iAVkE3U_NAyqE8WYXOFPy905lUeuLBeyWU_s-LIX5NLd1Y95mYAKubqehThcsWjv7Wqk5oz6cczPN1lNpTIlK8i22Mr215wkH21Ig_fk4oHXfJtJpTREoef3XprpKI_FRTGRpgmcv5vDYxTTi6kXt6fw9dnNKwTzfsxXgiCOdSiu2mcxM09GfZMbmfCnuMJnkuCUS6Fw-UjKC5UHW69jOrmEHGHdPftEehRAS3N9nkUbpEb8if0fThMkwiiQvaa__Bz8c61F4u9454KEM70hgQzNn1PF8O1fXMxU_lQHnap9RPeQN94ElTHlvOOGdfLnhGNdE3ekRcKql-vKzmiKXJmCCHbk41skZVD-f7dKrjpOlRIkW84Ssvh6xhw_yxPkOXkEiGJA3Sf0jRNmS9QTuXpD1wUJehlkDNTl2CutfWXuA2e1tRw4xnc-xVv3wYQFhHEqhI1lkJdmFQ9cLdpG94cIkUDlXTTZ9UG-moiV9x2UjyBMtebzXybEmHyDptkvMRfZZzBGTWREwrweU_WM7TlAFT4-XV3XqXiEQ6t4qi9RLI-TGNMOXyw1x7IndwfC2SiZ6lOWgpobShEUekSIPitcO0uyp8Spjr3nwNKySnD0_u4p_fT6BRUnpTQAudzSfqYIvP3nsJ9oVJHbnJ-Ua2TDkL2QpCrXEbx7kWVg8Q7WQeuZ9DAWqkUiNEXV4PdsMXKw8bFLH5BUMhEtu6AYE17iv-kXFnZTyZTaWKBrdSSH2Ht-bEjJo2UZcTHdwTDvLi9ntaa7E67yLfLLfFVdddILiWWOigWvj3MEGW3iqvRfZd3nbUdTJQzLKfkZej6cevbNFBQIALuYclQhxMeEectC1kePkuE-jWljRNSqKZipICRQmBCRYdNcZNO54Q3KUaOz-khLHoViIbMaxRzp49Hwy4LPagXtIqKePB2FFMPMziQaJjKUIPPVDObZMp0L-KNcPZARqIr3kyG82CBY1s-HkLgKPso8AVMAViPiaqC35DiPlV3cuSnYc-ADtLYLejaaIEvYC_I1w6CsqpbwKaUIWTXz4LPDU6Sj1emcHGErdW713dRLiFWHERMXs8-ld95D_ns2EtbKfg1XUa2478J02fB85Y3B4DlsTYCOptAtXFIh0Q9n-Z_ZoFteoe3nGMspzBLI9HHUlebQ71cVD41ldEBdlzSsXSgtyDdXwYHsAubZyL-5cDw20mg66iqjefpsGTmP8gpCVL0s2HKy9uwmnd_pA3q63KxSHDtPhYcSEVh8Q_D7ermX-xS4AUsdwGI1t1_IK6JwsHG5ne1Qd3EXRTtaSe1k9AwMzG4jkuoRuDkDh9oT2_uzSJSyZNOdMogzm4Rf7cB1yP9Q1WOutjTbAIgyZw73tuc_leN1v95sOjkf0JIqJAXZ5hOESrd6aYLX54GzKtPOHwuec-AUIJxlAQKHz3PEYjHnCMXmSyLJ6ab8pyA0k_KTa6d6hPCf1h4TaKN5XM28xFsc5iTFhyuwYRoRs8mR4yVtejed-pm8ndfBcbU4vIvM4SEw0qezVPJMAn-dO-USamvBSe3wAvfa9FKFEbm9s8Wlv04dwcggJ4vCMJd6yfJzIc_2E_WJXDWKsqGjkfL7-3r-SD1rluQzA6Eh3qOtfRZ0Eg7VaLYCdKfoTBCdOdG7i9HpL6XwBvKUNJmTaJM5GiBDMGG8WCLvQ_g9ZqEMby1Hncp4vh7HtiRhzS7gQ -``` - - \ No newline at end of file diff --git a/docs/topics/level_passwords.md b/docs/topics/level_passwords.md deleted file mode 100644 index 2d06186ed..000000000 --- a/docs/topics/level_passwords.md +++ /dev/null @@ -1,31 +0,0 @@ -# Level Passwords - -Level passwords are byte arrays at a 4 or 6 number length that can be set when a level is published. They are used for setting a way for adding a security to copying levels without making them free, alongside the implemented **Unlisted** property. Over the server, level passwords are encoded in a way that makes it more difficult for people to normally read, to prevent people from directly copying them from the response given from the server. - -The property is also used to determine whether a level is set for free copy, or not; with the values `0` not being able to be copied, and `1` being free copy. - -## Decoding - -The passwords used to copy levels that have such set aren't plain string, and are encoded in a method commonly seen for values like these. Like most of the base64, it's done in [URL Encoded Base64](/topics/encryption/base64.md) The method of decryption is as follows: - -`Decode Base64` -> `Xor Cipher (key "26364")` -> `Level Password` - -**The following code demonstrates this process programmatically:** - - - -### **Python** - -```py -import base64 - -def decode_level_password(password: str) -> str: - # decode the password from base64 - decoded_base64 = base64.b64decode(password.encode()).decode() - # put it through the xor cipher with the key "26364") - decoded = xor_cipher(decoded_base64, "26364") - - return decoded -``` - - diff --git a/docs/topics/status_codes.md b/docs/topics/status_codes.md deleted file mode 100644 index d20fcd7a7..000000000 --- a/docs/topics/status_codes.md +++ /dev/null @@ -1,67 +0,0 @@ -# Status Codes - -## Server - -Events over the Geometry Dash servers usually send an error code denoting that the server either had an error, or you sent an invalid request. - -### Server Status Codes - -| Code | Name | Description | -|------|------------------------------------------------------------------|-------------------------------------------------------------------------------------| -| -1 | Invalid Request | A parameter in your [HTTP request](/endpoints/request.md) to the server was invalid.| -| -2 | [Common](/topics/status_codes?id=endpoint-specific-status-codes) | This status code is commonly used in multiple endpoints either for `taken` things, or theres none of something. | - -### Endpoint-specific Status Codes - -#### registerGJAccount - -| Code | Name | Description | -|:-----|:-----|:------------| -| `-2` | Taken UserName | If the username you are trying to register with is taken | -| `-3` | Email is in use | If an account with that already email exists | -| `-4` | Username is invalid | If the username is invalid | -| `-5` | Password is invalid | If the password is invalid | -| `-6` | Email is invalid | If the email is invalid | -| `-7` | Passwords do not match | If the passwords don't match | -| `-8` | Too short. Minimum 6 characters | If the password is less than 6 characters long | -| `-9` | Too short. Minimum 3 characters | If the name is less than 3 characters long | -| `-99` | Emails do not match | if emails do not match | - -#### loginGJAccount - -| Code | Name | Description | -|:-----|:-----|:------------| -| `-8` | Too short. Minimum 6 characters | If the password is less than 6 characters long | -| `-9` | Too short. Minimum 3 characters | If the name is less than 3 characters long | -| `-10`| Already linked to a different account | If you are already logged into a different account (refresh login) | -| `-11`| Login Failed | Your login credentials are incorrect | -| `-12`| Account Disabled | Your account has been disabled | -| `-13`| Account already linked to a steam account | An unused error code which supposedly only allowed a single account per steam account | - -#### syncGJAccount/backupGJAccount - -| Code | Name | Description | -|:-----|:-----|:------------| -| `-2` | Login Failed | Your login credentials were wrong and you need to log back in | -| `-4` | Request is too large | Your request to the server was too large | -| `-5` | Bad login info | Invalid login info was provided | -| `-6` | Something went wrong | Something went wrong on the servers' end | - - -#### suggestGJStars/rateGJDemon - -| Code | Name | Description | -|:-----|:-----|:------------| -| `-2` | Not a Moderator | If you try to send a level despite not being a moderator | - -#### uploadGJComment/uploadGJAccComment - -| Code | Name | Description | -|:-----|:-----|:------------| -| `-10` | Permanent comment ban | If Robtop has deemed you worthy of a permanent comment ban | -| `temp_{time}_{reason}` | Temporary Comment Ban | If you have recieved a temporary ban from Robtop or an [Elder Moderator](/topics/moderators.md) - -| Key | description | -|:----|:------------| -| `{time}` | The duration of your ban left in seconds | -| `{reason}` | The reason behind your ban | diff --git a/docs/topics/vault_codes.md b/docs/topics/vault_codes.md index 5375d8fc2..18e252223 100644 --- a/docs/topics/vault_codes.md +++ b/docs/topics/vault_codes.md @@ -1,38 +1,67 @@ # Vault Codes -In Geometry Dash 2.1 there are three different vaults you can access. The Vault, Vault of Secrets and the Chamber of Time. Each vault has a select number of passwords that you can enter to unlock icons and colors. - -## Vault Code Encryption - -The Vault: Codes are in plaintext and arent encrypted - -Vault of Secrets and Chamber of time: [VaultCode] + ask2fpcaqCQ2 -> Xor with a key of 19283 -> base64 encode - -### Table of Vault codes - -| Vault Type | Code | Rewards | notes | -|------------|----------------|---------|-------| -| The Vault | spooky | Cube -| The Vault | lenny | Cube -| The Vault | your in-game name | Cube -| The Vault | mule | ship -| The Vault | blockbite | ufo -| The Vault | neverending | ufo -| The Vault | ahead | wave -| The Vault | 8, 16, 30, 32, 46, 84 | wave | (you enter 1 at a time consecutively) -| The Vault | robotop | robot -| The Vault | gandalfpotter | trail -| The Vault | sparky | coin -| Vault of Secrets | your star count | cube -| Vault of Secrets | CodeBreaker | cube | you are given a sequence of numbers you have to subtract the numbers from each other and the code is all the numbers subtracted combined if the numbers were 1,2,4,8,16,32 then you would do 2-1, 4-2, 8-4, 16-8, 32-16 and the code would then be 124816 -| Vault of Secrets | brainpower | cube -| Vault of Secrets | octocube | cube -| Vault of Secrets | seven | cube -| Vault of Secrets | thechickenisonfire | colour2 -| Vault of Secrets | gimmethecolor | color1 -| Vault of Secrets | glubflub | coin -| Chamber Of Time | silence | cube -| Chamber Of Time | hunger | cube -| Chamber Of Time | darkness | cube -| Chamber Of Time | volcano | wave | 'a volcano' also works -| Chamber Of Time | river | color2 | 'a river' also works +In *Geometry Dash* there are three different vaults you can access: [The Vault][#the-vault], +[Vault of Secrets][#vault-of-secrets] and [Chamber of Time][#chamber-of-time]. + +Each vault has a number of codes that you can enter to unlock icons and colors. + +## Encoding + +[The Vault][#the-vault]: Codes are in plain text (not encoded). + +[Vault of Secrets][#vault-of-secrets] and [Chamber of Time][#chamber-of-time]: `ask2fpcaqCQ2` +is added to the code, then [robtop encoding][robtop_encoding] is applied. + +## The Vault + +| code | reward | +|---------------------------------------|--------| +| `spooky` | cube | +| `lenny` | cube | +| `{name}`\* | cube | +| `mule` | ship | +| `blockbite` | UFO | +| `neverending` | UFO | +| `ahead` | wave | +| `8`, `16`, `30`, `32`, `46`, `84`\*\* | wave | +| `robotop` | robot | +| `gandalfpotter` | trail | +| `sparky` | coin | + +## Vault of Secrets + +| code | reward | +|----------------------|-----------------| +| `{stars}` | cube | +| `cod3breaker` | cube | +| `brainpower` | cube | +| `octocube` | cube | +| `seven` | cube | +| `thechickenisonfire` | secondary color | +| `gimmethecolor` | primary color | +| `glubflub` | coin | + +## Chamber of Time + +| code | reward | +|------------|-----------------| +| `silence` | cube | +| `hunger` | cube | +| `darkness` | cube | +| `volcano` | wave | +| `river` | secondary color | + +## Notes + +\* `name` is the in-game name of the player. + +\*\* Consecutively enter one code at a time. + +\*\*\* `stars` is the in-game count of stars the player has. + +\*\*\*\* You will be given a sequence of numbers. You need to find difference between each +overlapping pair of numbers, combining the results into the final code. +For example, for sequence `1, 2, 4, 8, 16, 32` the differences are `1, 2, 4, 8, 16`, +therefore the final code is `124816`. + +[robtop_encoding]: /topics/encoding/robtop.md diff --git a/mkdocs.yml b/mkdocs.yml index e103b36fb..7326d837f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,11 +37,17 @@ nav: - "Topics": - "Encoding": + - "AES": "topics/encoding/aes.md" - "Base64": "topics/encoding/base64.md" - "Checks": "topics/encoding/checks.md" - "Random String, UUID and UDID": "topics/encoding/ids.md" + - "RobTop Encoding": "topics/encoding/robtop.md" - "Seeds": "topics/encoding/seeds.md" - "XOR": "topics/encoding/xor.md" + - "ZIP": "topics/encoding/zip.md" + + - "Error Codes": "topics/error_codes.md" + - "Vault Codes": "topics/vault_codes.md" theme: name: material From f17e092eab8e051500a4ed950da905d0d92c946b Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 12 Jul 2022 04:21:26 +0300 Subject: [PATCH 09/17] Add error codes. --- docs/topics/error_codes.md | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/topics/error_codes.md diff --git a/docs/topics/error_codes.md b/docs/topics/error_codes.md new file mode 100644 index 000000000..48cea9ff9 --- /dev/null +++ b/docs/topics/error_codes.md @@ -0,0 +1,68 @@ +# Error Codes + +Geometry Dash servers usually send an error code denoting an error either on the servers' +or the client's side. + +## General Error Codes + +| code | name | +|------|-------------------| +| `-1` | General (Generic) | +| `-2` | No Result / Taken | + +## Specific Error Codes + +### [Register][register] + +| code | name | description | +|-------|--------------------|---------------------------------------------------| +| `-2` | Name Taken | The name is taken. | +| `-3` | Email Used | The email is already used. | +| `-4` | Invalid Name | The name is invalid. | +| `-5` | Invalid Password | The password is invalid. | +| `-6` | Invalid Email | The email is invalid. | +| `-7` | Password Mismatch | The passwords do not match. | +| `-8` | Password Too Short | The password is too short (minimum 6 characters). | +| `-9` | Name Too Short | The name is too short (minimum 3 characters). | +| `-99` | Email Mismatch | The emails do not match. | + +### [Login][login] + +| code | name | description | +|-------|-----------------------------|--------------------------------------------------------| +| `-8` | Password Too Short | The password is less than 6 characters long. | +| `-9` | Name Too Short | The name is less than 3 characters long. | +| `-10` | Linked to Different Account | Already logged into a different account. | +| `-11` | Login Failed | Login credentials are incorrect. | +| `-12` | Account Disabled | The account has been disabled. | +| `-13` | Linked to Different Steam | One account is allowed per one steam account (unused). | + +### [Save][save] + +| code | name | description | +|------|----------------------|-------------------------------------------| +| `-2` | Login Failed | Login credentials are wrong. | +| `-4` | Request Too Large | Request to the server is too large. | +| `-5` | Bad Login Info | Invalid login information was provided. | +| `-6` | Something Went Wrong | Something went wrong on the servers' end. | + +### [Suggest Level][suggest_level] + +| code | name | description | +|------|---------------------|----------------------------------------| +| `-2` | Missing Permissions | Missing permissions to suggest levels. | + +### [Comment Level][comment_level] + +| code | name | description | +|-----------------------------|-----------------------|-----------------------------------------------| +| `-10` | Permanent Comment Ban | Permanently banned from commenting on levels. | +| `temp_{timeout}_{reason}`\* | Temporary Comment Ban | Temporarily banned from commenting on levels. | + +\* `timeout` is the remaining duration of the ban in seconds, `reason` is the reason for getting banned. + +[register]: /endpoints/accounts/register +[login]: /endpoints/accounts/login +[save]: /endpoints/accounts/save +[suggest_level]: /endpoints/levels/suggest_level +[comment_level]: /endpoints/levels/comment_level From 52d2fb784a5bde4b422eebe5e596efaa008f7848 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 12 Jul 2022 04:35:43 +0300 Subject: [PATCH 10/17] Update vault codes. --- docs/topics/vault_codes.md | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/docs/topics/vault_codes.md b/docs/topics/vault_codes.md index 18e252223..a88f6f17c 100644 --- a/docs/topics/vault_codes.md +++ b/docs/topics/vault_codes.md @@ -1,15 +1,15 @@ # Vault Codes -In *Geometry Dash* there are three different vaults you can access: [The Vault][#the-vault], -[Vault of Secrets][#vault-of-secrets] and [Chamber of Time][#chamber-of-time]. +In *Geometry Dash* there are three different vaults you can access: [The Vault](#the-vault), +[Vault of Secrets](#vault-of-secrets) and [Chamber of Time](#chamber-of-time). Each vault has a number of codes that you can enter to unlock icons and colors. ## Encoding -[The Vault][#the-vault]: Codes are in plain text (not encoded). +[The Vault](#the-vault): Codes are in plain text (not encoded). -[Vault of Secrets][#vault-of-secrets] and [Chamber of Time][#chamber-of-time]: `ask2fpcaqCQ2` +[Vault of Secrets](#vault-of-secrets) and [Chamber of Time](#chamber-of-time): `ask2fpcaqCQ2` is added to the code, then [robtop encoding][robtop_encoding] is applied. ## The Vault @@ -28,12 +28,16 @@ is added to the code, then [robtop encoding][robtop_encoding] is applied. | `gandalfpotter` | trail | | `sparky` | coin | +\* `name` is the in-game name of the player. + +\*\* Consecutively enter one code at a time. + ## Vault of Secrets | code | reward | |----------------------|-----------------| -| `{stars}` | cube | -| `cod3breaker` | cube | +| `{stars}`\* | cube | +| `cod3breaker`\*\* | cube | | `brainpower` | cube | | `octocube` | cube | | `seven` | cube | @@ -41,6 +45,12 @@ is added to the code, then [robtop encoding][robtop_encoding] is applied. | `gimmethecolor` | primary color | | `glubflub` | coin | +\* `stars` is the in-game count of stars the player has. +\*\* You will be given a sequence of numbers. You need to find difference between each +overlapping pair of numbers, combining the results into the final code. +For example, for sequence `1, 2, 4, 8, 16, 32` the differences are `1, 2, 4, 8, 16`, +therefore the final code is `124816`. + ## Chamber of Time | code | reward | @@ -51,17 +61,4 @@ is added to the code, then [robtop encoding][robtop_encoding] is applied. | `volcano` | wave | | `river` | secondary color | -## Notes - -\* `name` is the in-game name of the player. - -\*\* Consecutively enter one code at a time. - -\*\*\* `stars` is the in-game count of stars the player has. - -\*\*\*\* You will be given a sequence of numbers. You need to find difference between each -overlapping pair of numbers, combining the results into the final code. -For example, for sequence `1, 2, 4, 8, 16, 32` the differences are `1, 2, 4, 8, 16`, -therefore the final code is `124816`. - [robtop_encoding]: /topics/encoding/robtop.md From fb340c6b01850f9d9209ccba84620367fb95a4de Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Mon, 5 Sep 2022 01:32:36 +0300 Subject: [PATCH 11/17] Major reworking. --- README.md | 2 +- docs/{resources => }/client/gamesave.md | 0 docs/{resources => }/client/gamesave/GLM.md | 0 .../client/gamesave/GS_Value.md | 0 .../client/gamesave/achievement.md | 0 docs/{resources => }/client/gamesave/gv.md | 0 docs/{resources => }/client/gamesave/kCEK.md | 0 .../{resources => }/client/gamesave/quests.md | 0 .../client/gamesave/valueKeeper.md | 0 .../level-components/capacity-string.md | 0 .../client/level-components/color-string.md | 0 .../level-components/guideline-string.md | 0 .../level-components/inner-level-string.md | 0 .../client/level-components/level-colors.md | 0 .../client/level-components/level-object.md | 0 docs/{resources => }/client/level.md | 0 docs/{ => client}/topics/vault_codes.md | 3 +- docs/code_of_conduct.md | 1 + docs/credits.md | 2 - docs/{topics => }/encoding/aes.md | 0 docs/{topics => }/encoding/base64.md | 4 + docs/{topics => }/encoding/checks.md | 60 ++++---- docs/{topics => }/encoding/ids.md | 0 docs/{topics => }/encoding/robtop.md | 0 docs/{topics => }/encoding/seeds.md | 5 +- docs/{topics => }/encoding/xor.md | 19 ++- docs/{topics => }/encoding/zip.md | 0 docs/endpoints/accounts/register_web.md | 3 - docs/index.md | 3 +- .../server/endpoints/accept_friend_request.md | 60 ++++++++ docs/{ => server}/endpoints/accounts/login.md | 0 .../endpoints/accounts/register.md | 2 +- .../server/endpoints/accounts/register_web.md | 9 ++ docs/server/endpoints/block_user.md | 56 +++++++ .../comments/delete_level_comment.md | 20 +-- .../comments/delete_user_comment.md} | 12 +- .../endpoints/delete_account_comment.md | 56 +++++++ .../server/endpoints/delete_friend_request.md | 57 +++++++ docs/server/endpoints/delete_level.md | 56 +++++++ docs/server/endpoints/delete_level_comment.md | 59 ++++++++ docs/server/endpoints/delete_message.md | 61 ++++++++ docs/server/endpoints/download_level.md | 66 ++++++++ docs/server/endpoints/download_message.md | 56 +++++++ .../friend_requests/accept_friend_request.md | 26 ++-- .../friend_requests/delete_friend_request.md | 16 +- .../endpoints/get_account_comments.md | 0 .../{ => server}/endpoints/get_account_url.md | 0 docs/{ => server}/endpoints/get_chests.md | 0 .../endpoints/get_comment_history.md | 0 .../endpoints/get_friend_requests.md | 0 docs/{ => server}/endpoints/get_gauntlets.md | 0 .../{ => server}/endpoints/get_leaderboard.md | 0 .../endpoints/get_level_comments.md | 0 .../endpoints/get_level_leaderboard.md | 0 docs/{ => server}/endpoints/get_levels.md | 0 docs/{ => server}/endpoints/get_map_packs.md | 0 docs/{ => server}/endpoints/get_messages.md | 0 docs/{ => server}/endpoints/get_quests.md | 0 docs/{ => server}/endpoints/get_song.md | 0 docs/{ => server}/endpoints/get_timely.md | 0 docs/{ => server}/endpoints/get_top_1000.md | 0 .../{ => server}/endpoints/get_top_artists.md | 0 docs/{ => server}/endpoints/get_user.md | 0 docs/{ => server}/endpoints/get_user_list.md | 0 .../endpoints/levels/delete_level.md | 6 +- .../endpoints/levels/get_level.md} | 22 +-- docs/{ => server}/endpoints/like_item.md | 0 docs/server/endpoints/load.md | 45 ++++++ .../endpoints/messages/delete_message.md | 6 +- .../endpoints/messages/get_message.md} | 6 +- docs/{ => server}/endpoints/post_comment.md | 0 docs/{ => server}/endpoints/rate_demon.md | 0 docs/{ => server}/endpoints/rate_level.md | 0 docs/{ => server}/endpoints/rate_stars.md | 0 .../endpoints/read_friend_request.md | 0 docs/{ => server}/endpoints/remove_friend.md | 0 docs/{ => server}/endpoints/report_level.md | 0 docs/{ => server}/endpoints/request.md | 0 docs/{ => server}/endpoints/request_access.md | 0 docs/{ => server}/endpoints/restore_items.md | 0 docs/{ => server}/endpoints/search_users.md | 0 .../endpoints/send_friend_request.md | 0 .../endpoints/send_level_comment.md | 0 docs/{ => server}/endpoints/send_message.md | 0 docs/{ => server}/endpoints/unblock_user.md | 0 .../endpoints/update_level_description.md | 0 .../endpoints/update_profile.md} | 0 .../endpoints/update_settings.md} | 0 docs/{ => server}/endpoints/upload_level.md | 0 .../endpoints/users/block_user.md | 8 +- .../server => server/models}/comments.md | 0 .../models}/friend_requests.md | 0 .../server => server/models}/gauntlets.md | 0 .../server => server/models}/leaderboards.md | 0 .../server => server/models}/levels.md | 0 .../server => server/models}/map_packs.md | 0 .../server => server/models}/messages.md | 0 .../server => server/models}/restore.md | 0 .../server => server/models}/songs.md | 0 .../server => server/models}/users.md | 0 docs/{ => server}/topics/error_codes.md | 10 +- .../server => server/topics}/secrets.md | 0 .../server => server/topics}/versions.md | 2 +- docs/topics/levelstring_encoding_decoding.md | 54 ------- docs/topics/localfiles_encrypt_decrypt.md | 142 ------------------ mkdocs.yml | 77 +++++----- 106 files changed, 748 insertions(+), 344 deletions(-) rename docs/{resources => }/client/gamesave.md (100%) rename docs/{resources => }/client/gamesave/GLM.md (100%) rename docs/{resources => }/client/gamesave/GS_Value.md (100%) rename docs/{resources => }/client/gamesave/achievement.md (100%) rename docs/{resources => }/client/gamesave/gv.md (100%) rename docs/{resources => }/client/gamesave/kCEK.md (100%) rename docs/{resources => }/client/gamesave/quests.md (100%) rename docs/{resources => }/client/gamesave/valueKeeper.md (100%) rename docs/{resources => }/client/level-components/capacity-string.md (100%) rename docs/{resources => }/client/level-components/color-string.md (100%) rename docs/{resources => }/client/level-components/guideline-string.md (100%) rename docs/{resources => }/client/level-components/inner-level-string.md (100%) rename docs/{resources => }/client/level-components/level-colors.md (100%) rename docs/{resources => }/client/level-components/level-object.md (100%) rename docs/{resources => }/client/level.md (100%) rename docs/{ => client}/topics/vault_codes.md (98%) create mode 100644 docs/code_of_conduct.md rename docs/{topics => }/encoding/aes.md (100%) rename docs/{topics => }/encoding/base64.md (99%) rename docs/{topics => }/encoding/checks.md (83%) rename docs/{topics => }/encoding/ids.md (100%) rename docs/{topics => }/encoding/robtop.md (100%) rename docs/{topics => }/encoding/seeds.md (92%) rename docs/{topics => }/encoding/xor.md (78%) rename docs/{topics => }/encoding/zip.md (100%) delete mode 100644 docs/endpoints/accounts/register_web.md create mode 100644 docs/server/endpoints/accept_friend_request.md rename docs/{ => server}/endpoints/accounts/login.md (100%) rename docs/{ => server}/endpoints/accounts/register.md (98%) create mode 100644 docs/server/endpoints/accounts/register_web.md create mode 100644 docs/server/endpoints/block_user.md rename docs/{ => server}/endpoints/comments/delete_level_comment.md (71%) rename docs/{endpoints/comments/delete_account_comment.md => server/endpoints/comments/delete_user_comment.md} (86%) create mode 100644 docs/server/endpoints/delete_account_comment.md create mode 100644 docs/server/endpoints/delete_friend_request.md create mode 100644 docs/server/endpoints/delete_level.md create mode 100644 docs/server/endpoints/delete_level_comment.md create mode 100644 docs/server/endpoints/delete_message.md create mode 100644 docs/server/endpoints/download_level.md create mode 100644 docs/server/endpoints/download_message.md rename docs/{ => server}/endpoints/friend_requests/accept_friend_request.md (76%) rename docs/{ => server}/endpoints/friend_requests/delete_friend_request.md (77%) rename docs/{ => server}/endpoints/get_account_comments.md (100%) rename docs/{ => server}/endpoints/get_account_url.md (100%) rename docs/{ => server}/endpoints/get_chests.md (100%) rename docs/{ => server}/endpoints/get_comment_history.md (100%) rename docs/{ => server}/endpoints/get_friend_requests.md (100%) rename docs/{ => server}/endpoints/get_gauntlets.md (100%) rename docs/{ => server}/endpoints/get_leaderboard.md (100%) rename docs/{ => server}/endpoints/get_level_comments.md (100%) rename docs/{ => server}/endpoints/get_level_leaderboard.md (100%) rename docs/{ => server}/endpoints/get_levels.md (100%) rename docs/{ => server}/endpoints/get_map_packs.md (100%) rename docs/{ => server}/endpoints/get_messages.md (100%) rename docs/{ => server}/endpoints/get_quests.md (100%) rename docs/{ => server}/endpoints/get_song.md (100%) rename docs/{ => server}/endpoints/get_timely.md (100%) rename docs/{ => server}/endpoints/get_top_1000.md (100%) rename docs/{ => server}/endpoints/get_top_artists.md (100%) rename docs/{ => server}/endpoints/get_user.md (100%) rename docs/{ => server}/endpoints/get_user_list.md (100%) rename docs/{ => server}/endpoints/levels/delete_level.md (92%) rename docs/{endpoints/levels/download_level.md => server/endpoints/levels/get_level.md} (85%) rename docs/{ => server}/endpoints/like_item.md (100%) create mode 100644 docs/server/endpoints/load.md rename docs/{ => server}/endpoints/messages/delete_message.md (93%) rename docs/{endpoints/messages/read_message.md => server/endpoints/messages/get_message.md} (93%) rename docs/{ => server}/endpoints/post_comment.md (100%) rename docs/{ => server}/endpoints/rate_demon.md (100%) rename docs/{ => server}/endpoints/rate_level.md (100%) rename docs/{ => server}/endpoints/rate_stars.md (100%) rename docs/{ => server}/endpoints/read_friend_request.md (100%) rename docs/{ => server}/endpoints/remove_friend.md (100%) rename docs/{ => server}/endpoints/report_level.md (100%) rename docs/{ => server}/endpoints/request.md (100%) rename docs/{ => server}/endpoints/request_access.md (100%) rename docs/{ => server}/endpoints/restore_items.md (100%) rename docs/{ => server}/endpoints/search_users.md (100%) rename docs/{ => server}/endpoints/send_friend_request.md (100%) rename docs/{ => server}/endpoints/send_level_comment.md (100%) rename docs/{ => server}/endpoints/send_message.md (100%) rename docs/{ => server}/endpoints/unblock_user.md (100%) rename docs/{ => server}/endpoints/update_level_description.md (100%) rename docs/{endpoints/update_data.md => server/endpoints/update_profile.md} (100%) rename docs/{endpoints/update_account.md => server/endpoints/update_settings.md} (100%) rename docs/{ => server}/endpoints/upload_level.md (100%) rename docs/{ => server}/endpoints/users/block_user.md (89%) rename docs/{resources/server => server/models}/comments.md (100%) rename docs/{resources/server => server/models}/friend_requests.md (100%) rename docs/{resources/server => server/models}/gauntlets.md (100%) rename docs/{resources/server => server/models}/leaderboards.md (100%) rename docs/{resources/server => server/models}/levels.md (100%) rename docs/{resources/server => server/models}/map_packs.md (100%) rename docs/{resources/server => server/models}/messages.md (100%) rename docs/{resources/server => server/models}/restore.md (100%) rename docs/{resources/server => server/models}/songs.md (100%) rename docs/{resources/server => server/models}/users.md (100%) rename docs/{ => server}/topics/error_codes.md (93%) rename docs/{resources/server => server/topics}/secrets.md (100%) rename docs/{resources/server => server/topics}/versions.md (77%) delete mode 100644 docs/topics/levelstring_encoding_decoding.md delete mode 100644 docs/topics/localfiles_encrypt_decrypt.md diff --git a/README.md b/README.md index 10f386bef..a280de03c 100644 --- a/README.md +++ b/README.md @@ -65,4 +65,4 @@ Ideas on what to add or improve can be found in the [issues][Issues] section of [Discord]: https://gd-programming.org/discord [Issues]: https://github.com/gd-programming/gd.docs/issues [Badge]: https://github.com/gd-programming/gd.docs/workflows/docs/badge.svg -[Icon]: https://github.com/gd-programming/gd.docs/blob/main/assets/icons/gd.docs.png?raw=true +[Icon]: https://github.com/gd-programming/gd.docs/blob/docs/assets/icons/gd.docs.png?raw=true diff --git a/docs/resources/client/gamesave.md b/docs/client/gamesave.md similarity index 100% rename from docs/resources/client/gamesave.md rename to docs/client/gamesave.md diff --git a/docs/resources/client/gamesave/GLM.md b/docs/client/gamesave/GLM.md similarity index 100% rename from docs/resources/client/gamesave/GLM.md rename to docs/client/gamesave/GLM.md diff --git a/docs/resources/client/gamesave/GS_Value.md b/docs/client/gamesave/GS_Value.md similarity index 100% rename from docs/resources/client/gamesave/GS_Value.md rename to docs/client/gamesave/GS_Value.md diff --git a/docs/resources/client/gamesave/achievement.md b/docs/client/gamesave/achievement.md similarity index 100% rename from docs/resources/client/gamesave/achievement.md rename to docs/client/gamesave/achievement.md diff --git a/docs/resources/client/gamesave/gv.md b/docs/client/gamesave/gv.md similarity index 100% rename from docs/resources/client/gamesave/gv.md rename to docs/client/gamesave/gv.md diff --git a/docs/resources/client/gamesave/kCEK.md b/docs/client/gamesave/kCEK.md similarity index 100% rename from docs/resources/client/gamesave/kCEK.md rename to docs/client/gamesave/kCEK.md diff --git a/docs/resources/client/gamesave/quests.md b/docs/client/gamesave/quests.md similarity index 100% rename from docs/resources/client/gamesave/quests.md rename to docs/client/gamesave/quests.md diff --git a/docs/resources/client/gamesave/valueKeeper.md b/docs/client/gamesave/valueKeeper.md similarity index 100% rename from docs/resources/client/gamesave/valueKeeper.md rename to docs/client/gamesave/valueKeeper.md diff --git a/docs/resources/client/level-components/capacity-string.md b/docs/client/level-components/capacity-string.md similarity index 100% rename from docs/resources/client/level-components/capacity-string.md rename to docs/client/level-components/capacity-string.md diff --git a/docs/resources/client/level-components/color-string.md b/docs/client/level-components/color-string.md similarity index 100% rename from docs/resources/client/level-components/color-string.md rename to docs/client/level-components/color-string.md diff --git a/docs/resources/client/level-components/guideline-string.md b/docs/client/level-components/guideline-string.md similarity index 100% rename from docs/resources/client/level-components/guideline-string.md rename to docs/client/level-components/guideline-string.md diff --git a/docs/resources/client/level-components/inner-level-string.md b/docs/client/level-components/inner-level-string.md similarity index 100% rename from docs/resources/client/level-components/inner-level-string.md rename to docs/client/level-components/inner-level-string.md diff --git a/docs/resources/client/level-components/level-colors.md b/docs/client/level-components/level-colors.md similarity index 100% rename from docs/resources/client/level-components/level-colors.md rename to docs/client/level-components/level-colors.md diff --git a/docs/resources/client/level-components/level-object.md b/docs/client/level-components/level-object.md similarity index 100% rename from docs/resources/client/level-components/level-object.md rename to docs/client/level-components/level-object.md diff --git a/docs/resources/client/level.md b/docs/client/level.md similarity index 100% rename from docs/resources/client/level.md rename to docs/client/level.md diff --git a/docs/topics/vault_codes.md b/docs/client/topics/vault_codes.md similarity index 98% rename from docs/topics/vault_codes.md rename to docs/client/topics/vault_codes.md index a88f6f17c..0ed034a54 100644 --- a/docs/topics/vault_codes.md +++ b/docs/client/topics/vault_codes.md @@ -46,6 +46,7 @@ is added to the code, then [robtop encoding][robtop_encoding] is applied. | `glubflub` | coin | \* `stars` is the in-game count of stars the player has. + \*\* You will be given a sequence of numbers. You need to find difference between each overlapping pair of numbers, combining the results into the final code. For example, for sequence `1, 2, 4, 8, 16, 32` the differences are `1, 2, 4, 8, 16`, @@ -61,4 +62,4 @@ therefore the final code is `124816`. | `volcano` | wave | | `river` | secondary color | -[robtop_encoding]: /topics/encoding/robtop.md +[robtop_encoding]: /topics/encoding/robtop diff --git a/docs/code_of_conduct.md b/docs/code_of_conduct.md new file mode 100644 index 000000000..01f2ea20d --- /dev/null +++ b/docs/code_of_conduct.md @@ -0,0 +1 @@ +--8<-- "CODE_OF_CONDUCT.md" diff --git a/docs/credits.md b/docs/credits.md index 68ba3a6b9..70eb2e3c8 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -5,7 +5,6 @@ making this project a reality. Without you, this project wouldn't have even been ## Staff Team -- [SMJS][SMJS] - [nekit][nekit] - [zmx][zmx] - [Wylie][Wylie] @@ -17,7 +16,6 @@ making this project a reality. Without you, this project wouldn't have even been - [Cvolton][Cvolton] - [Colon][Colon] -[SMJS]: https://github.com/SMJSGaming [nekit]: https://github.com/nekitdev [zmx]: https://github.com/qimiko [Wylie]: https://github.com/Wyliemaster diff --git a/docs/topics/encoding/aes.md b/docs/encoding/aes.md similarity index 100% rename from docs/topics/encoding/aes.md rename to docs/encoding/aes.md diff --git a/docs/topics/encoding/base64.md b/docs/encoding/base64.md similarity index 99% rename from docs/topics/encoding/base64.md rename to docs/encoding/base64.md index 287e5427a..f26dba0b5 100644 --- a/docs/topics/encoding/base64.md +++ b/docs/encoding/base64.md @@ -28,6 +28,10 @@ BASE64_PAD = 4 BASE64_INVALID_TO_PAD = 1 BASE64_PADDING = b"=" +# last + +LAST = ~0 + def enforce_valid_base64(data: bytes) -> bytes: required = len(data) % BASE64_PAD diff --git a/docs/topics/encoding/checks.md b/docs/encoding/checks.md similarity index 83% rename from docs/topics/encoding/checks.md rename to docs/encoding/checks.md index 0c5fb003a..9eee28023 100644 --- a/docs/topics/encoding/checks.md +++ b/docs/encoding/checks.md @@ -17,7 +17,7 @@ The generator can be implemented like this: ```python from hashlib import sha1 as standard_sha1 -from typing import Any, Iterable +from typing import Iterable EMPTY = str() @@ -27,26 +27,26 @@ DEFAULT_ENCODING = "utf-8" DEFAULT_ERRORS = "strict" -def sha1(data: bytes) -> str: - return standard_sha1(data).hexdigest() +def sha1_string( + string: str, salt: str = EMPTY, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + return standard_sha1((data + salt).encode(encoding, errors)).hexdigest() def generate_check( - values: Iterable[Any], + values: Iterable[str], key: str, salt: str = EMPTY, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS, ) -> str: - values.append(salt) - - string = concat(map(str, values)) + string = concat(values) - hashed = sha1(string.encode(encoding, errors)) + hashed = sha1_string(string, encoding, errors) - xored = xor_string(hashed, key) + xored = cyclic_xor_string(hashed, key, encoding, errors) - encoded = encode_base64_string_url_safe(xored) + encoded = encode_base64_string_url_safe(xored, encoding, errors) return encoded ``` @@ -55,7 +55,7 @@ def generate_check( Here is a summary of *Check* values and explanations on their generation: -## [Download Level][download_level] +## [Get Level][get_level] | name | description |-------------|-----------------------------------------------| @@ -106,7 +106,7 @@ Here is a summary of *Check* values and explanations on their generation: | `udid` | [UDID][udid] of the user. | | `uuid` | [UUID][uuid] of the user. | -## [Update Data][update_data] +## [Update Profile][update_profile] | name | description | |----------------|--------------------------------------| @@ -156,21 +156,21 @@ Here is a summary of *Check* values and explanations on their generation: [sha1]: https://en.wikipedia.org/wiki/SHA-1 -[base64]: /topics/encoding/base64 -[xor_cipher]: /topics/encoding/xor#xor-cipher -[xor]: /topics/encoding/xor -[xor_keys]: /topics/encoding/xor#xor-keys -[random_string]: /topics/encoding/ids#random-string -[udid]: /topics/encoding/ids#udid -[uuid]: /topics/encoding/ids#uuid -[upload_seed]: /topics/encoding/seeds#upload-seed -[leaderboard_seed]: /topics/encoding/seeds#leaderboard-seed - -[upload_level]: /endpoints/levels/upload_level -[download_level]: /endpoints/levels/download_level -[post_comment]: /endpoints/comments/post_comment -[get_quests]: /endpoints/quests/get_quests -[get_chests]: /endpoints/chests/get_chests -[like_item]: /endpoints/likes/like_item -[update_data]: /endpoints/users/update_data -[get_level_leaderboard]: /endpoints/levels/get_level_leaderboard +[base64]: /encoding/base64 +[xor_cipher]: /encoding/xor#xor-cipher +[xor]: /encoding/xor +[xor_keys]: /encoding/xor#xor-keys +[random_string]: /encoding/ids.md#random-string +[udid]: /encoding/ids#udid +[uuid]: /encoding/ids#uuid +[upload_seed]: /encoding/seeds#upload-seed +[leaderboard_seed]: /encoding/seeds#leaderboard-seed + +[upload_level]: /server/endpoints/levels/upload_level +[get_level]: /server/endpoints/levels/get_level +[post_comment]: /server/endpoints/comments/post_comment +[get_quests]: /server/endpoints/quests/get_quests +[get_chests]: /server/endpoints/chests/get_chests +[like_item]: /server/endpoints/likes/like_item +[update_profile]: /server/endpoints/users/update_profile +[get_level_leaderboard]: /server/endpoints/levels/get_level_leaderboard diff --git a/docs/topics/encoding/ids.md b/docs/encoding/ids.md similarity index 100% rename from docs/topics/encoding/ids.md rename to docs/encoding/ids.md diff --git a/docs/topics/encoding/robtop.md b/docs/encoding/robtop.md similarity index 100% rename from docs/topics/encoding/robtop.md rename to docs/encoding/robtop.md diff --git a/docs/topics/encoding/seeds.md b/docs/encoding/seeds.md similarity index 92% rename from docs/topics/encoding/seeds.md rename to docs/encoding/seeds.md index 8bc8a893c..9fd8bf213 100644 --- a/docs/topics/encoding/seeds.md +++ b/docs/encoding/seeds.md @@ -14,7 +14,9 @@ def generate_upload_seed(data: AnyString, count: int = COUNT) -> AnyString: if length < count: return data # not enough data - return data[:: length // count][:count] + step = length // count + + return data[::step][:count] ``` ## Leaderboard Seed @@ -31,7 +33,6 @@ SUBTRACT = JUMPS_ADD * PERCENTAGE_ADD + SECONDS_ADD * SECONDS_ADD def generate_leaderboard_seed( jumps: int, percentage: int, seconds: int, has_played: bool = True ) -> int: - return ( HAS_PLAYED_MULTIPLY * (has_played + 1) + (jumps + JUMPS_ADD) * (percentage + PERCENTAGE_ADD) diff --git a/docs/topics/encoding/xor.md b/docs/encoding/xor.md similarity index 78% rename from docs/topics/encoding/xor.md rename to docs/encoding/xor.md index 63118db78..1ac6136f3 100644 --- a/docs/topics/encoding/xor.md +++ b/docs/encoding/xor.md @@ -23,7 +23,7 @@ def cyclic_xor_string(string: str, key: str, encoding: str = ..., errors: str = *XOR Cipher* pairs each byte in the string with a byte in the key (which is cycled), then applies *XOR* operation for each pair. -Returning back to the function: +Returning back to our functions: ```python from itertools import cycle @@ -38,6 +38,21 @@ def cyclic_xor(data: bytes, key: bytes) -> bytes: def cyclic_xor_string( string: str, key: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS +) -> str: + result = cyclic_xor(string.encode(encoding, errors), key.encode(encoding, errors)) + + return result.decode(encoding, errors) +``` + +XOR Cipher can also use one byte as the key: + +```python +def xor(data: bytes, key: int) -> bytes: + return bytes(byte ^ key for byte in data) + + +def xor_string( + string: str, key: str, encoding: str = DEFAULT_ENCODING, errors: str = DEFAULT_ERRORS ) -> str: result = xor(string.encode(encoding, errors), key.encode(encoding, errors)) @@ -52,7 +67,7 @@ Here is a list of XOR keys currently used in GD: |---------|-------------------| | `14251` | Messages | | `26364` | Level Password | -| `37526` | Account Password | +| `37526` | User Password | | `39673` | Level Leaderboard | | `41274` | Level Seed | | `29481` | Comment Check | diff --git a/docs/topics/encoding/zip.md b/docs/encoding/zip.md similarity index 100% rename from docs/topics/encoding/zip.md rename to docs/encoding/zip.md diff --git a/docs/endpoints/accounts/register_web.md b/docs/endpoints/accounts/register_web.md deleted file mode 100644 index c44f8c084..000000000 --- a/docs/endpoints/accounts/register_web.md +++ /dev/null @@ -1,3 +0,0 @@ -# accounts/register.php - -Account registration via a webpage diff --git a/docs/index.md b/docs/index.md index c5136d599..e5cc8ca77 100644 --- a/docs/index.md +++ b/docs/index.md @@ -34,7 +34,7 @@ their way here, as a listing of resources people can use for their own projects. These are projects that generally interface over the *Geometry Dash* servers and client, and overall have built up their own recognition and traction along the community and developers alike. -#### Node JS +#### Node - [GDBrowser][GDBrowser] by [Colon][Colon] @@ -51,7 +51,6 @@ Make sure to hit us up on our discord, and show us of such! [gd.docs]: https://docs.gd-programming.org/ [Discord]: https://gd-programming.org/discord -[GDDocs]: https://docs.gd-programming.org/ [GitHub]: https://github.com/gd-programming/gd.docs [gd.py]: https://github.com/nekitdev/gd.py diff --git a/docs/server/endpoints/accept_friend_request.md b/docs/server/endpoints/accept_friend_request.md new file mode 100644 index 000000000..0b8c6bda5 --- /dev/null +++ b/docs/server/endpoints/accept_friend_request.md @@ -0,0 +1,60 @@ +# acceptGJFriendRequest20.php + +Accepts an incoming friend request + +## Parameters + +### Required Parameters + +**accountID** - Account ID of the user accepting the friend request + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user accepting the friend request + +**targetAccountID** - Account ID of the user who sent the friend request + +**requestID** - ID of the friend request (Returned by [uploadFriendRequest20](/endpoints/uploadFriendRequest20.md)) + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +1, regardless of if the friend request exists or not + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is accepted a friend request +# from PasswordFinders, whose account ID is 5317656 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "targetAccountID": 5317656, + "requestID": 43248797, + "secret": "Wmfd2893gb7", +} + +r = requests.post('http://boomlings.com/database/acceptGJFriendRequest20.php', data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/endpoints/accounts/login.md b/docs/server/endpoints/accounts/login.md similarity index 100% rename from docs/endpoints/accounts/login.md rename to docs/server/endpoints/accounts/login.md diff --git a/docs/endpoints/accounts/register.md b/docs/server/endpoints/accounts/register.md similarity index 98% rename from docs/endpoints/accounts/register.md rename to docs/server/endpoints/accounts/register.md index 0d46d5510..f0feb846d 100644 --- a/docs/endpoints/accounts/register.md +++ b/docs/server/endpoints/accounts/register.md @@ -22,7 +22,7 @@ Registers an account -### **Python** +### Python ```py import requests diff --git a/docs/server/endpoints/accounts/register_web.md b/docs/server/endpoints/accounts/register_web.md new file mode 100644 index 000000000..cee3c1c05 --- /dev/null +++ b/docs/server/endpoints/accounts/register_web.md @@ -0,0 +1,9 @@ +# Register (Web) + +*Account registration online (on the website).* + +## Endpoint + +| method | endpoint | +|--------|----------------| +| `GET` | `register.php` | diff --git a/docs/server/endpoints/block_user.md b/docs/server/endpoints/block_user.md new file mode 100644 index 000000000..6ae93f424 --- /dev/null +++ b/docs/server/endpoints/block_user.md @@ -0,0 +1,56 @@ +# blockGJUser20.php + +Blocks a user. + +## Parameters + +### Required Parameters + +**accountID** - The blocking person's account ID + +**gjp** - The blocking person's [GJP](/topics/encryption/gjp.md) + +**targetAccountID** - The account ID of the person being blocked + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Always returns 1, regardless of if the target account exists or not. + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is blocking RobTop + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "targetAccountID": 71, # Robtop's account ID + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/blockGJUser20.php", data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/endpoints/comments/delete_level_comment.md b/docs/server/endpoints/comments/delete_level_comment.md similarity index 71% rename from docs/endpoints/comments/delete_level_comment.md rename to docs/server/endpoints/comments/delete_level_comment.md index 847842fcf..a2a9b9814 100644 --- a/docs/endpoints/comments/delete_level_comment.md +++ b/docs/server/endpoints/comments/delete_level_comment.md @@ -17,8 +17,8 @@ | `commentID` | ID of the comment. | | `levelID` | ID of the level the comment is on. | | `secret` | The [common secret][secrets]. | -| `gameVersion`? | The current [game version][versions] | -| `binaryVersion`? | The current [binary version][versions] | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | | `gdw`? | Whether the level comment is in *Geometry Dash World*. | ## Response @@ -35,11 +35,11 @@ import requests # with this code, DevExit is deleting the comment on a level data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # this would be DevExit's encoded password - "commentID": 31415926, # comment ID - "levelID": 54953085, # ID of the level the comment is on - "secret": "Wmfd2893gb7", # common secret + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "commentID": 31415926, # comment ID + "levelID": 54953085, # ID of the level the comment is on + "secret": "Wmfd2893gb7", # common secret } response = requests.post("http://boomlings.com/database/deleteGJComment20.php", data=data) @@ -53,6 +53,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/endpoints/comments/delete_account_comment.md b/docs/server/endpoints/comments/delete_user_comment.md similarity index 86% rename from docs/endpoints/comments/delete_account_comment.md rename to docs/server/endpoints/comments/delete_user_comment.md index 4d7e8f995..7792c099c 100644 --- a/docs/endpoints/comments/delete_account_comment.md +++ b/docs/server/endpoints/comments/delete_user_comment.md @@ -1,6 +1,6 @@ -# Delete Account Comment +# Delete User Comment -*Deletes an account comment.* +*Deletes a user comment.* ## Endpoint @@ -31,7 +31,7 @@ ```py import requests -# with this code, DevExit is deleting one of her account comments +# with this code, DevExit is deleting one of her comments data = { "accountID": 173831, # DevExit's account ID @@ -51,6 +51,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/server/endpoints/delete_account_comment.md b/docs/server/endpoints/delete_account_comment.md new file mode 100644 index 000000000..9cbe05008 --- /dev/null +++ b/docs/server/endpoints/delete_account_comment.md @@ -0,0 +1,56 @@ +# deleteGJAccComment20.php + + + +## Parameters + +### Required Parameters + +**accountID** - Account ID of the user deleting the comment + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user deleting the comment + +**commentID** - The ID of the comment being deleted (Returned by [uploadGJAccComment20](/endpoints/uploadGJAccComment20.md)) + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +1 if the comment was deleted, -1 if there was an error + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is deleting his account comment with ID 1772717 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "commentID": 1772717, + "secret": "Wmfd2893gb7" +} + +r = requests.post('http://boomlings.com/database/deleteGJAccComment20.php', data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/server/endpoints/delete_friend_request.md b/docs/server/endpoints/delete_friend_request.md new file mode 100644 index 000000000..5d1825d8e --- /dev/null +++ b/docs/server/endpoints/delete_friend_request.md @@ -0,0 +1,57 @@ +# deleteGJFriendRequests20.php + +Deletes a friend request + +## Parameters + +### Required Parameters + +**accountID** - The account ID of the user who is deleting the friend request + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the friend request + +**targetAccountID** - ID of the person whose friend request is being deleted + +**isSender** - 1 if the user who deleted the friend request is the sender, otherwise 0 + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +## Response + +Always returns 1, regardless of whether the request exists or not. + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is deleting a friend request to the person with ID 314159 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "targetAccountID": 314159, + "isSender": 1, # DevExit sent the friend request, so this is 1 + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/deleteGJFriendRequests20.php", data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/server/endpoints/delete_level.md b/docs/server/endpoints/delete_level.md new file mode 100644 index 000000000..ed1791316 --- /dev/null +++ b/docs/server/endpoints/delete_level.md @@ -0,0 +1,56 @@ +# deleteGJLevelUser20.php + +Deletes a level from the server. + +## Parameters + +### Required Parameters + +**accountID** - The level author's account ID + +**gjp** - The level author's [GJP](/topics/encryption/gjp.md) + +**levelID** - The ID of the level being deleted + +**secret** - Wmfv2898gc9 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Returns 1 if deleted, -1 if it failed or the level does not exist. + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is deleting the level with ID 62689548 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "levelID": 62689548, + "secret": "Wmfv2898gc9" +} + +req = requests.post("http://boomlings.com/database/deleteGJLevelUser20.php", data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + diff --git a/docs/server/endpoints/delete_level_comment.md b/docs/server/endpoints/delete_level_comment.md new file mode 100644 index 000000000..384d07642 --- /dev/null +++ b/docs/server/endpoints/delete_level_comment.md @@ -0,0 +1,59 @@ +# deleteGJComment20.php + +Deletes a level comment. + +## Parameters + +### Required Parameters + +**accountID** - The account ID of the user who is deleting the comment + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the comment + +**commentID** - ID of the comment + +**levelID** - ID of the level the comment is on + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Returns 1 if deleted, -1 if not. + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is deleting the comment with ID 31415926 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "commentID": 31415926, + "levelID": 54953085, + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/deleteGJComment20.php", data=data) +print(req.text) +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/server/endpoints/delete_message.md b/docs/server/endpoints/delete_message.md new file mode 100644 index 000000000..5a37fff0e --- /dev/null +++ b/docs/server/endpoints/delete_message.md @@ -0,0 +1,61 @@ +# deleteGJMessages20.php + +Deletes a message between two users. + +## Parameters + +### Required Parameters + +**accountID** - The account ID of the user who is deleting the message + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is deleting the message + +**messageID** - ID of the message being deleted + +**isSender** - 1 if the user who deleted the message is the sender, otherwise this parameter isn't sent + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Always returns 1, regardless of whether the message was deleted or not. + +## Example + + + +### **Python** + +```py +import requests + +# With this code, DevExit is deleting a message with the ID 3141592 +# DevExit received this message, and therefore the isSender parameter is not needed + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "messageID": 3141592, + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/deleteGJMessages20.php", data=data) +print(req.text) + + +``` + +**Response** +```py +1 +``` + + \ No newline at end of file diff --git a/docs/server/endpoints/download_level.md b/docs/server/endpoints/download_level.md new file mode 100644 index 000000000..dc551a9e9 --- /dev/null +++ b/docs/server/endpoints/download_level.md @@ -0,0 +1,66 @@ +# downloadGJLevel22.php + +Downloads a user level and info so it can be played. + +## Parameters + +### Required Parameters + +**levelID** - The ID of the level to download. Use -1 for the daily level and -2 for the weekly. + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +**accountID** - The account ID of the user who is downloading the level + +**gjp** - The [GJP](/topics/encryption/gjp.md) of the user who is downloading the level + +**udid** - The [udid](/topics/encryption/id?id=udid) of the user who is downloading the level + +**uuid** - The [uuid](/topics/encryption/id?id=uuid) of the user who is downloading the level + +**inc** - Unknown function. Set to 1 + +**extras** - Unknown function. Set to 0 + +**rs** - [See here](topics/encryption/id?id=rs) + +**chk** - [See here](/topics/encryption/chk?id=download-level) + +## Response + +Returns a [level object](/resources/server/level.md). + +## Example + + + +### **Python** + +```py +import requests + +# With this code we are getting the level info of Test by DevExit + +data = { + "levelID": 62687277, + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/downloadGJLevel22.php", data=data) +print(req.text) +``` + +**Response** +```py +1:62687277:2:Test:3:QSB0ZXN0IGxldmVsIGZvciB0aGUgR0QgRG9jcyE=:4:H4sIAAAAAAAAC6WQwQ3DIAxFF3IlfxsIUU6ZIQP8AbJChy_GPSZqpF7-A4yfDOfhXcCiNMIqnVYrgYQl8rDwBTZCVbkQRI3oVHbiDU6F2jMF_lesl4q4kw2PJMbovxLBQxTpM3-I6q0oHmXjzx7N0240cu5w0UBNtESRkble8uSLHjh8nTubmYJZ2MvMrEITEN0gEJMxlLiMZ28frmj:5:1:6:3935672:8:0:9:0:10:1:12:0:13:21:14:0:17::43:0:25::18:0:19:0:42:0:45:1:15:0:30:55610687:31:0:28:1 hour:29:1 hour:35:546561:36::37:0:38:0:39:50:46::47::40::27:AQcHBwEL#1bae6491cc87c72326abcbc0a7afaee139aa7088#f17c5a61f4ba1c7512081132459ddfaaa7c6f716 +``` + + diff --git a/docs/server/endpoints/download_message.md b/docs/server/endpoints/download_message.md new file mode 100644 index 000000000..c90b35b31 --- /dev/null +++ b/docs/server/endpoints/download_message.md @@ -0,0 +1,56 @@ +# downloadGJMessage20.php + +Download a message. + +## Parameters + +### Required Parameters + +**accountID** - The person's account ID + +**gjp** - The blocking person's [GJP](/topics/encryption/gjp.md) + +**messageID** - The ID of the message to read + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Returns a [message object](/resources/server/message.md) separated by colons `:` + +## Example + + + +### **Python** + +```py +import requests + +# With this code we are getting the message info of the message with ID 54109536 + +data = { + "accountID": 173831, # DevExit's account ID + "gjp": "********", # This would be DevExit's password encoded with GJP encryption + "messageID": 54109536, + "secret": "Wmfd2893gb7" +} + +req = requests.post("http://boomlings.com/database/downloadGJMessage20.php", data=data) +print(req.text) +``` + +**Response** +```py +6:DevExit:3:3935672:2:173831:1:54109536:4:WW91J3JlIGR1bWIgbG9s:8:1:9:0:5:TWhtIHllcCB5b3UncmUgcCBkdW1iIGxtYW8=:7:19 minutes +``` + + diff --git a/docs/endpoints/friend_requests/accept_friend_request.md b/docs/server/endpoints/friend_requests/accept_friend_request.md similarity index 76% rename from docs/endpoints/friend_requests/accept_friend_request.md rename to docs/server/endpoints/friend_requests/accept_friend_request.md index dd2cbfd76..ebe413465 100644 --- a/docs/endpoints/friend_requests/accept_friend_request.md +++ b/docs/server/endpoints/friend_requests/accept_friend_request.md @@ -10,16 +10,16 @@ ## Parameters -| name | description | -|-------------------|--------------------------------------------------------------| -| `accountID` | Account ID of the user to accept the friend request from. | -| `gjp` | The [password][passwords] of the user accepting the request. | -| `targetAccountID` | Account ID of the user who sent the friend request. | -| `requestID` | ID of the friend request to accept. | -| `secret` | The [common secret][secrets]. | -| `gameVersion`? | The current [game version][versions]. | -| `binaryVersion`? | The current [binary version][versions]. | -| `gdw`? | Whether the level is in *Geometry Dash World*. | +| name | description | +|-------------------|----------------------------------------------------------------------| +| `accountID` | Account ID of the user to accept the friend request from. | +| `gjp` | The [encoded password][passwords] of the user accepting the request. | +| `targetAccountID` | Account ID of the user who sent the friend request. | +| `requestID` | ID of the friend request to accept. | +| `secret` | The [common secret][secrets]. | +| `gameVersion`? | The current [game version][versions]. | +| `binaryVersion`? | The current [binary version][versions]. | +| `gdw`? | Whether the level is in *Geometry Dash World*. | ## Response @@ -53,6 +53,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/endpoints/friend_requests/delete_friend_request.md b/docs/server/endpoints/friend_requests/delete_friend_request.md similarity index 77% rename from docs/endpoints/friend_requests/delete_friend_request.md rename to docs/server/endpoints/friend_requests/delete_friend_request.md index b5e0e7434..f16857ff1 100644 --- a/docs/endpoints/friend_requests/delete_friend_request.md +++ b/docs/server/endpoints/friend_requests/delete_friend_request.md @@ -35,11 +35,11 @@ import requests # With this code, DevExit is deleting a friend request to the person with ID 314159 data = { - "accountID": 173831, # DevExit's account ID - "gjp": "********", # this would be DevExit's encoded password - "targetAccountID": 314159, # person's account ID - "isSender": 1, # DevExit sent the friend request, so this is 1 - "secret": "Wmfd2893gb7", # common secret + "accountID": 173831, # DevExit's account ID + "gjp": "********", # this would be DevExit's encoded password + "targetAccountID": 314159, # person's account ID + "isSender": 1, # DevExit sent the friend request, so this is 1 + "secret": "Wmfd2893gb7", # common secret } response = requests.post("http://boomlings.com/database/deleteGJFriendRequests20.php", data=data) @@ -53,6 +53,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions \ No newline at end of file +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/endpoints/get_account_comments.md b/docs/server/endpoints/get_account_comments.md similarity index 100% rename from docs/endpoints/get_account_comments.md rename to docs/server/endpoints/get_account_comments.md diff --git a/docs/endpoints/get_account_url.md b/docs/server/endpoints/get_account_url.md similarity index 100% rename from docs/endpoints/get_account_url.md rename to docs/server/endpoints/get_account_url.md diff --git a/docs/endpoints/get_chests.md b/docs/server/endpoints/get_chests.md similarity index 100% rename from docs/endpoints/get_chests.md rename to docs/server/endpoints/get_chests.md diff --git a/docs/endpoints/get_comment_history.md b/docs/server/endpoints/get_comment_history.md similarity index 100% rename from docs/endpoints/get_comment_history.md rename to docs/server/endpoints/get_comment_history.md diff --git a/docs/endpoints/get_friend_requests.md b/docs/server/endpoints/get_friend_requests.md similarity index 100% rename from docs/endpoints/get_friend_requests.md rename to docs/server/endpoints/get_friend_requests.md diff --git a/docs/endpoints/get_gauntlets.md b/docs/server/endpoints/get_gauntlets.md similarity index 100% rename from docs/endpoints/get_gauntlets.md rename to docs/server/endpoints/get_gauntlets.md diff --git a/docs/endpoints/get_leaderboard.md b/docs/server/endpoints/get_leaderboard.md similarity index 100% rename from docs/endpoints/get_leaderboard.md rename to docs/server/endpoints/get_leaderboard.md diff --git a/docs/endpoints/get_level_comments.md b/docs/server/endpoints/get_level_comments.md similarity index 100% rename from docs/endpoints/get_level_comments.md rename to docs/server/endpoints/get_level_comments.md diff --git a/docs/endpoints/get_level_leaderboard.md b/docs/server/endpoints/get_level_leaderboard.md similarity index 100% rename from docs/endpoints/get_level_leaderboard.md rename to docs/server/endpoints/get_level_leaderboard.md diff --git a/docs/endpoints/get_levels.md b/docs/server/endpoints/get_levels.md similarity index 100% rename from docs/endpoints/get_levels.md rename to docs/server/endpoints/get_levels.md diff --git a/docs/endpoints/get_map_packs.md b/docs/server/endpoints/get_map_packs.md similarity index 100% rename from docs/endpoints/get_map_packs.md rename to docs/server/endpoints/get_map_packs.md diff --git a/docs/endpoints/get_messages.md b/docs/server/endpoints/get_messages.md similarity index 100% rename from docs/endpoints/get_messages.md rename to docs/server/endpoints/get_messages.md diff --git a/docs/endpoints/get_quests.md b/docs/server/endpoints/get_quests.md similarity index 100% rename from docs/endpoints/get_quests.md rename to docs/server/endpoints/get_quests.md diff --git a/docs/endpoints/get_song.md b/docs/server/endpoints/get_song.md similarity index 100% rename from docs/endpoints/get_song.md rename to docs/server/endpoints/get_song.md diff --git a/docs/endpoints/get_timely.md b/docs/server/endpoints/get_timely.md similarity index 100% rename from docs/endpoints/get_timely.md rename to docs/server/endpoints/get_timely.md diff --git a/docs/endpoints/get_top_1000.md b/docs/server/endpoints/get_top_1000.md similarity index 100% rename from docs/endpoints/get_top_1000.md rename to docs/server/endpoints/get_top_1000.md diff --git a/docs/endpoints/get_top_artists.md b/docs/server/endpoints/get_top_artists.md similarity index 100% rename from docs/endpoints/get_top_artists.md rename to docs/server/endpoints/get_top_artists.md diff --git a/docs/endpoints/get_user.md b/docs/server/endpoints/get_user.md similarity index 100% rename from docs/endpoints/get_user.md rename to docs/server/endpoints/get_user.md diff --git a/docs/endpoints/get_user_list.md b/docs/server/endpoints/get_user_list.md similarity index 100% rename from docs/endpoints/get_user_list.md rename to docs/server/endpoints/get_user_list.md diff --git a/docs/endpoints/levels/delete_level.md b/docs/server/endpoints/levels/delete_level.md similarity index 92% rename from docs/endpoints/levels/delete_level.md rename to docs/server/endpoints/levels/delete_level.md index 3d0a9ad63..e9c06a76e 100644 --- a/docs/endpoints/levels/delete_level.md +++ b/docs/server/endpoints/levels/delete_level.md @@ -51,6 +51,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/endpoints/levels/download_level.md b/docs/server/endpoints/levels/get_level.md similarity index 85% rename from docs/endpoints/levels/download_level.md rename to docs/server/endpoints/levels/get_level.md index 8f952de11..a07453dd8 100644 --- a/docs/endpoints/levels/download_level.md +++ b/docs/server/endpoints/levels/get_level.md @@ -1,6 +1,6 @@ -# Download Level +# Get Level -*Downloads a level and related information.* +*Fetches a level and its related information.* ## Parameters @@ -49,14 +49,14 @@ print(response.text) 1:62687277:2:Test:3:QSB0ZXN0IGxldmVsIGZvciB0aGUgR0QgRG9jcyE=:4:H4sIAAAAAAAAC6WQwQ3DIAxFF3IlfxsIUU6ZIQP8AbJChy_GPSZqpF7-A4yfDOfhXcCiNMIqnVYrgYQl8rDwBTZCVbkQRI3oVHbiDU6F2jMF_lesl4q4kw2PJMbovxLBQxTpM3-I6q0oHmXjzx7N0240cu5w0UBNtESRkble8uSLHjh8nTubmYJZ2MvMrEITEN0gEJMxlLiMZ28frmj:5:1:6:3935672:8:0:9:0:10:1:12:0:13:21:14:0:17::43:0:25::18:0:19:0:42:0:45:1:15:0:30:55610687:31:0:28:1 hour:29:1 hour:35:546561:36::37:0:38:0:39:50:46::47::40::27:AQcHBwEL#1bae6491cc87c72326abcbc0a7afaee139aa7088#f17c5a61f4ba1c7512081132459ddfaaa7c6f716 ``` -[special_level_ids]: /resources/server/special_level_ids -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions -[passwords]: /resources/server/passwords +[special_level_ids]: /server/topics/special_level_ids +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions +[passwords]: /server/topics/passwords -[levels]: /resources/server/levels +[levels]: /server/models/levels -[udid]: /topics/encoding/ids#udid -[uuid]: /topics/encoding/ids#uuid -[random_string]: /topics/encoding/ids#random-string -[download_level]: /topics/encoding/checks#download-level +[udid]: /encoding/ids#udid +[uuid]: /encoding/ids#uuid +[random_string]: /encoding/ids#random-string +[download_level]: /encoding/checks#get-level diff --git a/docs/endpoints/like_item.md b/docs/server/endpoints/like_item.md similarity index 100% rename from docs/endpoints/like_item.md rename to docs/server/endpoints/like_item.md diff --git a/docs/server/endpoints/load.md b/docs/server/endpoints/load.md new file mode 100644 index 000000000..55a3deebd --- /dev/null +++ b/docs/server/endpoints/load.md @@ -0,0 +1,45 @@ +# getSaveData.php + +Unknown + +## Parameters + +### Required Parameters + +**secret** - Wmfd2893gb7 + +### Optional Parameters + +**gameVersion** - 21 + +**binaryVersion** - 35 + +**gdw** - 0 + +## Response + +Returns seemingly random [urlsafe base64](/topics/encryption/base64.md) encoded text + +## Example + + + +### **Python** + +```py +import requests + +data = { + "secret": "Wmfd2893gb7", +} + +req = requests.post('http://boomlings.com/database/getSaveData.php', data=data) +print(req.text) +``` + +**Response** +```py +UmysuWpDzKaglTFZR65eeJxEnVei5DoOQzd0P2xl7X9jzQPA1ZOex9dlK1CMIPm2_r5jnL_597Z29xntb9Vlf29v-7tcbf5dLsd7zvk7XD7rzP63ddlX63_vo1fMOa5-1859n_03uKxH5vDbev2fqVe8e-0x8uXR-_LlrOFMvfjdp97hl627dy7b80x_oj9ttlVDO-M-47xcnfd5nsWf37Xa24-f5AvjN7V3_HXN5-z3zeWt2xptf56ahu-ufv2yGsHcZ3mWoz3t1cM1hzGaHn536-edPPzM-rhGfu5aI_OtNajRefVmZwx-2bP3eTT3d549M8t7dp_1ifvW43v-tfpC_XzUMtUb6tl3ZUH6O98agl72zvZkpUerb18t5HPedpp_N976Hz_w3H6z3fveN6_ojQ1nPO-9o_ZArxjPu2em_9x9m99cDz_9avBPZ_6-bKsW_O_VTGuJv2fbs9jvIrN3j62XvTW3WmV-9tRKvN-cavZP42e1kLVwJojxzpGZvmOde59aoDbq0Tm-oZ07dx4es32XczdT2iiqmMf7_NbK5Xe1G3OHhsc87fWJGGO9W4Mrwu3nud875s0xqFOyV9a7jZtX9HVqZn54v4N7_Kd2tNZDPxy1l_3ROCDC4QP23FWnMcM446ycsLft0bNpfdSlTuOZRV56G_RWZ8Lf7vtZ27fbWe2EMnY9rg8WGY33-lyMXUdoehh1Glv77hbd69Nz1uE3ddY-sXRa0NrX5zsMNb0rsn_HM8b0asyabPOJHqtWqekb8_S9PPp5e43D31gc6frZ5oHXbGfesetX2uvasztWnp21zh5E_X779BbTOUM08sw6u-d7tvf5ZiWKIF8PuIa2ThboGdvEV0xhPkffu099-Ojhycl6s7CzWFOtCtMes0gur1vPOR9za08tNNN72-3wOS7Pe9azPzrbtd3-4Hh-m1Mb9f6GN4oBevFHkegy3dYE4BjanV4blR-OYg8rBDP3Hh-F1vaNvK9IuKjOL9n18q3lL65U_9b7VhH2zhyLY9ZT3oDTz_IOzrffne2upYap-nqd_pH8LKb5mkZrcW7PDOaEw-olY59mvl1Evl5T0qyJb5_HYuXn-sDWeo11M-biRitMoTiPqaeGUNSmPVxFoo83fBXLm82Xc57Rv0nB0U11o8FstYy3KLdZ5tTBDOt6R00pcmDUIy2rLwptGk-JgiaqWxw2n421dltet6LV3V-Pslj_44VYZ-3HR38Vy1yZ5y7CDn8ZTzthwWu-iFwdqVruzbLWKhXP3DWGU2Q26-B7CJc1W6bDkkV-7buKefhd-xR7ZftPf_YRn6lPsiLcq5PbJJ6KpIrWGStHbUrKL32dVYZFFw3UX8eG17DctTynnq2rdvZ9nhzK2otuMqj5vmbcT7GkGR5eZ7wEhZby6SV_YAwlXOb7-CjvWdLFUrTI-YTt7aKjsJNV293Np0qMtOWt33Xo-3ci68Q172EJ7SfUU0y25LYYYG1QcR-9rVgBR0IEoVNtvjCLjXQJzF1U13LCSs2owxLl5Z5PHUDYvZDErcmVUpOH5__B1Vo9O9T6PmYAJZH7c8TgS-q9s47x0KrdohtdloQ44TJIwfua1uptJfs9vSIa6wb1tnuLKCzY1huZWyTRzNTZgD3EDZ86nmySv1HiM9NbddKunnhL5l4rWaVMTTQGCbASy8WqNJEjOZiplmx5vDunVIZX524he7bpvH5WwjgPn_3kvN6n6NCTuo9Uy1yiaviSE5vLIqz2m9Tju0V4t3GeS8QUp-B4lIwtSQeFlVy5EFhRPxKtZtw18FvUFIGMHivJU2SAiKnPduQ1Z3KVfvBKaawVqHdBJevU7j2w5NJ-933Nz04Jg24qO_O2bz032pPpF83tiKCK4kqMmuJ2MYpzPurc0rrqzOy-2d4xJbXrar4l0h-IYsJcDqOr7xT1aPGely2VhH1qwqUDaaKl3Ozi61zWo6WEQ6HF3Up5M9crihK3vBzlq6nU2oi3SESsZ0YulFQtVmRRWootxCy63u3j7iWtS8573pBAC2mUWC1e_12XfqOVv0Vcda2Z310D_Z6YiEtYVH2k-DOMqRj5GjmLpR3cN0pFEbyVn9JiSzRbhPTS8t_cRePxcS_y84jf2ryc4Bf29H5KYZHkNVmX3jE5n4dF6zenD13CDLWU4lJZLUTrugwEva3kR_MS1j966SY6lEVpRVc-qqUbdLPAy9HwNIqGWG4fjPXUpL2aJRi2BEcZI7U1Zo23OFH3wa9LlDW97dwWOY0SL3LWID5hemEMOu31strIlveW_PfP6rT1bYm1i-NPRGzt1bN8kMuMKDpFL68Xldj8-NtdZQ56NLU-yC4t-2G_9V2U--gVRVYlBEL_A4V_aQzP_yeKmfUc9YlF4yf6Lo7yewKTR0_0kjyZ3QvH9JQmvCq7L81EK9Eb5-R4JdbNqtWG9J5L7EgeqH92bAaReY3tG2aR_Fm-HLUfj5-tB27ze1ftqJhXf7Afry832-iR1amOfVUqzLO_ARdRjCeirCxnk2DRPXbkNHdm7EvCslTi_KwWMCYF85gx4oqSig9omG8tRDfRnFLuGkRTx6T4fvPYi8gtQurRjiLIyyCPdUJ2xaP6yu06oraC6tPFZl8vRVlarz_HsX7ePNzQnv2VUs9P9LVXvMSrObBn8xE2TKxklAqW-b-rllE6cqk8y7YxXy57vh44JW_LEsli1veGKb52_z4nB6zUPJ-kVepeP54pngfvnVT1_l3WpDWcukS_7LocNzq2rqdNNRSZ4q7XRLH3jEbyMDSd8l5SHYFcqnN9DXnEC94pXbuYS5m4w4cK6RT75hRRrbCUYv5TIgFrv0Yv7lJy_sTwv01G8vCyv0_LsqNBLa8ULgeTYB3AR1ZDrUhxohER3UesuzoNzUtd-gM6lKb2lqm7fxSKANZunnp0f3watVIrVcQxLVDeLhs4R7FUv-0Fro0dO8PBExGV6EH4iFjLzDHd4njon304eLNNuuJJ28uDGHxMPC_UOnIqS1Xa_nCf83f-yoCJdlESroXesUFR1mojcFeFzaxuJxiOADxFHm7vXvX6FXLbl6XLPUN7UQrwiBAqFrHvyAN7SAiVDdbgLF7Ie01x0oB8tIoVlEDLVhURPeFCxQoaq1DDR1DqVxxN6wql3hUh5si-thb1BvSBxzv4yonmJ8pcHTlDJXeevKNoYFsovKV4fD6TdeNxQ3qifIg0Nta6dYpzureC90IPJsTidNs_m_Cpz4-Gx8R-mTpv8SRhwL_Hp2yWom5VqH5XjDxDK2Z6s1lFBj0yuIwSmzqQzs52FUHtG1lRe9jMb4tdr_NddkSwl2JvvDV6cx0SM_LartoaWy8lV1Z2vMGFwgBxXH2LdTknfqLOt5wOowbcPmZZj36HoBSs-T55dmNBT_-sOKcUE1xbMpRrMDUg_V03X7-gZAJ-K5vMH5_vcKl1v6_V__NBhGNFj6rr4tPfRrdukwQdtEjW5FjK7jYDLJUCZlmHtTam-cuQ7bIB3rnX4laoWfQ3g6gl8dBe_DsnMqHkptl8wxCWFsSz5_2WpzavZyGwpx6PvUi6h5YWqoeHXlwrRFMW5opuVBrM-gykiULjz5W8aubzZcg-NuHR32trPIjFyvuBUsC9rF1mN187WOoRCaUasLEaI5rdN_RSxGwqytaYksAb4-fZZtgsaphTnZlQWjHFEsYoR_UGlCq_4aD2xgookrII32iqM6fynZLFZ9UhsAOnjngbvWc4ZcRat8QXf_tHEfW2aD51RlZ7Qkkbw1RTKtVoebs6ur4fQA3_DmvN49i_C-28tpQ74nw_v6XA2DK3Y65aisd-UUhtFC9bYUCtNlyeWr5SmuiTb9dDJkbM4N4--kC39ZgH1OIdQS3_bcOaw9oY3oYwe6gtHB5d1MZ0LcZ7bejip8U3qbftE89PXY4boSZOsXOWynSd3bbyi78NQ6TEyenNf69XFF1dH7vX1PZgRLXPkVbKdR_RCdgIH7vN4dZilUVS-lqR5ipe3m3ml91aZtq3kbX9LcNBV49sqIdvaPeR78YKWLdViJOshJaffWsfL2eiprVwlZoplV0Xkd_xFXsdUHG8Zp3ADGYjvhMzpTIQipV7CkWYxRtsa-56gXWKOjonpCb949vNAwMXr6vltaVecqPkzbu_Y4tzX9ZNie7tHUSgn--s4jv6uFqpauxKrWKtnzWUjvWXHYRXdetcKP3vR9rrqWlij5W8beISZe6_j-0Uwj2r2eQthYoxlNKFvRd-y3qeiNtSGMa3QXAtueInJGv_aCshXGZlnL1ocKxfGXxFyXkFxkZ_fZwvLDMfObj42W1CJn64NLaJ3aA1eeEDltJjJbLRpU37ZXVS4bLbl79F6-x8dqZjL7CfcNuRZyfGgC9LZ7ALty6LnUFFJVNGj1TtePqtIpYOMx2-QEV6FDVUgEHhjRJQZVLfTIxQVc5oqXLhIKV-1G54i88pCWpXeem5LZRRQoeAk5UONHu-W5ZPC2tm-adZWr_8V4s30CRG7uJA0ci5u3yWhv7gu-g4w-_FaZafvRJLkhkPklDBvYN_SvZJzRfj2ltV7MO-HI5lD_kOVjqSuJ4g_tX8RB0NP1zS5vU36rLJs1pir1i3j-Mo2gwXLNX3SeCtlNjxDqueRZz7xmzBV_BmsaUv6hUlz2Cqmhwb47t4zMzDCNUcH72nobN-qj0iOgy4RJePbB2XJePqcHIUmCwlBsXPlNG0qBpCnUCvOpbiMauprR_Nvs6u4N52wK_eFu_sQbBHhS_Wes20ixwwAupwlip1PnWsBoYGifG58CtqGYqKiz1YNcVz_23AA9t4vVsKiVrzLOXPvkmUwkfaQA1ljs8cv-fYmQ7JjSi3Hf9SxlsMaPDaovR32pC7JRS2ot8LYSH3AmGRu7MI8_00u1LJiAnJcVuqurWRF3O4J75ZP_-04AfF98QLsD7FrhP2WGHZZWH5WQY7jofwoI2EVa1PBGHBvnn2YAuG_8ta1XosuGsWjw2wvOrzcxkUS34Zmk9pnaFhjrvEcbW6aIQ5miWwohyi_TSWbHVQAvP_AbEHDEcNIUHrZbMP71qN7Ikn68E5O6K1EuTwQpR4e0xbxQg-EQ23uVmeu27Y7BwYX7l7no9_lDUaTaNsu9omT-hgdZkGyvB3AJmjCQ7gu5z9u1x3mpUUS152Rx5ReITBgzPjO8d1MBLzHrfHVVGDX-K5-CaLVBz-xnJ1QKWuym58c1mSzlTFGwzKKMHR9vpcyyWUZLiX3XVbIqn1z43LwAwLD-ifA559SwLuhRvTWvBAjbbCRFAnNFyLsmPYl2zC6yMmVoe7VGNtF76KrCW8Il6vUqSGD1TJAJzYiPG3RJ64-S663xEYQxyYwRx0Vnb-4OLs0O8kKC4JUfSBEgrjLMMFF2lWCyVVbLrY-M6WIF7lnyy-O39m3cAT9wV3y1jdwlsQHcFa-Vvyyr8ayS2m9f2qDKcdxbXMNrOyDmTkUwzQuuzL4_LKoETVwqhfqMm8rn4FImIRW-LIAImA2Mq226uH7Iqyu1la6VdoDYTnik0oukOovGYDdyzGV4crfksMkpyRRiBPb2JO2QqcVTvEjK0qXU8BSEc4XiJ8Ese3GO38kD1F9a8P0ThoIL4squ9d0cX60RvpVvSWoHQ98MV3Qdg81vhfWQeZ40VQRWS19vmzcKlNzMeFgTnlXSst-X0-E6RIb3dLn-KxI76XOkstXosyVe_9whd1_q05Iuns1i3edpd93ZegyqMoKAFwTR4_U7AInVCE48o1hLrrUAvh0dW-lcamst-gDIpv-9oKf8XRIflZ0hzjSANY2FGR1tgpN9438ENx_7YejaHjDIXU6vCUGLPmVDYGoZMihTJiofDrsRzjd-omMWNEW-mzNUn9feIcsNE08aT8NmpuB7twVli8nmOqqA8AD7HuB8TIi0kwV64ufbY9N5ieB0UUiwbt8Xl_RuPA4o-GBD15YmWObK146VWTkIN2epbcsWo2a2YxQfcrn4L3X3I5Kh0hCv-uWHpO5CQ0YJE2B_guu8Nr-6Z1gBJB70dYpfEdERO2yfPFRkvbFYEwHhQg0S5CKhyw-N8-nwO2TN-Oq-GWMtuaIu5l4F0b-R3WbR9xR0_-JEER0LDtzxhO1nJshZ819LK2orvV5W3f8cAsz9E-D_gTzahMysCHOsG_9uFgnm01q554ACkVpREHuzbzSud2vFSAKM0dafQFL6ATM7ySbO1NfJvJF1fy8uFnyFks9cKhbsldOyEJCj3rkYDB7x1hfbY1o1nyeSbAUvt-P0V8olpZzbvNd2sJxrIvCRNjjO-k4ULPTtXdrOhlxbyV63kMMKi7y1CNBb7wybdKFwiehN098Q4U-7SLGQHzxuXY5ba1k-YIPMl4wEAs-wEenuBZqe69SYKsZndqCav99gywjt_9lrP23BEHghf7izY2rLrQIOHE14RXs5jfD8tCMDKobr7LKAnCWMsYrzo9guMsa0I9GstLaDy0UupacWndruHuuNTqchjAiXf8ia9p4n1ceXaiuXZfDgdf6rK0rRx5uTUd7-BRI2-eUi8_w2yCtntiubXARepnTCXTKzOiTz9xcOhEVIxvl4EvLY9tb9zLHhAO85AykWnz6VrkdWMolgreLcSKJEc80nKqWWssU5aIrpB2HU7qob1bXtbv7JoRL2TBVYSnuIM9JcRvXuEYVv2rfXYDwAq59UoQPU_IG-biiREUim-qww4jde5F5k85XeRrsDjEjPcDtTT2DtRsBIvTxEori4kA7qTNbJskuaZbOo_hm7Vp54nrtpYI5bL58nye7dI8Zpa_Llu8IzWJdrIKtxZhhNBuTIsGisdoDb7bHb8vZWidrXUsQS0nx_GuPXEjLawxm8jAI_sHg3ve-xEXvglzjWJvT4hy15qcj3YmDiZjAEooPXm4JLS4a-3aXiF2kBhWnbsCRD4vC4hwyPPiTw2Fv8NBx5qRwLsZj8TQq0UZ86fsT7mf_JEzjHvrdYZAyw5forWLN4H8srK_0aNPdA7cc35xje1TMzf0ZVa6QX0YStQFeYpE6W-2FN_n-KJHC9C0vkzgw4rT_oUa6sslsyORkYE7S_x8bAZcUkJVWDgOmNfhG2_YDBAXR7AxMVE8r_jQu98vmHPBfGcexkW_evOPdzw4v6LglR61Pi_tBFkesw1LFf2pvi3sbc0Km0HYgfrtmnLMgnm8WpKiuWJ7DGyB_Rshd6AUWdNzCTCGg8DSs7UHEyDDLU64HNgoS2gZ_F0jmNdAYPgtMUrfBZKY2Xe-0hXNJYKnHajF2wk5Q3XvNwywkNmNiVOMIdf6v3EfgFnLcSfQbO5WDEXkfEyXN_6L0kK-mNaA-yR8cHZD3dCAaxrRsHCpGRAL3PecYN9Z_xj8OGqycUchmnykuHreXJ-zAYyN_pNvwHA-mx9oXJw9JTR34tZlNj_xFG4UV5-wiy1rnlGc8UyfDgS3Y-N19xeWIcB1LZBQ_j9n2nyJh7PcpY3doATrYRG_Xkw8qH0U8HSbX0S7cEFqmE2hMy1t3XOw_hEm05H0MoP253IqneH54BCXeefVHT6eJa8j9o0fJd5s_mJYSeQUAQ1jz1gMnBm_V0-jZLoQUgHcLjlm9YpxP0_crZdEquN4NGr84XR2k3WNEhB9Blo2aaJMdwOB9zvwMsl9iYj6_AFIwQRB64GS23qg_oy-ppUrSa6ZLiHkbeIiSWRYQ-uTAdfDuGMStRwPi_wRUWmXcXuOpz8fRKXe_IApEWAdzL7Wgu-hizYNaHC4Xv0OEesBSaj52WKcWnowMF0xI8yYraBtEcU517rbeoLrZmCPjOMJdl4aFsZsjgdKCag1f2cPw-_Awi97E_EMg8cduoty6IFglXT_DJPawu6U5Rk2MEA-CPp2CKT8nBkDM1oTBNzyeohGFflnZcI31mgV19pmbXW08BizZ6BqmxEMdVm8t3tkpSQbi_Bs_t5yBo79iTz73PVtw5BX3w7qWuXrKdcbrJuguccTDZpyyJdXW11j9IeVQeTNwyJfGfo7bjJg6ogvUFfy5xIhsIu1BjQVSC-FEkeEPyaFxC8TlkOrUwr3tDNwEOBZUv_R03v3Zr0ABmBryJ3i3zp4pSYE_zGKqHoLgZUp_DSPHFHZM9w1p6POQzHWjzGCYR7fIyehqgGIJGelNuPYY8vlu0yapZasBEgGbzNokbSY13pVvUJcdHh0WAaa6awxbx_CS-6JBtoefAkR9AetUvO7ANCyoYKZ62VlQVmqFnHdJnQiYQ6MaZb9Yr_G8sbjPcRl4QkttlItazNzHuhojl4MwKinmb5Qw4VfV8YEHxu1NF2wmgXGwErXg9YW7FUdO45GWEJ74B_iwfU1u0qBmrZwgVLHibV0M_pi1JpwW4M4uTjQg6nrvC2Q9yfy_xZfznF4ZmwzxO0wiBq7PPHpehv4_zgqn_VN8wp6F46Pd9tPd_CvH2_vy_yiTtpaT_PObRxCOUeExK00kRqyswIXS9xUTPKFX6FIsoANAy-QQyCoe8MyfQh1IGZbD4Bw_AY0SZ7T70b7HNLFtl6g_CxXHaVuoV5c9Y73i-RefFEeBhHk5XdsRUn1bZjGm8u13-8Qn2YnQd2teYi_4CAh40SfOzue9bokyu83lPJie3N0QZY1JwZk2VaXwqX5sqySaQJY7KXJsTbbfrqBwrVXAnqHgOswmb83kvRRWEf62CkV44lmUmTTMvQysmdmPF8HPGAqscdxZ82VnWlYQVnt0uMMhsJaVeBYakBx3fhiMcIj8UmT6pKUYLcwZ_gI6XoGJSgO4KhKPbuaMSU1rvVaDSAShj3IsyWr1zbvw2Af30RPD58sOn4NKwZaMG0JFx1DOd7l_Yas8K8uo6o7gHyrJZDVuqGIuXAaaH2K636kKy-e2VLxtRGLfoCy_bgjjzhRrvb7acYwEBz7MqbI1wnMnYj9Gud3LAibCllwFTuQ8xWUWfeWrPdDoBDpwKvbsiWjRV_BQfQneP9DPkxN_MVPw2trE881vO0h7VUYUsLqwXM_AC0EbQB6s-VPX8U8xue8KmK3yAeuihFlNnvf_Z05YlWxdUpp6e_viBanCO03sOum8hrZsFd4bY5uHh6gvmxgbPBm3qX13wdGbDjsA8PWfK5ObU_A6x7dFY0Spc0JBV5pTlJ01J3wVLopGXq67MS7PtMRyJrHUzJ_fDs3iZbO0OuOdTQgvcgfIL82K4hr348c57vHl_iHuhpo2XynJXAp2iXPpk8KyT62PwmM2ocLa3ssO7E_t47gwpe2fPaPNOZMFMU3foHnOl24rCu8CJ5GncYRF0itzsHclRx9iOzHtGv4s_w0-ls8ghcRXaMA-z-i2MJ0cYXiXS_DN6lOdRTXVZgUTdRA0tp5Icsi-7AY6l3FGuT5qiscEmazJTNHSyCgTqJtD-VPmnoA7rb5qViEorpfVfrLiGoCltjKKhEk-VqJ2HwuwussXOi5hMmOS7qsAKx7bXEdPJtTA7dmpHMdh9doNJj-cFIbZ7Pvb2ZlxDiXGhK_jrQPQlAjKg9-6rCyl9hYDGfSkrTOOFvNntCJcDlPc5zeLRYn2aoWFmXTv-fbqrWSUVRPrI8bgv51wivYm99pRYHqMxJpXPu1a6cUtQu5A8jSEyULjuGMtSrjcS5ayaAimGwCjkj7Vgc-n_sxqjrczgcE9oFbs04bZoAdSEPK9M1yLhQRaS1zjRwpXOlOTR5SF2xe1MEPVJq8y-OUnfrCl-M_OHw93mI8OnJOwA4COcLQ-jD3pW3IPa23oWSYY8zzoEFmZd8kgUEXnP7sNWDLlcdJUdHx2agcFiREwZyzTjbUsnpfpuIrz8ifwgMtD9SHP4UTn3PELyn_prLSQtreJrhFtNgCfCnDx3oYDNbDAd0dNaSeXfalDVREQ6eLju_nOhmE0h45bcD2kFrqF7f1ibVBwtvn_ztEwfSS7URUXxb_DDGUpHoT4j81jPbDMjxGOLCEj_3DY5PGZ2sLjNYjo7Hublxrot89LMv4xk5Ng6FEzvNpIr1nz7qSlPXeA-V4PBu8wEjM6X4piEz7dxwIXJ6A2DCnDV8EwRAN7oBelU9pkBGxP40In8kIn6mfPf8dUJY2IMjeb0i4qHJJqp4p_CgxRTMhG8KW8MGFnMXfgEtMTyRTxFczQI_AQUscKPtxCu-946jEAD8ri_UoaK-XlSb2Rbzq7_-56KnZvZEQWNkxGQ9R8kTuamEeCQg0m2u03JBH3ioYPqzvFRxmp6kM_P8O4NeTyv9mJrWy28nnA03caLdaFBLXw6HKZAnaAkTIytEupXoaacRH1vjceOS7-3Vld2wxkgk4tHuykyyF-CFKPVLGvF9NCMWf4aCceKZgbSQwilwPIAJ5WGAxUrweIEqp3VCrpPwcff2pxfbaXTQunyXyQBy9KtsNt4EfQOK-Hz9e70ccteExXkqd6M-H2tzrW11ivieSHU_Q-b1j-NzhVJ7xME9ViEioj7Tv_huokYfyTEXh4XoYBz_hbT0k_wt_DLRXQVfIAWpWON-iVnKQ_bZnBDc1KZ_gyhNTAQQlc6guhoOb-Ace-_GItEQpLwpt7fsE8G_bWyXH-7eBZW2d8ancHeX5Ux_XB6IY8Fh7C4t8HoPMNKfogZtzmo0vA-axnl3_PMN1HMpmGdsgKLbqOlxawlR2glb5kW_VNICSwGLcg34yP9nyJLpVLy7l15ek10RVnsol_OiyDNQc1AmSONOahPmXDOwp2Jk441TkZ4RCBaRkofEM2eTBG3jD-ckatL-QEP_coZJJxq4vNwogxFokUCfSu0bVl3ytjjZAMp15MgF1okFEdgN6J56oc7zvF-eqXlZviLceTj6c6FBERJTewwF_dTLnB-LQ2pOf2wN6x0r-yJNDn01roFQsJMq2vcmgfhDbMV2XCM0RjwtyT1MtxjTsDp5UUnnMWosPBDxeS1-UdnKJpv_tyEiWPZUzlh0TE1eqzep5hIkLna0khRO4jj0PUgvce9dlqUyP33ABVeYbRSLTelSpjl-AYVLjwy5_Cu1cJ8PX3XYNUwAzsWxsTkH-viGX9J_-dj06Iu2mUcXe4Xqz42RTdqy-PbEnDImp1dpvGAyb-dhoK1YJQMR2fK1cBHCxT5JwxXvnCZx5kpFqjYFvrHgVa7lx-2g12lBtGDvr3y961fazUjqETw8BHsAqn5AciVXv4xFvbLy82PANWd5zriigIGCtCE80UGOWyMoDCKxBzA9DW6ehCEBW9atkD-NOcLbN5mcfXFrfPFY7cXh20PeaP5p5YsO3jklUUI510scn2uHzDaiUChNRI5nOivkpgfk8tlRLCxrb2nExzbatJSzqeHhAFzQuvIpTZJ8q5Q8SNRtgVwLMuQYgMc96f_cC14XKUGRk7XFOhC6X2SEOTUNooP7jIFZp-8qM4ayfCShQPyv5SrDgaud-KLhZp_QNw6knmtkFYZ-9EqohcHs-W4yyB11Kxj39k9GlzMUfNeVtMfGWAH4-bo4l8LFOglHOi8DltZ24WSKuHSuVE6CwY3cyQSJ4p5LMccu_lLD6VLWFXnv1uS_bZ5ZgWnYJwiMf41VmM-pSdxfVvszscB_mEA5isy38EoPa87gkOFvmXJClIia5S2zaSRfJ5JAp8xN9ADVMWWT3J12whN37eXIn-F3XyJmYh1Hua9ve4yA9IBNwoXxygl7Ju08XfsUrB6LQmjmZgd8pel6zdp2GcHmZFboEd3A_l8ImlGIBikX3_naqKPSJ9kLQS6s7yVuGsxPQeByimRDPp7Bg9R1RWvGhc52JiKNuWHMnbDM_atD1-_mFy0h2GBnjxuUiOLe-XFSF8olZAp5qJxbpkHbfLZjOkd6KwbMCm0Did3nU7wZ6-GQQQcsytL3soOLu20IkIBKtYGwyNedP5gx72UtQsl42Axq4b_vDiMhPv7i2z-YfaLppKE9dvo-R1ROIlOEhdYoIw3_S4JLQrIdxpYTZL1BGFndFImdmx96dxE7VtbOeAwud7_c7-TIs5NCot-C4uMs_jQfuGR5I9SLLO1ANmFL6HZhQD3QZ4SRmdZ4nQndh6D7Z6bK8P12-f4HeWlpVhpC29d4V5goFvdZcLsk_3RtZrMgitTSn69UqOUwikOUQsdFECieBZxda4LJ9C37bjFSmiJStEvjBdWIBEqfLo3VlasbzVKrPzYyo0WaqKG1uhqsVTxt2f7AKM25EAjWv_UbUilt2QZCW96ysGrqMyZgiEQZKQSgtiilF16LMDGbxXrM1JPkwSZe17USHRag2oFdO0BtXF-b_zVKUrFuWgaStxiHIbZWh0xNEA5oXq47TCmrtlX7sFBYhcptJbyQMCfCjeZuKCc7kCRc5zhspsICY2e9FGlk0sCFF3SQJgm_7nC2knIdR-3i6NRRca9DszjA-Dwjum2Mqgx_4mAH16BH3TWrntoDutvtKyHBbE9nCh4qmi7gB58u7AaY6KZYPcit7dvv8XNQKc8dPM5z0P0DK2RVLqYXp6iyT0NT6FBigw7pbooCKhRLFVDMKORGZ9pE-wCL9YbB0AnXyM4LxfgM18czS6-ef9xhvxc6aDOJ7EfeEEaxH47vzuWJGb8BdeKFKyfPDk_BF9HmqYzSvVVlbz-sncA6EbNDAPWkgb04gnVQJcXonfsXkZ8HcWyxP4rux8Kmb9sSyhJbCcMHK92yNzEldHv0hb6Msm4U5HnNLcDIKHXSYFPexbTqpWfNExwdllQEDStYaL2CAzqYDuNvs7YcFfz4JmRzvtwsPBSCv7qqsIpJHpaGyecSNzDUvaCAfPGz0YB8kASx5672PsyMY8DWQCwD1Yz82Jkc74bBgr-yBG1SelKeDacSxtSiMkNgs8tU6i0CQRk8SZF6uxbF8zjWGV0kcmecRw9L1C9vwMJWFez_9TUVHdJvUZXPIQ9bY8gfLGrejA3ncrZ8CfkwwlIp0ibPgVTm26yixE7zVUpHRcH8SwTOIMlx31KxXeVOW6C4WJxY68UH6FUPVGAdglvPRaANWGKXhUh_EPhOKS7xmqyXFZg7mVcB6-gvHmAn8Zs0yrL6K9aGfqRhC8yXpH7EFpepp8rtMYZsNqxllozcoqdTSYeKtNQ9Eae--fNprG6TEh9KfzCSpvWFa7M_OeMuyHgp445td9tVTi_Fk0YthJC-eKrPNfvQFMuZTKUiNeeVQmXKDfRiE-ybVdAC6tAFJOY9ECOuczA-kV_zrpq7lSzrmsAeEvPiAp-qyDZtpWGBBj3AJ4x--jPm7ziFLOG8mR7jlmqSonMwDTNEKJLX6vlQgko6SU1mXLSh-0f1XPljId-thKhJlSkbwDLOT-hF-B28bkBvJevIzk_eNy-HjyJek3_e_IeVynDUgahZE3mKsR_YeuKhs0Tq27Qs0T-oCe80W0U3H8KmPED8bMNHRU_UAYwv6wpl8XXjngU6wRKkhBZZazuiS2MeFQqksnAqymFmJ1FOH7QQKV8PZ9rLi4079gEkhVNnkpOx11-h5XvKYbTk_fX7FgUZTgp8DHQSpgmrAzx0H_KAowucTBOwax-kmLzoBG7nj5Jau9QkkQ3ZrQiG1DLbggNve43Ca_OefL1EYNvvU3nU-F9VdMRiRD6N_njSlIVsB3jOVpLEd--6_25-3lGyVx3JKdb0kcLbS94J5p0LGyAO9xbHDN7qN2WVUXMjwpRaKSWuK4CUZQHJ_T6zbE0f0tfXImkt2sESc9CmRk9iriA9vxbTft_RwYySBoX1lKhal_lz5jdTmx14XDOLzqQBn_2pMIn57jE6yXWvP9RVgQpbxmzjEsLpDOMgG0SZeYg_LIlWxRd71VkYVbyhOcR4HEDbFxOwOB8m27N5cYGBdtHhR3DAq7iIPwbHBhTfYTn4Ute5ybQuu-LkmsF-c-reE_4qwKpn5eSY2nlVz9Ak8yMK4jlw3SJvlGqqigVqL_1xz4oFPfg7ifR6-jFz_bhGSt4W6ps6v775Ju-Vus3_IVsvH55T18fE8FV3W0yrPoOEjx5wtpVSaQFCoeeZUV23m26J_k_hkNWcBLApZcvczj8mK--ayiTacz4sGkYqBK3axPg6qzMouEUf4RWsDGsp-_jo-J0n9NTHQlP76wKWiu6X0jkhRUjesQpXVTC0KEQSRhSHXN1iFFpTuRmX12zbs1goAEZtjI4tSblS_fnmgn2ksBs7SL6ezyIwSHJkrUHPPdbPQrvS8lSFiwqT2lgPuunScaWsm_XvgdSGBuiQFMg8AOdNUQUvYtFybXAgrF5uytd6qPUEwhrzO-rxhqn2qnx3OgSV7jXjFTVia4On5BEkYOaEg8Y1k4CQ9IRjgqG_OIrllHg9gipltx80WJwteQgfG6nK-5h8bfMPz0YitPrMV3OMs-CKYZ2hkbf9pv--VrPbZuJiLGSexBgfZF1hRR9YXyXzG2S-8izYAAAHt2Jv3fOFmdqvfEKcMHNPbAeSouxsv2_j0hecDQokC4ssBsPNlqC1K9tsZvSCX1DajePnjFCky1ILx2s-gkFleQhEQmQl1eJ5pC32DOrX-SD3QuXMX6JHZ8N0g330XH7QngJVpy5-i_tsJt1QEHNaCt5AKfhmZpK8PIimNFr-1iIJ-Su0i4fzkayr-oqNT3Mp5C2ULq1yK5lyc2aEbJUu5uHYJ3LX93lnne5rLEQ4YjgZucEGWK5s4vSvx4EJrTpelJt1w0SuqUzeXm1-k1tpiL3LtKWQ_YY429MGS7x6ChNNOM8HV508Y4ZXLPuLg6B9nWyd5D0VY-8YRtVXhpUV3HUbgvapFbiTcKgXwrqigxeA-0YvHdA4z9yaznQmW-TmzY4ihJEpSXGWt90dPzU0gNkV_fq4oGUc6O-iZ3p2jel96lvNpR1Jxc-wRLTMiNixaZTLsuNTvnvCGR7kAQ8eP0AOEU3bASMOIWpUV-QfS4TWKs3RhHBCfSG-u_bAHWtDxl2vbkhJMAcL3huAYnMB54O0_UYKpOT5NG3oyYgSdM8D_TVZorAJyqp6PTap4clwb7zXHQDW8ISOAfhYOaJ2uR0gm5etaDOg8PygOpX8i3hHZAVTs2t_4jCUIv9ra04VJ0OHIunNGHNkFiSmTBrNXirY8b-rXUXNsGLpf9hhpodDteVRG3-Ry1TqEb5xGuZ2sEa4kp1OV1iLohxlsD4YWyFj74R-OqotrhoBD5IMAB91jTw0A9AZFk-niYtB10hQ6GtpLFbEQ1VIJ2GyEHJ8YnGSp7Rj0_aZ3AEj611q8ykX7LG6JM3kE2b1r0CaF01_rUBOssbOHFvCqyBf6mqww4622EmEZBEByhg_ItO0h1zBcyhAHwRNPB4BQwwBggnNH5INyO16KGrR53KK-nNNL9sTgCzNXICDHiDpdcT0QnbLFTBWjAJNKRfo8NsXWXhfs5hXvjhq5sfiefHrdbORoMr-3yfODqgLGe-ODbujzER6A0OdHJBvoiC3_JZSeB837cgKnyqVZGSKhNEuKt8-BmPqOKiox1PkVMmE9GuaSCO1h6jYMu0zMJcTPTTlo9npG7aM82wxDpuqFzyKFVLqDoEQxb1S9OgVT76Vgx2dv11btr6Zf8WNiPKLgOvgj0Q66xADQeWXdfJk-hAwJu9Uw8Ak_9tscqi-YqRwi5knc2OAcYrQBRLyfxuvabzoRZQkYOE0d_8dmA0UQqKd3vHAk5UsDBHjrxVgCQ2X4bBcLU-ofiRz2xDe5uI4S6SnR7U9QpNgaPwCKcVxlTBLQ77VzSCeN6smm4E1bAfFJkH7obDxASOrTU4F6-4TC2ZqN3a2uNna-kgC3bYIBjLWXdWP9jNDyFMZfqGLqDFkCEQCyqgBv_Ar1jakyAyIbEtDckEiC3Nu4l6AWbAd1T5w6Uq-d0yK49NEJnANZVN_64sE43FLSkafHhxzatYLLpY84UDcycf8y7UvW0t_FygsJBE6CJfaw4tRpbwqIHjKE7XFHgSoRbLuTIoDz0_rvsUOBGhjd-E25iOIBQlW3xJM37_00YBVI9TA55fF28JWkQdAIwmybMl0G6WGM7ucLuXblEy7J4L6yyghQVQeE1Z5lDZ_E3xSB30cpwZBQ8VCyp-quoJdueHEIdIW3AHUe8etyYIOoJe0V7fxzkhl4hFndo7JJfXes95EH34yv3895jIJoJaYeRWn7DiEAZOtVW74_XVIZxLIfcPSJjlKK5St_msoyWeun-unXZ6rMO-q0eibYhkZkHuDZzvqjycN1yt3B3rB2R834ZZd6_Ww-roIvIPz5QmD3pn9XqYRPTzCXIIgz52twNwkLhzlb9qM-rpalX0oT4cVlkSTvjdqej7WcQx3P-FI5eSm1QtmkEZ5NyYzHSgOWbDd9A-bJrh_aFyRWc_BrxcYF3xU_E4Uimy4pvDus05KoH417q9BP0h_KhDDaagPXdAlYcGevbYFFsb8VIqNAlLeMeqRx_HflFHuByECL7OTNNpx1pm0h4Gh3XLuGs76hH1o2eUb1xEi7FS7fIABnzdSoquIc5x0f9bq-Zrjwc-K9XsQ73AgHGZEGTpea99YKQdCm_OXuonEbcv35ivehmp73U9_5k6XkdTEsA4seZxILWNfHZxiqVu53uhR30hyPylpe8W2SSk0w94TRHCBiMxM_5PeF8z_DaQW4lj6-Rp03KyZXxYwlyuh59zjzCj2-x5NaFzQziVpBcPoLxpKh8mnwR1Uzr9XQ4cr4e9EEbxpj0oWikauUMufWN2s7KZwi2f7KD8LPSGsxqOssp0KILRf9meuu8QvdFcNPJhTWxzg57zWRx-bJEczlxmh5r_UqFJ9UqyBK9RrOX0qokv71XpXV0Rgwvu0coLzEc6Ox4j00U2LCjhSdl4iXROMhr92QPRqvuJrqqwCD84gBVwzLWcqiDB9UyixPK-aqeb3zsvZfBSdZw0UDCPoETHQocCTT62gBreBQ0s-yU90xvBdHNZhMNKQNbXN4QQhfGxvkkjimQ_ptzL-OMLenusv_mU_0gAcoE9bs3IRvTJfnoMb7SUSsZEK376JMSeXhewv3dCYuhfzD_2ZzAXrZCfIqeqE46t7NRhmnmdAKe-C45hWQbsnEaTubtV2J1DO-w8zkoAtYIanDQwSEu6DAht2dmyxK69bQDoh3CXrAN8_nbws6vowyJU9OGSUjbFd-rBnF66g_mb-2p3UC7IMAddisZmPg0O3BBUEfPKH2Rx21TszQgdaYJuEeLe_FKeb1rUcTCyaiMRymOaruaqqmVKHTGbhMtQUun1jRSruIU7pWzPrcpSqEs_m38lTfhCRJQ8oYpisP4umm5K2dGUO1sbo-oQToLV1Upd0UXFxnGtBAlf50GTnU9p4f2Y_kwB2qJjl8STCn2cYGCnyDAyj-fWOQHrJeHfGhh9swcGPLL2n96wJ5Mzb1US65Y5nUz4i7RAsQ0_P_A8KPmaQc99TQKC3p3SoRokpQlpzTB44mBcOZbZPUSbvb0SeG4_kI05RJpcbkkGNXWk0PT-0z7wIqfAzMJbVmGtBKib6RjWUP7UEEFvU66RRzJYARnE09_hgO__1MQAKy0RDqpM_P80ItYfvnDtUfV8A1tKKyRS8PrU8UGNyc9ZImgIoUyEFeHavtBOZNzYziJ7P3dOwUVanbxY1_5fEWULw9UfUtG8ii66EorR_AFHfFvEt1AaUe8gY1t-JlGzDjzct-2XyX0IY9DJTD7M7QKKUZc94sgAIEy98gX9tHdcHofBf3nSOrl2i8I9r4rR6bHigbVFZnPCSX2CPE4bzxCh6qvXr3Aa11A-cv9VlcQ4vK0zcaCxUIrpue0U80QP6reqCPf0dwtHnSoEC9vXQ9GVFTSEigJ0uu6YPp4ckv7_EXA195CUkX3j2q8dkHwCpP-8YPtShzSSVeNzY5YHrRbsQ-KPLkaRNYElsC7XZtDd3uYAYPHGo7e074aKyFAtaLE7mUc46eHqCfqOMaNJKK_4WM1xZWc53Ld6TSzqPqq_UsQl4RbnSLYO4AX13rQZcojA4m2TRrxtdYNtpJshH19Laxy8V9pCiYmoRB1kdwAKS_GKX4HhE96XTvxyoQSV4rDIhpw_dSVs9MlV2KeKoZrR739KXgqsN41EJ5Am1pD1UB9I0XbdmsX217LaevDFGr97S6svCgin6Om9vZWth1IFMaGvLUXbOInAzHIKH_aZ8vroVUySIVZp-ggC8LEwv3ADqww47S3VSb5S2XGn2uvViWF-vxqWZP677blVY1RZuwLa_4-JXWPgPBkWM0FUD0ZDEZIYf2qOzq0WbSKEIaGe1oVqxLmsg-rjxM5kFzzOyC77eetsi-tvZG07jjcq2XcgMyWxsK_VTpZl02SxtCKM_rHXmctgR1NoV79DN1U_tYC8FG330l2cW-znUlNui0pNf00B-1Kpq6S7VLPdAds9c0sahMvp36Go-fpT-vsrsfFY_rusSGttJ3gbCFFYKANJ9H8sSmq0Gu50TeT-o2-WXtDT4XN_ITuAcfAbJuWmhAu-BZ3Fb3U4l88vsk30qhGu5jhsy8rtt9H-V71aPAKY4jnHRJW94tauHvm6AYtdeijFNKvUWqqj310FtV21AjKw1S5Zls5yHaLRXFY69Mz9Wt61GZkEMqvkJZbi8gR0L1LhrQsuf9zHQs_SzrTlkO9I8AR-ktcaIX9rIdVCUSTxnVcAyGXKpNmFHS3kYEv1UayrcXzTdzrPbzpFbCFQateaNpjXqzCWTUm5vg1UrUkm6GVw3SANoAIcyY1N0IJYOqTyfYtqlGnrJdev_MI4K9r5z08JiUPscVcB0-oBPUcYGAhz7iqgrFQSDT04yuNKHt8wOMQ-oRKa-3xU_Dst2IbITGNUmrIGvoeBHZt65PEWMPYt2ZkuEMYtzPskBh8dC6ZiT_T1_B4VCWbriGCYGR46wx3ImYu5ev0Y3i5Gfv54SpsQCsafK8rZvqKeokmkOBrqnM_0adqtbWd3sY2I1Lq_SNbLujGJrepqbS9xI5tnVbUA8Ea1P_BdlTevV2TXGSjpIQQd_dp7VcU3tLEPWikYeGsDmc84t9w2-eZiZCu83XvGf1n7_kOGPV71Or6ZDlKAHmbmwqtebswUN5I_liwN-eHKkSxdfgb-j3iskSFEOKCK2FAut-9_BdxXjRoEZmekBEDw1S7ajM29mT7VWht6_rlT-o8wQGeAA11W9AeQn3KoN2ut4T1sOJyoZy9q28sDKZMXnfzohh6N2hJHzMpFDR-lMVFH2zq0Sw9KNXBfik81DN10QP4io-RGa0WgCoNDtWTOxiXboOEFkijucRMDqfhUbKp6rqNNqfB5dKMaOY9PR1fpyEiC-Uwmk8W-wVBeKVXjXtZESW0ESISxW_N3wF6slZuZzi13LyoWrNFvdSRWmMLvlMr-HQlx40uNVYP0dVm3j3jhoAOPc8LrYCKD09wQQ5tL_rEBNcsqSWAiSpl01K8pZ9VdY2pt8VOQ_jUBCfysvqSp0BcmIjsDNrfZkixs9ntm5FXeXAOlh8PFHb2W3EXLJ2VhA7rbnyF_YHCAt5GAmSenkIrN2vZgo1_ZzCWO86R12wcTTNz2F58TwnutMfQYolrrtCh12ESX8vh1CaWt_5PLdfPVVULZiMPFuUTtF6q_WtoHLk9c0QxYEEwxPAcVjLycPxJiuT16MjuaYFXIR__uS00UHBjIz6DWYUGwhx7m5yjezeQbX0gNKXtvZ60v9aMqHGQOZm4rPERi0ILsEHvwsd1TozSeTeXarqLEXY9Nrm-CYLfARo5L1f49KGjyp1HHiaMnq53ygSrMgKRYQNIpGtkNMmfOnVMNAD1RSbeNRpzl8jLr8CBTnqiP5-eg4AlnzlUv_aqyxvscanSulW3rYaN-RhGdxhqxOkie8DXpDE5RG1j1QJpJKXzroh2Jx6VMCm7QJAd6DTtu2QLi-ZICKULl6e1lVaht6LyyKubvTj7sni-Io_mtB9MnYvvGFmhlMQTqu9TpJesqiBZX7B03YdtCf_cTRXLKcDw45QcilJr81CPfCyy-RFnDQV-lRuPE1JSXAyD1NRP_1MPT9j5FLEQkZnU1UAcSPq4FAQV5egMrKg0q_N5JWQt0I2Ov9Z_xIT2wlAgLNf6WNNXeNUUBA7og3lzMqwMfy10f9mia_gugMgJOJlTWfkpYLaXjsqaDpKV2ukvs5swH5UF1XWg1mToFvkZ31KHJ2AwhbI5WhmBYdMPLN0DN3P7KLKfxRg9cHMmSYnT_lZjTxS16dsqlyrTJyGB3Q1Uwp9ANSL-qgBoFefqKczsqgJMNYnmMnZtxnUBFPXPkA9XvyFTWhSO_Q7shZLVTH5jGqDVaBJS0h1Ndv2ZaJPFwinXmJP4wucGdf8AQe_TF_itupYxMewBp3Xu1VcUf1uMSQygobUtgNL0WHtMk7_I42RST5rxbleTLCZSBGdyj1XuperJkEyyw0DKGtwezfdYf_ID9zgrkfVVxkYexuDtH8eN9qXjhY3rnohREt41X1KrgHAK7LrVC3KhPKCjut-M3XUorUg5ub0YYI6QoI4SfuywL_jRjwyJtXYad7bJFmpxEv7XogPQtaWGspNxUfV5PKoEDFH8hjbwHaQNu4TiZbrRRLyR0QKgv5pPiBbHahtwzaaKeQBakBxaeMQ6c8lxaE1zEbldW8JJd8VE26CaMuz0agNm3xxfreNcyDYhdpkKsZQ9sFTt-HXm0YJSYu2Z6qQWj3QsLXfKPH0lXxz_Gl11fIRim7O2DZ3jm_Fi69_nL30ld29g4eAvZRUTKxjikFquLAQNLLdGko7dV38gd6nIAC0MBDg9aWUhYyj4Yx4fRunpz9yVNFT9DBIbJt-gCZiO_xNtcb9ClCU4hX0xx374_2b2Kpf15YLHjY1G_dOkKnsduRar3PyuqKBfrzQS91ItKS1Ddv4Hb4yQxosvk87s5qGKTZ12nryMG1uVByLbVHxZJGJSs3rzWRKxYn6UGwc9oVlM9yciBfTa8yfK_IVlK7J4dzNwAmD9jyAFPBakO8bPYM-WK-0bN62Z5jdJVKaSBW6wLRGrnjOZ4X3lFY68japhh24oGNNnwis0jBIABKqTkeHymdeH0qhxNChJPc0faoFnTZdjWHjT1D3X6vL9KhclvMUm0F10iWucK0PFR3PY1EGGnP5cwNRNuJJe1PaEwCxo2xNnaSlkrEZgjbWG9Cwt1eYplYpeQKTUY-ubCMtP_g0ltlV3x76Ka5uGoMjpVhOo5PI102aBm5hjxQDV1vBxi_pYKqRlpC4rh1tyymeyvrem7ovFItUs9GhT5KTxCFQcV4hEiHaGKdUDFAvrKEFHVtJIhQ_UXa03qYka42a-q_WvRj04He8GDaBpeFLp083tLDlZxsVUEPggHGQniwHXeq-241i31KvKWc9lY3ctL5q_N6or3AUTVeRA4cK1ap2WdVmFZ0M0mh0mihBffptbl1Bqe895ZRvxLceE2VXw77rjaUMkBegv8sdiCnZI4yWV-is8b14qcRR96fHtdSjBo5MtAaa37WKeDbVqNiQPYX30Kpc9bhtimeGHFRv1QokgiLmw5BbRoNXjpt541C-pHgcUvOdO0JjxNVBx0DcFOwNCdLbpNCF5_LLHlvtzG5S8c6DWFg7xxRSMqhn0l1BPu0eaQ4mnCE0bH5Izq4xSjx9tjR8tTU3gENsuSvMrVo_Q9W0eKA3eeUaqXlvVgsYu9s3QG7OTGwKLwxJTdzX5_pnxKstX0qBVXty-bvIoDFPAmBp7jIO6321Fqcp54rFInqoeLVG5jwCtkmFAjXnJvSKPZGoD2K5KqJtPoL9vHaOxVF7Ji8nKru4PVViunGZDdtwWWKAx3XyI4mzr6t_4f0_DtryLOa_nqWMt7kBFS0IImvZgN17Q2gkpnKFUKHceSIhZIsUSMCxU7VTmf_72slLAbvXqPVLjEGdbdqrDjRSV6hU51a0UGnvFrR4TrdgKngZz1Zv16ZaKiEVbE4rscT69rHwoQKHYjIEgIeUgLoEBio3E148NZLpPEB1Kn9NZf93llV5golgobuFFTeQT2Zf9UUCe_5M324xU-_GErp5YqoUvFSzrar62oVHQDk9QQWEMNcS8SvNgQlRThc5YgoIPf1yqE0GG0HdNDdnYCulHRwd1Tavf4alOe3oqTWY91tnEoeshbX1BRJoHGkkCEDKyHt86s_PdKeKgAU-fQFVgZd27cONErgkYyGXYM3ZHxUVixyZFCYUAofba4egtno4ZeVew1ga5fs-E2wqmrLMiUC-m_0c6fv-HvUJdH7Zbof562e1EF327aRsmjKEG3UOHkXuGKaSqvmZfFDfLpBwKjUdP-IrlCYjTlQdMoHnxlTsx8FNSEQsXqNf0jvEftEUnyzAkd91ahjg1fxtgsPDd2EO-R65OT5cxBVjQVKLLG7koqzpPAGxV3dqbNTmICf3wg2X7O0jFkBQ2N8gc9YkRFupK_OF1InuSAE57I9dVxOkivV7kk6HYDg8e0ip6Brah10lOWZEp59KCRn-3aYBRy6f9vhtoLiu2Aw9xHvLlOajvHRfy2zJdVcFKqh6eA0ZKIAOZXchXZDhet8g2XeZysiu1o5QNNSpV1zeHebQ1RBCdzEF7E292j5TMgnlVu4mgZKYuPRvCiORn1cybpbhPc1FSzKqqpjUK-qZRYml-IhjbFOpaWEjWyaoRixnoMl3NeWuDY2iP_G4zOFOvLomCbWNSD6Vvrw6RcMltnC8UQ4m2lFT0tPSx6VaeqSqnpNVpve6fgiyxnrxFEj0hGiptyeKA1gU9fV1QqiN4HZa2BNZVNeSZqjTno0Jha7lQwQFJm16SiCYGupQ325uQL9OC5Kp4J2pcw45J7v2n8S4LMXGg5Cx12KYt1PH0U6UqUrMO9_YDtNr-3bLPHF1asA4aV2fiPdKY3w1HtSnEDij-D7tEoreShqqhG0VqxrWOyfNTrKyA9yYTq2YVsbf1KkqP-TkW6LTovBMUxpJSvbRcfJ7__GUc1Ymjmaxo1g2Nw1qopdts29o2P7dZXg6MZRBxqnEK4o-iTp0PdDOxxLrQFBtvKay6Dv6mIwWSmZ-V_MzJZIbv9RNs-7ias44L6Wnvd3AhO2vICbtRLS20o5aPKw-4nAfcq0LK9vk8XROTwMt1yMpibe571dTysMwrV5VadA4S5Y8728YYFzzQ9RCcRUSma5wopRzV6MRv25sCxOmTaPwy7ePIrDe-9vdRpqHd5dbkSIt-_24Bs10RHZ0ryDO3bUw092UGmVWnpU3lAbXzHdIRlVmCsRIRpKpgZbUXlrhOf0Jyo7YfFw4Kw2C4CD1uDY3sLSThaOE9AcEn-sjVmr5LSdIQDFi9SLR4qt-4SLiYDWbmPJylBbLqtncm1Q9Uko65T8o3_xRcOvmtvhBtreVaoxvqAjlxotMb2xvnzr12sAmy1cl0vS1uxUuZVPHfRNrOclJg_mrr5v1o-1q1J6c9YOlon3SpUqeAc3xhg2lHGolOjSibVoAMe3Gxgkw1M254aR7Q9W4Ldz-gdvvczJ4IOrD37Oy64dfgds0okcpd92k7LoY9cBVjTwtZp-p6kekcRn0QMITFeN12UjUjpq5FXsJn9-fPw1QqlMCRTrdx48METdqaktoNW8kaTUtJ5E6hMPDEI14c8b8tD5QwYpHsi4PxXavNkd2je4OoSaHVmg6obUtdeVsfpamS8eOEPQGRcPVTs0sbnX36tP8i5Z6Jt2JwJu3cw79CmEmfPQeTO4lYQSAH_St1GaaoYm3lBSYBvji3d7OXkeTHu_2QtSxOe5mQp2Y12FuCPJ5w7-ooWCzhmpw7eNJ5EM6_MXCHyMh4PwhTopH1E5q0wkFK4wLZ7nNCKQ16eqWFz9YlLqLF1OYSJVLxUGsI4ZACmFhAlttXC656N2_SaklgI9FpHk84qkeD6LNl6-y4n0sICZxIXDifZrw0Eys6FO23Fm7KB1peseMdsuHKTO1M8qeduSKh8ypL8CxlJdVl0RE87Hz9f_GPTXnD0VBMmJCf-Ce40kE2fHaEF2wdzn7mwD0n2CgMtr6PHrFL56P75e4zVsmXRDeuO3fD4HBT-_zkVypzpZLi76o1mkWJvH2edrCC-kuoPWsx5QeqUluNUjUZgMKi9pP6amQANBjYX5J3qdXjj9RX3gsckicVCSGetbIYn9tKINcYyCt3KtPrabtnUIbu15dFYPwz9ZQfQRTmYIuTcSAi8pcAZ_94w-XBmlGrhIY2wen0ezzyYdLqY9sWUu2l-UJPvZwVHLT7H8h8-zH1lAP4uFfwIyt1RVbpNNObtNMzOdIDbT1TXyrbuSlM3cfj-SokpX3qRQ44beZQFnm3r3Sg4a9ShRM_fTi-t4Y39EHhXi_FX_dck9P9-sF2xMfrl5H1fzIl0nLnSxYcbjhPSGh9Pu0yySyArgjXtPqdslqbQ_9FywxtqKn-QSpY1n940KZ_KyngBwM6jH8glXGBeFv0AvV5xZB-pqDcewiaGsW09oD2_o4jkTM--yPvNt-no9LuFqfulXvQC7qq847aCrMr7znpgwFJZ_Qnm8vO1VpOPtEVyEBclj2kDYchlBKrisGNqLMx1o4meQuzkXrjevOizxbC2zRArBOpUzIfMeayHaRfevzSN2g7ZN3h6rC87v7nHhoqauwHERdKuYY9YzCFy3jkaamQVBwQsF1mMb9DTi1SjWj5eKB4JyfqH3nCCiuoV0MYB1IOitvo5voxNp2z9BWejryvWdF-6TwSxSjUk5dVUjz2O3jK3VbC1_srz_f90pOreOtIaYRfkTo-KNtaqEI0sgldQA9ZmpuRpedFH_NytLmx2PeVCaz3KfSkP3Z-_kVpODUqOqmWehudkwvOvRMH3RVk_L3cMUkcH6AnzwfVyDu8SkBZImy-rW2b8wD_IdXRavadmhTD1Of5bF7iY71Y5h07lo3Z5O64vZSU2_GDZ_xixCENruhF8nwi0f_Ar4qXRDdb9PjKg4P8muH_Z-kuze1eqPJGkVddVexdk0WV9tQP9JG7vhSdTcqts8W5egid_ORR0oRHBrwaVNyJdUK2rVbkZ5d116nrQ5x4vxkHy_bBOT7N6WlA5wEL6y7ahG_PD8SaaVqUIv1OIhL6NGtORr9rpctIvAqj2MQpeIqr9cEXCLlejWXMnJ4b0mJpn5qrDEoKF3Sbs_HjOyUYRwuXc_eFj1AfZVN4LDI5THg7_RlEc3OqqrLrWXSoouAxwDw1yj2WhL1XtWzVLxcGe_Th5evu2-1lk-tK2U-gxG5iclTIN_I9NWF43W6xTMdsARGE1z5Zg72uOJDHcp7a1vhSK8ZTirHlDAA1WqFMVDY17ISr4s7GtQTj1oJaP1g7t649l9qEhvpVh3r4ccpjXAWms_5IzTs86rN39g2IUTjWAA_HnP_TYNmK_WkNDRn1h9KbhuwTO_tlD5BGM00YCTE6lQJupQ5axIXMeqp97OPSDkqZI3wPFDVY4RkXqfD4vlYxk97vOoW31Tz4AQTCrPMQtQ6qZ40FNyHSrtxXs6MCXG3yhj4E5IqkhSqFOfTR2VPv6xU96meIRQ2OE-c_Ry5_q3JQZ_2Um7qudgVbKi876rTu44nSFpJOYpYJVcZQmivUrDaVslhsSKgjU4OYr7q9KYBnTG_jaEKk0UiW98tM--SENP03xTg4VmAISYDMm_uJ2tG7tLhdZmoVDnX555iIglI0DPJ3WLxFz4x-fRwTvBUdqZnR1EIsxkV6zeDe8Qxo_gQ3ghL2q7pyyjJy7MQuNt5e01FU64fAMdm6CIM8D4WmUgGp2IAWz_3Y3Uqt7lMSdfuvtINznce6BGeI87BDZse857wLMCKdkLtNVOvUlLyOZlbY5G9JHTcND8m1u1VlWCMY40EmmlABTU1ukF_6GFX6FgCHioDcuTYVVtmvrEFRdChLA3mGspBt5RhNAtgBzc9564Ao3qgK5gcof1JAhWPMYOTGhEeKgEtPyy9QMcn0-jk8EEWUQ0-QrjULxLnowZ7zoGSXt9IvdP7ybTRc66pAnyQg-F7CJDmpXVCqebalBy4PJWYM7RHON2brkqTry9tSmsj63c2ZyCQbW8FrlxVINPR7U53RJy-TYl4NK6aLToCzslppoKHwR5LMsuP0wg2ZeObiQm4qxFYZSHgvfQiL6HdeRnG3uvzswFVrbzsuMgPDzzvmw0pLmCXAVlfyzILv_hr3xglCk_cLyolGP6Nep9tol5zLC2MjDd6Ha2-bHtQUQzVUGNb4Cn86bv377gCB4mWQl0LT_T8Emmw9gIowlfXrGM84OdsGKsZm-NdlFQdSasemLCOGuPZc17nIurkMv5HGotz6-gA40RUvNRJ176K2RoUiz_HNYfuob-8UWf3_TQsHKnLKIbnWG8w6unz91FTPNtB7NRNygROeh9LQOT_vtm6NqI0bTza3hmCAdExlG8QFg9GNNzsgqSM2nUT5QaLst6fG3yvL_r6RsdWIaYgqJxXrfUt8_GNcigz7kMXUhDrc9cTEBuf616-B1ECtSbtL9gE4x1HJOEg1iLK6LXDk-BMj_pHn8BthAElOWzLIHyHN5cc2hsWTdtg-1Rx17h_Op6d16VDkCm0dBBP1KRfkyB1GL1CuMDCBdDH7STcAltkvOqqoeNRtqA7Z1EWd8cXQib9-3pClI1zaIOSjY8xA3IMRRvYl7brfoAUCQv74skfH9yP4h1SDCjjN7Nm53Eiaz2we-gHFeEztg8Vkb2UdOZJuGYvF5k0h53TvoTaIro1hMM-LW2j4CV9fIosPYrDSmuYLlzKS570xUF2sT9-4dHCWKLRqdnq9A20lyXY7iMmBnvywJR-4btD7c01QzCnSb7BsZ2aCVetZFRT7LZURqKT2TKc8FFJ92G81ujuRdFUENR4jZIex73XSC7Z7v9DlzkFWpZAtf3xERpG_-guaBwr2YAr7vtZk8cpgLjmWmjwIRXcYvdBetpsdOuPDw6r2lpTwfe-DPKiSVOyXNG9hrX7TZWsgG-Zhw9h8Y7jFoagNqYrTypq6tZWjRTl1oLuw83osBXQt4yM_DflvIPebsPbAjSxO2hKWtXrGAviq1mawzzHSQoD2Ge9rJaS9HCzkqebeSr39VopUaD_TUrPUm3AJVDW7vaDbA6PjeApn1O8CkO6g6lV4zWFylmi5ZGWEDY4U_2Jk3IDPd60SIwFQoKqQUsEaGPCberwfZcUEw19OgNxm_Cx22QwllaXB67RxGK6Ta2OxOFwnk6L76vkYrEfihQpBLVx0Yy8oQyJYV5WbOYNB79b7bp9CUPM8qQJE4xx9JW7pNyLeFAE3vmZkXiVLE4B0Zq7oGaFy9JixC5tQsTHWIWNo2LeCPXpwhDAxMnu-EzktqJrY4_Lt7LVtK7HqlUtyO3VGZ8qQHOgqGaEI-2eobDZY3wnSXhE-MUh6LFrO6lo47WdVN9t4_3gLECJTg7tcdo6wf5nWRVQf3frDTCvbb_fi1QfgRwAtfaJIsTcEhAizGEIC80HrTY9lKq1CCRHgvxlh_OQMjwLItxZ1E1tFHYOV33rjeCgspDNbHpCGF0kMvCBgfL7yX4SSDD7K1Ya1xPMbdv5tpX2d0JpanLkTZzfGaCAcbshr_Usq1IUKotaSrWp6IF4N58nXyPHyIRUOvDOh4EbbJPBSK90iuk-z6eAEbh_c5cEvtwVtEbvpcdHzxuaKzUzeXJX42mi-V94fzu-C7LNrVoAdLzBzQtykIwcuI29Z-CRXd1NGPvlkUnzO9_XttO_OWb7dxcKdPQKjJWd9QNUVwuXB_YTSBMs1JBThHQ8t9hZpvY6fGeHjxGn678Zdwc_qESVsMwmi8SzANjTXI1OSYGupn0USvUlIJeb4iiktHtJ2BWnmVCoY-1oUfSw395CGqR2f8IdnY6-Nlzxk4ZP2GLZLFV20pKQpLg93kVqoj_xpgsLZESlnhBXi1cfhuWsF4DHzxypHk1ClOtCPDTqSFKbm7iq6ij1nkM7R719Vmj92Hg1fzRnL5q2MUGgbYTJX0pGvh7vOYHlUUf8dZllLUSS-Qip9bhEgGmGgut1Pa9jzs1YNFhh39EyaUQgtkmd8MdBFvJMHwcfEAmRo3X0CP9_FBErHeNxGWmHARWjl9Jaj6obcakcgaFnxztz4i5gDD-raqb5GeFlv5fe3tbk6PgTaBza4nC4qRF97v7EooqyP8HexrPYvh6jesUIlo2ccBeYZ_dJnPqU4fnYe0QEybEgOXPMV4GADvs3S8tfrtPcXFvse5aMaV-SGTOyPrWGzYRA7uXxA_O6cQQj3s2IaO7ic-r-xKNqgGzicCclEInPdzZIzhw-EKyUE8sPyv36PtHdVEnD2Taqj5IddhaCMk3fgFuynZR8OzMjMj1MPqq44btNJbb8uSGwskiCfPSeb-yxP9GG1uGXndc9Dlip6cLNfHi6mUb97KFeRNST-Y1yk0J8FFmh8NwbxIUCsvZd6x0zUr6p34HHpsShHt3enjhUwee3FIC__b1i04FvgIE_nyZGSQ77jygadq0QHTpCvOZxQHRD8vAch-25vM5OonolcHZd9h23-XHQwwehU8zyR5n3ZHupKdxyGrdb1bPIhO_8ClBnYYh4XC3pkOxCefON_WTpSdjYoYounLjuol5NLz0w1GwTzY3yCbxjK18DuK8H1KvKlNmpPeot7Ti5TPFoBzZXqP661VW0UZzVdZcAsu83SznVikzPAh-fpiWyjq1QAj64ZuBUNxlG4ZA6HM_pkSvdq0Py-sqzd_Sw36m6PH4vQtHjVaNUkwSI7Ddu_mcH5nronhqljOxLtzZm7B-Qo3jomwxgOt8G_kuRjpOxr2e7YLG-_GRo4H9tt9NwjZLPPFt6y_MxKHWDzBmlKrAtd23y9zqaYZrscHwaQXskMH1GaRll4BSRjRbmSHufEO6iypHfUHffkweoOmHGRl8Ju-nRzyifvz27T8oCPFG9PPl63AuTu8W3_EBt0rUqSwrBnj6sytDzJTq_8TGHso1R9Rft6XeWdQRaWevQ43_A5Iw-CEcOzg8I2zkZA5akaZFApAos8DPV7NPGUB38zQMr-DFcZN3WxKFYXbarTCqWpOVuFEaagriQJ9YPPj34EyKn-URR7Mr4Ojbg2sF1FBAPbzl0bxEI51DjYscgIdzjJ9SKKLDBTbgrmOk6Gm_wUQe4XstU5_yA_iQGNxvY6OfPOr_LCERKsm7jjciypc4370DPszUOnmLZJwvKYtwcx9JZ7NUtZYdzqgcI1kVg3p_LoM4tmZla--Oju7zK03iIw_apED_DeZ-Ppdamx5UPfmyEJ9CyxYow2IDXvgh08U9hKBa0d3ZH1fo8CJJsJV8oP9cNuEVILpXVJF9yxsF_gA7buqXqi6uRcwns2i8j1pSfUTlSrOQS6XWoF3AkEObjpWz9uzvcsEaOyntMhMASzDEpZbC9JlSDel3tBQv8-UT1nXILHx6-akfKpRqRiw3e152lr363UzsPiKdayuuaogY-N6V5UkDbDA10iI4bJSyCNSSyF2WQDOtxv1fg2fNAG60flheWWI6Wm5ks6311V9hNvRhW4WdxbI5cLhon6gEME6M1yI8alh6XqKTDmVeBDn-igdcffgNm8fES7je-V8oCTasfEONyKsKllMqQ54xqgss57XWX6XtNLrh0XVKYwVHQslLJU9cb-rsT80ebeNVszqzN4oUKUV_K8cV9nShNvY7G336EpNLXrwNr6MGTS2etRXfVlHCQCyjuqH5iFjSXcI6pSkzQzEZ4JWNk7qsmr_4W4BpvJ6VKkhF1cWi6iDSCQ75p5kwSiA1Cti0V4lSpOmeGImDqVo1FOl1oggR8-sx7C15h5LRH9fFsDEXEbOdc0iqvNDlsxCebOGQI6i4Gqk8dzUG7CvgXnwU1kZWkprHUG-BISai5pEPZg0CS8jGe49KkrQWDRQduRWCuatXOyNYXfLFl1fxlOarag6Hf1PV_T07uMcJXGtDb7EoiLwrL4xXD7KlBzeGgaqHpbmBj6cRTn97gAxBJe2VSFDX94t3o985KoYPId3Q3xWz2l-M-1YLLP-00JfTMAUV7I-AEDjNQrf6xRnlBrNsZBEh_Wm3n7rSKT4qBW_U0OEy31XeVteETvZTsoPeC8Arzwmc6n4wHTKEsy0suy87nqAJonoYu5qgNNUfwKLPve4JB9nhGGtzL8Jy2_q_ykhyn065tJ363ZeQDegm9qS2MpM9ZP920Gc_ppsarSABYfpx3oKu_zHhazNygsmAhr72maGBuu4AKcZshyFTEf52cC78ZxrjxgJtXI1UpE-ZnocnoAqR4RxovlQTSWlE9K5Mm_vRERi8S1nPChcnhktCHC1ch59KLYaoz0k0ds94feyw6GC93MaZ6xE4hTgqfutJS6RrTPUXID3aHDpS47S4I0v26MURHUJXQbH04eaPXrmsNngZzzoHCM3mNHkGxfUIrqDw2AvADr_cjY1pTm1MtoVz0BE6uN9_A4--3UdbUA0JkxAF_j2uW6_KCJvDlap-6dUtZCV7yqpqK2WWNLT6fizltlBAFXD_2dfA52Dy79B6yCgIzCLesxeruFMc31ORFYwMX5gFd9T7JKNZIfjSY8maUkBJ9HCKCQYww-Lr-AY32-ZXPoWGMK1HyND21_DQhE1hBVwlDR0SoTrAkC-sumRWgJ1UZ8C7nJRYtXGOcUUFcyx1Q9ngNu68_dmpfHW0ICGNdXvVPEPGCfDaM9EJBom6-dg20pADonp8onHiAu28vJb8yYILL5oDdoBkoEhDl4yqBgIkTwKT8ygR8zKeB6bl6SFdkXaVK6xWIolfDICYdU4AK11a9yjafjtlqcKmfhGMdZ7VHhBrlhaX0yfE4n2e5Kl8n27jJUqxLvH6e9VBQSM8CaVCDA-CgVFTVXRy-yemirPppDmQA7nCSSle90_195BraWuNE5hy_eas5Ad_ro4VEqA4DCka_o8uP63bw6ftajNB3nJKdmdV0mXB2baRlESGLlQSnC_wmm0lcu3lBcYMvf7wm3nwcys4D3KdvL7BeEQd1fl8Jl7rdiUHDc4A-95kcRbyyll_7ESZOoyBv-M2I8BZ075Xc5VNrvlQhWHc3qYv-yLE9Pb3QTbKqo52e0Nw-AWqRzkl9en9DzfW2J-USIxoyFcf9u4mP_Y1UOs4Q7prz-y3z2CPmMtXWZA13dX6wEUXFBae3duoRtutR4AdqmTVQLGnJDOi8MltrTq_wp5npbP7dqHk8HiawQXHMTvkTw6RYiukaZ12pGSvfoPj1d00n3-01pL4aageX2GThGFRrm6K5q-QQDejSJfTV3RJQbWUN8RbZhcY75P3N_cc5LmA6u4F2nZh-VwgElybxAz2AS0pHlAdo1QhxlepGFwRT7ZJ9KvcWht2j1boAbHiAssLo9voEndSlX3P32gbm8Ej7PapCs87wat0hEEcTQ1AFN6-hCo-zZSgET5ae6hiZ3AsOv_sbNJry_Mm8DcaCArfTJTNIQTlOhlWhy3lMcbSRUUBeDTTH8JzeL12MbZ_uykAyG2Wr_Tb0Q4GNOllAU1YXd1UVrw7Bo0aNJpw93U2xTtUrVAwjbmrIkRfEFunK-vvMPRwmdrxfAMgxqih62UbWeI_uV4ANm0N7R768Ks4R4RyvDycVLocz5-kOeT4PzSGQ5OWsJ-_4EJxXyTko1hQZtCh5wXsLgd0pPOtGTF0134QhIb9E3gW9rW_VG9f1BJ3wZBvIqffC6Ns9j6_HFZeoSHuuEsn5oQrYd2Fjx-_dwyArTAYl1n51EIAdzBCPak5JQNSeqegQi68SQBYb4sCay6V0QZQ-kHEZEjgbaeQdfMcanu58BODmcnnButZjjjdbSATYHEFKe6rcqfypcylPc_d3OPjrcnUgbbdzAFwfJ9jzKS-dP0Fz36UHtoWwpkR5bp9q6pIOH0RO5PNtK70qw3VxzZgS0Rs_eqAV8vreQYEScRqamMkpqAGBym7iqWAzsmfsg3SaZ6mig1_heu_uG5IWOF0gBQGqSK7C-cbSUzorkpKWMf2YjKguv_snjyn74kewb56cZjU1DNUdsqi1qxy1mxcO6kg-JiP6crvSB-0jgtmkOsQIo6RZ0Z0mulViNhQvbPowH6BvZWqlEc7fJlb633TT3P26ivoyYewSrJ_eTsP1p2UyJLL07-Mnud9FuLcZCClgvktsEqWmd5zdZITeog1QbV5WOuUnnrm-N1-Xh1IDl-c1zWCYDK_Seq6BmTUaSvabIvABdtuJwsRaxw1AWfKGAnU9Ho09X896si3xKIJdG-Z5NFUKeVFk2mrGEP445YyoJRXtiSL8ronTKRd-rPHW4JvrJsPqx1JrMXgoVUN9LMdYryUW4msGFoeqYhcd1O8R0aaimVk-6o0TFnS7Cwxwxte7P4kFxEl3sUbktusqNNjMbqkrIVApisk4jvUXy4tnopN0bggQGc3THTrpe4rdoZ8pTmNSUOnpab-lgmnWQhSaXP6dSvkKrshBWzY0VNsqfBIWZqZUjMaNoNCmlkPfTENtwEQTWPMWCjhudiQTqfE7b9gfoyHia62W0onTlgF0kgSyRjRRWKiuNo5W_6gZ6y6V4HTXGB9DJXnh-GG6L2sTeS3p9rok4Adsh1d0h12pwqWywnYBAH9lAesM9v1pPK1LlzCrUtdPMSL04te8kxGJPVGKtgl9oCIRU54ROlCfN8OEOa-TazJM3bwKX-Rrti3Mmv0WjIMkX71kPLLsxSYpb2JS6MADh_QYMglti3U275pbUIutKU7XER0uWox7RR27PVCSDy0b8L5re4UFiTrSEBPNEkEtsL34D8slsnC1DQ-Iuon2tNDu93QHPBioXNsseSnRjk3z9Ls_oAlqvThqw9qjwQmzJiIkEeVcuUeXhF12PD4lA3zc2NWWsyAT3GMr0o06Sp7eyQOLBkFv1CoSUbQUNDX8LT2eNq8FxYlypHHsHNtqVAhYFgEwJMeHX3W0vh7wuG3mc6h0WYmlAsOhAHx8kdZCRmbIA_tS-_QIqnMZxVZriuX6qk55pR7jNGvqcNum8lSYRwBac-DGmk77uXT7tFsCL-2HX0TZNq3juVrbbGFh5GaYW0XI9GaK684ugqP4przUnRIPb_OWAp81_4eVXqtdTc5ov5gk08cLS-MVlyTq0s7ViKITq7CvGJFwhsWv3NiWdR3XxYxwJSC_Tl5N3p2OKi9pZhgI66MUJ-4KTa1vk84vChC7PXnzkYcsX7lfX2WKRFKs1OQAotpcmw5sCnfTKqynhU-nMJGbQ3bh7VUOiGQ4AFJiQCR0RDehcG6aSHdK17bpjT2qNeSN7So0efSOMcO31T94eYaqvJFVmo6xAD9D0TZh03IxP3PYaCr9bsVYFRTDKm1XVxF3PaMQs1ACXUX2lKlM5cJ749JB3Z-qatkpCvL07-SrHJduUxRQPjuKYFHcQue61Mn2mmzpPWjGTXVNhw4o3oi3DDqjh_w7LAbA-J0QDFmAAgnBqJKLrw4gsHbRHD2cImpKF1GYDiCe8my7OS1FFvVlgHRmd1xHp2XhHjlAOV3X7XCYB5W1eQXX8zFTGhxVUTvpneszfOj1fUM4pRpYpaJx4nuzhjV8o8hV8W68VingmIrM8wBxEM2JLHshrrraMtuF1ilAIP8_Lujt8oYQCL2Q84093cKss2gnbAl7WA1oO50aXzMPxSZ9rkn2-JIyXvUn14aALre2g8gYgpZaKzEJAVR9fZeKnddKLgVCt-qLdEICZ9qxQ66rcea0CnyygjB2oaG6pPz9-CUHZ4TQL9iPLhOjG7jBxqguB6-gtYwAcrjlyWsVF-3uOXG8d8vqBenB7ijL0KjjzyktEjzu8KIeya4NzrECI6ChqSqN1Bb8LMeOQH7nKp2iteOoMtVrjW1mQtPIBbhQc-c4tuiJitipKeldptxj0JNS3g3UASAfuEKZO9h5epaTFD2DAR-HbgDqU7WMc0efp2t9gfJ8y4ebYPXaJkzE5euTQjrxp0VeUt1yPkgmVHSjw5xf62JU0HqsJnVafw-vG_m7x-VurmAj8nXAQcMTih09qhMFWZFTorv7qDozn7iy9r2N41mvmRTmv6OenVzg5u3H1UEik4gUzUdHCSXqmvuxso_fBs7vWuDSWmyrTA5f3S74xNhhBB5PVyKCHNMIUZMKxXTNrVFwXfq7k6KI1g8BXfUDzIYgj8IeadC0LBSAhR47whcJHqJdUPvKUteAVF6Rpdhtp3cGZUJ32o7z9E52PouBk9KzmuKmjSeAB8jGprb0VdDSBZisHDNDlwLjqqjIS0Rxr2t7gBCEFR_1PVRaKUmc6qg0udz0qNYavtZ2tJyLDt1675WR4-EozuqfgUbw9Ah--JTCzU5YF23TEiCFyABFZdaUgLMMHa9KQZrLvNOdULpapQuEoge6nN-Q72qGqmPJxmXB0TsK6nDA6fcXzYcmjuYRIEFU5ALfapGvyL4oklQsTwUNd_pA4e_UGg5So95Ei_Z165ZOkahr5oTjfscMogLAMZ8iVd-L0SnPcj0GvLKCQnRVoFWObV2WanjM02hxozQZ7c3nD1D1PeuZFJk-CmR1BJbL1HVKPLp7mL4xMzk6kD0ezytng8_QM_uPqoUoth-VhjcjdNPTnEkzbfZYFV2RdOYFItW3m4aU-ufFfOmn4enhgF8ZRbFsi5CJGPezpDXc_T37el0HUHrByrgk3U80j4HfTJAQh_UDAFPXtqrqk6sGSr0MDcx3Kd9ii4NeRs6GU6ujN4oeXacf53_Q4cd5kR77-Ori9NSxUPlxF5GB4ajwuW-XBq68c1gWDegApF2NMztW0n1a8yAHKiEaAOsuXHtBN6k-e68tom6ydcznK9ONgtAxjk0L6vGsc-hYnhfZMUZWoMt7rL1R6U5Ne1B2TFhDeRpcZLur0WiLAJjq1MnLkC19fD-7glajr9XuzPDI1ndOPY6IFSG7XfwKNq3SkHqZgM9fLacdA_bFnky9uy1NQBoWzTb8AEFBK6z0e4mXGS_NY72CVEG3qVFl9te1eOGflFTJ9UN-iRdFrWFtA1LpOqwXevLo6W8Y7YUCbU_uTpLkzCw5eip70lX02xrAIAd7Zqb7vqkuQ2DgOV4sGl8bP4qIbE5A6ZTn6d-gyYW3Oj3UFSpsccr3oHfTllfpSXxxj-_skaO3vEh3uCkb6tKMNjRoeHQyVzZyeXsowWsVcciG95EktG57giLqr50tnY3ISZ5E6p9vbDisIn5f-_B4BfkXHibmx7Qfesg5dmSorPv4y0s9FXwu1JXI2_rMOCipZP-YYw-1ypN0ojFqUyq8CvRt4z-wUVaInpJkjw8kDaKPL8FIRSSR2jessaM37QhDBLTdC5TH7Eo4A-At1NaQE_AZynGtuyTl-megUVyRn7qEd6RY0ZwjXom5tstVAJOkkJI56KW6mmUFmZ-WwvgLu2dPCSc7q6gVPgykBkvQHdwGQLL6ygOqAyeTtlTTHEKxmM_m3dM61iA9xKYEjP2YMw38tMsUTRb-Dr3SXcdawXA-o6ZxHH2UVwMxZhmEBap6UZ3K9K442-n14HofKDS17FLCKTuPjPaztwSd-Bldr4xuY-rD5ho4425LnxqnPw1qqOO5r6-7HWtsLrFqcr0u488D29hnAJOIHu0ixemWhcn5cMc8S3KFyyRiN0WxRNcz4Y5Gm2RvPq0QzXah22Zae7dKEHk4dN204QHuPbyG6tkKaqpxyjA5k1mzw9yAm4nq0DSHVR-VeVPqOr3nqPRjQgG7KCtmPnKccHdiirf7-eO2g7u0YughNVUL09coONKtBk4aQUeygd_eXtV6W-qjdbrCAJI3cPM4qQopiHtHgwDvc7wmxDxsaw0itr37ZYoh6y4loq2hcvdm9iU5HZtnyvSI0kLg2zIjKgpey04q0mRc5Y7-snOoIjmE2NxPh7vXQBx-1q9QxH2qDK0451SrHs-eKsAe-nSqiOhWvn3_rETEsvdhKlipr1HVInU_aPwyokcQR16uS8CnlWzCKPBA7nyPqmhijBMgrdrOcLdo-2TwdA0OkR_C7SH-qSLqejWmtMDxXVA8-9JwrhiXhcBYbgxG7Ygzjd1ELtHfS6rxaiGxTiVIh1UGhSCHd3dKM9NlCeuphmMwTJoCeA17f76JEEMQZVLduwm3VXfnm6g6SWvOGaOd2nqVbYTZ_o-pM8mS3AZi6IVqwXm4_8WsD4DZ9ipfOVspUWSMCGAOAVd5IQsK7qstiFfVR6Y-RObBU4hsyuv95S1W01ZVYiWyhY91iNbo-_PVejZ9AzYf3fIAZ95yoJkm8y0j-OwVDCuUAL2fWc936ceNmLYxk4xOJnidRoCHvF7MCfTPeRLSA8t2EnRP03AP7fgXiU3gh059p7QQbSiokqzs2CEDpL0J4tCHDRCszRKTqTd22xAb_zIoOqfBWsKaDQmqJCVtiBx6eqdqJPeSN7mCNyDo_DxIyVcWqdv7jBajfXRDB-oFrPdht0Sff-_7pW52nj5VFRx-9gsBiX4TFFewRlMccX5ioKAuiE-ctDqN30ckcK59810PMzTRwE6LeIooND8-oe3IM1BE_UXwfZk2kFODr8zH2R2sQpvvUcOuoM3lQG5kxTATAL1cdpN-5QlgHEip9duxx9sJRl6xdbMhNcER50Zdyc9IecQ5PJIpfXsf4wcMJ6KJfpyVIRzQEuJNNDDdlp_ihfR5OqjV2SCzlWeazNBElZcnk_29qBnd-izZpROlzAtBASNsSdGH2cPYaDA5ecHQQ_aCfZc2o6q2bT8-W0ClqwOEyzR52JEEiUidk7t-YEqYSt8rFXrKx1LjY7bytDZ3osKVqeoOu4z143Bss2XNNSl1_ZFQUbVpZBkh7m46ocrjuzf4iLHeQ6wlXPdIgULLzwD7fZHpiUCe2o735HxRlHqH5EJAp60u2uXtf8kc8Y2pYdThHYtRp4seYJf7b7_Oly3M5h523jiqB2_fwyXpJzigtb0c_Nv2EttkhlPYfa8Xt5o3NCEx9Emg4HT9juF_L25uKu3K_iGWSHuFa3y-TsqIeEbn4quaPN-XgxLWOxMJ6pp9ri7l9JkwF3Qnst5uvS6sTt77d1CO4b7AgaZV7OEuPxaC6xbaOi8rFypV364AK7qXn_7usHWrMLH7gAzlWf6HTCr2_EMuuO3tvyyuxxHTkPUDDIvPc73vRgABGr4A253LtHC3FKO6aFgtZ6ywWAQZAtN-UAakHY9BEzKulHF0HoXB7oiWbEdqIP7v9aNcAET-DQroCqFpEN6axuCSz83O_D4Ww-hQFz_TlWXGod1nRX_4OtEfQgTMZyNaqFGJAi4ZtwJYRiKdp1wmjX3GwOukwCuhMmmPsV3B3uuFUzd9GS1hf8urZZRYbn7RgjWQZEXb-NjjzJ7dURGp89pqZklgaYKO-L7PwI0k0yJdTJUVwevx9hI3teNPDPbXD4q-UC-Wxv3w-VAO4zRCxVXfHFXrZMgXtEHcyjKt6QulV-yupgjOi1iYmVJ8AwM8LZOr06uaYxoBkvasZp-ZkQ5gRL2MvHIGzKAUZ5mqmVRwA2BubYKJvR0BXDMGDj0hCYC-y47IkR2a7_EVmKGRHQWl8TaYTHs2x3rAN6y8Z7G6SPfSGluosxgVM8V26LcSXny9wRGiL26YMCv_TkKn73N7iTvVjGDNFyNPNnYL6n8h_mHWKS3nEVCnjQ_dEY89E_PCEeqntpOSnxg1XVeI76OmrKD1eqidJSBIiTeCdz26NbBor3fKmmphvm1N8vx5svCckjWl6-Dm3QX46lVYtF4V8MLtYb5j-erT8rFJKEg_TjInVQEFMdvFd6aCussJME6VsmPj-nGHYHLIpq2uABj2dGSMiVupDhkOJu1j3-UU4Xn3i91Sv7XbYXs5gvlecUoLU4MVtuHomLvoMcHSuyak8SifaORILPdN5Uss_zp2TAvL6i2Z4uqjMb6fUGQB8XseA1ZbU9LTbygeWMCqwk__GpaWeECgYoQDm8JtzZDu95kC0U4sDhWdu5dLEtMqaXd46V0iQfdzvTMsaIHyc1j9cuQh-3bowWkuqbZRenY-txhjTXUSObMy8mcyNO9gZmx8TmA7D94LVEcZ3vgMo7uHAHHafUdtQ75oewSVVJrFFFrdFlHkF6PC6FHJKagoLGmLwCIUzBjEtMfVA6hzAxFgNXuQo1NsZfltsrzr03-kohZjCaLRPm4L2-a9Dt--vivBPS0-dfZ6fW6Z2DfKfUEV7pgAfrkep0VzrT4DMyUm5XfJMua0ChTuH0Q5xiUGdsF070Ra6y7RfOv2ZGWBKrTfO76oEno5rlWRdKdXlCi6_yMAsl4gI-Dvt5c1NfVWxq_ZQEj2rAnksF0iGNCkCmXoa0_TlBDwUj3wuQO2ZJdOAd2gpl0NV9hcAflnLZPIkF0YgT_meOBFbPvp_rLpXlsJMSgTNXX68im5aD5dFKXQqaHhpjNIfpVNzP-254YQGJBl0xohFs8rZLRvpyUkiZpMpjGeEIcIuWA3EEa0j6LxhrVhT6OqN5CYYc_I7F4OLz94XQxcTKYb7IQiV6tZl7PmSyvF9_Qetedkfs-3tgvIm03sStQSld_JzUEoZtMj2Jsux9_WSOzIXEByPAL68xb0Tk9ec-k3-UCV43o2aTERU2VkvheBoIU5xMp4wf3WtJ9NZAVKmvVqkPCf9ytfvqQcAtaMVDBZxulaCizqxU4cPuvZnUk2i2k76NEN5tIg6n20LiQjJ-u_TdzT4cGvebOcDmN5ABpYVJm46YvTphfpX8AoztF0fulOIeP8fRvi6CXGWBzzSrq9GHAzegAWhRRIKJ-8HHVrL-pIAIbHwrFlhDXZeZsA9XQ1SExdtV_ittk-akx_xOIuyiL6-K0-5SGfLwb-sspfqu-4ECLJec9bLZhltLZ0XXteJtai-NzRldNybrXPY6n06r1bYY_XFCgjGjM-TBx2hiAMnfj8HuiyRN1gx7pDBrAdy051A16o7-72nC97ORQPeh5GcHAfkCUasJNnkXATN6Ju6zZA5rpHtVHuai9UpVDtSwxmowwXpL-yhfUsVWM77iUeyiRKzKtGWm24D_TPMdxDRHbaJ7CIVu9cMsqjTbVpJtjTgx2e7lKirFGe9uVUb9UPKH2-hHgQ5fhdQAqR1zI_CyHOQ83N3zRvYCQ0aOd7QWVHvJS6fn3ojKsZER17gviUNhmMNJwKyC1YMD7O71TbEW5414rCtA2AMz8C2Hh4Uwm-Q5ABQ_s4mrfGeN3rjTurGPNsb8QlF_biNt8pprDtWiyv5HX9qaK8XXJwp0lm0VtYDrVBChfvRYQwFAkwiGQieHU6ritGqLQOlya20p84sAVewqfqi4qmM1xC4aTXlKea7x6FmyxbN0VGmg7DeCICUgY54g0xYw7Kv-VZ3kT09CQwKuBBF4su9n1GVmkjSZRmuaalnQKDyxspQ4qqKiOBm6b01kWYhbbEBc15qYbpmQazDz6ihblKezAohmKRi6ir8AzAEGno-FXeR4MA0ni5r_1tbzCgeiUKrV0LqsJO6Pc2-rveOEflM9_nZowj98ygtRviyCxvXw7xk-4dvsY81pvFmY30xiHLH4agMwK0jg-2hDH8qBsoY3l250U_6E8-gJKUCg0eovpfDD-S1bfd3CLzUWVvCfBmMyHq0Nz99_kkedATekzhc1_LFIlc-eYoMkQfIk3p3LhIpgnKlqIPTcVnp6GYi8-F2ltX-2LT9QqayCUEJgFE-RaHnDiIxMNbhcdgWIYIk7RvmYS8aV_0zFsiM3xs5hZspTVRnEeYqzLT4sWHi4F-kdttXzodtAq72T4Z7Z82XmRW6yuxE5JHHZJtAv1mlhH5VJvK3Ym9XGcj-c4qsqJCMTB5d8UwQFoFmZKDt-8VJ8T6wpLoaor-7JW9vld_349DFDOu9wyiq4a68ea302xIuaneHt3cPAILYmFqX_bKDLF7GhDG6uXqFTyuZjXuKiUZ87nUqLZhqiLpdUrE7eQ-P9v36vbMWaR4QE50w0cDD5YrwSxGmzH_u9545S_YfyBktuV26Cwe0USkdJqMR6YQfwIAohJv_SrsI-0_Ww1Y5rUJaK4UBxVbG3C8skDrvxMtNb13rE4KwHBdXvf9yWG6cTincth-pgBVcr_5Nk0LjM-D5s-GsUDf5LIXMpw-B18etF71BMJvT8NTV772s3SUT-AwsNwVvzZGd0oLmhEmt3yjmctrazkg5ucaILJPMzICjaWUKr60_2yPrh0xCejNHsnT3zwgk1c6d7CFZl6BAt9w2xh6PbNZdGlxebBRoMvrCPEzPHu8nBRR65PfZtJh-e7OOEba0-hrHlRCAvCIuISw97UJAD5lCGNT1bu-i4pe-M6hUV1fd78fpcAGA-0ZNbKxfmvSkmmJaD30chvnkIrbSR5QwP61M9QF0BcIrW2kgCovF_SgUl8i0QK1u19isEih38v5gqrj6irc_9W1j02zwBURdtyOySas8bwOQ4rHE_vkFd2lWnxPc8bEbs-5ZQR2u2B0pDLp9hxadH58uOcexBEMW89pRgt25Oa_I_qKFgyse1NrLNfLRun0_IKk4j3GZLdlwzpONhJ1IErhMdILU4vU56mRdfmYwfZSMhUuJeTm50Ng4jp1OiLl0z9cSyRP1eaxp_L6Xa--zjKlxD1sur4gfNktIHYb9DNAkuF5awpfVmj5boPUNTnqlDqKPCcIpOaj2sXapqovUXpqHN85LJai5xoYSC052-X2d_JXDD3IHZdkt7hbbSWA1NqegdIYLTEACJuSj_1mqx-Ya53fQJTmuhzuNhE4NLmIyyp2gi_Z9vzbp6PHe1Pl797qm_vQO2Oe1rvlSFTZR5NOjyVamog1o7oBsETpHbFVt81iqgWe4SqQP0OPBth_KUFapRdmej1QEd_XTKerLJu6qeKUSy0VSMaRvyZ-FWqTOhyNUG9C8ArV92vaGh8xm3h9XkTd8UU0zmLvjwhIXM3j3NekwNShQhIJRcZ0uauYAHv6xFlnnj3GvIHXmx_1alXz6A3EnhhnEf1VUf9hJZ3p6S5-Jh2dGx4QmewvgyImpY_E_F-D-LkIlAeVuMC2_jVBkJ7Rq-af4q93iNkHwM8JTBieh-nD9O3h-c7HEfY5S7H7r235_UtUdhw0FERRs03XvTk30nLXksPvHWgJbB9SUe4AS4obedAoDgMCvpBjBq0qgXFnGnB3VImMycssww_Vq3XjEG289HKOZEgcRO8mdR3d8EXz0eKyRdPSfxKXguHDepXkH8s2GwsnYQ0mEGY3EAxmsuV5W3Gt9-2HqyXdY5FrGzdzy1nWSAa-KDXFxmN06e90fXemUXiOqnu6ywsEWNLZONtjlsR-NH_T_MsTL8mLxoVkfnqJ0iKc20csHtPZSc17hD7O5AnC-FqnrMMOv0NJyiyCRGMQyAKTkyMyafu-99-6O86MSr_C43f7MMDl601v3T_5OW07fjHLi6iXwQOaD1zk0qa3pYb-ortIf0E7uCx6NaehkgYCA9e0LnoPmhmgZwTGIJ7hMFHtnwaSYMDhhagjVUH0x_N-hqIHfYE5gbB_ValHCoICpnlbNwStJPH7cTFYXP1aj9jIuJhQz96-ZFpSfeTM3p0YQNZ5ZTeMN7sDj3Erz_wQrOVdgV90eEUQvoRHhbNggB66fCSlvfbbd4dQj5-R1ok30oEUx9-eCqr02uDFrN5IAHISojAFbYtxmZJN9DAib8_iQ_yl-wczlyson_NtQqLobI7lbIm8J2wvCY_h5nxo4yr_6fukxphNgrTnFpIDqr7hPXAIwfys8O1NZ6N3zb5fELOUdW5t5zUcmFy5Np0euLtC2MT4zrXbPjD0Z_PxMo0Fh3qwGrhGe6j5oWlXlGwzuNfMBCsRorIT-54a7iPtsoCUYEXtHlRF4en2_N7smXTBNVS3Zan1m4GZmHUE3K12qOeQAGflYouSjeG7aFhnsn9PwdddTh8SnFhJ-rJ9hwGjqkdVsuDsPVr287lBmAgdJ-Hu2rMf7FZVwO5nPNKsAApTp43fltKoPsJaRyrKxwZpul-kyMz8EWbm2FdUqZ0gze_-t7fWhYeFABs5rtbd_BG_p8OHK3KP6l-TGo29KwwhMtZXkEiP6oEn8CwkIX4XUQB9k1KVs34f-5v5RK4-dBfQdR2Tl8DWaokLtXK6slCmxWH3sjWHksy7GMSCGi4M0JSlrfJ95FCwUAOmgqZ1QIANihm5NSb97Ox4-dMLxaZ5MAcY67YhKQPhpDtWEmAGFWICQUX1Z5VL-23Dik3Ji-xopvkyZUzH9Cxzt2Il_KQEwH5RgvJ8a1C3kngjtcS9baAPDBpSHxylm8CyqzPcy68fJFZRGeuLeILNb5mmI-_Axbur_9_GYxpCC4roXfwLhSTPvbB2EEDZ5IyHZ8b3TxUJBgov0bRkpIk2ek7tflg68as-YNEXQDysL3Kaw-0SPl55B6ay0J3RjoE_pfgdDmgD_FEDnd3fnZJ-UMG4IlIrd8VkmJGcfGM1MQhQKeJ8aeUYYlcip3pV6f4reBhNBEB2V5pRn5t2t4f7Eei73XdZyF7sHY9qIj5QFVysn44BXJfQBrXMPV6RAC3z9foKtQuaNCD_SV_6YNlNToMazzgxZ4vCvHfxt4883U-GV1OthYDazcsrweLq90Nu6eyGYFkDgYMJ59LenoSicHuJkPYtvh9Qfgp7IPEsw7aBpmJPORRo6vUlKMnt_DTdrmbfTdU47or2gH0KXt5gEYY8DDbwaWg-GJ3ubtEGAAzsQizJyZCxZqlmMzYbFqTw6UG8AJYzzhg0VrYZCvFuARHpN8tXiMt-nhSsgGCdlI8wKM6YW6jGCZb2dpeMkVdr1Xc1uHP7mjy0F_ssV_r2n43TAigTZ1jOG4oQxGt4VP33PlzUxHyuVz_nvekr_mw7CoYN67MpEGDlmTQhpfVCIdKAQNLvmgiIOYyZsBDozYpNaYEJkr8Po3Kp5heXIogrhrEIqKKUnirBt3GMpqs0D08i3NvMUksMHGAOw4ptehCe1u44xr2jlu4cSey52ws0q5QcNN0CMbdBKlCUO6qHtt_c6KrwmNt0UKa-moMfkil3bv6ZkmFqX4k4E3XpqGtsWikys5TlpOpYdsqgh-Jit4UgkF96BwCvrg31lwD35aOyuvJt1QeAWeZEQ-P2nAOOWM8BBR08g_qHm9TCDk8yLs8FfF4lluOL7XbJy4VMY8aKoODguiR8X31564GPVBsHqyUti8N3qQfU_DtKDe6JDw_3yjnAS-SrabhE9YALoUGNm0f9t9k5GN4wbS3MxmF6dQG_OVdUEnQTi1jTB_WzslbOE7Bn3CdTA_DtwQrB6KTJ8RnP4bUb0g5RFqjBoKLxdKjUWoS4oCtLVlNREeumpaTm60MtnFzAsTIBblGDBTkPAvIr1bQp3FRXCD0ysv2FeeSXfpK9I_UjTnNThDNeYh1XmMBoEXrpgb053NgEgN6HkKoaFQqpWX-9IZHFxWU2pgK3vg2Q1TgNIJjvPUHglXlz7PDJ-MyQdBhnWjAG43bUo_Ohr18oVbIXQBgF1LFUaIqfRIYi2cvZSpRZ7_LZ2jg8lOe2zxwVnemzcYEo2GWKBrW-1QrCdwHqu4Eu7Z2tBV338NgFhtGyZcTNanvLIs0ZgjwIkLrr3dB1jGrDyDyn2v0QQ8HQ9WfNolYCEbaue9753Bk02WTX3qcFAWS7Dia1akukx7Pt93frMfg0fx6x95-_y_wQWiLdmFC5Gcuq0Uo4ZhjDKIt0Qq0YarC_31nM-zf__EhEc_C19oO3q0y9-QJCY_LAlbaBVxGmv1ttVBgD2OonD8nj3FxhZkaHrnjxkDgCvdDaqIgLKjs5SWHGPTMMFIhvunhsghQpqWOk6UQhvCbbAf_tBBY64POSdStCEYUOU8xyFwA8bKv68egAKzirccMIy5yEil-00iIBrZj7AdWQU3sp5WdKAokYNJQMpOSs96K4l63IztbHBRkcoSxfAP2YUdSa-XMmldMWAYdt3qJhirmjKzDnVO1p6UaOnAw0k_L2vtc-bBEB5AjVzBwpVfs_q0gwFsO9V4LlHXo3lAlMNKSWjWlk0K7XPxuMsb13gzBEjcVAFOg6aEc8bb0pbthNr68C9X2ZCYC_uF2NY3bR9WgZtgP6Wn3sEo2QUVH9wFuZDC84JIQZxm8sgx5QAK2wMaX9hFZk-hZDTO_u-87x4GZCghrMxBxhc92PSbQqIUKGP3bodI-4VVOqg1usvYjzUpbXSkMJLS5pokil8f42qq2xemiPvM_YyLtjk3HdvFrCkCL6QM_FppSFaspxfL6BrE0tHgwuro1eqeHYD1eN43nHf7_uiiC5T01hE4x9evgHLo_54m-ws_694CbYa1h6Z8CfM4FIJ5Ga5OJVzYUTLWNunAhXEiFFVygH58cZK5XfhiVLfflb_YD3j2hd9wuTZ_XkAKae3r4qVWWHKxBBuNLcQVtqDrvuCkf60AqQSRkjhGLm49-pIgxLL7eqcGq0AROZ7u5B_HRTRgFHO91VWWgFu0UjvL632nBy6n5UKy96gHNqOdvg3s52stjkCP0r30N5VF_QLpNAHAG7W3osI9wXKALe7k4AIbp7IQjx3Jb6w6kJjgWXURpOXKvhcHYRY5jyv-yt6gYTMHkGLbyLnHTwrinlXB9BfAK9Sb77PY7oF8D_BG4Hvcs1CJcxaYAx-gLKiMW2jalToU1k5jyVzdnDs-gKAP6ESBZLwY2L6UylDN_vEimkzABsnjaq1AHUz1DKmQIQEalLPQMK4wBMvryiWzeHCuFYLxBF7cXBB8qStz_ThVKDnwnDTFcNc8UVU-IZ0sSLT54n3ORAqGATzUWMu9VncHAScxrsPnfteXBVKPUETCAo2xKTxvQqwp6UqRuU5dp89RCgoQk2pECWHFr1BDllGEiGfg-gbElpASScnQhDBc2nBLDT9F18-_pqcBNc_36xGOw_7SkzTFIZG4oKhNuYMBLH4xFWlX-vOlWw_52ddwg5nzcaY2cnFY4v47j-7W_tdo4fNV7tOcmEbs-AY9oIlTTAaW0nHT_A6C3hEVpS1TuJm5CKYhVPsAp2VTmbO260dczBg3CTXqyW6IqKX2s4EVDSU8M9ada4Ji1R1ROGqKlPTgGpuU8BA3zFr_II9-OPAGeKvnDuNbiFNV6E5gJvYh-dWU4NTTlMkjaAy0xXeB05cBpZCS3oamtTfpkLrIesFfyQgZBrpC3TX9ekaMtG68w31Uwp3Sn4ebNYzClXR8QL73MzmwQxqBLEClWa_Q-hhUmuBl2zfuzM2BQ7JTRoRR05qAvgjjbNj-MlucrNU7LS9I9yXkan7PM3QYaqP-ANlsEpjEVeTx6Jcsu5Ci9gu_4quU4FMsxKvjlTIF-z_05pi_cF-x78DsSHePnj6oCzPZrfGs01NkFx4ZSNBRvpqzFkVvVInrCWkW3E09s-kNEu8318W-BYc4b2kUbzt_J8idkoWsYwelteo111kC4TzqJJhyTmF73Tvkw2wPS056_hml7qJtJymVdRgrictqIEJkjn_rU7qPC62FYlpHv1z5CJ86sBPBsKK5roLi4zst6MPvqe7yJKEVQjlak_mUMo6VPjJ_2xHjWe-lgNnqirWAYFibxVooNLidBSY0w5jQgqbuZv_wS9m6BmTZ8CF48hUIVwxn6fgoAhAgx59ZqB7QP7rEsewE6NgEf5JmWAQRbn10B64-re905vQA9DuqojuTjnw7kxubP1YArAXoUkTejG-8RGwSeQrH82vDyqlS-jtJCSgsfyPAiyDy5fYzSoBeozqfiKyJtEDTwLzj902s0wwrRwxBR-0LM8EtR-ReZhpkkOwHb2ohyxLe9TZFplCYCNFoO6mDggEdPHKpZG_xUIjauV4PBDTlBAmL_ZvlOKoVkQ8xkNp-a1MChSdXfDnsm4-Uwb7MhhNaItmPLppgsYR03P-Kh0R1VmBD2MXvnIsBrQzPWmSxmJdcXvQOCgoObbheVkVHCIc3O4AEUNDm043KcZsvEtHgUYqjSt5HwAE8prRnsGkxYE9T_n28jy-PDWqtRTzv_kYig4EDa8LnALxJn4NSS3311wrlIFQtwiBAGDcangpKXuHEc47GJlcaibKZFojfuLnd4aQ9WbPGIn1xcQd8J1Q7OnmjavhIMldAfAYjCWviPCG5UAyIpfbZIx9BljmOa-XtqEQMxbGeIxS8ATrXFBXe97J6-jzZiyS140I7tjTmYR3-zVt013SH8InXczsOeSSXjNEUkeI2mHOLn5OKgpKZ2RFrlr5dA00EpT_IkIrN7wt-0xYZ6TayI0Pdrrw-0NVrj0k-EaVIZd5t5yVW6drWqcMgdHM_lNL0GgAF2BTRAWjC_uT9edF2aA7ZHUnEtt1L0U2tAlxz57LxBTv8r8NlZGfIBXBSheY_ih6c_TAdNfK0C3m6dg-NtvoPTgu9mde5e8L4TJ1EyBik9DDv7zRFxZf6a73u324NCwp4IQOO9_EJrcHvO1pQis5eQaywVucMGGqgwx3g4vOD2d6UWcKPMpoIDhfC-bpy_xdqeR419G9XcpJ3grIAvtyV0FYSF328hItKONBbOx9AZpMJBisMqEW6Y-41jsEN8zDNDj6hr8f2YyJw9zggIMPwNa8ACezHV9azE1YscSdmu6DLV2RnoQYMFsTnGQw-kbt2jvhQaoMfSApB-_P_CC2FCmTgI8K4BbPaMD2hSFgOay9Rxv-hJqsvTvmfRT0PhZ_JIoTRwvbsBcYU0e9mU6yBX364irYNXOg9iu7uMDo4_3FUrqZ8QUghTyot5yjVcjXiEBcgx20e9wcrs1bjDEMlfDGjWZUo2zgU1HRTMSVsHaj9qjUODJNHxxQnV9kOpZ08QqNqyFflCpg80kw7SoDVxtSomc85gwT_t8ubjug0KErjevxxzHuUVlc5BrC1w39WKRABL2HAG4pg4MYYAGnSxDRwDvsB40xjUKHTlwXrLeJvhJCxkuEJMOkwtranilOZIDQB5ULpIkQp2WTo3E2HNumQ7sskWoRkzN7LDwDHx6MYeUY_goOgynajjdYBJAA92YalPRC4VDXnMMNh-ipFC5j-6_6RhAAfZwlEjeWLnVorEtyBWBxImVIAJbT6lOOyyl7i9Igw4sn1EHcTIqcWU3MZqYcBRP0ygTFHbztN9GTEIOeQGZgz9LLJaH7KA1lLA2Jmm7SfY_a1lL5HyLmFH-hNO8gHgUslK_3gnlj-QRhcNeyxyV2Kua1JztWw0fQZHlvAEEMw4pnoCQwbq0aAMLCjngfEhcVIhfgj0_8FC5XwmPqPc9c9htuWGy0d3xnVFVDdSDO6s3-caAf_6KoECD_dwvlU93mkRybcvE-OrMX7_goPqBoAYtTuMaVYfjM6Jh0elb_xxW8N91SJ8ZqyvJRdcGIBpKTRzGzaEWAq3DaRcu0WqnStCnHZePUUmaw35JlQZ9t0ve-ubNVsWVV8ldf90VJFTiMhiO7D4B8EpZg4JrzJQCqcbDDXHtmGdADJ9lJzxWXRSNQ7-Yc0jMnbDNZsUHgXmPqy6VCYXtchxg_CSQ4PXdHJYiiPVuK7VgIfOJqM4JUVSD-NY8Jt-rjWICxEM98ccUrs2FdNXI_qQk850HcTm2LvEWKx0CodqJNAqs3S4jfcuXGAhBRmdBjUHG6cSewZPuFwNSLABlRYYulDHhZNxKVzMsoxgtOu30pcbtfvcUgq87uQiHVsv6fKH4iNh46zMz8geleG-ky2F34F8TUJEDVtAcbuMxO-sqKeNIL14aggT5KZTuuRgGQbArbsw9WEGeAb4byt_K9L5J4hCyOCGSWccjAkQ9d5_XIdf4Yz6T2qfEDoVdOucQ40-xHA10ETKMNwEo31xwLwGt9V2Gj7RbkWSLxAewqu7wGxbrbovSYUNf6SWUDMBD7AfzPw9Ief2aChVoiREOGPGbSBQNw5t0gA3o6rGIFHxrpNY3k_WXaQ7LcwxG1MeIeUVqycAFSaKI4pfttKJDJjMY9sMhktP3d1ECr_zLm_JPHyaTYb0GPMEruw_WTO4PJs4zvEjUhZ2uQDLe3ZukhWK5FoZ28S1_gocLVZPrNusKqRh7m6_LHLJKKd9dAgZcKpoUhjPlX5jluMZwFDRCHO-Byu4O3GAsn9NPwdiwi4vA5kznQyTW3CHpkqWR7KaclTXr5SauqtsMY1Gx9xUQ30is9RlNl3hZhmU6H4qwphsZDPnUwMC2sCZv9IXZx5qYm5bN9a-0kxqUVHyMxZIciBi-YVm-HBjqxBSihySZIW9qO3XdDdGlq-ZgQe121hC1gvD-pWWoQP6svQouykU7ymsKy7ODGX1fjudhknUPDHkJ48BJadA2Nr4ckHd9AXSbrv8xseltQQumv4-SQdGjqjLT7Aq-47ySVo2V-mCD_bTZV8B-NH0Fyu83RXX4QZffTpWishwdikA1nodfvnmk77gYxSZK-VhU4Ji2RTD1TfUb9PgnTwfuw8A0RtSMpyWGgT3eISmUhf7rctIwbDqSR1H6mgIuIQM7-0ilea9X2JeggGdphXI8J4cTCncPi9zKQKdtVakRGdMSpW5IW3D-86xmMOLIQj-tZ6KZdLNakG75IywM3kQM5HVjI6R46WQBBG9VIwEOlPE2C72BnoCu0rxK7wK4isk3uQhUAboIiHi_VXV5T-5oFc9QDNED59RSIpwn72mVdxst1GFQfSBf5b3Z1JvjYjT6ve_pv_bidJYiW0mgon5MHloOk2WjN-DmPfCW4eRYM6J-p2DvrQlIjfLbLYo3BLg4rtHwR4ceghjEBwwk59VqoC12PQ6AYR1up0rsYlhofIN7ns7QmbFyyNLVPrn-blETn5uo0jzzxSiP5FzB2mBjQR93-59Nz5q5OQegwOkUfV_vcwDyaeQpJT75601DXUQZGn2DsQXgne-hFc95mejcSwnyC8-K7QIKtBWvUeQ44p2Vr5mamh_CuVS7OlIhRXxAJOvZbyMBJPQvfzt_u8ND7urBLrQHy0rU89lV99uxbDQf8zYEwdHWBk-0dcoZJzDTMlMtY3j3UHJOsIDHdZgmrEDxDMWgUuEkfgjLuXNv33vR_LaKmecF_L2nvdiojeWGuOeTj5UOtN8tmbtR0GAKXe-Fi9IzlXw81XAr3cT1pvq-3FzXGIA5hGAkfW7xcwNmyyz8hNtWbnfQivJOapC_GgOiCpV9DXpq49oZbwdFCmOwHT4FoF1O3sbRruPhGWpPwQlYeX1Te5D-F2-r72B7RIj1a6azGbjroj7RAJjhHhhriQ3WFyiS-HDwAo5qj9zmttA55BbbbNbKNJarjFLRdKuTdvARyn0MzRv4h6f8gK5A1U-jnFDfrpNeFdWeeHSBQIuvBh7IB4XdPw33oapVlXfDkYW4sCu191olcqgJW3xuKafZ3VFoP04fBgzyw8EIuHDHGgNTbqPUMNUBnY3qKXd9JtARZIKfPqVkVYZYWrmhLakvv37qKrnG99KLuwADgT_bOwj7izF21IyOS5yMAd0ZQ0uZWbHGgMfuOvQ7mCg_Hs1Fl7IZ9CrGt38vrMaW0zkpx7u4IqIcb8c4juoqggSe2LtJXn_9HEPKibxHqp3zZ4E8nwdnRztOE0U0tt7IpRjRVMptQm1p5kMT2voJyAbtoNW-7C94qOJj0BsTE64uTJnMMEcC4zlTztFwoI5KERW7vgtawzWVL_KQOK9ukx6zC15YlM_K6GpAhlxQIU5QdcwdCjrDASI06jEBTcBtcmObmII0woRHMFsibN7XPTxWsZT8Ok2pEacqqufEo5Ra7f0WPAA-4d96vJoyiKud84t8uKsCdsc-JBusurccLBI1nhC4-7L1obTdsimXCuFHH3fJdj_SMONBmL_t0j5k56vbr_APBL99U5lRucRig2v1q0I-3g4dKcAEm1REbp5DoyIJmppmTaZu_rMGvzcxep6_VQuTYp1QB3a0sjVB44C2tG6Di5xjkk96-KW9N08fT8eIKNXiS4KBt_vsHtMD_B5sdx7H5z2d5v4Bvb3hwQ0BZaSLLQGHattBaaaYYP4oY5bZh2atJgDbgM1jGOsv4t1CIPjYgycfjhrUmEzjp4mkwmFeKS0bFHThy2TgZxyuTXHYh9sAqAlY8hKPsqNADGPHdJkajGnx7AOjcc0YBKiVvovr9mm1_DxcOcM2B2jjtBNlIC0JC0d0BrU7wQSYFQa51hY27sFkftDY39K0kasw0mPQLmHxtfIo9aS6vVNhorMrnqovTG_PW2OBUUqiC_WO6whnLi-rma6XVgEzzvpIlJTQGcd0nQVrTt57Edy5CVcBi7IRXIqjyKIdCvRiupgHcKJqtpyLISbjKAd1lPqKH2BDbaXpw3iTh4lkyBuvxOFTkobaU9SfR02WO8K1xW9geHxhyiDpgLL7rxgoWds3yQKZwZiJmSaC19lrdfskYbGHw-8JSN1DHcN0xHo82hN5O6Bt0p5Xz8UQIuacS3I8nNQy7gtg83GpgWr9dhfExFX2JqgovK1IbU6BxwRPO_J7yJ_dVD5K6Al48ePll2Bao5VG0WWbD5eXBgGBPqrfK8PLqN283gILoa-R84q4ajrN0nDeMUFOeClApB2IIN9ZOVOfkR8OhT4bdhy9UKCd3taIo2ZKbkI6ng7-F06QE-UQM8iau4fAaeQVN8Y-vfqM_sTQ1VLTDWTkysqIRAAA3vTvVgvlNlejnOCPW_BiBV_1DTNJMNcaUXxc3WhNQCues4KzrpsJbMhHlvgVqDFfyh-eKAeqznMoLJ6SA4X0r-8H5mcj6oZOWVrjvOLwLrDkvbjkhiBJ9YyljteybQbo7YgBJpLpIOm7zyP9AD4eeXA9k7Xfh_76AAEIRWxjuEBPNJdDJ2CL17fWRFCiz8KMnr_RHv6QyYxtUDgjKyOJHv3-mv25kBHNWwWnv_KsWNvjI4Oequu2DJF0g0EpZFenMlP5r5-ayePjYGUZz6h4QprwvNWp_pxKVhD1j_l-jkELhyffGtFJk_mGw9XpUFM04_DyMv1WnC_u7lF8JmUlMnPkC6gj6vcUq4-cM6kcecftITINBFeFqnMM9wXPgWkxUxWm0QHL47ZDYYSvOBf50qTuOUBGxmYVOQMfmZjgB2kTTm-BpeZ98RfK9HQ55Yqyaq5A3quVBeZpQiZ2wx52uVDbW9hPVY5-3rTW_NWzEVU4P5NHV_vtVcxYHoUhb78rhrGXHcBkzzlEgatllxTw1KL1s07BE7h_WiOaNGcxQF15p915nPp_ieStieYggYmkjkXV4qy_LG8mdRfSf8ZMfQay-iLQOZmnDN_V6jvQ6Ct5PS6k_LbYi9DYC1ZVoNIXarWkF7dcM3eEoQwuAurnJdIzkKKwuOpJvxd5a0tMCaxNN8zlSgoXwD4E2mBuvYs3eAC1LUnyO9UX2ZfPSVXXiWluzPIOnQTjfZfSEvUTSTjBgMrjVHkZATbygrGS87wgvmw3nocKtO5ByMW6bEVXII51UvpcfjwmEpsmIMmkW_IN6fO4qwwiZRpFRIHSaEB9rO5d4CjMT48RB-vj11s1IpupTwB0-jI4wpqTQTigPs1SnHh9tR_ZH73mnX0Nl0YiZcSir3P-xaDOMhwO9YDhNSRzTv-8CKmU9YTJwpt6CFTvj9-2cbkPCnWTVOCmJZut2OtoaNkXLp61gGpjj52tKbyb1gouPO966mizOwAXacvxzoPI_XqPNW0sP90QlkAL9CXNTh_ImpP_LsBlRmFD6u_BDNAbb8CEBKQaSzCYUrw2gkt8stNXY0TFP4072zdboVoUkxetxoQPyBce5GqLvoutFtUzd5eZFO3OuuAgTF1_DaMYFKahSBcQA4MUCbIWAFbnHSiodwdOkKIekfBDSkxDW5kbiZnPHtVThkG7XDAQJ2fvhAr-CP-fiI2_NBE377eAVGDzvSFgVbxuq4inkZtnmDBrdRoGwDcv154tBmpVN7k9VarXD5-pDTHDuS5Y8Jauyy10hrbrPF8I0z13yUeE4RxWbdqqujNmG908pl88_AXd70hac9ovgLxIFyccq5S6ckAooh9lbrRATD80pA918tDflnS9EjGYYgsKsqDG0jMY45wLdecSn0TpKSuIhcwRY5RW6EumE8V_qbgTUa6T-urToyKFXaGzIJps21xFQ3QI5VcT7hLiI7ZQ_T2WZRu_JTCrXSNww9TxoAyrnktZcGv5lVGBOvHxpNfZyJSgIhv_vZ4vXHZ6gtZhd12eqnPxXPQkwU7uUeSAbQDJ2L1EReW7uB5mZH2oCX7jZCaMf4pVJuWMlePE6K0XAHDAdeq0Pp-cIRagoxZAYC0U5OidXQ3ILv8zj6xy77VnLchsQ87emb2PJZde_Eyti56InTZAERsDhkuuy16bA2Ovxuia4cdTCJaE422F-pUeNGiKPBTBiBZuwyJgj7vrQ8FhT6F49t3PV8dGou44aeNj6F3EpZzVQoixhAYDtbqSd7krNqL-VnEMWyVqo7bV6mJ56JwGSfE28oM7EqRuYFw21a9H8_2drfnGBBHJAZPRdVNEZ36soTDoKhB85c75hcoeDcf0A_7SZiZvi3lhFNHmRWKvcWaiJHbeitdtLyYki9CvoT4aO4oqzkqu1jQ041oJ_Nv-62Bmz_8OQnNf4gu_9puM_5ZlrzyH9Kv80vqc5mIAaaVDyUb8RxYDA35ztXd_bivFfML8KmFKvis4iHYq2HZ5JZg5E_FiBEt2QC3q-LGssDmGOhoCqBPQjxo8qVaz59IWBvw_4wa_g1PEjcSkbPHgMB9ZA_1204iIN5dQI7wQvnD3uzDd8vfKCJD8Ec4tf4QB-uZq92S8g9Hlvv1XJuvEAMvwnwZ-juwPtILZK9tDKIOobcZgfKfebGbKKlLIg2PTQ_kE9stj2oQqYuLQy5sQ5PvdMNXpphVkZ8u5NaKLmVvaUsn1gaLj-7Y0X3aQS5uKEYur54CtSl-GjNU2acCUIa4JHC76hnpli0EyX2Ev6Uzxy6totHQpj1vWZGcc7lR3WDc1bhcDgLlauZQnQlokt8aJzWc6P27riY0xJVnQw64CiT7ZPBFbdPyKVcFUn-3lXvgZ-1eQXLnj76WbNIjXqKq8VhCfk5W3GpYcg0SuYwn2O25c-PhJt3gnbb_gkzACBOWGLgQT0WsJYRP9yJGQE5Vl8yKQXKSt_AUMcvLLfjQAOeaWTup6SPVMRziFnrfqZUyv3ZKPDfK8RNGU3n1Qtui15SIAGXgTf0emOi3d-82cIRofJc1BGmJsyvcFpBuUSYP4PLEZ0sqxSWBKX2MrvIEa6Td28Xy1tU1eavvwXU7cCvozlcbs6G9vb1d04WkOYGMjt5MVhEt95Y5EbJ0rDwaO_RmO-_b-jtKaXyoK156834hPOLFhGK1L4VqnqWanMyFit70VBHnfXMGefBsr4rUqa5p9jOmqkTl4NOJmDhPhsOtsminOOKcEa_UaVK42yIipHM4uAZyOjb8wf910KHnK8I7ehD03URv0QYmcmPLwkZ-hE8w7tXlguN4D4kfdOyX7eDnPTnC_gOv4LmyJzVUxUs_iKhbSwJk1Zo66Ja3fSMQ8C_O5l4euExW2Q6fPA-_uhT9VWiH6iA6ogS78ipV0pUQNKKxpVVgO3dwWmXBe7pWomH6ktZtZaYSxl7MZosEYbDrnU6inbycNAS7df7tTKo1Ds_UGUR7A3LnjL8CdBrdBhkPn5fwZd9aclEHllnoOyVf2NN57B-eML7iZ1IdtarlUtMWm1bwuIsLRrzCj5V85gPkcDh3crTHRuyORrHgEtkhPaWHbpiUgxFU3HIkiprAfmkRpkN2CGOqSUzI47nCeDr8LAt4uzxr0gFe2mMxnbDoVbfsYOrF2QujOedAWno_jGOt8UX2TbC4XI0aw02_bUld4hZ4QEQdx63MQfSXibpr1zovePYn2MUeAXh5SHgk4dxHzgKwJB6T65cFNrAPATFJiXYLQYyACTMqp2iOydt1osYmxA4WZ2EUEYHy1ZY6GtF7balM1vLFu9Bj9RBfAd3b_nhl2oUpafOuM85zmM4Z4jidcCI-Wy2w4z5_zhxgztu2Qn439ttXc_pXZf1E2XeuVEAMGFfdKKRJEnHdAOx6BJk7kHq40IE5mNVS2ZrEw34BufBn5cADVO_OHZLEtH1lqJ8bTcKXqzXRCQqD9KGUk7VJ6_PbSQJB6YoUJpdL1EoFc9w9DV-0WKpDccb2v5hZxt_56qFX6wNLbm37RzJcp4jvSkFGYw06YKXwe1bX8nqi0SkaHv56kw4CQViJFXMIyUSPx3Jfk5-8b5L1f4EJ-0EvIrIEoj5m0xrPkHwL8UdWYt20RL8bhwFf4I1oN9nWTGf7j-7hhocftSawh7q2FCvHbyDy4Dern1ZdDcj4GmMAs8cqLoklZ5WZgDZfE7Z8KvymhE9w0Y_C2BIFPbtOU3fq5SpKez1eS3UOXax724WOf06_qcoB9zsh1HGTDn5Fs9qDzajcM4mAam3iuJ3H4uGHyk6v61luEzEc_UUxqz5zmDGRkit0jwRnSOSU2lmKLngO6L5_1Q-XK5g0VpfLM9DoC8PIbqEMbLXeE2vJf8YbvEDHX4y4f-jYJHKBMPO_dfLHuDtD6gAJP--zAZhQ7QWBmZT94hIcZi20m1U92DOwU_Lse7JLvGsdDLchj0mhgFUEkmrWd0udcwy4MUJmTnc8YPiMnmUwfW9A6zcUPdsB07nw0K-iLXfgNFFMgY9I14sUa7ZMUqClCexa87rx1uAZjzhh19YpTxrpvifp5neCjSRJfmQ54YgMdpGkHxuSpNzj6rC5H6zS0FLdYWhdQmev30dFoalo5n4-s117y4juM2iUdGjFxkEodmwyarS3rKg7pvITlcWls4PfQ-o3bjKTTlCIdtZS8zk_4nZTCil1FX5e0wPZtTAdxKPsuI2mOptxkw6FAyGwHJGEtKRNPktI7ZBHXCF5IoS1tpGVuw7nqHZKx4gvAmMS7q6tZJZrfuKH95GPvdtaUYF1sgs-xz_xEg_9M-wY4kovil8pkPkoT3uHeXDD_e2EJd3LvbYnKXY-EHqTqTgS7mVSnRpDfkFCyEz_KLM1lUcDC5PJNe75aDuW7wt5hsqAiNttDZBSPVglam04J2IdmJldIT-PjoaM8786aFGG308yMFGKnjjcQfM7uagq1ujxXeyQtl0N_qE_llXMf3izooHcjweaSRIReB-J5yyNXvCRXrTQn46oiFqfuvKQGBtrvoNcAUuBrHzvNn14tNjeYtE7sCRMqaa0SRkRE7LQ5-3b7cHSaMo-zS6_I1xWA7j0Seyyft2aFuQu4JFe6k0OFGiUodGm0WJ-9RtzRkDegu85VPs9Z_BJAd29vhC2aThtCWjuO8Cg5htWMobdwbqFfGuDGEbZPH6FY6zkczphZ1ivEkcOX0sRU1BVvw3qgj4ir2TBDbYN1l7upoV7jidf11BsT3ce1Iko3t8bUUupxhEAgkwkvlsf0grBxYLxUhkTaxB6ESXtLU3HQigULoflTcUIl5SPUrhP8ag5s2ijbxOdU_tvwsDbuyFRYqv9l-ugy9nO81cqVSj2cjcTetoLEqdv8TwaaOuZn6DWB0wK0kY3AXHc0lwfjNNfRC0QodzkAYl27CwaNyUAnMniKVAOI_w0d2x3ooyN50f27AtJhV6ypFp2E5Gjkpf0NFDw0NyKwNxHGVAHYNo5gavqhkdgcOYANPXQjK-Bcs3thSMqlWchjq7MJGvtzxoRB4pDtIcEyGpi0LIM3v3DGmI0CNazuAaBvOUbcvUQQDAxmaqH09IPoysltgX2IZo5mqraLn2BCbg3QjyA9qTCNgUDGjGp5wC3mPh1sgNiwLhAm93NGPq8AOCViNrhEooNLcmq06iVDdCGbkKKJpYUSKvSX_oIqLrHn6Cz7_QPctV25MK26JnWRGF2ZT9yam8CgFXJr77JFCczlFBhkbuIqyAl3ghw4tP0RAlK7XSi4zNV-ATgZoUYdYzrTp3FCw5gvgHFypo8e87EjORzdACW--zo1s05XLeMEvUDfjK6nLNB9OCvifMPNEyYt0xuCV8A4MWhnHtRRGhcWgJpU0x01XepaPZVcbIUrBJ-PGy4-4Dzf1CtYyB51TQgLHJiJFEFuDhBReRpFBnhCyHI0MK5YGe6Pxu5kjBqF8j_GNkVeIsasLYSQvaPITOUp0N_Afyhr6Mwy2LNTb05U0njtXtiWKXtFRF88Jg8t_hzX4EHtv6XcmibTC6PgqC98CywuBp2bLr0MHazCoIqXEvHnOCby7Xhr9uD0i0YSysE9IKZWYoLFpaILg2BxD_SiDetS-b3ibkoiQE-r5zdKqtu0OI_t9ZeKUZzyJRgTCBJdiBr3kSEF9YjgFybO6gWimDKSmyPQM-orMnQpv6JRWVORvZRpW04YUayxE9zm292c7G17Q6XLDp_MoNnIODiYr4QyH-PLJeyS0JMux1zk9WpZaHBI37z47X0rO6W2pkd9VdEK26i3Lum2YUKXxLMbDLzhdLTf3Zq-0TN9G5DiVrNp9nwo2ANuKDVtqTO_8Kmk1IsbL5lbAGBldQ3YENpQ5XyK2T4DGEdD9CPJIuRjvn365w6gmJVyMAEzgfVusSB4Q6ebUyMD8vTAxZ5NhsF3vvyXloP3MqZoxULs93tl7-uJmAtI0t4J7ojMPlAkq4H1QQvlOekJSbLP_xYy0LEbrWavMlpyQ7VcYERi8dcx7KKqMDBwhhSKSmd3KXzxltYxRKkpwLS7Bffnguu9gSggEwmxe9MD0RHP_l77jUbTsliOBL_bgBbnlYlrmAIv_Gbyog3aLHAp0F-pgJOmM4fkdYmhODCUjOaK4YkVOSo7SXCdM1CKKUYjtTWukJODe-Af5oAzO-XYDLpgI1SQA6qzpNoA5YC3DVIBbuQsMyjoiSAvbs_icEO86MYEWPcQ-DnWVhG-8cAFbDt0RMekOu1gTsBZtbpdXm8BXr6_Yh-kLLtU626v9cCoQ3l1jFsdAWwxU_wCYZi_m3s91dAIett9OJ2FhcN5wLf865kFuPoTjn4x9WqxXkVcWlbc0bgYxOigbxUgdR7SZqqRwlzFxMgJFbPnDL0W8dwZ2DIzsKHCp5_4CsqhuNxqB450dqgF7v1xkOJpa8oP4HBM0Sz40g68dYuQ7TUcDA2JfdPoqUsJIghOGA6s8Gaf0lveeu-iuSzZAtOU25Phi5NIltzGxSCakz3FMBoCM7U-jUw7DgUNyyZCn7pGbIECSc-k_fcjFGG2vvKFGfX64_ehqkLCQTjJBhjq7vUVdxpxT7eBG5KBmnDemWiCi-2brVyvBuqHviCbrC9IT0T_rC1h1KX7QrUpgkhMkplZjXkEC4xjZCKH-hlIKUcuzYtDs8qm15CkQWU0fapheaitNUMEGAoOphxN02nQdkXNtYcNdo4cPQiLjpkXJQKUyZkjwXMvK2wrADCZu1ZbXOOi0Nu5hLEAxEw9ZtcY1PexWtEl9LbIKMWz3K1sQhkCQ0JUgNkSiEtrKYmPuuJjpDkjPAo99XKpAb3G5cyL3l0AYWKVMhzhe1fkcYEZ3enEnfhprp9ZqaEp52DcESRShmiV09BwX4Z3fP7YCwQlzGvPQfbszPNSOV9mY1ya1cLuVjB3lvtlStl1pI7ZHFYl-WwiNTOxsqFPZv35zzdPe0oS4heCwmBYbKQm_VrXuwinEvPQErg1aKjbPBMN8DX8iYiKTqu5DBWo3UviZofo-wGswyBpuDYjgn54qg6OkyftxsCge5eyc5cdFH2_-qMr4hOqARV3ri79nFcDnF2VDUWxUFy6bfAFq6_jQRnKFKX3qkjtowpqt-kjIqZ6zRDZzq2GLjQk3aIlnwOAgOfIQ9P88L2jNVZTkzxT9CXagE4ElVPVYrwtDT6RA3CWcTmCIYLM7BZX5EAMR6DSkxyZGpngQt0SZvTWW0qKsgEVgL5vgReBeO_eMQw6EqxyKQypozlIMrtNCwRIP2MMstifmSWbPnW8OSd2-MV5c5CQf74-ltB4La8lAFEDHBdtfoNnGIFqNobMZemFTtzL8iTZ9-ddXe7_Di1UrBISncyCrtBxic3wsw0MroKidY1sXbN9MslVpntG3MyNjtciyBejDWbtaAIdHQhGCf-s5SQOhIGA42Lw0O8Ayk3bpy7iCoVRoIHCT0T38CTMhNTUi8kwokbfeU4x52LeBfUeWqnJkK4_Ilwx7KawvOrOTAg6mFtpWlWqMtpqnKieK-zveXxnCx6x2MjCUL0vBtp06Yc_p75mfq2BrtOziZHArhLZru4nlpZMfu1LN5dfkbhFfO6rRtec1VxUB920W2AGbacgD_I6AKHybPS9UiHQknz7sqRfCr7N6Qub_DuiceN4d5F2TBye6RZpDLfuIgPYyZMaNaLwBjZebriq9AYzWtNwkbZaJsZxy93Nx29z1epDh2p0YDYIzZkMAcOhXuhwld8KYpqpOEbcAFc6wewcF939avvTQTgWCErGSRqlqBjcwwgeFMD8thWo7ZoTmkMX-d_v4xc6VYcuu2Ss6fu4rgFXLNtrTy9NXqaEshMWevCy-SdwoM5X2DPzXQxJhSCkGvGgkz4Omht6TOCke_LlIqav4lDPTCWCmig6BSBTnqQ5NTRuM7CQ9kpd1AzTHuT1p_jLLNVJfWi3dLqV8w8HPP0nKoZciQJ9Z4KSzkjyJrqmF98z1O0HHDu6Q67Puc8F69J2Fr0hLk3ej0ie81coglXeJLaTsKxtMRQ-L0jbGR1GjTYD07woDp9PgDJDf1xlJR5lekJt66lG9XTAjMEzwIVWqWX_5Abs45h3nK9IwqRBabHXXzTRRrZLUatQxAxgmd7c615hh4LrA3gdlg7VxW4OGHpetuik7-IY8D4bFqmcMKyOmAtx0tqpVloP570VqFrthJjD9O8BaBpqDKJGsU3KDUxCdsZ0hfRt9SMHIQBbtYsk6pUFZDBK_Z0JRX5XlZgN0edT9CjsLoW1IFzbCPuqRW-14oUOpy9Bpc4vG2ByWv8gTm-x8_qOhgnJ8GOEAvoIKkNhGydmm7V7Eul7VuJ7_i0UpL77rWv3S2MTW2KNVujNUMzesmpSwgUEI4pGST4pau06AhZTQ8u-l8inIv83day_0K-WiL106aFbL3pDAq6yLsKNO-ISTGyNBHZrmBqposjM44ul4EwVwWCwisQHOMWVPLNpQsC8JYWx2GWShm_7KHlRia_nTAKd7Q7gj1hv5zuS4F-07Y-YObWYUgLueqZbtME7dzEeV-zWAXAXQdGfrfr34koCCDj3hi0ct7EdLxN2ZcNieo-3MfNKN391jCIHCPfqyNm8NVUryMkUh09SvqM4fIoWUdx3AngOBRjGeip9ZziwGXDLuLnIsnQFshAMi_5qNMwUBY7PGmxvt3jPKHnxP2N5rg05rRyVWL6_MjpsT8hgsOgAZxWT3vTFBFrx_UIc6mhlwWpj3k-mh0r3kNsXiT7mExj-TNtCwXZIhIrK3DVfDP2m6EiAECMmkBErKmjxkunAepBwCo4u5j_2-nR_bAKFKp4HQ6DiNOe-lJ38z76VaqasYIyjmMcL2pjttjzIgWNiPPVKZgpMW2LG_mejppfENDGgRtXEeLHuRiAAFAAsOOmd4vahZ5MtLL0tPxLT1arNamy_u-ohXb4djCwDXHZeIp_IR8arDXNhwDsAIoCQKhqJytQSuWwJjUDpkT6nWW3iPiPvXEjEBUaYA9Xp0SXFVb6dBI4kI-LqOoxnnur7tarxWbaPXrmH4eBvNBYHbcq06L4HowCcknAhqOg-v5ZdweUs44FI91ZJnnIETLclN5G-7hddFkWXFYLItnUPSFIYcUEceTKLfCX9erLu-l_ZNBo71s0fBtt8uSXtDC9VM9SS7tlNE2NNpgBC7lGYcX3T-SgZJ0pBg_ZlO2CXlL6iOSlt-ypRgNWClZTCqsPYJhpMHzHW3A74Egn4uSmOirALz_2GjTEPcilyNKCr_aIYUxBjqQziDUzmiNnSZWf49bfzLMDC12v7PXf2NBOjxq6Bxt43G4dGsONnzFwGRj9vR16vRSxQMWx_t0t3Y-qfzTneR6Hf0LaH5Fxnl6bo2dv4C4CgKRB8fr3INxDLrBSbIenAFF8dIOQs_ZEGg62yOkg2usQTrpMfpNbSsKnYCnVCwNJTxaego_lrcZZOKO66G6u64-GomjlUAOld36CfpC_DUZv6ObOaNbZrzuNpXhnm-jL1qRq9wivDtH0XxdmnPvaYpnkjlo7iRtmmjUG44hoUS0O_uHHBgJtFQMXiMkdyJlrm5cUhW46PE9sJS7Ou1yDlS4ja_eq61NXswYhix_toVT3-mZgUrzxY8Jywt-4AfpkqeqOXFGky9sdcQU3hH1FWZwSfOSzeM6RJro_oztp41FPfmpz4fRSqyjthU_y3Od-9PJSq9Id-qholnAUUTUsZb-YAjLCDBjZqs-lEKOD7lzhWxewKH6Xn0-2EBXTx5SjBWsSW1ANMhVIZUI_L-QvAYXVhTDLTi38DBJ7iDjLaevy84rH02nBYbnpdOlzeZle8-7qCehLGaXAEnEHgs9zHIIPeDiShKlsrtrOFc5c33E3URBvoeDaYOZc7Db1WrFGGE2HI6F2AqF30z04gt7vYSomMK1Fc69E0WZOZW5eGqyM7jlZ5dxb6GaAtst8ObUqIMJF6asbro_jVXMqqR6KOWlRo8aafbU2Fqnq2C5dXdvo0SJJfgwpKP7E1R-uaKfe5PL4OBsw5NYXS9Ffm1TaUVYV5xYdJWs_d723dF5d8S77cGaA3YqYoHmiY139Kos6pGoMUIaxjvqS9UvN3tcy0fntnHRNTXU_TpBYW0CKVGCRKsv1q6j4VbIFmhrgfsb7xyCQv294PHVGXVOj2ItzOblfO7Mc4YCDdluZAz8DwvpRub1t51u14hTvdmvku_DadPEK2OHj1mVujZJLfmA52USeDpFZ3eRi39ku8wKSH8W0MRL48jipZvntb9Qoj8hoHBeVPtT8_lnVyvEOZyAsBA5ndHe1WawQBljatwBTIeDs24lQ7364q88YhQFvultKUfphxLeyP8u870vrOmz5WqZ26t0xuMSa5hruSlV1kMEfv1voi9llRl2JgInBZBqEzuQUr_xhOdYoqiqnJIR-iCGsxl-RgHkyNUkiIEjSVt9NUEwiMzlI3hcS3xqS0eY0oH61soJN6EYzQCVA-M4u34SdasYfCkTJGlME35tzTckDoafs1bsdi-meQRihUaWIuUBoLPdcVMnlqNrP5dhgBygaDtK07oqCZ7AAGu8p1u_ba7rE-kCO6gtII_LciLi1Jkgg5MW-7RhMIC_h9F-hQ90cUJZefeElWRz_MWfWvabfG76PR5NCQKXKNmd0_o0rFLjqZiy2qFn5XFv20zsFnc9u1iUMJ0Hf8PdAGY-mpvX5ey8_lzWnwmZmq6WFiXxzVEeT4xaA-kT4V0pmvCY_fjR_loT2ZDx0GmY_uYqPe5XjoXEq9vjeS7eaNsJRWbxn7_uI-SnXH-52RCkX-ernpYkpsZ6qKDUtGijGgKk5--ArQrZh1vjiCmtFaIiPjQbda70KFPVnkeSUjmmBnrHgZGJJLNYM0YIPMEFVksO1lSg2xMljLex8A6GaC9KK-3S1Sd-BhdSNGmok3qdfKvDnOHflef2ay0BK6wNVWOAV4ali19dTS6ZTxgybBOm1TXF7TawzhdsiQCJjUW4dxgPav66mqzv4Z98RYkt80w2w1DSGoYR1xkg6lPQCc1IoXdMMkEoDgDzE5R5Bk8u4V7wxngPc8qnleC0YNFJ03mRq1qr5I_ssrlN506kFrnWfNH9zwMArmiXypQltpe1LGH66xN7rFTlobmgGasqVpRVauvw4NF2mp6DvFp3wWddiBsx8znsqeQV5I160i-LpawO0m9QQIYyoWPkIlp7cB0EuDBHhI0n41ayTbnjoRsEkbGB7UaFvMM91mhdb0Rb0HD-0R_xpTfxnoQShIHUAxKI5tk_oZ6Om4ipjnalJc_6yrsACFEuzkWT9WLX4WOghn75Re7OFRhzLEShfuRqhfRlunw6LvhovrI61qvCJblNpCZmUhBBHyHxLnanQ4KwUlgf4huWfzgyB-7R4XM1YxCXALjuxnhjQDjqDDEGv0GUxkdf3bYNdcE2t609UMCjAdaDcBQa7OX-ivuY3IlctyFYElmg6ghYMUoxDXvT2uEUiM8lj17Nb7ZfqeHpuisrmuwe2N1OqEAwM4anUAUuEXzt4FDaUfcZTttWD2sPgu7jTpLtdt28WH77Iaou56pMFtftuFqbGjMVwW9rad60KuY5fJ8K07cA3tp-VfY1uUdASoriTVk_OzBQYpEKtT5FN1Z5p4sDnXf1rLz_EXUyR_RnPFLZUGitcFNGqJOj8NmLTzY4rB7BtXlMF_Z5cWURX7syfa8qKnpk3luq66y18sKgVTQT5QQ6VwQCm66x3k7RI6nvRRx0sMiQx7wEB99vt2FlJXRgXTXR7OnGEO8djfd8SgxSi5OyI4e6kjzqCsxto1f6WunpN8rrWceDnTCnzAQ2A29uv9wpzlYygpEtUCAKxsVUV5eyJPWvrhWrrvR_3DmYstK7rz0nuNpQQfVvwFmCLUbMRSbEOegYQgAJV2Djh9x7uWNJSxWFa7_V4qLZUmPS6E8XbEVuHT9DwuR3obmKPtZhU8vDH3Zm81pVa0cpc9NyGpFdtH5mFs0sCgOnFiUKm6CMkEtoHAXzBYmRlzjNdo5rtM11WwVCwmdk09stRcV66wzA_JMR9vG2Mz1-upgaR-dYO7HtLqi_h6eIYwFs0q0-Ly2schH90cZ9AYm6ERWnG4NvvHb93guMre3C6GerGaH2qZ0334Y_difcGc6k18pETcFJcK6a-A5ruFljIt_-RUi8NB7R-45gHc--qbYHRfyapqLjZAt_GIMyaMeGqw6cdrWfZvX0y40sUAx6tjiCG7qUNRV6ccqrsTb6J0pWrrhsAIjWQFOcSPKHC7ezRDdwan8bSaEoJWqgUu6coBG9Nfhykdu_rcKyB8iE6qZo1YY4a8tJqUbOXTGBMQ5fqWGdpHQSMcPcOVLAgGSA_4CahNjDyCZYnOM__sIKNZLKlM_cRafIwwVeUUMGsBalWbEdWMbRw8QaXlQ9HBMGhqFGENg11itsukTkiDGaLWKLAO615fqoL6LgCPE4r4xZIYu1Q8JabWBjUPp04URwQkUJ3vwQsgoVsOv3Glvb8kaU8XGC_cdTZWkJrF-NOucNrbiMli2Ahy1YtghlY0DyjCVM4V9wBRGE1uRgO-YLdaYWgIDPkYmLQqzy6LYtmFV1jI3AihotPfqJBYJ5NGI7pZ1kNgbg3sXhk1DRnZhQ7rfTK12YtR73hTaYUcxbGAhvTvvhNnhXIWQwKavGAyN5WW9NrbCPP7pIah0ipu82bqn2qFWU0IGyxI2BqUBSpks4hNOSGlyeHoDdN8ZqZrRWQTG0NCMpII0MnpL95gXCYb_MJoybuAcGyIU1iR-9zOdL60YoVq7YuUpjmUwJVcIz67uMe3Py5x0QmyN6Poy8TGua_qjzFIXsU0dqyoSS9kyVljXYxjbh1oCFbAbLgocVTBURNl6hyrbwa58M6JBZjEX0E_W1WGOjdI3bT7Twm6Q1ND6rlPcMnNMM7Rn5tivnoXsyYdUvTtRgeTqCqzQNGFYLzfx3eWXdqFQCqsUWg7NTeUKknjlk9DHuhzPhy-xq7fCovQsPvOXrOUXttOFXhvxIJvAznmpf2uuW1hwDBzFiWFj62YNn2NsK33zz8yxecw7ru3N1VOETbHSBqc9hBDgu8v5hVlMZWW79A8zi_sReuJsholmJeRzmF6OTQOyUL1JkX3rHcm8JyaD03qEYbxsml28f1TrbcWHrPTT5WifIfsaugDpoDrNyKqkFrSyDo1KBZCiCB5kES4b84V7PlMzgG_Q81-IHUuxu-DiRjmX4Bxof8gf-e60EzUv7QTGwh3B_4EqM3VcPIQdGf8rNRznRgibt_DziW6Ou_atVI3AkHj4ZqpQqimxrkCJGleQ7iMvVMh6HGspx2nmgbauOLG02BJJ_FzyRRyQKicMU5SPdIGB9TVfLGugQT-Cg-9lBWhSOopxjVIY6tJsolpzZiKrtTKHMNnErqpP4nIbsgdKCCE1QmUZ0oFkjXzDJrIR_QFBDhDok1UcMKnM3Gu0zAlPSnTxj7A-2fxOzId6gNNyctUV5gxSoYTUiFb6nbCVkCvSUVYpleU4iD13iw0NyWM7QAWyRwPJ8JfwtiL13sIEyMnBp--0mHFC8P7m5xeRHWK366zM1SYm0RV9EqLK7Q4tEiPTqTFt5sS6F97BJTS0kvVBUOojkoxTxpTmeIldtkDwuyiKbIpmlPZi0lvfNeUIfaX7iRT_4LyW70V9k65ka4WeofdyYB9GgZ_oVPQBCFso7kGBwH_cG5KZmIsltR_U7z5drPFBojZJXqmogcC464ASIXNuQlAwOQbqnmVvM7eVfpl5J76nisEX3zayyNnY4Q6pF2IYVjiYYoeV7PFCnGPjCDNubOPfdYQDClnDO-q1RTlgUNyWtUGBlK88wQV7phjmNBnjeHuAPw_1yeaqT8F1FTrCY44eYxTn-zjnjjJoa4uvOX24EDSYy-NLOlcSATEj4Fslltv3SQxunfIm1xwkL6XExgGko5vAtEEy2nJGs2SM3-HRRm1UsYSQsrR0zHB3iVgpzc1TpYHzyh7Rp2nP1osqF28ocmQ7ZDJR81_xD0Ut32nVBA054UO9zQdIR-X-Xm5HTRCfWdfTOOcWA0yV7bB06_VnrOBJS7mYSFerr7hFbL7VQAoSWZTMG5s8y8AhJNoqWc5seMIVU-vmcze74aRLnuvhvSp6RE00u-gho0wHLOgqRNQXRP4Vjqsi4Qp80Iksmv-blo9bH3-orblzv-IyvrSX2tqgAa8jJxvJVFN5_tag5zazEl1jdLRcg8Po2laVvq8lOhsQkGVmwpkSoFrv8_Wk9f1vjUwIkJ0tC4iowlhnT1JcfXtSr7ZJVWrqxZ59vhlvZkmAi5lpOf3TuqrravLnwrmFsGB4jqGPbwfmDhOUIJuVc1SeO7PewcWUN3kkh6TDhzti-39-8VG1v1WEeA0Jy6oTM6VIHEF3E67r8aO87MlTwx2r-UeYD7QwrO_XUz_9uTKGKJf40iMAePUTfu-IR5su7bAlPntAY1JSWWXzA9MzS8KfzIhOlkCbdNiRJrTRTmIzs0TXJuSXf3evtPTN6Sn8xg3SG-0ZX9zwqtXk_7qzhrvJCICn9AIvT7sEN91bdlRHXIzBTNcfRBv33Rssm902PXCjltWotxqfmGaey6-M6DRSnwPjZ5U8PCPb2GJALxSTIinDidpennbIdhOzAVwi5XbkT7J8MPfWI49S3l__Tx77hdsg90qf-0GKcNA1KZlWDuVfie-t-70h9B6qzvIZV70iWGBldK3OaBjSUXpTmElh2t6xw0SohFAdDbT4lrSyURxo-aZqwl_oIzNUBNj5SArdagYrTIEDs5IQ2Yn2clwiAphjDnkJsDz1owBmDAEy7ZRTTsrJh30jf0OA73nJqpYJuxlLZmJ9fqgBen7PQLXZU8hH-CFoJxSEq8B6E86BfuhD7z0AESxMaUhlV3OHJt5ksjurgEMQvBktwLE9sWY110iyyOqop4chzUtDSGH1XyIoWgNfkFcwf5hWDd6yPskHXB_Wm1w3gRyRwE708RFauo5xjA4xpqgRaejQFNwJJw-TRoo-gj_Yma1aq81cSXD9XE3RzToytrqNKnxFz8eSdbySq4Fs1lDMjiX5CXRoPIVpLDdUmtT0wnOrDV8UPPdHmoB3WR6t58_r0v7hiamcmG_sgG_Y8LwL5qQPBfLfJ0eiQn6tnRLjmAr3Bt4b2tyMXm6455hgOjPxZCHuVDEuIjlshCZhZXXJuT0aG1A9AME8Z2tM1bK4V9E7-BcM0KeaiATnZqcoTgNL4m_QH7X_RH4jF7Z1ECOfSFG0fM0DSI2E0p8BhhyCV4ZGZRrp5AmzQi4fbnSfbJujAOPHJ2uYWgd6s__ud9MwHVOzktRtNy4h8_nudSp6oWcG-EjoppKWSdDXI-JFvb0cBoxvhoRFSB6Urlr8sI05vxeac9Gtnf24Nxo0QTQQ3PyuG01VUCT8cVOTQu3o3aangS6bSXZMpXAk0H7L2RhzlNOHdri9gCtIegUCGwaGCH0xk3d2uyZuZxIbnQbdEnktKmOR7ATrYhhaPhnkzNoDlXvvEYzg39vN4EvVWf3XPcMayERSy3hgWdCe8Q_s7fmfE81RWrmnQEXsFsQQPHc8Toss90WqmyaZUOqmtoWOTdNqmrULVZniT6WHT49fa0ZGhNFCoHWR_AQTWT5DlEHvH0zd0Sx8x0Zg6X9gqA_8B7fzULeU-1Uh1TC6-W9VpUg_HHBTJ3zIFxp0z8jmktsz80m0OzmCcDtA0fUK2FApxY_lEYu9WutzrQreGfNaRIJbhHh96QgUD2V12T4nNp92ROVS77A3I9_GOLm3d5RTqY-ZwA-egrmQVZ-eFjqgY8rES7orO4GPcf-xrtCxetWE4iSPnOT51p3dsoru_QnzSWXQ8WBn86G0NE-lMqT6n00v1toBX2nXeBcWfllEgcJywR-9F17WSvM66bePh-75b_EdVhd46m9CWog018h_rMDYjg8FANTg5bZLcxwps4uIlcfd5ajJbiBJvAmshPMRX8FrhTQ75d5G2UOlGb3lkbe6b3_EhOEoUd-8TzNuKnpFvMGLSuKmZlwk2b6cSGGkEcyA5b3UUegXokaJfn2IvqicZzpJy-G9DDmlEIXQ2ikTdqJV4Xj5mc13xZvlkli_ZUJJinmsrtXFhfe0C7ENS1kDH3aVEu9TlvbIXVqAxGqyP2y6Oeux9_AWSkxheKMeS-DyZPEbbdn6zECk9gaRejA2WGcWo-4rBrKpt-5iiN0PcKfIyvKFuqeEabnVwy1UvboRGyavdy9VCS43mHYRt1MsbLFanTEh653aeH46lVwYoPOa03od79jkXr7teg__TuGiB1UqN7lsFy2zgHIRBC9-iYgoLszuQP-10d245OcRDYGrbLVSMXrS0qBiXprQnqUGsRk8RK7btGIalMxGW6g3BeAlGfIrvJIObOzV6JqYfVK3k4CF7DaIFHfViti0pN3uu6f64UESyBuCA_3cI0eg6IxFZMt1HqiM6MMA5CWVnmudKyp4qyRNSSYycd9MmHB5Y5Jqsmd21uirlDS7_fsFFOqhk-2o45G0qgSRTO5te3UHlH95jY4N36qz0W4_88e6p4bAAqTHrNQCmYBQYDBWgGSPI8GFuHKfIhi6nuxnkjbzf70fr9ocZXYEKiRRxwlJjiPu-jhekkpX-u1MVkUKAO9hJJKwLnCuuyEuklE4JjMxi7M3HjTfWd4vqBRJBB-bKv6KjpQtJG2xkXXPrVFZprn44IlRgrf1bfNE-JypGXG7a_vSUZtvGfOCjNY0x_FqWl72CORNZUHOVPnZt1gnvIrzbe9mGJy_ApsXOxCc4bP3shrkHLcBM0CdI_0jFQzm9kxilj4XcGkw2L8BFuFehjRPn3LZt9dRe1lN16t-szt9AfPrJQnjZ1UmTWYGuj5_LHtmRzv-wJpi9qdoPl__Ez0q58CswYXbQuhoowtpPjU_ikS7Sw_G4Xz6eUnfou9JOqpa7_Q6ZxXeOlbMkgOCU6QSBqlHElCxgMFS1u5aYiQ-YkZf1-EF3yh647MGw3VuoZrfYCojMkS-6YxTugxFgNfmCgyrYmOe8qJtFaL641zgU5ylEO5pTnao8ly8l4mJU5vb6StfGzQCc_2_g5tKMlY_hs5LpUeZ1rcYwxxyvncdtUGvs_AhAT-YAuRBO7Yf24lrOI8jTqBMt_E-k5yxJ5jqyFRaJ-65eFQlV3YEDcVGMQ0HU5_6XMyAKQ2Mv-jkWMbU1ilPBJC146GGetBq3nccLStWlIZRCppJrq4KR2ijBQ9YZiYHsdDJylzEFo0IOIAew97TY70spzilK7sQ7mAnnk5BOoWBs4jc7sTHBWln4-XUZ3EeIu-oEqvWc-8TyTeDKziofeKu-wgxb1Pvvfj7oCeqtxYDlF8TJuLtXMxgDeRXzxKk35p4sOmNXST-is8i4buRbb0XxPElPlylC-TwvS4VLNeBZ9O545x3oCsx4tWpzsOwL3MtsxOF3Pm0ADmeUg8tI3nfkOTlZTaP76Ruve_PBC0-qSuMTMJIl1eVzI_Z4cyub67QQb7PmHvTvG1qfQsUw7FvzIlHWbIgMsjKf2e9i1VJys7Hgqu6nNoP31OemXlP9ewc08QEynWY_BmeYBBEAV3fvXuxnthlPncdGJg9XlB-dt4ml5HAClTbKpeSVhsXR7FD0btktHmHVpyBjQeOhdxlbpixqg27iDL-u0ZR1jSe9SvnFmevV_oWDmnWoSRfsKj5qRBVlASiksanrvh8TsgFmYbhZnrztwnkyu72nTBdDrdLLqw4XpLQETr8e_vDS-xBxBQljSsaIqVnR2IwluKc8wPnNSHgBwuo1rwC2DD31M1iyJiUqRnt1WpvdeTSx2erpt6oCZNffhpEh0vuQIAj70hInxiKMAJOafRzGReFQG97bRYQla247IeEoFO97Qif4XLWn-9TBXawcKKGge7MAF2Bd9bzcwZKpFD6bUmW7qLNOBtl6kyoAKMfnMRI6WnVi8qM9Mx4JR0O_fAiJe4PuHTq066hVJ3htQNrIv-w-d2RmqvrZsiRarrIUMFZpaZf4gu53Cnn5qhIm6AsP3s9DO-MHVb9odWu7VBAcUfhb0QcUNoJKzsZ6DLSimYaCDToJC4uxL-LaklVAQmincUN3zJqtNODLuGMDLxg8CwxgsQvqhRxwIdRvIWoRekkKQC1BUkOZrxUMWbZRVGZTHws9Ppvet1kE8bF1_Y9O4aoaXtgQTKfeuBhZcbCwJ6I2doc4FYfVgzYVLy4OVg7s-iCxK7NNX6pXzcQ2h0w2FOy6xGAhJIajUco4GQdqeE2dzu5i41tO0S-1wSuLFPp0xYBFOkCuNGKVMXcL7krJm2X9H9lwB4VB0QTM8EKerRx2NwrGTvdhQS9yM1ZyaGqXVzUEKc69224G7wFej5tpNCwBfAJnQnVXPEz1xWtX-udI3cijymd5TBJettyXW71f3IvFRPAUzADKBuEn4wftHQFYr7xjYwOCjmK8jNeOVutlDuT82O9mM8EZDEGgPETFjSCppcY5_02Edg0fihZRI0HTFzQk3RhDk-_3bND92PzHoUhXtPxgZ7bTcGjxzx2Lh3KULYZUFnXozfJKcSpJ_OoTrXXbrOy7gU5kDuCCwaGL7ZZ8Q3oOntzpCSKcd4X2rGTfNPzvSH0Jm1-0AaYApu3TXInSLkZ_mKUMwQCdAq8P75IvRiJLSC5J1giWPpbahtc7bDZ-2Aniz0WMIbmwnpQWrcpTuPZUhyjvjpJZqYLqMqevxt-zqy2y5UM1fwKaTDH_phgl7gnyGtehyawec_TPZGkgBChN0Ebq6pIwBYf5gIFRzRSiOhiPyo2GnCvGXyDhJiz6SSMFwVenlJO0TwpM9XCRVy1BAd6CPcJx7qBGp6rIiDLk3alTTXe_iEAH-a8aOKxcMEixSTxafXgRW7vIZc0DVap0O5cvOcW_wBCaLgI7F-AJ9VwNdnsEhxiWqRXrsY5g3WE9WAvyQJlOadXchbss9xdO0FkMBFvSfRNt2u5y9O8opTlIqxKwH71IRcUJnMp9kJXMS3B7l2i9kHN1NOWhdL_AJyGEx6OuZGdz5jcZ83bPasfQiR4YUECZbMtYpmNSli7z_44We3RgJtof4y77EA8HjsFYC9uVamSuhiJeX2bmYKv5fPEJJPGBXpm_U4IfARM9BLlcBl6lGWpmZmgrljivJp3VYTcDR0rON0oDXd_uHvpXkjlNK3J5E-dwLXiJCkDMYV1cwqtG81bouR8DiS3kQiNKUCsCytBNJBc9VKDrvQULxKWFYNGwFPf000U4nYLB2nlr1BgoAYTjUxtIRZZryoKPnkW27pykoxdZDLa_MZMcsmZyCr6OEF7msKkeFdbobcUv-pxepN4FGnNc6-Nb-e-hvS7rjhsDwPNkbo5vj2e_VFWobK3aEJqYmF-hDmoUO-mv5wRS23P77eL79SENZhtI4qJPiZprihSt9LTwHbPudeGsjMFukALTiWRBfK7_aMxn8fNafUvZ-vaSIPVUR7PfR0-qOwQpPbWw6Ej3lKQDndVziFI_V_3ZcUnEcJOwF175Iw_nvXLTVN6g_TwBbA8U4T2Wf1pZpXeGpnzmBxdjrsxNfl5WpdNI22G108Q44nKCpkLzG1prhHmI2U99oKXIni2Z65varhTOxshTin2TFekSVeCbuXmT52hyJK8RRif90EwVDW9xOkI4fOzUqKAMeMtFzCFNsXPtkeemtNyWm9CT1MDsDLhWz98nFKCKba_19jbb6AH1ZluSFSapH_NazFUB-OGYSacUOI-26oNhERnM5hKjlMsPLk-UfAciQ_nW4CRtNsYhV3fQEukE7IEfW6Pmu2NKkqIXWI_PDfJ8rX1C2foAQH-ambA2BYaXQu2DgMQCAFD9k15CHjWS-Vo72HGeOtJr-hmuRy4obJwiwE0-6RR4OJ0cNfQ4g6WaTFpLXLVZTmjjeuNI7FOsTHkdshkN4nH5mBP150KXf6CuNB61B_H0ZDkJQHqYFYSHUP8nPrZ6TzDk2tRxG4nZOHhwDzZic36X_RtOLF-STSygv-D0DtMKcOfdndziv1bXddF3ATkwx8a6bSkBAZ8_TQIdO5fPVVzGq8ER39nXIAkV1NuVCj2s_doBxw8rEsF32X-gsttw9ntg3foiqWj72lsaruhyuVg7ZXmtFQtDtP_25jOnFeoKtcZPo-tjCpIPuzgxJaR6yW8omQeMplL1hQXAmCI9-hJleYp_f89WTABQr9FJBQO7bmJh-X49bvu9CyuHhL-GJozQK17CHZ77owOnq5L0zRfvsQf79dDhzBNg6gf04I74wXlDLb94OvGQP_xHsPQkMkXS3stJPIAVLe-e7bYoRUlcRPor9i2VYCXeJ0G2FANY6EtyS2HXWtay59dUSGp2YUuQVQcqn9lFjaetyVKVARqcerGb76phjZXOf1yP_VbkilH6soY9MrACJmJDPHCtDEFISkKcPFmAUQfjrpu-SnWckK2DCroSlzn8u-a5hJWeuSa1DFT0ONTms6TMz0-7TKpugoQT6yRnLdrXFAvaLvnyO5vJwDAwtc78e_rwQMtuiDJstBWaN67oVW0RseHkJqCQeByIkdLYT9J8w9NBgdT4BKuw9zdx_IUsGnEzSgWq4m0WApLYPo6I-HWUSTTc5gPx9vJMWXsZf55ESo24fPBWKzSKucZkQiuJZr9Drc88OxHQHaGlE9olDmjxLcDe8KHNZRTfss07Tu2iK1NHJwCbjl1rdU9WyZ2J8lB16BZ2oh-JWcBzCLokCkEnIsVCOJkEB7NiwTJ9LajTnHyH7R5Y0vkwDA_nXVpUmq14f2gikIF52w4WNNPcdmdnUziG3pGrVzXMIoSJj42MFcZe5RzpKlUcWibEFRqijoqOYw1pvvVhGy2xTaIk-bwjeKRr00G0A8I8aWgr3w_dJIHMHQGdrhWA3dyAyzdamaqTSArG1QIv3MMMUSQi1TTW0Eg734JPzP6MFG23wYQFmUdwCQJ3kHoK9oSOJmdubAmf7ErPvfwuzt2Z6uulPEv5ZmZTMLe0Wb4JfyGQVPkADATwVxwXnx4INA3Jbrf6cUzYeprV6d4gDGDsHOgnfMGDdZyKRZyJ-pb47ib0llrkATnNC-S1jO_wxUiZ0HM1Plh-yWMfcYC9psRpgU3ly-zPjQs1d3z58pvA9kw5jbzGzGJrVWY5d73nY2zOkSxvYXe2c4fzU3s5i8qyXuCtKukRq7Ft3ZL9WbZ4aH-e54LNIMN1Xgn-oeilm0Ej2RsyhEercqVIuNEjWrHSwYwBhhMfPYclE7CoYY3irDeICcrEcyQJ-5ZDOKPP-60F80IEsghfqJvrCALAXBBYbKGApoXjxiuzAh2SsSYfbGZSoom3KZ9jKfrybr85nx3OT54xc9fpa9JO4CYWC4-ffSrUCL8b8WZ-M-RzjzF_h_D3dNCe849Vq1_Bwgb6rbvMDvEnbWxaTrfTvqM1fpyNHULZHyRe27tKerekmzvXkoVDyjphkQN876UNYvf7fFFClAEih2v0K1nx05TQ8Pac0ottsUTg3Yx5Cd8uJQcOupJkgDWOtB9mDID5IO9fgV0kTwKCNRTIlKPCfQ3WHut6edz4xcibn_ogSYKRI6bQ0V643fE6CepkslRKoN2F98RDG9-drgmLo4FdmXI2U8qnAWnMWwRq1vEvZVl9LHUuV2iguNyVmXfK8GMaQBioSThQaYb39Lj49bmhlHzmRE8fBQbfNBwf6fWG3UQw3HW6AHEnMqE85Roz4x_XLAuOQsIoLwapsnpOxU_2qmK9CqWsEjfpb0_MJPQZLiSifQe3-nmJnfa35XxJ_p40cpGbjCJns6-sgwZ-5POFS9-i8QMi3Ot_pox3gfwV6sBJmqybdXnNfte59NhyJYRQYyl-oNIbWG5DPLTL1UTXC0O82EQjZngPUtI_w_UI_ErjCjdp1HfF_oO1aB3eLlooDQ_cOUQ91fW_AAuQEH_mKmb01GGuAiM4NJE4ZIixRpdSkTaTNQ5o3hoVz5QmGNwtZn82nN-dhOD_H42HpsTK-no06azvXnLNpr1F723Xudjc2ZV8XUbUwHmOGXfUBFNrKSDQ1TrS_u0SE_H9fDDzADZlLksvoPZwJ7lh-THvwIqayY7_TXtVT5SKn9hH2Uc-5aICNSwyM1C3dhRjXcJ21EIQVBHBhMtMANuE-rHX8TC6_tqAhZ0OHs7UvAtyftOZj6wpEQWbpPAPZFz6ZNC2dCzz3c7TbS0v60fhHloqcXweS-w-Ivwj3p29_RQ8IuwVmDzEhqXnMB0i-T6zJYGH4aJFO6F5V9cQyoWyITHPmIBoGsEq-oNLsFiOKdnEAztTIXA4OLzcgkN_lRhN33jpcIjhVCIye4Xun3Z6GXSgneDzI5okVp4vmjSSCRDdV7v6ChVQNkmzBgCV-o3wWTTuHwYYkWxtqA9-8umN7zagNbsEtQK3Nm4UmivBfh65_pmg8rHZIuljszsFthi9FDY6lbWI_gq1N-CiGkxyY44N2Fa8iJYUTIrd2dlr9Eba1NAofENcTzu8kTgZjvC-VE4LGLU8jpMBmfnAB0Otf81jjEUH0hXzczCbyEJ1TeRV3jPkZaWkr6K5jNx2BaV0YYmNveYXiFQ8v0ogq8UtLtpMsOWamdbJQQu_sBLcvePWlJg7x1Fd3h8KDvJ6f1eQvz1ZFxluPi-Oe_Tj9WX_qWdIiLoAstrzFIJpib26bMShTraFPDVUjLX5s1T2kSbOrKpg1CTaqadwf4vqUjoGl1PEsqMz2tLKHApYkZpiEBpPoddqmqsA4kWR4NQjmC0lJ_L8vB6iID3c_ajgBdVRt_f-eo9PJisH1LmP4_I7hLYAFAPmcwQ6iXBfLJvSyCEdYZakpPDi6Uo1P0QQky902ua3K97wgWk1po_7fx2_8jNXAGmuKePn-78l3Jje88OYqU_gKitDv_DB3V3Bqoam_kPUlMZUIoTRgVyKZ_oBimu45HADELb3Z6dZVjc0RKSA_QAbHyPB930BdL5LDOQdm9b0yLJEiiGOBE5zE3FLI37bpCIsKJxznzXY7BXi_Svmar0T3VNO7VA7TDot8ZepEFR5uZ0plq7qZ25xvb7Rf4g6s7ENBsWA-djzOM8IvecMky0tl17lfgi32_gYpINh6DpPYccBi23ObSy_aXqRvb8H_v6mGE6cKF-mTRt96vHgioKmUugS5jVZtq3XpuOBy8Tw6oEJs2RmgSWBysX75QJNJHw-xCCed7Zs7Y4z8LRfTz9okHAHT_VFBa_MDYLlXhQ4OHAo1YhdHg467FUSiEls5AJcnzvDrbPR51R2BAviiEufzEeIX8GxEsDkHZmXwXiKPHIdYbgQRorHYCrwMZ3UqALEVYB3T7ZUnE2_VFrowWvNCISrorxgyiDbfV6LDtRNnUxJPmVYryOUnM9XibrW_pw9CyBQSWM_oMZ3glv3R33_0q-FK5dr-gdNXfuwgkDYnC8gfmcZZQCO7DlhWUsKQE0qggQS9vJ0AlrHU77Sn5LI2R_9fUmSRIjkIx9EK1YDLD_S_WPElEdq4ol8PGDJ8_Sm_O-_Oe4cpZ0fSII2b1QuJwnmCrX89El_GyH8jPT62IONeeR5qCXXsViIOtV5tGuabTMa4GHQBnsA-7xYsSyiNSxlTES79j-yapm2T8tp7lh4vYWXwV6IPkFkwQO97eFwSEFVfqxKJu3Dmb0TW38hJ8FZ-TpTT0nz5wyd54p8sW4rkHugqdQs01UkVCKdR4C1QMoicjTTqvFwkFV17jmxxQKxaHIbVVSma284-hvzAJO03qk_2wazy-vtdwjFKgNocLoAlXf7G_N9XJXpI63zMQpBbHQbRWQApITlrjROGlQt77ZeH0iHMHw9xyiAWTXLC5ArF0LV2ohJyt-72qPvJQht0j-GNGCvPlhrOnEaXStQ4TXdJpygoxxFN0TDHqryBzNsNHKXU-UzRvuiou5X-moxGunhxMdxfNhLkBwE1IiiLg0OrwgDfJn_URnssSk06JvVtjCGLxvZFU2d92f9sryCyUKmYZtCOvpj8JtSGr47Tx3MgbQNWXgQrNpSLIFFyclLzcRfjNnKXXnksKCiGX6mo_vhs7iU7BTu8CDZozQ3vKL-YBC0O3y2EPwU6p2Umi9cOubePUvInW7VpWcvpbXDxXmvTdXjOxOjCe-1OQ5E2M7CC1Mn6zVgWzYFMWHKxQUhOte94oVdkljkdYtWVLDukeUkPgdX_qy0xdGuXDtfwegYPkN9ThOZiq9_BKwlIz9OUdaJFH2LswUhDpLRfV78At508XFYBy8YWWIpoc1oSSJ2heS1xGNj8jPyrDv0QNpW-aSpBZWRGv2QA8zYfUVPGIrEESkSpDjiivNSH4-F5AkE9-tlZoNoAQKb97R8QXEdgEk--aDFeAUF1dBei6Ze0ucGyK0bkImT8rjHSuOLMpKRVUlrjXv2SGXuV2v7ovFQ9k2CkKsbNb4KivGmyVt5dXUaAcxBCIyHXaATFmMkQoE86XcC0klPM5lkskKKpDbOl7Y6iaJoyVLeMAPJIm-Uq82mb8ml84Owip9m-8IA98fkYhm3h1k1mCWWIuH4YqWdHK800FGUlZz3NM3oJz0yBY389FCYTSypQ7g28ozqfyCw3WkgTL0j0Pkh2YyVE8e2BczFgWgFy7kEbEFBYM4Ld258BS9P5AkLZo2HQV7SIoGp-Wrir_SIwNQBApQNmnUP4aoHACa5-SDtSV5xoDzS2-kiH2ZcGMtGVwcY6Abl6vQY1SSfhuUtnpiBwJ_M40vF1XDdvkk-uDTbtf_8QMA5H49ILo0lKP5udlcX-2mkME1w7FRe1184khTmdWaWErJJgSoOLFRzr74TZxrjHWNE1XTlOmrBQfmHrW72eWxxPtpEeQEK1P1xGxsZ--bTYLro6YRHquU2_BM3tASkt1tMrpwee_nm-fzWhVQLSN3vyL_IEZhQVnb1Z6B__N94KLLwAJ-Oi_WIKyYOLVxaJtkdmEDJo3Eevrp3JRCvkkD-ZW_JZbYgH4B85kEy-ChbcN9oVL8DjX3QFXuc0oMpnFGXIOdvwzicu1Bg2bgeLupHUyLOp-4_lA6694FFuSN5P4p91L8FDna49f_OoQOa6e1vsW-ytXgWE7I_OJOl1vkaHtSfmeSnabFLD7Z4KwzOB_8YM6Ezly4VvR_BeoKN9vWueUykUNufwzS3bgWilG64bG9vlNYaUfsXFI-s1Q0qc_ZIs4hj5Uc89yWUWBrSyoOd46lDtbAwuFqjPS5BY0oTNejOG4BeWK3dCKePpOzanRhN4nPmJAsDOUlOxvN4coC_TitXb4FmUQLI8J1RfhV70KUA5HIoU9yVGU4M4I5IcEqmX3_A6gydnntwCANnDcogzSJs5tykPmTlBjlhuUHeUpIAHQexrcTVP0YJ4W4U0K__TF17sQSTVHZCvFii6owNXyavcsUkj2XLlzT8a5emgRBZXjObrboxvdkvzDMtr7jGOP-p259bNUiRdFVvRXCYOTPPCiq4pEQbU0haESuexRyphcb-BuLydqk6DcjMYIucOyVcETzpNii8whj5QM1SjLYHJYtjEh7i--3S-rkmBMvmLJWsmq9PEjGqbm4_w0qjvpL2KGwoOsSlK05TYQNXDMDsBjAlB6Z9B9wJNv5EvI9lTITNwd7NDpEPwBGUgvJoP_dBexoBKYiaaTZiMSWeGedbncHblzMAADu0u9oxq8mBGMZJd1SkpxKKB_gqObJ4wxe_TlE_LHk5EEnsLMXSrnfLpxEyezvTh3tadCdIFlkTAM7S9JrNTE7vYSBked66kdJRbEuvYL6Tw6unbbMTDXPa1cxcfknsBxYD1023ycz9u6H26DOJ7ZS_N_6orJ44dYOPY7KmCT2Xk5CTVZUEXIwHoIdb8WEHAuGMGFtwSCD8in3zlGVp2FlB5W_bAhdmutOJxgedgYJgfmYfu4fPW-Ypo_Wrtpb2uNFBlmSVJQ7ywYuoP1cDRu3atTtt4x4i2UCeQcal6nYPPVB_BGj982lbmkTk6x0TrjARUkN_S1M5gkoTx3GvGpZPDhHY5zZcmR3_zCLcSJESll-5WrIVzkS3u0H_Z_z0rr3cgKemFwKBblTc4_hcN-vA-htD2DuUXeMPx58SWQqjQcjlji1Noeq61kCneYJfTSqk37Irz4A8JW3J2w0r7VibbzFt-e-6d7CMiFNQ6q1tlv7VNjnWhvF6Csu9LOzhgQtBKEsirW3-I7xKfea_Ahv_b3cH8Rc6HVVLvNqIkYDzsDBUC4ho8kq5bVfHtRpF5RrNJdYA2NYH3bZxMITj_GeKfLHV-bWSotLol_wteZdduF5cu9rak0Vq-gndnEGI-khKn9yzm7QN1pUhFQpNwdkrYsjIncWmRQRVBmXkGhrtVBYY95P-CfNAQiFHTFnnIApFfO1rsanu6lLLfqJ4AplRsqOJ6-CljAIwEdxQzHqLInylQDEMTKbgPLOWtBykeOZwg2nMxObNJcAzRXqvJ4SezfhTuzZbXvFQbMxTHgTH4QeWICkgAaLOwlBGSLRnDNzcsLwt9vJIpQQTUSuInsGNH69Se1_jC2xb578ja-OVfxZWZviec794IZ5lmmKu19m8Sph3XZKOp4_6rr8HCn1qjjlfKq6WHFdeH8fuyR847y00wy3Uh1iksEJoufyKbIa2QAN0UN7iYO6KxLir1zAy7hHBcQziQqRHw0ef9SopJ-twjO9gwcmVoj34o9KZMbK7smeeIqDzuf3UTxa6nVuoEolSnp5G6FFNZ7RxEJttucfO_6QXH19Bz4JPxLMMVHVsAMsyKzGwBzYhjLxMYamDj_KLVIfOgARpzddATc02Jx1Gyssx-GKqvh2VxYhlF8YVHqMSPJO3wivjfDKJu2LObplQ7fc2BM4NO-OIjcH2Axv26dHQh8YVXK9DopPkY3d5nXUm2JzPtrl5R3BvYqcJKhZn1RLEZi_gb5fEFuW8BJZoGT5ZGtBx9OHd6mSkDU13HDZya6o2xQO4NYfcW2LKkv0a2JG7run-QFB4dIqMYEOPYiBvVQPr8RmBAgtFf6ALGPv-Oq74YFWwphl6yrs7KuCC9HYPU-A1pKbYiRQ4UDMRxSuX2o5e84aiWOR8IgNQrFhgLXAp8S1gTa4CVeP0NlOPa6AAKIc_j2c_UZqdfrwwfBIKh_ixrzwOoMSO7231wbCDZDX73GRby5FThb71qoMk0-ueD-tisHaof6pp104tePT8Vuvqy8hlwWCJHnWpmGasppnHE-JYpdR2Xa6SbIB9Gkdq9ZIpCJ2lIgZOAQx-rGSlECpoiG3yEyDZo1Bb-UEPgUzkSXTQD0hq4SSZRMwqWzUwvDoT-c2IA1PCx8KWhM5S8o2ttgXOSv7m0D91tfKhvmEdWnXAHdWNhaQ6BkRFTUX6bUIiRsCshrIX8vN475XSUjT75nRoKCZmsvd_0T2chI7HfDeHT2i-QIY8_fB5_gid8mO_UXMViq0BKJT7yPRE8ehAG1SzUkrQtix3-GcgBN0okdICnaw_kdAeVgHm3H0vXmK2IMC74oZIy_gTrEAI0QEH5Z8WRSfs1sLyRxmGOHELu9hUMOy263LrEF49LNTVWidXVUMBuKSwlisjkoJd0qpMfiI7Gfb646Gs1GC9e7TcIFp7gjUZABzuMlj6yYr1kTtSIAf2xn00yqGNreZ37PhdXlUB_mZ9CQoVnqBn3nnK_RpYjx22HDNqgza0Jw6m9_uWfEd-bjwCIlYLwgPxQv_Q1sB7lTDyFgFqDIRVF5_V3-XNgOgUEyGsjTTogeEOkTPQ2h4AgeW5dCyuNjIcReQmNNyW-BkjPQhNBAptSyo7THuYZP5skygZyPh0dTz3Nyg9DcWhyT96QZTsOV6FDcaVH9YeBAmiiPblYyb1hzQ3kI0fZ0aOfkry_vBhyElwxB6WlSzAQfX8KVABN6YA-WIIiseAqSI13l-DRB2x3Ksp7q0kpSVpnSAG0uFXRbv4A0Zb-JoSbste9JEMUbdtYoG5Q3xt9B3lfkSnVxn1eeoOf0kjsEOWPIKz_K-ibZ_IkSoh4l65Hq2yzucnbsADH6WuqSpfhlRZ8Vn5budZYUme7r9UHJ1l5UuIDyFeS16m0V4ec4bG12kPuDJKI0f229GCjJOv0Zerqe04OUsZ6VK2QMmkJi8elPZm0Odxw4mQQE2vOLX3G0f2HG_eXQBEmrtQc3TGrPSKoFpfLZkp3c9cxIgV1TwyVKCMdNrhJlyUNSaXimIGia20kg-LBcMFsBuXWZ9V1xUtg4TM5QwGGZn7ApfZ4Mtf2ZnAMzzxXtFE1sA3kPVcS7dp1C3JW6cbTicLynDtLS5Evu0wJsr8sOxKO_o_N8EEZmw3wqpck0KHPMn0-q0btlKKbuNuqGpZqSUvsbobkiDHcL4O9Cf4g3neLCLz9jKq31UIaWI034yeUnWWueQBplS3M8pYFigiiew9xL-tQpOsj8LBXO6nscGICVPOPt7DCuspJDrbbEGDI9WOsHyL7IDvA2FfMbDgndQWAnd2CmZ8Dnerl--PACP7WE753LwModC1kOofLjCEmeKaZlfenEpDm-MlWgAXhanyIa0SIT8pjDmggtqxuMyspeRxUyxhsVuyenFz36jbFEN01qcKOZDOHRuZOorNl7ACBEFrZjJBKawGF48R7FNyMsZwQHifjZvZAC2V5ZqkrNEpukuKZovR5zJRF0YWNEZM1nsH9CeneHQdWznAJR1kk2ZAcHIkkAlfZ4CGjGQXNKvIeF6dUkyCDXLgYB7OhwKWSim6UaKE6DC0JTSUaiNjS6ikEBNmwLywkZ4r81nM7nFFmP6k5IgwqVQGOSZvDcdKq9zyK-8npE5IGMkvUM8oih6EAQmu9q6a71gNKvxn1CQU2Qs2Habp_BoI_gVjWHpR0DZgIJdFJGIzdQ1sYHNpWn_pNie7x4vsw3ZJsOE39i0vDKV5DMPp4pnht_EJwHFq6kqK5fM4ntizz6WMNgbozccDdMTqjM0PtZxPPU8Zm37RRlqpctwXhYMlbcw3e6XvyN2NqXu1GvXKNFbG09vRXNomS5nu8hzyzywxIMofguCStM5HPAkcH27iBJt-TRtb-9D7RnNsUicuK34EDrlqQ4qWJKkFFXrewINzcj01v9KdiYEs9785dDzyZdsQ7vyjtvd39nx12Me9pR-iUMZ4tu1ZDFN0VA1qsIH8PLjkHS2TyCOS8Jy703F1igf-6RvG9qq7_6XJQBlF_FhAVyn3SKOOy5AKr2YUTtE_r3u7qb1fVlh51DMfcoVQ4yBHLdcYUhvF4Re4pY3JiVQFDKy0F4GDJEowLyubEIrugnyU4WAZASyfGh4rElea1B2WwPBaW4D3a8xaf4yfHue-GwDCEcSXXeWA2y02XCr0UnHlUyuXK6QcAcukGUz4HbJ8fyQU7eJWG_DjXjyxuryiHikgCU29SHAmdm8AlwGavkB5XHxZUEpFL2R-4IyI1UlQ4edTU6D9j_1QgHiwPMpGOU2NSTLTECW3Ob-IPiyQInRHEAPFo96oLA0evLpgUi-7k-wI15KQPUSkYpBGHpt7HuLKxtVGuSfddTWDCFstAFOekelvnc0RM0yfHr4cmpcDiafYJAOb0iRL8dH7_gTmsUpP6cg1cj6pEiVx97eRN3V-044HHt_iQHXo72ug-tafpJidDIriYtz9ueGvIM9RLMscUZ1RoWBvuBtt0njBl9euFk8D6mrDq61NqCE7Q2Rt2Mp2VIjjqGVnpCGKRomHzz_uwX4aUaMIKsKflN925R2esI2MSvfC9N-yXhR1vd_d1FpoA-mVLyVJJyd3EMjJcU59hS-viww8HvnDkNlenfX4_6jhBFpc1aHEoncDdYojEW9s6JsYnNRzUTHnPNcJ9qvzKDZeeGpunkxMUGiTP5PuN8kdOzfM-QU_aSNVpS9J4kB0Fq5uY2H20YpXgtmk5_PkaSHkpOPlA_TYKxYYixfNucCzP31uqSjnuM1t0jpQt9i2X1JeF24do1zBUZIT9zuHyqobTNTTThzci1yPYbLTJl0_xChiBBnpAsBFfrjZuwFaVnVKxMzxjAWG8isVjS3oKOfu1vxd-ApWPRRjeWq1qW-CL321zvkGxHeJByojb5CT77QmZ79Tx9Oi2Gapmk1ytDP840oCafnr5Fq-vLhINLmgJtOvpUxtSmKtHXLHY8iO8RRWQyXnwv22NJKHpVb0MQ-WYqpTMTRN1f7hRZ1ycjgCtXOhp3n3iXr5w8b4lvIYP46vgSpyDf6bkZKfN_hSMbvTzDX3G4_iCJNXF-u2M-fiIVB-4IxJN5-9ynvGFaocFbAsPOhIM7ZUG4937mhUixsofJOnVPt9R4P-GMZ7nDfJc8gHspdPQCJUlMjTz6hOIO6PSOZ923rfq72sylTgL62JFWpz8E4nvz-Oqv3db7ug0WZprzcQYsqOJ6cunvgZpc6kWubkv1bl_zvUV1RvqQJg4JroKGGKXqnm0l6xrqp8RRecH3YPbOCzWAf-jKTm6obwUccjNyde6ELSGCtieCtOCVvF7QYJJIS26Do4ewou8U-kj7tf2wVREq1YVs7L6fpXCCp7TB8HZ96kfCtPX8a84c19MCxlteBi-nr7VE7JIVnrj-CHDwBSznDECwecIjqoI8q91UdiS8fXpphtviIEqxEZReQKE031DMy8E4xDnZl8pU0oQu0s1PhNF6LpDjI83ymY6AF7ewUnTszYcdBP6lOklk4uSGLyXnVI7W7YODhP9jryg8xKniapSFusATCmbnGlFaiybk5tXZXUVB1HxaGW7k0ro4j04-cXSoDsjScHmvm9RP8rMrwl92FcUHM0XVs5CA5S_eK5B2CwIBF7oAFhIUKzOHeHuCweZaECYA27PrZ6Ij8w3QtHkCnEKtaVmcTnlFX_tNLHaP713EVfKE8hKb1lF9hu-gTDUfh3NbN9-N8_K60LCOIdNo4j_ruqElXZkN9xPLXRg2QzeQheht6LovPxcAvNcJECRzM2pwmif82cKNiV18tgCYtqcg9JkbR4Bj2Fsmkfpzm8CT-gbyHT6_uVPpwNQCChNgXZpR6jlRDGbBz1aKezfE4zNP4FOXmyLhzhPewsdp-Rn9gD40J4Eju8POwbn-MpfJAy45k9tcyetg2bv-lIeVmp5RmDnf8QXYhdp69QtWgrkWECt4Qme0XyV0f697Utj0VZSY5yrYR8uvpLybJNUqPDDHBiF_LjNzQ3go9-6WI-s2odv2VRJdM6WETyMF5oPAYOvvtye6ytoifobjiEjk4pySTUTAcSJenDp38REnyQ7HvYNDvHifX_Mk5wBGcHAeM1p9xryhFnK4-h86-ifvFt6ZX11nLeetJ2JveQiJiU-tIpr0kppZBe_hVza50mqDUXjyHsrBNB73lThB9Qn1amGWwdTFJ46PoNv2tZB3sZ7_l5y8rPEq-Jd_0F7XIZlVdRVACQ__aSkzvoOHl0vzDqi_822UWDKyl4_4vRw0Euzy-0C0Of-whMuQldan2ZooqCh2I-Bl_2zhqShJ6ZYwJjx-Y-6Nvxk4qpUYEJ0bI5OMty6LH97WLL8Fxr_6WYW95f7MHu6aK_QUTXMqxD1E3hij396fUd8H5NDWRqI00zuA5fP2DkKg5fSDUOBpAf4Mjfa38p2H6EqEnWBCdFUpIu7vlVTxWvHmBxLEDwM1DU1BdW3nbZaA8e0qNFZ_aNHcNM9jsOCwPGBwkoucLBZ_aCvCbNCrhZbrOcB-ibRbrBFPHSthRALAcBq51gOnukHKdCLiFkWfH3bF4VyZuvqnRoLxndML8nV_PiAqyRk45L2Op3K6SpYbRvIkkE0rz21VpcpDzRYUpqXqDK865IqV4Q04sKEA4d1MFv9WhWvJWfAgOmUqR-oDLBGJVcW-5XEANbBlLtqxWXIHldq1NMmk0VxU8n1qNraMFTUnw67uUCqyjrfieuD1TPeYWSekqe4IUG1FpvuuqDB4cl6HCgZ5NXa6A0SlxbU4ynOgb73Ye1JFeTMaa1wNAyiObBJyCpWTgLt5BWECEfyqKeuXEBawSqQAKBFD9pl0Xogs92MumYHXUs6wta-Nw9AHVtGfhUFTjMfjsFrymZHLJpJoVNr8gjaQQ4wHPwDD4_fCwOuLpCXgXAJRwIzt2Hv42wOjtMVg6rVNNYrpBBQas70FImKcKc729nJsE5veM4J4UfEgDwOkRE2gczKnR4e67gXj0TKumdnbixSe-ixSSkGjQHHyZvbG-HL8re-ZdIcMxKxiCOleNJ24wIsCGmLRH01G-RuA--44pLcSwTwC98nJJb3NGtj-HV5L9__g_9AHQvqRhQhsto9k3C5Jbb1raNrwuw8T7ZEdtQ9eYX2GA_FwzkQU6E7tUQuww6IAkAebGrUGVYWXPdIxqpXwWhMz3j3RG5GZ5lAF-9CIwUpRsZJxbStBROUGY4KDHFZ7REEH0j7q-BiJ11PCU6L1gfZusI179bz-dErMLCvwntkkoHBx-2jEqFvvam0JEEFtPlx4RjHKevOC8rbSrMsVvfcJ--3_TkqdRQwQNU4SI50qxhUTviJ4wMaPs-7ArhzF8hDPE_SnaklMCY2BkRRPIpUn8CJLgH9T9Wyyu9V1Vem4O4rXeU8LSkgrBry7eFa2WLZSjEnhfiI95AC-3HTKL1bPsGyghzJCM7YCV4cLaYFY_Lm2cFpHGwa9PCrYFg_T9x69T9u_BeAQF8s0fARgCSWWeptk0tndytnl-W3AUkx_l8BS8uCTfK4PbyvBna6rJCznKvEJP3iJhTtv3uG-uu-THZL2_d4oCIOsOM_m1ZOCrShYEp-hlNauiDKiUHZc3Q0ym9GJNjCFFiNiLXMaMpBXJWhJULFlF4GfjV__3R2M7vvkHVw60vTKeHM1VKb9Kf4NwICaiFkfS5DdL2cY4lb4fHzgR0saVgMlvQfBra2nzMNDFOg4LG_L5NbF7qt7r5Hx-YCHzeAkVoNwinWP6-MRE1KLZCsc2Rm-nGPPJFeXkCUc4hFBgsI2-PBULAd8U2k2kQkDbNc_w1XWdlYTqJWWyRR6OO_u3vBi-3zQEEgIACcl2L6gWHQnpmwo9xQUGDIiPdYUSmOR6m3wS3tbDIJ3lmNDnh_P1popsab5dDTCU10h4s0p9VYS9WaWN5zfOXLHmfutmX3CiAFnY_LgWdApDwJFNiojGJPD2UFbtRU-H8Gyti8eMtxuJ5xytZxcsZWhZpuQULd04y4gMRsiZDgoWwleny3aTtDvSB9Sk5xE581SjbGcA7Y1890o1lCHLzu6YCOYP0eXh58QW1K52GLVeRrM8HIp0oaLLEVfG-z02F5g_0eK4Ux-Bb9E_EiSnm4W56rg5WxOF6WeaRl5YsMZ8b0tDoqtdyVBQ7n4NzwxE8E7GIYIcbT7He181_l0lX3irLgC_FVRHinBjKmcJAlvkJFtrVb5rz6_hHPE6Cid10fvFhhsPubbLxq4Pzt-3UZeel4J1NR8wpWEOz8kKTr6BupJsv1oGyp-mvHTJW7gPMi57w7Z-vkcmtOKwtvhJQdJhGOB6MD1C4QcsDU6wUTRHth5iAS8UtneLci6pauGx73cw-5ig3DYPaNswS_L4Ek5ltd2fAwYiRa5-8EDlxk60lXpGfXaNZJ0y4nuDSl6AW2c9crYWV2jRkZ_wEXmuSLvcBNQtpxMyomcPkumjWdheoZQGa3fEPXUpWfuC9jfVkJYOs1CV7j_lg9lSCvnCaUrgqhXiD1jpAlljnYsxQ7eWxuRaW8cNzRrVYCEnGg00DS8g54zIIERtlFf9bd1HqD8HhLIuU6t63q_Ff-0lsLVOdpvRUKXkFvg0LMxAvFMTbeaNpC1DvDSsndVA-xFCzmr4UXJHSLkWjVtOLx8Ax6bL195Ak-oEYlnTABTNsipD4txOUUG6CeQnpyB_AT1q0UCcqCthKkEVl-dPfUYMLW_qk1CEUncuXoKKF7uzxbIl8eOeNAbDNgUrF2D2-okUJTWYiRicPtbtB1i8rP9Vlp9M1cS-xCFl01CEmCSp0azxSanxG6-JvZs7sUQ9IsBkZjpQzOhpAiI3jajXsH-zq3i_plNIh6W7Q_dOX7meSCTuho3nJDiyhvi8uagf9EgNGaGCQK6I1Q1wAF98ovDhyX3UNXPRphEoIFuz1tKkdV5ap9426J-lvKQBnlKTXurIsGDTK73l2-tIi7T0OMyztCPGTDPvcQ8np81Mlntlu4RVQu2wyhn2Fw7oryCGBA5DAa7n4vOkhkTAI5_BnrS95rF-X2AYXUHuUBlGi6cI0MuPCZXf-nH0V1-Vt_0b7GQ-AYKfPwwFCcLRuWSnnfvtDONQGpieZuQtcUPW_C5-ciID3IGjwiZFBbpSg4BO7q2-UZ7NmMDU9D1vVgrhS4pGwXpgiWpKW5gdESM9BnE_TuIs7vMBNICrLyuZv95Fagmj2uQr_lsmoO_ut42A-M2n8u73cSflfA7IF77OZ5RnFwEA1T05zgbXBrjs1DagGZYP7mvq8nZB0qhxzeMAXE8WfcwP7F-8cbHHsVwzELkvHPQGi7OufJgUlV_q1bMX_nA9dLjiZiv_V7eCEqnT8Rc3dNGIMuvEcOlu4Rb2W_cgCh4eYhiyAJYapenHIumR1Ac0aR4bBUK8kfN8JdQXDqdS7S3QOLTbCmeun0ogS3mZw8QCh_DYxNhEH9WGHLjTSwCOeo7OnL2B4IjAY5NAYwlBG9cVnzJYtCSvmdR7QEq4qtPfPt7KFlEJwWVi9EAhjgY9Ip76MdPxel8bAsckEx7mjUYARuEkZjIB9yV9zOxqqnrClv73nGHJT8jLNbzhHHe0jrUpPpnWwVIfsJKneQWgN56q6W8RVbHM6sVJf7yXOo23YRr1jL8EG7JvVejjo8bqCWHp8HBK06aoShvJP6_yZX4smQVyffNMLpnGk95Wd638yPQVVtA7K9JPW1uhrLWs0hqYs4EACKjbF4l9wtiCY8bNYviQHqVgdsnzOv3h-BO0ASHv3up4MjrjjjdpoCDdMMvx5QUSrgEFaaFb3j5Z20GHHuDVvFkBNz1OXgO9QFOYDxFoXC-hLj_ciX0Iezp9EO8vstJWLcXK2lTtxfrIe0fsQlniRy5yI6aZRgM-na3dVvmvPkVGxDYycmFnkCSoF5NQVaWIbnr6SY1Pt8bi8Bz3r5p16tJ8rYlLfnCTzHcVAi-flYdvfqShYbnxxG-jnjtIiFfvpr0bKbymAaB514V30sH_2tN5wlqZdxWguGMd-qGgLHY8WleNerEp3Pupv_e_O9gNlDYDLZE83LqCRGQW-NNBrnleIN5zw6TZW9YSI0OBst8sKlIWP-SWIm6XBK-5Rnxypsr8yUgldRVwMLbnWgCQUiYam-zJ6tia1l8PxfxeG_ZkIh4nirxP-3P-8Orha_s5YMQObqBwvg8bqbumkQdXDOayE19vxc1gBIWyWQBWTqTDovu7iaAvv6kOkwGrc1ZHDUDn7Ha3cL-md0Pg7vvi0wTH527jp7s_VhJMi65SthH3QHdMm_D-297i6Tf48NQR7bVAWqc68muwd2SGxbOAWuV_cF0Q6H6CupO0bZxu0KO5ulVZpDnDi33y9QsVaB3XZ19p2_r1WBQMH4eCiPM9mVkagid56vx6xw_Y7RUxRFXK9a2jni7_KlqZmDBK7TqRpl4Akp3tJpd3bcXK-x5qD3F4E1s48_IwFro5UnTGnTLrSy5HL2g2Wb9YLH666gf6a9ZjXnA-Fxh6zGmiLtm54I0YEnRlFqhb2tVUUU1wRR4sq33noAomcRfvjgUpwzUSrrmIUVlviHZxRlZYHt2V4_SnemaS7Jde3YdmQ3WM28T3HTPC4hN0e_c7vlhqfvd0kYY16ZA5nsuX9EUDzgAvvsNEU6ndO-eoQ63kKUSxqfT9BiPy1U5fZDdZm8nkuCICdeL880u-kFxKdl9xQ-Rl_bDJNrnB6WA62HEwgTt-DvvLVSH6LCgsiieHpy7-1k_lYyS_Rb7TOrE3cvCdnenZnBrsDvL2-HK60WKCvd0LgvUu-QSL-IgyilTgCGNvOQvT8DR-DuooAeRW4wKv7j1RW7z4AJeIGppmCW0QUVoPjnRblsieBQmrpipkOql7_1L_Oo7qrhKWJIkn1f3iFnrHlUATByubcDNeuFCmoHQoVpa2OUmfiCfwBWHgHaGHxM0n_XlQKUG9FdEN11FdUiBdwIPoEW4_bxVyQbAR0ZCadRbYK6sfB8hYez3q6SsQd8czsHbXIFkA0AEj4ZWOJD2mVy2Q9Q2CH2TvIDEWTZsDj708h4HRL_6DtSn_dM8eVuXoxc53w6-hPXkG4Xaftg1mQ37SLaiAUfVXEleOJ98az4LZ6qkNkUm8XCT7rhzWFK8kC2CiztmCCVTWq4gpfQE-JWvvvO241pS1MCXHAn4Z0AXdIOxpQ6akuH2DiQoX75Y1QsZNF4zfRmPQIu_se0vfpkOEYoFHDwo75C5D44TB420ZyPAPEznh7gpYpABPOMFeF9HSeMT2cVg2uRNnaRP7yVwrqkoLD5sNe_ULpex4mpJwhX-ujBGVXL7vX2AZw7kY4GPXXDhQFYotAMc4aEWLqixDTw9XR1U_4qBe8MrVswccQ8KImJbw7OSbH_wApesS2JpIemAAce6JoBJsQ8pG3u5bZ84iEQDXaURXgUazNDPfnBmrj_B3JVA-lvZDwsMDNIXh78vZD_7jVOjqadMgPBzFeezO6rKy9dMUch9y0vt4t618wRy9LMotrAvfZUCpryZLMJUbI0SmDYoN9ZbpffszhEJL0CkLgwiI09Tzk9265cM6PsspcPTNaL8NuTu1RZeTToRlgHERNCKuTd8YETH48cWMlgOWRBFmvcER-iUpwNdJOgSOFwDMo8ZNDI8UFA7PnNYdXbB87AQGRwKy-ztgpPje10neOXjuJgyw18hpjw1wSlwJ6mNVcSFiiOAa3x1lmAy3L3M1vbPCHdaKFEoZg8nmdn7eD0DPuP9hxNkPC_rFGFOTl0ohd0eyudKG4989AMAEefT0amAzHEMQILtHDy43i2foh8j44nqZIk25KXzBxBmsmgaSg3IF3LU5wPQTT29Zwb5DM0-pPSoGClo2th5rpk_eBprngs8qnUQNCgLeUAfWxSCD1C2_IyoSjbZB4hp5oG09Uz1oWDu3dwD9Awu5DBizm3uJHwf0rinrNgDDs98V1t9TVIrLHjp8dTZCBBHT7hFTi9WSxMnnd0UmmDXXcGQNw3rw2k3A1cMyKID22zLba0EyW8sMoU8jT8AP0Jb0iPUDFj3dwR1eO-FoyMeL3jzigm1gMVpXbytHS_RaK4bxITRthL4bBLTjrBhOPkahkHK7w9qpytbWSXdCIyHkgXxm-qGoE8T7-05tIE_nL8npCD0qEI4UwvSUfFBDJ6Utgd3LNEoHsWPbTkKMONz83zJHzuSmJljRLtXIrS439sF-zFuHUURs4HoRIqI7qD8sLqvuTRegQ84p-XvnjJTMcRWeVrZUY1afW2Ky98mE81k2uWbb_PBZvzup3bpdbPCjZf3XoUhYkVEZdaXQEF_qj8n_JPhHHgxy_BC2-ZW5r-BDOlKzYEGFULJ4whceqPApuJAzQFoMk4HCGvsBrv3QhzjJrDuFrDsYGfpaaQchaCb0zkbBwKvGIETrrH6hlVb2-3vhVQoh5jZ5hR-PQ0F0pf9vA5I_8dOQr2Gw-UqicycUanyIodtnvC5HVKm6-_9M9UWRmDyoiKb6GlTA1-YKyQbOWuZuw770flFyn6GGDlOUSkoZGtp7pmkjdsULDpNwFtcGAFrcgqNYcw-26Y8kFY5q-5QBm3qcE7H4wAsV6z3CQJvpghDLWO9-tMsJVusQ4BTaHv6GhvfN7Orupg9_TCcU34b_si3wc7KBqN-PLo0zvSTD2qqcNZAUGL3JmIpCkcbWPEz3mCt9plEWo6YOp-jDhyS6EOElobMN8rT47ah183x-UM9cLXrECwCZ3_gUF1OJzp4juLWJPU1pwDgLN97xxonGhNDmlOA2kUHZggWLmemHeHd5GsrVJDuGui-2QnE2FZ2wjiu3GZTpLj4zh1euQh5KMz9sF_24SEQWnz6YpBFBQQV7W22MgILjrndy9sdB4TPfFIBOfQtyR8XBz7z5aprVlzKu9mFx5hDjHfIhFh9sJuqeHH0FFXgRu5ZUWD4JtpxqKqL4Sc-IgUdbnMmt4dU7Z3XcSq05uwrSszTN1WeaIk3DM2Sk7LKyNHThK2mR0BR4qQ7mBjK9pSRousaHozXcTynW_mj_hmZH14hRLmcaEf2S-x7oC4fasmRw_QRsDidxp8K-poXH7m7OX3IwYh6h5gwFAbQKmtmCXRhFGgMofr63owIdjwSsLxMmft2atci1kt7-P9oViWJflCpnfasPlLvn3FBnVrsGsJMOR2IXdozfIT6lq-HEaflG0royDVz6a34z70ksLvNR6-quriLrkE5jJxOqde3Mvegb2Wsq7LptH8ozs4GGzXIfCzd3_EBIXmNc5aN50DqohZHRuYdrh0nI57FVDSr2jpxNXLPVoJprThORdnKU0MhCY6DjOSm2B6UGziNSoyDby73w1fDiAglgMgGRh52FISZOmNKGIdguX1WGoxO9v3c5oN3J9uWunpfBenaV52AVWluUS3oKh5fbx1qaHemhRzi_Ax4izfJ7ZSwmh1hCsUfBzyzuUI1dca6PkTcnvqi-lxvr0P-cgyAIXASmqeOoMLeZjPqPfeSfJivltLq4e5JMmSTHJNwsPC_mGQYEIYC2ZjmXXh-1I98M-Yv7CDPYf2JEkftI9B5vw8HW2QRcJwjvr1ZsvoT9HSP11Nh-M5EJogA5gmUL78NdLrizXkf4Zu0vz_TCS10qEhSSRrxREsd9awc1wL55kmStlYqrv_oaDxu93d2zUg8iCy-9_I5AoB9pAD7VNdxkvcBEZHR_0QR4YFRpr5Pwn7iK8UtKmk1qDxz7tKVnST7ytaEvGKYh6d8opFXE1xVpbWTxwp0JnbCUsxRCYIwaW6leynh3KDGAqaxTx5qW6xmrT34OHJyz-8EeO2IYePEPIPUQlugUZr02YWG1e7wXidhwyHrtnEzeGUBQGiYT6Y_e-9-W0tOAoWl668tvH63h4qsInSPKJ3sD3lhREAXxs8_jdayspznq1VCxKVOiEqb_RbJ_eXTgsgC-L6XQbFVViKPaklc_v4QTzk3A-Ttmqur_pSf2gNPxJvL86gZKZ6t8TYhzA38i6s-EA_S2t4agcwpy_PavtkbHSaIk0UkoJXNi6tKbVmrsGcfLU_1Z8sko1lbNFEieIl9HeEZeV7J3Z_2KbVendgBwHpY3I7g8ZOfefpDeCakGmhMfBIlBPZ0Q7Bky73rDkaRJvkSaqkDqw8ugVISq5pTPdU76TV0uHfwqVZtaCJd5ZijtPb28FZEi5e_mmdUSiPucHW9SA4Y_dE-0BgFWMQN0-xYn6pgTBZAzX9yLDlAdtJtgDVVCEY_6_H4Kjs2DCxlJwigN2_TmEBfd-3o7k-6UtWeWRKVp9mEOPJcP8e9rdXMH5yMWVrOhFETpO_iG7qKujTBHTyWjPdOygdiuZyskSHIVN0rz6mvLqVpar_jRXAhzFgioZCfHLT37DlSl_b7JCWNuRdUZKH402yfcgN5SdsrnQcenBm9c9-SD1ygcMwyBO91SSPApErCIGvP9DvaIWN6_OClELLn_b8DKok_w2QrzV9v6kfGhPQZifJCYWj38GDAFDdxFFd_EKQy7xDbwP3xjGvDkoqdVIQ6fnoeURkhOVDjD9GmegT_kvJxedwypxJNLLMM1SlG0rz6TpDV9DPDiNO5kIUOGHxGe527i7v8TjlcUtZHlijjEHxy9ljg3_Ecoe7W2JcUMhI-6_M9cBgKjOa0_k11uMKwGQ_RJHp-quGwYEEjN8_f3Ymc5-p21beaS_hAbta3DeHD9Tvgx_Qmuq8zgj5Xi90IPHfmMOZybZ83w118LaW7C8Q-TzFOASUQ8rRWv_U-T97CaAjLNER6XFfJM3X8o75XAxjgvu1mJQQIYyWp6yppo18evGdwd7llm6iTZrz-NCtBFpaD4KE9AFc0OC5-m-af3G7u4XEj61IlCvqZAThoChFfrwOvaVkEsCy791Y9n6MQXAV8yF0GIHqnSYFBekyFbLq55RvUwBHh-Z9dE7Fd4X-I7gl4084zkLkjg68If3f3p6KYU4Ti8X-QyN-9sEnqyoZpRRCqenBX1rB-Bnrj8Vc3aaT6mYCYnhrXDAapAWjbE9UEj-CbRXeTbuJ0zmog8tq9Q5s5VzLZ30iPBijBEVtn7vYT1bEtDokY-ZCrYuZ4ul0e2bcw0XyZkaqDSH2bAsBykwpVN2GITI-nwImpiqhwS2RcBVsY700PNgxn0v7yswYyk8dK4Dl5xXxuEKrp5i-hThA3z9wMebdynQPjQtyrPE9PXT24hpYHs1ie9c-HOPM3UoiBUbJ2FAjAp57lW8mn_SfSrdl3-TJTRHP9ATvIqgLg-Vq2AwaKJQqh5W15Dd3o9rIGladYjDTZmb4B3BdPA4hVCUVRK9DfE8qIliCt2FKXb_4sAroqv31vOyfnGlx-n0e5M6vHfcBN0DUmXbRDuSrqTf2sS_vQDR0GHL-N5H6v9A6RiU0rSKKXBQDsWS37tFF-UTIQKoPWgykt6boZTPPsENUeeo11ol3Lb97ioNBVlqZPIthTW3ppDL2uq2S5-OtBvfDp2h6ewxR1Y-8ZNFBtdO9AqbT4I4Vyn_QM21NjQjAwfQBAps80leCssgQDkMUrNV7EdU9n4mT1AoSotmgQynxDJCAka5IbgRHV_X_Jk5-xznT_ELCqezB_YnlQT-51eM9AK-9cVbovo0A6YGQxFUwZR1xJWb6gLL3nLsAaNPxjzbeSq1yqan4Sxn4F4jdzeQdsZ2zQ6fOBICNESlw71fnX6mWfv6dx3qWX8x0TQ2BPeonKqBwhKIp6Sw0YnGBV74MA5viYANx91XzSMSk4FZuQ4vl1wMNnfX5d-qEu43O2NvUJa9yvU65p3gE_Wx4xvzd_nFpVegkR47LzZFg113lfIth4rUCcyGwkaNComvTzrnCJBsKxNVtGiwozDS3xrWahBbfhemP41eOrYyj5xnnbwQzQ9NbpLaWiR48QtSWZBeUHZm42yrJuuP_ovxuCmE4MSWh4ehhx20werkebZiB5lvwMGDNrtCoN9XyAHB2tRFPW43Rpr5PXFq6RLbONkdGh6Gp5q2LwDctN_BHly9VqVrxZTCX3HjbeDCh-Gn2QsahZY9ScPH0A8eD8aX5bTzQQMpurJ0Qo4dY6BJaQTwGJ6z1jXF0rGxUmO0Fm160AkAXTlGvKTdx_ln3Th8Dwh-9ty2OKKccjLv4Mv28CxGf3IPVSFm2gED_3Anxnu71ejHgDWDqUuL39sKZ3MHp15gpm5m3Tap6dQBa_A2bKLz_x0fhLvpMmngQ_Yp_5C5PAXZUbgjKVe9NcxdE3ut_sZ0fcwGyddaZF6zkuK3onCEUZC7I4v5CR7mF4NYYQxdnrQcgB2QHd7LGskm0vD982jcEsuegYh84BU8ZyDuDT9dlIEpMnTEi2FnuoTjVzvkzylTvOU7CpP-v5IYDdPsKhnojuR228VCJFrc4TIveAntMiUBQdM08Gm8LNlhQbHtwMZ89g1vk6N3Ef-gkEpdL82nz2ryjTXj-pjFwRo-XZVfDTT58i0D3hLtJKEPawN0NJnRE9mr_PxkQ-b2cA653dCLjaqjJyl_km8rVnPXtpwhWU2hKWvuUuSEZPBItKUmcU5GzVC-YOAgwodBWwU9X80SxGIeALiXq52YbJTBmPOmIMgqA_Th4G7aKF2J3h7WUE8Ff18Up-U_XB9bEQvaKwK7-Mc6Ww0BNxxsxRLPIfPwx8pJw_4PeU9Pdc3cSCHwSF6PbXTv-a5aRgqGeaZy6Li63qRo_fxouepxG0zvokWeDk8wk8eRVtYkBf3re_ODtUs2TJvpVw514sgZZxgPVr1S-vlq06d4f779mwM-kb4JNsB5Cetp-2i7FIwbFvPRJpU_-dUVnCFl1qzpbDjPr82GCiE7WZc42g9lmeQjy9e67OHtsGgNmY6VQIRaXTskvfSe8auQrMZsaEKkxdFYhmDozTdYTJwCIj2UMMF95n-b5VC-gmeXGeRhyfefNBB8_cIWTfzOz1kyLUIHw-fYCxeAcUWBJPcaGIIAc3MfYVOPv26MRYFOf4eMQzP7zISMbo7jNh5eVNQVR1uEv3LHdIkaui1dDPJoqSbyBzPjec_lQ4XudErgq1hSNHszrAjFeHp5aZzX2USaR2JW1WcGw0x-dNRrMZDH7LkyGP_BKr8cm9IgrLI3p5RwN-y5nLaP7Lj-Ow8lq_1u-nqiWuAsHk-cEZFbICCg585lDNNXw2IL3eVeekezAAHnVlCblPr_oCaPh08ziTDtWnGLb9NkfNJqNKpSjqRbOZusNqUjRbUOyWdHGegFjXE7oi4v7O9jlHHkJzaF3yunfwVQIrK03A_rdvuDqpBbyeYDQFWZK27gHHc84mPyspAr1r-x5ESkyYIvQrrxecHLoFHrjmNHUuV9dhMdxK_tEQ7ll-zepiYw74ZaBYUJq-7F9ADQ25L-ymYex3blbmyPBHnbHeVv2iKnK2tgznkUeCMWTkVpbQCkwNDybU5eZ5ZaTqhblJ1Ys1s2zAD_iyTLtxZ4Vk_MXrYTejZw_uTEtnvFTHcgjOyNjuALZ-EUmVgdOJhqcjPyMBId5uToVWIk_6yuE7hP2v7lQRK6o7eGJ9EOLK7aJgowk_sQfi2sdWLfClrZFNUyGY9QqqrPSR5t5ZNgyKkihpEkv0gwWh49cBKR2TAmxKTx0e0uXB5gZbOPfNFFalE_uZFFjYlkHCYI3xQJpYnORXvx0r23lACuSvh67WY6LM6ezAIbwJ9ZeUqEztVZDmzFCJ4dn9WRzCbs49s3PrBJLW7wAzvvk7p37WdJU8PLnnKf-ynVlFUpGJIZugZI6K6bE4H8Sk4T48VgPuaP03HcQq2mvXQIByD4Gf1y59v99WFSS4rVJrfzn-snzX3VnxyJCqYF8Gyg1hItVFkCf7RgmWzJ3P3ebYYwJJQMh-Gy78VDeaMli5ASwD_-z8hBqRBnuWYBqfPvaha512ahMtsw-R5mfcAZok8-fqMs8Gzb4dJ7kPa-_YaHKQ-t57VHxR5s0LrnEeCaSIFChrughaoQqFBciwkKCTEPglleG24VzT1-EAtrUJTUspL9uPILomlgCfC9xYUZBP-d3i8stQtD28yyCRU1mWmt2Wpj7keASbCNV8A8m-MwIAR6w_ulPhlCa8Pm4u0of84nsA5LhBO7YVwbhW8TEB4qziel0FrGj4bYLC90KA0XLmdxQn5jMgBs85jjCYmUeg1FY6RHlKrgZdWPbkjIhQBlbMTLLtSrpBoMySA3tCdYhcXYZyptlPjrcm3fGNNthSzVImDvkKXenxuqr9Fb3fO78Wc78CsRrB2fYXTxJisdvyw1yp0zIUeSzGX5qgGOsdpIlVr7yO7zJrl9DZSFRgju5OwBETGxrdzWHE2qky8agpE8RT01WGmeemyoSrKvT1vuS88RNwW1lkNUNh62EVHpnXnPPNxp1x74mrxE_bFRUkRMPZUplvcj_8LCCzvdW67A7E-9Icu7pNcu_1sHvSrGbJe4V_i8ZXZT98PznWold0YD99CAng7xdZXhbkQMb2F7Gimup7_hx2_fNq4IJX9kbHcJhRogl1DIu_-7jWd7q6nf_KVZGM6btBmbJY705D9dW27CKuiu54wJtyo3wvriERDy-we4yPQ0zeoIM8IXj3mjJT4moaSvWKrqSyfhEawnTw244r63FNQOAUkQcQY0RJa19O3ms22FNVi_UOK3et5duugt330-iVxmKjp1eLEoUghcsDF7ey79VJfIszCwRXjr-CArL8bDdD7dHss46EGEeLBLp7_NipeZ9bXY41Sb4wDoCae1oLxL6IglnBVt3eSqhrkTX45hwbARp6ReDBiVYVoiCk3ewmuE3syuj4peREh9o1ImMYgUBN8ojSNbhDIs7w80eED0rwY0fMFYAWfkjEzncoUqglQZLBylX4muMgASnD5yjhCtv2FWyLXt-rS4T8aL9TmVKgLCrq2QiqcBWfQEaQHHOv8Wteuibc39ytog3B77hnI-zxXD31CQoKHHwSgevx5bmdtLu8AuQsrYMPF7h_RtNqK46TkVNrwFRgOTAEn-CJmcol0VXgAVhfFAOKOnz43vrMwbHlQDuerzkyPLv2KOJUidvrWAXgGAl-dSoD49G3sFBNRcmLjy1C1Xb5EaVreQS5ub3kkwLEpabhom5zKJliqjlq9tSHYZ-j8aPMr-fmUuzmu93tT2MmP6JnMO-XviEeirFYNIyVXXcF44yx0xQy9x4nQGflA8fOznOL2G-duQOdmc3la9REpAJYfiwlyAw4XlQoNStNceHl3uIiWs2iYcHU9ZdoAZG7GLtpkl0abzopqglVcz6vP_H7OS8TV-wOqZwOseKfDhyk4-nV9yT44ikgffvHOm1wpNtuWB41b-XTvqjOwsvOBwMz-wIQ-Dg9TrM6_Ub3ZktW8thXrDhwKgLkI6KmvGOH_Yfmjr-tcgbGXyF2X285pP5bUgQxvB-UtJJFedqI-sxRGDF9P858AzSLOUP0ihpxglX4Po4y6Z4pLM-zcXeIWSzV_AwwJgRMw4NO4mL78aVBmqpkMHm9DSRJiKA4jon3qtnlg3VjbnSao8eaQtpGnYfB-aTvxM-9t6Cgjx40t_jONZZXbqLad6-__XZtm9h1_qEo1rN2vjKi07A0BLHIHeu0kRfWJK3zmvo5EsMzjOSgF67pM_aqITjnPN6jRjWbRNFmOkoaiq5eEdhy6k3V0Xro72kxM_04U7-8LWmlGvopkG2PUE4vypB3RM6SuuUjn5CYmgsr5_lPgJvIO0jF9LKB3DjzD3PVZx3lXq3OzLn7ht7rZ7hSZ3-LtGQAqSaMICJTKEcva9Txpuq07yxdWEp9b48eBwUnaGT2bOGl9MKjluOZiZOIRMn8jzYd6dgSchlhNCT_DnDP_aaOJFsPBbrrm1Hs_2z02-eRQDLFZcb24_ZvOAkHSIHkDVVIsJTAKARIF-ISyzkvD-Qe8G3HBhUOv9ceIL79y--gjszWAoQgN6DIuf_oJ1bI4aypeR15iFlCuNW9TBeKqedUuuZrlpLdsqgpSR4m2VnPXwfEgl_xnbeMlzg4_rmabJmOlpCl2LJ8BgLllrYw951JQApwsNW5jjM4fT6vJg3mzOPUFJKNXDcmCtj1vU-ZJ7JO-KUrj7h778u9IlLPV31O74AzeBybUJM0yTxMyWdZtKov9kS2GmkJ2clzb7K2onVgcny_D9Rp4Ltx9-Ry7wa1oHkSMSTJqiemxvy050ZB1S_RPARN7kVA8r0zsUCFfNsSOofovrv36NR4r0v0etUH5oUgie00CWVHmpe23DmYEhy4q6oKsm2BqrW3pB05uk_F2P2sqCbQ4ET5u50YLTnY5Ih5A4Id_24AhsRDJLhojzgp4SMfB-ynT0a4zSI6F_lU-TjFqrIAmquZtRL7U8Vx7OczKDp--5ATLM02Yw-QvxxZdvWSGrcA5TLNK_xuhloiUvZVwMZ-7c_FFdSJzp8dOYCN91ug9zolA1vbU9G5O69hz6T7AgGx7nCsQrkfyCjf61oddRRa7-TIscJzboGIFDFyinICbGsA5-szp_cVlwvAVu-solZ-ePcBGfsKd4Fan14iB-Xf-2FjavujKKeNuCM6HAN7b4VRnCkwTo4lnL3TW1kFL34d5U6RSsR13riJXDwjGxB1rtaTFbthTMjCgtLNPwPOOx5l_K8nw3YFY4yqM6STeblRue61sMiEyMPGs3fIBcuyYDOuEWv4q9GqSe7P4XFU-ZlOrvVefFAkfO-qxiSD-hEYIV9V1gL3QjLcZctSaAeXbDRwgMZ8QxXFxVBzFAM0LOFG7shHgiGRE6TmeaA-VX1YKCpbON0xEzojKQfi-mcEz6eQGglmcvWugi99AD5opztw7KS5THFAUyBSRx9_EkEFS2WXvILc45mvuMZRPp6K37wNe8AWqQqFZn62vxf8OEbNoX17TOTltedT63jNiuXGaAWSjTXfv_3W_Brte9cBEcrJflRLF1UbitFs2nt07OR8V6D0zdvEtpeLXJ3_BO-hrxN9oK-S-NZywwolEifU2hlWIiX5UJoyM_E_G9OBZo2zpSk1PQ8bqi_SE9Yy1Z7qNJed1Voytbh5tUqVzqu_16bBjEIXO0qD5WFlNi98ArA7S7wD3-LZaKW-STQGlz7ziDdNDzvFPOU0watzzwDxy-IA_mO9TroAdoI1NpxIDZTYM1MpBYr5T56F6rewvgD00ujg1m2SJmraVobqezq0cZ-7DTOlF5eZ5SXazIzZTnEDV6vjAg3XeavRHDjUoie2NSI3qo5NvY3cPa-aRmjUhzDA_csyTx0e70wv3YVqvHq-4DlZpl8czeStm2qcpuB-rcSPcPNc0_yMXxRQ_LNWZzakWeet0xqhUhWD8nbsA7zZF2N6maAyqmtOgVbFfokXpCil_Q16qEj4spfrdDXUHtnWAL9aOc3mKZaDd0wx6yJBSswUxmav3-vq8ynAKeDVdwfy6pB5891N0YIaCtR5w9QFg6DDD8VlpRtXSke8iQou4yhY2OmlOK0eNBncb7bWjuzBo5bgFbRYxzVAYulKJAh4AwdTK-ikUVeWDke_DmM3X70ElqBxA_QCnGR2H-XYDrN1hdgxBcBNScKkYs3F_bmLPSY9bvz-VgxMCdOrVfRvbpKa7r2M39wWBNAY02cJ-FDN8VjdYHcPXg8SAzUSdy87Ot7kRdveaBC5ZL1T5q9TGR9QzpKmoogvL16wNHfvuWYlobkmx45eIcvkM84XfEe1ewL9OH0jFysYipka1W761bXFCAeExtzkNHf8elwtnjoAAqsDACRobCc_UCmy5luEVXh8fkT_HNvhEW2nnxAFvlqfA85MWM9xL47sZznx4kiCfPxhOuDaC9kJgfP5gg7ED_L08UpRoB1zkShXwZTMlwt1hzHlJXY8tiZTOd9YVkRaFQZXpFuJ5kmI3Dkwyjlqwz53sPfd5LlmRAJDi3I-dwcEi-_tPqEFqj9QzmbMr2SKSts4iJ9TBYyIPl4_y3r9HOX8Vo-ROLSYp_WTJl1le8OAIe6Tq6FjZoAwqb3ommBEcsOMi6vhtskCrTqWs66VDqQYCUy1Xqu9HDM38QQVA2xdXV_i3a0rHpjPoz50vesT_wpnHpUTJcWPfaSsoVHs4ahdE0dVngGM8Oqv3RIdu008w2mupM2CdYhlyLT3u0C_TPs9CqzrNmAGrMrCbTwcBLw_-0bUgz6m2YC54UtQlo_aWbX6vs8Dt4_1EprU7Pln4K6vNMUi4IedIPjgc5rJrG8E3O0g5_vjdmH2ioMfFI-Wmi8Cvt_a8EB0pj9U_y5PAwWSVisoBH6DqYo-3ztl3bhZzNBDc56oQRxJhpGegst0XhRuageDAY1cO0uBbFav7ibA5N8r6heB0VMgg5g1QkRuiKrw9Z3krS1gEcvAU9fwIiX1DA-0Pmi_Gt4GGEkcW-jpTh28g15LzIKuzGf35-7daJT87M09wDmvw7hl3hd92WuDgpuSZjVxJPtcWGeSKi1QobyYxCG9eAAkkiZRan_yoP7AB-vgwPEGI_Sxc5xACeCDg3C8Y4xN4HI1K-0zdQeQUOOb2VMDJNcsKiCfnli5D3mFljBOikJIHR1VcId8KvS57lLR7tbLSbXJ4TImmce-42rBsVpw4Dvv9b78M1P4JHE8lU6EbXaxZAI9buWzR4kxqa_auVcFRb63K5Dgwfj6swGoZo6YW_g0XvR2RBtSYWvOEJLJ5jvtFYz4_tfubzTwRDgi0xVLpHIb4vadrwLw8OEskf-vMMwEkMWgm_csCSAZkNkvU_keTs2s08Khzak8cGyHwvqskRVHvk2Jli4qblJVJqkY2_MEEok9Fo2cVGuJAjoaGS1A2t6K2z7iAVkE3U_NAyqE8WYXOFPy905lUeuLBeyWU_s-LIX5NLd1Y95mYAKubqehThcsWjv7Wqk5oz6cczPN1lNpTIlK8i22Mr215wkH21Ig_fk4oHXfJtJpTREoef3XprpKI_FRTGRpgmcv5vDYxTTi6kXt6fw9dnNKwTzfsxXgiCOdSiu2mcxM09GfZMbmfCnuMJnkuCUS6Fw-UjKC5UHW69jOrmEHGHdPftEehRAS3N9nkUbpEb8if0fThMkwiiQvaa__Bz8c61F4u9454KEM70hgQzNn1PF8O1fXMxU_lQHnap9RPeQN94ElTHlvOOGdfLnhGNdE3ekRcKql-vKzmiKXJmCCHbk41skZVD-f7dKrjpOlRIkW84Ssvh6xhw_yxPkOXkEiGJA3Sf0jRNmS9QTuXpD1wUJehlkDNTl2CutfWXuA2e1tRw4xnc-xVv3wYQFhHEqhI1lkJdmFQ9cLdpG94cIkUDlXTTZ9UG-moiV9x2UjyBMtebzXybEmHyDptkvMRfZZzBGTWREwrweU_WM7TlAFT4-XV3XqXiEQ6t4qi9RLI-TGNMOXyw1x7IndwfC2SiZ6lOWgpobShEUekSIPitcO0uyp8Spjr3nwNKySnD0_u4p_fT6BRUnpTQAudzSfqYIvP3nsJ9oVJHbnJ-Ua2TDkL2QpCrXEbx7kWVg8Q7WQeuZ9DAWqkUiNEXV4PdsMXKw8bFLH5BUMhEtu6AYE17iv-kXFnZTyZTaWKBrdSSH2Ht-bEjJo2UZcTHdwTDvLi9ntaa7E67yLfLLfFVdddILiWWOigWvj3MEGW3iqvRfZd3nbUdTJQzLKfkZej6cevbNFBQIALuYclQhxMeEectC1kePkuE-jWljRNSqKZipICRQmBCRYdNcZNO54Q3KUaOz-khLHoViIbMaxRzp49Hwy4LPagXtIqKePB2FFMPMziQaJjKUIPPVDObZMp0L-KNcPZARqIr3kyG82CBY1s-HkLgKPso8AVMAViPiaqC35DiPlV3cuSnYc-ADtLYLejaaIEvYC_I1w6CsqpbwKaUIWTXz4LPDU6Sj1emcHGErdW713dRLiFWHERMXs8-ld95D_ns2EtbKfg1XUa2478J02fB85Y3B4DlsTYCOptAtXFIh0Q9n-Z_ZoFteoe3nGMspzBLI9HHUlebQ71cVD41ldEBdlzSsXSgtyDdXwYHsAubZyL-5cDw20mg66iqjefpsGTmP8gpCVL0s2HKy9uwmnd_pA3q63KxSHDtPhYcSEVh8Q_D7ermX-xS4AUsdwGI1t1_IK6JwsHG5ne1Qd3EXRTtaSe1k9AwMzG4jkuoRuDkDh9oT2_uzSJSyZNOdMogzm4Rf7cB1yP9Q1WOutjTbAIgyZw73tuc_leN1v95sOjkf0JIqJAXZ5hOESrd6aYLX54GzKtPOHwuec-AUIJxlAQKHz3PEYjHnCMXmSyLJ6ab8pyA0k_KTa6d6hPCf1h4TaKN5XM28xFsc5iTFhyuwYRoRs8mR4yVtejed-pm8ndfBcbU4vIvM4SEw0qezVPJMAn-dO-USamvBSe3wAvfa9FKFEbm9s8Wlv04dwcggJ4vCMJd6yfJzIc_2E_WJXDWKsqGjkfL7-3r-SD1rluQzA6Eh3qOtfRZ0Eg7VaLYCdKfoTBCdOdG7i9HpL6XwBvKUNJmTaJM5GiBDMGG8WCLvQ_g9ZqEMby1Hncp4vh7HtiRhzS7gQ +``` + + \ No newline at end of file diff --git a/docs/endpoints/messages/delete_message.md b/docs/server/endpoints/messages/delete_message.md similarity index 93% rename from docs/endpoints/messages/delete_message.md rename to docs/server/endpoints/messages/delete_message.md index 99721bbbb..c1958ed5e 100644 --- a/docs/endpoints/messages/delete_message.md +++ b/docs/server/endpoints/messages/delete_message.md @@ -52,6 +52,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/endpoints/messages/read_message.md b/docs/server/endpoints/messages/get_message.md similarity index 93% rename from docs/endpoints/messages/read_message.md rename to docs/server/endpoints/messages/get_message.md index b45d93707..0e19d9bc6 100644 --- a/docs/endpoints/messages/read_message.md +++ b/docs/server/endpoints/messages/get_message.md @@ -1,6 +1,6 @@ -# Download Message +# Get Message -*Downloads a message, effectively reading it.* +*Fetches a message, effectively reading it.* ## Endpoint @@ -55,4 +55,4 @@ print(response.text) [versions]: /resources/server/versions [passwords]: /resources/server/passwords -[messages]: /resources/server/messages +[messages]: /resources/server/models/messages diff --git a/docs/endpoints/post_comment.md b/docs/server/endpoints/post_comment.md similarity index 100% rename from docs/endpoints/post_comment.md rename to docs/server/endpoints/post_comment.md diff --git a/docs/endpoints/rate_demon.md b/docs/server/endpoints/rate_demon.md similarity index 100% rename from docs/endpoints/rate_demon.md rename to docs/server/endpoints/rate_demon.md diff --git a/docs/endpoints/rate_level.md b/docs/server/endpoints/rate_level.md similarity index 100% rename from docs/endpoints/rate_level.md rename to docs/server/endpoints/rate_level.md diff --git a/docs/endpoints/rate_stars.md b/docs/server/endpoints/rate_stars.md similarity index 100% rename from docs/endpoints/rate_stars.md rename to docs/server/endpoints/rate_stars.md diff --git a/docs/endpoints/read_friend_request.md b/docs/server/endpoints/read_friend_request.md similarity index 100% rename from docs/endpoints/read_friend_request.md rename to docs/server/endpoints/read_friend_request.md diff --git a/docs/endpoints/remove_friend.md b/docs/server/endpoints/remove_friend.md similarity index 100% rename from docs/endpoints/remove_friend.md rename to docs/server/endpoints/remove_friend.md diff --git a/docs/endpoints/report_level.md b/docs/server/endpoints/report_level.md similarity index 100% rename from docs/endpoints/report_level.md rename to docs/server/endpoints/report_level.md diff --git a/docs/endpoints/request.md b/docs/server/endpoints/request.md similarity index 100% rename from docs/endpoints/request.md rename to docs/server/endpoints/request.md diff --git a/docs/endpoints/request_access.md b/docs/server/endpoints/request_access.md similarity index 100% rename from docs/endpoints/request_access.md rename to docs/server/endpoints/request_access.md diff --git a/docs/endpoints/restore_items.md b/docs/server/endpoints/restore_items.md similarity index 100% rename from docs/endpoints/restore_items.md rename to docs/server/endpoints/restore_items.md diff --git a/docs/endpoints/search_users.md b/docs/server/endpoints/search_users.md similarity index 100% rename from docs/endpoints/search_users.md rename to docs/server/endpoints/search_users.md diff --git a/docs/endpoints/send_friend_request.md b/docs/server/endpoints/send_friend_request.md similarity index 100% rename from docs/endpoints/send_friend_request.md rename to docs/server/endpoints/send_friend_request.md diff --git a/docs/endpoints/send_level_comment.md b/docs/server/endpoints/send_level_comment.md similarity index 100% rename from docs/endpoints/send_level_comment.md rename to docs/server/endpoints/send_level_comment.md diff --git a/docs/endpoints/send_message.md b/docs/server/endpoints/send_message.md similarity index 100% rename from docs/endpoints/send_message.md rename to docs/server/endpoints/send_message.md diff --git a/docs/endpoints/unblock_user.md b/docs/server/endpoints/unblock_user.md similarity index 100% rename from docs/endpoints/unblock_user.md rename to docs/server/endpoints/unblock_user.md diff --git a/docs/endpoints/update_level_description.md b/docs/server/endpoints/update_level_description.md similarity index 100% rename from docs/endpoints/update_level_description.md rename to docs/server/endpoints/update_level_description.md diff --git a/docs/endpoints/update_data.md b/docs/server/endpoints/update_profile.md similarity index 100% rename from docs/endpoints/update_data.md rename to docs/server/endpoints/update_profile.md diff --git a/docs/endpoints/update_account.md b/docs/server/endpoints/update_settings.md similarity index 100% rename from docs/endpoints/update_account.md rename to docs/server/endpoints/update_settings.md diff --git a/docs/endpoints/upload_level.md b/docs/server/endpoints/upload_level.md similarity index 100% rename from docs/endpoints/upload_level.md rename to docs/server/endpoints/upload_level.md diff --git a/docs/endpoints/users/block_user.md b/docs/server/endpoints/users/block_user.md similarity index 89% rename from docs/endpoints/users/block_user.md rename to docs/server/endpoints/users/block_user.md index aa9bbddf4..5772911d6 100644 --- a/docs/endpoints/users/block_user.md +++ b/docs/server/endpoints/users/block_user.md @@ -36,7 +36,7 @@ import requests data = { "accountID": 173831, # DevExit's account ID "gjp": "********", # this would be DevExit's encoded password - "targetAccountID": 71, # Robtop's account ID + "targetAccountID": 71, # RobTop's account ID "secret": "Wmfd2893gb7", # common secret } @@ -51,6 +51,6 @@ print(response.text) 1 ``` -[passwords]: /resources/server/passwords -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions +[passwords]: /server/topics/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions diff --git a/docs/resources/server/comments.md b/docs/server/models/comments.md similarity index 100% rename from docs/resources/server/comments.md rename to docs/server/models/comments.md diff --git a/docs/resources/server/friend_requests.md b/docs/server/models/friend_requests.md similarity index 100% rename from docs/resources/server/friend_requests.md rename to docs/server/models/friend_requests.md diff --git a/docs/resources/server/gauntlets.md b/docs/server/models/gauntlets.md similarity index 100% rename from docs/resources/server/gauntlets.md rename to docs/server/models/gauntlets.md diff --git a/docs/resources/server/leaderboards.md b/docs/server/models/leaderboards.md similarity index 100% rename from docs/resources/server/leaderboards.md rename to docs/server/models/leaderboards.md diff --git a/docs/resources/server/levels.md b/docs/server/models/levels.md similarity index 100% rename from docs/resources/server/levels.md rename to docs/server/models/levels.md diff --git a/docs/resources/server/map_packs.md b/docs/server/models/map_packs.md similarity index 100% rename from docs/resources/server/map_packs.md rename to docs/server/models/map_packs.md diff --git a/docs/resources/server/messages.md b/docs/server/models/messages.md similarity index 100% rename from docs/resources/server/messages.md rename to docs/server/models/messages.md diff --git a/docs/resources/server/restore.md b/docs/server/models/restore.md similarity index 100% rename from docs/resources/server/restore.md rename to docs/server/models/restore.md diff --git a/docs/resources/server/songs.md b/docs/server/models/songs.md similarity index 100% rename from docs/resources/server/songs.md rename to docs/server/models/songs.md diff --git a/docs/resources/server/users.md b/docs/server/models/users.md similarity index 100% rename from docs/resources/server/users.md rename to docs/server/models/users.md diff --git a/docs/topics/error_codes.md b/docs/server/topics/error_codes.md similarity index 93% rename from docs/topics/error_codes.md rename to docs/server/topics/error_codes.md index 48cea9ff9..aefa06ade 100644 --- a/docs/topics/error_codes.md +++ b/docs/server/topics/error_codes.md @@ -61,8 +61,8 @@ or the client's side. \* `timeout` is the remaining duration of the ban in seconds, `reason` is the reason for getting banned. -[register]: /endpoints/accounts/register -[login]: /endpoints/accounts/login -[save]: /endpoints/accounts/save -[suggest_level]: /endpoints/levels/suggest_level -[comment_level]: /endpoints/levels/comment_level +[register]: /server/endpoints/accounts/register +[login]: /server/endpoints/accounts/login +[save]: /server/endpoints/accounts/save +[suggest_level]: /server/endpoints/levels/suggest_level +[comment_level]: /server/endpoints/levels/comment_level diff --git a/docs/resources/server/secrets.md b/docs/server/topics/secrets.md similarity index 100% rename from docs/resources/server/secrets.md rename to docs/server/topics/secrets.md diff --git a/docs/resources/server/versions.md b/docs/server/topics/versions.md similarity index 77% rename from docs/resources/server/versions.md rename to docs/server/topics/versions.md index 3480ffe57..8b5e46344 100644 --- a/docs/resources/server/versions.md +++ b/docs/server/topics/versions.md @@ -1,6 +1,6 @@ # Versions -| name | version | +| name | current | |----------------|---------| | Game Version | `21` | | Binary Version | `35` | diff --git a/docs/topics/levelstring_encoding_decoding.md b/docs/topics/levelstring_encoding_decoding.md deleted file mode 100644 index 2e5fe960b..000000000 --- a/docs/topics/levelstring_encoding_decoding.md +++ /dev/null @@ -1,54 +0,0 @@ -# Level encoding/decoding -Despite Geometry Dash levels being stored in a plaintext, human-readable format, the game will resort to storing level data in a compressed binary format when storing them in the game's memory or files(albeit for compatibility reasons levels can also be loaded directly in a uncompressed format). - -Official levels are stored in `\Resources\LevelData.plist` (filename depends on game, `LevelDataSubzero.plist` for *Geometry Dash Subzero*, etc.) - -Compressed levels are actually composed out of two things: [Base64](topics/encryption/base64) encoding and [ZLIB](https://zlib.net) compression. - -## Encoding -To encode a level you take first the level string and `compress()` it, afterwards you need to encode the resulting byte sequence with Base64 encoding. - -If you are encoding an official level and want to put it in `LevelData.plist`, you need to remove the first 13 characters in the beginning of the base64 encoded string. - - - -### **Python** - -```py -import base64 -import gzip - -def encode_level(level_string: str, is_official_level: bool) -> str: - gzipped = gzip.compress(level_string.encode()) - base64_encoded = base64.urlsafe_b64encode(gzipped) - if is_official_level: - base64_encoded = base64_encoded[13:] - return base64_encoded.decode() -``` - - - -## Decoding -To decompress the level you'll first need to decode the compressed string in it's B64 encoded form, then you need to `decompress()` the resulting bytes to obtain a valid level string which can be read by the game. - -If you are decoding an official level, you need to add `H4sIAAAAAAAAA` at the beginning of the compressed string. - - - -### **Python** - -```py -import base64 -import zlib - - -def decode_level(level_data: str, is_official_level: bool) -> str: - if is_official_level: - level_data = 'H4sIAAAAAAAAA' + level_data - base64_decoded = base64.urlsafe_b64decode(level_data.encode()) - # window_bits = 15 | 32 will autodetect gzip or not - decompressed = zlib.decompress(base64_decoded, 15 | 32) - return decompressed.decode() -``` - - diff --git a/docs/topics/localfiles_encrypt_decrypt.md b/docs/topics/localfiles_encrypt_decrypt.md deleted file mode 100644 index b3c7a3223..000000000 --- a/docs/topics/localfiles_encrypt_decrypt.md +++ /dev/null @@ -1,142 +0,0 @@ -# Game Files - Encryption and Decryption - -Although Geometry Dash's install path is usually inside the user's `steamapps/common` folder (if the game was bought from Steam) the game will actually store all relevant user data inside the `AppData/Local` directory, in which a new folder will be created under the name of `GeometryDash`. This folder contains all custom songs that the user has downloaded but it also contains 2 important files, which are *CCGameManager.dat* and *CCLocalLevels.dat*; the first one contains all the information regarding the player's in-game stats and preferences while the latter contains the data for the game's user created levels. - -On MacOS, saves are placed under `~/Library/Application Support/GeometryDash`, and use completely different encoding from Windows one. - -However when these files are written to the disk they are encrypted and have to be decrypted before they can be read or modified. -Both files share the same process for decryption and encryption. - -## Decryption - -### Windows - -Local game files are decrypted in the following order: Apply XOR function with key `0xB` (`11`), then apply [B64 decoding](topics/encryption/base64), the resulting byte sequence will be a [gzip](https://zlib.net) compressed string which needs to be decompressed/inflated. - -Simple XOR function differs can be written like this: - - - -### **Python** - -```py -def xor(string: str, key: int) -> str: - return ("").join(chr(ord(char) ^ key) for char in string) -``` - - - -Programmatically decryption can be implemented like so: - - - -### **Python** - -```py -import base64 -import gzip - - -def decrypt_data(data: str) -> str: - base64_decoded = base64.urlsafe_b64decode(xor(data, key=11).encode()) - decompressed = gzip.decompress(base64_decoded) - return decompressed.decode() -``` - - - -### MacOS - -On MacOS, decryption is quite simpler. Saves are encrypted with -[AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard), using `ECB` mode. - -256-bit key for encryption looks like this: - - - -### **Plain** - -```plain -69 70 75 39 54 55 76 35 34 79 76 5d 69 73 46 4d 68 35 40 3b 74 2e 35 77 33 34 45 32 52 79 40 7b -``` - -### **Python** - -```py -KEY = ( # python will automatically concatenate two parts - b"\x69\x70\x75\x39\x54\x55\x76\x35\x34\x79\x76\x5d\x69\x73\x46\x4d" - b"\x68\x35\x40\x3b\x74\x2e\x35\x77\x33\x34\x45\x32\x52\x79\x40\x7b" -) -``` - - - -Here is how actual decryption would be implemented: - - - -### **Python** - -```py -from Crypto.Cipher import AES - - -def remove_pad(data: bytes) -> bytes: - last = data[-1] - if last < 16: - data = data[:-last] - return data - - -def mac_decrypt(data: bytes) -> str: - cipher = AES.new(KEY, AES.MODE_ECB) - return remove_pad(cipher.decrypt(data)).decode() -``` - - - -## Encryption - -### Windows - -Encryption is done pretty much the same way but with opposite operations and order. So the sequence for encrypting can be defined as: [gzip](https://zlib.net) compress/deflate -> [Base64](topics/encryption/base64) encode -> XOR using `0xb` (`11`) as a key. - - - -### **Python** - -```py -def encrypt_data(data: str) -> str: - gzipped = gzip.compress(data.encode()) - base64_encoded = base64.urlsafe_b64encode(gzipped) - return xor(base64_encoded.decode(), key=11) -``` - - - -### MacOS - -Like on Windows, encryption and decrypion are almost the same: - - - -### **Python** - -```py -from Crypto.Cipher import AES - - -def add_pad(data: bytes) -> bytes: - len_r = len(data) % 16 - if len_r: - to_add = 16 - len_r - data += to_add.to_bytes(1, "little") * to_add - return data - - -def mac_encrypt(data: str) -> bytes: - cipher = AES.new(KEY, AES.MODE_ECB) - return cipher.encrypt(add_pad(data.encode())) -``` - - diff --git a/mkdocs.yml b/mkdocs.yml index 7326d837f..59d3754fc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -11,43 +11,46 @@ watch: - docs nav: - - "Index": "index.md" - - "Credits": "credits.md" - - - "Endpoints": - - "Comments": - - "Delete Account Comment": "endpoints/comments/delete_account_comment.md" - - "Delete Level Comment": "endpoints/comments/delete_level_comment.md" - - "Friend Requests": - - "Accept Friend Request": "endpoints/friend_requests/accept_friend_request.md" - - "Delete Friend Request": "endpoints/friend_requests/delete_friend_request.md" - - "Levels": - - "Delete Level": "endpoints/levels/delete_level.md" - - "Download Level": "endpoints/levels/download_level.md" - - "Messages": - - "Delete Message": "endpoints/messages/delete_message.md" - - "Read Message": "endpoints/messages/read_message.md" - - "Users": - - "Block User": "endpoints/users/block_user.md" - - - "Resources": - - "Server": - - "Secrets": "resources/server/secrets.md" - - "Versions": "resources/server/versions.md" - - - "Topics": - - "Encoding": - - "AES": "topics/encoding/aes.md" - - "Base64": "topics/encoding/base64.md" - - "Checks": "topics/encoding/checks.md" - - "Random String, UUID and UDID": "topics/encoding/ids.md" - - "RobTop Encoding": "topics/encoding/robtop.md" - - "Seeds": "topics/encoding/seeds.md" - - "XOR": "topics/encoding/xor.md" - - "ZIP": "topics/encoding/zip.md" - - - "Error Codes": "topics/error_codes.md" - - "Vault Codes": "topics/vault_codes.md" + - Index: "index.md" + - Credits: "credits.md" + + - Server: + - Endpoints: + - Comments: + - Delete Level Comment: "server/endpoints/comments/delete_level_comment.md" + - Delete User Comment: "server/endpoints/comments/delete_user_comment.md" + - Friend Requests: + - Accept Friend Request: "server/endpoints/friend_requests/accept_friend_request.md" + - Delete Friend Request: "server/endpoints/friend_requests/delete_friend_request.md" + - Levels: + - Get Level: "server/endpoints/levels/get_level.md" + - Delete Level: "server/endpoints/levels/delete_level.md" + - Messages: + - Delete Message: "server/endpoints/messages/delete_message.md" + - Get Message: "server/endpoints/messages/get_message.md" + - Users: + - Block User: "server/endpoints/users/block_user.md" + + - Topics: + - Error Codes: "server/topics/error_codes.md" + - Secrets: "server/topics/secrets.md" + - Versions: "server/topics/versions.md" + + - Client: + - Topics: + - Vault Codes: "client/topics/vault_codes.md" + + - Encoding: + - AES: "encoding/aes.md" + - Base64: "encoding/base64.md" + - Checks: "encoding/checks.md" + - Random String, UUID and UDID: "encoding/ids.md" + - RobTop Encoding: "encoding/robtop.md" + - Seeds: "encoding/seeds.md" + - XOR: "encoding/xor.md" + - ZIP: "encoding/zip.md" + + - Code of Conduct: "code_of_conduct.md" theme: name: material From eabfe2c570c9b952b01ba2004c5c1faace76912a Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Tue, 6 Sep 2022 00:36:19 +0300 Subject: [PATCH 12/17] Update `get_message` endpoint. --- .github/FUNDING.yml | 2 +- docs/server/endpoints/messages/get_message.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6bc9a5b33..ad3c11c08 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -github: SMJSGaming, nekitdev, naoei, Wyliemaster +github: Wyliemaster, nekitdev, naoei diff --git a/docs/server/endpoints/messages/get_message.md b/docs/server/endpoints/messages/get_message.md index 0e19d9bc6..404d4fadb 100644 --- a/docs/server/endpoints/messages/get_message.md +++ b/docs/server/endpoints/messages/get_message.md @@ -51,8 +51,8 @@ print(response.text) 6:DevExit:3:3935672:2:173831:1:54109536:4:WW91J3JlIGR1bWIgbG9s:8:1:9:0:5:TWhtIHllcCB5b3UncmUgcCBkdW1iIGxtYW8=:7:19 minutes ``` -[secrets]: /resources/server/secrets -[versions]: /resources/server/versions -[passwords]: /resources/server/passwords +[secrets]: /server/topics/secrets +[versions]: /server/topics/versions +[passwords]: /server/topics/passwords -[messages]: /resources/server/models/messages +[messages]: /server/models/messages From fbab1a055ded7f236a4a7a703d5e48420fbf3342 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Fri, 23 Dec 2022 00:02:42 +0300 Subject: [PATCH 13/17] Small updates. --- CODE_OF_CONDUCT.md | 4 +- docs/credits.md | 4 +- docs/server/topics/songs.md | 45 +++++++++++++ docs/topics/shop.md | 126 ------------------------------------ docs/topics/tags.md | 33 ---------- mkdocs.yml | 3 +- 6 files changed, 52 insertions(+), 163 deletions(-) create mode 100644 docs/server/topics/songs.md delete mode 100644 docs/topics/shop.md delete mode 100644 docs/topics/tags.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d983f0a58..2707a97cf 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement to -[][Email]. +[conduct@gd-programming.org][Email]. All complaints will be reviewed and investigated promptly and fairly. @@ -126,6 +126,8 @@ For answers to common questions about this code of conduct, see the FAQ at [https://contributor-covenant.org/faq][FAQ]. Translations are available at [https://contributor-covenant.org/translations][Translations]. +[Email]: mailto:conduct@gd-programming.org + [Home]: https://contributor-covenant.org/ [v2.1]: https://contributor-covenant.org/version/2/1/code_of_conduct diff --git a/docs/credits.md b/docs/credits.md index 70eb2e3c8..14e8cf71d 100644 --- a/docs/credits.md +++ b/docs/credits.md @@ -1,6 +1,6 @@ # Credits -Thanks to the **Geometry Dash Programming** experts, and the **GDDocs** contributors for +Thanks to the **Geometry Dash Programming** experts, and the `gd.docs` contributors for making this project a reality. Without you, this project wouldn't have even been possible. ## Staff Team @@ -20,7 +20,7 @@ making this project a reality. Without you, this project wouldn't have even been [zmx]: https://github.com/qimiko [Wylie]: https://github.com/Wyliemaster -[Rekkon]: https://github.com/AlFasGD +[Rekkon]: https://github.com/Rekkonnect [Andre]: https://github.com/AndreNIH [Cvolton]: https://github.com/Cvolton [Colon]: https://github.com/GDColon diff --git a/docs/server/topics/songs.md b/docs/server/topics/songs.md new file mode 100644 index 000000000..dce51d6c0 --- /dev/null +++ b/docs/server/topics/songs.md @@ -0,0 +1,45 @@ +# Geometry Dash Songs + +Song IDs are represented in *server-style*; for *client-style*, simply add one to the ID. + +| Level ID | Song ID | Name | Artist | +|----------|---------|----------------------------|----------------| +| `None` | `-1` | `Practice: Stay Inside Me` | `OcularNebula` | +| `1` | `0` | `Stereo Madness` | `Foreverbound` | +| `2` | `1` | `Back on Track` | `DJVI` | +| `3` | `2` | `Polargeist` | `Step` | +| `4` | `3` | `Dry Out` | `DJVI` | +| `5` | `4` | `Base after Base` | `DJVI` | +| `6` | `5` | `Can't Let Go` | `DJVI` | +| `7` | `6` | `Jumper` | `Waterflame` | +| `8` | `7` | `Time Machine` | `Waterflame` | +| `9` | `8` | `Cycles` | `DJVI` | +| `10` | `9` | `xStep` | `DJVI` | +| `11` | `10` | `Clutterfunk` | `Waterflame` | +| `12` | `11` | `Theory of Everything` | `DJ-Nate` | +| `13` | `12` | `Electroman Adventures` | `Waterflame` | +| `14` | `13` | `Clubstep` | `DJ-Nate` | +| `15` | `14` | `Electrodynamix` | `DJ-Nate` | +| `16` | `15` | `Hexagon Force` | `Waterflame` | +| `17` | `16` | `Blast Processing` | `Waterflame` | +| `18` | `17` | `Theory of Everything 2` | `DJ-Nate` | +| `19` | `18` | `Geometrical Dominator` | `Waterflame` | +| `20` | `19` | `Deadlocked` | `F-777` | +| `21` | `20` | `Fingerdash` | `MDK` | +| `1001` | `21` | `The Seven Seas` | `F-777` | +| `1002` | `22` | `Viking Arena` | `F-777` | +| `1003` | `23` | `Airborne Robots` | `F-777` | +| `3001` | `24` | `The Challenge` | `RobTop` | +| `2001` | `25` | `Payload` | `Dex Arson` | +| `2002` | `26` | `Beast Mode` | `Dex Arson` | +| `2003` | `27` | `Machina` | `Dex Arson` | +| `2004` | `28` | `Years` | `Dex Arson` | +| `2005` | `29` | `Frontlines` | `Dex Arson` | +| `2006` | `30` | `Space Pirates` | `Waterflame` | +| `2007` | `31` | `Striker` | `Waterflame` | +| `2008` | `32` | `Embers` | `Dex Arson` | +| `2009` | `33` | `Round 1` | `Dex Arson` | +| `2010` | `34` | `Monster Dance Off` | `F-777` | +| `4001` | `35` | `Press Start` | `MDK` | +| `4002` | `36` | `Nock Em` | `Bossfight` | +| `4003` | `37` | `Power Trip` | `Boom Kitty` | diff --git a/docs/topics/shop.md b/docs/topics/shop.md deleted file mode 100644 index 47bf83fcf..000000000 --- a/docs/topics/shop.md +++ /dev/null @@ -1,126 +0,0 @@ -# Shops - -There are 3 different shops in Geometry Dash which allow the player to purchase various icons. Below is a table which contains every shop item in the game - -**Note:** ItemID refers to the ID of the item Type. - -| listingID | itemID | Item Type | cost | Shop Type | -|:-------|:-------|:----------|:-----|:----------| -| 34 | 79 | Cube | 500 | Shopkeeper | -| 1 | 77 | Cube | 1000 | Shopkeeper | -| 2 | 86 | Cube | 1000 | Shopkeeper | -| 3 | 73 | Cube | 1000 | Shopkeeper | -| 4 | 102 | Cube | 1000 | Shopkeeper | -| 5 | 107 | Cube | 1000 | Shopkeeper | -| 6 | 27 | Ship | 2000 | Shopkeeper | -| 7 | 25 | UFO | 2000 | Shopkeeper | -| 8 | 23 | UFO | 2500 | Shopkeeper | -| 9 | 20 | Ball | 1000 | Shopkeeper | -| 10 | 19 | Ball | 1500 | Shopkeeper | -| 11 | 21 | Wave | 500 | Shopkeeper | -| 12 | 2 | Spider | 2000 | Shopkeeper | -| 13 | 12 | Robot | 3000 | Shopkeeper | -| 14 | 8 | Explosion | 7000 | Shopkeeper | -| 15 | 11 | Explosion | 7000 | Shopkeeper | -| 16 | 18 | Wave | 2000 | Scratch | -| 17 | 94 | Cube | 3000 | Scratch | -| 18 | 85 | Cube | 2500 | Scratch | -| 19 | 96 | Cube | 2000 | Scratch | -| 20 | 4 | Master Emblem | 1000 | Scratch | -| 21 | 14 | Robot | 3000 | Scratch | -| 22 | 21 | UFO | 4000 | Scratch | -| 23 | 3 | Spider | 3000 | Scratch | -| 24 | 25 | Ball | 2000 | Scratch | -| 25 | 13 | Explosion | 10000 | Scratch | -| 26 | 35 | Colour 1 | 1000 | Shopkeeper | -| 27 | 36 | Colour 1 | 1000 | Shopkeeper | -| 28 | 39 | Colour 1 | 1000 | Scratch | -| 29 | 40 | Colour 1 | 1000 | Scratch | -| 30 | 39 | Colour 2 | 1000 | Shopkeeper | -| 32 | 32 | Colour 2 | 1000 | Scratch | -| 33 | 41 | Colour 2 | 1000 | Scratch | -| 35 | 5 | Streak | 4000 | Shopkeeper | -| 36 | 6 | Streak | 4000 | Shopkeeper | -| 37 | 7 | Streak | 4000 | Scratch | -| 38 | 117 | Cube | 4000 | PotBor | -| 39 | 118 | Cube | 2000 | PotBor | -| 40 | 119 | Cube | 2000 | PotBor | -| 41 | 120 | Cube | 4000 | PotBor | -| 42 | 121 | Cube | 2000 | PotBor | -| 43 | 122 | Cube | 2000 | PotBor | -| 44 | 123 | Cube | 6000 | PotBor | -| 45 | 124 | Cube | 8000 | PotBor | -| 46 | 125 | Cube | 4000 | PotBor | -| 47 | 126 | Cube | 2000 | PotBor | -| 48 | 127 | Cube | 6000 | PotBor | -| 49 | 128 | Cube | 8000 | PotBor | -| 50 | 129 | Cube | 6000 | PotBor | -| 51 | 130 | Cube | 4000 | PotBor | -| 52 | 131 | Cube | 4000 | PotBor | -| 53 | 132 | Cube | 4000 | PotBor | -| 54 | 133 | Cube | 8000 | PotBor | -| 55 | 134 | Cube | 6000 | PotBor | -| 56 | 135 | Cube | 6000 | PotBor | -| 57 | 30 | Ball | 4000 | PotBor | -| 58 | 31 | Ball | 6000 | PotBor | -| 59 | 32 | Ball | 6000 | PotBor | -| 60 | 33 | Ball | 2000 | PotBor | -| 61 | 34 | Ball | 4000 | PotBor | -| 62 | 35 | Ball | 8000 | PotBor | -| 63 | 36 | Ball | 6000 | PotBor | -| 64 | 37 | Ball | 2000 | PotBor | -| 65 | 38 | Ball | 2000 | PotBor | -| 66 | 36 | Ship | 2000 | PotBor | -| 67 | 37 | Ship | 2000 | PotBor | -| 68 | 38 | Ship | 6000 | PotBor | -| 69 | 39 | Ship | 2000 | PotBor | -| 70 | 40 | Ship | 4000 | PotBor | -| 71 | 41 | Ship | 4000 | PotBor | -| 72 | 42 | Ship | 6000 | PotBor | -| 73 | 43 | Ship | 2000 | PotBor | -| 74 | 44 | Ship | 6000 | PotBor | -| 75 | 45 | Ship | 8000 | PotBor | -| 76 | 46 | Ship | 4000 | PotBor | -| 77 | 47 | Ship | 6000 | PotBor | -| 78 | 48 | Ship | 4000 | PotBor | -| 79 | 29 | UFO | 6000 | PotBor | -| 80 | 30 | UFO | 6000 | PotBor | -| 81 | 31 | UFO | 4000 | PotBor | -| 82 | 32 | UFO | 6000 | PotBor | -| 83 | 33 | UFO | 4000 | PotBor | -| 84 | 34 | UFO | 2000 | PotBor | -| 85 | 35 | UFO | 2000 | PotBor | -| 86 | 24 | Wave | 2000 | PotBor | -| 87 | 25 | Wave | 4000 | PotBor | -| 88 | 26 | Wave | 2000 | PotBor | -| 89 | 27 | Wave | 2000 | PotBor | -| 90 | 28 | Wave | 6000 | PotBor | -| 91 | 29 | Wave | 6000 | PotBor | -| 92 | 30 | Wave | 4000 | PotBor | -| 93 | 31 | Wave | 6000 | PotBor | -| 94 | 32 | Wave | 2000 | PotBor | -| 95 | 33 | Wave | 6000 | PotBor | -| 96 | 18 | Robot | 2000 | PotBor | -| 97 | 19 | Robot | 6000 | PotBor | -| 98 | 20 | Robot | 2000 | PotBor | -| 99 | 21 | Robot | 4000 | PotBor | -| 100 | 22 | Robot | 6000 | PotBor | -| 101 | 23 | Robot | 2000 | PotBor | -| 102 | 24 | Robot | 6000 | PotBor | -| 103 | 25 | Robot | 4000 | PotBor | -| 104 | 11 | Spider | 4000 | PotBor | -| 105 | 12 | Spider | 6000 | PotBor | -| 106 | 13 | Spider | 4000 | PotBor | -| 107 | 14 | Spider | 8000 | PotBor | -| 108 | 15 | Spider | 2000 | PotBor | -| 109 | 16 | Spider | 6000 | PotBor | -| 111 | 140 | Cube | 3000 | Shopkeeper | -| 112 | 109 | Cube | 4000 | Shopkeeper | -| 113 | 113 | Cube | 4000 | Shopkeeper | -| 114 | 40 | Ball | 4000 | Shopkeeper | -| 115 | 35 | Wave | 4000 | Shopkeeper | -| 116 | 33 | Colour 1 | 1000 | Shopkeeper | -| 117 | 28 | Colour 2 | 1000 | Shopkeeper | -| 118 | 136 | Cube | 5000 | Scratch | -| 119 | 110 | Cube | 5000 | Scratch | -| 120 | 16 | Explosion | 15000 | Scratch | diff --git a/docs/topics/tags.md b/docs/topics/tags.md deleted file mode 100644 index 892761838..000000000 --- a/docs/topics/tags.md +++ /dev/null @@ -1,33 +0,0 @@ -# Tags - -Throughout Geometry Dash there are various interfaces in which the player an see specialised text. Specialised text is created using a custom tag which Robtop has created. As of Geometry Dash 2.11, there are 3 different types of tags. - -> - `` tags assign a specific colour depending on the letter you give you give it. All `` tags must be closed with `` otherwise the game will crash.

-> - `` tags manipulate the delay before a piece of text is sent within a dialog box. The speed you can set is within a range of `000` to `999` ms.

-> - `` tags are the simplest tags out of everything and all they do is make text appear immediately. `` tags must be closed with `` otherwise the game will crash. - -## `` Tags - -There are `9` different colour tags that are usable in Geometry Dash. below is a table of them all - -**Note:** The `\` in the examples are **not** a part of a tag! It has been placed there to show the colour of the tag with the game still showing the tag as plain text. - -| tag | Colour | Hex Code | -|:----|:-------|:---------| -| `` | ![Orange](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/orange.png) | `0xFFA54B` | -| `` | ![Yellow](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/yellow.png) | `0xFFFF48` -| `` | ![Green](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/green.png) | `0x40E348` | -| `` | ![Light Blue](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/lightBlue.png) | `0x32C8FF` | -| `` | ![Blue](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/blue.png) | `0x4A52E1` | -| `` | ![Purple](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/purple.png) | `0xFF00FF` -| `` | ![Very Light Blue](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/veryLightBlue.png) | `0x60ABEF` | -| `` | ![Red](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/red.png) | `0xFFA548` | -| `` | ![dark Red](https://raw.githubusercontent.com/Wyliemaster/gddocs/client/assets/examples/tags/any.png) | `0xFF0000` | - -## `` Tags - -`` tags are used to create a delay before a specific string in dialog boxes. The game detects a `Delay Tag` if the string contains a `` Tags - -`` tags are the complete opposite to `Delay Tags` as they display text instantly rather than after a delay. `` tags also require a closing tag which is `` so the game does not crash when parsing the string. An example of an `` tag can be found [here](https://github.com/Wyliemaster/gddocs/blob/client/assets/examples/tags/I%20tags%20example.mp4?raw=true) diff --git a/mkdocs.yml b/mkdocs.yml index 59d3754fc..a07d9a0f7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: gd.docs -site_author: nekitdev +site_author: GD Programming site_description: Documentation for Geometry Dash. repo_name: gd-programming/gd.docs @@ -34,6 +34,7 @@ nav: - Topics: - Error Codes: "server/topics/error_codes.md" - Secrets: "server/topics/secrets.md" + - Songs: "server/topics/songs.md" - Versions: "server/topics/versions.md" - Client: From b726e54738063af54011249595455efc145e2491 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Fri, 14 Apr 2023 23:47:15 +0300 Subject: [PATCH 14/17] Resolve conflicts. --- README.md | 10 + docs/client/gamesave.md | 1 + docs/client/gamesave/GLM.md | 2 +- docs/client/gamesave/GS_Value.md | 4 +- docs/client/gamesave/achievement.md | 312 ++++++++++++------- docs/client/gamesave/kCEK.md | 2 +- docs/client/gamesave/valueKeeper.md | 2 +- docs/client/level-components/level-colors.md | 17 +- docs/client/level-components/level-object.md | 4 +- docs/client/level.md | 4 +- 10 files changed, 233 insertions(+), 125 deletions(-) diff --git a/README.md b/README.md index a280de03c..aad7dfcdf 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,24 @@ +<<<<<<< HEAD ![gd.docs][Icon] +======= +
+ book +
+>>>>>>> a965748092df0275e6a9426e96907d02881dad35 # `gd.docs` [![gd.docs][Badge]][gd.docs] +<<<<<<< HEAD **Documentation for Geometry Dash.** `gd.docs` is a project built to openly give advanced information for aspiring developers looking to interface with *Geometry Dash*. We primarily aim to create this as a website for people to learn more about the inner workings of *Geometry Dash* along with its data. +======= +---- +>>>>>>> a965748092df0275e6a9426e96907d02881dad35 You can find the website over [here][gd.docs]. diff --git a/docs/client/gamesave.md b/docs/client/gamesave.md index b6237ec2f..32366307d 100644 --- a/docs/client/gamesave.md +++ b/docs/client/gamesave.md @@ -44,6 +44,7 @@ Your CCGameManager.dat File contains a lot of information regarding your account | binaryVersion| integer | The Games Binary Version | | resolution| integer | The games resolution? | | texQuality| integer | how high the text quality is | +| timeOffset| integer | music offset in milliseconds | ### GLM diff --git a/docs/client/gamesave/GLM.md b/docs/client/gamesave/GLM.md index e5fe005f5..7dbaee00f 100644 --- a/docs/client/gamesave/GLM.md +++ b/docs/client/gamesave/GLM.md @@ -141,7 +141,7 @@ GLM_12 contains likes given to a level | key | Description | |:----|:------------| -| `like_{LikeType}_{unknown}_{like/dislike}_{ID}` | needs investigating more | +| `like_{LikeType}_{LevelID}_{like/dislike}_{ID}` | needs investigating more | ## GLM_13 diff --git a/docs/client/gamesave/GS_Value.md b/docs/client/gamesave/GS_Value.md index 799b4a5ff..a255d2ec0 100644 --- a/docs/client/gamesave/GS_Value.md +++ b/docs/client/gamesave/GS_Value.md @@ -17,7 +17,7 @@ GS values contain Information regarding certain aspects of the game | 9 | Destroyed Players on the menu | | 10 | Total Liked/Disliked levels | | 11 | Total Rated Levels | -| 12 | Secret Coins collected | +| 12 | User coins collected | | 13 | Total Diamonds | | 14 | current orbs | | 15 | Completed Daily Levels | @@ -28,7 +28,7 @@ GS values contain Information regarding certain aspects of the game | 20 | Lava Shards | | 21 | Bonus Shards | | 22 | Total Orbs Collected | -| Unique_{LevelID}_{Coins Collected} | The Coins Collected on the Official Levels +| unique_{LevelID}_{Coins Collected} | The Coins Collected on the Official Levels ## GS_completed diff --git a/docs/client/gamesave/achievement.md b/docs/client/gamesave/achievement.md index 7ac62efc5..2b7e8bc16 100644 --- a/docs/client/gamesave/achievement.md +++ b/docs/client/gamesave/achievement.md @@ -13,7 +13,7 @@ Inside CCGameManager.dat, every achievement you have progress on can be found in ## Internal Names -| Internal name | how its aquired | +| Internal name | How it's acquired | | :-------------| :-------------- | | geometry.ach.level01b | Beat Stereo Madness in normal Mode | | geometry.ach.level01a | Beat Stereo Madness in practice Mode | @@ -62,16 +62,16 @@ Inside CCGameManager.dat, every achievement you have progress on can be found in | geometry.ach.demoncoin01 | Beat Clubstep in with all coins| | geometry.ach.demoncoin02 | Beat Theory Of Everything 2 in with all coins| | geometry.ach.demoncoin03 | Beat Deadlocked in with all coins| -| geometry.ach.mappacks01 | Complete 1 Map Pack| -| geometry.ach.mappacks02 | Complete 5 Map Pack| -| geometry.ach.mappacks03 | Complete 10 Map Pack| -| geometry.ach.mappacks04 | Complete 15 Map Pack| -| geometry.ach.mappacks05 | Complete 20 Map Pack| -| geometry.ach.mappacks06 | Complete 25 Map Pack| -| geometry.ach.mappacks07 | Complete 30 Map Pack| -| geometry.ach.mappacks08 | Complete 35 Map Pack| -| geometry.ach.mappacks09 | Complete 40 Map Pack| -| geometry.ach.mappacks10 | Complete 45 Map Pack| +| geometry.ach.mappacks01 | Complete 1 Map Pack | +| geometry.ach.mappacks02 | Complete 5 Map Packs | +| geometry.ach.mappacks03 | Complete 10 Map Packs | +| geometry.ach.mappacks04 | Complete 15 Map Packs | +| geometry.ach.mappacks05 | Complete 20 Map Packs | +| geometry.ach.mappacks06 | Complete 25 Map Packs | +| geometry.ach.mappacks07 | Complete 30 Map Packs | +| geometry.ach.mappacks08 | Complete 35 Map Packs | +| geometry.ach.mappacks09 | Complete 40 Map Packs | +| geometry.ach.mappacks10 | Complete 45 Map Packs | | geometry.ach.custom01 | Complete 1 User Created Level in Normal Mode| | geometry.ach.custom02 | Complete 10 User Created Level in Normal Mode| | geometry.ach.custom03 | Complete 50 User Created Level in Normal Mode| @@ -118,110 +118,110 @@ Inside CCGameManager.dat, every achievement you have progress on can be found in | geometry.ach.demon10 | Beat 40 Demons| | geometry.ach.demon11 | Beat 50 Demons| | geometry.ach.demon12 | Beat 60 Demons| -| geometry.ach.coins01 | collect 5 Secret Coins| -| geometry.ach.coins02 | collect 10 Secret Coins| -| geometry.ach.coins03 | collect 15 Secret Coins| -| geometry.ach.coins04 | collect 20 Secret Coins| -| geometry.ach.coins05 | collect 25 Secret Coins| -| geometry.ach.coins06 | collect 30 Secret Coins| -| geometry.ach.coins07 | collect 35 Secret Coins| -| geometry.ach.coins08 | collect 40 Secret Coins| -| geometry.ach.coins09 | collect 45 Secret Coins| -| geometry.ach.coins10 | collect 50 Secret Coins| -| geometry.ach.coins11 | collect 55 Secret Coins| -| geometry.ach.coins12 | collect 60 Secret Coins| -| geometry.ach.coins13 | collect 65 Secret Coins| -| geometry.ach.coins14 | collect 70 Secret Coins| -| geometry.ach.coins15 | collect 75 Secret Coins| -| geometry.ach.coins16 | collect 80 Secret Coins| -| geometry.ach.coins17 | collect 85 Secret Coins| -| geometry.ach.coins18 | collect 90 Secret Coins| -| geometry.ach.coins19 | collect 95 Secret Coins| -| geometry.ach.coins20 | collect 100 Secret Coins| -| geometry.ach.coins21 | collect 105 Secret Coins| -| geometry.ach.coins22 | collect 110 Secret Coins| -| geometry.ach.coins23 | collect 115 Secret Coins| -| geometry.ach.coins24 | collect 120 Secret Coins| -| geometry.ach.coins25 | collect 130 Secret Coins| -| geometry.ach.usercoins01 | collect 1 user Coin| -| geometry.ach.usercoins02 | collect 10 user Coins| -| geometry.ach.usercoins03 | collect 20 user Coins| -| geometry.ach.usercoins04 | collect 30 user Coins| -| geometry.ach.usercoins05 | collect 40 user Coins| -| geometry.ach.usercoins06 | collect 50 user Coins| -| geometry.ach.usercoins07 | collect 60 user Coins| -| geometry.ach.usercoins08 | collect 70 user Coins| -| geometry.ach.usercoins09 | collect 80 user Coins| -| geometry.ach.usercoins10 | collect 90 user Coins| -| geometry.ach.usercoins11 | collect 100 user Coins| -| geometry.ach.usercoins12 | collect 110 user Coins| -| geometry.ach.usercoins13 | collect 120 user Coins| -| geometry.ach.usercoins14 | collect 130 user Coins| -| geometry.ach.usercoins15 | collect 140 user Coins| -| geometry.ach.usercoins16 | collect 150 user Coins| -| geometry.ach.usercoins17 | collect 160 user Coins| -| geometry.ach.usercoins18 | collect 170 user Coins| -| geometry.ach.usercoins19 | collect 180 user Coins| -| geometry.ach.usercoins20 | collect 190 user Coins| -| geometry.ach.usercoins21 | collect 200 user Coins| -| geometry.ach.usercoins22 | collect 225 user Coins| -| geometry.ach.usercoins23 | collect 250 user Coins| -| geometry.ach.usercoins24 | collect 300 user Coins| -| geometry.ach.usercoins25 | collect 350 user Coins| -| geometry.ach.usercoins26 | collect 425 user Coins| -| geometry.ach.usercoins27 | collect 500 user Coins| -| geometry.ach.usercoins28 | collect 600 user Coins| -| geometry.ach.usercoins29 | collect 700 user Coins| -| geometry.ach.usercoins30 | collect 800 user Coins| -| geometry.ach.usercoins31 | collect 900 user Coins| -| geometry.ach.usercoins32 | collect 1,000 user Coins| -| geometry.ach.diamonds01 | collect 100 Diamonds| -| geometry.ach.diamonds02 | collect 250 Diamonds| -| geometry.ach.diamonds03 | collect 500 Diamonds| -| geometry.ach.diamonds04 | collect 1,000 Diamonds| -| geometry.ach.diamonds05 | collect 1,500 Diamonds| -| geometry.ach.diamonds06 | collect 2,000 Diamonds| -| geometry.ach.diamonds07 | collect 2,500 Diamonds| -| geometry.ach.diamonds08 | collect 3,000 Diamonds| -| geometry.ach.diamonds09 | collect 4,000 Diamonds| -| geometry.ach.diamonds10 | collect 5,000 Diamonds| -| geometry.ach.shardFire01 | collect 5 Fire Shards| -| geometry.ach.shardFire02 | collect 15 Fire Shards| -| geometry.ach.shardFire03 | collect 35 Fire Shards| -| geometry.ach.shardFire04 | collect 65 Fire Shards| -| geometry.ach.shardFire05 | collect 100 Fire Shards| -| geometry.ach.shardIce01 | collect 5 Ice Shards| -| geometry.ach.shardIce02 | collect 15 Ice Shards| -| geometry.ach.shardIce03 | collect 35 Ice Shards| -| geometry.ach.shardIce04 | collect 65 Ice Shards| -| geometry.ach.shardIce05 | collect 100 Ice Shards| -| geometry.ach.shardPoison01 | collect 5 Poison Shards| -| geometry.ach.shardPoison02 | collect 15 Poison Shards| -| geometry.ach.shardPoison03 | collect 35 Poison Shards| -| geometry.ach.shardPoison04 | collect 65 Poison Shards| -| geometry.ach.shardPoison05 | collect 100 Poison Shards| -| geometry.ach.shardShadow01 | collect 5 Shadow Shards| -| geometry.ach.shardShadow02 | collect 15 Shadow Shards| -| geometry.ach.shardShadow03 | collect 35 Shadow Shards| -| geometry.ach.shardShadow04 | collect 65 Shadow Shards| -| geometry.ach.shardShadow05 | collect 100 Shadow Shards| -| geometry.ach.shardLava01 | collect 5 Lava Shards| -| geometry.ach.shardLava02 | collect 15 Lava Shards| -| geometry.ach.shardLava03 | collect 35 Lava Shards| -| geometry.ach.shardLava04 | collect 65 Lava Shards| -| geometry.ach.shardLava05 | collect 100 Lava Shards| -| geometry.ach.shardBonus01 | collect 5 of each Shard| -| geometry.ach.shardBonus02 | collect 15 of each Shard| -| geometry.ach.shardBonusa03 | collect 35 of each Shard| -| geometry.ach.shardBonus04 | collect 65 of each Shard| -| geometry.ach.shardBonus05 | collect 100 of each Shard| +| geometry.ach.coins01 | Collect 5 Secret Coins| +| geometry.ach.coins02 | Collect 10 Secret Coins| +| geometry.ach.coins03 | Collect 15 Secret Coins| +| geometry.ach.coins04 | Collect 20 Secret Coins| +| geometry.ach.coins05 | Collect 25 Secret Coins| +| geometry.ach.coins06 | Collect 30 Secret Coins| +| geometry.ach.coins07 | Collect 35 Secret Coins| +| geometry.ach.coins08 | Collect 40 Secret Coins| +| geometry.ach.coins09 | Collect 45 Secret Coins| +| geometry.ach.coins10 | Collect 50 Secret Coins| +| geometry.ach.coins11 | Collect 55 Secret Coins| +| geometry.ach.coins12 | Collect 60 Secret Coins| +| geometry.ach.coins13 | Collect 65 Secret Coins| +| geometry.ach.coins14 | Collect 70 Secret Coins| +| geometry.ach.coins15 | Collect 75 Secret Coins| +| geometry.ach.coins16 | Collect 80 Secret Coins| +| geometry.ach.coins17 | Collect 85 Secret Coins| +| geometry.ach.coins18 | Collect 90 Secret Coins| +| geometry.ach.coins19 | Collect 95 Secret Coins| +| geometry.ach.coins20 | Collect 100 Secret Coins| +| geometry.ach.coins21 | Collect 105 Secret Coins| +| geometry.ach.coins22 | Collect 110 Secret Coins| +| geometry.ach.coins23 | Collect 115 Secret Coins| +| geometry.ach.coins24 | Collect 120 Secret Coins| +| geometry.ach.coins25 | Collect 130 Secret Coins| +| geometry.ach.usercoins01 | Collect 1 user Coin| +| geometry.ach.usercoins02 | Collect 10 user Coins| +| geometry.ach.usercoins03 | Collect 20 user Coins| +| geometry.ach.usercoins04 | Collect 30 user Coins| +| geometry.ach.usercoins05 | Collect 40 user Coins| +| geometry.ach.usercoins06 | Collect 50 user Coins| +| geometry.ach.usercoins07 | Collect 60 user Coins| +| geometry.ach.usercoins08 | Collect 70 user Coins| +| geometry.ach.usercoins09 | Collect 80 user Coins| +| geometry.ach.usercoins10 | Collect 90 user Coins| +| geometry.ach.usercoins11 | Collect 100 user Coins| +| geometry.ach.usercoins12 | Collect 110 user Coins| +| geometry.ach.usercoins13 | Collect 120 user Coins| +| geometry.ach.usercoins14 | Collect 130 user Coins| +| geometry.ach.usercoins15 | Collect 140 user Coins| +| geometry.ach.usercoins16 | Collect 150 user Coins| +| geometry.ach.usercoins17 | Collect 160 user Coins| +| geometry.ach.usercoins18 | Collect 170 user Coins| +| geometry.ach.usercoins19 | Collect 180 user Coins| +| geometry.ach.usercoins20 | Collect 190 user Coins| +| geometry.ach.usercoins21 | Collect 200 user Coins| +| geometry.ach.usercoins22 | Collect 225 user Coins| +| geometry.ach.usercoins23 | Collect 250 user Coins| +| geometry.ach.usercoins24 | Collect 300 user Coins| +| geometry.ach.usercoins25 | Collect 350 user Coins| +| geometry.ach.usercoins26 | Collect 425 user Coins| +| geometry.ach.usercoins27 | Collect 500 user Coins| +| geometry.ach.usercoins28 | Collect 600 user Coins| +| geometry.ach.usercoins29 | Collect 700 user Coins| +| geometry.ach.usercoins30 | Collect 800 user Coins| +| geometry.ach.usercoins31 | Collect 900 user Coins| +| geometry.ach.usercoins32 | Collect 1,000 user Coins| +| geometry.ach.diamonds01 | Collect 100 Diamonds| +| geometry.ach.diamonds02 | Collect 250 Diamonds| +| geometry.ach.diamonds03 | Collect 500 Diamonds| +| geometry.ach.diamonds04 | Collect 1,000 Diamonds| +| geometry.ach.diamonds05 | Collect 1,500 Diamonds| +| geometry.ach.diamonds06 | Collect 2,000 Diamonds| +| geometry.ach.diamonds07 | Collect 2,500 Diamonds| +| geometry.ach.diamonds08 | Collect 3,000 Diamonds| +| geometry.ach.diamonds09 | Collect 4,000 Diamonds| +| geometry.ach.diamonds10 | Collect 5,000 Diamonds| +| geometry.ach.shardFire01 | Collect 5 Fire Shards| +| geometry.ach.shardFire02 | Collect 15 Fire Shards| +| geometry.ach.shardFire03 | Collect 35 Fire Shards| +| geometry.ach.shardFire04 | Collect 65 Fire Shards| +| geometry.ach.shardFire05 | Collect 100 Fire Shards| +| geometry.ach.shardIce01 | Collect 5 Ice Shards| +| geometry.ach.shardIce02 | Collect 15 Ice Shards| +| geometry.ach.shardIce03 | Collect 35 Ice Shards| +| geometry.ach.shardIce04 | Collect 65 Ice Shards| +| geometry.ach.shardIce05 | Collect 100 Ice Shards| +| geometry.ach.shardPoison01 | Collect 5 Poison Shards| +| geometry.ach.shardPoison02 | Collect 15 Poison Shards| +| geometry.ach.shardPoison03 | Collect 35 Poison Shards| +| geometry.ach.shardPoison04 | Collect 65 Poison Shards| +| geometry.ach.shardPoison05 | Collect 100 Poison Shards| +| geometry.ach.shardShadow01 | Collect 5 Shadow Shards| +| geometry.ach.shardShadow02 | Collect 15 Shadow Shards| +| geometry.ach.shardShadow03 | Collect 35 Shadow Shards| +| geometry.ach.shardShadow04 | Collect 65 Shadow Shards| +| geometry.ach.shardShadow05 | Collect 100 Shadow Shards| +| geometry.ach.shardLava01 | Collect 5 Lava Shards| +| geometry.ach.shardLava02 | Collect 15 Lava Shards| +| geometry.ach.shardLava03 | Collect 35 Lava Shards| +| geometry.ach.shardLava04 | Collect 65 Lava Shards| +| geometry.ach.shardLava05 | Collect 100 Lava Shards| +| geometry.ach.shardBonus01 | Collect 5 of each Shard| +| geometry.ach.shardBonus02 | Collect 15 of each Shard| +| geometry.ach.shardBonusa03 | Collect 35 of each Shard| +| geometry.ach.shardBonus04 | Collect 65 of each Shard| +| geometry.ach.shardBonus05 | Collect 100 of each Shard| | geometry.ach.followCreator | follow 1 Creator| | geometry.ach.followCreator2 | follow 10 Creators| -| geometry.ach.friends01 | befriend 1 user| -| geometry.ach.friends02 | befriend 10 users| -| geometry.ach.youtube | subscribe to [robtop](https://www.youtube.com/user/RobTopGames) on YouTube| -| geometry.ach.youtube | Follow [robtop](https://twitter.com/robtopgames) on Twitter| -| geometry.ach.youtube | Like [robtop](https://www.facebook.com/geometrydash) on Facebook| +| geometry.ach.friends01 | Befriend 1 user| +| geometry.ach.friends02 | Befriend 10 users| +| geometry.ach.youtube | subscribe to [RobTop](https://www.youtube.com/user/RobTopGames) on YouTube| +| geometry.ach.youtube | Follow [RobTop](https://twitter.com/robtopgames) on Twitter| +| geometry.ach.youtube | Like [RobTop](https://www.facebook.com/geometrydash) on Facebook| | geometry.ach.attempt01 | Do 100 Attempts | | geometry.ach.attempt02 | Do 500 Attempts | | geometry.ach.attempt03 | Do 2,000 Attempts | @@ -231,4 +231,88 @@ Inside CCGameManager.dat, every achievement you have progress on can be found in | geometry.ach.jump02 | Jump 10,000 Times | | geometry.ach.jump03 | Jump 20,000 Times | | geometry.ach.jump04 | Jump 50,000 Times | -| geometry.ach.jump05 | Jump 100,000 Times | \ No newline at end of file +| geometry.ach.jump05 | Jump 100,000 Times | +| geometry.ach.submit | Submit an online level | +| geometry.ach.rate | Click the supporter icon when it's locked | +| geometry.ach.rateDiff | Rate the stars of an online level | +| geometry.ach.rateDiff02 | Rate the stars of 100 online levels | +| geometry.ach.rateDiff02b | Rate the stars of 500 online levels | +| geometry.ach.rateDiff03 | Rate the stars of 1,000 online levels | +| geometry.ach.rateDiff04 | Rate the stars of 2,000 online levels | +| geometry.ach.like | Like or dislike an online level | +| geometry.ach.like02 | Like or dislike 100 online levels | +| geometry.ach.like02b | Like or dislike 500 online levels | +| geometry.ach.like03 | Like or dislike 1,000 online levels | +| geometry.ach.like04 | Like or dislike 2,000 online levels | +| geometry.ach.moreGames | Click the "More Games" button | +| geometry.ach.special01 | Die at over 95% on a main level | +| geometry.ach.creator01 | Get 100 likes on your level | +| geometry.ach.creator02 | Get a star rate on your level | +| geometry.ach.creator03 | Get 50 likes on your level | +| geometry.ach.secret01 | Destroy an icon on the main menu | +| geometry.ach.secret02 | Destroy 50 icons on the main menu | +| geometry.ach.secret02b | Destroy 100 icons on the main menu | +| geometry.ach.secret03 | Destroy 200 icons on the main menu | +| geometry.ach.secret03b | Destroy 500 icons on the main menu | +| geometry.ach.secret04 | Found the hidden gold coin by scrolling through the level page 3 times | +| geometry.ach.secret05 | Type 'lenny' into the 2.0 Vault | +| geometry.ach.secret06 | Type 'sparky' into the 2.0 Vault | +| geometry.ach.secret07 | Type 'spooky' into the 2.0 Vault | +| geometry.ach.secret08 | Type 'blockbite' into the 2.0 Vault | +| geometry.ach.secret09 | Type 'robotop' into the 2.0 Vault | +| geometry.ach.secret10 | Type 'ahead' into the 2.0 Vault | +| geometry.ach.secret11 | Destroy the 55th cube on the main menu | +| geometry.ach.secret12 | Destroy the 50th cube on the main menu | +| geometry.ach.secret13 | Type 'mule' into the 2.0 Vault | +| geometry.ach.secret14 | Type 'neverending' into the 2.0 Vault | +| geometry.ach.secret15 | Type 'gandalfpotter' into the 2.0 Vault | +| geometry.ach.secret16 | Consecutively type '8', '16', '30', '32', '46' and '84' into the 2.0 Vault | +| geometry.ach.secret17 | Type your username into the 2.0 Vault | +| geometry.ach.v2.secret01 | Type 'brainpower' into the Vault of Secrets | +| geometry.ach.v2.secret02 | Type 'cod3breaker' and the solution to the puzzle into the Vault of Secrets | +| geometry.ach.v2.secret03 | Solve the 'glubfub' puzzle | +| geometry.ach.v2.secret04 | Type 'octocube' into the Vault of Secrets | +| geometry.ach.v2.secret05 | Type your star count into the Vault of Secrets | +| geometry.ach.v2.secret06 | Type 'seven' into the Vault of Secrets | +| geometry.ach.v2.secret07 | Type 'gimmiethecolor' into the Vault of Secrets | +| geometry.ach.v2.secret08 | Type 'thechickenisonfire' into the Vault of Secrets | +| geometry.ach.v3.secret01 | Type 'darkness' into the Chamber of Time | +| geometry.ach.v3.secret02 | Type 'silence' into the Chamber of Time | +| geometry.ach.v3.secret03 | Type 'river' into the Chamber of Time | +| geometry.ach.v3.secret04 | Type 'hunger' into the Chamber of Time | +| geometry.ach.v3.secret05 | Type 'volcano' into the Chamber of Time | + +## GD Meltdown Achievements +| Internal name | How it's acquired | +| :-------------| :-------------- | +| geometry.ach.mdlevel01b | Beat The Seven Seas in normal mode | +| geometry.ach.mdlevel02b | Beat Viking Arena in normal mode | +| geometry.ach.mdlevel03b | Beat Airborne Robots in normal mode | +| geometry.ach.mdcoin01 | Collect all 3 coins on The Seven Seas | +| geometry.ach.mdcoin02 | Collect all 3 coins on Viking Arena | +| geometry.ach.mdcoin03 | Collect all 3 coins on Airborne Robots | +| geometry.ach.mdrate | Click the icon with ID 71 when it's locked (positioned as 11th) | + +## GD World Achievements +| Internal name | How it's acquired | +| :-------------| :-------------- | +| geometry.ach.world.level001b | Beat Payload in normal mode | +| geometry.ach.world.level002b | Beat Beast Mode in normal mode | +| geometry.ach.world.level003b | Beat Machina in normal mode | +| geometry.ach.world.level004b | Beat Years in normal mode | +| geometry.ach.world.level005b | Beat Frontlines in normal mode | +| geometry.ach.world.level006b | Beat Space Pirates in normal mode | +| geometry.ach.world.level007b | Beat Striker in normal mode | +| geometry.ach.world.level008b | Beat Embers in normal mode | +| geometry.ach.world.level009b | Beat Round 1 in normal mode | +| geometry.ach.world.level010b | Beat Monster Dance Off in normal mode | + +## GD Subzero Achievements +| Internal name | How it's acquired | +| :-------------| :-------------- | +| geometry.ach.subzero.level001 | Beat Press Start in normal mode | +| geometry.ach.subzero.level002 | Beat Nock Em in normal mode | +| geometry.ach.subzero.level003 | Beat Power Trip in normal mode | +| geometry.ach.subzero.coins001 | Collect all 3 coins on Press Start| +| geometry.ach.subzero.coins002 | Collect all 3 coins on Nock Em | +| geometry.ach.subzero.coins003 | Collect all 3 coins on Power Trip | diff --git a/docs/client/gamesave/kCEK.md b/docs/client/gamesave/kCEK.md index a3922ae83..3e28efe51 100644 --- a/docs/client/gamesave/kCEK.md +++ b/docs/client/gamesave/kCEK.md @@ -3,7 +3,7 @@ | Key | Name/Value | description | | :-- | :----------------------------- | :-----------| | 4 | [GJGameLevel](resources/client/level.md) | Contains Keys for levels you played in the past | -| 6 | [SongInfoObject](resources/client/gamesave/song.md) | Contains Keys for songs downloaded | +| 6 | [SongInfoObject](resources/server/song?id=song-structure) | Contains Keys for songs downloaded | | 7 | [GJChallengeItem](resources/client/gamesave/quests.md) | Contains Keys that the game uses to show quests when offline | | 8 | [GJRewardItem](resources/client/gamesave/kCEK.md) | object that holds `GJRewardObject` | | 9 | [GJRewardObject](resources/client/gamesave/kCEK.md) | contains data for Rewards | diff --git a/docs/client/gamesave/valueKeeper.md b/docs/client/gamesave/valueKeeper.md index 3736e4194..8ca8d8b2f 100644 --- a/docs/client/gamesave/valueKeeper.md +++ b/docs/client/gamesave/valueKeeper.md @@ -6,7 +6,7 @@ Value Keeper is a giant Dictionary found in CCGameManager.dat that contains the | prefix | Description | |:-------|:------------| -| [gv_{ID}](/resources/client/gamesave?id=gv-structure) | enabled Game Variables | +| [gv_{ID}](/resources/client/gamesave/gv.md) | enabled Game Variables | | i_{ID} | The playerCubes you have unlocked | | ship_{ID} | The PlayerShips you have unlocked | | ball_{ID} | The PlayerBalls you have unlocked | diff --git a/docs/client/level-components/level-colors.md b/docs/client/level-components/level-colors.md index adeacd369..019e0e7d2 100644 --- a/docs/client/level-components/level-colors.md +++ b/docs/client/level-components/level-colors.md @@ -73,10 +73,23 @@ Here are all of the different color id's: | `1009` | **G2** | This is the secondary color of the ground | | `1010` | **BLACK** | This is the static color channel which is always `r: 0, g: 0, b: 0`. Used in saws that are black by default | -### Undiscovered color channel id's +### Undiscovered color channel IDs `WHITE`: Static color that is always `r: 255, g: 255, b: 255` `LIGHTER`: A lighter version of the primary color in objects. Used in the white small blocks found in `build tab 2 on page 6`. +### 1.9 color channel ID's +GD's 1.9 version used a different ID scheme to identify color channels. In 2.0+, these IDs are still present, but only used in the legacy `1.9 Color Channel ID` property of 1.9 objects. They are as follows: +| 1.9 Channel ID | Name | Corresponding 2.0+ ID | +|:----|:---------|:-----------------------------| +| `1` | **P1** | `1005` +| `2` | **P2** | `1006` +| `3` | **COL 1** | `1` +| `4` | **COL 2** | `2` +| `5` | **LBG** | `1007` +| `6` | **COL 3** | `3` +| `7` | **COL 4** | `4` +| `8` | **3DL** | `1003` + ### Light Background (LBG) calculation The LBG takes the HSV of background. Subtracts `20` from its saturation, then interpolates from `P1` to the last HSV by a factor of the last HSV's value devided by `100`. @@ -88,4 +101,4 @@ function lightBG(bg, p1) { return blendColor( p1, HSVtoRGB(hsv), hsv.v / 100 ); } -``` \ No newline at end of file +``` diff --git a/docs/client/level-components/level-object.md b/docs/client/level-components/level-object.md index b38f81536..e68ca8687 100644 --- a/docs/client/level-components/level-object.md +++ b/docs/client/level-components/level-object.md @@ -63,6 +63,7 @@ Property keys reflect the keys found in the following table, whereas property va | 15 | Player Color 1 | **bool** | the Player Color 1 property of any Color trigger | | 16 | Player Color 2 | **bool** | the Player Color 2 property of any Color trigger | | 17 | Blending | **bool** | the Blending property of any Color trigger | +| 19 | 1.9 Color Channel ID | **integer** | the legacy Color Channel ID property used in 1.9 levels. If set to a valid value, both the Main and Secondary Color Channel ID properties will be ignored. | | 20 | Editor Layer 1 | **integer** | the Editor Layer 1 property of the object | | 21 | Main Color Channel ID | **integer** | the Main Color Channel ID property of the object | | 22 | Secondary Color Channel ID | **integer** | the Secondary Color Channel ID property of the object | @@ -161,8 +162,7 @@ The following key ranges are potentially discarded features, whose appearance in Key End - 18 - 19 + 18 26 diff --git a/docs/client/level.md b/docs/client/level.md index c5d5b04c8..0ffb5c189 100644 --- a/docs/client/level.md +++ b/docs/client/level.md @@ -13,7 +13,7 @@ A level is a playable object in Geometry Dash, namely coming with data that expl | k1 | Level ID | **integer** | the id of the level | | k2 | Level Name | **string** | the name of the level | | k3 | Description | **string** | the level description, encoded in [base64](https://en.wikipedia.org/wiki/Base64) | -| k4 | Inner Level String | **[inner level string](level-components/inner-level-string.md)** | the inner level string, or the playable level | +| k4 | Inner Level String | **[inner level string](/resources/client/level-components/inner-level-string.md)** | the inner level string, or the playable level | | k5 | Creator | **[user](./user.md)Name** | the name of the level creator | | k6 | UserID | **integer** | The UserID of the level Creator | | k7 | level difficulty | **integer** | the difficulty the level has | @@ -100,7 +100,7 @@ The last editor state key/value pairs contain a few values that indicate the las | kI4 | Build Tab Page | **integer** | the displayed page within the build tab | | kI5 | Build Tab | **integer** | the selected build tab | | kI6 | Build Tab Pages | **dictionary** | the last browsed pages of each build tab | -| kI7 | Editor Layer | **float** | the zoom level of the editor camera | +| kI7 | Editor Layer | **float** | the last selected index of a layer | Note that the build tab pages do not depend on the user's button row/column settings. That means, if the settings are changed, the build tab pages will not reflect the correct changes. For example: From b3957750d348d2234fcdb0320be9e5c593682986 Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Fri, 14 Apr 2023 23:50:42 +0300 Subject: [PATCH 15/17] Uhh? --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index aad7dfcdf..a280de03c 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,14 @@ -<<<<<<< HEAD ![gd.docs][Icon] -======= -
- book -
->>>>>>> a965748092df0275e6a9426e96907d02881dad35 # `gd.docs` [![gd.docs][Badge]][gd.docs] -<<<<<<< HEAD **Documentation for Geometry Dash.** `gd.docs` is a project built to openly give advanced information for aspiring developers looking to interface with *Geometry Dash*. We primarily aim to create this as a website for people to learn more about the inner workings of *Geometry Dash* along with its data. -======= ----- ->>>>>>> a965748092df0275e6a9426e96907d02881dad35 You can find the website over [here][gd.docs]. From 9ff53d11abdf179f261fc7011a01114f8ca7442e Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Mon, 17 Apr 2023 09:16:18 +0300 Subject: [PATCH 16/17] Bump dependencies and remove image. --- README.md | 4 ---- assets/icons/gd.docs.png | Bin 40371 -> 0 bytes pyproject.toml | 8 +++----- 3 files changed, 3 insertions(+), 9 deletions(-) delete mode 100644 assets/icons/gd.docs.png diff --git a/README.md b/README.md index a280de03c..84305109a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -![gd.docs][Icon] - # `gd.docs` [![gd.docs][Badge]][gd.docs] @@ -62,7 +60,5 @@ Ideas on what to add or improve can be found in the [issues][Issues] section of [gd.docs]: https://docs.gd-programming.org/ -[Discord]: https://gd-programming.org/discord [Issues]: https://github.com/gd-programming/gd.docs/issues [Badge]: https://github.com/gd-programming/gd.docs/workflows/docs/badge.svg -[Icon]: https://github.com/gd-programming/gd.docs/blob/docs/assets/icons/gd.docs.png?raw=true diff --git a/assets/icons/gd.docs.png b/assets/icons/gd.docs.png deleted file mode 100644 index e257b153353ea2f3c163e90898c8f8dc83ece3fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40371 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 diff --git a/pyproject.toml b/pyproject.toml index 9a3e1b8ec..441c8340e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,11 +26,9 @@ Issues = "https://github.com/gd-programming/gd.docs/issues" [tool.poetry.dependencies] python = ">= 3.7" -mkdocs = ">= 1.3.0" -mkdocs-material = "8.3.8" - -mkdocstrings = ">= 0.19.0" +mkdocs = ">= 1.4.2" +mkdocs-material = ">= 9.1.6" [build-system] -requires = ["poetry-core >= 1.1.0b2"] +requires = ["poetry-core >= 1.5.2"] build-backend = "poetry.core.masonry.api" From e5dab4896a3cd79f9a9ad5326c5fadaa44587eea Mon Sep 17 00:00:00 2001 From: Nikita Tikhonov Date: Mon, 17 Apr 2023 09:19:42 +0300 Subject: [PATCH 17/17] Various changes. --- .github/CODEOWNERS | 1 + .github/FUNDING.yml | 1 - .github/dependebot.yml | 28 ++++++++++++++++++++++++++++ docs/credits.md | 26 -------------------------- mkdocs.yml | 1 - 5 files changed, 29 insertions(+), 28 deletions(-) create mode 100644 .github/CODEOWNERS delete mode 100644 .github/FUNDING.yml create mode 100644 .github/dependebot.yml delete mode 100644 docs/credits.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..f9a6f679f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @nekitdev diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index ad3c11c08..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: Wyliemaster, nekitdev, naoei diff --git a/.github/dependebot.yml b/.github/dependebot.yml new file mode 100644 index 000000000..4c42f9d06 --- /dev/null +++ b/.github/dependebot.yml @@ -0,0 +1,28 @@ +version: 2 + +updates: + - package-ecosystem: github-actions + directory: "/" + + labels: + - A-dependencies + - P-normal + - S-triage + + schedule: + interval: daily + + open-pull-requests-limit: 10 + + - package-ecosystem: pip + directory: "/" + + labels: + - A-dependencies + - P-normal + - S-triage + + schedule: + interval: daily + + open-pull-requests-limit: 10 diff --git a/docs/credits.md b/docs/credits.md deleted file mode 100644 index 14e8cf71d..000000000 --- a/docs/credits.md +++ /dev/null @@ -1,26 +0,0 @@ -# Credits - -Thanks to the **Geometry Dash Programming** experts, and the `gd.docs` contributors for -making this project a reality. Without you, this project wouldn't have even been possible. - -## Staff Team - -- [nekit][nekit] -- [zmx][zmx] -- [Wylie][Wylie] - -## Experts - -- [Rekkon][Rekkon] -- [Andre][Andre] -- [Cvolton][Cvolton] -- [Colon][Colon] - -[nekit]: https://github.com/nekitdev -[zmx]: https://github.com/qimiko -[Wylie]: https://github.com/Wyliemaster - -[Rekkon]: https://github.com/Rekkonnect -[Andre]: https://github.com/AndreNIH -[Cvolton]: https://github.com/Cvolton -[Colon]: https://github.com/GDColon diff --git a/mkdocs.yml b/mkdocs.yml index a07d9a0f7..969e5b5fe 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,7 +12,6 @@ watch: nav: - Index: "index.md" - - Credits: "credits.md" - Server: - Endpoints: