From d19a33501a647ea42fb734d1664b013a82cfb308 Mon Sep 17 00:00:00 2001 From: Fluffy-Bean Date: Fri, 4 Aug 2023 17:34:08 +0000 Subject: [PATCH] :lobster: --- onlylegs/__init__.py | 140 ------------ onlylegs/api.py | 293 +++++++++++++++++++++++++ onlylegs/api/__init__.py | 0 onlylegs/api/account.py | 93 -------- onlylegs/api/group.py | 78 ------- onlylegs/api/media.py | 148 ------------- onlylegs/app.py | 134 ++++++++++++ onlylegs/auth.py | 8 +- onlylegs/extensions.py | 2 +- onlylegs/filters.py | 8 +- onlylegs/gwagwa.py | 4 - onlylegs/langs/gb.json | 4 - onlylegs/models.py | 43 ++-- onlylegs/static/fonts/Rubik.ttf | Bin 193736 -> 0 bytes onlylegs/static/fonts/font.css | 7 - onlylegs/static/logo-black.svg | 60 ------ onlylegs/static/logo-white.svg | 62 ------ onlylegs/static/manifest.json | 18 -- onlylegs/static/sass/style.sass | 3 +- onlylegs/templates/base.html | 53 +++-- onlylegs/templates/group.html | 20 +- onlylegs/templates/image.html | 28 +-- onlylegs/templates/list.html | 8 +- onlylegs/templates/macros/image.html | 18 +- onlylegs/templates/profile.html | 10 +- onlylegs/templates/settings.html | 4 +- onlylegs/utils/__init__.py | 1 - onlylegs/utils/colour.py | 164 +++++--------- onlylegs/utils/metadata/__init__.py | 8 +- onlylegs/views/group.py | 65 +++--- onlylegs/views/image.py | 28 +-- onlylegs/views/index.py | 27 ++- onlylegs/views/profile.py | 8 +- poetry.lock | 307 +++++++++++++-------------- pyproject.toml | 2 +- run.py | 4 +- 36 files changed, 808 insertions(+), 1052 deletions(-) delete mode 100644 onlylegs/__init__.py create mode 100644 onlylegs/api.py delete mode 100644 onlylegs/api/__init__.py delete mode 100644 onlylegs/api/account.py delete mode 100644 onlylegs/api/group.py delete mode 100644 onlylegs/api/media.py create mode 100644 onlylegs/app.py delete mode 100644 onlylegs/gwagwa.py delete mode 100644 onlylegs/langs/gb.json delete mode 100644 onlylegs/static/fonts/Rubik.ttf delete mode 100644 onlylegs/static/fonts/font.css delete mode 100644 onlylegs/static/logo-black.svg delete mode 100644 onlylegs/static/logo-white.svg delete mode 100644 onlylegs/static/manifest.json diff --git a/onlylegs/__init__.py b/onlylegs/__init__.py deleted file mode 100644 index d424fcb..0000000 --- a/onlylegs/__init__.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Onlylegs Gallery -This is the main app file, it loads all the other files and sets up the app -""" -import os -import logging - -from flask_assets import Bundle -from flask_migrate import init as migrate_init - -from flask import Flask, render_template, abort -from werkzeug.exceptions import HTTPException -from werkzeug.security import generate_password_hash - -from onlylegs.extensions import db, migrate, login_manager, assets, compress, cache -from onlylegs.config import INSTANCE_DIR, MIGRATIONS_DIR -from onlylegs.models import User -from onlylegs.views import ( - index as view_index, - image as view_image, - group as view_group, - settings as view_settings, - profile as view_profile, -) -from onlylegs.api import media as api_media, group as api_group, account as api_account -from onlylegs import auth as view_auth -from onlylegs import filters -from onlylegs import gwagwa - - -def create_app(): # pylint: disable=R0914 - """ - Create and configure the main app - """ - app = Flask(__name__, instance_path=INSTANCE_DIR) - app.config.from_pyfile("config.py") - - # DATABASE - db.init_app(app) - migrate.init_app(app, db, directory=MIGRATIONS_DIR) - - # If database file doesn't exist, create it - if not os.path.exists(os.path.join(INSTANCE_DIR, "gallery.sqlite3")): - print("Creating database") - with app.app_context(): - db.create_all() - - register_user = User( - username=app.config["ADMIN_CONF"]["username"], - email=app.config["ADMIN_CONF"]["email"], - password=generate_password_hash("changeme!", method="sha256"), - ) - db.session.add(register_user) - db.session.commit() - - print( - """ -#################################################### -# DEFAULT ADMIN USER GENERATED WITH GIVEN USERNAME # -# THE DEFAULT PASSWORD "changeme!" HAS BEEN USED, # -# PLEASE UPDATE IT IN THE SETTINGS! # -#################################################### - """ - ) - - # Check if migrations directory exists, if not create it - with app.app_context(): - if not os.path.exists(MIGRATIONS_DIR): - print("Creating migrations directory") - migrate_init(directory=MIGRATIONS_DIR) - - # LOGIN MANAGER - # can also set session_protection to "strong" - # this would protect against session hijacking - login_manager.init_app(app) - login_manager.login_view = "onlylegs.index" - - @login_manager.user_loader - def load_user(user_id): - return User.query.filter_by(alt_id=user_id).first() - - @login_manager.unauthorized_handler - def unauthorized(): - error = 401 - msg = "You are not authorized to view this page!!!!" - return render_template("error.html", error=error, msg=msg), error - - # ERROR HANDLERS - @app.errorhandler(Exception) - def error_page(err): - """ - Error handlers, if the error is not a HTTP error, return 500 - """ - if not isinstance(err, HTTPException): - abort(500) - return ( - render_template("error.html", error=err.code, msg=err.description), - err.code, - ) - - # ASSETS - assets.init_app(app) - - scripts = Bundle( - "js/*.js", output="gen/js.js", depends="js/*.js" - ) # filter jsmin is broken :c - styles = Bundle( - "sass/style.sass", - filters="libsass, cssmin", - output="gen/styles.css", - depends="sass/**/*.sass", - ) - - assets.register("scripts", scripts) - assets.register("styles", styles) - - # BLUEPRINTS - app.register_blueprint(view_auth.blueprint) - app.register_blueprint(view_index.blueprint) - app.register_blueprint(view_image.blueprint) - app.register_blueprint(view_group.blueprint) - app.register_blueprint(view_profile.blueprint) - app.register_blueprint(view_settings.blueprint) - - # APIS - app.register_blueprint(api_media.blueprint) - app.register_blueprint(api_group.blueprint) - app.register_blueprint(api_account.blueprint) - - # FILTERS - app.register_blueprint(filters.blueprint) - - # CACHE AND COMPRESS - cache.init_app(app) - compress.init_app(app) - - # Yupee! We got there :3 - print("Done!") - logging.info("Gallery started successfully!") - return app diff --git a/onlylegs/api.py b/onlylegs/api.py new file mode 100644 index 0000000..9bcf477 --- /dev/null +++ b/onlylegs/api.py @@ -0,0 +1,293 @@ +""" +Onlylegs - API endpoints +""" +import os +import pathlib +import re +import logging +from uuid import uuid4 + +from flask import ( + Blueprint, + flash, + abort, + send_from_directory, + jsonify, + request, + current_app, +) +from flask_login import login_required, current_user + +from colorthief import ColorThief + +from onlylegs.extensions import db +from onlylegs.models import Users, Pictures, Albums, AlbumJunction +from onlylegs.utils.metadata import yoink +from onlylegs.utils.generate_image import generate_thumbnail + + +blueprint = Blueprint("api", __name__, url_prefix="/api") + + +@blueprint.route("/account/picture/", methods=["POST"]) +@login_required +def account_picture(user_id): + """ + Returns the profile of a user + """ + user = db.get_or_404(Users, user_id) + file = request.files.get("file", None) + + # If no image is uploaded, return 404 error + if not file: + return jsonify({"error": "No file uploaded"}), 400 + if user.id != current_user.id: + return jsonify({"error": "You are not allowed to do this, go away"}), 403 + + # Get file extension, generate random name and set file path + img_ext = pathlib.Path(file.filename).suffix.replace(".", "").lower() + img_name = str(user.id) + img_path = os.path.join(current_app.config["PFP_FOLDER"], img_name + "." + img_ext) + + # Check if file extension is allowed + if img_ext not in current_app.config["ALLOWED_EXTENSIONS"].keys(): + logging.info("File extension not allowed: %s", img_ext) + return jsonify({"error": "File extension not allowed"}), 403 + + if user.picture: + # Delete cached files and old image + os.remove(os.path.join(current_app.config["PFP_FOLDER"], user.picture)) + cache_name = user.picture.rsplit(".")[0] + for cache_file in pathlib.Path(current_app.config["CACHE_FOLDER"]).glob( + cache_name + "*" + ): + os.remove(cache_file) + + # Save file + try: + file.save(img_path) + except OSError as err: + logging.info("Error saving file %s because of %s", img_path, err) + return jsonify({"error": "Error saving file"}), 500 + + img_colors = ColorThief(img_path).get_color() + + # Save to database + user.colour = img_colors + user.picture = str(img_name + "." + img_ext) + db.session.commit() + + return jsonify({"message": "File uploaded"}), 200 + + +@blueprint.route("/account/username/", methods=["POST"]) +@login_required +def account_username(user_id): + """ + Returns the profile of a user + """ + user = db.get_or_404(Users, user_id) + new_name = request.form["name"] + + username_regex = re.compile(r"\b[A-Za-z0-9._-]+\b") + + # Validate the form + if not new_name or not username_regex.match(new_name): + return jsonify({"error": "Username is invalid"}), 400 + if user.id != current_user.id: + return jsonify({"error": "You are not allowed to do this, go away"}), 403 + + # Save to database + user.username = new_name + db.session.commit() + + return jsonify({"message": "Username changed"}), 200 + + +@blueprint.route("/media/", methods=["GET"]) +def media(path): + """ + Returns image from media folder + r for resolution, thumb for thumbnail etc + e for extension, jpg, png etc + """ + res = request.args.get("r", default=None).strip() + ext = request.args.get("e", default=None).strip() + + # if no args are passed, return the raw file + if not res and not ext: + if not os.path.exists(os.path.join(current_app.config["MEDIA_FOLDER"], path)): + abort(404) + return send_from_directory(current_app.config["MEDIA_FOLDER"], path) + + # Generate thumbnail, if None is returned a server error occured + thumb = generate_thumbnail(path, res, ext) + if not thumb: + abort(500) + + response = send_from_directory(os.path.dirname(thumb), os.path.basename(thumb)) + response.headers["Cache-Control"] = "public, max-age=31536000" + response.headers["Expires"] = "31536000" + + return response + + +@blueprint.route("/media/upload", methods=["POST"]) +@login_required +def upload(): + """ + Uploads an image to the server and saves it to the database + """ + form_file = request.files.get("file", None) + form = request.form + + if not form_file: + return jsonify({"message": "No file"}), 400 + + # Get file extension, generate random name and set file path + img_ext = pathlib.Path(form_file.filename).suffix.replace(".", "").lower() + img_name = "GWAGWA_" + str(uuid4()) + img_path = os.path.join( + current_app.config["UPLOAD_FOLDER"], img_name + "." + img_ext + ) + + # Check if file extension is allowed + if img_ext not in current_app.config["ALLOWED_EXTENSIONS"].keys(): + logging.info("File extension not allowed: %s", img_ext) + return jsonify({"message": "File extension not allowed"}), 403 + + # Save file + try: + form_file.save(img_path) + except OSError as err: + logging.info("Error saving file %s because of %s", img_path, err) + return jsonify({"message": "Error saving file"}), 500 + + img_exif = yoink(img_path) # Get EXIF data + img_colors = ColorThief(img_path).get_palette(color_count=3) # Get color palette + + # Save to database + query = Pictures( + author_id=current_user.id, + filename=img_name + "." + img_ext, + mimetype=img_ext, + exif=img_exif, + colours=img_colors, + description=form["description"], + alt=form["alt"], + ) + + db.session.add(query) + db.session.commit() + + return jsonify({"message": "File uploaded"}), 200 + + +@blueprint.route("/media/delete/", methods=["POST"]) +@login_required +def delete_image(image_id): + """ + Deletes an image from the server and database + """ + post = db.get_or_404(Pictures, image_id) + + # Check if image exists and if user is allowed to delete it (author) + if post.author_id != current_user.id: + logging.info("User %s tried to delete image %s", current_user.id, image_id) + return ( + jsonify({"message": "You are not allowed to delete this image, heck off"}), + 403, + ) + + # Delete file + try: + os.remove(os.path.join(current_app.config["UPLOAD_FOLDER"], post.filename)) + except FileNotFoundError: + logging.warning( + "File not found: %s, already deleted or never existed", post.filename + ) + + # Delete cached files + cache_name = post.filename.rsplit(".")[0] + for cache_file in pathlib.Path(current_app.config["CACHE_FOLDER"]).glob( + cache_name + "*" + ): + os.remove(cache_file) + + AlbumJunction.query.filter_by(picture_id=image_id).delete() + db.session.delete(post) + db.session.commit() + + logging.info("Removed image (%s) %s", image_id, post.filename) + flash(["Image was all in Le Head!", "1"]) + return jsonify({"message": "Image deleted"}), 200 + + +@blueprint.route("/group/create", methods=["POST"]) +@login_required +def create_group(): + """ + Creates a group + """ + group_name = request.form.get("name", "").strip() + group_description = request.form.get("description", "").strip() + group_author = current_user.id + + new_group = Albums( + name=group_name, + description=group_description, + author_id=group_author, + ) + + db.session.add(new_group) + db.session.commit() + + return jsonify({"message": "Group created", "id": new_group.id}) + + +@blueprint.route("/group/modify", methods=["POST"]) +@login_required +def modify_group(): + """ + Changes the images in a group + """ + group_id = request.form.get("group", "").strip() + image_id = request.form.get("image", "").strip() + action = request.form.get("action", "").strip() + + group = db.get_or_404(Albums, group_id) + db.get_or_404(Pictures, image_id) # Check if image exists + + if group.author_id != current_user.id: + return jsonify({"message": "You are not the owner of this group"}), 403 + + junction_exist = AlbumJunction.query.filter_by( + album_id=group_id, picture_id=image_id + ).first() + + if action == "add" and not junction_exist: + db.session.add(AlbumJunction(album_id=group_id, picture_id=image_id)) + elif request.form["action"] == "remove": + AlbumJunction.query.filter_by(album_id=group_id, picture_id=image_id).delete() + + db.session.commit() + return jsonify({"message": "Group modified"}) + + +@blueprint.route("/group/delete", methods=["POST"]) +def delete_group(): + """ + Deletes a group + """ + group_id = request.form.get("group", "").strip() + group = db.get_or_404(Albums, group_id) + + if group.author_id != current_user.id: + return jsonify({"message": "You are not the owner of this group"}), 403 + + AlbumJunction.query.filter_by(album_id=group_id).delete() + db.session.delete(group) + db.session.commit() + + flash(["Group yeeted!", "1"]) + return jsonify({"message": "Group deleted"}) diff --git a/onlylegs/api/__init__.py b/onlylegs/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/onlylegs/api/account.py b/onlylegs/api/account.py deleted file mode 100644 index fb54c25..0000000 --- a/onlylegs/api/account.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Onlylegs - API endpoints -""" -import os -import pathlib -import re -import logging - -from flask import Blueprint, jsonify, request, current_app -from flask_login import login_required, current_user - -from colorthief import ColorThief - -from onlylegs.extensions import db -from onlylegs.models import User - - -blueprint = Blueprint("account_api", __name__, url_prefix="/api/account") - - -@blueprint.route("/picture/", methods=["POST"]) -@login_required -def account_picture(user_id): - """ - Returns the profile of a user - """ - user = db.get_or_404(User, user_id) - file = request.files["file"] - - # If no image is uploaded, return 404 error - if not file: - return jsonify({"error": "No file uploaded"}), 400 - if user.id != current_user.id: - return jsonify({"error": "You are not allowed to do this, go away"}), 403 - - # Get file extension, generate random name and set file path - img_ext = pathlib.Path(file.filename).suffix.replace(".", "").lower() - img_name = str(user.id) - img_path = os.path.join(current_app.config["PFP_FOLDER"], img_name + "." + img_ext) - - # Check if file extension is allowed - if img_ext not in current_app.config["ALLOWED_EXTENSIONS"].keys(): - logging.info("File extension not allowed: %s", img_ext) - return jsonify({"error": "File extension not allowed"}), 403 - - if user.picture: - # Delete cached files and old image - os.remove(os.path.join(current_app.config["PFP_FOLDER"], user.picture)) - cache_name = user.picture.rsplit(".")[0] - for cache_file in pathlib.Path(current_app.config["CACHE_FOLDER"]).glob( - cache_name + "*" - ): - os.remove(cache_file) - - # Save file - try: - file.save(img_path) - except OSError as err: - logging.info("Error saving file %s because of %s", img_path, err) - return jsonify({"error": "Error saving file"}), 500 - - img_colors = ColorThief(img_path).get_color() - - # Save to database - user.colour = img_colors - user.picture = str(img_name + "." + img_ext) - db.session.commit() - - return jsonify({"message": "File uploaded"}), 200 - - -@blueprint.route("/username/", methods=["POST"]) -@login_required -def account_username(user_id): - """ - Returns the profile of a user - """ - user = db.get_or_404(User, user_id) - new_name = request.form["name"] - - username_regex = re.compile(r"\b[A-Za-z0-9._-]+\b") - - # Validate the form - if not new_name or not username_regex.match(new_name): - return jsonify({"error": "Username is invalid"}), 400 - if user.id != current_user.id: - return jsonify({"error": "You are not allowed to do this, go away"}), 403 - - # Save to database - user.username = new_name - db.session.commit() - - return jsonify({"message": "Username changed"}), 200 diff --git a/onlylegs/api/group.py b/onlylegs/api/group.py deleted file mode 100644 index 9be39a5..0000000 --- a/onlylegs/api/group.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Onlylegs - API endpoints -""" -from flask import Blueprint, flash, jsonify, request -from flask_login import login_required, current_user - -from onlylegs.extensions import db -from onlylegs.models import Post, Group, GroupJunction - - -blueprint = Blueprint("group_api", __name__, url_prefix="/api/group") - - -@blueprint.route("/create", methods=["POST"]) -@login_required -def create_group(): - """ - Creates a group - """ - new_group = Group( - name=request.form["name"], - description=request.form["description"], - author_id=current_user.id, - ) - - db.session.add(new_group) - db.session.commit() - - return jsonify({"message": "Group created", "id": new_group.id}) - - -@blueprint.route("/modify", methods=["POST"]) -@login_required -def modify_group(): - """ - Changes the images in a group - """ - group_id = request.form["group"] - image_id = request.form["image"] - action = request.form["action"] - - group = db.get_or_404(Group, group_id) - db.get_or_404(Post, image_id) # Check if image exists - - if group.author_id != current_user.id: - return jsonify({"message": "You are not the owner of this group"}), 403 - - if ( - action == "add" - and not GroupJunction.query.filter_by( - group_id=group_id, post_id=image_id - ).first() - ): - db.session.add(GroupJunction(group_id=group_id, post_id=image_id)) - elif request.form["action"] == "remove": - GroupJunction.query.filter_by(group_id=group_id, post_id=image_id).delete() - - db.session.commit() - return jsonify({"message": "Group modified"}) - - -@blueprint.route("/delete", methods=["POST"]) -def delete_group(): - """ - Deletes a group - """ - group_id = request.form["group"] - group = db.get_or_404(Group, group_id) - - if group.author_id != current_user.id: - return jsonify({"message": "You are not the owner of this group"}), 403 - - GroupJunction.query.filter_by(group_id=group_id).delete() - db.session.delete(group) - db.session.commit() - - flash(["Group yeeted!", "1"]) - return jsonify({"message": "Group deleted"}) diff --git a/onlylegs/api/media.py b/onlylegs/api/media.py deleted file mode 100644 index 46f59f5..0000000 --- a/onlylegs/api/media.py +++ /dev/null @@ -1,148 +0,0 @@ -""" -Onlylegs - API endpoints -Media upload and retrieval -""" -from uuid import uuid4 -import os -import pathlib -import logging - -from flask import ( - Blueprint, - flash, - abort, - send_from_directory, - jsonify, - request, - current_app, -) -from flask_login import login_required, current_user - -from colorthief import ColorThief - -from onlylegs.extensions import db -from onlylegs.models import Post, GroupJunction -from onlylegs.utils.metadata import yoink -from onlylegs.utils.generate_image import generate_thumbnail - - -blueprint = Blueprint("media_api", __name__, url_prefix="/api/media") - - -@blueprint.route("/", methods=["GET"]) -def media(path): - """ - Returns image from media folder - r for resolution, thumb for thumbnail etc - e for extension, jpg, png etc - """ - res = request.args.get("r", default=None, type=str) - ext = request.args.get("e", default=None, type=str) - - # if no args are passed, return the raw file - if not res and not ext: - if not os.path.exists(os.path.join(current_app.config["MEDIA_FOLDER"], path)): - abort(404) - return send_from_directory(current_app.config["MEDIA_FOLDER"], path) - - # Generate thumbnail, if None is returned a server error occured - thumb = generate_thumbnail(path, res, ext) - if not thumb: - abort(500) - - response = send_from_directory(os.path.dirname(thumb), os.path.basename(thumb)) - response.headers["Cache-Control"] = "public, max-age=31536000" - response.headers["Expires"] = "31536000" - - return response - - -@blueprint.route("/upload", methods=["POST"]) -@login_required -def upload(): - """ - Uploads an image to the server and saves it to the database - """ - form_file = request.files["file"] - form = request.form - - if not form_file: - return jsonify({"message": "No file"}), 400 - - # Get file extension, generate random name and set file path - img_ext = pathlib.Path(form_file.filename).suffix.replace(".", "").lower() - img_name = "GWAGWA_" + str(uuid4()) - img_path = os.path.join( - current_app.config["UPLOAD_FOLDER"], img_name + "." + img_ext - ) - - # Check if file extension is allowed - if img_ext not in current_app.config["ALLOWED_EXTENSIONS"].keys(): - logging.info("File extension not allowed: %s", img_ext) - return jsonify({"message": "File extension not allowed"}), 403 - - # Save file - try: - form_file.save(img_path) - except OSError as err: - logging.info("Error saving file %s because of %s", img_path, err) - return jsonify({"message": "Error saving file"}), 500 - - img_exif = yoink(img_path) # Get EXIF data - img_colors = ColorThief(img_path).get_palette(color_count=3) # Get color palette - - # Save to database - query = Post( - author_id=current_user.id, - filename=img_name + "." + img_ext, - mimetype=img_ext, - exif=img_exif, - colours=img_colors, - description=form["description"], - alt=form["alt"], - ) - - db.session.add(query) - db.session.commit() - - return jsonify({"message": "File uploaded"}), 200 - - -@blueprint.route("/delete/", methods=["POST"]) -@login_required -def delete_image(image_id): - """ - Deletes an image from the server and database - """ - post = db.get_or_404(Post, image_id) - - # Check if image exists and if user is allowed to delete it (author) - if post.author_id != current_user.id: - logging.info("User %s tried to delete image %s", current_user.id, image_id) - return ( - jsonify({"message": "You are not allowed to delete this image, heck off"}), - 403, - ) - - # Delete file - try: - os.remove(os.path.join(current_app.config["UPLOAD_FOLDER"], post.filename)) - except FileNotFoundError: - logging.warning( - "File not found: %s, already deleted or never existed", post.filename - ) - - # Delete cached files - cache_name = post.filename.rsplit(".")[0] - for cache_file in pathlib.Path(current_app.config["CACHE_FOLDER"]).glob( - cache_name + "*" - ): - os.remove(cache_file) - - GroupJunction.query.filter_by(post_id=image_id).delete() - db.session.delete(post) - db.session.commit() - - logging.info("Removed image (%s) %s", image_id, post.filename) - flash(["Image was all in Le Head!", "1"]) - return jsonify({"message": "Image deleted"}), 200 diff --git a/onlylegs/app.py b/onlylegs/app.py new file mode 100644 index 0000000..9cbfb05 --- /dev/null +++ b/onlylegs/app.py @@ -0,0 +1,134 @@ +""" +Onlylegs Gallery +This is the main app file, it loads all the other files and sets up the app +""" +import os +import logging + +from flask_assets import Bundle +from flask_migrate import init as migrate_init + +from flask import Flask, render_template, abort +from werkzeug.exceptions import HTTPException +from werkzeug.security import generate_password_hash + +from onlylegs.extensions import db, migrate, login_manager, assets, compress, cache +from onlylegs.config import INSTANCE_DIR, MIGRATIONS_DIR +from onlylegs.models import Users +from onlylegs.views import ( + index as view_index, + image as view_image, + group as view_group, + settings as view_settings, + profile as view_profile, +) +from onlylegs import api +from onlylegs import auth as view_auth +from onlylegs import filters + +app = Flask(__name__, instance_path=INSTANCE_DIR) +app.config.from_pyfile("config.py") + +# DATABASE +db.init_app(app) +migrate.init_app(app, db, directory=MIGRATIONS_DIR) + +# If database file doesn't exist, create it +if not os.path.exists(os.path.join(INSTANCE_DIR, "gallery.sqlite3")): + print("Creating database") + with app.app_context(): + db.create_all() + + register_user = Users( + username=app.config["ADMIN_CONF"]["username"], + email=app.config["ADMIN_CONF"]["email"], + password=generate_password_hash("changeme!", method="sha256"), + ) + db.session.add(register_user) + db.session.commit() + + print( + """ +#################################################### +# DEFAULT ADMIN USER GENERATED WITH GIVEN USERNAME # +# THE DEFAULT PASSWORD "changeme!" HAS BEEN USED, # +# PLEASE UPDATE IT IN THE SETTINGS! # +#################################################### + """ + ) + +# Check if migrations directory exists, if not create it +with app.app_context(): + if not os.path.exists(MIGRATIONS_DIR): + print("Creating migrations directory") + migrate_init(directory=MIGRATIONS_DIR) + +# LOGIN MANAGER +# can also set session_protection to "strong" +# this would protect against session hijacking +login_manager.init_app(app) +login_manager.login_view = "onlylegs.index" + + +@login_manager.user_loader +def load_user(user_id): + return Users.query.filter_by(alt_id=user_id).first() + + +@login_manager.unauthorized_handler +def unauthorized(): + error = 401 + msg = "You are not authorized to view this page!!!!" + return render_template("error.html", error=error, msg=msg), error + + +# ERROR HANDLERS +@app.errorhandler(Exception) +def error_page(err): + """ + Error handlers, if the error is not a HTTP error, return 500 + """ + if not isinstance(err, HTTPException): + abort(500) + return ( + render_template("error.html", error=err.code, msg=err.description), + err.code, + ) + + +# ASSETS +assets.init_app(app) + +scripts = Bundle( + "js/*.js", output="gen/js.js", depends="js/*.js" +) # filter jsmin is broken :c +styles = Bundle( + "sass/style.sass", + filters="libsass, cssmin", + output="gen/styles.css", + depends="sass/**/*.sass", +) + +assets.register("scripts", scripts) +assets.register("styles", styles) + +# BLUEPRINTS +app.register_blueprint(view_auth.blueprint) +app.register_blueprint(view_index.blueprint) +app.register_blueprint(view_image.blueprint) +app.register_blueprint(view_group.blueprint) +app.register_blueprint(view_profile.blueprint) +app.register_blueprint(view_settings.blueprint) + +app.register_blueprint(api.blueprint) + +# FILTERS +app.register_blueprint(filters.blueprint) + +# CACHE AND COMPRESS +cache.init_app(app) +compress.init_app(app) + +# Yupee! We got there :3 +print("Done!") +logging.info("Gallery started successfully!") diff --git a/onlylegs/auth.py b/onlylegs/auth.py index 6b5884f..c3d0698 100644 --- a/onlylegs/auth.py +++ b/onlylegs/auth.py @@ -11,7 +11,7 @@ from werkzeug.security import check_password_hash, generate_password_hash from flask_login import login_user, logout_user, login_required from onlylegs.extensions import db -from onlylegs.models import User +from onlylegs.models import Users blueprint = Blueprint("auth", __name__, url_prefix="/auth") @@ -28,7 +28,7 @@ def login(): password = request.form["password"].strip() remember = bool(request.form["remember-me"]) - user = User.query.filter_by(username=username).first() + user = Users.query.filter_by(username=username).first() if not user or not check_password_hash(user.password, password): logging.error("Login attempt from %s", request.remote_addr) @@ -77,7 +77,7 @@ def register(): elif password_repeat != password: error.append("Passwords do not match!") - user_exists = User.query.filter_by(username=username).first() + user_exists = Users.query.filter_by(username=username).first() if user_exists: error.append("User already exists!") @@ -86,7 +86,7 @@ def register(): print(error) return jsonify(error), 400 - register_user = User( + register_user = Users( username=username, email=email, password=generate_password_hash(password, method="sha256"), diff --git a/onlylegs/extensions.py b/onlylegs/extensions.py index 90ef9ab..9e3eb84 100644 --- a/onlylegs/extensions.py +++ b/onlylegs/extensions.py @@ -13,4 +13,4 @@ migrate = Migrate() login_manager = LoginManager() assets = Environment() compress = Compress() -cache = Cache(config={'CACHE_TYPE': 'simple', "CACHE_DEFAULT_TIMEOUT": 300}) +cache = Cache(config={"CACHE_TYPE": "simple", "CACHE_DEFAULT_TIMEOUT": 300}) diff --git a/onlylegs/filters.py b/onlylegs/filters.py index d8f2dd4..765003b 100644 --- a/onlylegs/filters.py +++ b/onlylegs/filters.py @@ -3,7 +3,7 @@ OnlyLegs filters Custom Jinja2 filters """ from flask import Blueprint -from onlylegs.utils.colour import contrast +from onlylegs.utils import colour as colour_utils blueprint = Blueprint("filters", __name__) @@ -16,7 +16,5 @@ def colour_contrast(colour): a css variable based on the contrast of text required to be readable "color: var(--fg-white);" or "color: var(--fg-black);" """ - bright = "var(--fg-white)" - dark = "var(--fg-black)" - - return "color: RGB(" + contrast(colour, dark, bright) + ");" + colour_obj = colour_utils.Colour(colour) + return "rgb(var(--fg-black));" if colour_obj.is_light() else "rgb(var(--fg-white));" diff --git a/onlylegs/gwagwa.py b/onlylegs/gwagwa.py deleted file mode 100644 index 6fb58f6..0000000 --- a/onlylegs/gwagwa.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Gwa Gwa! -""" -print("Gwa Gwa!") diff --git a/onlylegs/langs/gb.json b/onlylegs/langs/gb.json deleted file mode 100644 index d3f0895..0000000 --- a/onlylegs/langs/gb.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "IMAGES_UPLOADED": "%s images uploaded!", - "DONT USE THIS": "variable:format(data), jinja2 doesnt use the same method as Django does, odd" -} \ No newline at end of file diff --git a/onlylegs/models.py b/onlylegs/models.py index af3eb6f..6970a9b 100644 --- a/onlylegs/models.py +++ b/onlylegs/models.py @@ -6,18 +6,18 @@ from flask_login import UserMixin from onlylegs.extensions import db -class GroupJunction(db.Model): # pylint: disable=too-few-public-methods, C0103 +class AlbumJunction(db.Model): # pylint: disable=too-few-public-methods, C0103 """ - Junction table for posts and groups - Joins with posts and groups + Junction table for picturess and albums + Joins with picturess and albums """ - __tablename__ = "group_junction" + __tablename__ = "album_junction" id = db.Column(db.Integer, primary_key=True) - group_id = db.Column(db.Integer, db.ForeignKey("group.id")) - post_id = db.Column(db.Integer, db.ForeignKey("post.id")) + album_id = db.Column(db.Integer, db.ForeignKey("albums.id")) + picture_id = db.Column(db.Integer, db.ForeignKey("pictures.id")) date_added = db.Column( db.DateTime, @@ -26,16 +26,15 @@ class GroupJunction(db.Model): # pylint: disable=too-few-public-methods, C0103 ) -class Post(db.Model): # pylint: disable=too-few-public-methods, C0103 +class Pictures(db.Model): # pylint: disable=too-few-public-methods, C0103 """ - Post table + Pictures table """ - __tablename__ = "post" + __tablename__ = "pictures" id = db.Column(db.Integer, primary_key=True) - - author_id = db.Column(db.Integer, db.ForeignKey("user.id")) + author_id = db.Column(db.Integer, db.ForeignKey("users.id")) filename = db.Column(db.String, unique=True, nullable=False) mimetype = db.Column(db.String, nullable=False) @@ -51,37 +50,37 @@ class Post(db.Model): # pylint: disable=too-few-public-methods, C0103 server_default=db.func.now(), # pylint: disable=E1102 ) - junction = db.relationship("GroupJunction", backref="posts") + album_fk = db.relationship("AlbumJunction", backref="pictures") -class Group(db.Model): # pylint: disable=too-few-public-methods, C0103 +class Albums(db.Model): # pylint: disable=too-few-public-methods, C0103 """ - Group table + albums table """ - __tablename__ = "group" + __tablename__ = "albums" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String, nullable=False) description = db.Column(db.String, nullable=False) - author_id = db.Column(db.Integer, db.ForeignKey("user.id")) + author_id = db.Column(db.Integer, db.ForeignKey("users.id")) created_at = db.Column( db.DateTime, nullable=False, server_default=db.func.now(), # pylint: disable=E1102 ) - junction = db.relationship("GroupJunction", backref="groups") + album_fk = db.relationship("AlbumJunction", backref="albums") -class User(db.Model, UserMixin): # pylint: disable=too-few-public-methods, C0103 +class Users(db.Model, UserMixin): # pylint: disable=too-few-public-methods, C0103 """ - User table + Users table """ - __tablename__ = "user" + __tablename__ = "users" # Gallery used information id = db.Column(db.Integer, primary_key=True) @@ -100,8 +99,8 @@ class User(db.Model, UserMixin): # pylint: disable=too-few-public-methods, C010 server_default=db.func.now(), # pylint: disable=E1102 ) - posts = db.relationship("Post", backref="author") - groups = db.relationship("Group", backref="author") + pictures_fk = db.relationship("Pictures", backref="author") + albums_fk = db.relationship("Albums", backref="author") def get_id(self): return str(self.alt_id) diff --git a/onlylegs/static/fonts/Rubik.ttf b/onlylegs/static/fonts/Rubik.ttf deleted file mode 100644 index 547f06974a0a11afca9e5c305544e406a1609d72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193736 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 ~Rl&Bf`Ai zbVMCKg4+|hJo>J1eU^>jrxrBEcKGWfK2|i|L75nf!vaXViMzYIMMsB~g~(itOxoI; z6zy%QJ9l6X1VL66p$?X2imPiy-eT?$Rf7W@hGWZAe`Z1CfDgLB_qxC?dUzaYR_WHo zbZFSG2)iz?L&|-VETmJX>J?7)+&SBS-vak2aAc~K>2+j(89#`nGhJaj$jYQqZerSw z>8XY_Yb#LR%D0Hb`M3bJIkdMugllV`HXX*5+0&=}?`yX>dGgFzW3@S)+W735lP4uh z+CQTsSe0}({ySsv;{ZYm*Kt+Nr;fp$YEJJuxU6p7yb5>oR^1dXW>2Xj;|vIg*~(() z&fR;wy!is`?X_q3&YfZ(3A<_kSZaNjQVe+ne!<}}o?+Gne%J-R(FOiP4~v|9960&@ z$4XS_bMP}Lj^()n1`M#jq}$S}7WWUT%d3*m81ODt<>N{OHaYItUx(oSIySbT7_ML} z$!Rckb@lge-@bk8<~@Ju7f4rI|Abt)oNRZEtLu|nNF24d^|+J+7t14u_ro1NVgbPl z?(8{kb9hOb_e<0ju|fCl-h{h*FCAREQQFm5fLKF4nF!7#R|qT7l;Vt7U?Xp9jc{Q9 z)JJ)!(ay@!6wcDBc35h1a**e?V$|F(t(yh0|=Tn+tR2NewP*yLszI7AycO@gY3-pOG)| z(;8o5tB?B?WV!6jnbX&$+-%-ll=zNrRDxtD@~FwUy{)Z-cC^c|>mpZ^9XcIU#G!}q zhB)f@&Zd!Wq~gR_y=Xm?Y46;$eb32Og(@Db26=~^* zdapk=zVSbckF|IaavYRWIPa4SX1oUM^evDJ=Db{p1@D4X?)e^F*WEht31swo>@y)13XA9$kool_Ue_pC#McQ~wn;alD8e=awEf5$?LneMSGA{~EB>*Iz*_{Nk&x4{iS8 zNiFk_EvgnMHA^(D0xM~Gtf|CBMga$nzx|_2 zm~7`Sb-4J)4yk|vs=8uiAAh>;Tex-9KQC1nz~VmEQvA{rYE<37%}na#JDt>J))@Xl_-Kb{_Xe@9cfxI;g6O zXbhW<1!Vd+I{%}1Yo%(`99X*_`c&6;{hOTI1l-+p9B&3U@XxNBFfxBsDYrqCjUF;` z!rWBB5X(&u&yc504QvuAb*a!!bvB8`vMI^f$?F{Rrm99`OE)K_mOi?C;ZCFMI&2jU zwvQPl&bQw;rcN+Q2yOiwaM4RVoXPMrE8H)#m{Ktcb`ieVj~_F1RK+}AvH0v+@{DP> z`&-wp{c7#nt@pd73U(6l5w5bSqMbx{Ovm2pe~1&e{f2J)4Z7skz31<>+~Jz$MJVt0 z&L2AfJ@Vioaao@ZI5(*RD4j-??!45!EW4+$MOVlS{rxUcl<`sn9Qw z<*~!BnvZiQsW<>#sU0tR*^BzKU*g*3N%$+`IxME}e=~VJ#mpe(Y2arR;Lv{k0&Js~ z5}_S6dC#6YwR}K$$In0iyzjQwQVZ+(UHib;yb3HfGiP48b??EQN7exa{1<1qZ%|hi zO_&N9e0&ODWnHMs+SSz^&O5kI_Ta&T1C@79?%(zMmc8e%KWcRDcyLM7^7s9*VGY#V zgZE^1p8mn^HV(R-29YyR{faBXEqZu6Fz(*N&(|+7A|foXhZmH2?;gP+fkD1LZtfmt zTg6#AOb};xapL5^nK56)X$yJ;K zR85Z5Vwls=nsN@7*7P!iy~8dBTGvyO7erjx^|77#=c)URW^Fgm-&f%KHggAaBN=Vd z$Q9)i`0?>Lr~8;iFv+;O@qX<%@*Q?F*B{l(0sQ~Ft?%5%_6nozaFikHGH~QT40Zmi z?0Sg)(3F-dthGE zaKev`}nB&NQOI+sJ@6s62hxv-0AwHijERwL} z5w>Gz>S_EKG`dy{_24@t5AML>FNzIfkJ>wmg=Ik8_3tvRf#C;Tr@D~#0R*Dih<`h{2%C=-|bRqOzKbT|MbIDtXm0jBSP6zGM0fY?IHKG5zR~0|yQq+K!W~ zFcjXAp~+wfQOuYzBTj#mlFJv(gnWX1-{k=-q8g<(gl|3;d;>G zFgZUSYj?NS%gq9^PbN+CIB9jYC6yqfX0nb_6xm>cEfi~Pp&Y+>^TEBwClG86;_>^z z%)-8N-$atJL`p;Tn2B)bnczfVs=jdX>Q$K0&Rw`PCkZn1Q{-vOkb{SgHBXraTxQ}l z(==`p!A>JMKTa{WK1d)x(Fd(ftfQ?R$zuN%p`_5OmoHu6J7$-z)J~f-H=(0LrpO+c zmv3|6;IU@>y>(?})%f!9Ww&qMzT=PoXes2M0Vw1|t1tF9$}8w-OCZ1T3KXb7OXN-X zDaZtELOs#hT|_D#;B~QX9aWFR7rH#(qKCQkYkuww4jP?0zUw@8rY~Q;o{aIf1PkHo z@?Iy8H=obO`q(7t;7@^Zya#pxGo0WdO~{*196J`nx3gbH(jq}YSL0h-+RkJhP*3@x zfN|~ZP3jKNCWDqJld~o{!*9^Zq@Lm9-RufCjJlQ zfe-894B+M{Zo;;-E!DBP(y|J;s)_`%$GB`fI>;YRh=_1Y7r2`q-U1AsWIN476a9njlwt3B6jwXnNbtW;fZqiP^+t zQ`Xc?-E3k>)L0TbC^kS)ib!WDGym^%&b||=@LJNaa={suX0>XzrungZTKgjl+TPazppoQrQVPO%A-;`EFS96 zn|rlv2f%c7FbS-@Jiy zmD92vIQwGYueLP1Q=|Bf&PH3hbs<|=wR%0S)vFez0cfx)R9MyP)@PD0TxqyGao5#y z7ixaB8TXHmv;qk7M;8^+!Ci3n?1h{4N+%DmGkFks7Zlg&oN>8(pFR)K?uBb@MQ6{J zDDgxk+y!Q#P%E2Z1kqYkQ&UIUXARYLE!j#igW6D&M)8SVHma_u%M+~Opi8AIwEqhPW+I>FZwN;X<`(MK=7_~MUhruG@m zsUk@mZoPG#brmHokoI5?MT6O72P4U;y}|L> zLRPr5RY3}Otlb=zmg0=&`Baps?V=-h~SUVO-SQAueuoI-YU5K(Y zOfX-WpUDg%+F57M{${hm8ZxB|Bn~Ajn!lpOyaKK|*s)^Xa>C!cC{(sU+2agRA7h;l zhoaY*F(csZxa;9ZO`J2X)e#F^r)`&B5CwBz9T_;?Dbe|k(_OKC<|b11Vaa3p$h5(O z5^)V0oaTCsSeOmLy&u}bRz{Yv*{2!-_Ns>g?CIa)KsW4nSh;7#$FI2FDR#y6q>X++own?8+C#QgI|$_%Ul|=N zAu#1U7B$*vg2^7=HGK8mYa`fhQ}{OCHo~gs%9X1pF5~mYwKO#T6L`b@r+PJPO4OQk z#K+oCw$n&Mq1&Y$g+NeegbOU?38iqO&F?P=7gZ{AbFxc(KhzpE3V9?AzM>C8 zJ?;ba_Y;6ItEJ7N7TTa0r#73%jzvG!tu156n$0=%6?~_#uZ;Tr`!!0aX~S|&Z{%x` zIB~jB;hN^wmKGYC57E+3VX^&B?@bxK8)1CvFeovBOz{#DQ{14L&=!>ne#3j{5lzlJ z`o_kFhQ>N;(6C9{M>3^`zXErB9XuBL<3K-GF<-#pWN`3la)h zTO^5ua{BS7OIM+&#q_ie9|E&C1t@Ku6D5SQ~BoQUA{I7)Udp4KZO5dnsJ^!P!*g$_G3Uth?gupNv*P( z7~%mAe@) zJB2NGt+llox;zRc5u(pC*zi}d0w>dsVdjp~sPMfoO4^``oRk}acDczA_yLS7 zxltt`C~FV_drr&pI!1S@V?w9g1}V25H9Gb1?}p32M_4zz+8d{SK9@fnGY=AjCE|zt z2^7qub{i%q71ZMZZf;G3XX$?n-w6jqidFlB#NQ`Q30aX)GATy|fjHBFBD8 zcJTCUWrmtV$XDd?CmRvbZt9W_1F~OHBg2)_T%>LseIo!eE8vqpZ;?( zBl;FEh9)zP1oiz@*sALw&m`Hqkx7@j=)*nLxVBfbXwfoUixvqBr7rzyeT2MFSCKew z!B^QNs+$=Ic2T#nef(hBOw0}><<6aC)653(z8YDtvT5)bu0J~0)vJCb5K zccu{|fKyo)!;nOdBVe8(-W)h^V2r<_(WHZ%WP}en&)}!(mR~A4V{IB1JEh0PSs5r# zGtLj33zu<(i|*V37R{C&J2MdnF%i)Zc}f%$vY^n;XY3bhWwY7I;&~ie5Pa+?^a*8K zkga43(tS91Zgb+g?+UAjTG{QeT}%U;tU;Jt61XSXN!B1;ca86#r%|%wy&!lb+~WTr zp)K11jtf}&R`{cOJA2gzzQt`LQt;j$)kL8B!&1Nr`4JoaG_abk;d6USz&PUIGs{Tu z{GJid`h^kK0BJjM(x$Q?#?MXV2e)?fsQ8m7@NGvcupCX2J+J~X39fC>EC9?7Cs(I& zA;Os~g-#7}XOVfprQx^oQ_6s~J`U3v|gwPDkyjT;Xi`1e=enPV2Gf`^Nw zjf;oHUjO(wDetr-#{Av4-yb`^ZQJ(kTW2N;kASyqt-f-h%C%>Zy)|2Jt;)|Q4C4Hm z_a&Ud{&X*t5F2~!C|2v4APEc6kL?vfcu7czy_L7=MH;IieT{cvxlonPFq*djwcmAJ zov46+vbR6{`0-{5o!>+Ebwzk1JX2{g7q#sGg&eQDkN#*t#!Wx*K zD4aqek^7*N!1Z$3yRe0(taP@n2v$wOeGhgGh&rg3& z2j)*{iFKRu)vsi@at!S!&BfP*XVe>JO`SSzS_g!vD}bY(K7IPM*;~fq^yVH4J`zqK z=0c&AZV1P5bV8rjZcB$7UWYJr7r-7UFl5-e~N;vgLX?C=KJSC_sl1VC?k!9$S z{ZFT03}H~*1kP3A)radfbrAY!kN-$V=CiTHNPU4;hAQOv@sO#h4B>h~f!OtEnM#d= z>GbuY7LClF5uy5d?vor{W+qH3Kfl#2Q#!X_MV${av;PBCz(*FQWTfQY&aa9kDh$-)iawM5eFc^W10PhN1l8L?U`JrX=H*YQ+u_oss|Cl7oy&Xwb-MmG7K&gk(f|fs#6m_{3*{2Yw5>>Y&Eh*bo+-`fxgSH6;kOboF&0YLlivvN07$(>}y$8lDG> zdo=5Ru&YH&$z7d;gQcy_l4F3zc3X?1qg{0gTo`Hf@4kp_fn^4>BHXg%CoYio=)r%%VvXCYy^QX??cDR+Id#PNi8E); zm@#R>z|6@D*O1xTUvV%zmjz2tlTv4=P~?b>@H%i!d!>Zn%H6w}*0I*n))7*gV%?^A z%}yub@n=zw#-P{W(qOF z^nXKCQCf>u>~N zTVIwj8^_kxzI|oJT2e~qHaQyg$A7$is~Fd<+b2%Q=UWz9Hx&F4PRxBMe5AU1_V|gQ zbV&sN2jLG!rd1$gp6NK({=mOf`NRCV%s&yD zr(!H0>5SNbmUuAw>gcC34b{c`{gx9XPIcY8XF5z3P`@txA}v7eU|JJR?&(P*eV>1& zuI5m~$QGdwmIt{6?8rEkkxDwWQ6=kgtIWNfgW7^V{|s)Zj(oCoDY;x(x>WA#FS8() z{K_i)C9cF%s7dwnPdM$Yec>V%t_IHH0 z4Kd$*b?E2KFmu?tZF@(rJtWY40DD)`>C)aRg?q!I(p#D6?xVnNd4j0c@E_JW#^m_j zcZa{XSe3Y}7E)CGjYjbP5v8DGv~I!C4z~2pJ9qv!%nDGepquVp+7HUVcoc1NtSB!n zExp<5?Jso2E7>(V*{>BZl$KWzKSx$iW|A?dl;lCUl2dFferEV`U+s51paj`JRJ<;8 zPfU(LYOcv(iB!8dMllcV$$(t{B?*&zRmgRjKV!)bW~=f2VTff8+>IJIHv@Cn0oAi( z^g-dx62`h|ZJ9AXBQ-U(M-|`<5WKR3P&0k)rIpZ=BAMsSwTqyDbn$nsW~x zM_ZDGEbXb2uqlO4x1qrISA&e8Wcn`|OxYThIw285X9BY#`@Zq|1#T1P;(l-Qa?11V zK3#c_CP|bN|MoMR|3C7$=ta8S>nHUMcc?A~NmY2W^urH7`0$hZzOYLB8@Ad$P^vGx zl$V#6mA3iD_KkUHT}0g{c;mxV#)5qZL4Bu~a>T0YY@=&vn1@%l9zA+^X@zfOvhQzs zk`x%UWJ|VT6KXJJ4NppuM zysvdw%e=4rH<<$Qi1-se&oZx?=hCHF=efyJ?s1y)099Eb6q2qMmR4E)5(W$z0(+QI znG+VkQa?xBh0iRHbraLZ%$T=u(ZYEX;scsK_y?{J8oQ+u>x4@|5VlY;k~}{qwt1wc zWDboF5AO}JO5dKJf3ko7Xa7EOvDq^{ybS=hMiiQg3ZdIR(W|gjDISHQ$x%^RTIe;A z&pq)ojk4B#_sOs?9tyhc8DM9O|L?w}*RDtvG!WY&ckPNcLP%|h-bLG*?c5w)Lq%(| zxzWkN-sB8J)hOp07{SBPSG;-jqmMq~HN>C>N4bXBIFbd%#inz9AK1J(SwgCEmh%JbK3`Tc0KJwtKpQ95&Hm`U~M}xSIY1j9?v@ zC|bQyZ?3JbYcS`in=J_m=o}=X2?>_w96NJEU3IM)K8Ce9YMt`nLG%{b*TI8InO6NX zt+i+$v9S*Pzw&ep+0#IFo)-3a4-auFhH7S|UQ0$RI-S?t5+=^9)X)y*6A|wkYaib*{f+61T|JkFkN;Ep3ze{+%;~8<< zmS08VBJT)Lgpz%ks!vT-b^U08)M+L85dI$^ekn^}m#8XXa30p#!fda+DLPL~GoKix z^6+7qn&R-gJ2ui@sb!STZMmx>n1_m3d*j#1wlj7p&f}rPsBhTiZzmcgK#MXU}1p>f+-Q z2KfdB12ZQ^z07X%&)v{Z#q*$j~GqvRvb-2pQQ>-(r%LU6G z25laq8I(t|!whmVY{pD(Q6~AKwHZ!l@rfjEB^xtaKiKk>M~m-Knfp5cHMz+($?8&! zs_z8Qr^u7hS^0`XLSAC$(^5Vk<57M$hW~5HLS3QJjvNJ#BI8Dl#HelAOilsX)yzq1 zB7u0m!sg)D9t4#MNcRfzc2ZxxR(yN&7D(=QrO73Rhv68z+AyV!;kyn>ot+})gllP}UG(zHXVu!qmT(A2 zBU>7^>hmwZEVY`C{Av?lpJeyvz?`d;G^!f7G4oI`OiAT}CEfaQJ|sgaEXoAd(JsP% zQGkmv&^fT_{`dfh);e;4p>J&o83=dL8Nu>8;&VcBF(b3zk(W(}1?tL#MKtOg7>@3iA)?n3hYE z|96nOlJ-=eGpA3UJo%eNat`(Sb;8^(n<^KM5ovES+oxk`ESQrKxsEQ!f>aP8ZQHs9 zxP4b+!KJE7TIl>7r7`ZX|83?P;@sJ(fL}=B^3|XOH4g|B<|cqV86J!RZbIrnl;|AgJh49$&Z5~hIv^lm z-{HD^@I?H4F!uNmFO87mQlF>q>e|M}=4R0&YAE-eGnyLGQ>lSw8&%P&>W}(@spjifgIGH*phZW_Bp*`< zZB0#ZFs9cEqPc;$gpbVvX>9lj(C%Y_e=EaQ(vx&%x`nPTV)7KIAmnWb>nA;awoCRh&1=(+}URY!9 z%u{T57&G4L69F||f4^=($^fOki}&r@R}99!gqgj8)(ypZWJ3jPTbx`I%N7FP2)TBv zC#EIiN}IZIB%c2fyX|}7sBjGFDDM7==H_Z=IMZ3@JYyK%*e^6fD#}x%Kq^K1O&llY z+a7y6A>lzyklFk%Mq7<+BnJ%e!!k4)Gljj_`!Z_yy0BMAE?7!S3Xcv*lX;1Du}w`8 zlYlc!7m|g?7$hLX_|) z3RRTN8=x_V(RtKla+7Jb@owM0WSc1>;W|yPXIInv$G;sdljd{{+N~|SP42mFm!$(V zK7&nyB<|eKb*)~e7vwDb&i_0J!2Twc6@&asX(uP`!v3gww8a7~I^0EO5GwkDn zf@!-22a&r$K4R~qX0CPXP+6}OVbKZA%bvZ*i_S>yw&W&8L(OKWI8y8_MzItjhO1UD zTe5sxCgAux0IW4E-4QC)W65j6hT+)D9|HA14Q%NQB=oNe%Z1Z8Md0wjUJJzj=gXM) zHYmZj<=A6So12lna*<*DI-Roe9DMX(0{~&f&6!H2&ZM~c-FKaEAsMeF3P4|0URBlE zlFK8u7JgU7{sZBFKWXrw^x+v`{I4d%t4{V@Un|%OM1)VF`~>||F&ITuEhYG)`2U5}wIhtauaR+F z{&%R}ztG&2m%({L#f{AN?Sd`yjPUgT9$EU<{X@h2ea%ddM-&^^s^R4ViG*ie;}mFL-Pc}a>h6x7YTd<5s?UA)jKkRd2P9u z#2Xd$5r;PDhwmY3IsL;DE{9wq_wbiV@HM~GAzMe< zE$nhoL&(`Pr%s)ML~rAU|Hdn2$Bp`*I;dnYg&?s4DtPIVZTuc#w}EkAxMeI{ArXG^ zgk5xA{?(#Qa3ea;q;72!`UB8IhBHL4S;I0TTS1DLBJ*Pv^TbxZyByV4#6h;~5>Pabb^kM4)%;3nza4eB{+^a`f^h?KW>O2hy^$ zvv=rpHa;w2x*W5WX#&nY3m1qn%GW22WU}y{)=sCwrL!9fOlYr!`Mm#MjN~&WEGB?` z7UImL0PKG-j)NBM$x@uN`TgYicK^1#KmDZM@o#^yahZwc@eRpbwPZ1@bY~6>wY$R{ z?36*#`ooV;tHVZOWpWV=yxr+;g5^+rtKRX$G$x9DRWNBshKeUX{1D}tG?x5Q_dq8_ zcDTK}1B0%?e%+O)5C-Ji3wew$c;#wQm07rQ<$7yh;G2D0uXBuwk8w(eG3Kpo2Gf_1 zInUeKc&R*Jdr!XI56`3MRZKS@4_rRo`a|RdA2|Jg)q4>4ACw7Nn_FCV^daO(2(K(G zCRDfsM(<~HDl}n&cWG&Z-rKtv4nm5(z4Z;HrQQ>G4|#iCZTvHyZ@VXd`<{FixK6zP ze1u?Q0geKH!e_NJSMecfj_IV*7o7d^#1)c}6mKTgbzm!AyLJHHZQ0z|029g@u*YLY zEyGcXvl4c`(aQlM3twBB2mj*Im%i zjMcyT>Z@m6<&0~$c%aBbxyj>DV&ytXgoNeCCvZLUEVj9w(a^|vP%<}HuHnyVqLSA@ zTX_O-kv<8h^1cxIF<|`~jE3?b06k97w8yc#bHIVxfucQ9LTR5C? zIwK$|E=O$xcnX4Lw*!WC>*h6&%ukPs?QX7Y;d3t6{q97$Zj$Ep0L{I3?`xkBnVFp2 zuU}nl6|UMkZy&Nm_4O8%rflsqFCqBKD^Ksv0Wu)t0?$47VOB&JS5NSTFm=P)Mip{7L6X-}4MLzPiagQ1fK zNFIqrC?nQcAos#oug#mk7}s#83;%fUT?9V;M}})0 zksjwOgrHm<36DZsTeOL=kjQX$sn5%MEh{VQ@jt%s(yI!Uy`u&?uT8ZL4X|}~HRSSj zD$nuB5V;q<(E@GBO;~f>xLJ}3q(JuK&HQ9#2`do|LGR#*s(@=dI_UM%IJ41TZN=zc z?J)X-QCbQ~NnKvM#*nQ8-~Vv^R;vM*R+EOHhAZgHETIHO0qqM#WpofQIHFS35w5+3 zxA+`RLaBD=&T_N4{FjDWSMvag_*~`rQoik*@-`LevZ~t3^YL5STby~FY*4n=A28wC zy$2o9HdIvB8C+fUymZMoObYC#OXN{mO7l`zOO~&V4YyA2Ls;2&i(P_(Xg37~B@OI9 zV8DPrK4MKWi)8TQsh_4yMYM;(f{#gUZno2J2ZBY0yV>@eXY~?){tK@fzBnA}nq55| zthIHftSr_RNFMHK#V)}|Zbd9w;VrMQo_$jgyL9yM%mwgDSKf1h5N=yr_D)uf22$Y- zY)ttWuE1~glVtU<_3-2I9C3G9f`<{ety=)nHf-4n39##+^4r%7on4$=)4=q54lI_x zsCVw#xn0;~(qv0xrm}aUDFPD4MB*)%-^`}n{_1P{-hTJJH~*$m@?Oa6D`=B=ldre{ zw8L5MgAGf)BX(d$2kn4Ygvab=_J{iwcBOJwlVUB#-N7Q->9=g#vU&2zFs%sA zjHb2a+@Zr4u0P91m1Gs+si~=PK@eLzIyo8i^|jYQd7L_PHZZ(TTq0TI?0XYkdG%*! z!Oi5FUF#CtFCjj@e`6h#po%J5$%+o*DwrV>(NupRHwXJ#A-D-kl0oq%3;2(i-}oO# z0bTO*>1?m5flf*f4?=Pwr`MR9DhX;77rT4=1q1~L2L>ED0>iCCg$BXZyZ z;KI#=^^&4rk!47HYHE6-G=7?9K7K!+Ia}}9FB$cxCinBK=iWkpK3#wE>o4g#SuX^d zTuqlOy`p3K_Kj<+D=8_wdb6@Z0xFfR04g~MHYkG~0~U$NB#ms2G_pC;$R-h&@#al( zCU3DsMDz@jMpo6zN4BWA*z6D(P9Fcm10Bpoh2(dju*iJq9me_Dk=y=D=hpy z!y#fk{82s}kK)43?-(1J50X&nOA8Aw7u^K+@pc(;SRQA_PD_J%)TW)g$ayqR+kkog zMaa_NjNQJCEVwipJDpmDv|o$B!{fZmfi>DSn@dZI@{XCUBHR{H9m`RNBe!a~icT3H9_8_z8w3EjN=n_k z$MEncg73X(oyx%(M?q)En(HfX~?E+ zL&!(ootj$i9$@t&uM{<T!K+IOO~!7 zU0qp+5RRJk+z(#(lK8psU-l$cZ?g7Ot{0 zkXKC3k4>L zt43B#VKF`3+RAQ$^uASY_39ndZ`8sq+js2Tv3<+pas6W&zWDr$FY(tH^GF7nJ3;V5 z33rN>AQ?^imRi6D1zbuxX|fF(C)_CTptc3pQRtQ?p`t?c^gNMj-D=%t-Ksg^=_yuJ zB!G7#wQ?w0;Kbx;$wLPAhi|cJdxM=_CWOA9g5Sy0r=%Pvyv9^A(yc>b&bt|f?NHw+ zx_ujS+5tQG14`3!vZkym#nNaUpm_}--zRepIZ^#PxFv5xu>7*VrWPh)nxLeNNeJx5 z$?Yt0Z0s=6gUJMCG8|3>Q1Nr*`%V4u^kvJEt*cajIZ<4QD1+N5c|7&cybJIbly~WJ zjfz+@c4F0yqo2ORjY5dM{R|mo^F944+NK-g+e868Zr@H9-h_aXTJ)CpjxkB@a93y- z@8n20u&c*enKm55IAxsQ|2W{;4sfH6U}Rq77AJ~bQ*rw4hBlzRUw8=fe;?Lo($-Wg zJ0#H4{MSg)t(tF^ z-ki|RPzGc9xsHCRAtL5MeW6&XC@n>Uo?`4UXf}LzAbDhFN-o0a!n=KD#)0p6_)Zbj zr*$OXi*M14CHpr})TUAj(n)S7VfP^98YZRmD2ET5JHaWF5i)rXy1Z9cUS3gN-=NTR zRvHs`Z5;tb`Y&h}v*5zs;(^m2Q!EBFMzm**Cm){RK4UjX*1OKj`@2^k0>9+TBhb0U zRS&&w@-ws(mg3A}+~C#&Tro$zor8~)MOv@Kv$Bs1ZG)`1q}F1+Qc!qvI1@HhjDYwj>wThS@NXEsf(e8y1j1_rAkA`$%FH2d9(b$ZLu`YW0gvBQ%KVgW92nh)c zi;DC`=tibKZd^IYtL_lIoFA(58nn`;LrxU8LuDoDsU9TfHv~gRqW|QQk0)?)v9{h3 zUKd`%0)7H&>k1*AJA48Gv!2Z0u>c;;PN9y97Lmj0XHl+OZ@aQ0tk8l}7x7ta?LBKF zq8rhWJtO2gfMc`u;oc6HzWVB`OAft9r=xe=FMGCObZ^gcX!P86@13ze6)OZuxjuuO zHyMmxzV2X9x7L(gt<3Iu=lZR>wpKyy>gOUn^2p>qZss%JeDlp2vs<6ZkN9_hp#`yj+w*K7;gMD zIM#y$?*Prc6EGOo$xmXBQF;=dPgj}t=uhWgx_aTnnZokMwrs6R)m%|{{GF$BG^0jE zD~b-iAZhcfUpQ2xh#tl3XHYUa(zW$AMUW~jvv@{D$B$gFdE0hi7MmB1O^mMp{Ik!$ zz+Xf3@(czad6j^aiWOw2^WQ?r#WVufuF`RT6-;I?4_D{I-ybJ#Sp&6? zK`5e%9swWIe?X1TW25Ej3$CC+ckLtkCM}VjN-XQ|Hw?5vE)rLHppz|^#oDj|(Uqz{ z|K~uIwTpB;biIwYE&=A|=abnVsd4;Ocrjqb;67@!&>SLIiG!xp9FnIv{ry}zLQc}|4Q14TB*7~=efBh?X18qLg=^bZ#_!p7_AFZy zD)n!INDh%-rrAjFs4OVBauptn{=}5B5WmTO+o(j(!b67+-Rzb)dfAQ?K;}O?7v3l= ztf(}%$zGJ!?4-bxPms9-Ko2=hMN;m17)^K}xOnd31Hnbo?6U6@(1eM(amU=8ck#;g zVeF9N@zyC^>KDR0Zo5`YdT0qoVcy_gPFJw)uR8Y{hVzPPYbc?dj~VFz5c~BF3kizs z+w)fdA|Ig))b4SKRz=->4)Q3ouk9do0dsSj72qsOHKK<;B{w_#kg&mCwsS9nE_*p$joO68^z)V2Q_ z5)vfx{P}0Vwv#9Ke{-YOVBZ3~4VX-P=3>kwzyxMNM?Ec>_s_oz?DSptPPw6-a^anF zKAmz=opRn%jxco-hz-zG3?8WepK6UKTH{Ivg$VdsR?d`n!oq@s1+D2%thI!HXDJ_= zE^IeR)TZsprp`|SBZLh3iJpF?z^@1e?)1Cv!7zvG^aO9M>-+@o4DS3SybqiRb^29Q z97Jf+6XF?#>D3K&wRLs%8oi@G8H4#d>gx+AS3S zwFgrUgF%Owk zUmrbs_pbCN@%SRijH0Q@Tv-HuhSD)Gj+m(f>Kf|mTC|Qn;C4i%Oe5{6@Nh5}vfW{( z?Cb8RYAONO;~KbW#IUGn%F*epIwyaane^GiW?%tIj&*2*rV%bT&mN(XA?~^+aIUHq z=4LuK%;uxK;sAC9_opCiu0nT{$=~Qf9zva+ef&eA1=!2av5n}_I~7glh6eJrxLbEV z|9XkW>ST~H=@2Xj7X*z|@GdK<>k6nmx`@o_dtKdd>FTW-YEl*z`S|20eSC_FObYi4 ze76yYxu1)*x|%h(XJl00m|ngvt=RKz_Wn_^{mr;q&~Wlg6BZU485z<+mq9;7Em-)DCY^u?3?$Q`WZJ0YFef@L zZctPRMKSbtY`}yxI)*_@D-4|MY_$k2Qw_j@mm_)P1Yb zCje^^Z9rEe{EY$-A&apav|+uC7T{(0J|-rno8S#}ORZC@G@=TqKwEYYdMK!%sRJjj zf}fu&)4y+2x%lbzVqGZ;DXmk;@`}mSd&XxiDJduer>d?|G`I(%!tltRH0y>MU_3R3 zAgsk8z@acgz9FP+Q&<|!&26|x1U;1ow$ZqH^w2ezLlLsPS=U2a+5d0BD{4)a@P(-z zmbT~m;yc&kqALY=?lcMOHbBU@WBBltL|BESG2&>eb*os{fN*)uR&_22Nzf5eABk(K zUb$lNqRpE}0^fK7jvHXz!IGA_YB??(bm^jGVoP*YHqrY${c@e|sB^a#(~nDtF)1LF z-Ay0uJu?YmrjBRUgXE%6s*B}>V1`O+o# z<|!sBID15Q9$t{Nu69mv2_inFoR4vVQ$~hcIh*7_%>1PD-dS z0Qt2xbye?ih@ zQa>?1D_QhmomsV-JPWN}#XIv$If;+*Fxt>T7TK;u&3R}t`X>(%j!1C_aAQQOlY9-P zU{%sHK8>WkD+h#vI$}G&W-jW<1X{O8(vErpce}l1S($9`Qd3QbKy{6<+$5SzDPSFJ z*D4jntXC*gtlPn*GMOxvW^<->4Fr-aq_o<)Mrm$Fd|0+(K1EH=!L<1N(TY|0i!10uroIS0=78zpSgW3FzMHk$R6M;;S?A`c~BAmLHG{-D8VQbKGe!V zJb6?}IdljGj3i}thm|W=ESobbwQo0jYgzu6Pp4WpQ8N6`mFpy6zJBw@t%htzb9KF- zclYm^^3aSG8&c%VSHKw9j|P&H z%)e=uj_OlcT2@w@0n&v>_kA5W|D!Im2Kcnq*Vj}P9R2#=Cx5<>S5#DTpZybA3o4W< zpg%8}9G-jb`4?XO_+O`rs;#ae>EKJSofI@DpgXB+`FVHu&|&CdZ)vH!eeLWw@4fN- zTDeLnL;mQjCL3V6jAiY)taM5KhaO|a1 z=?6~_1IQ#U+0*ECk{gq;oIQYGXg6>w(rMgm&I7}dE;^BMg@WwG<;R_y4e3d~awCb& zi(^J-b$9mwiwU~%o`>rQ<*L0%hcYg9YgVha-pI zIeg@Y@4r9HR}y)@OFDS)yYD`4Y-FcbIhT;I+nqiW;^R)7z*p^e zxd3;^j%6$97t+~45ETlrkV2X7*0yQDK-sZlCmGS0l$%!yn}JUPL9$jiAxwnDB0Ab} zXhy#>*jejq&G=zU>zb|fi$~#7l1X+pk*bg*!Y#vva#OVx1@K=1-?Y;Sglr-ybg-Oo zhF0!^^}4)#I?40%q?x?uz2c&xV)P-wtg~22@xyA7-U~%5oMneWvPKrX!#jTc^|#+8 zrwqlFlKkDbUwlOupk6-jY}a4#U{tEzWVpKNy$(}Oixbw z_TOK9CAF~L(qy)(wQwYI(?((*Mt(XjgT-WBn4S7A2@dW$Pp-wYSmVA zlVoi)8f^$#G%E%=c~^v(S&NoX(2m9P7cL_!=rzk0&Swr?mmt;$wWL|l>Qvd9ww5Oz z+q2u0Y~7^F{Z>fX20?-be3i``)smcsW09(s z^fR!cmFkU~0nAa5YFmo%Z7zz2p4*Qwym~(BI@uk%h@~Z$ zfZd(Hbh88*_erC0R^-wdfj>Es2jiE8XYIf(SiNoidi)!Kk(JHOku2y09o;|yFXZt@Amv8CC9N>MS@zdc#Va$OYOXmJpmEP6x! z%UQY9TEWU!3Q==5Ynl7vjEdV}l5(#m7jyz;)eopNJoYGJySBSNdcuZjWujzf`LxsN zEMHd1t!L<1T*UTg>H5y#HE#thkNUHovY2)ag$eRwg$&Xz1# zw4CDEuU)=q0gE%Ul(;1u6jA%YBc1!f8eR%5mbEKqYxnrg_CG@UAwcr45V`QegA0`~@_WuXCckG)orGnX`87_7PaqjqtR{{jiC` zNu=+Ef4N+}a$mv80{rv+B8r=%{Eb>yqE_|7`7jimF%lfhXTaFqE7T!^N-I*Ca9g-8 zC~2v zb?(OadiX=7-RR`t=;+{Nga*97Kj(8mh#1E2{2Sm+zNqwONy*L9BJk218aTILCjZv} zR>2%*)t|HChV_%%`ug1v?eJmEQDPL_`k5Q zK>zLo`XweLB=#H7-9OMmya`-?;r}caSfe=GJ32Tx+B?HP2ye=zOOt2Jo-Mro`o4EV zL(!JreOx?!yh}@N-#L8-?BHMhT7sJCXiJaZ>UW*V?>GA0v9#Z6IxFo#+D0-3?WRW- zEu1!W=G;se=8=KkIhceV1%36IQ(H|%`89YqnlNR?^f6HKZm!w$qKRJ9Yg^uBcnt!j1+O}IcmxjFcLbM zbqMnT)tObKunXViN+}CD_EfbvSQK_KsGQM3wv3>>x^?TJGDoV%+4se*f~#NVg`zz+ zZvk4C6rm|AxqX{Z>XPCLg?n^HMhc-k>FIsC`T4oSFRxD1)(VexjZJmcz;~O>eWPJ0 z7$5BC2+SM~MtW;qyxbkV!#Ez~9pPqa)7U#XPn$7k_UwmeO&=cHtqnhG>((EP&!j$r zpUJzpxDlGOa2ji=sn@`w-_Y7<(Yd+8t4X%10V>rk*$SOt&Q|KlGN&DKZgrJJAbF4$c8 zr!SUc;H|z%Q&#~|BFXFv!XMOrdZU+*2lU%#mTnEtRXsOvFgCf7iD3~c5l!U|C27PYfM@8Hy0TTQ`9C#B82yep*@H7)JNU~j%Db65_d z%=jR0)m`9SB{$)6WXIO!={?9p{f~KXdOT>`=8Y@C7g@Vz89pZ^G?n6DDfXE-an_9G5Y??rRNNrj(*TWwyQeof`0)wo zGZL;w`#Lq36%|~(bnQw((apk3=S$7magCMbw;?RQb-VEFXXyRUcQqc}gCjzr?%2Is z_t2i+8e#VEUhaw;2R_)pZ|@gp%7wt>anq!kT?k{5Xu%zaBPBxRq(9t&SBz|jXDmZs zD5A@Y4;?D5adoXJFJcD$*NV#PKqV_b{ph1lPL=!jWS4*WDMSkX6ps~k7qXnfwdTA$ zvo>64Zft4LtL-$VZdF8yR#p_9K3!xM)GdOhd!Iht-CW3c#Tmv~MCoP#O%JrSP$M-6 zjbN<>bDKX=2HKjGUtZp*RO(%cq5kP7pI-L&_pdzu<(J1RFJx)uHe_oodQQ_2X*i`1_@lP%X2m~F z7cx8jGRJ1VFRypPb3@t)DP$i_t#Fut52hC=D+j_2$hx)AZ=kJ{l?4pEL+Df3KJL!N zL%F;)D6c<@Ji|V!>l>=8+wYKNW;l{9&hpi(+wWFCvRs&JGI^@hu=Y4~cmNq|Ga)u} z=m<~;(|NG;6BC%K5562YfLVsfHIoIYTZCgBF+TvX&2Hht=dwYW#T{C_;V>htj!iv*zJ)S<(c&U7qOKPfLrih)`a%|`Wcf;H@T`1< z-0Oa)2#4Q}7jZ^FeP8&q$Cz;Sfsa4>?DI$Hl~pSrp{OPc$>Inu5e#1TR-pa0rFEFs z$kvwn${Uw2GxN~AOBdfqXtwW!ChK7QZej%CUGP&79vE zx<8~hJtG5sJss>_T)n&zJYed?Q8=bYO{80IFIN|PN8hlXp`kr|4R`VWU4xx()G&BD z8WtranvxDHRj_jje5i1|!&6UsT)|@y-ShYHMw5sICD7b8yt_Rq#P}`0!Ee zdWsSC89D=I7R+!=~Nc@>=1e}Iqrs?Xwn z4c~wN{S~#J2O&A&)`F$W+&8SD zP3m^6;r<@hnM~06RvFw7avP_9P-y7D#S;6{VQddo(Xr3p+kfcPl`1f}NS(E*>gM(9 z07kejLEVrEKpfvZU*{QI|J??f-@+x*G9`~Ue3zTCKZZc3D_Z`!k0UtGO<-kT@wEp=^^OO>5H zbUT&hr%n+I^5=7ZlNzM_tkQj?)QMgX_kxr#E-ogEjM>>T<&hN zl6J>D-;+> z(IGU6rr__{+1b2Rq#+yf$vbcEyLkogT`MX+{1zg?n4Z}8jXe1rH;(S>1h*wU=4WJN z#K({6H;;4Y$jLw%LQ2s)adCb72t7O z!7o1g_TsSvUw`yYqd}w9m>mE8?}LXLn~17wYCLohfra>L_#4^=4@b0$68ldAr6a}G z6T^g3o9}|pgwMsX;y7`llrrG!BurabK?qnyN5{2Cc=D$Btrk^&=Y^RcnjBzD_!Xonerd(2t~w@%@lNCce0&37mWe;N8i#?ap3@bq+hD5 z&jHW9*66PZa!>p%f66yY2e`ob$7fF63ouxi)z1sr1`*c zXJrf}`TL+j;f5Az28aj4m$dA!W*bFT+O-W3kH=I4ZQ*?HcL-<0xNGp5NNJ{ZmiC)( za7G>Y=9_fuEacg99C0Sc12FY#X(8!&OADF)N%cPeAoT_W2hr&s6r9FGo~GTKx3y!T zmC{n{GCF3NC;DZ`v8U9EZeRcF+wX9Mv>ZG7{o!Yxe(do_AA9ntgNKeD`O^!}KbK~m zZk=YGXr09O%ll}VfvIC7zH4o5T|Gt9_&cEKe$|AA+E%-f5YdraR7xM?*pNL(y{DC3 z7G*-bC`Aas$@>T4`CtA9c*2`dfK#bI1NR>C3{`EznugjOm_ZAo;&Zgz|E;&)eNXoB z{NB57y_J_&a3v)bn=~Ueh0bPaJUJ(GvniKh@MOmp^7U7+2$U^;ar@QRp|rQxk%Mc zzfn^9(8P%kt)KAFLla6$u3r-a1AM!Efa@8kZ}WLtgc_pr^GG0+m$|sGl?XFw@eo;Y! z#$@saHDhId9$Amt?;uh0CW#u9W#VF)57G8JS<04<7WAkhA@rSA^P}cgc2`w)?b@)6 zVYo7eUAtB$3^4fts-0i7dc#_;Z@xP4yihvjL_fYcj3aRlaBT}LqyN8kj0C@|D8GO#G!wE z>$85-+9enBF7WxCjq=T_VyzUjpj>zU0+S;~^`;Z2cNCK-%3sS5p>-Ez2Hy>YMs*EyY?nTi)X0XWGZ%NvxgzoA zNJ*qa=lBV`7qupp7ejxnd+D{xit6erq0W?a=+N%=KLFbB-v^+e{KJtS z4&U=uLSldUEra~p5xgd?AClvRl@)>Eb@TeQn`O1lYI`+!4=SC5JuVkldrez?#Z8Ps z^&Nx*54orCE}C%ksI6?`p?kdc>dP;`e4og)%H#%NC&O}2%d<;yE2LHp!Y_R(GTqO& zZg)6K@a61A2&B|Zcf zq1uvf{=Rqb-s3{toVj!3gyXn>`(MTC;Ndgo^8Ga)Z3@`?1ksJKW9E~-7RgnOvD{Ey&@0fKwm zHL8Q?Qx=r+|L-U+CJT@znsStWK(`-Nf=u$u5!bJWP*xhd1eDfIhO@E~4$BjovXwkW zBft#KEyji6aTO<6C)i|$PvQ4OY^#k<7cV*)>4j80LJCr^aJ`y#c0pFGKWX4P^Ptq>&?PTGFhukrrCl%27?NQ>>G%sNOn3t5I57)QZ+-go0%W zR!-C?zAux|s({wU+G+$Xtg5b^vvBG1o`R?ZD;#dfH?LneZ}#k&Q-m#`#?<-_ZkKk0 zv%}W0>;;eXv-(8%Gy`~9dPJy?e)8!D|NH{Rf?t0zYEu_UGej0rTIP-HcIBN6jEoc`PIybmu^T@qw4Q9OE?msS zvA>%M!ewW640_-7AGwK}fswBI--Oq*V7jXo5q%qTieR+r@LAw!&kAp!VuU$qGz9s& zU;A2v_xNf)gf{pxuhv)$nptyk&6zW6)`}(5rc9nPW$MxuYlnh*&yiBLVeN{kNg!x& zjafkv0`{S9p7sIV%L!{`o~BDmn_5L@LM5EV*3wgeXt=JlcH?2~B3+$nK7c)4;L1P@E?0O^iWblJ4)zgEdL+vEo;| zJoEl8quVcnKqZxi-NY$_K;f?fxtijrE=4;gN1J=JE9QgoHgDc`vV!{x`km*bbQW4^ zA7Pj5H9fDj^)`vCiFeuC2O7B0_y>9|URsMoF?K<4L;#yyz}lN7xU&Ne`OrqhD8(P{ z9_n4ydj;a+<>)jTrO-wkX#|uLnw#4MrACtjjk&C3>oSfFIk(e&FmUQ|p_JtQ%{GEFt=RD=#5?g?z zH*%Stav28?lIY{$K{?ObqY|h`ed+6avX`4cXcBPmYZt_TApM`8qy>Ui|k2O&OCtIUJQ|({zsXTGGs`OJ2Bu~-Pk|6 zb%vS*E??H$E4S4(PbL{$S_EzNfH@>U+5s$t*9_KI2zIk>EcPbZQI7xIl20< zNIqX-S}li9VFa-SQYux^?vQVkqest1+!s2k-a*=jLM@hc>xK)_X>T%}ao4HHZ_5(!;>4Z;FSFY4yZoH~AJ|JdGOL>(HC8YffH@`)wK|d)6d67sob@XxC{iuq z)L4h;7j=n`G2jy&AI_28EEpY_*LTN0hq=P!L}#_y=u78ApTs`&&)2ACW9fwD033yc zxC%{EMTHJp$XR$b+}DU38g0^e^B$d%G9(e)pFUMpD7do0DY9>T{~;+uGcz-=5aAqD zN;v3pOezK_bKF5t`VAaEe*8FikpV3{Zrs?>BVye78473!s3WZmC0j)pNm|LTVR;aj zN0em1Y_HWqzon|mEG}OG%4ox)MGsH<#l1EH?G3zLURHjmzP=XfNl<1ly?qxLb=j?J zMMa=ht8WuaqckVW!wOwcj0?udK?Mz`hUQlITxu3gP{e?5J&gj}tIsAVJRXb=Zr^o26dMJ4*2jTMEipPS@3tOE;QdURIC0`6x+YE- z+s~8lwl3Do3fO;4*WD~hPDx2FxhbueQD{N%1MD5>=KKe{hu~enZ|xqT0Y>=0wSP1y zN#OAeJ-4adRbbm|UiJ$YY z-Q?=dB<6h9ZreCn*A8LbjX_@9c)Ynas~=FFX=!dKE4$lCo@wYP&&+mKshOWzp#cPN z-##SXk$RJj-uy31KeB#H#^DIT{V|!_c?|OV9N-DUIO~&&#mX4LAUFuX$~^<)o#SEy zV%(kGfu4VL-h7R#d>Je1o!JX&{q3{W(;B`R^OC3Oq!`)2-IxaLUEI_N#1SJG0d+CgdHkG|G&}gq}Qy6t_ zdc9(Z<<%jgLH~#t^O8}g)+in)Z>(*bG-{pEpxV1vWhfV)5Uf^SlXA5pR6xaoR&fDZ z)9uff+n!$n>D~TZeqW==+tmIvMS5GKIJ>p|Y5Tk9r?fxqYb*H*$adCeYcT6`tk4e% z)`6kubiag9xtr*47lWX2ck`f8ai=j61C)xv;e&b%hz20+$@}ki&(L%a=-D&CQExQr zEi*AR1%X2%`w!PDREpIYl6wcL7qmc(dV9T5JR&|}8>_9hmR|-j(B7j_w&w*v(5Xji zEQq<7#r^_tV?K+0ho}-TkpWVZ1Ke$Q&bB-BG(NyV8BLQL>m1~*1Lw%S_qZL?H1=BY zBZJXsu)HB=vj1O-3)%m*dZVQ|AjC1786mL0P5nFuE`ft@p$l1V&5kcaCFCrxmEtda!>%VX-m& z;^V*tjhAoM)9{MwjA@bGBHY4<^qG}jls{tp_!0R(jTk+8#7{=O;#q?+W_;hCgG2Rh zQ_vrt z(gJ0&DmS=zJ!k*E~Eu+_Vk~ zwu~^DadBa!z`~Z$`DL49v6B@s8yA1{{0Ld|>+qD$Azs4SS?%xA zn&kDJgZ@MNb2^{++vf+gKc(}DKfSVq_VvR!ooHkRw4Y4@?GTZzovwg+kf!qybrF>~!li!+W%K55x((%u$_ zvj1Nj4IQen)biuvnjW;7kP3J_6Yx0km*8=4MF)7?FFxM3<@lb`h+`&i7)(HF@Wx3) z=MC`_MWfyWks z51G4W`t;TFqGk|C1aLVOAE6dUAr`cp1hnM6CrT^r*Xr#_#VJ@RMk)_9`2!nGpfqK7(gm4wlgu*XEvM=&!^bdMBN3R47um>8Lg|R*X;j{J*WFmCErS`zDRw zg58{t@#|pIYwBtmOkC&j zcAupdcg!Z-KCioTr~>P835z^!NdN(l#dv{6&wO6$%bD%a9Ci_8#QmEkW^`SX=}Jfq zuQ1>g!mxcr##U>y<>%(Qy!O;*#Q}#GN9glysc)IK+{?mi^?KnzPd$|Svcu)_dht%W z6tOozxnr@F#s!{w7|JI|8fowlM}^eRfJfhy%tt|xVu7}^LGaf~nJ1;3k7wV9{y>8` zIjgnuXw>Rd?zY^r_@V{{MgtVG{Rvd6Fg*`?k?mU)tQ?^80$YWEu33Z5>Co72GHGn8 zB}Nxj!)r<)IpEwrpySbxy!b{BY5TdBadf}Qk8H#fNL z{VA{vXgnHjK8MlaQ8VGDs6aDP(<~9ONw!t3v|h(lpHD48IishaQQT^=#vJdo<#>Z$ zzx__;8ZZr1YieA41G``2kxFIi9b~#+Qmc9WR`NgL91OYq3h9SzrZqj)*-7`N?3@YHIVzm>Brt7in2+;jlM#6-yVd zYMNfr@QSB+l`7gRhm|gxi{$gBdDgbgz=5i;uBu($#+ zxx}h<7YvdxUwLfx>SH4c{#$Xux{c@AaFJN(>0U_SOWR?!@1h+ot6R2T)Zc&6c3kYZ zsIULPv6j)6)w^3-cCW_8u>-&j$?gq|<4Fz2_cP99JIQp}{!7GN2$z}9gLAww-AcS# zKK)b6CCfhjFl&REeK?h$<0wVC7vk5lm&b7gU$)<=Y*0>U?GELkynQ*PKB(84*>RVz!5C0RK%wJ7j_^HuXG$g zBz{U%o4Q|A@#j-wfIsWc*m8U~J<_nf@Ax(tNt<3jxKt1CS4Iz>TiM)Fx%!MIf{eKD zEFdd1Ymnf-(#Q|d_ASUT@c%l#zo%#a_B+%hvU z0arr0?^3f}LA<>%JpdVB$&3NOTJKwC3|1>%FNb-(>b;)_AzG$Yx(7S~m<26IBE%4N z{AzZl!wCwek(MEBCFIGqH}}tFlec|zNWf|E!V(f6&T|Y@WRdyRBU^+WF1DlDw60-+ z{3(@KeKXf2{+xE|S(icea|hozH}RiVuL}vxj*t8p82=_={F@Tvd(WKPnU{KjJbQVn z@TFb=>i16IKaKayF_mu8_SdJGrfId)?Xan&odih;2tl>-=_l|udg4?u?9wLS77~cL zM261L2_&~FP#Pd?;G@x4FZ*cVoC`v;zyuv4Hh-jF@w!=$Xk0tIdrRBSRTJBqy7o`^ zZSJiUswZI2Q5@T+r*|}NnOLLk2i zYzf-ckEx!>%IK!OtdV?e)u0yiu;Id-p%^JAvP_TTb_WQ2eYn5Uq$E( z0+a21y|1`o=IXpVMBGd|k%(Ig*nJmL{}-A^IYwh0qp`#!kM(SN#Al_|{WaD;cn(a< zyMcYs>=dm{8FnaUhP9zqr}6~ij`m?5|NlwdN9w&RBaZtxN=+tn)(F4=e zmtX?XlZ^1ebuhGC&Ru6^BBy1;K(!t-Ae*bS-sgM!rOP2}-O&+`lTMCu%)poz#S0{) zzrta;^vp;*knN8lX_0174_aHmDwZ>?MXVG7A)jShuMRj#p%(4FT>I}KlnP;${pweW zsuse}{d-%k-|JQ0CPO?YZcz5hh{lPFyf7BP#nJmS=)INqFM8LyH+rWF8jg0fp|{h; z&%HkDJK?o)6&6^JU2M(q1^s^O#mB4#7*>dPT7BLeZ;tJ4Z-XN5@hNY$IfcucbK)NH zLAT%UP90QwbG$C$w4J!v2dWaENNw?we$DVORh=)XN~nyT?Dk)f6f&MC>XFa?6epL{ z?d0c??GK}L6wS91^Bt8tm-rRPp2|na9zOSLo7YwB^w@uJx836m zA_nvL?-ih&ntt*VGWykZ)dFV4b*==uo|X6Oi@+r`PuAqZo>!7|P#>Y5ZNh$BJTKG~P$VE*cL- zTvLbt4ps#W@hFVZ;}WA9<}%x%HJ_V)n(#?aBW8Cb-AdS$tq-pzT*A&{?`MtV{e(%)C&bfj@~ ztv47-3^df__}u=+hVtt8U}cJpw6^@ZlHTaL6}9=Eu7;XMoQ2e&dl*n(%5!`MIov!O zhFWiTD8HXuuJzfzbn87@9}eZI*>r2Vho^_rtv4IbK0hUKRL3|PwIHX1bULhPR}y|G zV1m?UT3`)jz}XU{IkQ-&)r>sxnaX%oX*eHf>eTUA-&yIfdE9=tPsgOgrPS0`mDq_! zeyn5jvC7`Y>W+{Lk(Mf;E{)qjRi4*v#;(I-6Satlt)DSk z|FDYUoK1@_S_eTdgbQdqx>s)5=?9CXnydNy*=r^vkc9!pTm(TrGcxLHw9udPiNt&h z(^P$Dm4S z2m9taim|SuxMOa(Zxl}mrE;_{IT50;TFtoHQrkwfpj=OX|5($C+9u68r8&*0Z_?Yj zK2}~HTaQx@(VSRL!#v!H!qSZ$^DNe_T~hGr##C)0IKDeh!^d}zCuTcJg+NqQb=wQ4 z5~B-NMX@f7CZ-DQZWYZ!=Cp*61jl+j!cOE`?k7 z6c$I!f8q91;iIg(ts-q@WY7Lt=1a1bc$mc1Z&-^{EL~XDzoaQoiS39Gkd6DZ30Eo;-J6L4$#^Npzz?PD{ z0&G_rM^HxtU{i*ZOqV6|%dTMCs`Yi?6?N-ZwYAn9XXCJs ze%~h}UB7z8)%+9qNP|UM4mu-&R!Cg0CPr%lD+(-*=?@IgN?e`v2}hyG-*rCZmA&hX z;ql!G@bDXy@OZ4LrxpyvlZ#9fQIVMWkr)h5c63bCt8d?euE;c>2@6shw?OQU$SS?D`X$fV=EAC)QLX>mwi-?OX?N84`d3D zj?rvgiR4@|F zToa2r>IHICEMgDv4bMD#I?PlpS&$Tm4t8LsP5uw5-UTAHg_7ZcPP*t!)W4NJ-zxnW zOpQG))6McC(aE2wNoemH?*0ng#mQ$Z_Z1H&V{=eWp@&h#F0601G&^*V0+!7O3x?)f zu%jTwV7xfW`Z|--5y)Y1M@IAwV`iR9LrRtn~%N`?*$3NLZVMv}`0mjwSHTKFr|FX`o=Q}!`tw>~>bG$vdB z3Tl$i{!pY_i6W_$DDpq?DTwQ$2;DstLp4R8q)q}F)8#`RtNeU>fK~x|NZIVr=++j# zT)k>y6Gxn+!Vzlj+c%VYhMp5eb6dC0rJlpGC>TwSl|xyH1)3v?jASAKYqmzT{OCp0 z>*wju&Xd8RNLD5J6}i$+0TuAY7+_23X2#63mTfrJsL-ynTnEhLkSEBD8^Q@eYw%^< z@7I9ws^xSQrUk|9AETR8o$6JNYK>v`gh5ZST&1`u$11z$bWi5r15WzQ38sP1;L4#q z!*;5I>nBXDzyB&$d-3;Z{imt**^g1{ztQ?EOCj0AQ(vOi7tng0>Di}mCVClPTq!PP zx`5tgaUz-jN#bA>;kP`e5U-MbJbxSQHwz;1pTpDj6fuC-Pd3jhgyOR?_|}1mBy3r- z301ohnFqQw#631W)IH(0L8gi?=vXyE^wu>d^a9F%0?OYhWSvMT|L_Gsx%lkjO3TLp zWeLUToW=^mST#HKLfMpQqv31~VfYM4{T?3JX8?5v6Imsk^)6~V@lQkpt?;Pw`qNT_ z=2eXPO{_J1D1;eFH8iHd3b6w~Q;txzKG1r)xQNFxMi9^NSlS?1A@qwB2$CgV#cV+j zIkY~{W3-n{tzOC~bYb|8qU?v9G>MSDDGn3IuRm{Zq(+&Dkl#I0>jukERCN_Z7u_eNT zb(Mn+d>I|Ancf+Y?(byYZ>en;!tfvp8?i%`%GOEz*%ojvD3-`Z_TNGm!^1 zmSv<5{>nVX<88qU45BuVXOgB1Of7*^8TYymdvjEW+kH^=ocM;0x6_0h_U~4rwt2)d zfH`9}Kf*yTZs*w$AEa42ls}xsyAatDglBk%p;wwXQd-CpZ(3%a@TfA%i5p6x&-~h$ z8JHt7CXf*amMG5DMSs?$K0qlG3S0QdpF)%z+<^4kw6P%bn62BCH znZ6p|44GivJg$AJ{Rf6}x^jm1_xJA~#>LQq{@yJca+-5CE-Y-s#|F-BC7bz0=9Bkp z>o4*2Qt(yb&-We?BusgCZ&X8>Es zX#Ghtk71xzqF8!1te}X$jZ~rn2l?dwwMtac(;+_4{ zqBGeSWYG0>#SfcVL8g1HkDVT0 zOFP-5ZZAR;5X@4sglnT=bbWJ9T~71*(FXQET^Dg|EhX#?QlM^r2EeV|oGpB+@mOt82PiScBA7`cfSEQV`hH9BnjrXVSgY=OS z0X@_HLPVDIDc;RV9xvVcyZ@nQ+o0V53gg)yJxj2)f~VXL{0)$%N7kju<|HSFIk!VQ zf5YiurreGfJ6FYu;3;+HINVNOZ6eygx@vmGijm^zn*R2&X1tTh?gx>fLBhdtb9L^DJIGO?Yf2%xHLo{&zOvi>yi;^t`mzB{ePR`A$mXL4<>3 ztY!^>I?}hC;Gq*S*iys7|4sP&~JpLv%h#X&2Kep zPROnmCh1g@W!$Q12Wv(y zgWZ5+2|U?Qy^{ezstr^i6KJyGZ5n)_8N$jrh>wIVU>x8zcOM_8R^}?CPsr9EZKE}s z0ay7aI3BhkdjWO9mKVrMN0AhS{IJ020`exHlzm`gBY#TWbCue6<_b|x7)w3(>8*2u zeJSLffPX&JOtdV=BA)OEjVHjSS<()zh_#o@r{NJ@mwuLJL480g+LvzCdxqzeJ+0Y2 z{Pz6xv!oTt9-iMN@leNj=-2R|M_I|0hv2|T(UKit6_3i8YT2scY&<#LR=oIF22%C- zDRyxwjEH41=kVASf3#MMoEms~#=zfmTHdRiCuwJLMt|5tGeRzb_#0NXoT>B_IV!f? zJp0$Q9FY1F#58@C~D^shBDi+FT2yNgim@J`;uc1+0Q-=fyFs0;(M4ujl?C8clZHWlW#G@F@y|=t|A0OL`N#P0>A^3> zgaqE0gogdUVixOO+bp#0nT|7@=2Y~M5P-)-^m&}-YTQG=IAK~1V?t6Rx)JkfKaKfF zzb%X1rBt&FvS}EmgiO*fqgG;6JPHU9BRL&ahxkd%JmI6`N}8wsR#w~vl&Bp7b8LHr&Z#32Vp}JNQBs{ z8DRwa?W(t_@(A_6mHRd(@h+r$L!rkYxS|mlQ#>E61ZJUOWVw}~j;%zFrqSe57~SvU z(Qq(^*mp+vVptPbP~vIL7r(4DFz)poY3h`5MJM&-6j`UxjXH#x$)W033bTgJFWWV8 z;85GaO)|1HK2te8UpCl<{JTszj)x-$cAq`42RjBw1sf-u_ph4tR3=*p&w<5b%B6rR zO8YV$R~l4|Ij8F|5F%>W?NyUUpN%x>qM~q_A8WZ6^+O1^SlLvb*RxA(OZ~C_O0W81 ztjmrMolS0g&xsH6y;nVUO!a!)3Ck=GZ>aM-IfNd(zssAY5&Cjze+4JRu*`l#kgbVYMf*Sgl~{`UO5 z&XGv})=tSul;gmf^PXxgZMDcm=+RD`Km8$Gs3xe&F3LSCnFH>HPZ+2C%ppH8{-yrpm~ z{~dQMS>!AE_z5!%=%LNaEay+Ku{9`r7@A6k@)0^G3><;WD${_cmhCc}4iu+$Q`gO2ONk7T&LIrX%UmKgYWV zJ3xa5wGptJqI}P1D-l<8Sdhb_tsK=(fN#Sr1B?Y@RwOwMA7-QtZK{2O-%VNVLf<|@EU zy=rZ3drRp(R-cnjI4D0ZinjDNd?57)vbB(ue}bvDZl+({%_;bHYbq9>jhB2vyy$T7 z&ZJW_;Py(K=?S<2-Q2pLq8lq0f35sec>(dln0B5nkzl=`D}khR2_Pg7A6N|14kR8J z$)nWu08BvaP6RhNx*^`Ddf)#cq^R0gU$LEe#P%!Jpp2s8z3u~Ewc*GmIP&bc?DOZp z71hQ)Z$47(RoB1iE#6?zyXi>xG);24`^cvJ>ioC7X}#+Gg!ti(vvN!F4xMqvAy0n3 z=d2x=0Vqtt2@2pBB#+gE7elF#G|y+DpfwmsC20xhz{`#83BbkQRBz7EOwEOd`B2T8 zouvakb$m(GCJG8lJO_9Efq?n#s!4ZgTNtSaxH)kcog77{QQpbv0n%5PlD>&W zxg1A+@aB0><^bA2#$2p7U=&D@Q_Uqkls+r#QD`je^`e3v8G{;=gAiVRY?LX2F2Xwz zxYVkc@c1l-pcG_H6%%BN6QGIvGEwRE;H)p9a>;0zp{_}RLdr4A0QQ`*<9R0Zhw?>? za$!0iKfCXo=Iv9Ty=i*g?A%Ry*NbPJ8Q(M1zj0z}N~=WnajjS2&%8=feKq$h%tT^Z zud8{StKUZByiK6?18*5tq!@RmAye2trt&4wT!^#08xWKbf93HrD1XW1{-n85!L)DU zac{bg#=Q>x9+GEYRMU9qocOnuMu<>^JGq2!8}sCK!xH(GdMT+xp{6t&hYXhU{F>_h zJ2<>}K$~wCL)S(paG2pI8PjYlSU(LYqJ}NGghVnSVFqqMqOYkqmyv6LlDfw05#N)b zU`$=iQ5_ru5@;&GmRxf19_`FAc+XbmJwwo6x}m@HNKa~{Gu+7>lNqISi*dxaFkPmK z84}nf6FF*(iItP*kCIh2dj912p%o6Q52w1Vp3UpFohe*I5UGEjxozEMkJYV`?&4T+ zNbSG;u)nmlEa&j${mnBSR3ols=yh){@_PKLujJ@uLoKAVw9ht!k8}b;%Cza$Ak-ph z%(Er$V$GiQYjAT-w?bwyvcZD^DuN~&&0sC8-F7COqX(aKow;r8f(fi~VRWlv}Qn%kbg+^UBNT>3@Khu=M2qOAHW8HMm9ZP zGDxBzy(6ej;Xg{sy$5!i1p;!$G#l+jE5&5msD^^nV8e;D<3%UaI81%YMc0Gp*#X}G zvT2oxsl5Z`FsDDNmCpcU{V3#S`M}<(={@)c|CJByneJIg(4|q;!rHljD9+yQ+zLOD zDj;XZk@}UV#MiZVwxwluZx>2kbngY?QIrmssI6dJfRAkfChLI7LTIw^7xDo*>}S$F zG)4@RQ7i0bGj1m=|rlyVENPIiA78mRU)rPD5Y9g)|CJx~7?i;mMaaY_be%q{x>m zY-Kvz1nlI%PXR7pKoTFzssm>=@pXd-8PcSksq8RO*IKCCtlE( zE{g|aO{`=!cM+EXhGZUz5utlz~N`7Lvr zCYAQp)XS}7id(!|liZ55>tLKcJ1>9eRh#GUN_&4^v!$-UQon#LbvJq0SyxN44e-CV z+8a>X((9>u&9*yDFAR0^EwA2&Cy&$x%0;|x$WDa@@zTOB1%7QT(3(`&8EJuX$pzch9p8+;Dd(B_)c;9Y# zn?i=$NJ=(MOZAwY5!ijYMdl}M;8d%awqtnbV|`guBoj^ZoSt|_Tfpo>iOVk?>57>( z6WI@Jy$1MzeJwNvghydyq_6a)WSFcMQAeq#rSlNJ2B1S4a;Vp+plBQk2)G;AbtZ9P zQddb+PvZdNo&*OZEi#=POJ**sH(_*gcq}t#v+o0=4rBjNRb;nTfi#iOxI&uizv3BD zD(D6dpuWmF$pjql`_rhG3@U}MN14K^RBIZ}DQg`>UQ?|D;6ooJhwY^-UBOBBry7?} z*N6&QX6SIsS6ld9+M|xkQ&e66H2qke{U_mW96@+xSBWxcY>jOvcba4n%BlS)fC?)i z{WY*jNUzL$Wia%32Wj*~!Kd=zJV^KhGb1hjl(4)V-@EC#)IT(D1Rz@>cWwaKO84m(^Fy(HW{K2%K2Qm zR7hwus_~~Q(m#b46_O2S$Lvsf9yXkZZ9VdBm+Cs z8B+0DK-;SW^h`*`@GG)yT&8=K7=}Lhqg`a&edK26}{U>wjS+S zv}`Swd_BFM#noYB`cKI z2Qw3LeV!5_o*Bn6$Z8d(jESc#d%2xvc-*?p@ZLXHj^#+sr?_2K0VK># zYVB7e!jsmla}Yi5S=I_U9W8q|5xZdV@%z)$woUQ7)R#|3>&D!qhneOKNrbsQZ`sLn zlkGHT*{%{k4R>5?57f1hsS6$}sw{;2 z^Z8z@z=Hcr@jH@TFDe$C-i+$ivmvZ11H z>l;?Pa`BQNmuvd`x%Pl9U`=j}jco5AGd-?n>Tetz-%Vbg&6J;C*;l#aqS;toq2hKG zxP3~XGCZ( zwUCxL;UGT5qZuRV7BB0Q+^;C3-v7pY7F`*cIiLagd&);T#B1~npOw}7y@KSVt{Y`~ zONgzBw`l$5X`jj!ED*J<9}IQ2^uEk5zKNkcod`J(bF1o&R-H?|@`-3;0#LHfMras9 z7gzGQ6C&0$9_C_`xX|X}P#%2f7oeVbWTyR?F$9jRuSN!rWGtIJP>^p1%cfX_bhZ^{ zA~9Ih-!#0jsW7o)iiMYLV6x6LHJ%*Ef=Cnw3vnnozkBx-4vGQH>fV`V-`v)!FrW%7 zUIW=mrvj0yXvDH#A(UO8M`EOr&|)obEW&s=KG{yUSb!Aj(@u-PL$z?8UW^)!gI6BK zaY~4`X|D>k8Ktl{!>g=_YjzyJmL!@yfuE0E_95PN*=PNq=Bhxl^&ap!JVhCF3qUe! zPd@|nBNC&XnQ4dVFjQRgo&svhK-5f~NQ7eqjOh?bhi12Gzx4)1QQZNz*Z#iEJfHO+ zu%pJI+hbL3xYe$@OYzN(3;fN(M{Pbg4sW_%eB9q==DCh ze~1|J#kieQSNX0m^;H`-ze_wpK&Dnyh)+A*9#;y1T+q->_SC$cBG}*s7>jtpg}m0E z;}iGUtxxaP;1W*(E-f;uo8N_}Tyfq_filHiL@&M++U{k*j zFEZ)B@&dVE>KH3u+p+6i3ysuGmHhC04S}i0(j%Dj z`p~;}LJhtDoOuk5hMG&bzlulmVYFvVqv^~ygFXLQ^?sF?a;4qtV&tM2@Jk)B)t2jgw>G_hF`TblN+l89S8E^^l(xr^}SX(2psT5DjeYv!9hx z2o28=M{uCHFjvfu)svT4tWv$3&PiCIE+@`G)d^6o`8Kj`2faCb$93DzK>Xfz#x{U_ zGnAL=Y8(i?nPzx1)RpRLs4KYpr+7ckgcjpWC{BnLLv3SxUbkgX{*bm!ZJ9l47j@7!Zj5&_@S#NP25)FHMMOtygmDag z{Tr(HQtBT2XfKVqVF!)51D)y|DLoeO1um*QfZpp#%VXkZA*AP3r4tvI3?x3TdcRoQ zJQRhzs_m@600?A`(~!v_8WMpz0TFe@#wIIb^SSv}NAKlQewhG}E2caF2skew1Gk0@ z(Z^295hEb4ucF9hH1qg7um}H)(f1f|ut{-0%N8CSDi?$cFEDtEJV8i2{|V+Tnhc=m zF!l)o@m&doFPR6jpMV%1oCXXPD~yF&+L9564<0&92HN366I)v7aA>;v9tSrc$*jQF zvPHe+sjo1;1ylGvWIOZv8=TybKRP1{>D3(=?ac6LDVX(w5_*a7WhVQ# z=<-`jDm%bk=48CeGFE(fEmx!XHT~dMR2<<~#7VI0VbgyXm@a?@2{uq~SOhxLDvTGL zJR+&#pEBA+A-sd&V*Kar515bV>tz$NPT>C$#0mP9RGWI>l}jgBDPLE71-mE!E&)A| zWnu_n8B-8$p z+e@0a0$dSJS29_RViqS^STb;>^3yoIyL-R3cqd=uv&UYy1-po1$`)}iU?wS%#nCxI z+sshOUrZqD8s8<_N}9Rrab7QW0Aq9(Td7+N8S*(MGyVg9hyRqXW2FWxLz3QMn^JZJ zxQadu*`gqMgyA*p$w<78N?JHX;vplGH3cwCk5>;x@;_`-@bb+6f5 z`vc7(9RCIVwbZr*_QR|ZvCC6`h3)CMy`$oGyAwO!gG$fVyDBw<0GHUTnRtLuN)A?c9<- zziMv)`Lf=m1}kr~pj5E|_*?kS2z;o949xlU!z> z8Ea=KX1Z@d9%NBMhEFsV*H$gt&|hx3vTT02Qp&FY3B3D4v#bo?t{jUNBNHCwZW{7C zJb!X2=n|J8P+ZJXq}P{JKVw-iwl?!_o;gN5$;_8J859hm`G8Yn+^5;$u*^)&z6Xrj zjlECxo!v&B{Hu<5+XM_wY;^V2R(vMtc#oe>Uc|6p1~Ll))SYZ0Kcwf5rT>On-;Gu}>nP(%T4gOz(xXgC zvK9vU7+=J5z#S2i(g&L=OxM`$k@PVtA>*XX0;uRo5l)m6M(ZP5h)mOg9pX_{wWqFv zV-}S=Y~p;XU6DfgJTH-~X=wCA5~(FUZ78yj?NqQrwJXS}g}Abxc$w>0c-4&-w4iKFF)5P%{lS9jveXOJ%+;C2UPipdl3)hx?e9?Q( zEZ($Cgn)6i{xR-74Cn2ZM;4z3f;$%fA>M&;OX$oj;n<3eX&$tw0A;x%v{Q+8;g`n0 zND@bF#2Kop40tQr8|w+0`o8IwoB_qJ-dH~rQvHR_`lh_nc&)WJ+z%vo_02UhC|w6; zQcxA*C1p8tirrC4OY7KutXsVF)_cibsbt*&J`#KEu zRKB7t*%j{8I4aXI;<1`fQJ#z$z6^<9z~iPJJ2p@ugf)Zt?fI?(#TAUz4{U0urq}`X zk_$v1uh)HB_HEswwzjD|*8076mx@=%;5|OEeRFEOQ=L87NpsiW!Q6j_xjU8H#W1ht z3@TZ@Q?4e-16_@#`EpthujaF$735QcG@ve{x5YonU!k{0BqnnSldBfr3OUyhieOFOe@7r*$M5I`$QDO4z`P4f4is04y!U(^R@LK-H@NPuk|G*fC^$_(* zYYq70L!ud+Lgsft-|(te?c0b@lXa6m@>vN&Vd5-=eX#NNZ7C`bYA|3agW;mtb9)E| zZ7jg>OATih-ihOjf5-cT?g4jfhn=piAQ%y!BsarAAzY_5V!%l*`up5Ds;8l4vY~GM zL@faq*>-kY-N0-^myYj27t)hUTs~WFe%JPy=}lpVvg3l?Tz;<>@;5;W2_y zg9R`?rs3&HhEeAhx!@P(eJbg?9x)bhbKb9?XNpd}UyLzHn+Up>m^XGLbOpr&oL7=H zDl#TWbYe81&#-{{1mz#@s-SfDB>C{+GyOZT+HgeRrT5X%)PK8GF{Ak1d0^VBM2=fy zf&J%B%Z-Fp5w4z%u@j5Xw@%<8gbmy&y!{9>)}X zF;MBX7DDFmdNrtUE+g$>zLjr7LmN6s)XVdRe$1;rzv0X_#21vr;VlOjh^+UnxpSj>>2ZM+kInECh%MeNo&XFbw8PA_t@}l=;tnT#e4018s9;9Tx4R$c z9YU4@m__^M{^@rsP;2rFZ0}9l++aqz)|tYQjj?|d+ERZ>?w4vN&kCS+6YY@t6rpOI+OV1I_{xIP2A4bF30F4;U{<7AvLcQ*bvsoh&*xX2NP>%w zcibTPGcy)(Gt;v^o`>@K>uWIvoRk0jtxP zU`|sGV@Kz(9(wobX<_H2@QHE8)cvOi<_j9$3QiwdVW|b}d=c~tYQ>I8(`B#-Tu7%L zq9*;d!=fK<@e@{}P}OTcvT=sVwq;@E1xTT|*zHg*Vbb*YQct_~tlLFId*;}_L3ip2 z%AWwor~%2|g%Qi>B&oqMguWqyMPv<-_8*C4Lcm@>QIWdSX7jo7-CmoRvpc-%@rwQ~ zhGCi)LOd!<)j3i{&Kwt*$*>bri=O@ z)*vkkkZy}zWH8pk0#tE`EHTn{jcsq^6$y{;?jPyhgSVA{v)T5o{(*JFmRi2)zOYMl z?Hv|S_Q2GhS+Q@TUgINeiZShjPbyYR!B)0)6cP%+86tkmY`*e{cRZaG>=`+8+H{p{yRIov{zx6r}Z% zO!mr0)nLMsaMzU=dLLO=va5?%<*qcxJq*k^RpjfjyK|L-5{WKNnrEoRQLoxMHPM{< zBkUbX=g+lFO~+IZ=BhyjX#c6v%9)E~A3!%1I{#$biKeYi`$6zF_Qq@gk$D= zlV#mK<;lIX&2(Mf(_Kc_{TJ@9h{wzJ9Y4OWEFQ1ee<4Y)GW;39848`EVVWXDhpk3| zJl*RUKz@WP&*6dd@?odfSwM7w?X><1H2Cqwf7yW*E(C%eJJI7ym>={6jlU!X?^~0P zil@tN2l(>!aO5=3;Q56$9L+(-*UGR%Wo*7%+w7xc@g%jof?evZc8+b4cETF2g3kK8!+v|+`4r<^OWQ}nkd^?6G_P=?PU_x z8YCRDq=2PERCaG3sKNWc{V1N~>6xmV-Lo)@K!@G-FH^tjpVpIcDN1XX=aDp_K&8`BP+MJgO;m7%Q3)KLzUimd<}@C&=9Zt zCpcOUl~-JgWRS05Cp$&VTLOb-D*><-8~7fP=T&b+5ibSlj9s@|191{ ztK1GuxG@@N6>=tw1*XN--&VyXq@;-E{5^d^YPfc`_EPxbseN788tww9_MZ4?9o{?_ zn{Tg=RhQ=GH$(CY>3mZ_%-J%imHn?~w~&r!QJv@$}vileK$JEtP~#rZzBn7}d; zfWL8;RrIV&u0GHSjL^I4=rm6?Q4T>#sleuZLK8GpDuC@3daWB=ouYB>?4&PH=)N20 zw(&L@t8%SBoZG*3pelLxT-(}sd~F;5RY%Y6uSm4kdqtrgZ-B*Hfq!PRMOJQT=|6k4 zKf0!;XLU5Xx~FGN6gY!LEq(}iN+lh4F0D{X0paW19_+f*rqW`8Ui9~?O{*15i;V|{0QLr2Gkc+*r1{xwfGHBGB!$dwsdC@z{w z49qt+&JQGJii#J8Mz+QJ>sGe34u?X+tt~6-#4b_U6^dhy2&hh}CFZH-RMC8ucPyCx4c*5qhFMKlq)wfohYq`HEwzZbJJ^eE=ECs zoY%rnkv#T)%TEdWsK@ue;irum{B%0>f5uNkz!KFDdlmc?Ziv^)PgejFwDSK8ej5IN zo1an@o-km1P5dQvw{ z;}*OPMa1|S=&amQj$bwLGmzHY62vnd+=7|OU*VZLZh=k5Eg`fdxCI^qZYjjC?A!vq zkz4BVOgoPSEuULRM{VJjF0Cah7Q_gw5r$cD5zJzTEWpeyWq78A zTL3en>;mu2vxwJ&{(;?4Euug2P!Ve5(^;Zh0ygnSr_Yxcu%!x|UVp%0SFS*5D~J8W zg>E`8gkPaD1Zs}anxMak60%53tWA8Bv6Q#?l5+pDPsFq*suo|eMp5B7qA*6N53vRq zbt*A&LiT~ascOa2QQEaW$`MW^y)~jR4!Msx?xS6#3^;zWY##}|55Up3Y##}&4}z4c zFGb`k@F-(EN<#dVM=8W?U*act4fqMbhPfmVdAbF-D-=c4H#gUjX_XVYbya_9sJwq>roTK?+P|v1 zBwSElQCgWuRF+nh7lcc&#Fo6pjmQT65><&Sf_E;h50INKFA%yWxWbu_5v|Uhs?Q$` z-V%JN&5rjwLNS;vE`(?ZCwl|Z|?#}T$0Ypgdl_u@_1ep|rlu{nI@L?6r`@&Vh;5|XRXQn4M zerr)(q3U+qoqktoaYZ5g5KfPM9)kzHo;=UEb)d1m2dfsu%sT)_IlY02=Fa2k_9z_^ zAXg`BA|y^G9uB@QXm!8SmE$Z8hJyI_mL0bQ6G5Mn>%Gh44Bn026T!<6KqrjOi#qfR zYFX~xNrYLl2g&YDYGcSZ2QiXws)*GVApIRvRIN^bc}Y#UuClDyqn4rScn%7-+#C#E z;j)*NMUxekJ-7OT6}hV0VR!r8;ga%dk2hDn#*-re&Wxg#ch;3B>#)&~4=^thfT@hU z_k?w_0u0NWQfIrQjSO=~u0Cv?&(y65=L9{Q?YS--p>o>$!b8#UV12luAza_scxy#6 zQXZ}J9ikUG;H{ZsN_lq!RQc{mc||x}QBFZbOCfM<$GG6wz;I`>AY)C*syQ=YJNtvd z;P--d>p3uIZYgxSgu-j(%yp$+a_7L7sR#7!pizPzoKb`SWVVa}KVFSyTz@*+Ut3(9 z8!S&YG;~)4a*GOU`=g~DvGVd*M`?Mqp{y(tzO}r)sx+MI3YV0%mY27dmDIca(bB5+ z^6rwdvf`4`($fDZBAihTdv{s7F1|c?PH>%CtRPbs!G;Zv{bqGJKP^Pa7t1X65#)563MbceBN@ivOuz> zK(C-iOoj2Y8n2iv&|Wdw1R4;Z_qvbEH%T5*J-{@6je7a?Yv|rff3IyOb|T3hf0otb z2ea-oN5~ir^=!d_6Y!>aXe@&Rh1MdH5ezCK2uA7;VjUujRhI8q{*FAmotz_5j{C3j z{Vu+bh=}Do$_dDKe9w})94%kv7Cb?cn%?wb`GjS=o+AJf;#rVaoKp;NuGI(s7k|VM z6hp?z;+Juje>-6kG?(7OjLE62d9KQs8ZbGH@jfZOiSfYmfJyd6>1Lxf>wYJB8uX#H zD}h5%dQ<9S>1*^o1<1aLzVpcQz7)3X(KctnYBfg7fLeUYGzfSBFb018tcm%UxlP6Tsi~&;=NONsOI#nR8xP20jna2%HyCPFMUU<*VV$6m)lD z5k*-|uU95-?JCQ)ic?z~%^^yTLmDHAd!h=uCn`Zyc1hpjxa?LAVeTA|W9NvUvTZ*k zGurfG8|?QXHbq@a-!MvV6b1q`oKqW4Cy{@s-rA1Nu+82$8R^~ZQ~a)6w^!8kt%)V) zJBzK>aAzET{|fVTy~W8?g3m^5LBCsbLkb2OtvIM0G=7 z<%$`<>lJ~;jvTh!E8OBeSU1WPH2c>aA1`Yy!@u&Dva*(Y^^0;`kZjz7-_z_1!so}BH?gSmT3s#3K~UGM^O>fPo0q?9KyQ^-tiz0(-GdaSFw@ zbEi!aPK9J?C$#E!DpzB7&oUO1NuAK+rYjjJfX`eD8L;34K9Y24fi)n%#zp)S6`zQB-IsAF=6n42 zGM5hx@~^qMkXj2L`W~%q+2Uu!=dE-OPHG042}Tl+Y_K+*7ZaNSMjkFwH^ZU59+KZ_ zP11YMY_6AoV1w`xmQwU`o9u;Rw&pxa+MMD_j=vJ(gKQgjJ)*B)7h$)W`21+u#rMkT)FR!M(y4dflt*fi` z`JXCHZXFt4NR|XW9`EKYTecvQ1TB)RA=VmXe++`AwGuqi>FrlKjed%?o}Z$A(9LG* zrzE*BJhU|lcbBjXE$$LwD_6~sK7VPx5xvm+TLP7A&EZz$u2|cWpWm`}h1=(KHul!# z=GOH#I=#M+bf5qE*T4Sr=O>XK=k`Um-}t)M-MBr&PTUNJjZMctcPf^)zgm02^Ksc-fbp2go0R3xcb)mo`NC;FAbK^LGvC%m^AzwZM zom_7gwSA-2?(%Ybaj~Pk%w0X&XQ!pN$6Gvgkuz>fi<_#TbOGL zB)iAXnvU>Ncb>bYccv((xi7MCI4*Ne39>Rk7MG9}@ErN9q10h1fz6Q3al%JelHwK+ zt~y$}mWQjeS%a&&li{+u7_ekO1FWDs4VZ|Zx6rq$D7UFEvgN!^xrGEWly-?czy+58 zt%$CX(29qQ)ML&#{vcuE@L~G<5!4#Gh%S&g@$!#kSD0ftR`~&}v+bG;%{g25?^7z_lf1{UqU4?;dxLEU zqEqcut=96O(`9S2tDZcF^aA1aelhDFNiGhz8z!20B)*13UxCpm{`h}pvniEJhS7!x z-C}N*kMn3O<1*(leM-3TYrqQYlwhS_XW=~CI?aRwGi|eMQ)-kh$dLic10#MFj-dDf z_an6uQoC3^LFD~ZUn@R`*YPdYfmgJs-@+xTIjNuelT1*&_x-$S> zJW2bu(}px-5?Cu>TSOV^SHiUjWPp-J=BaRo5r7vFmm?%kJ?+)6VRnT10r9dZ0=?;0 zIHkdu_hH8U)6lzfgvZ_D_Tbay`cT%rc-iB+3CGdhH@T3UqF-Si7{zi8k3v+P(dUj+ z^nqWNELMs0<$D`-uE{67(vkoalJ-=YULlw2P|h;&en5E@RpDC`y3pU^9jQ%!XFy#(uY(D z|9WH@2+lh_7yGnT*~U zsBkC&fC=NUG_c#PszKFfpAMfp-Lft6P{&mBWB~5tp|<7`f4$nVxw~yF5$r;i*kp6# zWNYh4yy%;?YdeFe($$gduGr~zx>bj5I@;AAiQZp6+S$}!CH4gxI;vZ{5^aG90zkr2 zy?BEl-wRF>5mn~twl*y@sU;-9dIJSPz|WsRRL(HXYoa=8?;jZAG?NyblMGV4_(QZMg%ycEb_zV1w}3x9WsfC z^9ae%Fl{l1_|H{u+0)&<=Pj%B&%tvjSL&QW{j*~-OgjhXL%YV|MZ%c}tGl@=+LTA> zhk3YYcB7gbma}$THTOgPC1dN)8yq}ueN6v6(mdIu78k2clg+j5#aM1;QZY(ttyDu0B!yQ=h2z z84m_82@lpqtH%_@gI5Rn?UM_^;HK89s@6@fJi&{CVkP)kQ#9c{M}eu2a!E%I2k)v2 z7EywVr9*r{sm5-pqZ}Hc`LSWKNTvsa73)PIL%D7d?cNlg;mDWhgtOb{w+#;3@Ij96 z1}KCs)nji6-WJ4{9}D8I_(JfBV6J1&9!D-Nf|rh{1GCXBw_IrCh#YXDG1NHR-;o8Q=TKq5Ws_m~2_tn<+h3orkliY@O;tOjQW0rSW zFVU@d-Ton#uut3nUiCp76R)GYmrx*xpjiuV!`0RSLk1gm6aCIgtVEL_bf5O*vOAam zh+l!D;Oq!;An!wZPrdmLP$5%G90UHb7;$Dy_`^cUkW5lM0sl0@cU3RDba7Axz3Z3g z^II$&ucvXY=gZWnj02#5dNUa8Wa=NmOTGW}l`aE~kxbQtFeYj?$$|9YjFI&QuL|!w zMDe59K*$ETf`CcNP^wpU^ScYdJu~?NF@~BYrM^%LL%N+s`}n~@s%|)VaD4pSAs^0N z+V;(?n!&j|l=Ol}F}`=vBF=7In_PQ_O&z^>ty*5D&c9)F?2^qT2>TvBucOvu_qfZ3 zTg7Jk(9XoMofhoqdHkWMKV`lQ(;csX#72=YFD$WeLHO5FV)eXSO6Sg|PiE<)LJ+&> zbCks@UZ#lRA$YBjS1nfE3cb-xLAEK@?LGAO-jTh@ilQ(z>%5R!vh0{XJ?KK^hVZ?jco{rH;j#~kAS}V zAr1cktiwYNoF{NfQf3__4f?9I>OxB5+9A~*P3v(&_S53v4XEA?JBjb^+`yT#@rfpi zKg;rK^NE4YRwO8F9!Sg=+TALbIV)(IfUOUKI_^Hc2W8B5zuw(XAotnp+B@>~Qf#4+ zUWF~cqrJ{P#OTm5*_oLjip0%q2ba-Tv9vMDxiPUH96UZ_PZKKqtVeu{=2|G z(Y{#ngVNzp-H_204KW%WYmh&07^4HomgdD9l!&$3vPxTrRwbel8Vf*^@{nE_r3i>8 z(&L3mYY!-oM=MgJdM9>wDkzf-x2~;m?eOj`Z97*@Y->8Wn_r+evbja5o`5|^acrNS z-qE;aV%6?gV$Yad6MJH|iTH1MvVNjJ+8!w`Y9CKd>~mrPuwstxRdr6E%iA&BI~a{e zii%@n$?mmnygbkXD3ATa;L$CxW#NhE-Ar#Fg_fR4Oj%pnDm3<^`%hs9GrQC8#Z}vm zCau=w(QOm^R#YkUl0BElT5xD?`yoX+w0-VSfz`vW23D$8>`SqWO0d^B^-+RbUaOOD zTyyi9H%``*D-8vgrw0xm{pity1JnGrfYH8sf%6r-{qW~q=}Xd$8!)p3X4Z$5V*N($ zZzJ19lY~;|ky;$A0<2A@rQmqQi6%x5^tEj4AK2JBJ215aZdN;%5lP8?!wYR4n|nvs z)o)xoytcs(??1|7_a9AtohSHf`kSgwU#l$}20Eq^fnYQq9qb+M@Vb1?ih)FRY(CyG z-ceB4oQ(EQ)F;bnty|Z2BIQG6cRv1rCFz&o&+u+5yTJ|Plm~t?S)nmS(r7@MnR22) z*J$3UdRG&GtL0y>`q%OOJw5x!?}H>k9YC+A=|ZP$(kbp`E=T;!Ud0 z@jnh680()|Q&F*MbRFaLE%f)A*ko7pzV#)}MZ6e0^>F$N_|;0BFrrm2a$KTAI7zIN zQMrHnio}+#($pg;NbVFUG^&3?S_G^toPI80BbzO-+PXy&U2_-LYb9QnP}^e*FceJ66)HY(q@ zY-YR03hAZOIh%!a$V+M^X=#_un+(r7(w>ScQMA`k>hWsIZ-;wY8X8O6su9=o7r9ks zG$y!jpJS{kOy@zb4yZOon z2(?%$@@zIiXBUu7HOhpNB+Z&Z(%0Bj!cdO|vp7Y#;!y$uIxA{W{E{wz=~ZipVUeoE zT;O581RF#DGf1-=Tt1e_l?Q~R6>}UDzZ$WeA$}=dB&ei1W9T%7He={9&|x-0H@WUQ zsj*ylz0_5%zh2&7f1NY$Owvo1`+{^7{1EFoWm$tN5-M9TZRyyqzFgU<8&-X*YsleD z7)eh*Bb?~bUp*jfn%`aNZ_W8X%>S+te?n~<-IJLi^PxRt+)L~&p=R-}w95PM^d)e* z!cvI(<)g$~$rB4@(O7HKmF9_rj%e69rYnfE>k(v+Y^6CKor9f)g>TbB@6qjadu;A* z`gpt*ari=t!*6FOFl&&9OM@iP#gO3txf%n`F zIR*N|E_ZBop**puNj-@VmowKUBDp?aZt786ZY}vUe6D-%b@_0C*AD;CQ|R~lf}S5* z-9+mVOAUNpJv0VrJ)(6F4njl7?zM5m<<1;?>QU-gMC?@4-tA32DQfUhL)`{_UVkBV zn>ixZ5T_+@(s+lg>bm?)FcQr}Cn=r84)VOJQcv-`{0d}e{5pnqC zyq^+PH2qsmaF|BU1Sty+=po{F${ErzM98#)laGdg) z9Zt2nqrAGUv8k-8&S!O4U2fc0wl%brSJc5PX-j`!UGK9Z)5rL}GUUT?(ATTZB40_K z$LA?_DySP#{N}jd6jQMP(40(;lP9IXQ%?xQ3Aa%TK zjFtgNu~YD9GnQM#zi>_inen`aB@B90H-|gF{Pghr0*Yec!R8@CZKU6NbLO^-HUcLOv2bgzbZ1%yj z9#7c^%X#rgPP=vCm7erYmmJ=$@8UsL(4VJ$nwgg2~LC!|8%$Ohp} z+P636H*43vN!94cIw2u->NUKhe*0dH8ue;lzlpqE)WqJ4zPCXGeEzCxqc*kc{JCk3 z`}_3nWjxTk&;8Y#wyRV7PchYyBO$meGy`{qFtSy}mz~l#l2)#LuSFWQ0WugL5E&(z z+Y)zxT=#y8-SwH!xO)tR{ZB3b^^SF?2U-r_h@6g@czkbeiB9#+kck;(sPH1|*YW(R zY>1zEz&|v!LTF{b1Eya{*{jWsPjf=bmJhfsz-(4FEUfImc7c{J8`9R4muoRgYa6s5 zq-AK`JMgvsq?sco#rg~>$8-#~voMNrbt}ei@RS7J!NxNUO9VYFe&1n9M?>Al*o5#J zIeF0-M>ut|Kd6E~sI`o`Gz{T=Z@@1LW zhsa2I$bJu6hV$eDd>BxenuC`JW=pUW_xY8@G<(JYds9o69cdmdFa^ zlw=DPF*3JlxB5|Co3h76sM_tWw%w|+7|cbINmq}zysu%y`&!DUHL%AqX8xC#r}d9c-OQCjyX4a@?gyJw`#l2ANEtCIT~We9Ua+q*Fck1)$Os2_EEdD8IqW`Qr% zkXoUkwL+Y5^~YvqeaP%D?|FD!?|D1`V~qDaDhpN#Q>Ol2m&NQ!tKbha#09#1x;Zk0 z{spI5^a*Q&SpbJ1gn0-d%3Sq|%v|%&6g>H=JHz!WxZZBAQlFq_8(^-d`#o^~(&zp$ z-8XGQK_VWbeeoz33+u|hYogS30{jgrExxFG_WN{^-5B3tMBlkqbdebdp{x@^r0CY7 z^W15^-R0hrAw5Lw>kieI3%-q{;|=|aif8> zYtYF>cMiC7X$W&*A+ag(>SZf?$61?pzRX6cVusne#^91tXvNm3>G(T~RJF8H<&FVz z3lis~%0%v3xmH%%I_}aUw;O7aR&GCoLF2%na(1qd346GLzkh{?TWd_cOwO&^+gR0R* z5D{Y}p`rewo2ZpKOU_0+q(s`}JtueCvfW9OC*V8jNOcAJGQd1(#ZA{!=P=(xfcZ1y z)*O$0^(j6cg=PdBcip5-azUWjWAz5Kz#h!$Tv6ejcWD{5u-hYiVnNHfTn@81`dIq>#?PQg5fSLH5(q|NtzO1{MqSgve?aY zm2k#Yd7Ys{Sda&^7lnlU{)>!}n2@4VMlVlCYkUX|9CpI&*gJzczSJ0an#lJ?)OQXu zPZhl+Rm4!wC2Y0O(?engi7FQIKslWQT5`HQvW0VoB0iy>IA1yAnK)KuKFA#!c>yCa z&-hnrQa;#wuYZVn$`kmoe_$nVP#=G9NXc^@5%ImlI5x!pUT<*uCYAi3!BCEQD#YvG zC&*g~FD3_ieEBdG*9{R%jQWdyO>3!(JR7>Lgu@Ap5!EYGqd{mu*K!pXx_1z=pV!l? zQl-FvzQHbP<%iJ^*SK+yweNL$tfxxpu`-W~!jxwS?fh!ZKA$h~+X92jy1Ty>aE+i~ zuX)NZsHp!d;RpFKo&`n>?D$7S1X&qT_t55;6A5<_4qU+R&mbEeW;buwIapP`JtW{3DKWlXn zeIJXJeg*p!c;Nqhl{(df%LbJx8;V;;m8+Kz$8NbY*u_-jm8+Y_D^v(B9~2N=qYAE8 z-eSSNa{7~}*>&Z1s|c^iEpG_{0hPl`to%eHL8Q* z`Eo&r>b8$=)E>`&;jTX|DGo4a~)0M3e%lmx1>q>l&VQ=tA8_164R_A6-br3 zkzphio0Zzv5KUsW8`##rWlhraI+~;>+Z@#RH`XLSSE(89Xp&0R%7dU^XiLqdOyTtcA%Dw7->q#4!t)kgiq~R$Iq@s_M%TwxBKf0Aw zXT-u4J&%GHeQjlE+{!a3tvg5hoG5pCPV^qCSkB=RVI|P0>D(!F& zHXiI1?HeWbP44@Td~(ca)tT6a*zB3d$Ba}Bo*DVfNELxlOy$M*sbm|V0=X5-C{HHJ z)(@kGHkS~Cex85waNp=26`P%G(#A8z?2T_Zh2czTa|U5Gj4|peFcfpIhpA)u-f9k( z?J5P!I+dsr@MV@M>J2qP#i_xVC%Ye>O6i2Bew!fd6i>6Aa~l?bZSlk&dHuBnuo-A6 zsUvTIZSaiDkJugnmgR{{>2f3vEEg@vpd-T&!1ZR5d-V991;=FA_Cfyvzhb)*{D1~d2Is3Rd@S!V93R!8KT zyUg6$K?T2q%{Fs?+E;KE?0GZe^w~}8!II33*Mjo*A`d-gikXJY%rL)J{^lO@JFA@+ z^SV+ouz9QSW3R#{(VMb&au79oCx zh96=tzrV*zeC2y(*8W1-H#*>m>>H|#weLHQFYjSrr1J`%$S@l9!y1dV3)T);TVajy ztr*3_zS$@oD_X$do<@jGG^85-RrGnRC$Q#WMJYvRU_~i$MVg}%u_j=hiFJxHqTj$e zL3yHwVI7FIH{82nZI2ammPOaYindEM@|7#{G8#!}coFMKWi-s^`65}Xe3F%=LNVvr z_ZVaJgGc6F^t9XkR6v7RRnAC=I;B)p0gkAsoT%+Cp5o%`TpTfW{3GTLpXTC|TzsO7 zj|Cqg*TQzNi}wSMrL&6a1diwWyNhf>JJ4U;N!hq98%)Ai=TErKh0h4 z4Zv&F-&a2rTQ?7Kx#P5Y7bT7L3hNzm@oX2*baCW^;~)9paO8u-=es!4?zkiE^^j)y z)k7K`jEfMTyse90FZ^aMKgfef zC3m+>w^Lc|MNxIvnYBxcKp%Nikc*3ZU!QyTx*h7a;#o0u>$-TjiwC>7UlFf!#l_FKc%h3Q za`9{zhdkGT9LulHTC7Wbe7=iAZXI{Xt-~R|4u=fa@zv8hkkvW^q#j`lnRPhosl(g3 zIO?h6-T=H7)=;cLE-qpD+#@c!_(`QA^5seq*%3&K!;z*^InwC3Bdrdf@8U?Wlkesa~?=W9bg z9iDd!e6Pz7sqy=YUNqi z6s)xiYl^jBYo&`XcJbNZ(|mq}PxA4JF88suhSowk)`Be5>f+*Vcj4`Pe%$WO;nu(x zW-V~k1Nqeoa&fo29JBqvy(a30{A!|J*zPs+YwoL=1-G=C8*8p~@x|BSvt91fTzry? zPjvC?g+JEiX9TW4m{C(T`+>*agm;3UHaFy$j7r?Jk!OKU3{&JF9o0PI~QrKj*QOSeqI0V7FbXqkQdObzj-aeld5Ho!u72 z;GV;)q1ST)Fi{j27a1=)AEoumzktFb*9>29l3 zENX{HJKX+B8$f>22B-$zV*lK{4)WRlRfEp4f7MVf)!wW&4mhmZK-(2zt;f2;+OO8T z$h|(O-OjAmt%%n{+1hQ(YVC{sS8Gwk-D#;7UF3e<{B-4&J5Stccc-OT++1bk_T!d~ zY7vl)0*MFuR%3x9tTQyw@zq6T6p1pi+nnw;Rn;Z1vy4wfcGbDAbEmtw+uhA47uo2l@h%Rju zCslniQ57;^|B7*!3{-W=Kvh?{7qcDxpi5(|kffbs|EfmV4A*q=>Pubjt}?0`pj7xp zITl{%*4yESiu@O~0br}WrQ7T9?C{iZ)Pe97;d8@Xd05j|=DY&(&Hi0Ce_UxVmM&ME zrQISwX~WcV+3R9qy8OG#Iy}Cp+#_BGAJ3pvRacpYkF(qa!$-OJkfL%7@9%Q&S;T9) z?X^4Yos0a0w{`JmE*|CLHC*M=uc)lu_9eU`{CKNet%5pqE4&KoZj}R7a;j{{*3DC} zzphGRmD$+3`84dmUS)ih(b&5AQ0xytIFP$4Zr%m^?J%!pU2Ma#dc!V0b4hpiTx>6aw@-p?F6iGm4{VE-WTJs*zW{CxNc=! zw{ku3&=Ncd`>IM#=tXQ@JoKbeq4{v%hiw+tH1Lfj_)6?A4xJr}{0?>VN!XtV|6{Qo zfpsuA;#Q0!ZlQ=3C=7?u#z0hi*A=tXPs&ui^$x8W^BtHKEuY|NzLRu;zEyeg! z?9cMaw8v-$hTOoBo+R)iaN_jlt_%nQ9=w6;f`HvDp0Sxl*%7>k+S z9Ml7x(OaE8*y<2QKo!FKZUo&RF$W;QI2vkt5A-IxPhEL>=6AtxLnHa%P`cGb{05K> zG5iiOWXZ>U?^+=ZjB)2*FS-$6zYN;~^%YOP_990$freAAWMGDZBTbkn=H zE!lI1UmEj7J*QM!gym*>)53%qQ4&JhB=CR4%Xxta8?^^VknVLSEkCAri!X+V4Rc1~ zdZ-1DHbY#k@bjG51Td`HPKkMC-#`{`JuBy^Jmmk&Jlk;2@e@CoMb5kE1drgZ&39IA z7>JW-P>;G`_-$Q!Xav{;PS`;_?<}6z3OY1Ie96Ai8sDlb$8#zee#5QOM2Tdw{MASt z3BroIJK|f7bVk(6b06n?W~B)}lQZFyezuVrosbK8;%0P0d5*Cd%5yl`9gvyB7K6;> zSPU|=U6}fd;rA3%rS37kOH$~z3X*q#EESTBFyZeu!|!XRMlE*Y<`*wVrSZ6)Q5i>uVb7!HIHg!yj;N}rwFNx#gHk(tl4;ZXKdi~>TZH{O+zgEP zdl3%8+zIIxW_ouvr|%D&bXU5>l|1vYy zw#uxFu<$J6uol}Rzyi#S<&!g|{sovzmdB^yeuWWjX6%XBdWCGsp0Jc|IQOENvF+H_ zLb$zPWf<5V(uzOm@0J4F* zCnYbTzX_}RW^@7j9_J3tXb0BKOxkgUSGyP2Xp+$YZk^1eFGK0p(M;Oifoz+Z^a687 zO+?6TG9<@ZnMnz(cg7=NyTqUQKa&5+ZIS=d0q~eLe74L`Wx4+*d|BlYD*MLk&T&ic z;O*{oN`!%#pPpC?->`a~xF?dfNV@8RI;08>6>MKD0HHwovQf3EzyZVGAy!#4eb* zTgz>&g`hGv0=+2_Zw=)^@O%>0R53td5zuGY-c+Mjf+Y=dg@U zWJ`7qOp@?AnYl?5GvuB-Qoc7oqaKfD>};PVa$m>H-Ps~T&c(YCN&PYcz%EH?&wU+X z&x@D%)>kU&s$2=rg?NXUzH553tXi^PHwlbdIu_x>?#`bsM^&Lxk7v5rgwf{9zCv`WKCNtrF72BP4As9^`McN zJHJ^v>VZOSwd4dxz3DA@#uK{9wlkmQT;~t}iZnC8CGl_FUGk04^n#lj-W^T&WG|>YMmHKD2?+kC|S+ajB zmHn>8py{M+J!+_K@=cp18^J#FJiBplW*XSD#tS?9^XRjVjmm}{v1)hacscJ`bJ5Ng zyVru9H@zui==-Q{@Hd+#in`GIVYSoEc{(E+3N;O}1qD@D0dU)fv)zbqn+Wj%F%WyS)3B z_HbKb<~}xfOAD~~M4~?tDfBYbIMcg43fH6@EQi!tA?&C(XD{+E+7tKbq&Wp}d*6I; zqhHoBxS>>5W{N*piiMw!*d_Hd%*@D&nX`y2H>+;ycCbiYd($xb3xiY#Gvu`jkC|A^ z%vgUpH39xAnoHJSS&xwMHbCy~R;g3yma)EYPG288gq#(Bx$Co2sb`IT81Cu9hM$IxdKsqMU?MtL{ELj;dadEHY zNjO@@ELhxSGb9Ua$>Me}^d9w{nVa2z^J2PXEN-xAI$7@GTAQbVbwmvMZ zv#gqWhne(G)>M4mAa3`Blq{Sv8R1R#4ke3Ak57^GXL#cNnVPav+z{R4z=qz+NBHzYv767>6d~MhQE&A zoDCHFG{6)0&9RhDWFx;hyeJK9h9_>_-XlD*b-&7^M< z$;v=~#w-#kt>TH>R(I1`VaA|sR-QsfZL{(eJ=$$np4L+8D-j!!|0e6Q7m1WM^~9}S zv`OMT(i4{vuu1eF@^2k#gB&%JR=-KsN;g?lZBYxjHS)wIMQ?fo3~hr=!#7F!c2;WP z@AQXOLK0*FZhwY7vf_-dc7J)5Zf((vGc5+2f0+z1+H%Zdb~^xVsn|^skI2<}c$#er z^9%ud&J*`p#ZBeFs(RwSUa`sK(T>TN17?!NC7()``qINQGPz)()Wx?vaZ3u54w(@;k}%V52PySVJdYr^6X>U(Cw9k~0g@*@bd#OE7fOuqj>L{b z$&&tQp18G#k|q5Qqn@>}&On#u=?NiH&piI*; z(N<%bZXExWw14n${l>BMhcbnYlkg^bVlz%Wj5-0OYQ-%vh0tx~MkdY6HH4ys9~(zt?O;d;{YdK6C==llV51GT?-G z4D!TnIQx~<|3Su}4OW>9g62JJ9W|3Szt0oHL%ML*F`sIP0hNs_Y-JR?_MUC;mwZ{DP@OF~`8J9J3l>U{`tM!eMrME;1? zS#8C-0qVW+>bcy#ehM3 zr0h+qD{e}C1aHF3q#0;MfptZ_vg&hJ)T=AvhF)~shErdj!Ox=0RUj$E?O?Iy* zcEhfR3UL(uj13uIW|B4AV2yN5iI-3-dE&O0`*H=3bli~O=}Z>4Vdj^!$VP6MGQS4c zYbfp1FWO@WFavq65WC?G_`5Mz_Yll0GgLi;8Q%V?-cnDfx7AejvYMu*<4M&S zSl+@@t83IG^@ZB37O5?2n_8v5R(a^H=A&Jkh38y}1j4(zTO^s)a(fAtdv&IC3F%iq3jd0`cUzGp1JcdQJvoiZ_} zylKW@jlvp%H4H0eP~~cJ-(#TfWSk=RGYY^DgGWJBA)m0>%1FVw4l88DfOK%3hV8pp zU&lHg>u6;fL$MA}{zfn52PyP}o%J(dQ$^N|T3Au%khe;S{E4-fwGe9_*1cGFp!8Fn zFwlEIr@sl@J$TYLX<>J=Eszs&Gw`IZ=ovhP`o%6D$ug5Zq_nH$X42=Q=oSy(0c59q z{Z^$G#Y>2oCpRsGNAOkI2Sdq@8jo$JMM8|uJwH1W)UkspIis_wGk1W~r&Njg$u3q@wV0u>^;E^n}{1=gZ?zD%1fkvv4is)q+JCWwy#z9rqIBXnMVa9RejEXSM;)&n}__l90 z<{zkSY}bXlaLdpwLyfN;w%cLZ4$IN!_4)Me>D!H5hwasQI`6CYU$r;Bb=W@VjQtKf zfVWi7WOmBzWE^zZA$?Y#T|Hs-1mio06*wUuaaf@~rB7|`vbBqG+;KbMu%DdpP9lfZ z)?r(RVg4SQopM4x?J!)`cinRiJMXXy4!h{EOAfnYrxN-iTVK!@HXhn|i2Nu0Q-(JK zWsO|LFQZ0A4Z8oLfB7>1OFYjE|EKlov>|Cj$PtJ1?DTAMq;E~DHPGZ%nCWfPF~S6X zPM^!@meGy;qQ1B>Zetud!bzW;KAHTaKI!m-`e54CG(5A7b5H0K>C@7u31@s%1_T1` zi08^FEAfoB6@FS)S{6CtkkLM)J*3C0%;0Kh8JXp}iPYZKznskXgTB@O?oT6yDQ8p8 zUhgVQQEYnb^^V)_QYvYy(^lL2?(LWLz7$>K{8GoJj&*i?MB>5HD|x^^jvP#Hp5DCV zVM^qV^d0urKCTON!Ini^M4#N!PeWqTSER2f=~;iFzgV?))!OTYr;qBRTY7HkX`d(g zkP(s*qF3wHX`|CdJMJ6x#`kx;ze69=hr~@oYL@k1)?er9+|{#J&(;U@fn|f14U&3w ztMN|HNQZdc_;Vsv#{j&t%R2z zkscv_OQu8eUCJjN^+}GG_7i3qhHe9j8 z5qVEvlD@>*7ySV_)tNdoeQo+$$9;p|@JQ4nQTj*yqtq9%i0EfG7yTjr9Q^?~y-|I& z!@Jp5|E_;8EuSeLH>hut9?^TEPf9z#@DrrAE>v^dD1$&PJJnv{*wE481AjKR<^9%veI_b$Mtb{c~YKB(PNH( z=&RJ(sk5E^eOh|;&QHq6)?<$2EfCSOn-6T3o&kS$IotasxB5H%U0O7saj^W0oVx6* z*v-ueo3C4bCBw7#MgCF~Fox~>i9SjRNC~j_OK!#97Q1ea&M8)}N~Ejg`M0{y`Vy5M zRnkA(PuGzT@ypgJ@=0IOSJF#4U;Mc3iO8v2f5>t7?|R{gen`1dK0(gdZV`R%vd8YQ zOLE)|>s`{VwAMGG}|5mq>f3`i7bM!HNtkm{cvQAD`SqFEpi9@dCTcU zyU?9qa$Y*x;{D7FBMaS+-Nq4B27S;IsuudNr`Z$zRn;@Qn>|&G`H=aL zy2E_Ld<6aEN6kU%PIHtw1~Y1nHOH!U<~Z{OeDT7>IT^-Q^l&qcZ3t_-fj5qg9mY58 z=Vq(&#vWr2c#e^aQHH(7w<_4!XY7Zc1MCGKGQPuz$zdZ8e)5eUfdz<@2lL(@1(%q4 z5VN20e9bAu&os`UzigntdUS9Vy#!MuY!VWuE``%%B z4*S80X};t3qr(cESRHX#q4cDfe@7jE$DN}m9QKpMblAmV7mbtB7WiVq7ZVI@ee9GI zztavo}3JV0#LFx z<0#ikyryK0a*-W&&iLM8c@E2W*pCh?aKby{u%ph=9@U!uYx?8bHrpW* zvGR?TZ=lR=w#Q*P(&kyyWla~9xy=qpd{zxuH2`I9v%}6A-#aYNVfhaG(P0Hnct;$D z>-*wz+;KbMurtol%MSb1W@blWYhu^LA~zT7#jDS(K7-t}S*(ot%$zcFig};IdOAmC zq*_UeV2|-z{rl?Qk(X$ttnR+LyZMMl|8LpoWuwhU9X7~eqnuElaoBT`<1?qvoNhjE zGnNQq_~M`!2U)d{jJ5E^m=|NLT1d7-a&>X$;!Ko?&GtAfN2Gjt-ts(@h|La&4qBPE zG7TkSv%}6A-#aYNVfhaG(P0Hnct;#|)H!sy9D2HW! z%lwd%J$g^#+QhX;iOqUC>>)|X=j}glkGP^QxFUH)GHR;r?-`q6ZdKafMM;a2Ec;7F zyGlm8N|qyin-z&G5>eVVqvhmLT28V9()U=gdc|r;fXz78xh!W{4q8(9krg=r0b)Qr#9 ze!dpvX|q8N`>UL>G=FJ6T4^?WPD!=^0KNogci1}dPj?!JxWE;^xL&Hp1CJPdH4RGCl8Z|& z!umpLmt`%>Qk5*3UzWBk&60UC$~+lmo{Zzs%hoSjkDdX3WR!UxrOcDjx-H3Dl81f{ zeq^i8~T^KngM5zBF@bCZy12gKUOA3`{BR6d8EOp)>gG zGTt(H1i@asmwn3_?=fe|^X}ua%Ujx#=}qyj_pWp;OT5-%omCR&<1_2_GSzD@lf09> z@!s*SCC)n>Zr3h@;oiU0MM8-8_VO*=yhTd~ZyRqjZv$tE@Y>5@Z#b4+-ViMIPg032 z@?E=s;ANcKEbwyR8EcVio3)UW_0(;+zoszj)9siyD+WsiJk`+#PjGa@H*hPfzUX&F z;ERZZ@%@4!Y8<|tHXhGuv{&z_5AjW_f8a@tSUjnbpn9rJSRTeR8vE1$bwCwhR;goH zp2M@;SJYU1-9@PhhQHyD@79#ZlN#|xq!FoJHyRiX)!*=3#U1MJc&?(QdK1rOv{7&4 z>54zA$@1iddI!&3Jg451XD-xKJaZARKEN{J4-ARXO5qs^AtzXZV^H zF@#uwSdmzX7)qa&iDASl#BgF&Vl`rQVhv(VVl85AVg#`cu`V%^;nyS9Cq@x(CpMs; zhQw%MBVr7(F|i4;DY2QV_Gv}jf0uMMC*G-o7o1To$XlukOJX1eYRL)tvInpY@lQP3 zmWXc};@oz`KNH&%?1C~*++G2&q2YdZV0H`MFIzY*Uc{+;-y z&R$ZW-Xfnwe499#_zv-1;uM|z>1fOmFF2L>0dX4fL*jJ38}a#v-VLdnLH-eOCXaqh zoJIVEIGZ?!IF~pN@oA2k<>V?0hza`QXCZ1K;!vm-5&ws{nD{C2bG-FdBA&ZapAEzOfePpTQ=fZwyjoA(KupqkxXKn{8Zn)iLEK8rByJ;aCw|RX z?I3#%p?9l%qRXx zgl&BPusTXSMudHW%L)A>!vBeQlK3<66!A3i4DlD@S>ie3dEy0K2%U3LA4T1{L_|Lc z9DO9<72~`Vsx5WQ_n~Akj-KLyXV`pPs@q zz|dC)wS>`vF0JYEwB(O5f;f`+tmLXOhWH$D9Nk|ajwilIoIrd@XCma6$zLH(IiXh_+;v~AiO`J@8hxjh>J>vTec`7+;hcQz)?9-fh*nD}Kaz>O zxZRq7F;a1#f*BX#{$;{=Za<$ZtxU+#f>GQao)T*9PvsLWN{x)*{`rN;vQ=uTJcXC7 z_aty%pT#>@vVUmdT_@zXP{Cu@!*Slb>zq=b zrm>IP{$;DrC%oz2r<+ec^o0eZ5dIMRxSU_oKaRs5UjHXyT>t1FJEDJ^H^qGh_WQ}c zJ~by%&s)GAsC^uD;G#aYpoyN3IQwK&|2}uPQVX(dKYwJa^C9owy1H; zD}8?M#nP^)FCp$fBCaRrI{9q-)2C6tu2YtdpNn(-Y<{a-gzL!6t)BCLba{?GGv9l?rl-O~KK-C#3{>Uzu%4gmpmr%Dd{HrVw3by=<8D2g*b`xZ3NCra-l z6}emOE`15@h@UL|srMGyAa{K2dhd3#xjtBApT(v#UT6<;i$0v5Yt>DC5_yx1eb`R+ zL5};}aTi4|EouYmMA-l3(3R3p*$(;K=1RM`=fQuP)mGLbXX`B4)r*VT8W>rmUSb@Q z6UMr2t5QX}6xTs$2v6E)Qtq-X(T+uVjHVx#Y)bo#{*U>}Nb(!;raxbQMDIm-TacDy zU*AZ=KjMpbiEGGt@+;CiMfqVJDULeTx|Z!)nk=I)cECO^TiBm#r?059jQ@iO(jSguXvhByYBV_x48pCVjZbRzPmAv6=c*ah)v0hznFDE|0H?gk{PF8ajonW59QiDX#?rwK0W1xWBC(ZC`?}|dEQ(<=-?anqi!Vc z?$D%v!)u^#%&m-PCD?j5;gDX~I#2o$(x$a-yiR*5RVO64bQuC z`_&nG*QAQ#59Pu!OuPMNZ|yLouGsOTf8SV;{%Ju2?n4i9i*~r(o^{SeJ4+vhJ%A3^ zyJx&ie`qu4@8^e-`})x2-zN-*?r5NQSjWV!>cVSvhZ8o&YHa@B+LorP{=Kka3rpGp z*O(s13SDD*|K2tJx6Vq)*T0u&kGjU+_0LkLi^kveQD3_Q2p zerAY!-_36(WA^#;JnpW&}T44eYv3m;5Di`AbE~}~Yp>xhoa{7?8#hWbsBUdTyr_=0lB>QMWyv_cTt)13?Ck#A)KSR#b z|7P6vH#hEw-7HRa8~$egNs!AH?o;{3 zMeTDiHsrfUiFio+F1RY)&JFdi*%|TroGj_%^j%sW4zTh&ML?B zZ@&I?33ndDJxBZe(zeCNmP**=L;wExj6PpVT9=fRiPB+8qK7{B!OWZhphUMOX(|5?-zbNuHO`H`#Y+@kvy?%3$Bi^enD^1^c#!H(v++bFni za;SKoxWg*RF>b_s*T0B7`PQ5wU7~+MU*QX1+ZAI@j{k%9HGJclyWRIBTzQ+}yFYV5 zo=qu!bs5vN^4-oG+%MU8eSPdMv*ID$>fX)UJU0tTUn&}pDel*9!xY_zgg(f}*Z|Uv zKH8NLor?SaV|%6ECrK+Q(>D&&)?20d!ZTcc`j_JJ==P_xi_+zG|9ANH+Qc%R{qKZ# z%jeWYJ@?(ef&LAEuE4Y5ShIcY+;GVHkJ#U2wITEclpp*RrrR`lI?MW-~pi_N(LS zygG>Q7hJ*K??xGQl5Zzn!91|x*spHXQ(E3pGRk27*p`?twvEx&sLWYo!#OW(HF-P9 zs9}u5n@P3hy(A+VGr>+Z8p|6=Mr+Rh+6MDP^u$*%Fvo~-x6FcJbdXsvFx&bl^9AD` zNkKe7RV0QGD-p{Q%MjlszDN9!_!e;@&{U5jFM{v}S6Spl9lXD?^(B_dDhW$~`U+)K4zvDl2mc!L&6?_4ECG18Y#;pW$5IXN zn0*JA!zjxTRe+^3O7ys@u1=stgIJ?*9+Ylv zV1yBYw}9&yG9RvL|EN}OAz9_Lo6#JN?PaBh{_ zoLi+fXCkS@xm6l*Zj~6$t*2$WtWc$)r5hraV=oZfF2$I*uA6 z@?=t;s!*Q7DNhl6m+=nFDUJ6qj6fq0v-WrmFL)Wq*=^J!4Jl`JA!juqAGIKDjUa8d zoYjGx)q}f8SYv1xnHjvX(OAV8O^hbsO^v4D%`gKzX6(oNk<~DJwMe17C0UJcN!D@6 zUmeUuEwic18+j%i8E?UT zk}*mB$#@&zz4028jmhBe81I0~+m^LthHG$n=du>xxwNFSK4!W87;_TI{6t}t&L))3 zFiK}TN@qPvXFW=17^Sl{rLzsCvo)o&4W;u=N@oj7=beDDSlx zqn~VF%2Mvhazlfk$agJEpWyN&j+9&;3ma76Eb|9(d32a;A8q?+uxtnBV_iD%4K5u9 zc6emPBP#~HDfq|=%fF2Sx|Oy(S?-}j{l*OF)~|za@%D3;2fI9w{a}{|yZA!4uHoQ) zp|RWTrQ4ZqEu1B|8<(!hT}NXrzJzxT?~>YOOqaS?x!il=-u|8Ubx!OW-nm~_9Ca_9 z1MbOjmdW?X5_eBrr^%iAckJ0=_&sqQdfq+!?w;*OcjzhZ?fbT`Aqzr0(QdCG&#=xT zwu^Ty(Kcs{Qt!#RtMINBcZ~x^wB3GJgth!>N9%;v<64iqb8zc%PD~J|JDc2-)BJaF zX*RxDTYG8jjY)HsX)%Liro~J{8sZQWtTFwubapM#;5D#xjxnvZ(V>{mjSk5YBgZ-m zHcG`Zo6F0MWEq0RV(qXEi@q3ru~Ar~m!l8))^*sflciBREH6j5iVlhPHcV{zX2a+P zCoySSi`!LHVbt2F#aIfXhD45uY+L(G?djFCt0&4*IXHM+;9(qJ8@M+xmFvd9>4CDo zizPaspZ{wAV9z?px>)YPkoY0cVuMvGG|MK@EYLU5DbO?#&>`gvX`fVJ`=k=vCpBS_ z+T)naTVI#$lX`5Q+|Kq%bGA=fvVC$l+b122->`Ht{)PFy?=d@?9gQArvBa9a%wEO= zW^c2P(HpZ|J%}&7VWunNLAGHYVjHHvIm8@d3^0e9L-D1uVdgMnAX_z$nlG9YjHk_4 z%!$TG^ELA|;~CWkI#>;B4r?MH}PA5o;48h;@i{ ziMVqJKMje|#74vzVq+qDxbTB_;egGEcMzK^^+*`LSD;4bs1|f-snn=WuyNwEE%7cQ z#t`9x@1FqM6YnN=Aa*2nBHlxUrh?CViCu_YiG7I=5+5S=Cq7IZK*Sj2@GN;V*XS*8 z=8otkZ{`jUkT-K5%7SFP9*<9><4yNpp1y)N-32{F^jpCFi2=kwqL)~P7(^_qPd|MO zZ@LQ((Rohsj^95u8F4%@ zv=!ng{7It3(GPJv`E)PFu><4SK}j4tD2ZbSC2{Pa5XYxaNF0HPBM@-}MxwT<;W7)k zpoi#3^d|-o1BqT@8DbEztWr-kLn}sbh~71<0pj@GlWh@4;ZG8u)d!zyrN-#9Pq$Fd z5yujrCypb&pw!d-k%IK6Rw4z06NoPnUnXAAGRMnr@HrcA5T6}37;g{@UL|Tlyg@83 zXnE-aJ;M+e!J)(_iO=ezLx&;1&J7=htL+`0gR2QnAihL=nfQvn2=|G^SBddN$RK3X zkhj){zk$}&6MEN>;Y!k|5bo|L&#HCsH$q*|zdZH3`c0pNi-F_k5qEsQ3}?5(xmm+| z;@G93=NVGgunB0J8~Vqm(jY5>9-<%7pBO+4BzlQuh(W}%`sfpjAuEEn>5Ki&t6+U} z$VJTDAQ(cdK&(itL=2_R%ET~Y6=FECDzO@|Iw$?)qD>l34h zw-X!CPeWofu@Nzb*qGRa*i=;?5(JGE_S9l^2VI&I?^HoU7poTf>LY8>y9<6QS^bIb zZHadg+Y$dvY)`zK*n!xQ*ok-#u`}^rVi#gpVmHS5FU0P|9>iGUeZ-!``-#1X4-k73 z`w;swvtoBZ;Gk z&k#ow|4NJ_zNYh@T926?1ph{SgZOvio5Z(>c#9o=@D@7|Z?OaM7CR7cu>+^*!%szH zrU${P#1Dwmh#wNC>+c|k|Ipt9XOMqHoXMjf6K4@WA!1Hegf@pbmpG3&pSXaS0Nqy$ zJ!^$rT1v#c4sFNEybgnFiS-DWCf1`*qF9fBG zh+B!7#BIdw#IJeX9mH>lS;U>hUBunQY~mhb4l$Rwm-sD1+sByfXFeRD%R%BH;&;Tu zIuCmEdm`qJ0{?-SPyCTsz;Fun&%?&6qr_vx=Jy!E&)-_K$J5O zUlQKK-eWUlQKK-eW9>=F=m2?)FN*i^AgK-eW9>=N+rMA#*8*d-wB5)gI? z2)hJ?T>`=`0jKDLgX3YB1g8=|AWkEGNSw|&O8=n`4f4V+9e~V#M4ZW^9}{O0KOxR0 z&LPev&LhqzE+E1#;fk*M_FV3bYLFw2Vy?)M`8iPfn9oRw%8>g>=F=m33x((k39d0c#`-t z@f7hi@eJ`7;#uN3;(6i)#Ce+7rNM8CT>`=`0b!SbuuH(-^ikAM*rmtv#4Z70mw>QK zkL8J70vfvT(Jrt{f*ztD5q4>Cyx1im>=F=m2?)Ccgf@G8lGr66>=F=m2?%`!guVho zUjd<`fY4Du=qMm`6c9QJ7@^M$+9-Aj96Aa}9VK=N9Cisv9VK=N9Qp?cy99(?0z&@) zp?`oa7#i#ncx$Q4Vwb?7e}K?Az^A1IVV49)6484>ipCJ1BaWl{3&ion7l{*yFEM{! zCVz!Ek!QV19#4FYF0f03=ZakdPNMtU#L2{Wi0=~LBfig&r;@Xtid}lV4eXM{7Ix|J zHmIYYz%Erqf9d=FO<>oIPmChoPHaFw z4T;gjM#LCmVRT-PUg$MtF<|`3fHyocDCcrURFu`96~Eb%^KPvZT=Uc?88y@`E@ zeHq$=#C~*nh`c}XVd4NH=5OtP8Fon!Gq?f=5g#KCCJxi*2h4|E5*$u^nmB?uk~oU^ z3~@B^uf#awYdUwp6xb!fzY*Uc{+;+H@h##c;@iZ@#CM4A5~t|h0}5c51g8=|AWkEG zNW{!|NX0*NZvXMHOTsZT9&jd)eoUN2{De50IEOfwIFC4=xPX|T3m(i6yM%CHmw?Mq zmy}qi4pCyAdPUPZ$u~$9AYkUFY#N3wvREvJa~xD0lFL{9wL56JdAu6>m-;* z{DGKH{E-Ojgb)h#@rOcSodk~&F;^}43HUh!>m+!R_%rbo@ig%a@fYG*;yL1Z;sw16 zWp@!JI1$!K@G|jN;uYd=)J4DR{D+UhItgASYC%{hK|>$zIRn;7&_nbiqV@e?2CS1H zTHiplzJX|c18)@1vPYfZ35vvfxiPecUh&73|h_#6k`sYVXSSJamE|HoF)=6CI z6RD|Soy4UHu_>_`@eX2hVhe`WlDxIlXjmsXt1a=*#HaPX0n=ff1V<8|mC}cG5`2z0 zj_xlI#}i*9P9VOdf9QP-y(S6a72-sm^(uKh@in@@It>UA>ja!c_qU0YiSH2KCB8>| zpCL~rXKfYhG++{}lUxhdX}~1Zr`hosdce5gj=m-{P=T1=5Qte&fvqsM z(OhOM1;RE0F|R1xF|Q~P^NIp7uP6}niUKjOC=m0C0x_>B5c7%xF|Q~P^NIp7uP6|6 zi2@%{>VXu6r-6Zw5(g0^;`JmL?;eBzJ9LY?nPg2og)Mm$bDq0b=g`2Gj* zB=KkBDdK4&W<1ByUx;Uk=ZNQt7j!nReo-H89|w&oc$xSs@e1*GeGq>BMZ8MXg3y(M z{*qVFiGqPdFR=`f^$2ZgNHyBVg3n6Yp;-iRX975p_!{wVxML8Fc{~MK%2L~Vy&?6y z7i37)i3989(v)}eOD3oB!vAgTDYmb@P%Wdhv-N2Ck7A$iC$tE zVi2*cUVVQeTDXEkl)7&=zBev7l=vj^HGMo*S~P-xBfdfWJMm58Tf|Akw~3R9?-1W5 zPSGb2!u!Oj#1Dwmh#wNC>!V1^KlFFN8RQ=kXY%OB#972oh_i`vh;xbai1UdHhzs=z zgtmzIKg7kvPl;&hbT20@9UxjacTJae&3#>@U31S0^-op4SEyP~+(1Md2R@T9(h-a{ zj$j%wotQz~O3Wl~BW@>t&G_sfenZ5Ui;ySyY7r3c@B?=f@tt7sJ;WShE^#mMTZV=< z4q~#O`E!6S2Z@J>-x2YB4TOVlYXI?G4d4$%d|3k=U)2B>Fq{+m67GWiL_A6SnRtqL zns|oz3-K)R9Pzv$`l!$V=vxXtEmwzq792^$J;>N8s6~R$5y#Q}1>$((i^K`Umvr8J zvtgelgja|YdDg4s@x<5YGKu_c;$-4G#CM7B5#MKMQ^_fBQcLfPg-w?5QCIJa#gkI+ z>2Fc1mJl}*zal0RHxW~an~AB!S74uybe|9VEEqzpK&(itM2sZj>#6WlpBP2Foe2Bf zqlVaLAnY@+8{Pjx>`v@Kj3wSj>`AD6=ncLDIX;sBOWK>yEVw4pNJ=kKNC+8PZQ4&e<7YFo+F+oUeMc6 zQs`6km@0h=Ao>(Q^eKSoQviS0d%8!!LJD3bYC%{?L4Qd#ETmu{(Mv2Ni05dB=q+u= zK~i={4TPi!f0FpD{;Au1+%cD0^dfNr@g?HRMC4_o5z55b``evG%eS!WDLl1?wqduu z(l!L5Z3sl$5csVAXSZD_)5~45(K0^QEgu$eYuEmG7FUkU<&pV3vXV!lU}JFyseLl+ zp&;%c0dWTj=uZqF1`@r*GQ|H^*S)}3QQZ9>pR?!W3WktyFGMaO7Xr#njEE6Jq!cw$ zwCJOh@<%{x0fk~jKtM!9pgf3(NG&2&tkj2Ev=otgt0E#GMnDV~LkJ;+B!mz`xXAoJ zzc040|Lb}6FR#9{-LpG8GdnXoJ7@N6ylmu;44TLF&>Zc{2G5^}0ShiACOFyl8@XPem%=cuOuOQ^(vRs~!XBD@4 ze`4Ss&ZyZS&&vz)l0U}!ALM1}P0pxkXS7ylv{q-dmis_kV`sFMzDCFw{nYZz49kd& zlF>3o#>zMuFZ=kKyi4wSnJp*zGkHU}pE)~d8>OM@mSNrNr9|%ZQAU(K1HH$~YM>n{bBr4cf&SHpj@Z za*{vPZy9H}ZqQuLusKCODhuRP|K*_Z#LS!~r^^|V_&ayYV&Z@H7K^_*O-`3Hq{X0e zz-(e*j*(*}Wh{3xF*uvYdqU(C`KTs-s zr)+I<9+2~ZoCj>q3=`MCo_cA9Wkg0v=J&9k`8~+|9*mRmay0Q7Nh-`Sa;)SW=FWDH zIj7^7-#DM+o197HOd@9zql2IO{R3AAzwrMUxRST@e3~~kxZfA%?hD5HLwWs!2R!#1 zywm6Bv>r>?swS@|TNT-SIoEbJFK4h%a+k2~cwP#7esfEpJ)_z4@PG`3e`;VYdsg(H z##V)S)ok^3?jvkfy~Kj=$MWXzd2wzFKHooJGoK&npTOrO1GXys+JRHq>g0enY_&JH zmaX>OT*p?22Hwk7#RJD%_|7Gc;FItAkKmKiyj(sh%^R%!kK9ng{yPTT#r|L3Jd~}z z?Z3v3lG}%^j`q*Jl1tYY1-~F~nklS~EVUz-f`H!rK=Ra7I;sao2%&huXhJB*~pk2TbM_6JBmV&i*8Sbif8$-g7s1=M6S4do3|3&6&bJ-}gVrKF4oP zWuIgHQ-fLlbnd%9?lIf;$hoXNrq~|sduoq$wnt8_?QwIh_L##JW|BXZn@0=sUG5O} zJ3b&k;5}{G7wjzew|A_S=MG`-ZwB^e??buS?0q=5XF$&}J2#j`JcqdX+;zE}RA%3s ziL$BWd0W;b%T6*?c9v-}UH0*3ZrVZ1W@gL5TK_XSMBXZIlef!!d50V-i8V(YChwHP zCB3qnTUf6Q>6Ib9GNf0AqvUA6E~A>dWsZ?!5;SVWaqBG%)5xpDe_TSAgB5-vNuv|&1rJFoFSj|mq^zf`IMY1pO*9FGjhIsRxXeW zgxkv7m`{Z|uC!;0<0~K zfNFPAR>~?_El?WZw9sQ=*`yWI+fFwT6dzawa3SE_E6vU-ZYFbigP|8jN+VK!8B%4 zQD-U3MeZT4#icj3;aY4m0|c1?f{Z~UW6;PLG%^N_j6owaK(LSh{>CI~nwc#}`&WXQ zlzVfG94jaJ>V7%Iu_$LF*R(HgT5P2gDV<2^L`o+<;rFI)qi_uR6~b%sb-7l)A-PLo8}3q&yA z?o#k;$z2M|+@&CQDac(4a+iYKr4Y}?QvsA+oRuZ+ap_7-@dWhV}$mYVte%1&q&c|=bF#8 zaWWhuxt_B8q;s7b+ZZxFCFjbgxthnjd0Ku(GKS1H&&maIp4``l)Q_P*RgoV)O>n&ra>@|EVoMm7mG2@^iUOej&HZFO||Aa;MxS zzmmJ<*RoK4BlpO?a-ZZ5ml*C>9KK^sJkQA4ngjBnJR}dhHjxPJzFF+rWOsK*v|J*O z%2I`M%(;wIp07(HCy&c=c|vk+==Zi=8<1-Qa&17a4al_txi%oz2ISg+TpN&U1JYN^ zoZ;$K8qdiFd0t+S7wKQmbeEj#y~h0@FH3Jy(M_xGZ>he&rTYFB&yd=hC@Via^Jm7$ zSQ#gopM66~sFCY^!@*zxWvNRr#PW@&;>_FFCOf#@xjruk`C4;_yXA&`^!I++V=X<; zyzEqa>v8xp{n@*Fj-=hFyKxWghRJU$Eg#09>G?ff!K|AAIQ`ug&M7zs6bNwpX zjvALnYjd(s5pBom>^8I=HP>ynYh>4P?AMWP@3xlWx|P;aAT0&Xl~2>>DzTQL+j94e z*3eS$DJ=!kQuG|elc2V|NYX}R^KFx)jbNEJ0+({0N_gtnmT3`?76EAykQU+kI%^TG zTkU8OdX+m`1lH3cWYxIUT7Fg17W8?@+5&uCu9a`dKl99ODm9<-K+O+zpGwUipKUV* zZU|BsOP?IH;(LtwL6X~`E#GnXvdz0LF=))_df!g_Xm#6lDz~Sa+pXdWRP$5$ndE+n zHJ{6E@(an6&#b2=6XzY0n#?jaxzBn>O=g*zoRaUT$;7-+YpBVrrzRsc8L7$0v(toD zBoD}g?#A9T>SR#NL&rq&^KiC9sWkh+A_ zrR))wX)H5NHXGb*IYquH$6yzp=5^QgamQpC=YN>JlMl<~33-+)*#^e@&fq!OAkWJS z@}fU~-C#!jPW7x{jL5t!y~!An8S=!HIRs`{Mr4#7-Rd<`uaSC<)a&c|aD6}5yD!&w zGhg2A>-uC<6Ha#AKusv_)03J|*5gxZ!f_n0Z6?TveM7I!!6aEAACt5End`c6|2E0* z>~R-;y$fCXSswK6${61%q?Nj^Zz$fM>oqvk$e-yw#O@1wALja9)#F``{B7@Sj=Z<` z4vt*hrH&&X>G=uQ@3P)`S3>Q6*+R`Mvrv2Ovrv&xdzV_MJ!>u0UUdp}zCs;op=NAR zs09jjl|mhFq4ug~G=zR>_cqpdrWU;55A^Oz|EIiX3%mdBy_o$@T|1Kfs__9&>9H1} z*QP7`U0b643T!`)%6>f#+kU-ljH15BeD*tw%$Dt*p#5h5xZgVMXZ_0qy|!pS?!_I& zi~YXqmB@ajy;In)wAWzmH<-`bP_CS7h05P+>j>jS#zA+?pU+%IPE_|S7M(^iRzwRZCs@14sxQRyNx>(X6@$)UnBjr)-5=~;r8+5#L=FIe++e%LY=2ja}??f z3$^EZg*wMV?Lq5Ks09}4wY2NLut$=G+H10fdadQ};hysq>SE?EEOxF(KWpo7iKMM# znYIpT>u`mntz((C4r%M~Wl3AdGHo5w*5PVNTgUQ7mztGBZ=*x|X!nu)SbidDZPE|!25D`O)&>t#WB1!#AQsCbvP2%0l*w*scC{uxl*wL{ zbmux;;@TOVm1oz;ULAuwT+58nl+TvklDImirhUSB&&jwNQ!C&yg3{3|Js^sys%f7_0Xq&(wYmu4x? zSZparQjUazq&&5sjjMDkQp$^z@*<_Yh+kZ>^`smv<$+QjI7@lpEad@jkv2(r*N&EQ zwBs+=@t0f5SwqT^lp`reQjVk?NqN_fmh$d@vXp1MWhw76+gh}1QY`)5c3Jwn_qFsl zrygUWrN3=Q(x1eZr2m>#SJEF=`ma^`(awDSmGp=C9><1dE&WI+NcvO8So%{6Ed9ut zN6tKwekA>|b1eOBCtCWE^dsp<(vOz@BBj5`(toYe|C4K!{vxHnNa-(9`iqqQBBj4b z=`XVMH!HOC$Ih|zrxaNFv+lC=|D>&@KXtdIABlO}iI)EKWu!l$xz2yrwl2$A`PSVY zTKS%9sYFtlIMY&@RcEP0Qi-GzNhOlLHf5GRBz;Kwkn|zxV;jyd{+ZlW_x$*YI~=1$4=M{ z?CrW`JGBk1*I5Zc@($Sw$-C%LmUmq?S>7RehvXfScSs3odza;)E4Ca&auCTuBnOck z%;fueNe;414k9^-`~L9C%+~@tTJuP{rj%*?$7>WRwen-En_G#?8fptrqvA27Gr!_ zl~yM*XLBy&(idC7m$vzSrFSv*b%SHfGa@RlmPxeBk3!ds*8URHQ*6<(f&m(f}+rzAk+zp;l)MBGihEzLd49&UJ)( zJhMBYew{g(P`^&kBh(^N&9{1~Nrd`+%9Vcq_VgMn!Rhr@f;*2R)Ki_KtpsOOS_w|0 zoKU9gtpulEvJ%|c?&$ZXThC}u>Qq8Klz!OanqFfiIHOW&-)pWm|aZTNNH}_)1dsHgesU@A%5((e7{Z zp#L~+k1O%(*s|0gYUVh?0m>J1PdeNE!?tz{LKppsj;ll5bF%z{-ScqdO`V4Y&R3>? z5QO}ev{6CWpXf9q;MXqNEubAL!Jqs3)H%W9zL0Hrr+TLfVp_!VOlfVwaE|jN<=D9i z_$srnDw_^t_LZ3^o601aEIY|m*;%H^blJzBPqS|y%xpPW>whMP$Xn%Y@^+ao?~p^~ z&*d#h+E|iNT^E3&Ed78*PO=O-XGH(u-*;O9bOWHt|X#>OhMVO>zc9mxhEg^E1N7}>2Lzs0_m-Yd(Zp`;2vobk4voeuc znaHe6WL73JD-)TOiOkAGW@RF?GI6hDRwm2eDF+VIvUKDd6SG(zktOn|Jf@VE`TFoS zX8V}s@`S9QwmD{inU%6iR?AbeMxK_n@{FvLXZ?ZHHH-+A;yKwM&&vz)k}smZ{2(t& zZ*m1Qqb!EZ7cygHtc;UfEz(k`*=N(6QK!ktAYyB*jqk`Wn)w}RZ!tD&j+B(uHkFLK znmnPAx}0xt%qM6O$5FG9w6>-;^D{oOGg|pNma^5ZZ|$erxlL+j*Ei&>vWD}C2mSeu zx=(J^kGP!fxRsWrx?>@&NhQ~AW&{xC7c@PE9c%b*(hSRpjFQnZM#joG87~|853hcR zIbmjkuj)`jTVp25rjp+hXHBx~BvWN)nI_X^A76F#8rm8&TMpLxpUENeR(YGeUFOR> zp{Kb4=!t@3lZO@1M_%P*CR9df7K zCBKrp<=3)Mek1qDy>g%YR-x@zOukdD7HQ1^dC(V=KZmq@*nh?H_p(?XktOn|ELAwi zl()1^9m=h3LfR&zZNdtFp#5apCbLpj$!d8@*2vScR-Tb{lAav7SMN{ZIoTl3%L|g8 z17-UX@hPE&GA~PS(n6U$k4;~O=dqFJv61JoG0Ngk%VoyMSQ#fT`qNjhv6hQZe_%~H zZN}b|8T3hNJCxIM>}x-nK1t2hYv_~I(Ssb|OZjw&|9i(r=&_spZbFCI0l%Ao`C4PG zo}>4^`RaJuzC9i1(Ds=l<#=r~LGpxB$CUvy3a@^M7SNWNQONS+zLX66Hl@{ z)8vf(dbVTC^GW~qPu``znor5O@@Y9wJ|pMLXXOI9P%e_c^R=x5e(_*qyMxqPbBTOT zE|t$qYHhns)Y=Wny{*==Os&Ng`t&8aQvP1PEdL-^$yelR`KnywcZVlZYd5yuM6ESn zmuux4@=uE4o4)oZW2n0pTdwty?p9xavf1kERl1jNHO8(4ahp_AQ>~7+=*}$Qi*4t+ z&D!gIxy8TN_=5X~mOqdm%8%s7@)P+_ZTYGEOm3B*%Wd)txm|v#6zz~Z|#CwBMHwl8(`vy`sX&d*v`P$SDy z+EWX^Yr2(MX#T>=hV?qy9kgBt((AySCM8lRx0_F z>qpYtRw|RWSgCAv8@-gzl6G;Yw7W$C=jT(lJnLWK{_3J%=icT{>1^wKOKYpGmew|# zEUhgHEUj(cvh=kYWGQg#ECnqeAqC&JtS1FXJRVT2pOQ;u2eh&N6Rqvn=IXE7!_h9b zuHa}FTV3Feu`b%~Xv6xhCtGbJ<@K$$1dK-T73clF zJb4S-R<+*Eww29?*a$?cU3`|pk@`7$TrErKU72ASkx?>Q#>iM1C%KPj`_cX%(PNnB zWsZ?!CBMPf%AOfH)7qXHF{j8!Wr2Lm@41TKFZVmRSAJYhlhfr4`Gh~-I+a;qCgT-2 zTUw6TlXT}3mf3f-&3Rr>UY6brkw6UDmRxDfu#Ct?zJV*m5MS7IF4qP#U;e_^weH9D z;8?4d$?IdyHj{tfwXiXXBP~~xf2BBHTTYNXFVnhv@USmwu{+>-8I~t$xq$PR6!7gF z&hjUT;aGC|KroJ+Hp4O^qhz#+Mv>puE!&Xa<}^87&X7;&O^Y+-EIC^~>CdtK9Ql--E1#CUOPf!h zk@MxVa)DeZ7ss{Err-~4T^TjuL>t$agXxi9@vTkeoM4iL4B)^vSkq>?BZlA*=31~2>UoPm$X@e%b;G*4Rxemn`7iyImy2gYD+oW-IQ6!k`|if zM`eMW>Yop_poE#z@v0T1$UYHXcqVtu7Ub!KH(3A*3$x;v;0Dv_u*bA*PMG+j+MWXbLC_5Rk=j2!4~B5 zD@kS6+BO?%X-fK&r73BorKt(?rToJ9L`ze%p_ZoPQI@8Jd`naEU`tce!zt@XCIPwqNKH`z0lgV(h*t=^N{sG$EBPAz_W}m&7*=c8sJ_ZOhC~*Dhf_+qP}Y zx7@BxLIK;hZd|Qx3x3>oleT?L@!=T**CDZxZLdxk%C;#<`)u3B>+Lskd|lHew8Umu za>u|jBPYnn2{LkmjGQ1NC&;KU^4(U_)M%J0MIu(uQ(CV1^@@`*s)mGY@ zhQ#)?H|9vmnNAvPXS(S%cBXN>wx3{L$z?{KID0O~a+!98r%jl%!qXT!EY_??;>Gd*Z4>+NM)Y)^QELkeEtoKa<#nkd8L7wywNs0wGm2ev1;`kl2dv z@IwBZ1RDV|!!jbHWVDQtu`*7^%SQga$YQRXW`d_YGXi8L%BC_&Cd*DTRd$wXGF|o| zz9n3H&1^YX>whMP$Xn%Y@^+ao?~p^~&*dGnwmpG4dXg($9%BST#`HY+|`6WHJ@vVJjH=L z#eqD?;W1$ohb6Pd#u<%z_J+)`jKl*Qkk zenp;VMxK5}o_@t2{MjZmxvteGmUBg`Y4ibY-TRRlv~}ifmIK^rn)zCDx8Kb*={}1& z?VdSOj@PFXB)=1qIEB$2q@9>Zo8{bSIZpl(tre?obdUA0_->Z=B*vZ`tZsZStypnm zYeCE68qFj5BXf=(RvETVd!`P#~(QWKe8oz-(DjM7Oi4}3{tVb8$ zooNaoe?B&mcFzpUh>ViaGDgPAI2kV+aT__8ad>mIKNB~V{+u~Rj+H!J>Kfc+j;47q zNQ&`MSs?k&wNX9y4VA2aTuzhIpV?T220&d_#_R`}&v^YvUWWC#@xo z?7P$QxT&PIJg&jM8)qB78%Im`U_!a>$DFE8vk}y^CJiwz%!|%05Hl8dXggdnpZpeeXhl ztklh>3>`zBXN|L25TC@`jMNX~_7U&zW2|>s8q+|$kH(Lo=TsZFot~39%WsKezKP2r z7S7GWfWIM1Nyw$TJeIGbJzB?%;FbJa$`a2o@oyUca@po8-cxZo5uMB3#m?AV#ywBP)mzUlc3M#Ab3zB1 z3|#29#PrqQzsJ3%zdK?s=+LUF^Ck}cUHRkRP5S&)+&qGhC2M-prwl^fEe)ZP z&;r)QksAHyKMu|P_wtI^I=__P)_EZ+?O*Hu_h0|_&{SLJ{~Dsi{pbIDeH`DPvQ2ed z^nc!h&%TYe5gg}thsOVF8*j%aeB1wDpa1)_EzvdFe(C=|%ztnDLfiE9x(8y38|GI}dGFQEX+5MZTJ0ad0b}{tB|EeXH%lW~b!EoYz&yV>$ zI=DX=6O83<+H(9~^@z8&*gIQ-*}=SES@1%zJa{o!K_2nMV|XiXC%fdok4~a?eIF!o z?_S{^;gg+FZD|$GM5k!Ga%RCrv)%rvOKi6{s+8@@-3Y#YsE;1W*8hyEVC&OSH7>$d zW#Nz5>R8lnwmKcPozJ&LeX4LOs6+gunw?GR@or)g@&{c4>+WP7HQ%3!TE<{Kx&#aJ-FDM#w8)8CAe1=;CRC%A-b*s?x|fQdJ#gA(jN~Nqb$$ zzIi#!-2k&eq8=m%DqUSbJ&CLc#&8$9oY>t&?Ch!Z%COxhRJmcapfx;EZQ&k|idVR8 z2)8E4CEV{L2^Oxh=U^n3aLc0-3HM}}H}cSGw;#gc ziEJX=Lv9G+R=PaG-5c3p-xP(iiEkmxyniE-N4Up{JK<9P`3;9)2jSjDxX#@nZ$>-o z--fFR>6_47oX;|z5_0}*aGA6ENwAqPYCk3V6Al|mpwiY-xj(|tSn9SG|{dH z;Y8w8A3Venwg)wK1n$1L9t1t@dJrzN>p@^Wk524oWxXo=u1e=IXIGM=p+8yaq%;No zOPk&9`mvpJ!!d@VRE6h}jxFH_37=&`t_{<;@EcKG3BN9!O5DE=;@RUy_DCkIs_fGv`^dhsyX=8sj$i3Ybp(EW!`ZA|rj_gSG;GWnqW8*~ zsB-(PWO3~Kc%J7$&Ve~n-cK5A#_bu7{QxC@IOo8&XVlDDnL6Qy5b7|6`ZGC14wkpe zdt|2kDOy>pB0TZ|$p^ffQZ}4e)DS8?UP>HK@2jkptE|~JUx5#et8ks-a F{a;$^yfXj* diff --git a/onlylegs/static/fonts/font.css b/onlylegs/static/fonts/font.css deleted file mode 100644 index bb8f61b..0000000 --- a/onlylegs/static/fonts/font.css +++ /dev/null @@ -1,7 +0,0 @@ -@font-face { - font-family: 'Rubik'; - src: url('./Rubik.ttf') format('truetype'); - font-style: normal; - font-display: block; - font-weight: 300 900; -} \ No newline at end of file diff --git a/onlylegs/static/logo-black.svg b/onlylegs/static/logo-black.svg deleted file mode 100644 index 559ad4d..0000000 --- a/onlylegs/static/logo-black.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - diff --git a/onlylegs/static/logo-white.svg b/onlylegs/static/logo-white.svg deleted file mode 100644 index a50b3f3..0000000 --- a/onlylegs/static/logo-white.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - diff --git a/onlylegs/static/manifest.json b/onlylegs/static/manifest.json deleted file mode 100644 index ab9009a..0000000 --- a/onlylegs/static/manifest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "OnlyLegs", - "short_name": "OnlyLegs", - "start_url": "/", - "display": "standalone", - "background_color": "#151515", - "theme_color": "#151515", - "description": "A gallery built for fast and simple image management!", - "icons": [ - { - "src": "icon.png", - "sizes": "621x621", - "type": "image/png" - } - ], - "splash_pages": null - } - \ No newline at end of file diff --git a/onlylegs/static/sass/style.sass b/onlylegs/static/sass/style.sass index 3302ef4..daf7094 100644 --- a/onlylegs/static/sass/style.sass +++ b/onlylegs/static/sass/style.sass @@ -23,9 +23,8 @@ * box-sizing: border-box - font-family: $font - scrollbar-color: RGB($primary) transparent + font-family: $font ::-webkit-scrollbar width: 0.5rem diff --git a/onlylegs/templates/base.html b/onlylegs/templates/base.html index 59c3b06..f39b915 100644 --- a/onlylegs/templates/base.html +++ b/onlylegs/templates/base.html @@ -1,37 +1,32 @@ + {{ config.WEBSITE_CONF.name }} + - {{ config.WEBSITE_CONF.name }} + + - - + + + - - - + + - - + + + + - + - - + + - - {% assets "scripts" %} {% endassets %} {% assets "styles" %} {% endassets %} {% block head %}{% endblock %} @@ -70,14 +65,14 @@ {% if current_user.picture %} - - + + Profile picture + > {% else %} @@ -109,12 +104,12 @@ - - - + + +

diff --git a/onlylegs/templates/group.html b/onlylegs/templates/group.html index 07ef0e8..c942713 100644 --- a/onlylegs/templates/group.html +++ b/onlylegs/templates/group.html @@ -4,8 +4,8 @@ {% block head %} {% if images %} - - + + {% endif %} @@ -47,7 +47,7 @@ const formData = new FormData(); formData.append("group", formID); - fetch('{{ url_for('group_api.delete_group') }}', { + fetch('{{ url_for('api.delete_group') }}', { method: 'POST', body: formData }).then(response => { @@ -143,7 +143,7 @@ formData.append("image", formImage); formData.append("action", formAction); - fetch('{{ url_for('group_api.modify_group') }}', { + fetch('{{ url_for('api.modify_group') }}', { method: 'POST', body: formData }).then(response => { @@ -185,9 +185,9 @@ .navigation-item.selected { color: {{ text_colour }} !important; } - .banner-header, - .banner-info, - .banner-subtitle { + .banner .banner-content .banner-header, + .banner .banner-content .banner-info, + .banner .banner-content .banner-subtitle { color: {{ text_colour }} !important; } .banner-content .link { @@ -215,10 +215,10 @@ {% if images %}