diff --git a/20_Django-google-oauth/.gitignore b/20_Django-google-oauth/.gitignore new file mode 100644 index 0000000..fab8f69 --- /dev/null +++ b/20_Django-google-oauth/.gitignore @@ -0,0 +1,2 @@ +venv +*.pyc \ No newline at end of file diff --git a/20_Django-google-oauth/.vscode/launch.json b/20_Django-google-oauth/.vscode/launch.json new file mode 100644 index 0000000..5898846 --- /dev/null +++ b/20_Django-google-oauth/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Django", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/manage.py", + "args": [ + "runserver" + ], + "django": true + }, + ] +} \ No newline at end of file diff --git a/20_Django-google-oauth/bin/setup_env.sh b/20_Django-google-oauth/bin/setup_env.sh new file mode 100644 index 0000000..22be131 --- /dev/null +++ b/20_Django-google-oauth/bin/setup_env.sh @@ -0,0 +1,7 @@ +python -m venv venv +activate() { + . venv/Sctripts/activate + echo "installing requirements to virtual environment" + pip install -r requirements.txt +} +activate \ No newline at end of file diff --git a/20_Django-google-oauth/bin/setup_env_ubuntu.sh b/20_Django-google-oauth/bin/setup_env_ubuntu.sh new file mode 100644 index 0000000..459295f --- /dev/null +++ b/20_Django-google-oauth/bin/setup_env_ubuntu.sh @@ -0,0 +1,7 @@ +python3 -m venv venv +activate() { + . venv/bin/activate + echo "installing requirements to virtual environment" + pip install -r requirements.txt +} +activate \ No newline at end of file diff --git a/20_Django-google-oauth/data.json b/20_Django-google-oauth/data.json new file mode 100644 index 0000000..aac1bc8 --- /dev/null +++ b/20_Django-google-oauth/data.json @@ -0,0 +1 @@ +[{"model": "admin.logentry", "pk": 1, "fields": {"action_time": "2022-05-10T07:43:21.390Z", "user": 1, "content_type": 6, "object_id": "1", "object_repr": "ArticleSeries object (1)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 2, "fields": {"action_time": "2022-05-10T07:44:08.595Z", "user": 1, "content_type": 6, "object_id": "2", "object_repr": "ArticleSeries object (2)", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 3, "fields": {"action_time": "2022-05-10T08:00:28.219Z", "user": 1, "content_type": 7, "object_id": "1", "object_repr": "Bengal Cat", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 4, "fields": {"action_time": "2022-05-18T06:48:07.308Z", "user": 1, "content_type": 7, "object_id": "1", "object_repr": "Bengal Cat", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Content\", \"Notes\", \"Date modified\"]}}]"}}, {"model": "admin.logentry", "pk": 5, "fields": {"action_time": "2022-05-18T06:50:32.774Z", "user": 1, "content_type": 7, "object_id": "2", "object_repr": "Sphynx Cat", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 6, "fields": {"action_time": "2022-05-18T06:51:52.884Z", "user": 1, "content_type": 7, "object_id": "3", "object_repr": "Akita", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 7, "fields": {"action_time": "2022-05-18T06:52:59.934Z", "user": 1, "content_type": 7, "object_id": "4", "object_repr": "Husky", "action_flag": 1, "change_message": "[{\"added\": {}}]"}}, {"model": "admin.logentry", "pk": 8, "fields": {"action_time": "2022-05-27T08:40:02.462Z", "user": 1, "content_type": 8, "object_id": "3", "object_repr": "testing2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 9, "fields": {"action_time": "2022-06-22T07:00:00.842Z", "user": 1, "content_type": 6, "object_id": "2", "object_repr": "Cats", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 10, "fields": {"action_time": "2022-06-22T07:00:10.753Z", "user": 1, "content_type": 6, "object_id": "1", "object_repr": "Dogs", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 11, "fields": {"action_time": "2022-06-22T07:07:25.105Z", "user": 1, "content_type": 7, "object_id": "4", "object_repr": "Husky", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 12, "fields": {"action_time": "2022-06-22T07:07:32.719Z", "user": 1, "content_type": 7, "object_id": "3", "object_repr": "Akita", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 13, "fields": {"action_time": "2022-06-22T07:07:39.004Z", "user": 1, "content_type": 7, "object_id": "2", "object_repr": "Sphynx Cat", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 14, "fields": {"action_time": "2022-06-22T07:07:45.397Z", "user": 1, "content_type": 7, "object_id": "1", "object_repr": "Bengal Cat", "action_flag": 2, "change_message": "[{\"changed\": {\"fields\": [\"Image\"]}}]"}}, {"model": "admin.logentry", "pk": 15, "fields": {"action_time": "2022-07-04T09:32:51.541Z", "user": 1, "content_type": 8, "object_id": "3", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 16, "fields": {"action_time": "2022-07-04T09:34:05.318Z", "user": 1, "content_type": 8, "object_id": "4", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 17, "fields": {"action_time": "2022-07-04T09:36:50.020Z", "user": 1, "content_type": 8, "object_id": "5", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 18, "fields": {"action_time": "2022-07-04T10:04:36.921Z", "user": 1, "content_type": 8, "object_id": "6", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 19, "fields": {"action_time": "2022-07-04T11:19:50.352Z", "user": 1, "content_type": 8, "object_id": "8", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 20, "fields": {"action_time": "2022-07-04T11:19:50.362Z", "user": 1, "content_type": 8, "object_id": "7", "object_repr": "test3", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 21, "fields": {"action_time": "2022-07-04T11:28:41.073Z", "user": 1, "content_type": 8, "object_id": "9", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 22, "fields": {"action_time": "2022-07-04T12:40:04.183Z", "user": 1, "content_type": 8, "object_id": "10", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 23, "fields": {"action_time": "2022-07-04T12:41:02.669Z", "user": 1, "content_type": 8, "object_id": "11", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 24, "fields": {"action_time": "2022-07-04T12:41:41.340Z", "user": 1, "content_type": 8, "object_id": "12", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "admin.logentry", "pk": 25, "fields": {"action_time": "2022-07-07T08:18:17.774Z", "user": 1, "content_type": 8, "object_id": "13", "object_repr": "test2", "action_flag": 3, "change_message": ""}}, {"model": "auth.permission", "pk": 1, "fields": {"name": "Can add log entry", "content_type": 1, "codename": "add_logentry"}}, {"model": "auth.permission", "pk": 2, "fields": {"name": "Can change log entry", "content_type": 1, "codename": "change_logentry"}}, {"model": "auth.permission", "pk": 3, "fields": {"name": "Can delete log entry", "content_type": 1, "codename": "delete_logentry"}}, {"model": "auth.permission", "pk": 4, "fields": {"name": "Can view log entry", "content_type": 1, "codename": "view_logentry"}}, {"model": "auth.permission", "pk": 5, "fields": {"name": "Can add permission", "content_type": 2, "codename": "add_permission"}}, {"model": "auth.permission", "pk": 6, "fields": {"name": "Can change permission", "content_type": 2, "codename": "change_permission"}}, {"model": "auth.permission", "pk": 7, "fields": {"name": "Can delete permission", "content_type": 2, "codename": "delete_permission"}}, {"model": "auth.permission", "pk": 8, "fields": {"name": "Can view permission", "content_type": 2, "codename": "view_permission"}}, {"model": "auth.permission", "pk": 9, "fields": {"name": "Can add group", "content_type": 3, "codename": "add_group"}}, {"model": "auth.permission", "pk": 10, "fields": {"name": "Can change group", "content_type": 3, "codename": "change_group"}}, {"model": "auth.permission", "pk": 11, "fields": {"name": "Can delete group", "content_type": 3, "codename": "delete_group"}}, {"model": "auth.permission", "pk": 12, "fields": {"name": "Can view group", "content_type": 3, "codename": "view_group"}}, {"model": "auth.permission", "pk": 13, "fields": {"name": "Can add content type", "content_type": 4, "codename": "add_contenttype"}}, {"model": "auth.permission", "pk": 14, "fields": {"name": "Can change content type", "content_type": 4, "codename": "change_contenttype"}}, {"model": "auth.permission", "pk": 15, "fields": {"name": "Can delete content type", "content_type": 4, "codename": "delete_contenttype"}}, {"model": "auth.permission", "pk": 16, "fields": {"name": "Can view content type", "content_type": 4, "codename": "view_contenttype"}}, {"model": "auth.permission", "pk": 17, "fields": {"name": "Can add session", "content_type": 5, "codename": "add_session"}}, {"model": "auth.permission", "pk": 18, "fields": {"name": "Can change session", "content_type": 5, "codename": "change_session"}}, {"model": "auth.permission", "pk": 19, "fields": {"name": "Can delete session", "content_type": 5, "codename": "delete_session"}}, {"model": "auth.permission", "pk": 20, "fields": {"name": "Can view session", "content_type": 5, "codename": "view_session"}}, {"model": "auth.permission", "pk": 21, "fields": {"name": "Can add article series", "content_type": 6, "codename": "add_articleseries"}}, {"model": "auth.permission", "pk": 22, "fields": {"name": "Can change article series", "content_type": 6, "codename": "change_articleseries"}}, {"model": "auth.permission", "pk": 23, "fields": {"name": "Can delete article series", "content_type": 6, "codename": "delete_articleseries"}}, {"model": "auth.permission", "pk": 24, "fields": {"name": "Can view article series", "content_type": 6, "codename": "view_articleseries"}}, {"model": "auth.permission", "pk": 25, "fields": {"name": "Can add article", "content_type": 7, "codename": "add_article"}}, {"model": "auth.permission", "pk": 26, "fields": {"name": "Can change article", "content_type": 7, "codename": "change_article"}}, {"model": "auth.permission", "pk": 27, "fields": {"name": "Can delete article", "content_type": 7, "codename": "delete_article"}}, {"model": "auth.permission", "pk": 28, "fields": {"name": "Can view article", "content_type": 7, "codename": "view_article"}}, {"model": "auth.permission", "pk": 29, "fields": {"name": "Can add user", "content_type": 8, "codename": "add_customuser"}}, {"model": "auth.permission", "pk": 30, "fields": {"name": "Can change user", "content_type": 8, "codename": "change_customuser"}}, {"model": "auth.permission", "pk": 31, "fields": {"name": "Can delete user", "content_type": 8, "codename": "delete_customuser"}}, {"model": "auth.permission", "pk": 32, "fields": {"name": "Can view user", "content_type": 8, "codename": "view_customuser"}}, {"model": "auth.permission", "pk": 33, "fields": {"name": "Can add subscribed users", "content_type": 9, "codename": "add_subscribedusers"}}, {"model": "auth.permission", "pk": 34, "fields": {"name": "Can change subscribed users", "content_type": 9, "codename": "change_subscribedusers"}}, {"model": "auth.permission", "pk": 35, "fields": {"name": "Can delete subscribed users", "content_type": 9, "codename": "delete_subscribedusers"}}, {"model": "auth.permission", "pk": 36, "fields": {"name": "Can view subscribed users", "content_type": 9, "codename": "view_subscribedusers"}}, {"model": "contenttypes.contenttype", "pk": 1, "fields": {"app_label": "admin", "model": "logentry"}}, {"model": "contenttypes.contenttype", "pk": 2, "fields": {"app_label": "auth", "model": "permission"}}, {"model": "contenttypes.contenttype", "pk": 3, "fields": {"app_label": "auth", "model": "group"}}, {"model": "contenttypes.contenttype", "pk": 4, "fields": {"app_label": "contenttypes", "model": "contenttype"}}, {"model": "contenttypes.contenttype", "pk": 5, "fields": {"app_label": "sessions", "model": "session"}}, {"model": "contenttypes.contenttype", "pk": 6, "fields": {"app_label": "main", "model": "articleseries"}}, {"model": "contenttypes.contenttype", "pk": 7, "fields": {"app_label": "main", "model": "article"}}, {"model": "contenttypes.contenttype", "pk": 8, "fields": {"app_label": "users", "model": "customuser"}}, {"model": "contenttypes.contenttype", "pk": 9, "fields": {"app_label": "users", "model": "subscribedusers"}}, {"model": "sessions.session", "pk": "56kandugy2k43ijzvd8ynrh9v6q7m0i1", "fields": {"session_data": ".eJxVjcEOwiAQRP-FsyFAKWw9eu83kN0FpGpoUtqT8d9tkx70Ou_NzFsE3NYStpaWMEVxFVpcfjNCfqZ6gPjAep8lz3VdJpKHIk_a5DjH9Lqd7t9AwVb2tldaOe9ixo4Hq4xyDgwbsJ40EGeKVkWNQ6fBut4QQM9EQH6_6JCz-HwBvyU3xA:1nuVVf:vPTGzjLXCvwPCqtXHUDQ4nyc7dLwGbz-hYyMoFuOCwA", "expire_date": "2022-06-10T08:39:51.935Z"}}, {"model": "sessions.session", "pk": "b0shqthxjsg8v2pmotgcckbzh2yge4h3", "fields": {"session_data": ".eJxVjUsOgzAMRO-SdYXsJCSmy0o9R2Q7REH9LBpYVdwdkFi0yzdvRvM1iZe5pqWNnzRlczVoLr-ZsD7G9yEObN3Jrbu_eHreTvs3qdzq3o-AEGLIhZ0OHiyEQFYt-ShIokWyh4w8OCQfeitEvYqQxP3CsRazbmqtMns:1oBwv1:fuBJ5ojZ7PtYDz7x2HEQ3w7m24eIQ5wCbhG0VQL8LCI", "expire_date": "2022-07-28T11:22:07.634Z"}}, {"model": "sessions.session", "pk": "py8tei8mqlh6fx4j549vz2z5gn6yp0vo", "fields": {"session_data": ".eJxVjcEOwiAQRP-FsyFAKWw9eu83kN0FpGpoUtqT8d9tkx70Ou_NzFsE3NYStpaWMEVxFVpcfjNCfqZ6gPjAep8lz3VdJpKHIk_a5DjH9Lqd7t9AwVb2tldaOe9ixo4Hq4xyDgwbsJ40EGeKVkWNQ6fBut4QQM9EQH6_6JCz-HwBvyU3xA:1nmVkQ:zr0SNNIfOucoKOb-X4y0cFl9xJTa_PntOZTOrxyF2Yc", "expire_date": "2022-05-19T07:18:02.553Z"}}, {"model": "sessions.session", "pk": "r94d3yazzdjs6pxkzwev1o12ffx4xbqo", "fields": {"session_data": ".eJxVjUsOgzAMRO-SdYXsJCSmy0o9R2Q7REH9LBpYVdwdkFi0yzdvRvM1iZe5pqWNnzRlczVoLr-ZsD7G9yEObN3Jrbu_eHreTvs3qdzq3o-AEGLIhZ0OHiyEQFYt-ShIokWyh4w8OCQfeitEvYqQxP3CsRazbmqtMns:1o9Mi6:-8MbP8ta7GNl-ZRhEcUQWbSKZmSl-fs0qy5ARIqoc6A", "expire_date": "2022-07-21T08:18:06.714Z"}}, {"model": "sessions.session", "pk": "z28twy03acrgurnpfb6wyki1i9l87q3a", "fields": {"session_data": ".eJxVjUsOgzAMRO-SdYXsJCSmy0o9R2Q7REH9LBpYVdwdkFi0yzdvRvM1iZe5pqWNnzRlczVoLr-ZsD7G9yEObN3Jrbu_eHreTvs3qdzq3o-AEGLIhZ0OHiyEQFYt-ShIokWyh4w8OCQfeitEvYqQxP3CsRazbmqtMns:1o8LOP:-yXRDXFwLSvRR-_J65RpsggHc04MSuDLDxl8yGft7HE", "expire_date": "2022-07-18T12:41:33.828Z"}}, {"model": "main.articleseries", "pk": 1, "fields": {"title": "Dogs", "subtitle": "Everything about dogs", "slug": "dogs", "published": "2022-05-10T07:43:07Z", "author": 1, "image": "ArticleSeries/dogs/dog.jpg"}}, {"model": "main.articleseries", "pk": 2, "fields": {"title": "Cats", "subtitle": "Everything about cats", "slug": "cats", "published": "2022-05-10T07:43:57Z", "author": 1, "image": "ArticleSeries/cats/cat.jpg"}}, {"model": "main.article", "pk": 1, "fields": {"title": "Bengal Cat", "subtitle": "The Bengal cat is a domesticated cat breed created from hybrids of domestic cats, especially the spotted Egyptian Mau, with the Asian leopard cat (Prionailurus bengalensis).", "article_slug": "bengal-cat", "content": "
The breed name comes from the leopard cat's taxonomic name. Bengals have a wild appearance; their golden shimmer comes from their leopard cat ancestry, and their coats may show spots, rosettes, arrowhead markings, or marbling. They are an energetic breed which needs much exercise and play.
\r\nhttps://en.wikipedia.org/wiki/Bengal_cat
", "published": "2022-05-10T07:45:00Z", "modified": "2022-05-18T06:48:05Z", "series": 2, "author": 1, "image": "ArticleSeries/cats/bengal-cat/bengal.jpg"}}, {"model": "main.article", "pk": 2, "fields": {"title": "Sphynx Cat", "subtitle": "The Sphynx cat also known as the Canadian Sphynx, is a breed of cat known for its lack of fur", "article_slug": "sphynx", "content": "Hairlessness in cats is a naturally occurring genetic mutation, and the Sphynx was developed through selective breeding of these animals, starting in the 1960s.[1]
\r\nAccording to breed standards, the skin should have the texture of chamois leather, as it has fine hairs, or the cat may be completely hairless. Whiskers may be present, either whole or broken, or may be totally absent. The cats have a narrow, long head and webbed feet. Their skin is the color that their fur would be, and all the usual cat markings (solid, point, van, tabby, tortie, etc.) may be found on the Sphynx cat's skin. Because they have no fur, Sphynx cats lose body heat more readily than coated cats, making them both warm to the touch and prone to seeking out warm places.
", "notes": "https://en.wikipedia.org/wiki/Sphynx_cat
", "published": "2022-05-18T06:50:32.770Z", "modified": "2022-05-18T06:48:45Z", "series": 2, "author": 1, "image": "ArticleSeries/cats/sphynx/sphynx.jpg"}}, {"model": "main.article", "pk": 3, "fields": {"title": "Akita", "subtitle": "The Akita is a dog breed of large size originating from the mountainous regions of northern Japan", "article_slug": "akita", "content": "The Akita (秋田犬, Akita-inu, Japanese pronunciation: [akʲita.inɯ]) is a dog breed of large size originating from the mountainous regions of northern Japan. The two separate varieties of Akita are a Japanese strain, commonly called Akita Inu (inu means dog in Japanese) or Japanese Akita, and an American strain, known as the Akita or American Akita.[2] The Japanese strain occurs in a narrow palette of colors, with all other colors considered atypical of the breed, while the American strain comes in all dog colors.[3] The Akita has a short double coat similar to that of many other northern spitz breeds such as the Siberian Husky, but long-coated dogs can also be found in many litters due to a recessive gene.
\r\nhttps://en.wikipedia.org/wiki/Akita_(dog)
", "published": "2022-05-18T06:51:52.881Z", "modified": "2022-05-18T06:50:35Z", "series": 1, "author": 1, "image": "ArticleSeries/dogs/akita/akita.jpg"}}, {"model": "main.article", "pk": 4, "fields": {"title": "Husky", "subtitle": "Husky is a general term for a dog used in the polar regions, primarily and specifically for work as sled dogs", "article_slug": "husky", "content": "It refers to a traditional northern type, notable for its cold-weather tolerance and overall hardiness.[1][2] Though dogs such as the AKC/CKC-registered Alaskan Malamute may not contain \"Husky\" in their official name, the term still encompasses dogs of their type.[citation needed] Modern racing huskies that maintain arctic breed traits (also known as Alaskan huskies) represent an ever-changing crossbreed of the fastest dogs.[3][4]
", "notes": "https://en.wikipedia.org/wiki/Husky
", "published": "2022-05-18T06:52:59.930Z", "modified": "2022-05-18T06:52:11Z", "series": 1, "author": 1, "image": "ArticleSeries/dogs/husky/husky.jpg"}}, {"model": "users.customuser", "pk": 1, "fields": {"password": "pbkdf2_sha256$320000$oHgPV7nzxyZJBji5IEValV$odYkTjhsq8sxpU+lXDYMxFLLugEDe5HqUx38rx936HU=", "last_login": "2022-07-14T11:22:07.623Z", "is_superuser": true, "username": "test", "first_name": "", "last_name": "", "is_staff": true, "is_active": true, "date_joined": "2022-05-05T07:16:44.802Z", "email": "test@test.test", "status": "regular", "description": "Just a test admin user", "image": "Users/test/akita.jpg", "groups": [], "user_permissions": []}}, {"model": "users.customuser", "pk": 2, "fields": {"password": "pbkdf2_sha256$320000$WrrXeSYdAgPoL6QYVJyoDB$A5ZMXN31Gs5S+yybgzMjWslSmLhC5NPhtEjXJbfJvZ8=", "last_login": "2022-05-24T19:40:55.978Z", "is_superuser": false, "username": "testings", "first_name": "testing", "last_name": "testing", "is_staff": false, "is_active": true, "date_joined": "2022-05-24T19:40:55.796Z", "email": "testings@test.test", "status": "regular", "description": "", "image": "default/user.jpg", "groups": [], "user_permissions": []}}, {"model": "users.subscribedusers", "pk": 1, "fields": {"name": "testing", "email": "pythonlessons0@gmail.com", "created_date": "2022-07-14T11:21:50.411Z"}}] \ No newline at end of file diff --git a/20_Django-google-oauth/djang_website/__init__.py b/20_Django-google-oauth/djang_website/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/20_Django-google-oauth/djang_website/asgi.py b/20_Django-google-oauth/djang_website/asgi.py new file mode 100644 index 0000000..3552cca --- /dev/null +++ b/20_Django-google-oauth/djang_website/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for djang_website project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang_website.settings') + +application = get_asgi_application() diff --git a/20_Django-google-oauth/djang_website/settings.py b/20_Django-google-oauth/djang_website/settings.py new file mode 100644 index 0000000..dc9f3ff --- /dev/null +++ b/20_Django-google-oauth/djang_website/settings.py @@ -0,0 +1,211 @@ +""" +Django settings for djang_website project. + +Generated by 'django-admin startproject' using Django 3.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.1/ref/settings/ +""" + +from pathlib import Path +import os + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '(c@9=wl&3=c#nm@=5#hn$#dpw5zqm0vvmojfcr!d7%&7&ofz2n' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # Add our new application + 'main', + 'users', + 'tinymce', + 'fontawesomefree', + 'crispy_forms', + 'captcha', + 'django.contrib.sites', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.google', +] + +SITE_ID = 1 +SOCIALACCOUNT_LOGIN_ON_GET=True + +AUTH_USER_MODEL = 'users.CustomUser' + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'djang_website.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'djang_website.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.1/ref/settings/#databases + +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'testdb', + 'USER': 'postgres', + 'PASSWORD': 'password', + 'HOST': '45.76.42.234', + 'PORT': '5432', + } +} + +# Password validation +# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.1/howto/static-files/ + +STATIC_URL = '/static/' + +CRISPY_TEMPLATE_PACK = 'bootstrap4' + +LOGIN_REDIRECT_URL = '/' +LOGIN_URL = 'login' + +AUTHENTICATION_BACKENDS = [ + 'users.backends.EmailBackend', + 'allauth.account.auth_backends.AuthenticationBackend' + ] + +SOCIALACCOUNT_PROVIDERS = { + 'google': { + 'SCOPE': [ + 'profile', + 'email', + ], + 'AUTH_PARAMS': { + 'access_type': 'online', + } + } +} + +RECAPTCHA_PUBLIC_KEY = '6LddA3kgAAAAAPf1mAJmEc7Ku0cssbD5QMha09NT' +RECAPTCHA_PRIVATE_KEY = '6LddA3kgAAAAAJY-2-Q0J3QX83DFJwFR1hXqmN8q' +SILENCED_SYSTEM_CHECKS = ['captcha.recaptcha_test_key_error'] + +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' + +# Emailing settings +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_FROM = 'pythonlessons0@gmail.com' +EMAIL_HOST_USER = 'pythonlessons0@gmail.com' +EMAIL_HOST_PASSWORD = 'fcjaixdgjzrbacey' +EMAIL_PORT = 587 +EMAIL_USE_TLS = True + +PASSWORD_RESET_TIMEOUT = 14400 + +DATA_UPLOAD_MAX_MEMORY_SIZE = 5242880 # 5MB + +TINYMCE_DEFAULT_CONFIG = { + 'custom_undo_redo_levels': 100, + 'selector': 'textarea', + "menubar": "file edit view insert format tools table help", + 'plugins': 'link image preview codesample contextmenu table code lists fullscreen', + 'toolbar1': 'undo redo | backcolor casechange permanentpen formatpainter removeformat formatselect fontselect fontsizeselect', + 'toolbar2': 'bold italic underline blockquote | alignleft aligncenter alignright alignjustify ' + '| bullist numlist | outdent indent | table | link image | codesample | preview code | tiny_mce_wiris_formulaEditor tiny_mce_wiris_formulaEditorChemistry', + 'contextmenu': 'formats | link image', + 'block_formats': 'Paragraph=p; Header 1=h1; Header 2=h2', + 'fontsize_formats': "8pt 10pt 12pt 14pt 16pt 18pt", + 'content_style': "body { font-family: Arial; background: white; color: black; font-size: 12pt}", + 'codesample_languages': [ + {'text': 'Python', 'value': 'python'}, {'text': 'HTML/XML', 'value': 'markup'},], + 'image_class_list': [{'title': 'Fluid', 'value': 'img-fluid', 'style': {} }], + 'width': 'auto', + "height": "600px", + 'image_caption': True, + "images_upload_url": "upload_image", +} \ No newline at end of file diff --git a/20_Django-google-oauth/djang_website/urls.py b/20_Django-google-oauth/djang_website/urls.py new file mode 100644 index 0000000..6d4fba1 --- /dev/null +++ b/20_Django-google-oauth/djang_website/urls.py @@ -0,0 +1,29 @@ +"""django_website URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.conf import settings +from django.conf.urls.static import static +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path("", include('users.urls')), + path("", include('main.urls')), + path('admin/', admin.site.urls), + path('tinymce/', include('tinymce.urls')), + path("", include("allauth.urls")), #most important +] +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/20_Django-google-oauth/djang_website/wsgi.py b/20_Django-google-oauth/djang_website/wsgi.py new file mode 100644 index 0000000..0f0e15e --- /dev/null +++ b/20_Django-google-oauth/djang_website/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for djang_website project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang_website.settings') + +application = get_wsgi_application() diff --git a/20_Django-google-oauth/get-pip.py b/20_Django-google-oauth/get-pip.py new file mode 100644 index 0000000..4609c70 --- /dev/null +++ b/20_Django-google-oauth/get-pip.py @@ -0,0 +1,33324 @@ +#!/usr/bin/env python +# +# Hi There! +# +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base85 encoding of a zip file, this zip file contains +# an entire copy of pip (version 22.0.4). +# +# Pip is a thing that installs packages, pip itself is a package that someone +# might want to install, especially if they're looking to run this get-pip.py +# script. Pip has a lot of code to deal with the security of installing +# packages, various edge cases on various platforms, and other such sort of +# "tribal knowledge" that has been encoded in its code base. Because of this +# we basically include an entire copy of pip inside this blob. We do this +# because the alternatives are attempt to implement a "minipip" that probably +# doesn't do things correctly and has weird edge cases, or compress pip itself +# down into a single file. +# +# If you're wondering how this is created, it is generated using +# `scripts/generate.py` in https://github.com/pypa/get-pip. + +import sys + +this_python = sys.version_info[:2] +min_version = (3, 7) +if this_python < min_version: + message_parts = [ + "This script does not work on Python {}.{}".format(*this_python), + "The minimum supported Python version is {}.{}.".format(*min_version), + "Please use https://bootstrap.pypa.io/pip/{}.{}/get-pip.py instead.".format(*this_python), + ] + print("ERROR: " + " ".join(message_parts)) + sys.exit(1) + + +import os.path +import pkgutil +import shutil +import tempfile +import argparse +import importlib +from base64 import b85decode + + +def include_setuptools(args): + """ + Install setuptools only if absent and not excluded. + """ + cli = not args.no_setuptools + env = not os.environ.get("PIP_NO_SETUPTOOLS") + absent = not importlib.util.find_spec("setuptools") + return cli and env and absent + + +def include_wheel(args): + """ + Install wheel only if absent and not excluded. + """ + cli = not args.no_wheel + env = not os.environ.get("PIP_NO_WHEEL") + absent = not importlib.util.find_spec("wheel") + return cli and env and absent + + +def determine_pip_install_arguments(): + pre_parser = argparse.ArgumentParser() + pre_parser.add_argument("--no-setuptools", action="store_true") + pre_parser.add_argument("--no-wheel", action="store_true") + pre, args = pre_parser.parse_known_args() + + args.append("pip") + + if include_setuptools(pre): + args.append("setuptools") + + if include_wheel(pre): + args.append("wheel") + + return ["install", "--upgrade", "--force-reinstall"] + args + + +def monkeypatch_for_cert(tmpdir): + """Patches `pip install` to provide default certificate with the lowest priority. + + This ensures that the bundled certificates are used unless the user specifies a + custom cert via any of pip's option passing mechanisms (config, env-var, CLI). + + A monkeypatch is the easiest way to achieve this, without messing too much with + the rest of pip's internals. + """ + from pip._internal.commands.install import InstallCommand + + # We want to be using the internal certificates. + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + install_parse_args = InstallCommand.parse_args + + def cert_parse_args(self, args): + if not self.parser.get_default_values().cert: + # There are no user provided cert -- force use of bundled cert + self.parser.defaults["cert"] = cert_path # calculated above + return install_parse_args(self, args) + + InstallCommand.parse_args = cert_parse_args + + +def bootstrap(tmpdir): + monkeypatch_for_cert(tmpdir) + + # Execute the included pip and use it to install the latest pip and + # setuptools from PyPI + from pip._internal.cli.main import main as pip_entry_point + args = determine_pip_install_arguments() + sys.exit(pip_entry_point(args)) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2mnAmXH?sssebqX003nH000jF003}la4%n9X>MtBUtcb8c|A};YQsPbyzeW7FKr-Qmk?- +UXrY%vp|m~p7J}K>vMsQ87fEjL@4I$zgg|H*jfQDB44_ja-vSLWu)-&aZs9vB1@C%e%JL6c(o&Z20@- +e7AMHLf#?;ur;K<)QZl$+u*JMgRPi`jkRH>u2Z}&dE1P&o<}d<;!82(WG#uU=bSV?zWcGXZoaeY6vpgt*jfQ{HBy6@Ik#3J|&4fA +}zhN4=LHC6uAs}&(QA0>am?#D+4GF~9?_Df8MYvSZRQSIEhX*LrkYwn-I2~ri89zN-Dhq?`3)$7g>r*jZ__$mgyN4m(p)-j +r;gzsD$g}I!pxGIwW5~JK$Q$$;fNl-1i}7`JZN+MVt~QgJ?axkcC_#r@@3ygvZ4ttV#uA;#7dLM1&5C +mAafwzrGr`aUdf{3zntWF}ytq$F6=79^8XsSxFF}!Ywn^l3=vjeLQL??1mg+4F?wiyORYCw3q@AY6;p +;6m>1sb;6wzsY1nijzx4f76&h4Wqg0G%!FZ8pouQDDRE|2tkNMml8sv1_aI?E@}4?LzyL>EJ-Lh?uvw +(Hz{?U vpz5_>;beZuo(o&NXSna!6o{;fHl-ZtT2j))E +)&>ltMmweu|V6AWjug)1BeGkhgJGDRM%e#l^u>JyukK;ioCKOyaOa){!?=?@D*JH?q9TiW`VwQ@D9gT +=??h;v9kMVT{os29!t6H)>_QQEr%++13eDVKO>uX1Xi%jYF*H8O$AnM)|88z={1ij$S017G(3aS su$21U WKkpOuYA~SMN#GD*ag_xYrMsb>!Np<^* {9cbXG?l<$V-GC0W*fneD%DqL$Ki{aQT @}!OQ5j0R#=!H#Do)YkwAWnKDSF2-)jc6^0M=k>N{Vx!)bbF}4KU!k0 +Q;W-T4v_Wtjr~5Pbcu}!8sr2&nl}h8+@a6bEd-6X@Us;+=v(x8sNj`ylPBmV9Jdsv_s+Vy;Iw0Ep&<^ +t{j8Ni@C*lN@Q$jo7=BuDFqhqGYfJvkYK;GH$uw~YGjS*}aZs=I*ekgTLgO?&58|XM cF)7n=nNR- +hplOJVRk?Fq%Pqxbad}|z~>;9xuLi0}bpy`rl9@aS88=G?;L;begl6MOHsjw9gFkn}S@hFQe 3A=A#hJn2>hj6ePpQ`}q<^IstV7! +dl%dg$MZDuh{B%kE*Y13+*~a&D`t)w#E(HMLRUu`1WwOLQQZdG!4G2rvaV;wF@G44GEvqEi_LeJ_9?F +hj+1Xh+x v*|{SD3^AW^#+Xvk@mk2bGw40yls%nmu`J55_MNxnX@m>S +749ajQ|QhrrYu*16gWMhp!x7%|^J+4tKGEnzQMt1v>l=9K%c rS +tWj+e(N)RgNljw&%H FR3RKLqBX89*oh39BD2`%;+@ArDrGfu 1RbGi`tkVaYAszbk${^E$1N~p-IiD9VecLQ7$ +Cg+1W}*(5ehV0L))wxu|Cdh&tiyFS2Mm;v6t_syEisXpdpXqXElE7Z@WpyKHYe(%0ZS9yoEyS|31h9> +I$)`s1#Y-Y2B=d172ubdez_jVVKH&tI)Dge}EQn%$+-RhCf#Xe|}5br#+RXtjW2GjW2IzEUWbV;bkQf +Y7=?7#3SF*UM!b!VZC0cIn_0;vtW%7$w;qmH{L~A#nf|S09&vNLi}%aS8Zi))GvmEOAN;3RD7CBGNog +QA22C6bI>R4$&ehvCo{;i_+zsAD_OrF!+oa7=RdW18pJ+@g?dZU!36Kh#LT4>^ARSlFGn=P-5LMjp^t +I5y^L`hC+wMI;FFr_!}|SB_W6ew_0cB83vs(l`g?JZXGAsp75ix9cWD3Cq9dD5(?k3w%3i|Iq6V>$FU +-lP+B*{p5Sxrm96?L0V%Gh)on;hD>qmp44XK`wa1idtmEx%9*10ly#=YGI;;$eB(`T@oCxC=$A9n3Kw +P=0U8EjbYENfCNFq@jkHz%sdSlT>?$=eA59e)#UKe;F1&Svang&NIY*{A!HNX7Yha#%MECGl%o<2)xo +oq%F{>BqKaY_epTo;Q=t~HUEB`6C{xx|@AS8yNXEgogaZW^rR4&;Vh{>tq&R}5lO%QDdiumn;Wn?Q$5V_E {i +HI1o4kZuZa7VhL4s(rUAig}RrxHkA!9# lWN==U!|n9jrOZOm>)xh=E2D~kF2?Ha{#2k?}GaHjjn +;}%;glFL2zYEQxTSJBbR8D03&dB5>z%SY;5fS2;gU}GX{r~aDP~)oRTqZVA#8Va5s1D*J6zoz-e>E7R +mI*s0QbhRYrCZH6=a0p1WYnjVFMxDHv+(NVTiDgvbo+x;}O26l`@p>_d_K-O%*w&!Q>jH)l_t^wSoGY ++btM8LD11nwmg;#6tq #1P$=oo7=V&CL_eY`Gc0 +YeH^9vU>DKz4jXjDa#2Ngt6(OtYn(WY? +#uY@i<@2s@^$COFJ`yWIDeN@>Cv)XITV93gZI2Xz=p*q { +ma_c7# l{X=YXeWBjHxtL=_uU?}14`TRZa*7pX)_eXrop +ziGHFWZq_c0_ERSPQKIovY-=es-15~BfD|K%f>3Xs_lue@O5vUm07Fz da#rfhn^-&a(jMZHcmy%zSfHt&0?Bq7!GOLx;1|2JI>ufZ9w!=%qvOf*5?BeC=`%`g#^7Mz37pL#V +v$ynOoYyB8PhSeSCr~Ki`tx^hU(@e*r~mTd?A__>(>E9IU8X%hdv)pyZ9j>xRUT1r< A>^N2NJgVzk26aeS$gLk4IBR SBKeS3;YC>bx595kgPyqmg^0P7;FJ_Fm+uQy(`6o=(%PRT7Co|D}4J-kJ(p;&Y?GL%i +deJYn8dBUvjEAQJ^Z7qtlS~;>!)8ylN1?_WF&=Q|u$CgPen=7M?+rTx;K uHm8GMxD +*)}AgE6)JZiDOkDWWqUfx~K+eM6L^Zk)*a6oeZ##B6rdAUoaB52|(W&9{Gs2q28)q5pJjp8E$X hZ8Oj{ihl5JDJ2KQD_e0mCmzbL_g{lE#!hn@3Nu|=(YW`=YSMgS2j0%bR=XGNK#E +o;LlS4P_XDzw)IYu#{{lG3tE8TGN}qo&O*paX-fs#2fKOcO(?4ASD4oW;R;8WcJWu{g#TeZ?GBbYdsJK?P$sk%d(H h0>B4H@s$<5RK2Gb&|&w;GvBOCg7f2Sx)dw!JRxi}Id;nkX4 +L~8RXw{dR&-|f8owN|+wHO3;O=|WAP(()(2T4YN8^V)x_0HFr@irf3&Cxw`?e2lbIj?X`UFK7f?3uY* +PNZ3GGt@i2uxj`Y_wH7Ct iq^X5{wd@gMVqP@jFnC?+ +NG}~*!B!)Y909$)@bHEnU{7VnF)UJMV?=(JiJ8<;ddYn}bwMBR4@lEQPp4+=kCiNkZj-=RE*wB%}oeO +pE9sMs*O9KQH0000806;xwR3`wVr|19x08{}002KfL0B~t=FJEbHbY*gGVQepLVQFqIaCtqD!D_=W42 +JK13X#(aoqZW>3v9=o#&+4Ql;S2zB5-UWDI0nFxhbs>NJ!$>$3IA!!B(a`0?k~+;FHw$@Xbag$K;&ra +ez5eeuy$^d*2)`hX*w|9^nnXO2!>Lz5``z9n@%==4T>>nk=X&zu3c21WM|mD_KiI&`yX=!KP^S$qH(e +5}XkP2NcX*CEMi4yxW?ODiQmht`yLtMM}B{MTE(WwGCk;o0hZh${cv*7??Pa>Vg`cpI%@54REWe;g +`Pn8{|iu$EesK;!wa;a0jnREJ+$c%DD5wu0}eYhF4bN^6F0|XQR000O8Ks{$v1teYv`3L|2LK*-78UO +$QaA|NaUukZ1WpZv|Y%g$maB^>IWn*+MaCy~OUvJwu5`Xun;HeL>09oh(ceuiUcd?7@;sW$;gKdF(2m +*tasF;mR>PX6|QS`gt%#f5w+e!O+L4ZWk{O8PXW+)GXHjZh#=!`zFM)$pFoYcxP=|3rc5Um@BUU(9B8 +l-xRUw=`jihYpQRqT%e`FOwZbb}n~?NO*!n@H^Rp_dn5>wz~<{1JrKM*Me_MjV84lm1(E ;+sPIzQeF<^ +>{5By1NhtuG#+Ya3Am!rbSigs)DXd1C?!PdrUb6R^*U=sYzEYh|{*7~!S>Sg|l6_ctO54AuuC?p?G7L +5B%I4*n3Hc9sQ6DTgJii+JA;pFk5*r8U{;=j#aG*8Jpa;$im;@xZBCT^oGUe9PD9AfzUU;nY567wDp; +GtqUJp}`T3jr8FRCok?wrD#&E+|%$m`fKPd=QJG_y7hmw-+oA5bI IG5VaRY)OQ?2L9&1Eb0Pi{#B +yfkRYC_q)q?%v-qBmlXMpltk^{aY(B3CVsAf~!Q#o?CU}nD{dEvXQPoF*}Gxc2czUBp?qASn@$PR4Yt +(-YNh2#$I!85)(uDssJLYfhc2*VF%VvKu-S#)&v{av$!!L2?Se0SzL>Qz#<1$!~mcx{R#X@$)1EC!^m +U@a+%%hv2QVGq_r21yg30bwxADkuVNZrn`a5%IrFd>r7SZGGA#2LmBp;esH3OxkVC##FN>UQr6OS*A| +gG$L9*};5)6ZkZeK)Z9LTvHCNdN1D2-MGrYX@>?&LV+lAdrJdA)(&vt@W%A!S)z=raN__b5 NsAe?%yYGzSSYV9$zx8241lv%+MVe@;EivIeohd>@xU+IM}Fd6@ipe}H`Z!l +Ng5vp!3}!8!<4x@xjocF(79&CnFu8$CK$Vk1#$yY;4x308|VY0YU?5iUUV#TYIfln @CDF2+_l!Es#S7{Eqs-dceb`84Y{h3q?vileCx@N7(}PQF1Ubh)7BlNR8yX9 +?-%7EU8XD5`=;p0@`IePGyE@@dT(6q(CQg8hhZf4E-Jh0> $A_dz=Q#Hx)kawHo3s!MbmOu+qDtu}yYn(5-sr+qse69J3XO%Av&<=;IJIG)%qT)8gTGk + r^Om7^T6FQ4aNOgs2<864u44RTk79 -foLoz_%BwAe2!R(I((v%uVINje4=4 6mf!6uXIXzIbjLvxaq(6T2O;^qbxF=I{};&`$5`VRW)4bRfw +QHf0)@XIL_v|(bK0gaPEA!eMebf_Mj0pT{>wFIgS%RAs???Vca=XXkxs=QoJUb)7~=Yex~&i71iwb~T +7?nOuHq)_Hq@MfRw=`^A5XuOpzZWROMC7t=(cf`|alQF; !Co)YsIo@JKYwq_r7-oWwJ7Hm?4?mDck +0ac-8=NCSluDpcBG}bUOBywUW0*~U|PO>tlQ^zOl9q 5&vNgWM?j5xp?brf)txan&nA0-Y=(OzoYdyd`J%7g5=2?2#oC-qYvhM +tV3(GjRy+0kAB>C8{%d|q>ne}8b9n7qo(_a>!9dhdUEr9HKoYOVy5TxCd7F8&8lO9KQH0000806;xwR +B3wSlBWp(0Kpmn03-ka0B~t=FJEbHbY*gGVQepRWo%|&Z*_EJVRU6=Ut?%xV{0yOd6iggkK4Er{_bDF +da+o$@Crq6eSv!}nkE}uaJg%c-L|-1105| mX+K +JEB9h1{qv5ST`jla@sm+a_+P90d)eHFN7dSvYco(PleOIL!lOBwS*6vU*<%YT)-S(ojw|+B7Ix;}wzA +FgN70l@gS>d)bVT+jw2`U_MD85MjsKJPZ(|O!u|hYz&SX=Hr>szQEefl2;P6g153j=F^K@PUkyrFM5W +n}UZ`|TJ;=QmOhU9_ZUf8@874K@Bi{?>k)$B!M&yuQA)Fv~6M1xX!t3_o3qua3j9;-r&rV!>Fmqyrw( +hp!`V!OSU?X6!qN7Pw~lPg&Z_{xfXpyK5xUO?R3?%SMRuUN4Y#Y0Z+&DEh1dd0M8YwUWS?_QcBa1@Q{ +w8%@TXS3UzcW+*ObMxxk{PoMboBYjpcWlGvmp@!z?yoP)yUTCZm*1@~Z~r}?&1MvFaKk2qUIxRyb8Cw +{Z}?v1`4Zb;YL=7DjYTw*#O~$dK^)i2SiNM|f1%&?jNyaTe0#LQfG_@MFe-eoSh|-)hxI-SGPC0^UVO +C}NS4`7JeBfZ7~2zQVLRP8I!IE~+!*p&^@=QZOY- nYKlaSx5rr%E=+Lk$;)- +Gj!#I_Y>&_{^)`OBGoPIqz>HW07bu;+r^=_9iWrsO5FJHf=0G?p^cQ4Skr6$v)1K7UM~_Sq*Tn? ?b7k3 +qHx_<8!%NU9Om&ugNFH{^XCy9@fRyHu*Rsqelr3V`2g+Yt4Kr$c96}cEa7Im2h(3Mb13EH-EcrAWhzx +%eeT=sN|A5yn%n|mT)(%}zb=E`u$- n85yv$VpN +WvvFJ7-Waa=0XNqhbv7$F&~%PmO+Fm#qifV;|a93M9Z&P7NUP@IB3m1nv9HHp4ghakcgY~kUxOeG I?xlNa~v1tB4)n319+m%CUwVJ5{F#rV^mZ@v_hY0!N{A0{H(;!ILr}$37=2!{bd+ccpMT +AqbgKOxi2M1UC-GtblBXoh)`#eb_-O>o$+r(3xq(&%tfJW&vzg=}X|Z%{@r1lSqXMx}raeX#rb~n8ZO +3Hu2+W=a-WWta!2kX3B2g8jmwbeH70eLYmE;?&w*d0pf6k*(~NO!03EEkB#Yoa8ka{x_~gSO5?1`4q9 +5VAaRDO7;&Fq?*+RJ*c5WoA;Gn2MIkF$^xpM7#DM^*VV^o oN}9poW7#I>{0(L5|p4v=8^E3cgjU_MGSQx +kC;Et%QRlY$OhB;6SMf4&KCfl%qaPONSlMxReI^9bFc5?Y-v6h&^fqx>4fVxY&2t&MIDbyC&TG&aUrk +k>3q|fC8pN;y{$LsTlgjHv;`P&w|_@$ zNAw+i&Gl$4?w%NG +1SrAtD2FA;rd>Hb@=i;L8Yu8anyP^SvD&%^YL^4-)&8UI|KQMR}62Ok73raju-|CJ3PVS|3X0EjOxkL +0HnW}um8S;dpKu2vv7>kFDxz3JsGss4mT1e+%**I>*2kwx_2^h?FyoTi%O(VWs5E28+{&9QrA%FD}V3 +NOn`+;B%oK)qDcVASAo$6QMYg1_1T37p0Z=Is@|M#17iT7Mzwo-26qVG*ct_pM7W<(JNIKMH%zoais0 +3{THw0T|(4dkYGcQ&j<&=eyzcublK%p^sl4vP~OT(H*y^U7W#ET!u%0?NSdXv22S 5IH^wLmgkr?hel4+S)1&1OT3)Pfnv1DJfKeFGl7hmD +)55IF?(}s5B>O|7SG9Tl1=0jxhVe(IWg4Ch90eByK>%esrJ1CI=`I&Z-{=9d>I+#rdd*Vj?sRlVwYKV +<9DeX=SQy0qSAwS(UY|?9n%(qEr9M~h+ X09K^B~I28( +u?uv{b`XVY+)7YWpHXBM7X)M~pmmFh*J=#}^ozvv(I$TTJDeYVG&nn|N!m<*;DCc|1f3S2x|eU$RPn! +Lvz2;8~BQj^3n?XWWz;V>5c55+E1>)_7S^U!CvlzW#kJx0|UX^qGhE4qyT co^V-? +LneOO3IYM3nJhgddt+tvlcz8H(vhXBW0V;&Je!sD>8ne;GyxR7NV$bdGl_Z{LgOI`wHqaWkND-jtf%4 +Yk%|V_q+L%cOLT@7dkh?rWXa8B!Xu)pRRKs1t&KFfs(louevT{a*Q2A7jZ|@>&DoZpWMIG9j7XE$6Fz +5K+o&_}aq?XKq$zO>y-vCDKz!Z=zc%px%gqk1DW Wub0U!FT{(Z!#Q2RY;i=swj4v +km{Pc&Qne$Oo?78*L7Jpv*+KAtM#LxFWgsCwYX=-|wE@ud>J>*WQJDi`(!O}H?jMf7ZbqU#g!B#O=w` +A^h~x1Da4zwVYp`-~MMNi!M>XcSI#(lnj}{b>H9`=1B&Iu656y{6g0a3o$A!OsPqaPYS#t`cB-V`Uv3 +x6`V-ADW@2 LH3KdfH(Kj!GnH5;LQ|@uqwZ6XUAL`Pu!PBKbc!#EeF-=fF|)T$ZMeu +t#0F(7;;Fw~rYq%I5HC)!$4X&gd*9n5aJY#J6Xgc@6NJq_r>6eGuHC)$JW5WwSk9=SfbG(Zod2LYck| +J?>$$ikxHNyJc%-Ry6)lnm^OVOaO8(OjKLcOY<)CL&dmklth8r=sx*TRlc6}Y@K?rjdA~c(?o @6 +aWAK2mnAmXH;_CfPbb8000v(0015U003}la4%nJZggdGZeeUMcW7m0Y+qt^X>4R=axQRr-5S}B+eY$T +U(ulvm_#_-ILNUpKmiiRUKmK?z;?0^g8{)2TM{!A$*{>8D?$E!tE%rNDNQze04rc@sgLTqukI*{UiaG +r7eikRZO?Y_cRN;fSv7n1aNxWaY}dC(_Noy>QP*$yFJsm7BX0(gt)eJet*T?!_5-Wi{T?>ypRLHcVmR +oZJ=fpFVH~P@ML>sBhv%r7ubNZJp2H! UJD_CRk8y +32KnlRdc7IeGA{uEG4)e&2x*}4g^f(W~6fdHX2eGcD(!S*%yz8k@K<|P A61uuIBq @?C}2R0)N|LxozyN6F_H_4{ +Z)(a~tlrW+i-Gt&sJ+XB+L-GBB5KX)Mmkhva#(TIGDd2N=6H?>VgPdA4nj9dJ4BqxibG`t{?hzvbD@N +6D4_^}$D1Fc77<`qkgRfBojg^RM2%0AOENP0^pes_XWFmp}BNrrTmbu-YYFUr&|iCS|uEft%IWD4sW5 +jP(Fp$U|PE-<;pGG;_0BtxCRQ`L=C_0u;nh7>hLnH<7TbFX_bfiopj0z&9LNc&r+Z;bJ%d)8HRmike% +u?VVtCb;nuJFbykP(dKnm^u>_@;CFV%(1NIX!87(E+h-7u+N)2pXZkSuzX!eR8^R)XB>>u5KrD+zl4v +r-p&h|iNq1wl`Iq&K5vDZRaIOq{P2lAyc~>+cE1teAYQf#3w6m}W!GyymG +mIZ;G#ROjH$jYedslT7?mrYMD@Tr^F6y2a C{lf8%ug+6a4na5tEKZoTLR%M`CVEgj0lr`-@ +Kb12KLB8up1@Q@cNh!;r60B>1d8zyk+}wf>5v2AGB$zlJi>734Q=b%s*y6MyWRuLI+YUshXvcm_UVD9 +>K3uG0nM>gVrz4dn{P5xj_W9=@GZPVA)d&xu^JQuw^6mtF`DgI4CSt~kclao{ipCE!z}jb2bzMki> +3X)E=ujGC`1pVW#S65`nI`P^ttu4Pq>pRYRy$Q-!*uOhCglaK=f%__A%Dssw?lq`@;qfTWTfAwilDe3 +=VB3i7BD>Qf57S$EPPo*ITk{x;aP1;wOPmb0gH{L{(#e~v+()XDR@jyDI)6z7ypTyVvK3sum4XAYZF$ +HX^yb~>wO8~E~2oJ2mrl4J=##fe8^h?9RREX>m6aM&k~SiL~q+~7(I%nyQ8h&+b#y3o3&%)*2*`ag_i +Dq771G$^q!nh8kJzznNK`bR93pa_Ai7oka8AjDEu2r(Wh1vqeb26eT#FDg|QqD%GJCN&c>TvqB_q|~9 +4xG2a$sK}am^aOsCfeoE=#5&4K#2)2Sr%sy+DI`Pxz$gn@r+ds#&)-UMx8snpZ(8X@sc^K5#-^rhdXN +E$$Skl(J&qDDRA!jP Cj7$8SdWk;2|)75V?&($orLfmKy +Gf~3?o|%Es)>c=b9rHIHdDwfNHW1Jel=P%c60JMz}O~TcFYL_XDN&nwqYz1{hOXSIy?ixHCBu6rZryX +g&`W9#A^M%~n(Nq!A;RX$g|}2=Ao)E$&!5Z3kuIkpG40sc)WW2v~KsJ-8L6?xn7{5ICfhxPwf}v1K$j +Wo^>(eRGo(7;6T`QWozZn;9aLMZo~mLqM)qkdDqzE(}yS(mf5?N~IxcE*@Z1OCHZb1doHlJ5ckpu#{L +05G`6KJjMAM+hFs-!U?a~v#NHdylsfkSv61?B1X1!`yO_zl_*pTjLKOcXwoK&brOKe5Ji%R2Utn!6sr +zjhRROM?RiOJ M1G28nJQX-lo&p$T&eFxf!86T`=1dy4r-#+MnpJYaRusWQGG7 +#9Y7-AnEV4y@b%z?0923(kLpv6I>&E-lOP;9|b4{|`Yf`4Ni(JjY$PO8b++3R!EUG!jJ{qI@qAdLLgh +=nZH-AheF4tS2Jq{NzVR _8QJ0JMwL`~;IV`)wZj@6jdd0Ccj%DE6hrK6;jY5+&qNWzj>KG1L&ATAH5sM5iVP`x>DsVsH$@OdGO +eK~?IfpMJ~?^gxfmwn&du-7=?6iK9ZwNy_XVedOhM30Xxq4wUVo4a!03W!+wo0x7%nYuQJG8tUG2h63B+xP8lp~cQzF3wgz}?)Oi%Po&&RmXc J(KuNyVH&7o6Rn{up*YGu{R5byY>Q}<(O +gW3}(%G3(62-QXcS82#Y(`{rp%``dvuA%*;jtPHbhuO$-rQS~Z6p9@Tjj*kvnn~RjYAqzM=w)f`O-k! +QZ~utjlDZ3qg^YtHtRfr;wMNi+*HEyO^G*t+#OXC$bUu$NbG|n^9tEcz@^-+tgU>RQ(1)4bbea`CeC5 +P|3B_0{wrRARLi^hi0`VV+$hr|2J4Fw%V#HlMt-@a)>02I*k*!-(fOs7640coQ^y5t@TO<9VKR@O=+( +Yy>7L-~O2WI6@KC^wy}1VE87Y)Y 9+p3A(G{A!P +H&4R2#REHlDTCO&C(!0Kz#<|fD|)Gu9ou_%U22h>ZaI4ch@a?r&kHOUWxGfQ`nAbrH{cNk)UKNkOE|v +x %&;X95^D^LT+x`~joG%q8?zD{*Qeot=uo`@dC6|9GuP^L!+I%YQIAkCqf +_3DQdi$mETsMF(ZdXY`PSNEN*8qQ?7JASy5&bR-p$XF3w?wGRBp=C!Z%}sO2Ev8Asws4?IavCJ&xdgj +;}`+`&3_b=b*IPP1J!PK{fpY;iT<@43sms3KOxIc73SvlM0e!aT!N1NpIy@NUkc~s(y)5=P oR{9C7wRjZDy&TJAXcZ)_!yjydmrf~J9dwK>-@sIhU`?&fam=#7XNw_DCj)xjrVg_Fk*j{qUvhuJ^ +5Y*R*T`5MaN`X+@xU5HDH%!Q!HCi-pm2mVYJk=wSeWqVRxfQ!Jhfm%c|!kT6`?t>rbw_Qw=6cHLu9SF +A~H|Clg6=(K=p8GIB%9(fzrIOHPJaTI6IXVVKv)-_Pz+! rkxpp*zla0XznR&6bz-yz2S8DE#!MaX7qwIy +esKDup8d$hkO!#OOv5xQiM07%&)IKq=*@x+<0tVE)r39<&zHW>``3`v2VTbUiGGAp7;ij%?icuB70=| +m$@Bhb^-oYs0|XQR000O8Ks{$v&UflGXaE2Jga7~l9RL6TaA|NaUukZ1WpZv|Y%gPMX)j-2X>MtBUtc +b8c_oZ74g(c!JX>N37a&BR4FJo+JFJX0bZ)0z5aBO9CX>V>WaCx0rO_SR;620qJVCln O1LE8=FVBjt +^q)0dVv2S4$yxh% |8(o1sR;=Z(ASP3{zUhoDM!B}3^JU@Z9!W=^OJ4i+~D}tF>VR1UqW; +dM6{V#UBf{mRLH#(=_#5CPeO}&Bx)5VVMX; hqm`{VO{@$3En9zNWCzDr0WG(-jXHg{IpL*qv>-O0xMt)7JhFxSDlO@c~_Kkq;O_9@xss;#+Bv(1~ +;c8~x8FgcwF{fbh_HZv;$nqkkXlM-MBLA&L~>bWIvtXg)iSgXnVX2;HVQVKaIiZP5ME^yW}F_YT82gK +318iF#7BE_z9&VUu0?ZUZZkQ^y08hT=@KD0MV%PmM^JeZZ}e`6D%ZfzV)03Z3O;AF%6%ub*hMWQ8-VD +6X6IlUP^8pevaGQlteu2aymiqo1@RDoGHM^?8tp;ib$kc*UG* J%=GbVKDqWr2;a@cxHvC8C3h +P_id3It2`B$aT+Ie!FnOcRz31PS0-mrQZ;Ljkfy|rias&g*yTlheaEdwu~J36Z1BkbQ<8ha_Qn{&{7 +yJmgh0ji_uh^%XXjTbSxhFYA7#f5_@7FR*lMWu4I)Kk~0HTS&j}_mQXhYipuh56#k_wm-rjR;U@vq;S +U-K|3W?)X^UgtkOctrB87}J#B>n`0Lm@Nk6FY{M%i}E3AR)6(yOt`0-VfhvUUp~1xDA5O-^#Nz8S6&M +V^nmIzmzX|Bjm*=%8j;1@*nzk|A saXL70UsJ7F1679G&h(c#vQ@!dGl}M@=$5* +2=S?pu$N%vzQ;7c|;o~Q4FkY{}O8UKy*hkh+-$p`Ez+C5X{Co!kInr@NGr}nwhwqEYJO;ycTi=!2!Od +m^J0VH_7j)I><~-a&;VyWU%yN6?`oFNAFrEC%Z0s5~^L$}CJBQ5*`&@Gg!=!)Z*t}~l+l6@zh`Pc4S> +WH`P^d?(C&k{fQsCjVERjqtmjadAAGpeLDz<74lNCfHJ@w~PSk6IXhT4PP0s5&YD!B=bvK;z%N6Mj+@ +6ln}`B;ZV;xmX&f)P2fI 0QV9Gt$fwYA63 l$(&%5?L(sh1CyZvhr5NMnqK@9%7cd5CJ?YzG#8x5ER;6(pkDP36$Eh9LjUV9=`$ +kBpWg;&=#C{qHw0J4 QJ7ydlHTl-3V3cp~uN5%FhncNZY =uB +N?w2f;c6Hxfvi7|z{*mIWUPefqL`OFow_o-1Dh*}=HCZ5OX?XAbeGJycO^vL>G!Cka?49;AJMF}?Kl} +olPPSJP3jtu~-F>d!UDu~Drrs<6>^LgpVFH5uDJzWWv SUtdBW$a)X({&^>Jj8GVk-o y^5!7ot994L{BFdDM35$XLG2bU> +A?bD5WrW~3Jx*wXsIZa`j#(GB0itA4x{^N$m?lZg1wCceE(eS0M;hoW3;YNnzV^X|uR__Mjg8DCTC0F +R_Yr?T_ye436pya;+P)h>@6aWAK2mnAmXH*vJ8C(Sl007t@001EX003}la4%nJZggdGZeeUMV{B &sxiyQWDuV_g!YPIo{M5VS &m{2ql$^Y{+9YxWlu#&yg+pWk`mSn=(DWg{-Gf_(X)m5o-X`?6_jnuZ#rev!sPfD#b8x}IX +UaNe4@EIpMU#VtQ7iA%gmCbhpZuiY=X+$EIBKbU88NF>_SiSv8WR *9Ib|P +|EvM|ZD3#7dHf4*d$mGZa7OIH(v&>U%Vxy7`JEYBoWwgOtZaR=EFQoy}ILTB1O}43awCst4(1lYmhfY +fQQU<_U^Y8rXFY0BUpTgi2VOl`atrzgl?M&H2kqQ`VeI-|-%1Zl_%!>EgY()t)r_kC`l$8Zvsk8z4c* +O8r-{0TfPu=U?{q?8$?ZZcY`7r-*#job~ytDgo^YhK^uQ%PLPxJf5!`lznH=p>;?Sj9*eYm-rjwVA)$ +d^QV-Sx>|inP{_M_GSd8>5Y1xl&@CYg?-1P8FT?c@ClA352w>d?U-9HlLxnTqXy5cSb%dUD?Y@W$BeN +ovnvl9pf961d)>2c%?E4k1pl5@s5p5KJ!A98?JZxuqixj9XSE;(&*1J|5&C7!ViAS(`QzeRl!5toy50 +QHVMeqvgC!)>nY30Co=V4>3BK~4G{{Ss>bIQ_=awvJZ<)ieIf7V8gXX!6fpH>So(Ub>r5|2#%UR=95x +nf^5(E${t)A{GG!$)nLh`drpjTpHLvni8s6@YMx4WvoU<8wjB1aHo<<|mB!X+! r1T!IXqI35Vz$%XTo%0h+<2DX6`nUmHOeAP&Z^PdVjqy+SQ!Ins)IPzX(NQ~}SDp!m{LRE4;wlZ76U +ZC%g!R{4EntlDHtae$tk7vTp|ITi7E w*s6delej@V8MS+$5fcf()1UrEO%QwaTYtMwO0$7{G;U5d +8ksp5_d4zEl3&hN(Qm;=$CKaLZ^X>+QUBm7q_f! 8U5E^MpjIW@=%U +@&QqOm-ai!#F$*v4_MxT^-TI=bQjZ5A^aQn%8CwKr!SyV&8(n273C8Nm!%EG{jk5JOTcdOr4Ja1f0 xdls;vD#!lhkA!#JaffN2+N3MMTQFR1B(f0_p~wRB%?YdrGHp?fx8 +k#`ZO0wrzH@a>)_DD?zLB~dcFZ%d9h1NG$OX0zt=S&5A*LvRyUTQLAS4T9k``bCqh`p*sz72emI%A5Q +D=Y}*G1g`4WNsn)?N$p0{j!m^yj)@mK;N%4h82~?ujUc4NEl+xj$qT&}TLM2Aks}9wc&ObO|s;LYib f396!Kuu Uh#Wb;uKUG(8_-f2EMhvIF#?s@hG3W@eXnV} +*YU<7ezw$+ne61C2taT+Z@YZz-Wg>HMrtv8-t&G*-=yjEk2JE OMR*o=iFv<~Wr5QjzVc1EjV~3X{41tI##Oh<4vnW&3l_ +OzN1^rdz$wSXy^-3VlDto_H3@O;5g%NLU(b);@G;JU9@k&-!o|M*?(9kPlq4a!|mqKYI>8LPR8zrM3u +)CW|Q~G8h0hsw_m4sN_4C_mI67a26=nYm%KeE9k{!+0xA9v&?v2ZI`a8>2=xtlGC7{^{E{+6&ec4w3! +8ZVWEEvf*2yhX?AGNVqvh2IAe?3tJ@2 iK6eLK~(YuF=M%KqurPBUH@zTaq*GAeYcq3-gu-eivO*VhX%1t1_^dMc_%BS4(AO+t$vRo +1T&fh<{+WP`e53Y%i76}bg>R!Uun!T{ho8>2%Z{shH|%`a$+>Jn3+X3#sm~n9?~|t$()hE&(4UQscIY +;oW#-O2rGtNQdc=18v2J-mk3BoL*Rj(4!3C}=?$ynqa%|cr5sM&17Ih$vlAvi3it3t3q(}NoO|}_JNt +^Ecq@26G8s~0XA_1cUWkE|MZ@R_)*su!D56ttlFB%IlpA73WF7CP5TQGQo5&pWEul$c_Rcwz>&T?pDr +?=8K#uBkLaF@(GM8r?L1J=N`683bB?)Tpe7jJkddl{?3d6_=Y>>d6eP!ACPi&Qmb$l?@h3Cjh$H$J{Z +^&u-V-uVrdh`0t>vPI<8B%qG?xBHONr8?=S}t>^xZ}>{OHL7;pF_U$8p*6j26hE}P8SPg9+B^vbg6PW +psEO|JCPLl&LMWra7~vk3yJv7lRayYLj<}E8A9b!^G; ukV&B b-09u6#kBdil~R@v@~0osyoRK$mgzqPl-2p!TL24HpL1J@tCCfv +&1=d=Y2}T;ev7EF8c5pyks6acz7#*_ Un(L_UG5Lda>g$A)Za5*nVM5q +%BgLTuCy3QgEUp>Ehbk?UvwjQ0+%h(EE=i~!c}L-M5kPl3)y%OxG>0bP!EZA!H}!myjWw{Q5WLmf}-3 +oL(QS5Hmr2i=HAftLwf~(b$$8p QoL~Q&l+%`pGWFjc +GX3HwoP(oI({Kj< @6aWAK2mnAmX +H@&TcpaV|003@p0018V003}la4%nJZggdGZeeUMV{B uR ;o!=%`s +GwO**QYO}IvR8lO|O lynPx5>ltGCdt)=5(qYOb^52Hq#F1$39SE0v`9<#>=(l`a+ol_mxJuj{P>sI5Ml>-J9TLR +CrK=q6TGR>@~|qYGUpxrNu>Whu 8E~vFOPG{Op=Z{#x@e(!o_mvnF +UvB|%R87gAY!4L?52p1BEaI&BZb)F*SM~ 5hBQKXiec2nyZz^u2` +b_z49v$UP?*hzl;bCNgu=qOuPW! }zB*MKIVO3rTqHlfY +Dy!iF(?ELw~#q8zt*Joq(mWDRJUm#1EFK5`T9;@Gye4`tNW=1y97J328mv`F=Q6g_n3ZTO&U^bcOz&1 +a@It}0?AFIm^FxwG#1k%Q{Ti}ASj;kbnm*A@7O`EwT0e6%|mL_@j4?QcAb l3&YC)%RW)qA_kAGN )?>3NVi^B5JsZx5A!f7 +D(a{lzELA62qi4LQW*TWRWTu#Q7@M0+?H*V+H?$>3YVw16Qx _U#e8umtVTHI4j&^s%Pg#S4UEQs;Mlroqm98fZ%&dy5Ey!z6rGn+5;En8tDc~ttyQ!c;4Yq +<+>!sRM3sl*Dzs`)Yx7UH*j&V9*qNrw50sjIs0B({^-eQvuuA6YrWXo^>w1nKc@n87**nr`+Aq_wP$Dok!{05JHAWm0)*qxJ|~Pb2cghJUfIBQE0>0y78{M!MCm3kCKFn> +m`W-NVLgWTj0V#Hp9mV{Q5=nJr%|w9U =44DUVP>*>De1*ntxqsKp?cNX)~DJf%BM5xDm298|Z-MMYt8ZSed~VhE*dASv+ +0^WH3`=TLCOO(2t;3``ZW#n*P_xJlpdIOoLpb%}th+Yr{M)yM=ghJ1dKPi-hvcq9H6}I2x-D(G)N~jX +pBFHniM@MrTBWE2Nv55Ci}WcZ5dA{`%8#FeEA&M7f>wO;Of5fbP%sk$T0PD#ju5O?g-3WwL0*uE5zTj +~I pNdSm9U| +OcDftY(z>gn~?vt7o(m8B$LWFn>#`Rc(`!uMgz-i9UOv8N3fOQC;4+Nz$;pVvyP0IOqeexhA&|k7-;w +zSZ<7{2e}clSQn7aXj@GtMLB`x2`T2J;{*b7!Gt;DnAps=>A*6`B4FIXQI UH( +TuaKVxU9*B^sQ3Rcn^U{Pizt7~u-gGVtdbjclJ8c%Y~M@%%jOYM#bvS#5{At*=6GXf5tXMsIJJl=SM5 +3l{pw{X2SOS>#dh{Ai`~YBsfThO0P^O_TuvOC*GOQ>eg7ZnBEZrwIa)ZwuHD$C39y!c_hv{CFH)tjat +3h<3#YSz*4pnW58s&~zr$KbVDs*qIC15TH%kdZTT7GH*G2 =p~?oF`*4$eWUd!dV}F014QV|e +AJZL$T$^1!15Kc(5s!M6aht9= C~w93R8r|=)jrKVkgb0~6XM0m-X61Kfwd;w| PY)xt{`)3_`2nPMljH#MFtiAqi +GvgEzH?6*ZFX??;!Ci0LUB^W8&IEYpL#<+ZlYvbKFa>hN05G>iE9q{<`_naiuDdOOMoxX*YmPDjCVYg +2$%pH;WLAXwA>VJ2M165z5gP+g)IWu!aY-M+StZufEN~vtcCX+gvO}$oSYco5JJ*3)n?#xiPR`cupx7 +d${fN0U^7tfU`+<(q125oz-z`xs3I_UXuyk%3^f{3Y6ndCw}2W5rb`X)+1`nJ@>hBgs*#^$j= Sp%7>vRIG^F4bR8&fmOx^J1)?pP#=yXHci-uP$Gmp1 +d}q+J}?tTW|tK!DjQr;D<4#fiM9G0s4H<@}k{V8gRHOv(!+Rzcj}=n5RP jI*ABZ|@##!t^-^l+mS!TKRpMX*5 +HDb)V?`z#ApqGxt;Pa5|J>U&=1`iM&i4rNO_$UsU2>?0)l@-9O2k^op^;204z^7>5Q7nYuc%qBGcSV= +~@bg8NiAn;w*A@ATc3@c#ym`Mpn6ck)yBuwwFqXlP@60g@rIzqzqNuMu7eue<3QdS99#-Bh{{5QX$ME +D9AC|RQ0C)%(WjoYlpw1nOz< ;*PSO>+;)UiIn4F6yZL5JGqW +&YZf9&>Qkv5Vg;+OIumV+fqXSZc!h|UYUQ5u~F=m?uJI+l5vbP@72z{myq qp)9y7#<6q2R^EdhdE6(oy9&)n>$B&-OmvZgR|2~IL?KuVp`iaZ-=K3B`-^ +`?n(r38y2V(PAW3TYNFhH%nxOfG)@pEZ@migFV1Ls!e}wf7P++08zbMm yRKKrQ150SyVk(PLueBt~=Cl`0s#j`h=n*#l1qbPvSCpp5q`$pN0%#p$Z +ME`LMMic4Sus2p7beeQt`?1yjkUNeR;G4Mjtmef>P?N~Rt>KiKi5-n-VLd-(a*<111RA!^i+q8fQwzN +4ecR!zVpFBX$LE8aDXP6>zwIvv~0sLf|E%F-ib )aeRbTG-PYFbaVy=tM{j@lYYY`3G%EI){QscdL9vkejalGTWA>0X?wM^zmbw9cC2{ +fZ^Pp4g!@lN2DB0(N0IUxhDr;T9{Jg_kC>^^xNqL>QKxyVQR}!86_8h$)FcLTO;X#)fx;;u1fG=KSN4 +LzX|r+A-E6pK{U7Yefjp{^3BOF&mSZteo5+goc4$VA-?hVRMHBwnhp$kDr2Q@HKMZI+^kgA`q*2PfM- +O~D!J8o*nxt!rbD2YmzQT3U6gr;cb|c=G~6x@$PV^A_+PwVJcr!j?bHllLQ>`s5;^TALqz!pln5hWH` +0BQy5L8D)-Vl9%e6s6A8iuMMMLa!@K%R-^Pub?&L83HU`~#{6{nC|Z21HKQRvd3*ih4a2C8(3Dg$9xg +UgFAM-s}p$2~H+b1-humRR8gyk}-XrxxJv#DFzQ$>Q|j@T_zYEinF9R@6EgF$Ju+6{tq+CL{<^i4QE4 +QHb6dpDtknYv0M|3=cWGr=Kn*a3>kiCDl-K%t(@x*ks<|Z*wM!O&ZCek_^RL$=i|4AEc3tij##29_)H +RUuR5nvPJj%1T;(EGuAeN$%47QuJwM$(6uqV6J`nzN1doNEN%{FjESkr*JF=FVc5*5LYpLnX0c@_VFp +y4ZD}^*;L>@K!HJJ9ZZV`CeUE2M#6UkhMzqChu-g$eGiPooIpc4*bGoT(^tfQ@(tY5ps~Ijo%)w!9@N +%|779^HBDYiCE>jh>zs7@XaXOzY!1*(&v*TYp^-Ul0$vpD>G%R{$8H|>(58>m!{dlAsf`@B7Z45(P zz_r{e$243U0lyQw336jUCek5{y*YoXZ`nK&fvyz%Z^6sFy@{lHu@DL1^3vMHnV8g +iwFkkQC%H5(kn}PxS|^i_XSrt=1z>Sv>8K^4JF )6kOmgW +rMb=JQ&8%K+>Z-)TP&P7P>w)8K%G6Bi`LL5_NkxZO{4>MCPoVs@t4hR5rR(dk^5~QS^C>yynjmN55qb +6w(EALJyq 2CzdX$TVEnvEb~hjA#p;5SvL@qPA1%f>MbwWPx&hD{pyOXx6v@Z^BU>K2xH2sK^`(K*aWt*x4^&! +Ci#~EZm;!%A#0uP+>CQHVmoFNd2Im?G(ujQ9VSU+}0SEYFD+^mLd$=tD%To`m+c2_*gydth7*fnmS5M +Fip7H1n9~H{VsA#Gj1q>yLxhMU&t`*U&8F4hPl#a liD%@b|wt?T3S16JoDmkfc2XdNT +k3iyeR;%H@J0He@n?}rky_n?qeh>tm&TaIauut#rnZSZG0h8!wH4XpdlzWWLWzTw-KG$6-4=wMTI6Z? +IZG`;rhG4vMh6CIX2U5|{nKv)#UprWkcP-p*)rs~6=>W}dAV VN9pvS`bmqu EI~(FZy!n&Ncnw6 +N5cDMO)gF4YJ?PIhNT>xF>U@(c&2h!Yv0~noxf`m9x-whIb0s7^&!P=1xzq()>&>35-gW1*Q^`F5rYh +mY|EWofu`iu+TsPG-{}0JP`pwh^u)PKZ&1=NyC{3-{AwN^}qu;0sZ}ZSx?qkQP%#pqp2i$L%DYx-zD` +V8parZFdH|nKh7xJ%wji$WjY6@mIpAxL-D>>mNWNs{8C#^c+1bW4+c`-hu?nyVTSk`RMlXt2ET9dXNs +TwL{GruAgczkdL?zSh9%@2k5r$;+k!-Y$Kjo6h=m<1G8+fgc7RL;1WWb)$xo7-0<^a+KMT!3EcrW(h| +n{j975{S%eDDRR=7|O>zclYAC55FYCHSqr-Saf=BMc3BOigb$&JIh2kO&i`;M)S`0>ni57>T-UA^E-R +{#mya>FiJAq9eFfbi76Q$*(%+i}HPM@N!FXAaH!+`5om(E7j%`QUyEQ}H}Z*Hj{HOWLVIzhhCDHh!VK +bz@8zqPJ0KDcsXCM8bV7ktX=wyHFumS+^#c{Tc5X4qj7uTgP$G!ZEX5rC12P<+#AMzA50E?y2s@71%~ +${ceZ`+o-RUH?%y1 bGUOP=3Yj}QQoB>@mq83%;x5&;P`W4@0#ZUoJ|>&EK0#HGQNBV4 +vdZ|;V@w=e1(AoQp&Zrm>&d=Hi*rXQ7>u$GcYLmo??M^G%zvMOK_2a`^EyOwNny<(GM(m5HSu=XLz9l +77(Itn`26&K
s5)1&RIqjgJ64+yMW?BC1vqQ9?*mgX*_bVPy*i +?|JhrGd>;@0?YPirrNYCW(&q=eT`<@XK#Xju|69OeCfAfTx}{)N7eiwG^D-%-Z>K!6 GcLHaBN7FhonCx(# XLp@_(?uK~)d?sMY=!$^wqJx8H +kDa5=1A8k(=ydJglyP`55LF+U^8#}^;e$5$);y@B95rHY9OzIIER$2!h>_d3#?Ek`T4s= ImVuiVIB&gUg +O6DxnunVc8`(p#-cggmN8mqOU3BDwhZD&zfY*VAQFuY_VNrk3T8@1P4p0}Mq wbVy (}sD!7Apw%^s0Me|rm~v3(?AQ oupI}v5gV(I1y0=|;X%Z-yL1P rOb;Ld} +b>KD>zi_DJA($IbCEo8VlCs`VgtD!)F}E%FSH_RMX4bn#u*}Ze}@gLP(T27 +p}ADwrpa89%^6`}Q6lz&gcu3SUQ&Z!`HY?L#0K5kaY +H{brtv~%TSGEWy8_KQs=5gNN_rp;Yp+?JFu6kNjou%*fLXdwuy27X*O#H_GVRM8(kx@q(-Qh0JkEQc9 +$e9KNSnNiTAyNo_U$DkNwpAMP2SJ$JMxp2sY#*KoF50f$2GcsZFm$-fjHe%r;)(61mM~>gnt#MM3b?y +q+3`6p5#sX(HL%yHQ6ke)G`E><)cIez=L9ZT4vV+`2NDw~L5_aOClk|f3Kl#Fpu6EdR>=bvQ#K^FumW +yQ-kThLUc-5ZB(wvO`b@y_{>Nz{d(+=Yjr!J9IS#X&f=wvT{(babWdcq6tdNKEKIWJ^1JJ{AmQTm)$o +T!qU1d+h;0l`qME1j?wG(}CZx(uU9nGx@FjY(mT23a;*K%FW`oDIBY3>z<95Q~DAZqhvXurRnMgAPUS +xkc(81NK~Qm9-X}jlgBzMaNuQ$kpSV)NAYsb4WVeU)vcJ+w&c_cKzY4`QeedQ)?g@?U6R!A%mWgc|x~ +2mhP5q@_)Q*(tGZ|#p`ap`^N;xb +zwh&l@wCf G7Pc>#v~sqC$ +zqeX)|!1|a|e{L3r&WsV3W|F;9=gFH4oMv!6r8+ejp>fYsMLCh%|$Bz4&t6Iar~)urtJ0!K9TU5y#U! +q`FtIfhOhB$Eo)caRvT!`fdWu&(R31kHHE1&G5dCZ}V&}&wQc`4OQHldx>KL^ybf6g@4E@G9?`TRn7c +e$ofkB;PTcFlVKFbtaPOdb+7Qx!?Jnb6K29-2tP)ceZ=bOp4Zl4EX7_VSPXyMo>0-HUkLJGm1vco6 +10(QTmaYhHRu+U6p|Ab9_N>km!$<+%rPW1M>sT*~IP^X>t0Pw_@6@0+^@%X=6e_{uElsfWCM{&Ls}?} +ZJX^b1 I!T8VT&yy>(H7~3o=t-*&uIk1j@uyzV8_D8 +x9S&=0 }GaPZW0j=v$wA=MW-tZEk(Wt1-hKNl`>N6$m@T469901To9Npk +Z91JRSCF>F3eu!hYKf>|6y~33j%d$uI!jCgTxV1_6<-=0|XQR000O8Ks{$vYFT7_kOTk#s0jc782|tP +aA|NaUukZ1WpZv|Y%gPMX)kSIX>KlXd3{!GZ`(Ey{;praDHvu0wv2u?kO4*8VF7})2)a)}AkflDVndM +vN!ihc{r5dbN_NtwGhl-+chB8D_d@4+{>7 =vUW93YfS8YOl@A;7d0-1tXGvsGLs7yGIh+-hR)rjct!zJNimuGcFHY%an!Qw}9HjH)7P +Yu5q1a1Pzp0n5{Gw1flHq?f=((a8!&&Ex8a_E^-CNRQQ2H!b)8HskoMlWO9KBw6ELsY;@oZI=M)p*e> +nzKz#78TP4QC=uEk;j*gI%pft$-Nx^o#h*N3O&9NGLC471WXR1ejX+%8pL9RExvJZvN&YO2C(#FT~f5 +1RLJOL`U}7+JQQGRMrXG048*RZAMe2?0DhF!#CIy!HTMrriHr4QfmE%KL`XE9Edz HjiI`zvTsSVoO(PI5h=m`Z#w4C)#mxY0V#k*G;ZZ8HYYPyhUnL3MW!O8`Jb)M;KhDak +<7~nYE^(xLn0O G?1wo7Ny6U^o#<(R4c5;@{Hq4%=0TIhQP7b_QbkS;yJ<@IC;@AHQ(90kiec +ZaR8~Lr+s#X6@M_}3hCM-`u8D+V7_5`5D*UiMsz6W$5}MO7WgfDTaTJnvpk=0yItpH8An%{uOt4Q4V2 +OqqlsCfXO(DPie5IDFiS^lz^ztrS EWVdz4<_uPu90|oa6U)7-2ObcYJsfao^FF;s%liZjKmh +}(B=~Uj2!~_kF$4o`wI;*Kk<;Xnj&(r>ahyQ~Q?(q?f-C09xvHcy&VV^Nas)@w0gM66|`4dmC&vZY$+ +dpRU@=AQLrcv#P{s8eWXDf=?F)Oi<;H&3$44t!M+le%GeZ+X7Qz(O~*1DW^%Otm2Cu=XCpXCfScJZ_7 +>oUzwUd>*=dVL}z>!^^Pkn_7Cr01gx7)R>^8qF0ar(m(kKi%JdzTb;~Aop*+{<);}1yV c!JX>N37a&BR4FJo+JFKuCIZeMU=a&u*JE^v8`R&8tKHW2>q +UoohZ^-`~C3#G7h4@%mjf#Z4~(ofsPXzj71o@^OOzGTVezjq`{e%bCFH6*b-FM9OMGovuZegz}CMk4f +*mk71eP^!*YJ(QLVz`F|YxmV5$>?1 89WTV#AL +MhqR$J_S=1euc_~G7E!#@ m2SDEG&j?#wx +!dW2}D>Il_&{#gSIfD6_V>Bnr@}R=MqQkGdl16yVmOF#)B2o +;9xx5$ewx!_Y8(Ncwm2b-@22*F9GozIELDvST;HHswy6-g2iY%yyep1Y_4Nr4__^Nx}8Hh-qP-kRA(+ +18#ye8NO$z#E>4wK!tk@iv3{nfAFK+l8 |sXU_%cBr|8D0*k5Z|<;$;^%hATmB +IP2SuaR(5DMyNHZF;fMbQ-(YT6^yG)Rb@`xPQGpq2iQ%`1@$ZOyL4|+fsMV*d&5KX5v#!RE)VjF>^_I +K03DW*bGYT uT^daTIkCwTPneqHiM-j5ZYBg=fYy^D&}HNt +Maa}kUUxbj}l$F_#Vg_dm_%lvCUS^mpWDK{op&&L_PV2^8?T=v)ORkuiNHUvqoCqD@#-d*OG>Tfv+es +iv`tas2xDnv=Szkh{8coS1T~R6xMr+PFO)=bO~r-)h&s_8Hs6hrYM}@982x*3=;c=wxWt7wQ3%`s1@l +t;Vp5n51(LU>A2bLtY}dU_VCjtgN>kDi14}B-EN@My0`oH_YX=*vpL1+DEa_worp4>mfI8#i*xxu$*( +eJa|S9=P|H|v&$atCRcW^i&F f+{a6i+KsY;P7w4pErPJ#8{Rs}#5-x!GB1`OM^VS)E*v==46kYFf8=n)|LPM^Hy@lpm; +TFXC5=jyPPj-j=y3J=W&49*)S$utsr!hwW xA;$_wlzdcU$DlvrZ7#k^z4lJmYtng#Wy +<(D(UMGep*?<{5V5tL@JujYbyU;fLGGT1>FLX>Yi-yYPwjy2z?Pr^QuB(7+j81z0PgU9`8^*Ptrs!w= +LLYQvxYc}~O{{m1;0|XQR000O8Ks{$v!?A=C#S8!dBq{&^8vp b9$JyoL5$p I_ +o6Z)*mE)WPR$bwuC-gT5vmj^?a?-hkT4HR~@0n12W4WaH@ZZnSZs{Q$?;Y(q*|Cs$>eO4e+0@{IOdxi +Y4D_U!6re9Xw{EAmma%uJ2fv6-b4l4~9B2dT& B;HlBqt}Qr$!+s*__|FR6C`$nUy9oyH)_PtALCUTQZV?g4P$4_} +s0tD7Cz38aXM Swlp9|(;s&Ge!8KdE7RH>Z<>H2A-U@7dB}wtS;8qWd5Z*Cb +gFo2VwNE+_md+0|BLM2QJ1nS?4CXPwL8hW qSZMy()Tx-O!V@8uSg#c%BwBkkQiEX&zNXEmFwQ4*Ot2mx +lsx2YBh;yD4XSvJ=eFkfiMlgR4Hd-H&{jv)r L+Bu6;zm`Jf_q!!hfUw61p+`2ezoCCo2W$D@z6)^CZ| +1vOkgABVA44Y(6nsbAj>NunJGTG7UyC(0= +ShPRqsA-jev `E)^X{t +4CavM(J)n(&tpTmsxD~r{I{ya%0@F+( rPL5IeXw&0lQKLGt!hqGBR#m-<9B9bqkKO~Fo%2R2` +MOUto9c!_|b@;{uzjz&!_b`bv>Y~~ub8^GbbBCrT^b$cl3j90Pi8f+K4@OnYB}PV%NR2Z*N$i=R7`N~ +d11O|j^75@T-WNUV8rarS7?nqR0r(|?Kt~Q^PBMwbcjt5#XV%GAUYbQ0b%o!y7ehBM`*?l30y_0bIX{ +(kv-y5Oh5^WYuO|e{5s!jUwDFc-!#3 3v<4Xl`0H&*%f!Zsu^rr7iOEVg|HPn32K8eg?Q4eS +JM`UUdxfmQUUX=SwbdJSR-+t*-|M$IeFqDv8GGsT Wi7o vk(F8EL`^Iw&brx=CIG4%I}Wss=zkHK_-zHbTdNdJ{O@&rrKOU=RRM{LyckVe?P)HPp6s88 +9iiVtY9SzUxn~bz^$1RRmhOxbX3IU{9S3C2CY+kV3W`T00eia<2tYK+f@5Bf6=OMugt;ni;upw@S8+x +TH;zPmTa}$qJ%km3TYZG5LfpiyNp-IhgXHT<4n&%nAtFBnQtKt7)k#-H0~}(^+o5P;8mr1u8Y+v%b)o +NP9bGv_Slk{ys=sZf55nV-_ bk_V=v*HKC9+bc~pQ%Y_`YOm3tX NO jeTOSVxZz2N3&)wrXqvK#amF@CINeKJW +^G(TrJT+l$3KN!WFQXv?Y_uXsxON<|!>q@ZKyrwIVXo|UQ}7@jAYrwziaSeJBxHr!=B&K 2_A6`1kw+C6|P?U&2x02$M~264x!E +;0|!2s&miA`ul-Mb%z%xElNk%c{}%2n=P(p&gC2uYM@%&h>?oP(@?ZvnAs0{bd`PR8w7QDO6(&JP_+V +=guW_Hm=105*=q~tJnge%BX7?a_s{f!CoH(Mr#*UDw!R)wM9p C3f3J?SyGYc2I_P- +#ROQ-emv*bh29VypIvNBj8;$cgu>6u;aJ%^5p6a|q=teu7GhwRPp%Guef4%8Ae-7xb>t&Z{^ZAj9Ec( +&? N95he@c48&Ksz(Fy0d +7EmXo E!+tR@1dl-5&c!r1hX03G}3!f!LCp~)}cKn=S`g>@;b%F!WB6y{sKsFN3XdU`Vat +3U5m$1t_Nm62wHoHe*DcCnBI0J1`YNq{cF1oR{Z+?!;KTa GM-mdqC2Enh6(@`hFIMJNFS*~^jf&QK<3|mmZFb wTO&_~y++i}^UV7)dkuIa|jk%wQ9AqI?jRp^iVy>}C?tu5bKFj|vP)h>@6aWAK2mnAmX +H+#@yWt!S003hs001HY003}la4%nJZggdGZeeUMV{B Fa%FRKUt(c$b1ras#ajDs+{O|9{r-vt +1;cj^P02QlBmz`acAZpc v_ki8n5`Ktv|2MGmnAP)xP5)~?bZ96l+DG0*M*(R(oR>roEJi;VW}sx+e((pNOoCnQ}& +h@1)minWmnjZTLqHuD=QU Vt|PlQ9HigKqQDk!rOpds+^wrJ*J +3S7%L`l|;bkCPDH?v){&JT<%Y4;P#ns~x!w)uitBQJErtb1jYEu@9&%5^^p}3YmiSE4*fm#2myCMkFy +>%lVZSPvH#k+!6M$Ct|KZ-S%CE?P2pm}K)LSI*+rI>WVh8=~59kSZW!eqHxSKLO0f4qACr|*BfKD@k8 +%Vo#fOF@n?Cp(aJ57Vus$s^H1={2`g1H48ftGDM)@}WiI>Rc5{^EDrxu)iv6m|C#8TtG!^%7oTR8 (;_Eu`6j(Cd<62=OpX()>yHAM@tzT7>uqQYj-CbiN{=2mc4VopoAAEZp$v%dsRZvX!dBxkB|~VXe@ +~CetR3;{dTss!ra}p0TAzuMk7QNn;KDw+)ks%P4j{qGp@9NW?Ib8z2`5$dB*d5cR69t|3JUJfTGNmQ} +2STz^&CSb+(Wcd`VoBq)rL=0Z~H#1=|QVSLIX7?n|{{n-zSZ;Ya{7V!`lRmMLzC5)@C1f_ Vxow5=JMTtGibl6_LL9JlICGAF$lM H*h!i{Pg{Ng~!_A6290u|KmA<7g4*ERAAT=YBnC_{EhlEnS~vnVPc2 +1rC{Y8}wUMhk>+Da~p;A-|#w2hX1~RkC}rohhyXZ{(eM-?$;GVVT+(#G+4DhFH%;yB0hs98_&tA^3xH +3qjeC!> M4H$a}$7a*ou_@>&~Y*$Eh}knFqLc`fmWk!x9S-556((n8LN^-}{g!OvYfmP^3mz;KL +K4uh1 DoM2lV_iq#nAIdFi~+n5UQ6Me>^%nL2}e +A^&_d_)OFJaW3u8YgytxPpd?FYR 9G}c|D{4=Cs r(2{us%^H^}4IM7w4FDf%8Pwv$muX4K O*wjQLaO@qM(2BOR=OGK>83)J^?_ T{eq%{9@W*3z- +7^ifF%VKV(f*2?e+<|i^K>7wo+r@FT8DAQ3y67p!5B-ZT~NwJ0^O`&5uy93I7EElC``kyq<*|85UGeQ +S8Y0(Yk!! !d}n7a}2*5Q}<^{DXE}OwJE()s>Gr@ LyyeV +q&Zmm8^;?i$!CZWojda;m?h=%0J7=DoB`DFg&iPr?(+?3iVzkszjTdHu=_qVt)PX6)3+1c5PZ(hIpn! +4rY>dW5M>!ek5IE{6BtN*YX{Z196XWlh5;7dF-Ry#a^(K9w4OxJMYFWAco{okeXHu)pG4l>wngF&q4V +&2*v{CB(Jb{uyLGura;K+QY6&D7A5!-1_%*yV$gbM}+am|f(9bp4&5-m`2sN%IHHwHNFxJ3Acj9TgJr +NRH|Cf}J*u3BTmjB%iAwoY`XJ!+>@`xhOPNe3rC}1S{Fkk!EV=zw8P#)UeZP(FtB~Y-x`qL~4~DDM3l +wFK$~Ykii~%_fFWGS7)#Nz@ICOK)FSNb7d7pMhrCB8zdjLZ~u0Ax+wU)`0DwrUd{y9O|*QyTVB!g+A; +Fg_;KRAtyKR6fF#C&lo*5mM|dcvod0IbQ&SSyVj$9MR}iS*aZOP?(xB{)p-7yf2yDV!#4g`oUojdwO^ +2VG1>C_yJV?sewF o<`I +F}t`O6OU@CnDbIosnVTUC1jFhkW0dGrt5=!3*I7dJXD9Pk(Hfkx?TJ4J87J-w=0p~2k1Bqt?QDGf9X& +lx^8IrS8 g-T-P1EW`is` 76_`8eqC$^kkYaHTy(oit+d|V8^|qx_}+< g7qjSgs Eo#XnYtn9aAWC@WQ=<^;QN}yljvl!C;NtHkfeF +do8?>B!slK;akZ%;G?%Us>(X~7^5c_Z8(7_mggtSW?R-g0