├── benchmarks ├── __init__.py ├── bm_exceptions.py ├── decorators.py ├── bm_transactions.py └── bm_stack_utils.py ├── .flake8 ├── requirements.txt ├── pyproject.toml ├── .gitignore ├── LICENSE ├── run_bench.py ├── README.md ├── run_bench_commits.py └── fixtures └── lines.txt /benchmarks/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length=120 3 | ignore=E731,W503,E203,BLK100,B301 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2023.5.7 2 | click==8.1.3 3 | elastic-transport==8.4.0 4 | elasticsearch==8.3.0 5 | psutil==5.9.5 6 | pyperf==2.3.1 7 | python-dateutil==2.8.2 8 | urllib3==1.26.15 9 | wrapt==1.15.0 10 | -------------------------------------------------------------------------------- /benchmarks/bm_exceptions.py: -------------------------------------------------------------------------------- 1 | from benchmarks.decorators import with_elasticapm_client 2 | 3 | 4 | @with_elasticapm_client() 5 | def bench_capture_exception(client): 6 | try: 7 | assert False 8 | except AssertionError: 9 | client.capture_exception() 10 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | line-length = 120 3 | include = '\.pyi?$' 4 | exclude = ''' 5 | /( 6 | \.git 7 | | _build 8 | | build 9 | | dist 10 | | elasticapm/utils/wrapt 11 | 12 | # The following are specific to Black, you probably don't want those. 13 | | blib2to3 14 | | tests/data 15 | )/ 16 | ''' 17 | -------------------------------------------------------------------------------- /benchmarks/decorators.py: -------------------------------------------------------------------------------- 1 | import functools 2 | 3 | 4 | class with_elasticapm_client: 5 | def __init__(self, **client_defaults): 6 | client_defaults.setdefault("disable_send", True) 7 | client_defaults.setdefault("service_name", "benchmarks") 8 | self.client_defaults = client_defaults 9 | 10 | def __call__(self, f): 11 | @functools.wraps(f) 12 | def wrapped(*args, **kwargs): 13 | f(*args, **kwargs) 14 | 15 | wrapped.client_defaults = self.client_defaults 16 | return wrapped 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.log 3 | *.egg 4 | *.db 5 | *.pid 6 | .coverage* 7 | .DS_Store 8 | .idea 9 | .vscode 10 | .benchmarks 11 | pip-log.txt 12 | /*.egg-info 13 | /build 14 | /cover 15 | /dist 16 | /example_project/local_settings.py 17 | /docs/html 18 | /docs/doctrees 19 | /example_project/*.db 20 | tests/.schemacache 21 | elasticapm/utils/wrapt/_wrappers*.so 22 | coverage 23 | .tox 24 | .eggs 25 | .cache 26 | /testdb.sql 27 | venv 28 | benchmarks/result* 29 | coverage.xml 30 | tests/*-junit.xml 31 | *.code-workspace 32 | .pytest_cache/ 33 | .python-version 34 | .env 35 | result* 36 | -------------------------------------------------------------------------------- /benchmarks/bm_transactions.py: -------------------------------------------------------------------------------- 1 | from elasticapm import capture_span 2 | 3 | from benchmarks.decorators import with_elasticapm_client 4 | 5 | 6 | @with_elasticapm_client() 7 | def bench_transaction_no_spans(client): 8 | client.begin_transaction("test") 9 | client.end_transaction("test", "OK") 10 | 11 | 12 | @with_elasticapm_client( 13 | span_frames_min_duration_ms=0, 14 | source_lines_span_app_frames=3, 15 | source_lines_span_library_frames=3, 16 | ) 17 | def bench_transaction_spans(client): 18 | client.begin_transaction("test") 19 | with capture_span("test1"): 20 | with capture_span("test2"): 21 | with capture_span("test3"): 22 | pass 23 | client.end_transaction("test", "OK") 24 | -------------------------------------------------------------------------------- /benchmarks/bm_stack_utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from elasticapm.utils.stacks import (get_frame_info, get_lines_from_file, 4 | iter_stack_frames) 5 | 6 | FILE_PATH = os.path.join( 7 | os.path.dirname(os.path.abspath(__file__)), "..", "fixtures", "lines.txt" 8 | ) 9 | 10 | 11 | def bench_get_lines_from_file_start(): 12 | if hasattr(get_lines_from_file, "cache_clear"): 13 | get_lines_from_file.cache_clear() 14 | pre, context, post = get_lines_from_file(FILE_PATH, 1, 5) 15 | 16 | 17 | def bench_get_lines_from_file_middle(): 18 | if hasattr(get_lines_from_file, "cache_clear"): 19 | get_lines_from_file.cache_clear() 20 | pre, context, post = get_lines_from_file(FILE_PATH, 250, 5) 21 | 22 | 23 | def bench_get_lines_from_file_end(): 24 | if hasattr(get_lines_from_file, "cache_clear"): 25 | get_lines_from_file.cache_clear() 26 | pre, context, post = get_lines_from_file(FILE_PATH, 500, 5) 27 | 28 | 29 | def bench_iter_stack_frames(): 30 | for frame, lineno in iter_stack_frames(): 31 | info = get_frame_info(frame, lineno) 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2013-2019, Elasticsearch BV 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /run_bench.py: -------------------------------------------------------------------------------- 1 | import fnmatch 2 | import functools 3 | import importlib 4 | import operator 5 | import os 6 | import pkgutil 7 | import tracemalloc 8 | 9 | # This is handled via PYTHONPATH at runtime 10 | import elasticapm # type: ignore 11 | import pyperf 12 | 13 | import benchmarks 14 | 15 | 16 | def discover_benchmarks(): 17 | for importer, modname, is_pkg in sorted( 18 | pkgutil.iter_modules(benchmarks.__path__), key=operator.itemgetter(1) 19 | ): 20 | if modname.startswith("bm_"): 21 | bench_module = importlib.import_module("benchmarks." + modname) 22 | for func_name in sorted(dir(bench_module)): 23 | if func_name.startswith("bench_"): 24 | yield getattr(bench_module, func_name) 25 | 26 | 27 | def run(): 28 | metadata = {} 29 | if "COMMIT_TIMESTAMP" in os.environ: 30 | metadata["timestamp"] = os.environ.get("COMMIT_TIMESTAMP") 31 | metadata["revision"] = os.environ.get("COMMIT_SHA") 32 | metadata["commit_message"] = os.environ.get("COMMIT_MESSAGE").split("\n")[0] 33 | runner = pyperf.Runner(metadata=metadata) 34 | pattern = os.environ.get("BENCH_PATTERN") 35 | 36 | args = runner.parse_args() 37 | if args.tracemalloc: 38 | bench_type = "tracemalloc" 39 | elif args.track_memory: 40 | bench_type = "trackmem" 41 | else: 42 | bench_type = "time" 43 | for func in discover_benchmarks(): 44 | name = "%s.%s.%s" % (str(func.__module__), func.__name__, bench_type) 45 | if not pattern or fnmatch.fnmatch(name, pattern): 46 | client = None 47 | if hasattr(func, "client_defaults"): 48 | # create the client outside of the benchmarked function 49 | client = elasticapm.Client(**func.client_defaults) 50 | func = functools.partial(func, client=client) 51 | if args.tracemalloc: 52 | tracemalloc.clear_traces() 53 | runner.bench_func(name, func) 54 | if client: 55 | client.close() 56 | 57 | 58 | if __name__ == "__main__": 59 | run() 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Benchmarks for the Elastic APM Python agent 2 | 3 | This repository contains the benchmark suite for the Elastic APM Python agent. 4 | It uses [`pyperf`](https://pypi.org/project/pyperf/) to run the benchmarks. 5 | 6 | ## Writing a benchmark 7 | 8 | Benchmarks are callables that are auto-discovered by the runner. 9 | To be discovered, the callables have to 10 | 11 | * be prefixed with `bench_`: 12 | 13 | def bench_something(): 14 | # code to be benchmarked 15 | * live in a module that is prefixed with `bm_`, e.g. `bm_mybenches.py` 16 | * that module has to be in the `benchmarks` package 17 | 18 | If your benchmark needs an `elasticapm.Client` instance, use the `benchmarks.decorators.with_elasticapm_client` decorator. 19 | The decorator will instantiate the client outside of your benchmark function. 20 | This ensures that client instantiation is not part of your benchmark. 21 | You can pass configuration option to the client as keyword arguments to the decorator. 22 | 23 | from benchmarks.decorators import with_elasticapm_client 24 | 25 | @with_elasticapm_client(span_frame_min_duration=0) 26 | def bench_something(client): 27 | client.begin_transaction() 28 | # ... 29 | 30 | # Running the benchmarks 31 | 32 | First, install the requirements: 33 | 34 | pip install -r requirements.txt 35 | 36 | As these benchmarks live in a separate repository, they need a checkout of the agent repository to run in. 37 | You can use the `run_bench_commits.py` runner to create the repository, run the benchmarks on one or more commits, 38 | and send the result to Elasticsearch: 39 | 40 | Usage: run_bench_commits.py [OPTIONS] 41 | 42 | Options: 43 | --worktree PATH worktree of elastic-apm to run benchmarks in 44 | [required] 45 | --start-commit TEXT first commit to benchmark. If left empty, 46 | current worktree state will be benchmarked 47 | --end-commit TEXT last commit to benchmark. If left empty, 48 | only start-commit will be benchmarked 49 | --clone-url TEXT Git URL to clone 50 | --es-url TEXT Elasticsearch URL 51 | --es-user TEXT Elasticsearch User 52 | --es-password TEXT Elasticsearch Password 53 | --delete-output-files / --no-delete-output-files 54 | Delete benchmark files 55 | --delete-repo / --no-delete-repo 56 | Delete repo after run 57 | --randomize / --no-randomize Randomize order of commits 58 | --timing / --no-timing Run timing benchmarks 59 | --tracemalloc / --no-tracemalloc 60 | Run tracemalloc benchmarks 61 | --bench-pattern TEXT An optional glob pattern to filter 62 | benchmarks by 63 | --as-is Run benchmark in current workdir without 64 | checking out a commit 65 | --tag TEXT Specify tag as key=value 66 | --help Show this message and exit. 67 | -------------------------------------------------------------------------------- /run_bench_commits.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | import random 4 | import shutil 5 | import subprocess 6 | from urllib.parse import urlparse 7 | 8 | import click 9 | import elasticsearch 10 | import pyperf 11 | 12 | LOG_LEVELS = { 13 | "DEBUG": logging.DEBUG, 14 | "INFO": logging.INFO, 15 | "WARNING": logging.WARNING, 16 | "ERROR": logging.ERROR, 17 | } 18 | 19 | logger = logging.getLogger(__name__) 20 | 21 | BASE_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) 22 | 23 | 24 | def get_commit_list(start_commit, end_commit, worktree): 25 | if start_commit and end_commit: 26 | commit_range = "%s..%s" % (start_commit, end_commit) 27 | commits = subprocess.check_output( 28 | ["git", "log", "--pretty=%h", commit_range], cwd=worktree 29 | ).decode("utf8") 30 | elif start_commit: 31 | commits = subprocess.check_output( 32 | ["git", "log", "-1", start_commit, "--pretty=%h"], cwd=worktree 33 | ).decode("utf8") 34 | else: 35 | commits = subprocess.check_output( 36 | ["git", "log", "-1", "--pretty=%h"], cwd=worktree 37 | ).decode("utf8") 38 | commit_hashes = commits.split("\n")[:-1] 39 | commits = [] 40 | for hash in commit_hashes: 41 | timestamp, sha, author, subject, commit_message = ( 42 | subprocess.check_output( 43 | ["git", "log", hash, "-1", "--pretty=%aI\t%H\t%aE\t%s\t%b"], 44 | cwd=worktree, 45 | ) 46 | .decode("utf8") 47 | .split("\t", 4) 48 | ) 49 | commits.append( 50 | { 51 | "sha": sha, 52 | "@timestamp": timestamp, 53 | "title": subject, 54 | "message": commit_message, 55 | "author": author, 56 | } 57 | ) 58 | commits.reverse() 59 | return commits 60 | 61 | 62 | OVERWRITE_ALL = False # ugly way to store overall-overwrite-status 63 | 64 | 65 | def run_benchmark(commit_info, worktree, timing, tracemalloc, pattern, as_is): 66 | if not as_is: 67 | subprocess.check_output( 68 | ["git", "checkout", commit_info["sha"]], 69 | cwd=worktree, 70 | stderr=subprocess.STDOUT, 71 | ) 72 | env = dict(**os.environ) 73 | env["PYTHONPATH"] = worktree 74 | env["COMMIT_TIMESTAMP"] = commit_info["@timestamp"] 75 | env["COMMIT_SHA"] = commit_info["sha"] 76 | env["COMMIT_MESSAGE"] = commit_info["title"] 77 | if pattern: 78 | env["BENCH_PATTERN"] = pattern 79 | output_files = [] 80 | benches = [] 81 | if timing: 82 | benches.append(("time", None)) 83 | if tracemalloc: 84 | benches.append(("tracemalloc", "--tracemalloc")) 85 | overwrite_all_files = False 86 | for bench_type, flag in benches: 87 | output_file = "result.%s.%s.json" % (bench_type, commit_info["sha"]) 88 | if os.path.exists(output_file): 89 | if overwrite_all_files: 90 | os.unlink(output_file) 91 | else: 92 | overwrite = click.prompt( 93 | "{} exists. Overwrite? (y/n/all)".format(output_file), default="y" 94 | ).lower() 95 | if overwrite in ("", "y", "all"): 96 | os.unlink(output_file) 97 | if overwrite == "all": 98 | global OVERWRITE_ALL 99 | OVERWRITE_ALL = True 100 | else: 101 | print( 102 | "Skipped {} bench for {}".format( 103 | bench_type, commit_info["sha"][:8] 104 | ) 105 | ) 106 | continue 107 | test_cmd = [ 108 | "python", 109 | "run_bench.py", 110 | "-o", 111 | output_file, 112 | "--inherit-environ", 113 | "COMMIT_TIMESTAMP,COMMIT_SHA,COMMIT_MESSAGE,PYTHONPATH,BENCH_PATTERN", 114 | ] 115 | if flag: 116 | test_cmd.append(flag) 117 | print( 118 | 119 | subprocess.check_output( 120 | test_cmd, stderr=subprocess.STDOUT, env=env 121 | ).decode() 122 | ) 123 | output_files.append(output_file) 124 | return output_files 125 | 126 | 127 | def upload_benchmark(es_url, es_user, es_password, files, commit_info, tags): 128 | if "@" not in es_url and es_user: 129 | parts = urlparse(es_url) 130 | es_url = "%s://%s:%s@%s%s" % ( 131 | parts.scheme, 132 | es_user, 133 | es_password, 134 | parts.netloc, 135 | parts.path, 136 | ) 137 | es = elasticsearch.Elasticsearch([es_url]) 138 | result = [] 139 | for file in files: 140 | suite = pyperf.BenchmarkSuite.load(file) 141 | for bench in suite: 142 | ncalibration_runs = sum(run._is_calibration() for run in bench._runs) 143 | nrun = bench.get_nrun() 144 | meta = bench.get_metadata() 145 | meta["start_date"] = bench.get_dates()[0].isoformat(" ") 146 | if meta["unit"] == "second": 147 | meta["unit"] = "milliseconds" 148 | result_factor = 1000 149 | else: 150 | result_factor = 1 151 | if tags: 152 | meta["tags"] = tags 153 | full_name = meta.pop("name") 154 | class_name = full_name.rsplit(".", 1)[0] 155 | short_name = class_name.rsplit(".", 1)[1] 156 | output = { 157 | "_index": "benchmark-python", 158 | "@timestamp": meta.pop("timestamp"), 159 | "benchmark_class": class_name, 160 | "benchmark_short_name": short_name, 161 | "benchmark": full_name, 162 | "meta": meta, 163 | "runs": { 164 | "calibration": ncalibration_runs, 165 | "with_values": nrun - ncalibration_runs, 166 | "total": nrun, 167 | }, 168 | "warmups_per_run": bench._get_nwarmup(), 169 | "values_per_run": bench._get_nvalue_per_run(), 170 | "median": bench.median() * result_factor, 171 | "median_abs_dev": bench.median_abs_dev() * result_factor, 172 | "mean": bench.mean() * result_factor, 173 | "mean_std_dev": bench.stdev() * result_factor, 174 | "percentiles": {}, 175 | } 176 | for p in (0, 5, 25, 50, 75, 95, 99, 100): 177 | output["percentiles"]["%.1f" % p] = bench.percentile(p) * result_factor 178 | result.append(output) 179 | for b in result: 180 | es.index(body=b, index=b.pop("_index")) 181 | es.update( 182 | index="benchmark-py-commits", 183 | id=commit_info["sha"], 184 | body={ 185 | "doc": { 186 | "@timestamp": commit_info["@timestamp"], 187 | "shortref": commit_info["sha"][:8], 188 | "title": commit_info["title"], 189 | "body": commit_info["message"], 190 | "author": commit_info["author"], 191 | }, 192 | "doc_as_upsert": True, 193 | }, 194 | ) 195 | 196 | 197 | @click.command() 198 | @click.option( 199 | "--worktree", 200 | required=True, 201 | type=click.Path(), 202 | help="worktree of elastic-apm to run benchmarks in", 203 | ) 204 | @click.option( 205 | "--start-commit", 206 | default=None, 207 | help="first commit to benchmark. If left empty, current worktree state will be benchmarked", 208 | ) 209 | @click.option( 210 | "--end-commit", 211 | default=None, 212 | help="last commit to benchmark. If left empty, only start-commit will be benchmarked", 213 | ) 214 | @click.option("--clone-url", default=None, help="Git URL to clone") 215 | @click.option("--es-url", default=None, help="Elasticsearch URL") 216 | @click.option("--es-user", default=None, help="Elasticsearch User") 217 | @click.option( 218 | "--es-password", default=None, help="Elasticsearch Password", envvar="ES_PASSWORD" 219 | ) 220 | @click.option( 221 | "--delete-output-files/--no-delete-output-files", 222 | default=False, 223 | help="Delete benchmark files", 224 | ) 225 | @click.option( 226 | "--delete-repo/--no-delete-repo", default=False, help="Delete repo after run" 227 | ) 228 | @click.option( 229 | "--randomize/--no-randomize", default=True, help="Randomize order of commits" 230 | ) 231 | @click.option("--timing/--no-timing", default=True, help="Run timing benchmarks") 232 | @click.option( 233 | "--tracemalloc/--no-tracemalloc", default=True, help="Run tracemalloc benchmarks" 234 | ) 235 | @click.option( 236 | "--bench-pattern", 237 | default=None, 238 | help="An optional glob pattern to filter benchmarks by", 239 | ) 240 | @click.option( 241 | "--as-is", 242 | default=False, 243 | is_flag=True, 244 | help="Run benchmark in current workdir without checking out a commit", 245 | ) 246 | @click.option( 247 | "--tag", multiple=True, help="Specify tag as key=value. Can be used multiple times." 248 | ) 249 | @click.option( 250 | "--log-level", default="INFO", help="Log level", type=click.Choice(LOG_LEVELS.keys()) 251 | ) 252 | def run( 253 | worktree, 254 | start_commit, 255 | end_commit, 256 | clone_url, 257 | es_url, 258 | es_user, 259 | es_password, 260 | delete_output_files, 261 | delete_repo, 262 | randomize, 263 | timing, 264 | tracemalloc, 265 | bench_pattern, 266 | as_is, 267 | tag, 268 | log_level, 269 | ): 270 | logging.basicConfig(level=LOG_LEVELS[log_level]) 271 | if as_is and (start_commit or end_commit): 272 | raise click.ClickException( 273 | "--as-is can not be used with --start-commit and/or --end-commit" 274 | ) 275 | if clone_url: 276 | if not os.path.exists(worktree): 277 | subprocess.check_output(["git", "clone", clone_url, worktree]) 278 | if not as_is: 279 | subprocess.check_output( 280 | ["git", "fetch"], cwd=worktree, stderr=subprocess.STDOUT 281 | ) 282 | subprocess.check_output( 283 | ["git", "checkout", "main"], cwd=worktree, stderr=subprocess.STDOUT 284 | ) 285 | commits = get_commit_list(start_commit, end_commit, worktree) 286 | if tag: 287 | tags = {k: v for k, v in (item.split("=", 1) for item in tag)} 288 | else: 289 | tags = {} 290 | json_files = [] 291 | failed = [] 292 | if randomize: 293 | random.shuffle(commits) 294 | for i, commit in enumerate(commits): 295 | if len(commits) > 1: 296 | print( 297 | "Running bench for commit {} ({} of {})".format( 298 | commit["sha"][:8], i + 1, len(commits) 299 | ) 300 | ) 301 | try: 302 | files = run_benchmark( 303 | commit, worktree, timing, tracemalloc, bench_pattern, as_is 304 | ) 305 | if es_url: 306 | print("Uploading bench for commit {}".format(commit["sha"][:8])) 307 | upload_benchmark(es_url, es_user, es_password, files, commit, tags) 308 | json_files.extend(files) 309 | except subprocess.CalledProcessError as exc: 310 | failed.append(commit["sha"]) 311 | logger.error(f"Commit {commit['sha']} failed. Output of runbench.py: \n{exc.output.decode()}") 312 | except Exception: 313 | failed.append(commit["sha"]) 314 | logger.exception(f"Commit {commit['sha']} failed") 315 | if delete_repo: 316 | shutil.rmtree(worktree) 317 | if delete_output_files: 318 | for file in json_files: 319 | os.unlink(file) 320 | if failed: 321 | print("Failed commits: \n") 322 | for commit in failed: 323 | print(commit) 324 | print() 325 | 326 | 327 | if __name__ == "__main__": 328 | run() 329 | -------------------------------------------------------------------------------- /fixtures/lines.txt: -------------------------------------------------------------------------------- 1 | kGNvYwZElneBeGOlimQpXdMdAAHiidPHfvtXuBqsHnflwbU 2 | eCKGPZKUxgjcXNQfTyKyVneZsBqsJrzCyQLUAlYyzhdMuVYGvQzYgGhBpCfUfCNWg 3 | xWcWqrmlcHsqQtQzkAOIldBehRJejBZqjYwGOqjCEeZr 4 | kjDRqnxzbipCMTLvuLzZiAXagLRQMKdcvLJXvzyRbmyvajkoKeRBDBiOcOkNyjqnWsMRqUuXGHK 5 | wVbPkOGhiyKTSKufkFLouWkyReKgCaZVthKzzgXDAwSSiqCzrvz 6 | sZaZhsdIjkERkMVspbogzsjoCkXwMjBhOTclQPAuXshZsgrlDM 7 | NIZFfCffjBKYK 8 | NcXzktgHGtYpZzrzaPiYUChKfrljwCNQxSPiImQnobJrwjfJsHyO 9 | ifeebuHDxvIqthibbwZeXJNyDKSHxmapbSxdswTqLZJxqcIWcvggoWaVNVECAFSsKTpeSWAKwr 10 | yXjipeMORPXFpmuqxyceMsoTDDlARroobKzxAxnxwoNy 11 | YLtBftGFcCKPBFUuywyqyJSfbuXTmftXrLIekVvjuRHUVdGgk 12 | nYrHbRASegNXslqhDDtzHMuffErknwQJUzXggsTodseJbLdyIt 13 | VQkFpygpyhDQnKyYHrQgzOnnMRXbQXrZhgJJtTPs 14 | wkWaSXRaoQHjpdnuqVRecDnpJRklimOrdLsrXxGWIewtEbUKRhYFkoTGIfDVKCQSTnDh 15 | DQPLfYwiGJjDQjWdYryvGnrEsAFQKBZAUQJQJVEEgeHtL 16 | ZzwWrsuTfXpHXaLyMIqNJIjFfdoqcXmGpdVMudxeAPmakkrYnQlMqClrtNYEpniFzeBpvnmcBDM 17 | YkitNkjYudaiEqTnlDoWnlnDqsytSogDcbrIkUAlYanchTzKDZPmXeUARUEcOLMBgzjPxGbniBxsnFl 18 | TMqlMSDOhaDtFPIfGrbYmLiKzZDIiEDAOtDrNfybNqhcNGrFqiGTScbrjVsyE 19 | eKUvG 20 | YjTndeWCoCEpaSDBcpxddWvxDiBTriPOyslgBlBMmyJggrFqQHlsGPKQUvD 21 | JjF 22 | fyOwSWWSeFxGgqPNxuOnNPuUqpoPsRJuhrVrgF 23 | tAjxxsVLwBlPGZdrVcYfACKIhfYnSUmYva 24 | vgldZmsIctOSBNiYlYiM 25 | KLtgiVuAhHYoejujJuGZSNhlvMarkVhYzNhUWxYTRSUfBEgCqvrROmPzk 26 | OBKnbYMkzXNCjcsCGcIJpgdnmGKKQx 27 | gvHXslIWYAyjmrepxQZAeWSeyGDO 28 | higSPjOAkLOxsPinVUJFGlgQarOcBpFMaJTJBGOhstWkZyEJbXNWBqvsPiKxEuShyPqPzMIHaZrCG 29 | ClWxCyNpWMCldtDQZh 30 | SszUJKrXovreANFwavrfUSzJTxclMOkmjSHYqRNIppGmqSYUMATkvJUfeoPnnvurW 31 | SeOEwljNeLkUAhxDeABXviMqhUVXhhJjbkRnmMpYszQnjTiELpZLLjmKKhghboPAqjK 32 | qAnDquMKzuUcSARThnKElUIhKWwpbzibxnmEwXLLzssW 33 | KzxouPpUNeAs 34 | ogZUGpCxQSGRIeVdnxImzILxYTZQImPghryqfSYBJrgZRxbFvjkgbqZEBAPZYInP 35 | ePRETn 36 | MJZtZyKtEKeAhaeSZjNuXkvWldKJ 37 | luSJQonVrqtmGe 38 | vvsTVZFLUnsciJFqrMgTfGPPtRSIslDVhyaieayQeqrvTtkvGjvYIwGxKYbEubZcumMhYIWTTMGOOLD 39 | yWggRDOgYRdmsfTbxb 40 | WktNlkfIBjZFrJyfZNORFaGq 41 | wCVwoHdBRwUcHNWqQoRyPzt 42 | oHcgomrKAkWdfkAgnWdtfrjJjubEBpxtEkdmVS 43 | psFHYoZLmhkXZpUrNNjsFSunLe 44 | dKdUksevAiAOZMrVbXUGaFUcKxutwHwxCRKBHuwxaCa 45 | ymhcfPfBYgwgNaCWztgCTgDraabzGauiobaMLEWHzRZDAuhEORvcUhI 46 | QlWfvgnPbVuWamZxnrxvUkDBLaiexCGGRmyALPKTdphQuXTAjwKfSaGDApHH 47 | syTxasvWkedBFJVGZtaOGLQlMuNFIuEAGDphdJVpiOxgvnYNalwfRfTXSaUroAqUUAJaSWWeJJQDOWEh 48 | QSTWrDERYaruBOKmtCYEkRGfDlZfaIWvVMIfGUyHPGqHiBhIjyxwsBrwOGcpvdhpNlvQlqzyFQWtZT 49 | CrAidVnKrbJbvXyserZHUIngxUVSodAHadhArktIDMDlArzNeXTUMVeAFJjMQkwGfyzutPa 50 | ERBwEmEhKXebSyiINIxcvcdORVWNukSXixnpAHZtJmuDMniyDBM 51 | uSrvOzlFTNFMiJbenjJyGBtB 52 | PcmlUmIVPfSwdyXLenaKVfkMfVKUSkMacpnKqxjdAPajKMqESFYiRbSvU 53 | SNDTjUwyLonWgzanNbOYhlGgoZEvRxJtHYx 54 | bNorSqCPsYFVfyzmtWalxJBHnRTMWkUi 55 | fjOugLxyuZNMnBYfycTwOkaxKkJVsIKKGsDxdOsuzZxVgXBLWnQqAVFpHrx 56 | CpqnimRWkcFWzfcGeaXDseOOoGLICwbHYwkTxImHbtWprGMbBvbKxbCkaja 57 | cZajEbsrKCJYiFMYYFmpShWfvyTOtbFIOFtvqQXNgSjJknrwnjkdGwYEWOyGvucTnpArufkXyu 58 | JFVmNJEGGGtznLEhfLwkjRzCIK 59 | SXpuBwDOLDuysiFWBeuhsYlSaFUKxUrHmdvbANsgbBYv 60 | YafCgbVXdhicnxgLjthJBuKtxpSveBGZzZSGPKtQRcyDNEvygrnSn 61 | IMcTjWhDZvfkSpXHKiOsbQyNVvqtavJdykcXzvWDxvmHk 62 | FOcDkKTMxfXCrPUBZcUAQZneaTibl 63 | k 64 | rEBVHGwdNhwkBqVVhfbbUEZuHsKnymmbhfiQBeetpnLjWPvngGXPstoclYdiKocfpdsZVdvRwzWlQ 65 | ZUkKPemHTAWtPafdwgmRRwWSxTKPwpipXUMQFbaI 66 | lSLAsgUp 67 | xRzqzyNIXviMouRrmegypwYTLXLXrLBldcwBaVRjxQkXDwdxIxAowMRFGUdFemQlccQGSjYbhNlCLp 68 | CaBpatgyhXCEKBBirjswxmPqTlN 69 | lYDhetjeZInHfqvTNPKdrCKxfsayvKvzZMkjYDeNdtNXMcBVttAWlRsDTpWMcjDnroSqdRNpmMRSze 70 | eNaYczf 71 | fPDDIpimNps 72 | HV 73 | gtVLHXxKENVRHdlELYPJssKZiHkQlpfFDYOmjwoSJDMpOCyofqhcKiElnmopxSdQXEEeB 74 | KZinEFcMeJtFvRFxfWLJujnkZJiRkERskVyoExSznsMHasZfEBFoluXYFHIg 75 | LZOGYuJlEBSFJawUtaPyiONLmoHMqtmXzPOkbjF 76 | iFxyRkQFEqaoVBkGvthwgUiXcdObiFHLaeY 77 | mztLxrSNtJfi 78 | RkqvNzEtmxjkjA 79 | esoZxVarcbEOdEdiJVrnVCoHhqnseCx 80 | lAVMvOhgODOyFfeEoeckuVqVprXPnSCfiIKQQkXGbRxjenXNOmePhmgbsNXzVcQnMadmSuUNGRyCk 81 | adqtcMVoniBHmPlGBzIVbTTtilovNaNKnHMCssCczQAhkJcOkjSRuoIPpaLTcFai 82 | EFHDXfWvLNqlJkIuFnIYwwzZfnglzhiGjFOoOZEXKCA 83 | sNyHtPsIYoYNvFWkWsQLLynzCzourLRIWCbAtZVWLmuScJuEnjXVoeDMlpKekROZFxu 84 | ikKSmbhywkOZTWuctFHVhrFwEvtNVXgLwfqItYBgVuigCZnRwdpoHXbJcAICuIposcEGSRX 85 | rmKBnPpvlcpgvJupQTvINwXACTZWgbtyHDClRRCLgKGzONNvXwyDSrKbFHaNralchkqoxmnUlDovgpzM 86 | InwUIfpSQlOEReTpNOeYgLYtbjnvKSQgWgZyLOJzzFrNvfSBQ 87 | caEAkrNnVfyVVCehSFksAydZBsyeJIxWlNwZrkHpbWnCvDHidgNPkrUMXMfMNDPDZjUGzFaCLq 88 | dniOilZPbHeIlyqLSCBHBuXsXYKJvEvzukobVNCyVlUaacuMiSABqkvAWpaBUJfqiylfZsXJc 89 | iMyWnXRaJZkNTUEUtJOafhtmZnjeeICyHAVuIpWtFqOVnUBRr 90 | LqkXvFNwkdtvpNmTajedhNTqFTkLyzrQhANvO 91 | paDYtLBwKJOUSNEyNptxDQsTeql 92 | wDaswzSqXFoLglZCLgWqsavAwTjDxuZWQmjFgXBmIgjooJFaLXMoBuQ 93 | RZtdmRFRRyeyMtnqQGIzCHUMnuLabUIwkmYlqQUeqENzrezPJwz 94 | IcXwYCMIHBipUducjEEbyDIUNLUtrIqFmZunYpdBqpwsjZEMKTC 95 | erzaIirqLHtfWPFuWMkAinpzKLVnajlHZk 96 | HcnlZJjxUNcsfDvugaNpxlEns 97 | WsnvVqnqNKwecrTrsmDzkZkHQXTxcWkPuwhtDGUzkQkg 98 | hCkoEgvbeeqwGRPEjRy 99 | SJDithxDHcXTFYDfVlOnoVrspfP 100 | eIKdkivxESkdhqvFkXfevsoZBEpEjlqQeLArC 101 | roYgZwxgfUXpkADPnSKyqfYAZXaQIB 102 | UjHI 103 | cvJwcGiLeTzXfHjGKNObHjxroTZvclDPuRCgoRgXLHuLIiTnrATtzAvjIVqAXvtjsBSxua 104 | yPXlZc 105 | hWIrJBLJQKQEWDTaSrpVZVWRRauiuoCmmdMkLIkCsJfvuxjcOJIvXmtsJXbHGHWvgUFKksyn 106 | YCSvtyUbuEfrfXKLbwAugwJliqHJLkvxKXPeLStKYFrseHpebkBzOnuDcVchNMONvXZdOzymTvtBlpzJq 107 | catMznmkXXUDToHCtLNmLPcNgZTRxCDlZWmqbWkVNbIimvBq 108 | chfMErdisSLqvAsRucaLXyToYeudmNjzLgNHZdbsBkxjeQUcIQEuqH 109 | dUtoiGwtWOpDtjfffXA 110 | kWSIbTfribVTNcAEKxKNUHLIIrSXeuvG 111 | AVnxoMRACmpvYtWGGsaSNBmPHnuXPohYQcdMAHmHkLahhxvLKVQWeqZKSrhz 112 | ZxZBIbpLRDOojHisWKfEYGYdX 113 | YnMvxqCAwnpzQBWVANULgwjMypceJAWaOyZeRqfZAZDYGNR 114 | mLQIqEBpWoSeNZrFWmrXiUIPOhmKCAONQRVWiToGJSHHZMYUPvNn 115 | leRXBzHJah 116 | kPWArCzyxMszYdxnsbAiagAFnQinvIpWYhWnVOuCJMlKZanTCoCDI 117 | fRMISptoWnDiWNKOyPaqsOwmSRnwBCSzkOslYaCmRytlVhyhUDJGuoinZbWfNEqQGUKMqEfErsFuu 118 | OZGwlapnxYRJDXuEwktgQYDtpTajSgOaVMpmovJqkSAXNfMVQLAoLEerZjcWfLtPRQevbi 119 | PiYeFYiWwcBWpTZOmQqvghesclWDDOqthHOrHsRMCPyMcetRpiLHtTGwDvSoKpsc 120 | alWccfx 121 | pfHjZco 122 | JJqnFZhyWDlnSx 123 | AJViWvPdQrEeOAkBdNkyjuXxeKbMyzMJHYTpFbKNNgcPVRKdxkJuHWxUKExooMPOPaoyYW 124 | knGyzKnZXhhBRwfqulTCGfoOMdMNKDzHikXzcQuwIjNKUKUryuOLCifBv 125 | qwWAsqXw 126 | YSTqscoXUsZTlbw 127 | kLkBVhbtjTycyKuKHkgUUwvEafYmfGfebKwbgbHWMrXMOZAmSSWSDyWXRLtWuQ 128 | JTKJdyBgSmqDOlfyLboCeobBBRETExagJszZyACOsjEXHeW 129 | PWKFCgcJxhtoLiHjMgkwpKPKihuMsbDAdioqOAfUSdkhtDCJwhQ 130 | qHSWhCuCuwQdBbEq 131 | pnDFgsfhWGZOJKQXNlKNCTYXAahFZtTmrHOAbQiildTSyLIgdynZzTKfRmUyqEvVkSG 132 | jeNCsIGAlmQbeYDhUNPESZIKpvalUaIMBYOOFwOkYdiUdWTgtgnQrIZf 133 | sppZu 134 | FWPyzmiVxOvToAvG 135 | cTJPc 136 | EeblM 137 | WoyXeovRMiHOavGhzfHDUrxEPxPJxDKNLLvgrPIiKANgksxEZqsGlZBleKFbOBQT 138 | slVOgZaOgwcuLdS 139 | seBSqHQQmFpQOAvAJ 140 | FXERcONKT 141 | etwmycayqQKFYgOIJMfLbwliVhnmaGRuGwQNGcFHYGVLZFnEpwKjpFJf 142 | 143 | hfbYYQnCNnKxMAUizwMnxXAGHdNrYeNSkKXcEvkHD 144 | dcoRh 145 | hzzydWgbZTJAkYqp 146 | YskTTdHadbECRAtOLlgPFOwT 147 | vyoobtedyraQQqzoErwvOVzmIZOJqswSSCjqlOSkJgRZqP 148 | SplPVsetONYqUusXIIpzVGpnZVtHvgkOXDryKtUS 149 | ptBObkkXCfDjMtjFbrLapSkmYkBZepRsCOvNcchVRWUfhDUakhxMZezrJiOBIb 150 | ATWcNLusbp 151 | rCsZNSsjCWEBKFcqzXplbMfbMGmJzDbVSYQo 152 | PJbkVcBeHHrMNJVthPtjutRXCvQLGRhpTGMsUOWKOI 153 | qDScqmePBhJAhCBxccR 154 | bZImGuHihQXUFDgUdTiyJTLRNMJRaUtRxFkVwsFqUTVLOmlOKYerCDXlOVYmCqWNpbUTxwSHsFc 155 | BFNxJzBLecMgqiaEF 156 | HBKczDvsLitdm 157 | iQpDqzfRJUMnzbRXAimf 158 | YgOpwOtHImeQaNSaLyGpyPoHWVEVDyaEVaNNQCizBVQJRQEqTRJkutQlIvIOW 159 | gciTizzPJXcoKvWzcLsofGbvzkzgJuRPOTBdJluSyFervSeSXaDHMgqgHvznnPMd 160 | vVIgObzrxOMfFfpLSmfqqhpbJKRPNZIU 161 | NYzxNIjQbAtTVGVuZdRLVfZBKXgkEGn 162 | QEMFBJCCQVXwFchrrSzuPCjsxgBMcExexuwPjBfCKydAaLqmfSJHRbFeWmkiwqNVlHhLzke 163 | 164 | ndcOavSceUWRYqjIDcjngOAtYTroqpLjKDqkVUccJCiqsBjOZTARxmNCuTaWzAhgP 165 | qMqIIdLdqEtPwZeHEUtDqcjMgIBjcNpOsKhRcUFbkUvaqpsAbPFygIfKlPurSdQLnYzrDaTJtcVIVQgBp 166 | VTLVItqauDGvRnAgirFWbxJQjXRbZpPhtFQaCjUQiBT 167 | RVglBcyDThncmADOXguVmpmaVxVJyOwcbJFKRmEAxmNoZLKxNAfWYTUlcGYHeXzqOTQJOFpJbjflCulEW 168 | fZPEwTLoUMmpuCLcbnWXxQkgxZjIYuxGgODgDBlsUAwTMAfNdDXNHICowAFPqSJyioTsghCuQDuPbs 169 | qFmFABikOjdtICQqnuGlZt 170 | QTzlVpsfypcHHWfAMGuJ 171 | fpLTNqkPLbaWfJPzeuuVllyprhdogvmCaFirgLUANiTtKxZPvdtHxLAUfhFW 172 | DDnmnlZQsLFTsTS 173 | BPVUlUoRzSlPlscFAryPANatGuBeJeXGwtzQqgrEnfqmJGAauEZwnMEgxPN 174 | vGaDNlyEDocuMLwxnhUaEyREfiLzfRrCVOvvhpQLyrYv 175 | MTpMUTpbqVAfAix 176 | OBaSvbBWZolysVBxHxOQuYRIYvAYRkfSsNNcWLnGCGUSS 177 | SmVgmffDhKmblSuveEtMJjnmdLJkjxwvImfLjUXdiBRGWBaxYbjBMVogztfdwrrrHRleIkDvuDtMcIai 178 | UygrJmRnNvUUcU 179 | kvMpJlNTYFfrVwScsGvYSmiYOwrwkdtmuJHmxOiysMyyrFjwjSJKDlEJImpgeGqHnGYkIfsTyTof 180 | keICXWCRvRjRgKgR 181 | RKsqnsmsBQPhawQivAjIHnBbgJHHarxaONeoWpwiBHVSOHWsouNgIRWtkWQJbAmwJZCuxwdJ 182 | ZVgVCPBLCdNndjwMxBCcJUYIYmsEMAkMtXNuEkoSNY 183 | XlDCaFehBczrPjQzGjNHdwJEUSFGwJcReOqnfvnk 184 | xFGjmEwsyaiwMWSppzXYoFpkZojnzeLtWyzLVlrNhmWeBLwIAMrOjqZMooZEAXibzDrZI 185 | tyGxVpHMcSpeUOGgIfIoiIXCuobbzWBKtPIPuqNdYbn 186 | XcenvlhwdbnXNhYEwZmLaFUDq 187 | WfmPjjMOcLaoJObrpflsBMpBtSDSUpmHAHNDBmupyrPdUWBzWXsf 188 | UVzJRiIQJdAYuTJjfiqUUuWYCthEaDFygbzzUGvNlWXkUotPPrNmPn 189 | 190 | ZRNIdDjnlYyfuAKKmNWRfjiGCqn 191 | rJKOQjOeqLNDxdDLpOkpgSnCJYCMNKmdLooETNECpXJqRtBK 192 | tmrbfrLjJbHNKNmdERvQCGsJMqdKHezxJZmLanxlZBvcLCXyKuxZQQ 193 | ZHFTMpMLAJtcLqvhKLkALGVYiuEPcpNjzjEqNGkEhfyxNmjjtuGm 194 | AgNZSUWZVvU 195 | cTfdFNokn 196 | rFPDMenLGDoObjrRPadCoqZFEICJipGSjoGTsf 197 | ZenlmHKhPIaKZtiOUnYrtHvaJLLrubMEAWKIeuyoDIkndSHKpMapiBylkHwxPzlFAxPbAuU 198 | hRJCLPTGZzAxyoePspCvjONAjarUSiNflQqrpotAiziBaufBSULMGkZ 199 | zsFDTibUCkQsftqDXnBniLEaGEYipavfKFvuwhIdxkqlbJkAjVJaYJZobMdOunvluWuqKKLLKC 200 | kNbHfjrjOWhdeWadoxalazdrzDoqflLZyzGPTvejeBVQlOggIDnPDesIOKoDIiew 201 | SXmFjzvgPxtrsbHZetQOirtFKYrTbULIuAtnhLOvCNNbCgwopDRGGwRjFWAnLbSFx 202 | SvjxwewqtpEHtusnMimwDvnnboYYEgzsdAbyvTVzYguQsnOPbnsbFpVFPYYbTiEKiPIArdzDZxBjkFmSF 203 | xiTIWnYJUtVrBhdHvKBfpwFsyZCOzvHlxhaIhVrpk 204 | YFYMotEDjOLhNHTqpzygBELkAJdlGvwJTjCgWsmuolKiFofpjpxAvvnjtcntWrbYEVsewhCruwhuR 205 | VLslLsDHFogEChcyfOTlb 206 | kRlLJkQvMGDLIaKiLfrFnG 207 | CaTsMM 208 | nSXlPnoXkfYunfPssPQJWKAmFOBRSFQhZKShUXAkliwwYQkRpEyShxXLDZyHGtcfbgLyfqcTwNnNhbfN 209 | pXLnBWdyCaXut 210 | xyQniwDpnRPVDVPQPaxWZgMDnOAeCYzpLheqViVpAJOVdh 211 | IzYVidNEsdruAbkDmKjWLbzsBnaOxpauPZdFcjinmklirixFXCDvefuHrJCCDlscZ 212 | zQepPxIakJPcVKEowtSgpPTsBWcaZnMaiE 213 | ZNcHUEUFLNHvuxVpBqrENlZXmQcKXA 214 | tNLMVYHpkScNHJhdHcAXNuzDpNSgnelWphRaXptUiemfUywscieAVXDHeHeamPqZVAp 215 | tqAJqwwBjwVBXVERrepjDkNzHtlhstkufroRxpwqZRriraChMpdiaAhoGw 216 | OJiUsxFpOHeImDyWgULheNfSvvdrLnYjLdSjQZUfnhdaS 217 | WZuqgqGXBtTcaMhpVHPLoPaecvCtquNoHMAohLc 218 | FxstpjUGbDXcyyggGvoakebFyvuEuTZuuijVBkifBAmewcfVCLqObyOCAirMtUh 219 | SnDqqvMDaPaC 220 | XBfaeKuNuQhvIJqNF 221 | HStclGeuAZvoKopmxOIEGAndUOLexffcJtcbjMJrgojaGZwKdfwrddCzCexKdNytb 222 | enksjPIcVxEpPsBhOFfWEaRNIIQmbRPCDXtEWFqSkZrkRhGjvkCFOBeyMXWKFV 223 | hPutTGcqthWtxwOdbpDwnCdhUSPDcPbVSDzvss 224 | T 225 | PZiWsE 226 | KbagSLXMmdyQmDDCJNRUdyxKhkHxqJIYDAyP 227 | aeBSGoxAHVcveucihfcTozKokndvSmGbFhghiYAVmOHHTXEZNZHGMihW 228 | zqOaRqdfvr 229 | GmStdoxYpBGuEZzSNfLcSCbCrlkJjsPxXYmcHZxHhijdEoEKsDnFKHLmfstwLxBDbFlCK 230 | lSgWCGaeUclNaZVoQrhHWIMhgENRHPcYQsTtfRtTKKBnqwTccspEtKtwcvCYozdtG 231 | cNBXlzPFHRCbqvSU 232 | fmv 233 | RUSflyoEooJwDIzFiLLKZASXYQRLVAWHgYFwlYeTaFLujoDIMLQB 234 | FVCsyCtVlnjJrhsSvUunAxrlY 235 | CTopkFIZVDXzCOzKOgBFCSVxltdROlOXKKzEVTlypdOvxrkfOmBMuiZeUMwgsyIqVhakIS 236 | UlLRHc 237 | xHUZJJfAZjupdPDngbgEwuZCsVlIJcbnMEBzeEJnBbEffADtWQtr 238 | sBQEnRBbslMXk 239 | crVxcWjKiBKkidqtcrSyQaJfeFAisKfZaMwfpjcOcMwAAspAXpVFvFQJEluKGYosBXOYqNpt 240 | sJQonlTMBwxzbNatgSpoONpEgZgKriwaFjZCQLRlgacKuUMxQyoFiwWivLuJDtNwyeEgDjaiMTYzFUSu 241 | 242 | NHEPSlZEFiFBLvwGhleytiCOJpdwsavSprMqPpD 243 | AQRnpoOkRktgSjubhpSRUbNDOoAlhOLQfYljjHuzjAhbBavnKvYlnyDsgNILkjho 244 | kxvfctrBqvut 245 | ADBEPSqAUbfsWqSKahqSHxvaJbwXfTarazBmSwnSTpEqWziBOjWDiBXRtIbG 246 | zeILNFnXVivXSOPBZAyaXxLHpuMTqiljEVSNSzTLAscKMgrWIfIFjKjK 247 | WRRAgGIJUNVJoTQrCImRHqeegbhrAiBPkFThfnjTQXdJCvxBncFYB 248 | sbitNIqrrQGjrigwSpPswoiCAeFzhcZWXKYQSHkalIiUEXqbGunSiPLpjAZjcrjYdpnWNqZPThRPXYu 249 | tPFzuV 250 | PUnRZXAv 251 | BJCgoUDZEOeqJfdWkVZvBTyFFUUWmdxGviyGkDjjoEFCUNkJsYnYjIEXeflhTQisZRpzl 252 | PKNTHrdGVIDtAPvgHSJuEyhzLbGaauRASkD 253 | ZKJviBhSJkmuWKvrTsZw 254 | XBlFpzADlXlyBNYAgv 255 | cFSjYgUlnzFhrbBcjaVYCzKmkTAWSEQzlrfaANzddnsdTyWK 256 | vAxVjtgByBhl 257 | lRlYkEBjlktKeYjQRelfXQGMbNEnuXAFTDwaodGcqFHfIv 258 | sghyJjMzOWtGtmuIiQdEmezMsJHiBpeDEhpJXWSUEuJCOPWqtC 259 | VzsYyBfvQBLITnDkIXT 260 | KjDaVuQAT 261 | DRgEUTOkUGkwfUpulxDghzAKLtxDqzytyPRenfshttfpaYVYcjbSNfVcCxWYXQGhBCmtaBmCLhtbiGE 262 | mKblDCEqpL 263 | PfdYJwaEJLoiuQeTXeVJAJANpZwIjSAobAkYizdyWh 264 | wEYBvYdquqTlJvVtgfkCPpQIvEEFXwsCX 265 | nTuHGKbmKFBLpReycGRHmoBlsYtbHUFWIVUeuNcmatZdyKz 266 | cMaatEszzKxIroWuzbQ 267 | AQIvxwYqNbOVuaJuTdsbfkMCyAXEaGiSPfGArJpocrlhngXxMLBUfDAgXNlaLMzeOQPxgrzLA 268 | dalofqFVkJAzyhBDVZrXkDHojxiIKVUmBfr 269 | TfQtOkSvxYvufDPsimBENcpAYVVZFcUkWeajMyjKZAmJCoNcwrJnFzWoHTBlx 270 | JWEghFhOKphqSmJHZaJGYEdHQHGPNKgMfvgevEVMxfSQcyHkgNcQXXoQtqTDBTCaEReEubFRTErpiI 271 | XYDSpOhXDTwJjGfRPJrVoIgYqupIqKRjNiTeNSzgLzDJqXZ 272 | rJiYLLOHRiqQAfiHaLGaDlbwYckPJGzTTeUhBKTgjPDgSxNGNRHyeafVzGOcl 273 | fdVqUhGLKzVvXkILRiwnqZAnMYYsgYAylelVwpanecxgsCPXYOBLZud 274 | QNEwBXcyOIoUeJNVhaDwAkHiAWhsECHPWkoh 275 | vOMokTLRWdCdEOn 276 | JInLCZpOvyF 277 | VEyglVunNOQNfYfFCFsOetWeFiAyjRHxHddLRrUVQIaeVIaKnskpEOjCjLTiLMukusOxjhQRxgq 278 | bGWHiOFezpiJusfJBYXZwhfquAMWHJQqFMsIayfTRwgvbClwABaZkfOVsTjImftZdHp 279 | VyQsnkPjjBsjdjiWGpxrTtAz 280 | MlxUrouhwwAIpqiGHYJchHZTCHAJheYxuotaMacStlhElMrGNkcJvRqCiZhKyXvd 281 | QCSomxuROFGxzQTIOYEMHeLDJBSXaoFcECwueacAUVsbIo 282 | eLtvhzCRfixhHzWbCBMWGJcNuzjHtVcDfCWjIpNJOZDcIVCxijzrRezmSwEVadDjPtXUkfQtAreLafs 283 | GMAjARXMQwuhTYuQfWQLtALIvJVzoWzrWCVpjXvtIqEKQDxWPSKWmCkhQPNTveECCFpPgx 284 | utAkOVqrYbYqcUqmpaciBcpIJJQsELTElkvHjKeqpGkQhuFhXNvoOLsZoaKmrTfbapKQg 285 | LoIAmAdUvHXnLZNUGGY 286 | WNuKdafUwY 287 | GeMSvAWUFnRwtPzRSUeSDapviCtyGLXdaayMsrcIWypTiDDpqVqU 288 | ASqHxryFRtHBYeqXzELLoAivWTBXwsImudTgN 289 | zcJSpBGFDLdtJTPhpaLtJEAxnTjRvoifuQLHhcDHJLrjcgIByBRTDoFBvCthcpHnJCucrflGHGIr 290 | ofUfmqlEktqvRfxfuencAwjgWnZKCto 291 | NvkoiyqpEl 292 | FMnYxCTFeubWQOAkjKUmfNCLReIrVhXae 293 | LicdaWBJtRoYeKQERKORXMgWXSBJYnZNPEWPlbUD 294 | VzZxbtSUDlnLBxOYqBmUdJLW 295 | cXntqMztcnTUpsrpGGSTXomONGHiXuWCnktbMgsnJjNMUmEAKpvQXGuXScOWsLzIc 296 | CqTMLbqLyZRUmXAqniMat 297 | KuqKmZVwCYXoloTXpxvGgUGykuyFlxRIcFDWseVgxyFbpJtfdQagrKMyxACtvsCsFJNnqeGdDPtnhjdhqq 298 | FELZBzXVhRQanLQUCZBiFktGPPycXdgNJhCNlYixHaIEAMvCnBwSBDzyumtdEdTyNVnvHKPyM 299 | whXztRP 300 | JPPuQpCUaPvdstwwuPmP 301 | 302 | BljfsOORgkGsRtNfQxUBghcIeXnwTxBMSocfqnQECFTVhkWyEPqwHZvfduYlIieAsgqqJNg 303 | BJaVSddyFGOLThJGIOPfoTmKPISwJtInDnaYtccoSvbAddDbNtG 304 | hLxZXmCRCppeLmhBYoPGKYsxsDGqvQTqDnIoVFgpUVkzudxEmNieigxpGqeUllA 305 | gNIzLKNzizVRYpTyPXJmYghiDohsPDCbcmSKoUoQIsnEEPOoqQYmwTJGiuFWypn 306 | egvkCGZNBCYbLJxPtIquCRgUaZqZBRobZhtDrTQoxwlUwYPsdZWSnsxxoB 307 | AgQUiIaRnXFeOtenmeCtHbcIYxpaYTViSrSEUtODixE 308 | ZfEvTuPJmvcumJjUgylshZmydqxnKmGYgKjrYfQFo 309 | eDDEzCywPTtsqvshLsmKpXsIHjLmcdZeqcSaxfEFfYolnKeOipLRWo 310 | icotmcvEFwvJcotdsehRWbniGtWwzcNWdueGyz 311 | dnEkusnXKagLqibLvwPyMIGDzejVJBBQhtDy 312 | bBCrwLkvqFKUStrAFLKhlqwspgvfvREMhnERwXZNvjbRzwi 313 | yRYnxRojqpsYBqPxKCyjpIw 314 | NRWZMzpWBaJcDrhxvdSJdFzaLAUqHJOcUHR 315 | sFDvccwSDudFxDS 316 | QxwlGCBLSfKDYzNXrxDQdcCAlamNUuRmLouforXVxXA 317 | FkykVdNVYNLCgDDUPIdctgZvdjopKRPUQawnNhfswiCcZhabCOCeNTHeE 318 | PLQmwqKiTGSkfHkIXhYsFOtvptkcedvzMuIwpQQUeryTTT 319 | hiVTbuDnsZqRfxk 320 | TvkaUutqL 321 | paSLaJHggFIzNgBqfOOVjZuMZkReiXFPvCmWUxRuMyXcntqevlaRONBPGsMDShLAv 322 | nBqQlHEcTCNECVUdbPijmorSRiuCEtBZmhQzROMRzeIFSSppasBnxXFqSKVpdDQEX 323 | anGJeiZwjxUItNMMOsSjedrAinLjHJyabQVYfmCmyuOcSSoYnetKFYWIqnmRWIG 324 | iNzLgepJtJqbgADXuHJySheUTKOQSxKNSnmkPmWfnARGXrWAZ 325 | ejngkC 326 | fGNHLIYbJKoVxCvnI 327 | OJWtZAfEubuudFxYYqFergKtUgTLzzXEqrrNSCNkkrZAIkctMtUlNvIIBHoRTvDnyZdxfgaMFhY 328 | dArNvFrPXiimTVBsJRUlvhe 329 | YghRpAeHAkyLpvGzsIWjZROWyznQjfojR 330 | tUQNzUaNGitZzVXLli 331 | iNIHuqMYESgeYzYcUoZhiZGhWx 332 | YdCwTJLrpwUGADRFwJiDMpaOPuvaXyvzzAkbQMQSEjTFqgSLQZJPyQpxVTeJNotrl 333 | ivgCuzcwryadpXgcyRxYrvILmouMYDzrBQvRVFSraecR 334 | owiQjrRNgTcxeaFUwptSZKPbVWsIZSEVvZbGorlHpgmlOQljAPWsAsiBeRqQMArcj 335 | kixCwHIDfnJnwAiKEeAAwNbkXUZMUMQtBjN 336 | GOwqOyKlqFhSCVWyYTVNwUJQFMPwwluptHwISxpHtKXMjIwcNfvDBar 337 | MaqLxMHDBNzHlaxCRqatIsIcUyjhgdDkMoDanOwIisCLhHfQCfTPRjJKEvvDwNvItKNyWapxFBffeDlUSC 338 | cFsgoIxmPCCSTsxETnOJeYgxioAgkYSbiChSuUf 339 | PCywEZGshPJBMVGWOtIgDqkfwlTPmhKEthIIuYXAHEGgANjKFXKiCHgYaqCVoKJyOoMsEjbbRD 340 | YAypDcKwIKLOKpUeOElKB 341 | Qt 342 | cLNoqkTZCjxVutFTZShgbHBxntySquKYQpYvTrpyRPJH 343 | nmXCtUqJsD 344 | HZ 345 | YTiBcmmFxBBaAuWZXzsmDzaYHKj 346 | sKRTuxLDRrzmpBGdodYudlGxxiksGDVwDnUfhZPKenUmZroQBIywCkWjJZ 347 | ccZSRNeWsMQiFdhrTbgsmssPdqvaIwrNpbaJprHxSGugzplOOeEyFQPFrtuEDyvqeEz 348 | An 349 | rJCnzylURpsXuRSJ 350 | JkoSMxbkVXXEofztSqnSBAXxuFFQmnAayCyJjjVEUrOu 351 | wLJDiMNVZ 352 | guHQlsXtVxuTwINrpXfJSitdLBJUjPfbPymWtPWCsXguCQPJnJkcTCHNlyscOotUsUxqJKzmOeAgX 353 | BSYbjbDdKexCwuVdSCgKwBnCfYBEatEQwHTxPCzJTNFftGSgjstjwL 354 | NIT 355 | TQopPOtjHrXhVIxbLImqWUHVQbkdnSxnzrBapuCuMqyCnJCPhgaFCnRDSLnZdQbFpGdRwPBOZboNWWZjaF 356 | IYfCxoXvmwAuCPnZTgqrXibuHcvXFBLJkVIGTrIyIkeJFU 357 | GzybcHZmkePddthIYIPsviCERGh 358 | ZJMVWWyiUjQQxmMJXaACrkXITDwSejQsHjbeTmsGV 359 | lhlOuoQwLhRpPC 360 | YjinNsOMwb 361 | gVeBwALhxwFUkWoMBklpOVzTPpZbAqmOF 362 | mlofYBxvlMofBtBJVxghhmpUVlwRNKJVceplFjVHZuYnzqQHlEgjRvgBOysUVlHn 363 | KvBqAFZHeXGyZkPKxcqYchuxXbbDahQHEBYlRrJqHmmhISpxSJYqBT 364 | hktFb 365 | elCNReQCgQLRPNn 366 | CpnJjilhxkiCGiFzMMWGVCdheDirvvictavFBWEDMawHnuvyfrzsGFCUrVQVLZHgwRBsWvjzaOgwypq 367 | sUnzmCHTfsBHWhZwMQMdxIYftSlvOrcUeFRbhYQCvIk 368 | BDmsOvDqsWZmhnPpVBwonjOjuXoOTPporpjjcWTLCNmzoacJGTQCohMzkgaxQovNbWS 369 | 370 | gubjUxVoUkVDuZPiTkcMibRuYZbfKPoxFjNtSDRaoMXYGEtYLVFA 371 | MYEFOqpdLjtgbGQggvlSrYzAAYWObYZSVTrUAuKyTyRGqedZR 372 | oUyaDXDOdrJznTTvsWgYFYHGfDxXZh 373 | mQRXVSmCsIJTSwPvjWCzINHJjzozxAIghOllaklEde 374 | FIsUzykuhdBrTaaQxuNQCmq 375 | dfDbAcMgVsHznVOQvhUeTTrrMTzxzRVuqyaeiZVSnCRtxyMLjHLFngcJL 376 | v 377 | lHzsysKtJvvg 378 | TIAYPCSnsJainO 379 | WpqoNJd 380 | BtcqPYasdRnyVZFbFjVCJaareuEqFkvvkhYgJHJ 381 | ZpmohetlWGqQsGUg 382 | IXkDQrrPnMWlCZRUWavVZamQeMwD 383 | vVUWLywaqlwmLeLKvvBYttHdyYuLwRsBbgTuEuBPbL 384 | YDUsnPIrR 385 | ZpuKNiGsBoZWedApEpjvuEhiSazvjEAJ 386 | maVYhVuFVEBjFpdRtYmoTJjzZdkZEjGnpXbERHOWvLrQPHgKdRDHgYJATIsFcQAqoWMy 387 | XJyEQczccwlTMeYHHSJBLwSsAfzCECPcEhvoOoKkAmeRnztjGZeaLsQlsRvZVyelQtKrDThRJPvobzrq 388 | uxtzbOgEu 389 | LLXaSQDdvNDDnWaWRiymDJLQyJFzGYMkusgHmk 390 | EykJqrflrvLxAcYtuLkmBVFuAwNzeAIcZiCRGwPNgjzdIWkyBcxVRZiijYpCLYkaeqrtfqAfmpquCfc 391 | iwEcJrWlXopSgnVIrRJgclIlYWndGKLVkGcIQQfSM 392 | K 393 | xBnQXUBOrZwbQPyNiTiecjccWNuNUkKLCPYSCJgoHXGldnKZboUnBVjMQoVbzlEPjbQWQroLThtKyHzV 394 | jXSBEoaAQjvPhlySTzqdAABXmRCfCrVNqSD 395 | dezYdKGFetbfKtSkPDcuLrcxZBZzkSJCIvkjNZrnEUUfwJNfTNYDu 396 | KxyvUasWmdQUChdpxmqutGQCBTBHRft 397 | EneGXAMvplGDFiRmqKlTPrXExCLoqScdZDtSyfSp 398 | QpFEvSzjEhMlMsicxwgX 399 | WkzSivHluA 400 | qjOWIXwcOxEfCQPMUqPHizzKiIgaIj 401 | abKLMtzTQUjau 402 | umhLzYNihgVWshFulujUDcrpGGgvybXcU 403 | bMpWxaokynyWHqJbdJZdHNcybsqONIJhuBBHlT 404 | ijFYyfwjvfleAZXnWPdUWQkmBMYdwFPVBrTd 405 | bTfMOtkRGPQjzhefkkiKtXXUUzPtVdvIdGnBORNrnfYqkuaCfUUsrxjVGlAMUKaMcfLiHIgLunPJojV 406 | CHoSwHoMkffMUuKJfgmOkRNIOaSmopFYadqhkhCFFoEklEvmVoXdoeDWOSXMEkOgDwmIKa 407 | DJElLPhhsIPlj 408 | eMOWBfDDQfEgzvioYgNSlVhgAjWXTtIQzOklsIOlEvlHiBQgwsojtIYwoAthvlJWvAQuaYtekcTbsHGoqj 409 | QKiDLkTGmEtclTqWXFamIOibbECAKWmztgDREy 410 | IwsDqa 411 | ZCMwa 412 | OBVpXCjcmwdVEfFEqFTMyALWTwcVvMzIMcclG 413 | kF 414 | FLfBuivbPcwFafpCXlShlIdPolGYLeZSA 415 | VkiCWmvQbEmVbMkvzyjrAjLTxurPkFEcOrabrlJJWcwddroiyNTiHl 416 | gExwNVKVOvglydZaTEXmQrNRmYFqn 417 | ulgajyYJUgXPxOgytRogNCUmJIzcrXxbwqylYXqyYWlKHpKyUkBwJfUIfrdRlKAXlT 418 | frgMzcme 419 | fOUrfyrlKVueSCtqQMidTdGdllqjJyciUNj 420 | DALrmmkryVBjpGfutbVNgaSYEWRjiOFffYYpWgnQkMyozTVdzAeRSshaAfqHLHVoTBBKezacfJVNxFZ 421 | gQDJlQrfkuYwnuHHaesMB 422 | HCRPdNzcIjSudKWVdFPZAsdtgMBohsWdFRvzplUDcEjzUaUbaacpRgzmUPow 423 | pyxuVGjv 424 | PioyIChFzwufgwItwlGFxrFnphpSzhPAKxzXHaBEwpkZZrrvfnYzOsGtVVvFYlSpBXcRPtdlweVbqRiyo 425 | 426 | fhTjAQZZUpxjgVBgQecalrMpheKppgulcbeYGeWJmBQBrUKaZOUfCULeSCgrAwEcOTNbmJTtS 427 | ocvzxgikFBQkkriRoEqFxMBgpbxTQkwX 428 | rgVWVUaqUOVnJHHawAirYIoOeEnGwMwXPtHesOTycdBJhWGfBPIPy 429 | XsjhQJPpdxvazryoWRCpYpLZRXrcErrlqSameZNdMVsvZHYpIcFlPDBmdsJQdRFykgSLieXzfsOH 430 | oSKdGqOQVoyVLqxqtITimZtrGMbGMnflyvoaBgNLPnUbSPRCgKLpsgkZTpkjby 431 | fBfxdRBslTMRArLylNQIzyUokHbiwhJLcTLRrUJgmlqoaIoHxI 432 | rRUVPYknHtVSUtfqYHxAdGRMSs 433 | SZxIdWsIUjczMapRzhxZtIAMCYsflCFOqaTTNTXkAPY 434 | qrHNGoxtUBWCUbiCyiqJC 435 | gtnBEQTPihDOAlCJUtdcwoRtLjTYBGAQSxHWKaCMzoNimrHheTnqPnECpCrtoPC 436 | WHWydsKqLQbOLtBcAyUNWgCNsDClbdAoiqqGjPQpGzSclgGpEjqaU 437 | vtUzLYugenDUQdXuuxMrlYHRNBnkmEfSZsmoxryyhelVhkLsvajdibfsWeNkXYbG 438 | hqZfmCfJRPjZOYPCApfcrBuX 439 | LzqoOAIbvKPk 440 | qJtczkRGDypvSEGQyvgw 441 | EvNyzcgZINPBrtnXgeA 442 | alSxMIaoGmEkkcAqEHm 443 | IpvgTLaVWgogJxLotPjsBXvkqqhBlOCcrrSyavreMoOdTvIA 444 | dCVePJ 445 | jzVyeyHBDuYXOJtAulpOAPkr 446 | zz 447 | j 448 | yfrfiExZNVQgCMSIpRiFiAfTIsckyPtgAhihahujglh 449 | fKL 450 | IqplMTKxdHjEvTvbBiUVBDI 451 | FUKSQyPTejUxtDyphNGKyAXSmWYFhoKwTzogUCTTQIsccGtkZlCHiNvgqnQEV 452 | gUkxlbGFqjnJLngamFsNAVRtKkmUpQfM 453 | KDUTuXsptRpZWNbDIdAZQvybPO 454 | qbETaLDFArhOTIiJXPxnZwtsYRqAetgHXCy 455 | eOjKcYoe 456 | RrRSVLmaZUVWWMWZsRSyoDNZRs 457 | IBxSNWs 458 | wyQzaogeJcNcNKCiWJkDKrEJsBvnyrmXAHAIhjkgcAZFiXVangmvJhmdZzfWkXiBlUBF 459 | QIAfkihCMEBpNDGcweTIzbKJOIJQdfxzglpZNaEcS 460 | xkaIznRXcoBRmhPTgyayAcobsoobEJFxEDOVuDgIakggOvBeYTNPTVITtlWRHX 461 | xIapBDuchXjxejLSyHlXwmScbcrfiH 462 | CxUqAZSJKOnsgYYLLyOKeEDHuSHVcSiIJzCZNkjkRhwpg 463 | NsHacmdBmHkHuwItel 464 | CzjifCSKqY 465 | IXnWFPsnhCUGmzgKfUv 466 | yBjmXwucCEQBincEOPWcryamYpwRFyzjSrIMeIIkeMJqOnAjNDodCOHx 467 | LACaNUcOPKaRaZLoBYsSCELsXaHROqjeqhdpDFkTiTGBmohNhDtwJaQXhzEtrEQmdwv 468 | ZGioOArxDESAlKqWuaOIIXXqOYVwpDZrxxJwpeunuSIHwPLbqPBDLNomEMWlUETUuV 469 | XjnXFMimAWXfrBHeevmqmJcOzILrVWuXGeXoZiTlTcAqRvIUGpavUVNe 470 | nUzOYCtvBMsFUPVVStmGxiDIacDelXskTncYNwIjsqDrZcESoGNFdLAzQIz 471 | RgfGuFtUbSYsZDjLVWMpVPLKXFAGMMpCUOXlCQRbcISbZAsIJbOGNQZvNmxNdlHBnAyBFBkADzbHvDPR 472 | VFRpFzRTtgwTNeBQugiJvXjqZfpRurtfBvQaAWojmLgSKLeXrWBUjtJNQhKVx 473 | MIQaJuzxxJstkZbehCUrBVxnzPegdgfjcSJYvPRkzCECKeYcnvwotmNyuMjrYZ 474 | WfoBYGfrzfPyvAccinqKYJSXOcAOpOPFinxBZJFqIXplvDNmrlpvZCtOOqqXPcvMRRGSYgCRqeLbeT 475 | niMSRrwxtfzNLxQfNXnpXjWmhqOlVfTXvkDOUhYLJZJgL 476 | KpqJJToTPmRd 477 | XJTtuEoczGYR 478 | tnxZqdTUte 479 | CpUYsDJNtizLWBIvJrKFJrztwDpaZ 480 | GdxCeA 481 | MU 482 | YTrXkum 483 | fWaTyHtv 484 | PZgQRIPCSYGyJqnBZSmpVpTOoCETtBBJUSrPyJEjLJJyPUrFrNvUjmdb 485 | SiofzVussXpbTZQcsqtlNTMFlENtBZMjvcMNawwAbQZKkzjjmlUIwIrAtVOIkWeygftmBwsjzOKXFbE 486 | XYPcrKcyWQNZVQgbnJXmhWeMwSGeiRGRJmwRAxUdYYDKZIRVtEku 487 | XqsAsOcJXFpceNIFOXGsYQBLsEfNYlvxBQvpw 488 | cjUgObDgWQOTbCuYPIKzMnxFXoCgyJZop 489 | lWCEvbg 490 | WxziGxXHpFGTEZvi 491 | EkzMpqGNmwAlgUDzPAcCOblNctdpJWHdfEGaKkDREswWnoRxdvfdasuCU 492 | CGOEEPrzqJjJMWjDgbJPZJhzEeMHIlUuHHbjIdPVudqmMvRJXtGoYgmqQAWkImlbC 493 | C 494 | HctnglmYAgVVWcqPGeppRvYdHqGSOs 495 | YbJgcwgHKuLspJDZ 496 | SUxidUKcyxufRCFirKJFrAdIQkZJqIdIMUZFvVZhuNrghpWx 497 | kfGlslWUBgWdoySEksbEDAOCckgRwMJpgByfrfUnHoXMDgkWjlSLUAIJPguDlXcGB 498 | kSrqkskBeuGsdGvqgtRpDkNjiZBPTpqPAKQuxnqavTYJWcxaxdLOGKDOwbjCW 499 | gnNgpNFqDfpOuhxGwjpmzOVaSDkAfmxXYIejsQOkAbXtRUqDizdbJkcZUNdvMt 500 | PAqnG 501 | --------------------------------------------------------------------------------