{ "cells": [ { "cell_type": "markdown", "id": "7f1f5a4a-ae34-4a27-9efa-399edc0e384a", "metadata": { "tags": [] }, "source": [ "## Benchmark Fastest Timeseries alternatives: ClickHouse Vs. InfluxDB Vs. Postgresql Vs. Parquet Vs. MongoDB Vs. DuckDB Vs Kdb+\n", "\n", "-----\n", "#### How to use:\n", "* Rename the file \"properties-model.ini\" to \"properties.ini\"\n", "* Fill with your own credentials\n", "----\n", "\n", "The proposal of this work is to compare the speed in read/writing a midle level of data ( a dataset with 9 columns and 1.000.000 lines) to four diferent databases:\n", "\n", "* [ClickHouse](#ClickHouse)\n", "* [InfluxDB](#InfluxDB)\n", "* [Postgresql](#Postgresql)\n", "* [Parquet (in a S3 Minio Storage)](#S3-Parquet))\n", "* [MongoDB](#MongoDB)\n", "* [DuckDB](#DuckDB)\n", "* [Kdb+](#Kdb+)\n", "\n", "Jump to:\n", "\n", "* [Table with Results](#Table)\n", "* [Graph with Read/Write result](#Graph)\n", "* [Graph with the best results](#Graph-(bests))\n", "* [Size Ocuppied on Disk](#Size)\n" ] }, { "cell_type": "markdown", "id": "6bb26ce7-1e84-4665-accd-916bb977f95d", "metadata": { "tags": [] }, "source": [ "### Imports " ] }, { "cell_type": "code", "execution_count": 170, "id": "ab6c6c81-6ac1-4668-a79b-a9a0341fb35a", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 170, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import configparser\n", "import io\n", "import timeit\n", "from datetime import datetime\n", "\n", "import duckdb\n", "import influxdb_client\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import pdmongo as pdm\n", "from clickhouse_driver import Client\n", "from dotenv import load_dotenv\n", "from minio import Minio\n", "from pymongo import MongoClient\n", "from pytz import timezone\n", "from qbstyles import mpl_style\n", "from qpython import qconnection\n", "from sqlalchemy import create_engine\n", "\n", "load_dotenv()" ] }, { "cell_type": "code", "execution_count": 89, "id": "55c3cd57-0996-4723-beb5-8f3196c96009", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Variables\n", "dbname = \"EURUSDtest\"\n", "collection = \"finance\"" ] }, { "cell_type": "code", "execution_count": 50, "id": "968403e3-2e5e-4834-b969-be4600e2963a", "metadata": { "tags": [] }, "outputs": [], "source": [ "arq = configparser.RawConfigParser()\n", "arq.read(\"properties.ini\")\n", "ClickHouseUser = arq.get(\"CLICKHOUSE\", \"user\")\n", "ClickHouseKey = arq.get(\"CLICKHOUSE\", \"key\")\n", "ClickHouseUrl = arq.get(\"CLICKHOUSE\", \"url\")\n", "\n", "InfluxDBUser = arq.get(\"INFLUXDB\", \"user\")\n", "InfluxDBKey = arq.get(\"INFLUXDB\", \"key\")\n", "InfluxDBUrl = arq.get(\"INFLUXDB\", \"url\")\n", "InfluxDBBucket = arq.get(\"INFLUXDB\", \"bucket\")\n", "\n", "PostgresqlUser = arq.get(\"POSTGRESQL\", \"user\")\n", "PostgresqlKey = arq.get(\"POSTGRESQL\", \"key\")\n", "PostgresqlUrl = arq.get(\"POSTGRESQL\", \"url\")\n", "PostgresqlDB = arq.get(\"POSTGRESQL\", \"database\")\n", "\n", "S3MinioUser = arq.get(\"S3MINIO\", \"user\")\n", "S3MinioKey = arq.get(\"S3MINIO\", \"key\")\n", "S3MinioUrl = arq.get(\"S3MINIO\", \"url\")\n", "S3MinioRegion = arq.get(\"S3MINIO\", \"region\")\n", "\n", "MongoUser = arq.get(\"MONGODB\", \"user\")\n", "MongoKey = arq.get(\"MONGODB\", \"key\")\n", "MongoUrl = arq.get(\"MONGODB\", \"url\")" ] }, { "cell_type": "code", "execution_count": 51, "id": "3634a4ec-04c2-4f1e-8659-5d22eb17a254", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idfromattoopencloseminmaxvolume
99999579847482023-03-03 18:13:3016778672250000000002023-03-03 18:13:451.0626951.0626351.0626301.06270064
99999679847492023-03-03 18:13:4516778672400000000002023-03-03 18:14:001.0626451.0626501.0626251.06265043
99999779847502023-03-03 18:14:0016778672550000000002023-03-03 18:14:151.0626401.0626251.0626201.06266547
99999879847512023-03-03 18:14:1516778672700000000002023-03-03 18:14:301.0626251.0625351.0625351.06264543
99999979847522023-03-03 18:14:3016778672850000000002023-03-03 18:14:451.0625351.0625201.0625201.06258059
\n", "
" ], "text/plain": [ " id from at \\\n", "999995 7984748 2023-03-03 18:13:30 1677867225000000000 \n", "999996 7984749 2023-03-03 18:13:45 1677867240000000000 \n", "999997 7984750 2023-03-03 18:14:00 1677867255000000000 \n", "999998 7984751 2023-03-03 18:14:15 1677867270000000000 \n", "999999 7984752 2023-03-03 18:14:30 1677867285000000000 \n", "\n", " to open close min max volume \n", "999995 2023-03-03 18:13:45 1.062695 1.062635 1.062630 1.062700 64 \n", "999996 2023-03-03 18:14:00 1.062645 1.062650 1.062625 1.062650 43 \n", "999997 2023-03-03 18:14:15 1.062640 1.062625 1.062620 1.062665 47 \n", "999998 2023-03-03 18:14:30 1.062625 1.062535 1.062535 1.062645 43 \n", "999999 2023-03-03 18:14:45 1.062535 1.062520 1.062520 1.062580 59 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# %%time\n", "# Load Dataset\n", "df = pd.read_csv(\"out.csv\", index_col=0)\n", "df.tail()" ] }, { "cell_type": "code", "execution_count": null, "id": "76199f91-31d6-416b-9f15-5d435b3792c9", "metadata": {}, "outputs": [], "source": [ "df[\"from\"] = pd.to_datetime(df[\"from\"], unit=\"s\")\n", "df[\"to\"] = pd.to_datetime(df[\"to\"], unit=\"s\")\n", "# Optional use when not transoformed yet\n", "# Transform Datetime" ] }, { "cell_type": "markdown", "id": "274cc026-2f48-4e38-b80f-b1a9ff982060", "metadata": { "tags": [] }, "source": [ "#### Funçoes\n", "\n", "-> Class" ] }, { "cell_type": "code", "execution_count": 5, "id": "27de1ec8-4de1-440a-b555-b4a46c5ef7ce", "metadata": {}, "outputs": [], "source": [ "def timestamp2dataHora(x, timezone_=\"America/Sao_Paulo\"):\n", " d = datetime.fromtimestamp(x, tz=timezone(timezone_))\n", " return d" ] }, { "cell_type": "markdown", "id": "4a8d5703-9bc9-4d38-83ff-457159304d58", "metadata": { "tags": [] }, "source": [ "### ClickHouse" ] }, { "cell_type": "code", "execution_count": 62, "id": "c3202bbb-2655-45b2-b166-9f45a3ef854c", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'Database created'" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# !! driver tcp.\n", "def cHouseConnect():\n", " client = Client(\n", " host=ClickHouseUrl,\n", " user=ClickHouseUser,\n", " password=ClickHouseKey,\n", " settings={\"use_numpy\": True},\n", " )\n", " return client\n", "\n", "\n", "def cHouseDropTables(databasename):\n", " client = cHouseConnect()\n", " client.execute(\"DROP TABLE {}\".format(databasename))\n", " client.disconnect()\n", " return \"Database deleted\"\n", "\n", "\n", "# Create Tables in ClickHouse\n", "# !! ALTERAR TIPOS !!\n", "# ENGINE: 'Memory' desaparece quando server é reiniciado\n", "def cHouseCreateDb(databasename):\n", " client = cHouseConnect()\n", " client.execute(\n", " \"CREATE TABLE IF NOT EXISTS {} (id UInt32,\"\n", " \"from DateTime, at UInt64, to DateTime, open Float64,\"\n", " \"close Float64, min Float64, max Float64, volume UInt32)\"\n", " \"ENGINE MergeTree ORDER BY to\".format(databasename)\n", " )\n", " client.disconnect()\n", " return \"Database created\"\n", "\n", "\n", "# Write dataframe to db\n", "def cHouseInsertDf(dbName, dataframe):\n", " client = cHouseConnect()\n", " client.insert_dataframe(\"INSERT INTO {} VALUES\".format(dbName), dataframe)\n", " client.disconnect()\n", " return \" dataframe {} inserted in clickhouse database\".format(dataframe)\n", "\n", "\n", "def cHouseQueryDf(databaseName):\n", " client = cHouseConnect()\n", " dfQuery = client.query_dataframe(\"SELECT * FROM default.{}\".format(databaseName))\n", " client.disconnect()\n", " return dfQuery\n", "\n", "\n", "cHouseCreateDb(dbname)" ] }, { "cell_type": "code", "execution_count": 63, "id": "cc4865b3-a1bc-4a35-9624-15334754b3a1", "metadata": {}, "outputs": [], "source": [ "# Insert to db and benchmark time\n", "start = timeit.default_timer()\n", "cHouseInsertDf(dbname, df)\n", "stop = timeit.default_timer()\n", "cHouse_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 64, "id": "1fac82c1-2d04-44ef-893a-dc13b755e6d8", "metadata": {}, "outputs": [], "source": [ "# read from db and benchmark time\n", "start = timeit.default_timer()\n", "dfCh = cHouseQueryDf(dbname)\n", "stop = timeit.default_timer()\n", "cHouse_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 57, "id": "597ae7bd-2eea-44d7-b379-f0eb7e745c15", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idfromattoopencloseminmaxvolume
199999580830542023-03-28 18:54:0016800296550032476672023-03-28 18:54:151.0840151.0840151.0839951.08404042
199999680830552023-03-28 18:54:1516800296700000000002023-03-28 18:54:301.0840201.0839501.0839401.08404555
199999780830552023-03-28 18:54:1516800296700000000002023-03-28 18:54:301.0840201.0839501.0839401.08404555
199999880830562023-03-28 18:54:3016800296850000000002023-03-28 18:54:451.0839651.0839551.0839451.08397540
199999980830562023-03-28 18:54:3016800296850000000002023-03-28 18:54:451.0839651.0839551.0839451.08397540
\n", "
" ], "text/plain": [ " id from at to \\\n", "1999995 8083054 2023-03-28 18:54:00 1680029655003247667 2023-03-28 18:54:15 \n", "1999996 8083055 2023-03-28 18:54:15 1680029670000000000 2023-03-28 18:54:30 \n", "1999997 8083055 2023-03-28 18:54:15 1680029670000000000 2023-03-28 18:54:30 \n", "1999998 8083056 2023-03-28 18:54:30 1680029685000000000 2023-03-28 18:54:45 \n", "1999999 8083056 2023-03-28 18:54:30 1680029685000000000 2023-03-28 18:54:45 \n", "\n", " open close min max volume \n", "1999995 1.084015 1.084015 1.083995 1.084040 42 \n", "1999996 1.084020 1.083950 1.083940 1.084045 55 \n", "1999997 1.084020 1.083950 1.083940 1.084045 55 \n", "1999998 1.083965 1.083955 1.083945 1.083975 40 \n", "1999999 1.083965 1.083955 1.083945 1.083975 40 " ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfCh.tail()" ] }, { "cell_type": "code", "execution_count": 65, "id": "86794e47-611f-4ca8-a7e8-07e71afafe67", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.571660671004793\n" ] } ], "source": [ "print(cHouse_read_execution_time)" ] }, { "cell_type": "code", "execution_count": 66, "id": "e7926062-8e84-4d3f-90a9-32807ce4f3d4", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5.804937635999522\n" ] } ], "source": [ "print(cHouse_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 60, "id": "8faa5683-a204-461d-80c3-67644aa714ce", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "'Database deleted'" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Utils\n", "# %%time\n", "# dfCh = cHouseQueryDf(dbname)\n", "# drop table\n", "cHouseDropTables(dbname)" ] }, { "cell_type": "markdown", "id": "1d389546-911f-43f7-aad1-49f7bcc83503", "metadata": { "tags": [] }, "source": [ "### InfluxDB\n" ] }, { "cell_type": "code", "execution_count": 68, "id": "ecd217ab-0e16-40a6-9b92-9212b9bb20e9", "metadata": { "tags": [] }, "outputs": [], "source": [ "query = \"\"\"\n", "from(bucket: \"EURUSDtest\")\n", "|> range(start:2023-03-03T18:14:30Z, stop: now())\n", "|> filter(fn: (r) => r._measurement == \"id\")\n", "|> pivot(rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\")\"\"\"" ] }, { "cell_type": "code", "execution_count": 69, "id": "c3e7ebfd-76f1-4ac4-9833-312eb1a531af", "metadata": {}, "outputs": [], "source": [ "def influxdbConnect():\n", " client = influxdb_client.InfluxDBClient(\n", " url=InfluxDBUrl, token=InfluxDBKey, org=InfluxDBUser\n", " )\n", " return client\n", "\n", "\n", "def influxdbLoadCsv(csv=\"out.csv\", dictDates=[\"from\", \"to\"], index=\"from\"):\n", " # Read data from CSV without index and parse 'TimeStamp' as date.\n", " df = pd.read_csv(csv, sep=\",\", index_col=False, parse_dates=dictDates)\n", " # Set 'TimeStamp' field as index of dataframe # test another indexs\n", " df.set_index(index, inplace=True)\n", " return df\n", "\n", "\n", "def influxdbWriteCsv(dataFrame, bucket, measurement=\"id\", tag=\"volume\"):\n", " client = influxdbConnect()\n", " # write_options=SYNCHRONOUS\n", " with client.write_api() as writer:\n", " writer.write(\n", " bucket=bucket,\n", " record=dataFrame,\n", " data_frame_measurement_name=measurement,\n", " data_frame_tag_columns=[tag],\n", " )\n", " writer.__del__()\n", " client.__del__()\n", " return 0\n", "\n", "\n", "def influxdRead(org=InfluxDBUrl, query=query):\n", " client = influxdbConnect()\n", " InfluxDf = client.query_api().query_data_frame(org=\"librography\", query=query)\n", " # display(InfluxDf.head())\n", " return InfluxDf" ] }, { "cell_type": "code", "execution_count": 83, "id": "4be399bb-6b69-4f2b-aac0-9eab03cebfff", "metadata": { "tags": [] }, "outputs": [], "source": [ "def delete_data(measurement=\"id\", bucket=InfluxDBBucket, org=\"librography\"):\n", " client = influxdbConnect()\n", " delete_api = client.delete_api()\n", " start = \"1970-01-01T00:00:00Z\"\n", " stop = \"2024-10-30T00:00:00Z\"\n", " delete_api.delete(start, stop, f'_measurement=\"{measurement}\"', bucket, org)" ] }, { "cell_type": "code", "execution_count": null, "id": "baab1b7c-8f09-4d5e-8275-8588b4b5dd9d", "metadata": { "tags": [] }, "outputs": [], "source": [ "delete_data()" ] }, { "cell_type": "code", "execution_count": 70, "id": "e05266b8-ff32-462c-b059-325a40a53d25", "metadata": { "tags": [] }, "outputs": [], "source": [ "dafr = influxdbLoadCsv()\n", "# dafr.head()" ] }, { "cell_type": "code", "execution_count": 74, "id": "95191283-f11e-456f-8395-36981ab1ac51", "metadata": {}, "outputs": [], "source": [ "start = timeit.default_timer()\n", "influxdbWriteCsv(dafr, InfluxDBBucket)\n", "# dfIdw = cHouseQueryDf(dbname)\n", "stop = timeit.default_timer()\n", "influxdb_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 75, "id": "3e5bb029-4988-4692-bc5f-9a6f7fcc2159", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "87.55419652500132\n" ] } ], "source": [ "print(influxdb_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 78, "id": "850c6921-5e1c-417a-bea6-ea18be642008", "metadata": { "tags": [] }, "outputs": [], "source": [ "# read from db and benchmark time\n", "start = timeit.default_timer()\n", "influxdRead()\n", "stop = timeit.default_timer()\n", "influxdb_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 79, "id": "3ee3c0dd-cb70-4124-a0fb-db8dd2c134c0", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "69.66793818100268\n" ] } ], "source": [ "print(influxdb_read_execution_time)" ] }, { "cell_type": "code", "execution_count": 80, "id": "54342a28-ba2b-4ade-a692-00566b53a639", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Write TimeRead TimeTotal Time
Click House5.80 sec7.57 sec13.38 sec
Kdb+2.87 sec4.15 sec7.03 sec
r2fill150
r3fill140
\n", "
" ], "text/plain": [ " Write Time Read Time Total Time\n", "Click House 5.80 sec 7.57 sec 13.38 sec\n", "Kdb+ 2.87 sec 4.15 sec 7.03 sec\n", "r2 fill 15 0\n", "r3 fill 14 0" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "markdown", "id": "b9ddfdc6-c899-4f6c-9b4e-8ec6ab6d7e05", "metadata": { "tags": [] }, "source": [ "### Postgresql" ] }, { "cell_type": "code", "execution_count": 201, "id": "16cd8eb7-333d-43fd-88e0-ee983645d3fd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idfromattoopencloseminmaxvolume
99999579847482023-03-03 18:13:3016778672250000000002023-03-03 18:13:451.0626951.0626351.0626301.06270064
99999679847492023-03-03 18:13:4516778672400000000002023-03-03 18:14:001.0626451.0626501.0626251.06265043
99999779847502023-03-03 18:14:0016778672550000000002023-03-03 18:14:151.0626401.0626251.0626201.06266547
99999879847512023-03-03 18:14:1516778672700000000002023-03-03 18:14:301.0626251.0625351.0625351.06264543
99999979847522023-03-03 18:14:3016778672850000000002023-03-03 18:14:451.0625351.0625201.0625201.06258059
\n", "
" ], "text/plain": [ " id from at \\\n", "999995 7984748 2023-03-03 18:13:30 1677867225000000000 \n", "999996 7984749 2023-03-03 18:13:45 1677867240000000000 \n", "999997 7984750 2023-03-03 18:14:00 1677867255000000000 \n", "999998 7984751 2023-03-03 18:14:15 1677867270000000000 \n", "999999 7984752 2023-03-03 18:14:30 1677867285000000000 \n", "\n", " to open close min max volume \n", "999995 2023-03-03 18:13:45 1.062695 1.062635 1.062630 1.062700 64 \n", "999996 2023-03-03 18:14:00 1.062645 1.062650 1.062625 1.062650 43 \n", "999997 2023-03-03 18:14:15 1.062640 1.062625 1.062620 1.062665 47 \n", "999998 2023-03-03 18:14:30 1.062625 1.062535 1.062535 1.062645 43 \n", "999999 2023-03-03 18:14:45 1.062535 1.062520 1.062520 1.062580 59 " ] }, "execution_count": 201, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Connect / Create Tables\n", "def psqlConnect():\n", " engine = create_engine(\n", " \"postgresql+psycopg2://{}:{}@{}:5432/{}\".format(\n", " PostgresqlUser, PostgresqlKey, PostgresqlUrl, PostgresqlDB\n", " )\n", " )\n", " return engine\n", "\n", "\n", "psqlConnect()\n", "# testar função\n", "df = pd.read_csv(\"out.csv\", index_col=0)\n", "df.tail()" ] }, { "cell_type": "code", "execution_count": 204, "id": "be31f3a0-b7ed-48e6-9b65-dc16319fb8d1", "metadata": {}, "outputs": [], "source": [ "# Drop old table and create new empty table\n", "def psqlCreateTables(databaseName):\n", " engine = psqlConnect()\n", " df.head(0).to_sql(databaseName, engine, if_exists=\"replace\", index=False)\n", " # Write\n", " conn = engine.raw_connection()\n", " cur = conn.cursor()\n", " output = io.StringIO()\n", " df.to_csv(output, sep=\"\\t\", header=False, index=False)\n", " output.seek(0)\n", " contents = output.getvalue()\n", " cur.copy_from(output, \"EURUSDtest\") # , null=\"\") # null values become ''\n", " conn.commit()\n", " cur.close()\n", " conn.close()\n", " # disconnect()\n", " return 0\n", "\n", "\n", "# funcao read sql\n", "def psqlReadTables():\n", " engine = psqlConnect()\n", " df = pd.read_sql_query('select * from \"EURUSDtest\"', con=engine)\n", " return df\n", "\n", "\n", "# testar função" ] }, { "cell_type": "code", "execution_count": 205, "id": "98cc9360-4b84-43e4-b23b-b32d0c50c3b9", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Insert to db and benchmark time\n", "start = timeit.default_timer()\n", "psqlCreateTables(dbname)\n", "stop = timeit.default_timer()\n", "psql_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 206, "id": "75b7a130-92e3-4af1-9e1c-a285622c8996", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24.818096771996352\n" ] } ], "source": [ "print(psql_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 207, "id": "82e1b44e-35af-403f-9936-5e1561fd5abf", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "psqlReadTables()\n", "stop = timeit.default_timer()\n", "psql_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 208, "id": "6d1b7480-5bc7-4f08-8cf3-b9590802d8f7", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "18.282347426000342\n" ] } ], "source": [ "print(psql_read_execution_time)" ] }, { "cell_type": "code", "execution_count": 96, "id": "6acb2959-3255-43bd-aea5-9ef70acc8902", "metadata": { "tags": [] }, "outputs": [], "source": [ "# df.head()" ] }, { "cell_type": "markdown", "id": "f9e0393d-7d1d-406a-a068-9dbf4968e977", "metadata": { "tags": [] }, "source": [ "### S3-Parquet" ] }, { "cell_type": "code", "execution_count": 99, "id": "7c7022bf-9c3b-400a-9045-b089483f05ad", "metadata": { "tags": [] }, "outputs": [], "source": [ "# fazer sem funçao para ver se melhora\n", "# verifique se esta no ssd os arquivos da pasta git\n", "def s3Connect():\n", " client = Minio(\n", " S3MinioUrl,\n", " secure=False,\n", " region=S3MinioRegion,\n", " access_key=S3MinioUser,\n", " secret_key=S3MinioKey,\n", " )\n", " return client\n", "\n", "\n", "def s3CreateBucket(bucketName=\"data\"):\n", " client = s3Connect()\n", " found = client.bucket_exists(bucketName)\n", " if not found:\n", " return client.make_bucket(bucketName)\n", " else:\n", " return \"Bucket '{}' already exists\".format(bucketName)\n", "\n", "\n", "def s3uploadCsv():\n", " client = s3Connect()\n", " client.fput_object(\n", " \"data\",\n", " \"data.parquet\",\n", " \"data/data.parquet\",\n", " )\n", " return (\n", " \"'data/data.parquet' is successfully uploaded as \"\n", " \"object 'data.parquet' to bucket 'data'.\"\n", " )" ] }, { "cell_type": "code", "execution_count": 100, "id": "cd7fe012-9eee-4f91-8c07-8e0148633766", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Insert to db and benchmark time\n", "df.to_parquet(\"data/data.parquet\")\n", "s3CreateBucket()\n", "start = timeit.default_timer()\n", "s3uploadCsv()\n", "stop = timeit.default_timer()\n", "s3_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 101, "id": "390918c8-c88f-404a-96c4-685d578fdad0", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.160801975995128\n" ] } ], "source": [ "print(s3_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 102, "id": "666d4bc7-933d-4e6e-87c1-72fd37e61e0d", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "pq = pd.read_parquet(\"data/data.parquet\", engine=\"pyarrow\")\n", "stop = timeit.default_timer()\n", "s3_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 106, "id": "573b10c3-5dfe-420a-a988-688d4ebcde24", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idfromattoopencloseminmaxvolume
077308012023-01-02 15:58:4516726751400000000002023-01-02 15:59:001.0659951.0660351.0659301.06607057
177308022023-01-02 15:59:0016726751550000000002023-01-02 15:59:151.0660551.0660851.0660051.06611552
277308032023-01-02 15:59:1516726751700000000002023-01-02 15:59:301.0660801.0660251.0660251.06611057
377308042023-01-02 15:59:3016726751850000000002023-01-02 15:59:451.0659801.0659851.0658851.06604564
477308052023-01-02 15:59:4516726752000000000002023-01-02 16:00:001.0659751.0660551.0658301.06605550
\n", "
" ], "text/plain": [ " id from at to \\\n", "0 7730801 2023-01-02 15:58:45 1672675140000000000 2023-01-02 15:59:00 \n", "1 7730802 2023-01-02 15:59:00 1672675155000000000 2023-01-02 15:59:15 \n", "2 7730803 2023-01-02 15:59:15 1672675170000000000 2023-01-02 15:59:30 \n", "3 7730804 2023-01-02 15:59:30 1672675185000000000 2023-01-02 15:59:45 \n", "4 7730805 2023-01-02 15:59:45 1672675200000000000 2023-01-02 16:00:00 \n", "\n", " open close min max volume \n", "0 1.065995 1.066035 1.065930 1.066070 57 \n", "1 1.066055 1.066085 1.066005 1.066115 52 \n", "2 1.066080 1.066025 1.066025 1.066110 57 \n", "3 1.065980 1.065985 1.065885 1.066045 64 \n", "4 1.065975 1.066055 1.065830 1.066055 50 " ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pq.head()" ] }, { "cell_type": "code", "execution_count": 103, "id": "fefb54f6-9040-4fd7-9861-20322c202d92", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5090432809956837\n" ] } ], "source": [ "print(s3_read_execution_time)" ] }, { "cell_type": "markdown", "id": "50d1fc58-89a7-4507-aff0-6e943656cfe0", "metadata": { "tags": [] }, "source": [ "### MongoDB" ] }, { "cell_type": "code", "execution_count": 107, "id": "d104d9af-fa34-4261-8478-329a28ee4f2e", "metadata": { "tags": [] }, "outputs": [], "source": [ "port = \"27017\"\n", "\n", "\n", "def mongoLoadCsv(csvfile):\n", " data = pd.read_csv(\"out.csv\")\n", " return data\n", "\n", "\n", "def mongoConnect():\n", " client = MongoClient(\n", " \"mongodb://{}:{}@{}/EURUSDtest?retryWrites=true&w=majority\".format(\n", " MongoUser, MongoKey, MongoUrl\n", " ),\n", " authSource=\"admin\",\n", " )\n", " return client\n", "\n", "\n", "def mongoWriteDict(dados, dbs, collection):\n", " client = mongoConnect()\n", " db = client[dbs]\n", " collection = db[collection]\n", " # data.reset_index(inplace=True)\n", " data_dict = dados.to_dict(\"records\")\n", " # return data_dict\n", " collection.insert_many(data_dict)\n", " return 0\n", "\n", "\n", "def mongoRead():\n", " df = pdm.read_mongo(\n", " collection, [], \"mongodb://192.168.1.162:27017/{}\".format(dbname)\n", " )\n", " return df" ] }, { "cell_type": "code", "execution_count": 108, "id": "739de6aa-313f-4ccd-96c8-fa22d0cc687e", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0idfromattoopencloseminmaxvolume
0077308012023-01-02 15:58:4516726751400000000002023-01-02 15:59:001.0659951.0660351.0659301.06607057
1177308022023-01-02 15:59:0016726751550000000002023-01-02 15:59:151.0660551.0660851.0660051.06611552
2277308032023-01-02 15:59:1516726751700000000002023-01-02 15:59:301.0660801.0660251.0660251.06611057
3377308042023-01-02 15:59:3016726751850000000002023-01-02 15:59:451.0659801.0659851.0658851.06604564
4477308052023-01-02 15:59:4516726752000000000002023-01-02 16:00:001.0659751.0660551.0658301.06605550
\n", "
" ], "text/plain": [ " Unnamed: 0 id from at \\\n", "0 0 7730801 2023-01-02 15:58:45 1672675140000000000 \n", "1 1 7730802 2023-01-02 15:59:00 1672675155000000000 \n", "2 2 7730803 2023-01-02 15:59:15 1672675170000000000 \n", "3 3 7730804 2023-01-02 15:59:30 1672675185000000000 \n", "4 4 7730805 2023-01-02 15:59:45 1672675200000000000 \n", "\n", " to open close min max volume \n", "0 2023-01-02 15:59:00 1.065995 1.066035 1.065930 1.066070 57 \n", "1 2023-01-02 15:59:15 1.066055 1.066085 1.066005 1.066115 52 \n", "2 2023-01-02 15:59:30 1.066080 1.066025 1.066025 1.066110 57 \n", "3 2023-01-02 15:59:45 1.065980 1.065985 1.065885 1.066045 64 \n", "4 2023-01-02 16:00:00 1.065975 1.066055 1.065830 1.066055 50 " ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = mongoLoadCsv(\"out.csv\")\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 109, "id": "0af8f72c-5b58-4dfc-af36-c5b4bc79f127", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "dfCh = mongoWriteDict(data, dbname, \"finance\")\n", "stop = timeit.default_timer()\n", "mongo_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 110, "id": "0757f14c-4677-41d3-90d8-63b884e24e7e", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "54.566006569999445\n" ] } ], "source": [ "print(mongo_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 111, "id": "e7922312-74cb-4df3-8dea-e5ee0d99fab7", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "dfMongo = mongoRead()\n", "stop = timeit.default_timer()\n", "mongo_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 112, "id": "93fb22ea-b283-4447-b774-fe755a782223", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34.66374846499821\n" ] } ], "source": [ "print(mongo_read_execution_time)" ] }, { "cell_type": "markdown", "id": "97405e42-61dc-42c7-8220-237a312c0ec7", "metadata": { "tags": [] }, "source": [ "### DuckDB" ] }, { "cell_type": "code", "execution_count": 119, "id": "bbcdb883-d6dc-46db-88db-4c90b84522ba", "metadata": {}, "outputs": [], "source": [ "# https://duckdb.org/2022/07/27/art-storage.html\n", "\n", "\n", "def duckdbConnect():\n", " cursor = duckdb.connect()\n", " return cursor\n", "\n", "\n", "def duckdbLoadCsv(csvFile=\"out.csv\"):\n", " data = pd.read_csv(csvFile)\n", " return data\n", "\n", "\n", "# write\n", "def duckdbWrite(file, dataframe, tableName):\n", " conn = duckdbConnect()\n", " conn = duckdb.connect(file)\n", " # conn.execute(\"DROP TABLE EURUSDtest\")\n", " # conn.sql('CREATE TABLE EURUSDtest(i INTEGER)')\n", " conn.register(\"tempTable\", dataframe)\n", " conn.execute(\"CREATE TABLE {} AS SELECT * FROM tempTable\".format(tableName))\n", " conn.close()\n", " return 0\n", "\n", "\n", "def duckdbRead(dbfile):\n", " conn = duckdbConnect()\n", " conn = duckdb.connect(dbfile)\n", " conn.execute(\"SELECT * FROM {}\".format(dbname)).fetchdf()\n", " conn.close()\n", " return 0" ] }, { "cell_type": "code", "execution_count": 120, "id": "1c787f48-5640-4eb5-9456-be8f0a8211eb", "metadata": { "tags": [] }, "outputs": [], "source": [ "data = duckdbLoadCsv()" ] }, { "cell_type": "code", "execution_count": null, "id": "f07f03d0-021e-4dc3-bfa8-efc029a9797a", "metadata": { "tags": [] }, "outputs": [], "source": [ "conn = duckdbConnect()\n", "conn.execute(\"DROP TABLE EURUSDtest\")" ] }, { "cell_type": "code", "execution_count": 74, "id": "45620be8-34c6-4a3a-89f7-09337f665c90", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conn.register(\"EURUSDtest\", data)" ] }, { "cell_type": "code", "execution_count": 84, "id": "9eb19431-fbad-43b4-84f7-0043e65de162", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
name
0EURUSDtest
\n", "
" ], "text/plain": [ " name\n", "0 EURUSDtest" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "conn = duckdb.connect(\"file.db\")\n", "# conn.execute(\"DROP TABLE EURUSDtest\")\n", "# conn.sql(\"CREATE TABLE EURUSDtest(i INTEGER)\")\n", "display(conn.execute(\"SHOW TABLES\").df())" ] }, { "cell_type": "code", "execution_count": null, "id": "32037939-def0-48e7-9a47-46bcf1a5883c", "metadata": { "tags": [] }, "outputs": [], "source": [ "# conn = duckdbConnect()\n", "conn.execute(\"SELECT * FROM EURUSDtest\")\n", "conn.fetchall()" ] }, { "cell_type": "code", "execution_count": 121, "id": "c6f53d67-684b-4b34-a573-472986ee3e47", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "dfDuckdb = duckdbWrite(\"file.db\", data, dbname)\n", "stop = timeit.default_timer()\n", "duckdb_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 122, "id": "102f363a-b35d-433c-8752-7acc85c27bdc", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.02947735300404\n" ] } ], "source": [ "print(duckdb_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 123, "id": "f630fc1a-0d52-4e3a-9dfe-1ec60d188033", "metadata": { "tags": [] }, "outputs": [], "source": [ "start = timeit.default_timer()\n", "dfDuckdb = duckdbRead(\"file.db\")\n", "stop = timeit.default_timer()\n", "duckdb_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 124, "id": "c6abdaaa-3ac2-425b-9208-d6cb79afe966", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5635835029970622\n" ] } ], "source": [ "print(duckdb_read_execution_time)" ] }, { "cell_type": "markdown", "id": "4409cc89-ed14-4313-ac89-65b826038533", "metadata": { "tags": [] }, "source": [ "### Kdb+" ] }, { "cell_type": "code", "execution_count": 31, "id": "14f63810-1943-4e28-9bce-2148be6be02d", "metadata": {}, "outputs": [], "source": [ "# numpy version boolean fix\n", "np.bool = np.bool_" ] }, { "cell_type": "code", "execution_count": 25, "id": "bbd217e3-695f-4fa6-ae42-83db1dde8311", "metadata": {}, "outputs": [], "source": [ "# functions\n", "# cd ~ && q/l64/q -p 5001\n", "\n", "\n", "def kdbConnect():\n", " q = qconnection.QConnection(host=\"localhost\", port=5001)\n", " q.open()\n", " return q\n", "\n", "\n", "def kdbLoadCsv(file=\"out.csv\"):\n", " data = pd.read_csv(file)\n", " return data\n", "\n", "\n", "def kdbWrite():\n", " q = kdbConnect()\n", " data = kdbLoadCsv()\n", " q.sendSync(\"{t::x}\", data)\n", " q.sendSync(\"`:/home/sandman/q/tab1 set t\")\n", " q.close()\n", " return 0\n", "\n", "\n", "def kdbRead():\n", " q = kdbConnect()\n", " # df2 = q.sendSync(\"tab2: get `:/home/sandman/q/tab1\")\n", " # df2 = q.sendSync(\"tab2\")\n", " df = pd.DataFrame(q(\"t\")) # , pandas=True))\n", " # df3 = q.sendSync(\"select from t\")\n", " # ver todos esses loads\n", " q.close()\n", " return 0" ] }, { "cell_type": "code", "execution_count": 28, "id": "67f0c26e-44fb-40b0-a147-5d97bfbbded2", "metadata": {}, "outputs": [], "source": [ "# write\n", "start = timeit.default_timer()\n", "dfKdb = kdbWrite()\n", "stop = timeit.default_timer()\n", "kdb_write_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": 29, "id": "dcb200be-ffc9-4bcc-8554-5740fb420ab5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.8739770100000896\n" ] } ], "source": [ "# print write time\n", "print(kdb_write_execution_time)" ] }, { "cell_type": "code", "execution_count": 30, "id": "d4ce0203-b0c7-440b-a3ca-d7b2a7682474", "metadata": {}, "outputs": [], "source": [ "# read\n", "start = timeit.default_timer()\n", "dfKdb = kdbRead()\n", "stop = timeit.default_timer()\n", "kdb_read_execution_time = stop - start" ] }, { "cell_type": "code", "execution_count": null, "id": "1a16fd76-2158-40fe-9285-c53791f8ed51", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.153738381999574\n" ] } ], "source": [ "# print read time\n", "print(kdb_read_execution_time)" ] }, { "cell_type": "markdown", "id": "7c923c16-d741-4903-8493-81ff3c4d300e", "metadata": { "tags": [] }, "source": [ "## Table" ] }, { "cell_type": "code", "execution_count": 209, "id": "3a09558c-73e6-4324-9fc5-782fcd0d12e5", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Write TimeRead TimeTotal Time
Click House5.80 sec7.57 sec13.38 sec
InfluxDb87.55 sec69.67 sec157.22 sec
Postgresql24.82 sec18.28 sec43.10 sec
S34.16 sec0.51 sec4.67 sec
MongoDb54.57 sec34.66 sec89.23 sec
DuckDb2.03 sec0.56 sec2.59 sec
Kdb+2.87 sec4.15 sec7.03 sec
\n", "
" ], "text/plain": [ " Write Time Read Time Total Time\n", "Click House 5.80 sec 7.57 sec 13.38 sec\n", "InfluxDb 87.55 sec 69.67 sec 157.22 sec\n", "Postgresql 24.82 sec 18.28 sec 43.10 sec\n", "S3 4.16 sec 0.51 sec 4.67 sec\n", "MongoDb 54.57 sec 34.66 sec 89.23 sec\n", "DuckDb 2.03 sec 0.56 sec 2.59 sec\n", "Kdb+ 2.87 sec 4.15 sec 7.03 sec" ] }, "execution_count": 209, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# duckdb_write_execution_time\n", "s = \" sec\"\n", "data = [\n", " [\n", " \"{:.2f}\".format(cHouse_write_execution_time) + s,\n", " \"{:.2f}\".format(cHouse_read_execution_time) + s,\n", " \"{:.2f}\".format(cHouse_write_execution_time + cHouse_read_execution_time) + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(influxdb_write_execution_time) + s,\n", " \"{:.2f}\".format(influxdb_read_execution_time) + s,\n", " \"{:.2f}\".format(influxdb_write_execution_time + influxdb_read_execution_time)\n", " + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(psql_write_execution_time) + s,\n", " \"{:.2f}\".format(psql_read_execution_time) + s,\n", " \"{:.2f}\".format(psql_write_execution_time + psql_read_execution_time) + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(s3_write_execution_time) + s,\n", " \"{:.2f}\".format(s3_read_execution_time) + s,\n", " \"{:.2f}\".format(s3_write_execution_time + s3_read_execution_time) + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(mongo_write_execution_time) + s,\n", " \"{:.2f}\".format(mongo_read_execution_time) + s,\n", " \"{:.2f}\".format(mongo_write_execution_time + mongo_read_execution_time) + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(duckdb_write_execution_time) + s,\n", " \"{:.2f}\".format(duckdb_read_execution_time) + s,\n", " \"{:.2f}\".format(duckdb_write_execution_time + duckdb_read_execution_time) + s,\n", " ],\n", " [\n", " \"{:.2f}\".format(kdb_write_execution_time) + s,\n", " \"{:.2f}\".format(kdb_read_execution_time) + s,\n", " \"{:.2f}\".format(kdb_write_execution_time + kdb_read_execution_time) + s,\n", " ],\n", "]\n", "\n", "index_labels = [\n", " \"Click House\",\n", " \"InfluxDb\",\n", " \"Postgresql\",\n", " \"S3\",\n", " \"MongoDb\",\n", " \"DuckDb\",\n", " \"Kdb+\",\n", "]\n", "dff = pd.DataFrame(\n", " data, columns=[\"Write Time\", \"Read Time\", \"Total Time\"], index=index_labels\n", ")\n", "dff" ] }, { "cell_type": "markdown", "id": "7baf1fd1-2afd-41b5-a579-33f053e4ddfc", "metadata": { "tags": [] }, "source": [ "## Graph\n" ] }, { "cell_type": "code", "execution_count": 221, "id": "a9740731-6077-4bf1-bb65-b4c4225ac79b", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot(dark):\n", " mpl_style(dark)\n", " # plt.subplots(figsize=(16, 8))\n", " plt.figure().set_figwidth(14)\n", " x = np.arange(7) # change here\n", " width = 0.40\n", " y1 = [\n", " cHouse_read_execution_time,\n", " influxdb_read_execution_time,\n", " psql_read_execution_time,\n", " s3_read_execution_time,\n", " mongo_read_execution_time,\n", " duckdb_read_execution_time,\n", " kdb_read_execution_time,\n", " ] # change here\n", " y2 = [\n", " cHouse_write_execution_time,\n", " influxdb_write_execution_time,\n", " psql_write_execution_time,\n", " s3_write_execution_time,\n", " mongo_write_execution_time,\n", " duckdb_write_execution_time,\n", " kdb_write_execution_time,\n", " ] # change here\n", " plt.bar(x - 0.2, y2, width)\n", " plt.bar(x + 0.2, y1, width)\n", " plt.xticks(\n", " x,\n", " [\n", " \"Click House\",\n", " \"InfluxDb\",\n", " \"Postgresql\",\n", " \"S3 Parquet\",\n", " \"MongoDb\",\n", " \"DuckDb\",\n", " \"Kdb+\",\n", " ],\n", " )\n", " plt.xlabel(\"Databases\")\n", " plt.ylabel(\"Seconds\")\n", " plt.legend([\"Write\", \"Read\"]) # ver\n", " plt.rcParams.update({\"font.size\": 18})\n", " plt.title(\"Fastest Databases Comparation (Write/Read)\")\n", " plt.show()\n", "\n", "\n", "plot(dark=True)" ] }, { "cell_type": "markdown", "id": "aeda3a71-f57d-419d-98b4-b711ea2e61af", "metadata": { "tags": [] }, "source": [ "## Graph-(bests)" ] }, { "cell_type": "code", "execution_count": 220, "id": "810e8a81-0a20-40aa-bb07-7bb71094b8d2", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot(dark):\n", " mpl_style(dark)\n", " plt.figure().set_figwidth(15, 10)\n", " x = np.arange(4) # change here\n", " width = 0.40\n", " y1 = [\n", " cHouse_read_execution_time,\n", " s3_read_execution_time,\n", " duckdb_read_execution_time,\n", " kdb_read_execution_time,\n", " ] # change here\n", " y2 = [\n", " cHouse_write_execution_time,\n", " s3_write_execution_time,\n", " duckdb_write_execution_time,\n", " kdb_write_execution_time,\n", " ] # change here\n", " plt.bar(x - 0.2, y2, width)\n", " plt.bar(x + 0.2, y1, width)\n", " plt.xticks(\n", " x,\n", " [\n", " \"Click House\",\n", " \"S3 Parquet\",\n", " \"DuckDb\",\n", " \"Kdb+\",\n", " ],\n", " )\n", " plt.xlabel(\"Databases\")\n", " plt.ylabel(\"Seconds\")\n", " plt.legend([\"Write\", \"Read\"]) # ver\n", " plt.rcParams.update({\"font.size\": 8})\n", " plt.style.use(\"dark_background\")\n", " plt.title(\"Top 4 fastest Databases on Benchmark - Graph Comparation\")\n", " plt.show()\n", "\n", "\n", "plot(dark=True)" ] }, { "cell_type": "markdown", "id": "bcfa53b5-137b-4c26-91f2-740cc2e93df8", "metadata": {}, "source": [ "## Size" ] }, { "cell_type": "code", "execution_count": 225, "id": "e58920d6-2a99-4ce4-9503-05873d61ffc3", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/0AAAHkCAYAAABseU8aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACN+0lEQVR4nOzdd3QUVRvH8d/upif03kGq0ouAKIJ0kI4CUmKQJqAoYENEBRUVUVFReg0JvXcIvfcWkN47hJYO2c37By8rSzoJWbJ8P+dwdO/cuffZuTs7eXZm7hi88haOFgAAAAAAcDhGewcAAAAAAACeDpJ+AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgSPoBAAAAAHBQJP0AAAAAADgokn4ATyRwyzqN+u1ne4fxzGn/dksFnz+h/HnzJHqd/HnzKPj8CfXu3vkpRpZ2LJ3pp6Uz/VK0zeDzJ9S/T+8UbfOh/n16K/j8iSTVzZIpU4rG8FrVKgo+f0LNGjVI0XaRsgK3rNOsiWMSrPdwPF+rWiUVonp2xLYvxXasKVywgOb7TdKFQ3sVfP6EGtevI0mqULa0AubN1JWjBxR8/oRKv/RiqsX+PFs600/bA5baOwwA8XCydwAAni0vlSim/h/3VoWypZU9a1bdvH1LR46d0NJVqzV6kq+9w5OHu7s+6PaeWrzZUC8ULKD796N06MgRTfKfoWlz5qdoX69VraJls/5LPiMj7+nO3bs6euKk1mzYpEn+M3Tj5s0U7fNJpeZ2QcI++aCHjhw/rsUrAlK03bebN1G2LFn0z/hJKdpuUmTNnFmf9u6pOjWqK1/ePAoJCdXZCxe0ccs2/fzH3woNC7NbbMm1dtEcVSpXVh9/+bXG+/rbOxzEYfTvv6hAvrwaPPQ33bl7V3v2B8rJyUlTRv6lyMhI9R/0g8LCI3T+4kV7hxordzc3fdyjmzZu3a5N27YnWP9pHouKFy2ilo0byW/WHJ278GxuLwDJR9IPwKpKxfJaMsNP5y9d0qRpM3Tt2g3lyZ1LL1copx6dfWyS/go168lisaRqfNmyZtHi6b4qXqSwZi9crDGTfOXq6qpmjRpozPBhqlerpjp/2DfF4/pn/CTt2X9QJpNRWbNkVpWKFfRl3976oGsnefforQ1btlnrTpszX7MXLlZk5L0UjSE+9touT0uz9j72DiFJhv75t377Z5RNWb8P3teCpctTPOlv3ayJXixezG5Jf6aMGbR+yTyl8/LS1JmzdezEKWXOlFElXyyuzh3ba5yvf5pN+gsXLKBK5crqzLnzatO8qV2T/s3bdyhrkZd07959u8XwrHj8WOPm5qoqlSpo6J9/a8zk/45JxQq/oAL58uqDT7/U5Okz7RFqonm4u+vLvr015Lc/E5X0P5SUY1FilShaRF/27a2NW7eT9AMOjKQfgNWnH/bU3eBg1WzcQnfuBtssy5ols83re/dSL6l9aPTvv6h4kcJq17Wnlq5abS0fNXGKvh/wuT56v6sOBB7W7yMTvnw2Kbbs2KUFS5c/UjJepV4soQV+kzR19N96uXYDXb12XZJksVhSNeGX7Lddnpb799NWomM2m2U2m+0dRqrwbvO28ufNozrN39b23XttlqXz8tK9+6n/vZBS2rRsrmvXb2jAdz/Kd/QI5c+bJ1FJkIe7u8LCw1M0lujo6FT/HnlWPX6syZr5wbHozt27NuXZsmaRJN1+rDw5nsbYJkdSjkUA8Cju6QdgVahAfv177HiMhF+SbgTZXjr4+H2WwedPxPnv0fvbixV+Qb6jRujswV26fvyQ1i+Zp0Z1aycY28vly6luzdflN2uuTWL70Dc/DdOJU6f1cc9ucnNzlWR7r3yndm20f9Ma3ThxWOsWz1WFsqUTvV1iE/jvEX0+6HtlyphB3X06Wstju6e/fJlSmjd1os7s36FrxwN1cPNa/TPsxwT7+POn7xV08rCaNqgXZ50n2S6SZDAY1OO9d7Vt1RJdP35Ip/ft0FzfCSpfppTN+m1aNNPaRXN09dhBnTu4W8tn+6vW669Zl8d1r/zjn4+H2+XVKi/rjx+/09kDO3Xx8D6N/v0XZcyQ3mbd2O7pd3Fx0Zd9P9K+jat148Rh/bt9o7778jO5uLjEqPfjNwN0et8OXfp3n2ZMGK3cOXPGuf0edWb/Dv349Zc22+h84B7dPnNUGdKns5b36dFNt04fkaeHh6SY9yEHnz8hL09PtX+7lXUfePye5AwZ0mvUbz/rfOAeXTi0VyN//Unubm7xxrd0pp8a1KmlAvnyWtsN3LLOpo7RaNQnH/bQkR2bdP34IS2aNkUvFCwQo61K5cpqru8EXTi0V1ePHdSyWf6qWqlCgtuoUIH8ioqK0o49+2IsCw4JsUlUq1WupCkj/9LhbRusY/bjNwNsPoeSNOq3n3X5yH7lzZ1LsyaO0eUj+3V05yZ1fbeDpAe3HC2e7qsrRw/o0Nb1ert5kxh9Z0ifTj99M0D/bt+oGycOa9/G1erTo5sMBkOC7+mht5s30fyly7Vs9VrduRus1s2bxqjzcKyLFy2i8X/9pnMHd2vl3BnW5QntLw+98nJFrV00R9ePH9KBTWv0TqvmNssfv6d/2Hff6PKR/bF+RiaM+F0ndm+V0fjfn3R1a76uFXOm6crRA7r07z7NnjRWJYoVTdR2KJg/n6aM/EtnD+7S1WMHtWbBbNWvVTPW+Fo0bpSoz1tsXnm5otYtnqvrxw9p/6Y16tS+baz1Hv0u6d+nt/7dvlGS9MNX/a37wKjfftby2dMkSVNHj1Dw+RM23yGJOe5Yv6OqVtZvPwzSqb3bdWTHJuvyxGzTh5/lXDlzaNq4kbp8ZL9O79uhH776wjo++fPm0ZkDOyVJX/btbd2Xn3TOkbiORfny5NZvPwzSnnUrde14oM4e2KkpI/+yOTa1f7ulpo4eIUlaNsvPGsvDz92b9epo9qSxOrZrs26cOKz9m9bos4962XzWHlWudEkFzJtpPc691+Edm+XOzs4a0O8jbVgyXxcO7dWVowe0Ys40VX+laoy2WjV9UxuWzNelf/fp4uF92rZqiXq8965NncTu94lpC3B0nOkHYHXu4iVVrlBeLxYvqn+PHk/Sul1694tRNvDTPsqWNYtCQx9c7luiWFGtmjtDl69c1e9/j1ZoeLhaNm6kaeNGqkP3Xlq0fFWc7TesW0uS5D9nXqzLzWazZs5fpC/79lbVShW1btMW67K3mzWVl5enJk6dpujoaH3co5v8xvyj0q++oaioqCS9z0fNX7Jcf/8Srlqvv6bBQ3+LtU7WLJk132+SgoJu6rd/RuvOnWDlz5dHTRvUj7Ndo9GokcN+Ussmb6pd155asWZdnHWfdLv8M+xHdWj9llasWafJ02bKyclJ1SpX0svly2vvgUBJ0hcff6gB/T7Stp279cOvw3Xv3n1VKl9WNaq9ojUbNsXaX0KGffeN7ty9qyG//amihV9Ql47tlD9vHjV8u12c6xgMBs2YMFqvvFxRE/1n6NjxE3qpRHH16tJJRV4opHe69LDWHTF0iN5p1Vwz5i3Q9t17VaNaVc2ePDZRsW3btUfVqrxsfV3qxRLKmCG9zGazqlaqaB2HapUraf+hw3Fext6ldz+NGDpEu/fv10S/Bwnh6bPnbOpM/udPnT1/Xt/+PEzlSpWUT7s2un4jSF//+Euc8f3y1z9Kny6d8uTKqS8G/SBJCg0LtanTt2d3WaIt+nP0OKVPl04f9+iqcX/+qlpN37LWeb1aVc2dMkH7Dgbqp+F/yWKxqEPrVlo8farqv9VWu/cdiDOG8xcvycnJSe+0ai7/2bF/5h5q/mZDebi7abyvv27euqWK5crqfZ+OypMzp7x7fGhT12Qyae6UCdq8Y4cGDhmqNs2b6rfvv1VYWJi+/qyvZs5bqIXLVqpzx3c05vdftGP3Xp09f0HSg/ujl83yV+6cOTTBb7rOX7ykqhUr6NsvPlGO7Nms2yo+lcqVVZFCBdWz3+e6f/++Fi1fqdbNm2rYiJGx1vcd+ZdOnjmjQUN/tSYYid1fXihYQL6jRmjKjFnynz1PHVu/pVG/DdXeg4d05Fjs37tzFy1Rd5+Oql/7Dc1fssxa7u7mpoZ1aslv1lzrJfBtWzbX6N+HKmD9Rn095Bd5uLupc8d2Wjlnul5r2DTeqxeyZc2igHkz5e7urlETJ+vmrdtq91YLzZgwWh3f/yDGd3RiPm+xealEMc33m6QbQTf14+9/yuRk0oC+H+najRvxrrdw2QrduXtXP3/7lWbOX6iVa9YrNCxU164H6dKVq/r0w57WS+AftpXU487v3w/SjZs39dPwEfL0cE/yNjWZTJo/daJ27d2vAd//pDdee1W9u3fRqbPnNN7XXzeCbuqj/gP1x4/faeGyFVq4bKWkB8n7k4rtWFShbBlVqVhesxcu0aXLV5Q/Xx517thOS2f66eVaDRQeEaHN23fqn/GT1LOzj3756x8dPX5SknT0xIMfMdu/3VIhYWEaMXaCQkLDVKPaKxr4SR+l9/LSVz/Y/pCZMUN6zZk8XnMXL9WsBYvUskkj/fHjd7p//758Z8yWJKX38tK777TW7AWLNWnaDKXz9JR327c1f+oE1WzSSgcP/ytJeqP6q5r09x9au3Gz9TuxeJHCqlqpokZOmCwp8ft9YtoCngck/QCs/hw9TnOnjNeW5Yu0e98BbdmxU+s2b9WGLdsSTI5nzFtg8/qj7l1UIF9edf3oEwXduiVJGvrtV7pw6ZJqNG5pvWRz7OSpWjV3hgb3/yzepL9E0SKSpMD//1EQm8B/HywrXqSwTdKfL08ulXu9jm7feXDZ5/FTpzVjwmjVqVFdy1evjfd9xScqKkonTp1WoQL546xTtVIFZc6YUc3b+1iTaUn67pffY61vMpk07s9f1ahubbXp3D3B5PpJtkv1V6qqQ+u39M/4Sfr82++t9f4aM976/y8ULKAvPv5AC5etUIfuHyg6OvrBgonxhpOge/fvq3Fbb+vn6fyFi/r+qy/UqG7tWK9UkKTWzZvqjdeqqeHb7bR1525r+eGjx/TnT9+rSsXy2r57r0q9WELvtGquMZOnqt9X30p68Pka9+eviZrFe8uOnRr0xafy8vRUSGioqlWupLPnL+jajRuqVvllrVizTgaDQVUqVZTfrDlxtjNj3gIN/3Gwzpw7H2O/eOjAocPq9Wl/6+vMmTLKu+3b8Sb9azdu1uUrV5QxQ/o423VzdVW1Bk2st0jcvnNHvwz+2uaHvD9+/E4btm5Ty47vWdeb4DdNOwKWaeCnfdU8njkVpsyYpV5dOmn077+ob8/u2rhtuzZv36mVa9bpbnCITd2vfxyqiIhI6+uJ/jN06sxZffN5P+XNnUsXLl22LnN3c9OMeQv0698P5kaYNX+hju3aon+G/aROH3ysuYuW/n8bbNKe9avU7q2W+vH3PyVJH3R7T4UK5NdrDZrq5JmzD/rym67LV6/po/e76K8xE3Tx8n99xaZNy2Y6f/GS9fM1e+Fiebd9W6VfetGaiDzq4L//qvOHfa2vk7K/FCtSWPVbtdWWHbskSfMWLdW/2zeqY+tWGvD9T7HGt2XHLl28fEWtmrxpk/TXr/2GvDw9NXfREkmSp4eHhg4aqMnTZqr3F19Z6/nNnqs961bpkw962JQ/rm+v95UjezbVa9nGui0m+c/Q1pWLNWTgl1q8IuC/96bEfd5i81W/j2UwGFS/VVvr52Dh0hXatmpJnOtI0qEjRxUcEqKfv/1K+wMP2ewHLi4u+vTDnjEugU/qcefWndtq3Laj9UeUpG5Tdzc3zVm0REP/+FuSNGHqNG1cukDebd/WeF9/hYWHa8GS5frjx+8U+O/ROPflpIjtWLRizdrHbgWQlq1aozULZ6tZowaaPne+zpw7ry07dqlnZx+t2bA5xvwC733Yx2YfnjB1mm7dvq0u3u01+JffbW69yJ0zp/oPHqIRYyc8qOs3XWsXztG3n3+iaXPmKyoqSrfu3FHJV2ra3MI1adoM7V67Uu938rZ+J9avVVN37gareYdOcc5Fk9j9PjFtAc8DLu8HYLV242bVbv62lq5arVIvlVCfnt21wG+Sju3cnKhL8B+q/kpVffvFJxo5YbKmz50v6cEEYDVefUVzFy9VOk9PZcmUyfovYP1GFXmhkHLlzBFnm16enpKk4JDQOOs8XJYunZdN+ZxFS60Jv/QguZMeXMaaXKGhYUr3/9hic/vOg1slGtSuJSen+H9ndXF2ke+ov9Sg9htq5d0lUWfTn2S7NGtUXxaLRT8N/yvOdRrXryOTyaSfho+w+SM/uSb5Tbf5AWmcr7/u37+vem/UiHOdFo0b6uiJkzp24pTN52bD5q2SpOrVHlwa+vAS5FGPnb1J7KR3W7bvkpOTk6r8/zL3apVf1pYdu7R1xy5Vq1xJkvRS8WLKlDGD9TP0pMZPtZ0kbsuOXcqSObPSeXnFsUbiTJ052+YP6oeJZaH8D5KBMiVfUpEXCmnW/IU229LT3UPrN2/Vq5VfjveS+Os3gvRK/cYa5+unjBkyqEvH9po4YrhO7d2hzz7qZVP30WTBw91dWTJl0vbde2Q0GlW2VMkYbU+e9t/ka3fuBuv4ydMKDQuzJvzSgx/sbt2+Y7Pvtnizobbs2KXbd+7avKe1mzbLyclJrz5y9UZsTCaTWjV505o4S9L6zVt17foNtWkR8xJ/6UHy86ik7C//Hj1uHRdJunHzpo6fOpXg99G8JctUr1YN620lktSqyZu6ePmKtb1ar7+qTBkzaNaCxTbbwmK2aNe+/dZ9JS7136ihnXv32fy4FhoWpkn+M1Qwfz6VKFbEpn5Cn7fYGI1G1a5RXYtXrLL54efoiZNavX5jvPEl1ZMcdyb5z7BJDp9km07wtf18bNmxM0WON/F5/Fj06P7n5OSkzBkz6tSZs7p1+47Klo65/8Xm0Ta8/r/9tuzYJU8PDxUr/IJN3fv379vsF/fv39cEv2nKni2rypd+cNuYxWKxfl4MBoMyZcwgJ5OT9h44aPOdcOdusDw93GO9NeahxO73iWkLeB5wph+AjT37D6p9t15ydnZW6ZdKqEmDeurVpZN8R/2lag2a6ujx+J9HnjtnTk3+5w9t27VH/QcPsZa/ULCAjEajvv60r77+tG+s62bLkkWXr1yNdVlI6P8TVy/PWOcceLhMkkIeS4AvXLxk8/rhDwAZM2SI970khqenh4JD4064N23brvlLluvLvr3Vq0snbdq2XYtXrNLM+YtiTFDVt1d3pfPyUouO7yV6Rucn2S6FCuTX5avXdOv2nTjbLVQgv8xms44kMN5JdeL0WZvXoWFhunLtuvLnyxvnOoULFlSJYkWs98E+LluWBxN45cuTW2azWaceu5T++MnTiYptX+AhhYaFqVrlSlq9fqOqVa6kIb/9oavXb6i7j7dcXV2sl/9v3bE7gdbidz7GZ/LBWGTMkF7BISGxrZK4di/F3a4kFS5UUJI0ZviwONvIkD6dzY9kj7t67br6fPmN+nz5jYoUKqjaNaqrT8/uGvhJH129et06c3re3Ln01Scfq2Hd2sqcMaNNG+kf+2EuPCIixiPH7gYH69LlKzH6vxscrEyP7LuFCxVU6ZdejPvz8f8J3uJS+/XXlC1rFu3ad8DmfvQNW7fprWZNNHDI0BiJ/JlzF2xeJ2V/eXyMpAffSQl9H81duEQfdOmkRvVqa9b8RfL08FC9WjU0wW+6tU7hggUlSUtnTo21jbi+Ix7KlyePdu7dH6P86IkHl33nz5PH5gx+Qp+32GTNklke7u46efpMjGXHT51W/dpvxBtjUjzJcefhbSMPJXWbxvZZvn3nbox9IKU9fixyc3NVv17vq0Prt5Q7Zw6b+/AzpEvcj4slihXV15/20evVXrGZ10RSjNeXr16LMenhiVMPvnvz58ujnXv3SZLavdVCH3brrGKFX7CZk+XRW6DGTpmqlo0baZ7vBF28fEVrNmzU3MXLFLBug7VOYvf7xLQFPA9I+gHE6v79+9qz/6D27D+oE6dOa9RvQ9XizYbxnh12dnbW1NEjFHnvnrx7fGgzo7nR8OAPjj9GjVVAHGdzTp05G2u59OCPziZ6cJ/15u2xH+RLlighSTH+8DZbYp9ZPSmTfMXGyclJRV4opMNHj8Vbr+P7H+jl8uXUsG4t1a5RXSN//VkfduusWk3fsrkvfPX6TapTs7o+fr+rNm7dlqjZu5OzXZ4mk8mUYm0ZjQYF/nvE5kekR128FP+l24kVFRWlXXv369UqL+uFggWUM0d2bdmxS9du3JCzs5MqlS+napUr6ejxE0/8TOyHLObYLzNN7mfSnEC7RuOD/w74/kcdOBT7LSEhoYl/5N6J02d04vQZrVizTvs2BKh1i6aaPH2mjEajFvpPVqaMGTX8nzE6dvKUQsPClDtnDo3+/ZcYE4HF9fQDcxyX4z66mYwGo1Zv2KThcTyd4mHiEZfW/z+b7zsq9u+216pW0catto9Ci4iIiLfN+FjieK8Jjf3Ovft05tx5tWzcSLPmL1LDurXk4e6uuQv/u0Lh4Xbt0rufrl6POYt7VFTKPmUioc+bvT3JcSf8sbFN6ja1x5M8YjsWDRv8jTq0bqV/xk/S9t17dTc4WNHR0Zr09/A4J+J7VIb06bR8lp/uBofoh1+H6/TZc4qIjFS5UiX13YDPZTAk/WLhNi2aafTvv2jR8pX6Y9Q4XQ8KktlsVr9e79vcmnAj6KaqNWiiOjWqq+4bNVS35uvq2OZt+c+aq+59P5OU+P0+MW0BzwOSfgAJ2nPgoCQpZ/Zs8db7ZdBAlX7pRTV4+x1dvxFks+z0uQe/4t+PirK53z6xlges0Scf9NA7rVrEmtwajUa1bt5EN2/f1rZdyTsLm1jN32wgD3f3RF2SunPvPu3cu0+Dh/6mt5s30YS/ftdbTRvbPE965969Gj/VX7MmjpXvyBF6p2uPBP+AfJLtcvrsOdWpUV2ZMmaI82z/6bPnZDKZVKJokVjvaX7o5u3bMc74ODs7x/lZKVKogE0C5enhoZzZs2llPJMVnj57TqVeejHBz835i5dkMpn0QoH8Ov5Iole0cKF413vUlh271KdHN9V8rZpuBN20nuH899hxVatcSdUqV9LygITngUjJWyJs203e+g/PpgUHhzzRfhiXM+fO6/adO9ZxL1miuIoWfkHdPn5wP+9Db1R/NcX6fOj02XPy8vB4ovfj4e7+YIbyhYs1f8nyGMt/GTxQbVo0jZH0xxZDYvaX5Jq3eKl6vOejdF5eatXkTZ05d956BlWS9SqX60FBT7Q9zl+8GOv+8vBS7nMXk/8c9xtBNxUWHm696uRRRV9I/L6aGMk97kjJ36axSenvh9iORc0aNZD/7Ln68rv/nhTj6uqiDOltr8KIK5bqr1RRlsyZ1b5bL5tjS8F8sd+mkCtH9hiPOCzy//E8d/6iNc5TZ8+pXdeeNusO6PtRjPbu37+vZQFrtCxgjQwGg37/YZA6d2ynn//8W6fOnE3Sfp9QW8DzgHv6AVjF9tgcSar/Rk1JskmkHtehdSt17thO/b76NtbZv28E3dSGLdv0Xvu2yhFLQvjw2ctx2b57r9Zs2KQOrVupQSyXf37zWT8VLfyC/hg51uY+xKel1Isl9PM3X+nm7dsaMzn2yz6l2C9zfXiG1cXVJcaydZu2qNMHH6lOzeoa+8ewBM+YPcl2WbB0hYxGo774+MMY9R9avCJAZrNZX3z8QbwxnD57Tq9WqWxT1qld2zjnL/Bpb7usS8d2cnZ21qp4LrWcu3ip8uTKqU7t2sRY5ubmKg/3BzNsr1y7XpL0/mOPYurZ2SfOth+3ZcdOubm5qldnH23dueuR8l16p2Vz5c6Z0+Z+7LiEhYXH+OM6JYSGhyl9unQJV4zD3gOBOnnmrHp372Jzb/hDCe2HlcqVtW7vR1UsV0ZZMme2fkc8vLrm8c9Oz6fwmKy5i5eqSqUKql2jeoxlGdKni/eqkyYN6snL01NjJ0/VgqXLY/xbHrBWTRvWj/FoyMcldn9JrjmLlsrNzVXt3mqhOjVe17zFS22Wr16/UXfuBuuTD3rEug8mNL4r1q7Xy+XLqXKF8tYyD3d3+bRvqzPnzuvIseRfLWSxWLR6/UY1rl9XeXPnspYXL1I41jFMjuQed6Tkb9PYhEU8SIwf/8H0ScR1LLJYzDE+i+/7eMd4Dw+T9IwZbGOxXsXxSBvOzs7q4t0+1jicnZ1tHtHn7Oys99o/OAGw92Dg/9uM+b1QqVxZVa5Y3qatx2+FiI6OVuCRo5Jk3RcTu98npi3gecCZfgBWw777Wu5ublq8YpWOnTglZxdnValY3npGaerM2bGulyVTJv32wyD9e/S4Iu/dU5sWzWyWL1q+UmHh4er71bdaOXe6tq9aokn+M3Xm3Hlly5ZFVSqUV+5cOVWtfsznbz+qW59PtXiar6aPH6WZ8xdp646dcnFxUdOG9fV6taqavXCxho9K3OPZkqJa5Upyc3WVyWRU5kyZVLVSBTWqW1t3g4PVrmtPXbse92Om2r3VUl2922vR8pUPzkx4ecnnnda6czc4zrPbi1cEqEe/LzRm+C8KDg7RR/0HxhtfUrfLxq3b5D97nnp29lHhQgUVsG6DjEajqlWupA1btmvMZF+dOnNWv/z1j774+EOtnDNdC5evVGTkPVUsW1qXr17Ttz8/uCd88rSZ+vOn7zV19Ait2bhZpV8qodqvV9eNoNgvf3dxdtbi6VM0d9EyFS1cSF2922vLjp1asjIgzvc3bc58tWzcSMN//E7Vq1XVtp17ZDIZVazIC2rZuJGad+ikvQcCdfDwv5o5f6G6vdtB6dOl0/bde1Tz1VcS/dxwSdqxe6/u37+vYkUKa6L/f89f37x9h7r+/4/dxEzit+9goGq+Vk0fdH1Pl69e1dlzF7RrX8x7pZNq34FAvdW0sX78+kvt3n9AoaFhWhawJtHrR0dH64NPv9Rc3/HasXqZps6co8tXripXzhx6vVpVBQeHqPV73eJcv22r5mrdvKkWr1ipvQcP6f69+ypetLA6tH5L4RERGvbXg0fcHTtxSifPnNUPX/VX7pw5dTc4RM0a1Y/3Xu8n9ceosWpUt7ZmTRwjv1lztfdgoDw9PFSyRDE1a9RApV6paX2CyONat2iqoJs3tW3XnliXL121Wp3at1WDWjW1cPnKOGNI7P6SXPsDD+nE6TP6+rN+cnNz1ZxFtkl/cEiI+gz4WmOHD9OmZQs0e+FiBQXdVN48uVW/1hvatmu3Phk4KM72f/t7lN5u2lhzpozXqImTdev2HbV7q6UK5surDt17pdgZ6h9+/UN1ar6uFXOma9wUP5mcTHrfx1v/HjueqCdtJEVyjzvJ3aaxiYiI1L9Hj6tVkzd14vQZ3bp9W4ePHkvwUblJORYtD1irti2b687dYB09fkKVK5ZXzddeVdBjtyYdOHRYUVFR6tOju9KnS6fIe/e0fvNWbd+1Rzdv39bo34Zq1MQpio6OVtuWzRXXb1qXrlxRnx7dlD9vHp04dUatmjZS2VIv6cPPBlgnb12+eq2aNWqgaeNGasXqtSqQL5/e6/COjhw/YfMj5IhfhihTxoxav3mrLl2+onx5c6u7j7f2Bx62ziuU2P0+MW0BzwOSfgBWA77/SS3ebKh6b9SQT7s2cnF20flLlzR2ip+G/vl3nJNAeXp6yN3NTS8WL6pxf/4aY3nJV2ro3IWLOnr8hGq82UL9P/5Q7d9uqcyZMup60E0dCDysn4aPSDC+q9euq2aTlvqwW2e1aNxQzRrVV1SUWYf+PaLufT5N8LnhT+rhmeJ79+49+APqxEkN+e1PTfKfkeC93Zu27VDFcmXUqmljZc+aVXeDg7V73wF17t03xoRRj5oxb4G8vDw1fMhgBYeExHgm8qOeZLv06Pe5Dh05Iu82b+v7AV/obnCw9hw4qO27/0t+fvj1D509f0Hdfbz19ad9FRYRrkP/HtW0/z+RQXow03XBfPnk3fZt1an5urbs2KVm7X20aNqUWGP9ZOAgtW7eVAM++UjOTk6atWCxPvtmcLzbMDo6Wm279NAHXTrpnbdaqEn9egqLCNeZc+f1z/jJOnHqjLVuz0++0I2gm2rToqka16+jDVu26a13u+rozoSfhCA9OOu1/9BhVSpXNsaZfunBLQSPT8IXm/6Dh+jPn3/QwE/7yMPdXX6z5qRI0j92ip9Kl3xR7d9upQ+6vqez5y8kKemXHkwuWbvZ2/r8o17q7tNBnh6eunr9unbt2x9jVvrHTfCbpvDwcNV4tZrerFdH6by8dOPmTa3ZsEm//j1KBw4dlvRgfoQ2nbpp6KCB6turuyIj72nR8pUaPck3wceyJVV4RIQavt1On3zYQ83fbKh3WrVQcEiITpw6rSG//ak7wbF/b2XNkllvvFZNsxYsjvNRXus2b1FoWJjatGwWb9IvJW5/SQlzFy3RZ7176cTpM9ofeCjG8lnzF+nylWvq26u7PureVa6uLrp05aq27tgZ5w+3D12/EaQ6LVprcP/P1N3HW25urgr894had+qmFfHcgpNUh44cVYsOnTTk6y81oN/Hunjlin747Q/lzJ49xZP+5B53pORt07h88NmX+uW7r/XT1wPk6uqiIb/9mWDSn5Rj0Wfffiezxaw2LZrJ1dVF23btUdN3vDVvqu1zJK9dv6GP+3+tvh+8r79/+VFOTk5q+HZ7bdq2Xa19umrIwC818NM+un3njmbMXaB1m7dqgd+kGLHdvnNX3ft8qmGDv5FPuza6dv2G+n71rSZN++/H06kz5yhHtmzq1L6tar9eXUeOn1DXj/qpReOGeq1qFWu96XMXqFP7turq3V4Z0qfX1evXNXfREg35/U/rD0+J3e8T0xbwPDB45S3MJx4A8FS1f7ulRv02VK+/2Vx7DwTaOxwAAIDnBvf0AwAAAADgoEj6AQAAAABwUCT9AAAAAAA4KO7pBwAAAADAQXGmHwAAAAAAB0XSDwAAAACAgyLpBwAAAADAQZH0AwAAAADgoEj6AQAAAABwUCT9AAAAAAA4KJJ+AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgSPoBAAAAAHBQJP0AAAAAADgoJ3sHkNYZjUZlyZxJ4eERio6Otnc4AAAAAAAHZzAY5O7upqCbt2SxWOKtS9KfTFkyZ9JbTRvr1JmzCo+ItHc4z5ySJYrp0JFj9g4DycAYpm2MX9rHGKZ9jGHaxvilfYxh2scYxuTu5qoC+fJq3pJlun4jKN66JP3JFB4eoZOnz+rQkaMKCw+3dzjPHDdXVx08/K+9w0AyMIZpG+OX9jGGaR9jmLYxfmkfY5j2MYYxebi7637UfYWHRyRYl6Q/maKjoxURGamw8HCFhoXZO5xnTkRkJNsljWMM0zbGL+1jDNM+xjBtY/zSPsYw7WMMYxcREZmoW8yZyA8AAAAAAAdF0g8AAAAAgIPi8v4kMBqNMhgMNmUmk0lGoyGONQAAAADH9+Bv4mfzfKKTySRnZ2d7h4FkeN7H0GKxyGw2P/H6JP1J0NW7vbr7dLQpMxgMCli/UfsDD9spKgAAAMB+TCaTCuTNI1dXV3uHEqs8uXOpyK1b9g4DyfC8j2FkZKTOXrj4xIk/SX8SjJ3ip3G+/jZlnh4eqlC2tJ0iAgAAAOzLaDTK1dVVUVFm3Y+Ksnc4MUTeu8ejtdO453kMnZ2c5OrqKqPRSNKfGiwWS4wys9ksiyXhGRMBAAAAR3Y/KkpRz2DSbzabn8m4kHjP+xg6OZmStf6zeeMNAAAAAABINpJ+AAAAAAAcFEk/AAAAAAAOinv6AQAAAKQ4Y66KT70Py+XdKdbW3CnjNHzUWG3Ysj3F2nwWdO74joq+UEhfDBryROv/PmSQjh4/qVETp6RwZE8mZ/bsmuc7XnVbtlVIaGic9XLnzKFls/z0WsNmCg6Ju97z4JlP+tu0aKamDeupyAuFtHn7TvUd8I0kKWeO7JozeZxNXRdnF23avl19vnxQZ8zwYSpb6iWbSR+atffRjaCbqfcGAAAAANhdgXx51a9Xd5Up+ZKcnZ10/UaQFixdoYn+MyRJLb27PLW+27ZsptbNmyh3rpwKCwvXhi3b9OeY8bp56/ZT6/Oh8b7TnnofKWXwl5+qUZ1aunf/viyWaN28dUs7du/V9j17rXWuXLumV+o3SfG+x/35q9Zu3Cy/WXOTvG6lcmU1/q9ftfdAoHx6fWwtd3Z2VsC8GcqYIb31x4f3O3mrq3d73bt3T5J0NzhYC5at0D/jJ6fUW4nhmU/6rwcFaewUP1WpWEE5smezll+5ek2vNmhqfe3k5KSVc6dr5Zr1Nuv/MWqs/GfPS7V4AQAAADx7Rgz9QctXr9Nn33yve/fvq1D+fHqhYIGn3m/fnt1Ur1ZNfT1kqPbsP6isWbKob6/umvT3cLXr2ives9XPoxnzFuqXv0ZKkvLkyqkOrVtp8Bef6sSpMzp99pydo4tbSGiocufMofx58+jchYuSpDdeq6abt24pY4b0NnU3bN1mPVGdP28ejf/rV505d15LV615KrE98/f0r9mwSes2bdHtO3firffGa9VkNBq1esOmFOnXaDTKZDIl6p/RaEiRPgEAAACkvIwZ0it/3jyavXCxIiIjZbFYdPLMWa1at8FaZ+nMqXqjejVJ0rRx/2jrikXWf3vWrdD7nbwlSe7ubur/8QdaPttfaxfO0vcDPpeXp2es/ebNnUsdWrdS/0FDtGPPPkWZzbpy7Zr6D/5B0dHR6tC6lbXui8WKauzwX7RhyVytXTRbX3z8gSSpacN6mjFhlE27MyaMUtOG9WyWf9jtPa1fPFfLZ/urdfP/To6+38lbvw8ZZH2dOWNGDRnYXwHzZ2jVvOn69MMecnZ2ti6vXaO6Fk2brE3LFujrz/rKyRT/4+JeebmiZowfpU3LFmj6+JGqUrGCddngLz/V15/11c/fDtCWFQu1wG+iKpUrG297j7p4+Yp+/uNvnTxzRj3ee1fSg8v2928MUDqvB9u8aqUKmjVpjLasWKg1C2ZpQL+PYm2r9EsvatXc6ar9+msJ9lupXFltXDpfLRo31IrZ/lq/eK4+7tE13nUslmgtXhmgZo3qW8uaNaqvBctWxLveuQsXtffAIRUuVDDBuJ7UM3+mP7Gav9lQS1ettl4m8VAX7/bq5tNRl69cld+sOVq8IiBR7XX1bq/uPh0TrGcwGBR45Kh8p89WRGTkE8XuyEqWKGbvEJBMjGHaxvilfYxh2scYpm2MX8KcTCblyZ1LkffuyWw2W8svmjM/9b7zZCuVYJ1ihV+QJF2+clW///Ct1m3eqlNnziro5i2beq4uLnqhQAHdvnNXQ//8x1peomgRfdC1ky5duaLyZUqpZ+d3ZTZb9N0vvyvKbNZ77dvql8Ffacxkvxh913ytmm7fuSsZpPJlbGM9cOiw6tSsru279yhjhgwaMvALzV6wWGOn+MlgMKhg/nwqX6aUCuTLKw93d5v1PdzdVSBfXuvyoi8U0vGTp9Rv4CAVzJ9Pn/R6XwajdOzEKeXKkV0Z06e3rj/wk491/NRpDfjuJzm7OOuDLp309acfa+7iZcqRPZu+//Jz/T1uog4c/lc1qlVV80b1dfPW7RjxS1L2bFn1/ZefafSkqdp7MFAVypbWX0O/14Dvf9KNoJvKkimTKpYtoz9Gj9OMeQvVuH4d/fztAH3y9eBYxypLpkxyd3WL0de5C5f0WtXKKl+mlLJmfvC5KlPyJYWFh+unbwZo1oJF2rJjl1xcXJQ/T+4Y9Yq+UEg+7dpo1MQpunk79veSztNTeXPnUvkypVS0cCF5eXqoaqWKGjhkqLJmyaJvP++rq9eu68jxEzHWLVq4kJxMJh0/eVqf9e6pzdt3KkP69CpT8iVr/vkw3sfHI1eOHKpcoZwOHzkaa1wmk0muLi7KkimToh7Zv9xcXRUSGhLrdnycQyT9OXNkV5WK5fXHqLE25SPGTtCpM2cVHhGhyhXK6edvByo0LFxrN25OsM2xU/w0ztc/wXqeHh6qULa09gceVmhY2BO/B0e2bVfKTbAC+2AM0zbGL+1jDNM+xjDlZClRO1X7yxCeTsdDMqZqn0FHVqdqf8nl7OysIrduKTwi0mYuLWMu16fe97XLgYmqt/dAoNp3/0A+77RWg1o1VTB/Pp05f0FD//hb23btkSRF3runU2fPau+B/9oskC+vuvl0UP/BQ7Rhy3ZlyphBFcuWUY3GrRQc8iDhunzlquZOGadenw6QxWKx6bdi2TK6ePmKTZsPFXmhkMqWKqm9BwLVqV0bBR4+ol//Hm1dvn33g/vY8+XJrbDwcJs2wsLDdfb8Be09EPj/5RH69qdfFWU2a9fe/SpepLBKFC2iGXMXqkrFCkqfPp32HghUyRLFlSVzZrV6t6uio6MlSVH3o/TVJx9r4JBf1O3d9tq2a7d1noPd+w6o+itVdPnqtVjfQ5eO7bRjzz5r3rR73wFVLFNa+fPm0aq1GxR065bWb9mqaXPmS5IuXLykVk3e1Kkz53Tn7t0Y7QXduqXg4JAYfZV+6UXVq1VDew8EKnfOHJIe/GgSHBKq8IgIWSwWnTl3Xrdu39H2/4/nw3qFCuRX21bN1fXjT3T85OkYfT4UHBqqC5cua++BQJmMD65u+ObHX6wndps2rCdnJ6dYt4PJaFKU2axlAWvUpmVTubu56YWC+bV0ZYD2Bx6yibdKxQp6s34d/fnT9zKZjPL08NDq9Rs1ddZcm/3nIScnJ7m7uerE6TO6f/++tdzTw0MvFisS5/uxaSNRtZ5xzRrW19ETJ3Xs5Cmb8gOHDlv/f+vO3ZqzcLHq1aqZqKT/8R02LmazWRZLdNICBgAAAJCqgm7e0q9/j9avf49W+nTp1NW7nX7/YZDqv9VOd4ODY9TPkD69Rgz9QWMn+1ln9M+dM6dMJpOWzpxqU9diiVbWzJl07UaQTfntO3eULWuWWOPJniWLbt1+cAtzrpw5rPeBP4nrN27YnAW+fOWqKpYrE6Ne7pw5lM7LUxuW/DfnmcFgkMn44K7vbFmz6vLVazbrPP76UTmyZ9OlK1dtyi5cuqwc2f6bi+3RSdTDIyIkSZ4e7rEm/XHJlDGD7t6NOUaS1GfAN+rasb0W+E3U5SvXNH7qNK1c+988b53atdH8pcvjTfhjExIaZnMld3hEhDw8PBJcb8HSFWr+ZgMVL1JYn3/7Q6x1Nm79b/L59OnS6at+H+n7AZ898RMWEpLmk36DwaCmDetrov/0BOtGi+QcAAAAeN7dDQ7WyAlT5N32beXJlTNG0u/k5KTff/hWW3bsspkU/Mq1azKbzarbok2ibu3dvnuvvuzbW+VKl9S+g4es5UajUXXfeF0r1qyT9CBJf6Vy7I84DAsPl7ubm03Zw0vXH8qWNaucTCZr4p8zR3Zdu3EjRltXrl3Xzdu3Vad5m1j7un7jhsqUfMmmLGeO7Dpw6N9Y61+9dj3GJem5c+XU7v0HYq3/pF4uX1a79u6PddmRYyfUb+AgGQwG1ar+qoYOGqhd+/6r2+vTL/XbD9/qbnCIJk+bmaJxxWbF6nX69MMeunDpsv49dtx6xUFc7gYHa/HKVfrpmwFPLaZnfiI/o9EoFxcXmUwmGQySi4uLnJz++62iaqUKypghvZYHrLVZL52Xl16tWllubq4yGo2qXKG8WjVtrNXrN6b2WwAAAABgR+m8vNSrSycVzJ9PRqNRbq6u6tjmLd2+c1dnzp2PUX/QF/0UHhGhn//426Y86OYtrd24Rf37fGidkT1L5kyqVf3VWPs9f/GS/OfM15CB/VWpXFk5mUzKkT2bhgz8Qs7Ozpo688Hj4ZasWq1SL5bQ280ay9nZWW6urtZk+ujxk8qT68G95iaTUT7tWivDY7PBu7u5qZtPBzk5Oan0SyXUqG5tLV0Z8zaRQ0eO6urV6+rVpZM83N0lSblyZNerVV6WJK1Ys15VKpZX9VeqyGQyqmWTRiqQN2+c23XFmnWqVL6sar5WTSaTUbVff00VypbW8oB1ca6TFLlyZNcnH/ZQ4YIFNXLilBjLnZyc1Lh+HaXz8lJ0dLT1lguz+b+rti9evqzOH/ZV6+ZN9F6Hd1IkrviEhYerS+9P9OnX3yWqvpenpxrVrZ3kKxGS4pk/0//4hHrbVi7Wrn0H1O3jTyQ9mMBv9fqNMR514eRkUvd3O6rQ1w9+Mbl85ap+HTFKAY/M0AkAAADg6bBcfnbmsoiKilKObFn09y9DlDljRkXeu6cjx46r16f9rZecP6px/bqKiIzU5mULrGXjpvprvO80DRwyVD07vyv/MX8rQ4b0Crp5SyvWrNeaOG4hHvbXSF26fEUD+vVW7lw5FRYWpo1bt8u7R29rknrt+g11+/hT9e3ZXb27d1FU1H0tC1irvQcCdf7iJQ0fNUa/fveNDEaDps2ep5Onz9j0ceL0aZlMJq2eP1MREREaMXaCdsZyZtxisejDz7/Sxz26aP7UCfL09NCVq9c0e+ESbd6+U2fPX9CA73/W5x/1UsYMGbRq3Xpt2bEzzu16/uIl9R3wrXp376wfvvpcFy5dVt8B3+ri5cuJGZZYtWnRVC0aN1R0dLRu3rqtHXv26ZufhsX5uL6GdWrp0w97ytnZSVeuXlP/wUN05+5deXq4W+tcvnpN733YV+P+GCYnkzHWSRdT0uGjx+Jd/vorVbV1xSJJD+aS2HvgoL787senFo/BK29hrnlPBk8PD1UsV1YHD//LRH6xqFqpIpMXpXGMYdrG+KV9jGHaxximrNSeyK9SycLadehkqvaZJifyK1QwxkR+z4ryZUrFOvmao2jasJ7av91Sbd57396hPDWOPobxSWgiv8RMKP/MX94PAAAAAACeDEk/AAAAAAAO6pm/px8AAAAAELuFy1Zq4bKV9g4DzzCS/iQwGo0yGAw2ZSaTSUajIY41AAAAAACwH5L+JHj8SQKSZDAYFLB+o/YHHrZTVAAAAAAAxI6kPwnGTvHTOF9/mzJPDw9VKFvaThEBAAAAzwZnp2cztTCZTHJ6RmND4jzPY5gS+9XzueWekMViiVFmNptlsfDUQwAAADyfLBaLIiMj5erqKicnk73DicHVxUXubq72DgPJ8LyPYWRkZKy5aGKR9AMAAAB4YmazWWcvXJTR+Gw+GCxLpkw6cfqMvcNAMjzvY2ixWGQ2m594fZJ+AAAAAMliNpuTlZQ8TVFms+7fv2/vMJAMjGHyPJs/xwEAAAAAgGQj6QcAAAAAwEGR9AMAAAAA4KBI+gEAAAAAcFBM5JcERqNRBoPBpsxkMsloNMSxBgAAAAAA9kPSnwRdvduru09HmzKDwaCA9Ru1P/CwnaICAAAAACB2JP1JMHaKn8b5+tuUeXp4qELZ0naKCAAAAACAuJH0J4HFYolRZjabZbFE2yEaAAAAAADix0R+AAAAAAA4KJJ+AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBB8ci+JDAajTIYDDZlJpNJRqMhjjUAAAAAALAfkv4k6OrdXt19OtqUGQwGBazfqP2Bh+0UFQAAAAAAsSPpT4KxU/w0ztffpszTw0MVypa2U0QAAAAAAMSNpD8JLBZLjDKz2SyLJdoO0QAAAAAAED8m8gMAAAAAwEGR9AMAAAAA4KBI+gEAAAAAcFAk/QAAAAAAOCiSfgAAAAAAHBRJPwAAAAAADopH9iWB0WiUwWCwKTOZTDIaDXGsAQAAAACA/ZD0J0FX7/bq7tPRpsxgMChg/UbtDzxsp6gAAAAAAIgdSX8SjJ3ip3G+/jZlnh4eqlC2tJ0iAgAAAAAgbiT9SWCxWGKUmc1mWSzRdogGAAAAAID4MZEfAAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBBPfMT+bVp0UxNG9ZTkRcKafP2neo74BvrsjHDh6lsqZcUFRVlLWvW3kc3gm5KejCz/oB+H6n6K1UVGRmp6fMWaNwUv1R/DwAAAAAA2MMzn/RfDwrS2Cl+qlKxgnJkzxZj+R+jxsp/9rxY1/38o17KkD69GrVur0wZM2jUb0N15epVLV4R8LTDBgAAAADA7p75y/vXbNikdZu26PadO0laz83NVfVrv6ER4yYoOCRE5y5c1Iy5C9SsUcNErW80GmUymRL1z2g0PMlbAwAAAADgqXrmz/QnpIt3e3Xz6ajLV67Kb9Yc61n8AvnyydnJSUePn7TWPXrihDp1aJuodrt6t1d3n44J1jMYDAo8clS+02crIjLyyd6EAytZopi9Q0AyMYZpG+OX9jGGaR9jmLIyFCicqv0VL5g7VfuTpDtet1O9T0fGPpj2MYYxubm6KiQ0JFF103TSP2LsBJ06c1bhERGqXKGcfv52oELDwrV242Z5uLspPCJCFovFWv9uSIg83T0S1fbYKX4a5+ufYD1PDw9VKFta+wMPKzQs7InfiyPbtmu3vUNAMjGGaRvjl/YxhmkfY5hysoRkTPU+dx06mXClFBR0hM9LSmMfTPsYQ1ueHh56sViRRNV95i/vj8+BQ4cVEhoqs9msrTt3a87CxapXq6YkKSw8Qm6urjIa/3uL6Tw9FRqeuMTcYrHIbDYn6p/FEv003h4AAAAAAMmSppP+x0Xrv+T77PnzijKbVazIf5eAFS9SRCdOnbZHaAAAAAAApLpnPuk3Go1ycXGRyWSSwSC5uLjIyclJ6by89GrVynJze3A2v3KF8mrVtLFWr98oSYqIiNTKNevUq7OPvDw9lS9PbrVp2Uzzlyyz8zsCAAAAACB1PPP39D8+od62lYu1a98Bff7td+r+bkcV+nqAJOnylav6dcQoBazbYK370/AR+uqTj7V89jRFRkZq+rwFPK4PAAAAAPDceOaT/tGTfDV6km+sy7x7fBjvuqFhYeo/eMjTCAsAAAAAgGfeM395PwAAAAAAeDIk/QAAAAAAOKhn/vL+Z4nRaJTBYLApM5lMMhoNcawBAAAAAID9kPQnweOTCkqSwWBQwPqN2h942E5RAQAAAAAQO5L+JBg7xU/jfP1tyjw9PFShbGk7RQQAAAAAQNxI+pPAYrHEKDObzbJYou0QDQAAAAAA8WMiPwAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB0XSDwAAAACAgyLpBwAAAADAQZH0AwAAAADgoHhkXxIYjUYZDAabMpPJJKPREMcaAAAAAADYD0l/EnT1bq/uPh1tygwGgwLWb9T+wMN2igoAAAAAgNiR9CfB2Cl+Gufrb1Pm6eGhCmVL2ykiAAAAAADiRtKfBBaLJUaZ2WyWxRJth2gAAAAAAIgfE/kBAAAAAOCgSPoBAAAAAHBQJP0AAAAAADgokn4AAAAAABwUST8AAAAAAA6KpB8AAAAAAAfFI/uSwGg0ymAw2JSZTCYZjYY41gAAAAAAwH5I+pOgq3d7dffpaFNmMBgUsH6j9gcetlNUAAAAAADEjqQ/CcZO8dM4X3+bMk8PD1UoW9pOEQEAAAAAEDeS/iSwWCwxysxmsyyWaDtEAwAAAABA/JjIDwAAAAAAB0XSDwAAAACAgyLpBwAAAADAQZH0AwAAAADgoEj6AQAAAABwUCT9AAAAAAA4KB7ZlwRGo1EGg8GmzGQyyWg0xLEGAAAAAAD2Q9KfBF2926u7T0ebMoPBoID1G7U/8LCdogIAAAAAIHYk/Ukwdoqfxvn625R5enioQtnSdooIAAAAAIC4kfQngcViiVFmNptlsUTbIRoAAAAAAOLHRH4AAAAAADgozvQDAJAEWUrUTtX+MhQorCwhGVOtv6Ajq1OtLwAA8PRxph8AAAAAAAdF0g8AAAAAgINKE5f3t2nRTE0b1lORFwpp8/ad6jvgG0lS5owZ1e+D91WxXBl5enjqwqVLGjlhsjZs2WZdd8mMqcqcKaN1Er4os1k13mxhl/cBAAAAAEBqShNJ//WgII2d4qcqFSsoR/Zs1nJ3d3cdPX5Sf4wep+s3glT9lSr68esv1fH9D3XqzFlrvf6Dh2jdpi32CB0AAAAAALtJE0n/mg2bJEnFixS2SfovXr6sKTNmWV9v2LJNZ89fUKkXS9gk/U/CaDTKYDAkWM9kMsloTLgeAAAAAACpLU0k/YmVOWNGFSqQX8dPnbIp/6rfx/r6s746d+Gixk7x0+ZtOxJsq6t3e3X36ZhgPYPBoMAjR+U7fbYiIiOfOHZHVbJEMXuHgGRiDNM2xi/lZShQOFX7K14wd6r2d8frdqr29zxgP0xZjr4PSuyHKY19MO1jDGNyc3VVSGhIouo6TNLv5OSkH78ZoFVr1+vfo8et5V/98JP+PXZcZrNFdWpU17DBX6tz7746fORYvO2NneKncb7+Cfbr6eGhCmVLa3/gYYWGhSX7fTiibbt22zsEJBNjmLYxfikrNR+f99CuQydTra+gI3xengb2w5Tj6PugxH74NLAPpn2MoS1PDw+9WKxIouo6xOz9Tk5O+mXwQEVERGjwL7/bLNt7IFAREZG6f/++lgWs0YYt21SnRvUE27RYLDKbzYn6Z7FEP623BgAAAADAE0vzZ/ofJvwuzi76+MuvFRUVFW99SzQJOgAAAADg+ZAmzvQbjUa5uLjIZDLJYJBcXFzk5OQkk8mkoYMGyt3NTX0GfKP79+/brJczR3ZVKFtazs7OMplMqlvzddV89RWt3chM/gAAAAAAx5cmzvQ/PqnetpWLtWvfAY2eNEU1X31Fkffuae3C2dbl46dO04Sp0+Th7q7PevdSvjy5FWU269z5i/r82+918PC/9ngbAAAAAACkqjSR9I+e5KvRk3xjXVahZr041zt15qzadn7/aYUFAAAAAMAzLU1c3g8AAAAAAJKOpB8AAAAAAAeVJi7vf1YYjUYZDAabMpPJJKPREMcaAAAAAADYD0l/Ejw+oaAkGQwGBazfqP2Bh+0UFQAAAAAAsSPpT4KxU/w0ztffpszTw0MVypa2U0QAAAAAAMSNpD8JLBZLjDKz2SyLJdoO0QAAAAAAED8m8gMAAAAAwEGR9AMAAAAA4KBI+gEAAAAAcFAk/QAAAAAAOCiSfgAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB+Vk7wDSEqPRKIPBYFNmMplkNBriWAMAAAAAAPsh6U+Crt7t1d2no02ZwWBQwPqN2h942E5RAQAAAAAQO5L+JBg7xU/jfP1tyjw9PFShbGk7RQQAAAAAQNxI+pPAYrHEKDObzbJYou0QDQAAAAAA8WMiPwAAAAAAHBRJPwAAAAAADuqpJP15cuVSoQL5n0bTAAAAAAAgkZJ1T/87rZqrTKmS6j/oB2vZt59/osb160iSjhw/od6ff6Wbt28nK0gAAAAAAJB0yTrT3/zNhgq6edP6ulrlSmrSoK7mLFqqn//8W3ly51K3xx5xBwAAAAAAUkeyzvTnypFDZ86dt76uU/N1Xbx8RT/+/qckKWvmzGpUt3byIgQAAAAAAE8kRR/Z98rLlbRu0xbr64uXryhrlswp2YVdGY1GGQwGmzKTySSj0RDHGgAAAAAA2E+ykv5zFy7ojdde1ewFi1WtciVly5JZm7fvtC7PkT2bgoNDkh3ks6Krd3t1f+x2BYPBoID1G7U/8LCdogIAAAAAIHbJSvp9Z8zWkIH9tW7xXLm7uen02XPaunOXdfnL5cvp6ImTyQ7yWTF2ip/G+frblHl6eKhC2dJ2iggAAAAAgLglK+lfsWad7ty9q9eqVtHd4BDNWrBQZrNZkpQhfTrdDQ7WkpUBKRLos8BiscQoM5vNslii7RANAAAAAADxS/Y9/dt27dG2XXtilN+5G6xPBg5KbvMAAAAAAOAJpchEftmyZlHFsmWUKWMGrd6wSdeu35DRaFQ6L08Fh4TGeoYcAAAAAAA8XclO+vv1el+tWzSVk8mk6OhonTh1Rteu35CHu7sWTfPVqImT5T97XkrECgAAAAAAkiBZSf+7bVvrnVbNNWnaTO3YvVcjf/3JuiwkNFRrN25W7RrVSfqfIVlK1E7V/jIUKKwsIRlTrb+gI6tTrS8AAAAAeNYZk7NyiyaNtHhFgEaMnaCjJ07EWH781CkVyJs3OV0AAAAAAIAnlKykP2f2bNp/KO7n04dHRMjT0yM5XQAAAAAAgCeUrMv7b966rZzZs8W5/MViRXX56rXkdPFMMRqNMhgMNmUmk0lGoyGONQAAAAAAsJ9kJf1rNmzSW00ba+GylQoJDZEkRUc/eGb9Ky9XVJMG9TR52szkR/mM6OrdXt19OtqUGQwGBazfqP2BcV/xAAAAAACAPSQr6R81cYperlBO08aN1L6DgYqOjpZPuzbq0fldlS35ko4cP6EJftNSKla7GzvFT+N8/W3KPD08VKFsaTtFBAAAAABA3JJ1T39IaKi8e3yoydNnKnu2rIq8d08Vy5VRei8vjZ48VZ1791VERGRKxWp3FotFZrM5xj+LJdreoQEAAAAAEEOyzvRLUmTkPY339df4x86AAwAAAAAA+0rWmf7Rvw1V5Qrl41xeqVxZjf5taHK6AAAAAAAATyhZSX+l8mWVJXOmOJdnzpRRFcuVSU4XAAAAAADgCSUr6Zf+m60/Nvny5lFoeHhyuwAAAAAAAE8gyff0N2lQV43r1bW+7tKxnVq82TBGvXTpvFT0hRe0afv2ZAXYpkUzNW1YT0VeKKTN23eq74BvrMs8PTw0oN9Hqv5KVUVGRmr6vAUaN8Uv0csBAAAAAHBkSU76XV1dlSljRutrDw+PGLPXRyta4RERmr1wscZOnpqsAK8HBWnsFD9VqVhBObJns1n2+Ue9lCF9ejVq3V6ZMmbQqN+G6srVq1q8IiBRywEAAAAAcGRJTvpnL1is2QsWS5IWTZuiX/76Rxu2bEvxwB5as2GTJKl4kcI2Sb+bm6vq135DPr0+UnBIiIJDQjRj7gI1a9RQi1cEJLg8IUajUQaDIcF6JpNJRmPC9QAAAAAASG3JemRfi47vKSoqKqViSZIC+fLJ2clJR4+ftJYdPXFCnTq0TdTyhHT1bq/uPh0TrGcwGBR45Kh8p89WRGRkEt9F6stQoHCq9le8YO5U7e+O1+1U7e95ULJEMXuHgGRg/FIe36NIKvbDlOXo+6DEfpjS2AfTPsYwJjdXV4WEhiSqbrKS/lXzZmj1+o1asjJAew8EJqepJPNwd1N4RIQsFou17G5IiDzdPRK1PCFjp/hpnK9/gvU8PTxUoWxp7Q88rNCwsCS+i9SXJSRjqve569DJhCulkKAju1Otr+fJtl1s17SM8UtZfI/iSbAfphxH3wcl9sOngX0wZWUpUTtV+8sQnk7HU3HfDzqyOtX6elKeHh56sViRRNVNVtK/ev1G1Xr9NTVv1EBXrl3X0lWrtSxgjU6fPZecZhMlLDxCbq6uMhqN1sQ+naenQsPDErU8IY/+WBAfs9kcY04DAAAAAACeBcl6ZN/3w4arXsu2+vSb73T46DF1bPOWZk0co6mjR+idVs2VJVOmlIozhrPnzyvKbFaxIv9d4lW8SBGdOHU6UcsBAAAAAHB0yUr6JSkqKkprN27WZ998pzrNW+u7YcMVGhqmvj3f19JZfvrr5x/UsE4tubq6PFmARqNcXFxkMplkMEguLi5ycnJSRESkVq5Zp16dfeTl6al8eXKrTctmmr9kmSQluBwAAAAAAEeXrMv7HxcaFqYFS5fr2MmT8nmnjerUqK5qlSupWuVKCg3rrbmLlmj0JF+FR0Qkus3HJ9TbtnKxdu07oG4ff6Kfho/QV598rOWzpykyMlLT5y2wmZk/oeUAAAAAADiyFEv6c+fMqYZ1a6lR3doqkDeP7twN/n+SvUpR96PUssmbatuqufLkzqVPvx6c6HZHT/LV6Em+sS4LDQtT/8FD4lw3oeUAAAAAADiyZCX9GdKnU71aNdWobm2VfrGE7kdFacOWbfpj1Fht3r5TZrPZWvfnP0bo6rXr6vpu+2QHDQAAAAAAEpaspH/l3BlyMpm0/9Bh/Tj8L61cs17BIXE/K/DkmbO6eet2croEAAAAAACJlKykf8LUaVqyMkAXLl1OVP2NW7dp49ZtyenSroxGowwGg02ZyWSS0WiIYw0AAAAAAOwnWUl/XPfaO6rHJxWUJIPBoID1G7U/8LCdogIAAAAAIHbJnsjP2dlZLRs30mtVKytXzhySpMtXrmrTth2at2SZ7t27l+wgnxVjp/hpnK+/TZmnh4cqlC1tp4gAAAAAAIhbspL+7NmyauSvP6tgvry6HhSk8xcfXOZftHAhVatcSa1bNFWPfp/r2vUbKRKsvVkslhhlZrNZFku0HaIBAAAAACB+yUr6v/j4Q+XKkV2fD/pBAes22CyrU/N1De7/qb74+EP1HfBNsoIEAAAAAABJl6ykv3KF8vKbNTdGwi9JAes26MViRdWmRbPkdAEAAAAAAJ6QMTkrh4WF6eatW3EuvxEUpLCwsOR0AQAAAAAAnlCykv6Fy1eqacP6cnNzjbHMw91dzRo10Pyly5PTBQAAAAAAeEJJury/1uuv2bw+cvyEqr9SRXOnTNCi5St14dIlSVK+PHnUuH5d3Q0O1vGTp1IuWgAAAAAAkGhJSvp/GTRQ0dHRMhgMkmTz/106totRP0e2rPrx6y+1KpZ7/gEAAAAAwNOVpKS/W59Pn1YcaYLRaLT+yPGQyWSS0WiIYw0AAAAAAOwnSUn/7n0HnlYcaUJX7/bq7tPRpsxgMChg/UbtDzxsp6gAAAAAAIhdsh7Z97wZO8VP43z9bco8PTxUoWxpO0UEAAAAAEDckp30Z82cWc3ebKASRYsonZenDIp5qXv3vp8lt5tngsViiVFmNptlsUTbIRoAAAAAAOKXrKS/6AuFNOaPYXJzddXZ8xdUpFBBnTpzTunSeSl71iw6f+myrl69llKxAgAAAACAJDAmZ+Xe3bsoPDxCLTq+p/f7fiaDwaBf/vpHDd9up88H/aD0Xl76c8z4lIoVAAAAAAAkQbKS/rKlSmrOoiW6cvWaoqMfXOL+cCb7gHUbtDRgtT7u0S35UQIAAAAAgCRLVtJvMBgUdPOWJOlucIjMZovSp0tnXX7i1Bm9WKxo8iIEAAAAAABPJFlJ/6UrV5QnV05JUnR0tC5euaIqlSpYl5ct9ZJCQkOSFyEAAAAAAHgiyZrIb9vO3apT83X9PW6iJGn2gkXq27O78ubOJYMMqliujHxnzE6RQAEAAAAAQNIkK+kfP9Vfy9eslZOTk6KiouQ3a67c3NxUp0Z1mc1mjZ3ip/FTp6VUrHZnNBplMNg+ktBkMlnnMQAAAAAA4FmSrKT/bnCI7h49blM23tdf4339kxXUs6qrd3t19+loU2YwGBSwfqP2Bx62U1QAAAAAAMQuWUn/82bsFD+Ne+wHDU8PD1UoW9pOEQEAAAAAELdkJf3ffN4v3uXR0dG6d+++rl6/rt37DujAobR9NtxiscQoM5vNslii7RANgLQoS4naqdpfhgKFlSUkY6r1F3Rkdar1BQAAgIQlK+l/uXw5ubm6KlPGDJKkO8HBkqQM/39s363bd2Q0GpUhfTpFR0dr687d+vSbwYqIiExm2AAAAAAAICHJemTfh58P0L379zVqkq/eaNpKtZq+9eBfs7c0etJURURGqtMHH6tG45YaO8VP1SpXUs/3fFIodAAAAAAAEJ9kJf1ffPSBNm3bobGTp+pucIi1/M7dYI2Z7KstO3bp8496KSQ0VKMn+WrFmnWqXaN6soMGAAAAAAAJS1bSX+qlEjp28mScy4+dPKkyJUtaX+85cFBZMmdKTpcAAAAAACCRkpX0B4eE6JWXK8W5vFrllxUS+t8VAJ7uHgoNDUtOlwAAAAAAIJGSNZHfvMXL1O3dDho6aKBmL1is85cuSZLy5c6tt5o11uuvVNHYKX7W+tWqvKyjJ04kL2IAAAAAAJAoyUr6R0/ylauri9q/3Uq1qr9qs8xssWjqzDkaPclXkuTi4qLFK1bq2MnTyenSroxGowwGg02ZyWSS0WiIYw0AAAAAAOwnWUm/JP05erymzpijKpUqKGf2bJKky1evacfuvbp5+7a13r1797Ro+arkdmdXXb3bq7tPR5syg8GggPUbtT/wsJ2iAgAAAAAgdslO+iXp5u3bWhawJiWaeqaNneKncb7+NmWeHh6qULa0nSICAAAAACBuyU76jUaj6tZ8XZXKl1XmTJk0cvwknTh9Rl6enqpcsbz2HzykoFu3UiJWu7NYLDHKzGazLJZoO0QDAAAAAED8kpX0p/Py0oihQ1TqxeIKDQuXh7ubps+ZL0kKCw/XZ717avGKAI0YOyElYgUAAAAAAEmQrEf2fdits14oWEC9Pu2vpu28bSa5s1gsCli3Ua9VrZzsIAEAAAAAQNIlK+l/47VqmjFvgbbt2qPo6JiXuJ+9cEG5cuZIThcAAAAAAOAJJSvp9/Ly1MXLV+Jc7mQyyWQ0JacLAAAAAADwhJJ1T/+Fi5dUomiROJe/8nIlnT57LjldJGjz8oU2r12cXXT67Dm1fq+bJGnQF5+qYZ1auh9131qnR78vdOAQj9gDAAAAADi2ZCX985YsU+/uXbR7337t2LNXkhQdHS1nZ2d1e7eDqlWupO+GDU+JOOP0aoOmNq9nThij5WvW2pYtWKhhf418qnEAAAAAAPCsSVbS7z97ngoXKqgfv/5Sd0NCJElDBvZXhgzp5WQyafbCJVqwdHmKBJoYJUsUV6EC+bVw2Ypkt2U0Gm0mJoyLyWSS0ZhwPQAAAAAAUluykn5J+u6X37Vo+UrVqfm68ufJI4PBoAuXLmvVuvXas/9gSsSYaM3fbKDN23foRtBNm/LG9euqcf26unEjSAuWrdDUmXNinXjwUV2926u7T8cE+zQYDAo8clS+02crIjIyWfGnhgwFCqdqf8UL5k7V/u543U7V/p4HJUsUs3cIDoV9MO1jDJFUfI+mLEffByX2w5TGPpjyHH0/TAv7oJurq0JCQxJVN9lJvyTtO3hI+w4eSommnpibm6vq13pDA4f8bFM+be58DR81RnfuBqtkieL6+duvZLFY5DdrbrztjZ3ip3G+/gn26+nhoQplS2t/4GGFhoUl6z2khiwhGVO9z12HTqZaX0FHdqdaX8+TbbvYrimFfTDtYwzxJPgeTTmOvg9K7IdPA/tgynL0/TAt7IOeHh56sVjc8+s9KslJ/+9DBiWpfnS01HfAN0ntJsnq1ayhyMhIbdy63ab8yLHj1v8/ePhfTfSfrsb16iaY9FsslkT1azabZbHEf9UAAAAAAAD2kOSk//VXqiry3j0F3bz1NOJ5Ys0bN9SiFSsTTNYTuqwfAAAAAABHkeSk/9qNIGXPmkW379zVsoDVWrlmvW7cvJnwik9RgXx5VbbkS/rmx19iLKtb83Vt2bFLoWFherF4UXVq11Yz5y2MpRUAAAAAABxLkpP+hm+3U8VyZdSg9hvq4t1eH7/fTXsOHNDSVWsUsG6DwsLDn0ac8WreqIH2HAjU+YuXYixr07KZvvq0j5xMJl27EaSZ8xZqyoxZqR4jAAAAAACp7Ykm8tu974B27zugn//4W69WeVkN69TS5x/1Uv8+H2rz9p1avnqt1m/eqvv376d0vLH6Y/S4OJd16d0vVWIAAAAAAOBZk6zZ+6OiorR+81at37xVHu7uqvX6q2rVtLF++vpLjZrkq3FT/FIqTgAAAAAAkETGlGjE2dlZr1SupBqvVlOJokUUee+eLl+5mhJNAwAAAACAJ/TEZ/oNBoNeebmi6td6QzWrV5Obq6t27N6r7375XWs3blZ4RERKxvlMMBqNMhgMNmUmk0lGoyGONQAAAAAAsJ8kJ/1lS5VUg9pvqG7N15UhfXodOHxYI8ZO0Kq163X7zt2nEeMzo6t3e3X36WhTZjAYFLB+o/YHHrZTVAAAAAAAxC7JSf+Ev35TRGSkNm3boRVr1unS/y/jz5kjh3LmyBHrOkeOHU9elM+IsVP8NM7X36bM08NDFcqWtlNEAAAAAADE7Yku73dzdVWdGtVV+/XX4q1nMBgUHR2tSrUaPFFwzxqLxRKjzGw2y2KJtkM0AAAAAADEL8lJ/7c/D3sacQAAAAAAgBSW5KR/0fJVTyMOAAAAAACQwlLkkX0AAAAAAODZQ9IPAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgnuiRfc8ro9Eog8FgU2YymWQ0GuJYAwAAAAAA+yHpT4Ku3u3V3aejTZnBYFDA+o3aH3jYTlEBAAAAABA7kv4kGDvFT+N8/W3KPD08VKFsaTtFBAAAAABA3Ej6k8BiscQoM5vNslii7RANAAAAAADxYyI/AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgeGRfEhiNRhkMBpsyk8kko9EQxxoAAAAAANgPSX8SdPVur+4+HW3KDAaDAtZv1P7Aw3aKCgAAAACA2JH0J8HYKX4a5+tvU+bp4aEKZUvbKSIAAAAAAOJG0p8EFoslRpnZbJbFEm2HaAAAAAAAiB8T+QEAAAAA4KBI+gEAAAAAcFAk/QAAAAAAOCiSfgAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB0XSDwAAAACAg3KydwBpidFolMFgsCkzmUwyGg1xrAEAAAAAgP2Q9CdBV+/26u7T0abMYDAoYP1G7Q88bKeoAAAAAACIHUl/Eoyd4qdxvv42ZZ4eHqpQtrSdIgIAAAAAIG4k/UlgsVhilJnNZlks0XaIBgAAAACA+DGRHwAAAAAADoqkHwAAAAAAB0XSDwAAAACAgyLpBwAAAADAQaX5ifwGffGpGtappftR961lPfp9oQOHHjxCz2Qy6ZMPeqhh3VqSpKWrVmvYXyNjnZQPAAAAAABHkuaTfkmauWChhv01MtZlXb3bq3yZUnrLu4skacQvQ9S5YzuNnTw1NUMEAAAAACDVOfzl/c0aNdDYKX66cfOmbty8qXG+/mreqEGC6xmNRplMpkT9MxoNqfBOAAAAAABIGoc409+4fl01rl9XN24EacGyFZo6c46io6OVzstLObJl1bETJ611jx4/oVw5ssvL01MhoaFxttnVu726+3RMsG+DwaDAI0flO322IiIjU+T9PE0ZChRO1f6KF8ydqv3d8bqdqv09D0qWKGbvEBwK+2DaxxgiqfgeTVmOvg9K7IcpjX0w5Tn6fpgW9kE3V1eFhIYkqm6aT/qnzZ2v4aPG6M7dYJUsUVw/f/uVLBaL/GbNlYeHuyQpOOS/jfEw0ffwcI836R87xU/jfP0T7N/Tw0MVypbW/sDDCg0LS+a7efqyhGRM9T53HTqZcKUUEnRkd6r19TzZtovtmlLYB9M+xhBPgu/RlOPo+6DEfvg0sA+mLEffD9PCPujp4aEXixVJVN00f3n/kWPHdev2HVksFh08/K8m+k9XvTdqSpLCwsIlSV6entb6D///4bK4WCwWmc3mRP2zWKKfynsDAAAAACA50nzS/7jo6P8S8OCQEF29fkPFi/73C0ixIoV15dr1eM/yAwAAAADgCNJ80l+35uvy9PCQJL1YvKg6tWurNRs2WZcvXLZCnTu8oyyZMilLpkzq3OEdzVuyzF7hAgAAAACQatL8Pf1tWjbTV5/2kZPJpGs3gjRz3kJNmTHLunzM5KnKkD695viOlyQtXbVa4xNxrz4AAAAAAGldmk/6u/TuF+9ys9msn4b/pZ+G/5VKEQEAAAAA8GxI85f3AwAAAACA2JH0AwAAAADgoNL85f2pyWg0ymAw2JSZTCYZjYY41gAAAAAAwH5I+pOgq3d7dffpaFNmMBgUsH6j9gcetlNUAAAAAADEjqQ/CcZO8dO4x2b+9/TwUIWype0UEQAAAAAAcSPpTwKLxRKjzGw2y2KJtkM0AAAAAADEj4n8AAAAAABwUCT9AAAAAAA4KJJ+AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICD4pF9SWA0GmUwGGzKTCaTjEZDHGsAAAAAAGA/JP1J0NW7vbr7dLQpMxgMCli/UfsDD9spKgAAAAAAYkfSnwRjp/hpnK+/TZmnh4cqlC1tp4gAAAAAAIgbSX8SWCyWGGVms1kWS7QdogEAAAAAIH5M5AcAAAAAgIMi6QcAAAAAwEGR9AMAAAAA4KBI+gEAAAAAcFBM5AcAAAAg1WQpUTtV+8tQoLCyhGRMtf6CjqxOtb6AxOBMPwAAAAAADooz/UlgNBplMBhsykwmk4xGQxxrAAAAAABgPyT9SdDVu726+3S0KTMYDApYv1H7Aw/bKSoAAAAAAGJH0p8EY6f4aZyvv02Zp4eHKpQtbaeIAAAAAACIG0l/ElgslhhlZrNZFku0HaIBAAAAACB+TOQHAAAAAICDIukHAAAAAMBBkfQDAAAAAOCguKcfAAA8V7KUqJ2q/WUoUFhZQjKmWn9BR1anWl8AgGcfZ/oBAAAAAHBQJP0AAAAAADgoLu9PAqPRKIPBYFNmMplkNBriWAMAAAAAAPsh6U+Crt7t1d2no02ZwWBQwPqN2h942E5RAQAAAAAQO5L+JBg7xU/jfP1tyjw9PFShbGk7RQQAAAAAQNxI+pPAYrHEKDObzbJYou0QDQAAAAAA8WMiPwAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB0XSDwAAAACAg0rzE/k5Ozvri48/UJWKFZQxQwZdu3FDk/xnaOGyFZKkMcOHqWyplxQVFWVdp1l7H90IummvkAEAAAAASBVpPuk3mYy6EXRT7/f9TBcuXVbpl17UX0N/0PUbN7R1525J0h+jxsp/9jw7RwoAAAAAQOpK85f3R0REauSEybpw6bIk6eDhf7Vr736VK10qWe0ajUaZTKZE/TMaDSnxVgAAAAAASFFp/kz/41xcXFTqxeJaFrDGWtbFu726+XTU5StX5TdrjhavCEiwna7e7dXdp2OC9QwGgwKPHJXv9NmKiIxMVuypIUOBwqnaX/GCuVO1vztet1O1v+dByRLF7B2CQ2EfTPsYw7SPMUzbHH38JMYwpbEPpjzG0P7cXF0VEhqSqLoOl/R/81lfnbtwSWs2bJIkjRg7QafOnFV4RIQqVyinn78dqNCwcK3duDnedsZO8dM4X/8E+/P08FCFsqW1P/CwQsPCUuQ9PE1ZQjKmep+7Dp1Mtb6CjuxOtb6eJ9t2sV1TCvtg2scYpn2MYdrm6OMnMYZPA/tgymIM7c/Tw0MvFiuSqLpp/vL+R/Xv01sF8uVV3wHfKDo6WpJ04NBhhYSGymw2a+vO3ZqzcLHq1aqZYFsWi0VmszlR/yyW6Kf8zgAAAAAASDqHOdPfv09vlX6phLr3+UwhoaFx1osWCToAAAAA4PngEGf6v/j4Q5UrXVI9+n2u4JD/7mtI5+WlV6tWlpubq4xGoypXKK9WTRtr9fqNdowWAAAAAIDUkebP9OfMkV2tmzfRvfv3tXSmn7V8ycrVGjlhkrq/21GFvh4gSbp85ap+HTFKAes22CtcAAAAAABSTZpP+q9cvaYKNevFudy7x4epGA0AAAAAAM8Oh7i8HwAAAAAAxETSDwAAAACAg0rzl/enJqPRKIPBYFNmMplkNBriWAMAAAAAAPsh6U+Crt7t1d2no02ZwWBQwPqN2h942E5R4XmSpUTtVO8zQ4HCyhKSMdX6CzqyOtX6AgAAABwdSX8SjJ3ip3G+/jZlnh4eqlC2tJ0iAgAAAAAgbiT9SWCxWGKUmc1mWSzRdogGAAAAAID4MZEfAAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgSPoBAAAAAHBQPLIvCYxGowwGg02ZyWSS0WiIYw0AAAAAAOyHpD8Junq3V3efjjZlBoNBAes3an/gYTtFBQAAAABA7Ej6k2DsFD+N8/W3KfP08FCFsqXtFBEAAAAAAHEj6U8Ci8USo8xsNstiibZDNAAAAAAAxI+J/AAAAAAAcFAk/QAAAAAAOCiSfgAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB0XSDwAAAACAg+KRfUlgNBplMBhsykwmk4xGQxxrAAAAAABgPyT9SdDVu726+3S0KTMYDApYv1H7Aw/bKSoAAAAAAGJH0p8EY6f4aZyvv02Zp4eHKpQtbaeIAAAAAACIG0l/ElgslhhlZrNZFku0HaIBAAAAACB+TOQHAAAAAICDIukHAAAAAMBBkfQDAAAAAOCgSPoBAAAAAHBQJP0AAAAAADgokn4AAAAAABwUj+xLAqPRKIPBYFNmMplkNBriWAMAAAAAAPsh6U+Crt7t1d2no02ZwWBQwPqN2h942E5RAQAAAAAQO5L+JBg7xU/jfP1tyjw9PFShbGk7RQQAAAAAQNxI+pPAYrHEKDObzbJYou0QDQAAAAAA8WMiPwAAAAAAHBRJPwAAAAAADoqkHwAAAAAAB0XSDwAAAACAg3ouJvIzmUz65IMeali3liRp6arVGvbXyFgn5gMAAAAAwFE8F2f6u3q3V/kypfSWdxe95d1FFcqUVueO7ewdFgAAAAAAT9Vzcaa/WaMGGjZipG7cvClJGufrrz49umns5KlxrmM0GmUwGBJs28nJSR7ubvJwd0+xeJ8mDzeXVO3P1cU5VfuM8PBItb7sIbXHT2IMUxr7YNrHGKZ9jGHa5ujjJzGGKY19MOUxhvbn4e4uNzfXxOWsqRCPXaXz8lKObFl17MRJa9nR4yeUK0d2eXl6KiQ0NNb1unq3V3efjgm2bzQatT/wsO7dm6nIe/fUpEFdLVq+StHRKXvrgMFgTKG2Lz6ldmMyGIyqVLCULh+5nKJtxxdzjmJFnlrbz0a7F2OUMIaJb/vZaDf1xvBpjd/DtmOL+Vkdv5RtO+1/jz5smzFM6XZj4nv0abTr2N+jEmOY1sfwWR2/lG2b79EnbTu5Hra9at0GFS5YQAcPH4kzp7Wu45W3cHSKRvGMyZE9m5bN9FOtZm/p9p27kqRMGTNo9fxZavB2O127fiPW9RJ7pt9oNCpzpowKDQ2T0WjU+sVzVaNxS5nN5hR9HyaT6am0/bTafZptE3Pab5uYU6dtYk6dttNizE+zbWJOnbaJOXXaTosxP822iTl12ibm1Gk7Lcb8aNs1m7SSi4uzgm7eSnCuOoc/0x8WFi5J8vL0tCb9Xp6eNstik9hJ/sxms65euy7pwQBER0crNCzsqQzu02ibmFOn7bQY89Nsm5hTp21iTp2202LMT7NtYk6dtok5ddpOizE/zbaJOXXaJubUaTstxvxo2yGhoTLfTVzbDj+RX3BIiK5ev6HiRf+7RKNYkcK6cu16gpdBAAAAAACQljl80i9JC5etUOcO7yhLpkzKkimTOnd4R/OWLLN3WAAAAAAAPFUOf3m/JI2ZPFUZ0qfXHN/xkqSlq1ZrvK+/naMCAAAAAODpei6SfrPZrJ+G/6Wfhv/1VPuJjo7W6Em+io5O+bkRn1bbTzPmp4XtnHptPy1pcXukxZifJrbz02/3aUuL2yMtxvy0sJ1Tr+2nJS1uj7QY89PEdn767T5NaXE7P2nbDj97P+zHZDJp5+plerl2wxSfwAKpgzFM2xi/tI8xTPsYw7SN8Uv7GMO0jzFMvufinn4AAAAAAJ5HJP0AAAAAADgokn4AAAAAABwUST+emrQ4oQdsMYZpG+OX9jGGaR9jmLYxfmkfY5j2MYbJx0R+AAAAAAA4KM70AwAAAADgoEj6AQAAAABwUCT9AAAAAAA4KJJ+AAAAAAAcFEk/AAAAAAAOiqQfAAAAAAAHRdIPAAAAAICDIumHZk8aq+qvVE1U3YZ1amni38NTpN+K5cpo/ZJ5KdLW8yRXzhzas26l0nl5SZK+7PuRPureJcnrIW1p0biRVs2doc3LF6p40SJaMmOqar5WLdX67+7TUb/9MCjV+oN9jRk+TO3eamHvMACH1rRBPU0fP8reYTwXUmJbcxxMPcWLFNaedSutrzkmJZ+TvQNAyqlSsby6+XRUiaJFZDZbdODQYY0YN1FHjh2Pd723fLomuo9lAWu0LGBNckNNtMIFC6h7J29VKldWzs7Ounbjhlav36gp02cpJDRUpV4sod7du6hYkRdkMBh09ep1TZ05WwuXr9TsyeO0cOkKTZkxy6bNfHlya/7UiWrW3kcXLl1OtfeSFOVKl1SXju1V6qUSMhgMunL1mpauXC2/2XNj1B3y2x9PJYYxw4dp3abN8p9t+8PMnnUr9U6XHjp64uRT6fd5Etc2fpzJZNJnvXuq5ydfaO+BwBSPY8+6lYqIjJTZbJHZYtaZc+e1cs06zZi3UGazOcX7S4vGDB+msqVeUlRUlO5HRenYiVP67Z/RCX6/xtdeYsYeyVcgX1716dFNZUq9JGcnZ10PCtLCpSs0adoMSdJnH/XSG6+9Ki9PT4WFh2nVug0aPnKsoqKiYm1vyYypypwpoywWiyLv3dOBwMMaNmLkM3k8cdTP2Zjhw1SpXBn16Pe5tu/eay1/t21rffR+F/nPmadhf420Y4T/fU4efq9evHRZ6zZtle+MWQqPiLBrbM+qh9+z9+9HyWKx6Oq1a9q6c7cm+k/Xrdt3nmrfHAefvse/j/LmzqWRv/6s9Vu22n1/fR5wpt9BvF6tqn77YZAWrwhQ3RZt9GabDtq9/4DG//mrXixeNNZ1jMZne/hLFCuqySP/0plz59X6vW6q3qiZen3aX64uLipauJA83N014pchWrl2nWo3e1u1mr6lb4cOU9Dt25KkBUuXq2nDejHabf5mQ+3ad+CZ/ANNkqq/UlUjhv6oLTt2qnl7H9V4s4U+//Z7vVCwgLJmyWzv8GAHWbNklquLi06cOvPU+ujU62NVb9RMtZu9rb/GjFeTBvX050/fP7X+0qI/Ro3Vqw2aql7Ltjp24qSGD7HvGZ9n/Tv8WfHnT9/r2MlTatS6vWo0bqFPBw7Shcv/ff/Pmr9ILTp2UvVGzdTmve4qVriwfNq1ibfN/oOH6NUGTdWkrbciIiP13YDPkxyXyWRK8jr4z5nzF9S0YX2bsiYN6+n0ufN2iiim/oOH6LWGTfVGk1b6btjvqli2tCb+PVyuri72Du2Z9ceosXqtYVO9/mZzfT7oB2XLllV+Y/5RlkyZnnrfHAdTT9EXCmniiOFatHxViif8FcuV0Zjhw1K0TUfAXwwO4rPevTTRf4bmLV6qsPBwBYeEaKLfdK1cu159enS31tuzbqXatGimWRPHaOvKxfJwd49xmXDbls21bJa/1i6ao56dfTR9/Cg1bfAgeX788qglM6bq3batNfmfP7Vp2UKN/eNX5ciezbr8o+5dtGTGVG1atlCzJ49TnZqvJ/o99e3ZXSvXrtM/4yfpRtBNSdKVq9f0+8gx2nsgUAXy55WHm7vmLFwis9kss9msw0eOafO2HQ9iWxGg/HnzqtSLJaxtGo1GNa5fR/OXLEviFk49n/XuqUnTZsh/9jzdvnNXknTm3Hl989MvunL1Woz6g774VJ982MP6Ol+e3Pp9yCCtWTBb6xbP1bDvvom1n9IvvagVc6ap1uuvJSvejm3e0kL/yVq3eK7+/uVH5cmVy7psz7qVKl6ksPV1u7da2HwRf9S9i1bNnaGNSxdovt8km9tM6teqqZkTxmj9knmaOnqEypR8KVlxPsse3urS/M2G1n3v4S0bxYsW0dwp4yVJy2f7a6H/5Bjrx3bJ4fol81SxXBlJ0tBBA/XDV19Yl73btrVmTxob6x+eZrNZu/cdUL+vBqlC2dJ6tWpl6zKT0ahvPu9nHa83qr+a/DefBt27d0/zFi9V9qxZlSVTJv387Vdas2C2ls70U68unazJePp0Xvr1+2+1bvFcrV8yT35j/lbOHNnVt2d3VShTSh+931Wbly/UiKFDJEnZs2XVyF9/0salC+Q35m+91+EdLZkx1drvkhlT1al9W03+509tXblYLxTIr8wZM+qHr77QqrkztHLOdH3yYQ85OzvH278kpfPy0s/ffqX1S+Zpru8EvdOquc2llI4iY4b0ypcnt+YsWqKIiEhZLBadPHNWAes2WOucPntOERGRkiSDwaBoi0X58+ROVPuhYWFasnK1ir7wgqT4j3kP9/O3mjXW0pl+mvzPg6u02rRoZt3ve3XpZHPMTWjfluL+rozrc+YoVqxeq1erVpaXp6ckWY/1gYePWOu8WLyoJv49XOuXzNPsyePUoPYb1mXdfTpq+JDB+vyjD7R+yTwtnemnem/UsC53dnbWl30/0rrFc7V4uq+aNWqgPetWKlfOHJIe/GjzYbfOWjrTT2sWzNZP3wxQpowZYo3VYrHo36PH9cnXg5UlU6YYP1Z80PU9rV00R0tn+unt5k1SZgM5gFNnzmrAdz8qNDRUHVq3ivUS/Uf3F0mqWqmCpoz8S+uXzNOquTPUqX3bWNt+q1ljLZo2RQXz54uxjOPg01W2VEmN+WOYxk+dpjGTfSXFPCZVKFs6xnrZs2bVmOHDtGnZQk365w8VKpA/tUNP00j6HUCBfHmVO2cOLVsV87L7ZavWqHzpUjZ/3Deo84Z6fPKFXmvYLMYlZpUrlNf773nrk4GDVLdFG0VHR6twwYLx9v9mvTrqP3iIajV7SxEREer5no912bGTp9Sx+wd6/c3mGjt5qr4f8Lly58yZ4Htyc3NV+dKltDxgbZx1zp2/qJDQUP30zQDVePWVGL8C37x9W+u3bFWzRv8dXF+pXEmurq5avWFTgjHYQ/68eZQnV04tf8JbKNzcXDXqt6E6efqsGrVprzrNW2v6nPkx6r1WtYp+/e4bffndj1qTjG3RuH4ddWjdSn0HfKN6Ldvq5Okz+uPHwYk6A/nKyxXVoE4tvdO1h6o3aqb3+36ms+cfnKF5tWpl9enZTV//9ItqNm6pCX7T9cdP3ylD+nRPHOuzztPdXYULFlCz9j5674M+at2iqSqWK6Ojx09Yb8Fp8FY7NW33bpLb/u6X31WudCk1rl9HLxYvqs4d2+mLQT8oMvJenOtcunJF/x47rkpl/0suqlV+WYH/HlGNxi3029+j9OPXXypv7lxxtuGo3Nxc1aJJI12+ek1DBvZXVFSU3mzTQe992EdvvFbNepbYu21rmYxGNXjrHb3RpJUGD/1NYWFh+u2f0dpzINB65cAHn30pSRoysL8uX72mOi3eVv/BQ9S8UYMYfTdtWF9f/zhUrzZoqrMXLur3IYMVdPOWmrTz1tuduqpY4cLq0rFdvP1LD35cTOflqcZtOqrbx5+ocf26qbT1UtftO3d15vwFDfriE9Wt+br1R4/HdWrXRpuXL9Tq+bNUtMgLmjZ3fqLaT+flpcb16+jf/9/mkdAxz9PdXcUKF1ZL7/fU5aN+erl8OfXq0kmff/u96rZ48LlJ6Jj7qPi+K+P6nDmK4JAQbdm+Uw3qPEjkmzWqr0XL/vvhKp2Xl/7+5UetWL1OtZq+pR9//1MDP+2jsqVKWutUq/yy9uw/oDeatNI/4yfq68/6ycPdXZLUpWM7lSxRTG95d1Hbzu+r1mPJ3Xsd3tHrr1TRex/20ZttOihasvlxNa6Yd+zZq4qPfK8WLlhQ0dHRqtuijb4Y9IN6d+sSa8LzvLJYLFq7aYsqliubYN3iRYvotx8GafL0marV9C216Piedu3dH6Pe+5281aZ5U733YR+diefKEI6DKe/lCuX0188/aNhfIzX9ke/ZxByTmjduqBFjJ6hmk5bauWeffh+SuL838QBbygFkzPDgl+XrQUExll0PCpLJZFT6dP8lS5OnzdSNoJu6f/++oqOjbeo3rFtLy1at0aEjRxUVFaUxk6cqLCI83v5nLlioS1eu6N69e1q6arVeeuR2gmUBa3Tz9m1ZLBatWLNOZ86dV9lSCZ+xTeflJZPJqGs3bsRZJzQsTO/27K07d4PVr9f7Wjl3uqaM/Esliv3X//yly1W/1hvWHz2aNayv5QFrde9e3MmOPWXKmFGSdO1GzLFMjNdfqaqoqCiNGDtBERGRioqK0q59tge8pg3r6cu+vdXr0/7ave9AvO192K2z1i+ZZ/PvUW/Wq6Nps+frxOkzunfvnv4aO0E5sme3uboiLvfvR8nVxUVFChWUyWTSlavXdO7CRUlSm+ZNNXnaTB05dlzR0dFas2GTzpw7r9eqVkniFkk7DAaD/h4/Uffu3dPps+d04NBhvVS8WIq0HRwSogHf/6hPPuypod8O1IixE3Ti9JkE17t2/YbSP/JDy9kLFzRn4RJZLBZt2LJNu/buV4M6tVIkxrTg4f6wyH+KCuXPr69/HKqXK5TTb3+PVnhEhK5cvabxU6dZz+JFRUUpQ4b0yp8njywWi46eOKm7wSGxtp0jezZVKFNaf44ep8jIezp34aLmLFwSo96s+Qt19vwFWSwWFS1cSPnz5dHvI8coIiJSd+4Ga8JUfzX8/5jE1b/RaFS9WjX197hJCg4J0Y2gm5o8bebT23B21rV3Px07cUrdfTpq8bQpmj15nKpWqmBTZ6L/DL3aoKlavdtFsxcsVtDNW/G2+cNXX2jd4rmaPXmsDAaDBg75WVLCxzyj0ai/xoxXRESkIiIi1ahebS0LWKMDhw4rKipKoyZOSdL93s/jd+WjFi5boaYN6svV1UW1a1TX4hWrrMteq1pZt27f0fS5861nbpcFrFGTBv8lE/8eO65V6zbIYrFo8YoAOTs7KX++vJIeTFw8wW+6bty8qZDQUI3+/xnJh96sV0djp/jpytVrCo+I0K8jRqpqpYoJ3oZ37foNmx+wwyMiNGriFEVFRenAocNaumq1w/4I96Su3bA9FsWlZeNGWrFmnVav3yiz2ayQ0FAdPPyvdbnJaNRXn3yslyuU03sf9tX1RPytxXEwZVUqV043b9/Wpm3brWWJPSatWL3O5rsyc8aMKlPyxdQMP01jIj8HcPvOg8lNsmXJoouXbe9Tz5Yli8xmi+4GB1vLrly7Hmdb2bJksflV1Gw2Wy+tj8ujy8MjIuTh4WF93f7tlmrxZkNlz5ZN0YqWh5u7MmZIn+B7Cg4JkcViUfasWeP9Ffb8xUvWieyyZsmsPj26afiQQWrw1oMzXVt37FJYeJhqv15dm7fvUI1XX9G7PT9KsH97eTiW2bNmeaI5B3LlyJHgej7vtNGCZSt0/NTpBNv7a8z4WCfyeyh7tmy6dOWK9fX9+/d1PShIObJlTbDtXfv2a+TEyerxno+GFsiv7bv36Pd/xujSlSvKnTOHPuj6nt5/77+z2k4mk7JnzZJgu2lVSFiY9RJjSQqPiLSecUoJ+w4e0sVLl5UrZw7NS+TtLdmzZdX+g4esrx+/veTSlavKlsVxx+Rxj+8PpV4soch79xR0678E8cKly9bP6eRpM+Xq4qKfBw2Ul4eHVqxdp7/GjI/1CotsWbIo8t496y09knT56tUY9R79/s6dM6fSeXpq3eL/Jvg0yCCTyRhv/14ennJ2crIZz8ux3DrkKIJu3dJv/4zWb/+MVvp0XurSsb1+/f5bNXy7XYwfYU6fPadjJ09pcP9P9X7fuO/TH/D9T1q3aUuM8oSOeaFhD26/eyjWY+7N+I+5j3oevysftX33Xn39WT919e6gA4GHbfbFHNmy6fIV233o4qXLqvDIWdtH60tSRGSkPD0efO9my5pFVx/Z365etf3bKUe2rLr0SPs3gm7q3v37ypEtW7x/N2XPllV37v73N9n1oCCbieKuXL2aqLPaz5PsWbPq7iPbLC65c+bQngMH424nezY1zltXfb782mY/jLdvjoMparyvv8qVLqkxw4epe59PdfvOXWXKkCFRx6RH9+eH35XZsz74e7N/n97Wq36cTCa5OLvYnKj66IuvtO+RcXwecabfAZw9f0GXr16zftgf1aDOG9oXeMjmj8xoiyXOtq4HBdnck280Gp948rhypUuqu4+3vhoyVDUat1CNN1vo5JkzMhgMCa4bERGpPQcCVb92zUT3dyPopib6TVf2rFmtv6JbLBYtXLZSzRo1UKO6tXXqzNknnm07NZw9f0GXrlxV/doxxzIxLl+9muBlZh98PkAN69TSu21bP1Efj7p2/brNpatOTk7KliWLrl5/cIVGeESEXF1drcsfPzDOmr9I7/bsrUat2+v+/fv6rHdPSdLV6zf0+8gxqvFmC+u/Vxs01UT/GcmO2RGFh0fI7ZFbeNzcXOX1yI9vkuTd5m25ODvr9Nlz+rDrewm2mStnDr1YrKjNlSKPXxqdK0f2WK8wel5cvX5dri4uNrcW5c6Zw3qlTnhEhP4YPU4tOnTSuz0/UpUK5dW6eVNJinGV1fWgILm6uNgkiLly5IjRp+WR7++r167r1u07NvvJ628216sNmsbb/607dxQVZbYZz5yPfO87srvBIRo1cYrc3dyUO1fs35XOTk7KlydPkttOzDHPEm17/L0eFGS9R1x6cJ941sz/HXMT2rcT+q58/HPmaKKjo7Vo+Up1atdGC5fbzklx9fp1m20rSbly5tTV63Gf+HjU9Ru2fw/lyGG7j1y9fkO5H2k/S6ZMcnF2jrd9L09PVa5Q3uZ7NVuWLDaTOubMkSPeqxyfN0ajUW+8Vk279+1XaHi43NzcbJY/+v176cpV5c8b9757+cpV9fvqW/0wsL/NvBhx4TiY8u7dv6dPvh6sS1euaOzwYcqUMUOij0mxfVc+3Fd+/P1P63dg7y++0t6DgTbfi897wi+R9DuMYSNG6r32bdWsUQO5u7kpnZeXfN5po/q1auqPUWMT3c7ygDVqWLeWXixeVCaTSV2928vD7cnONnp6esoSbdHtO3dkMBjUtGH9JN2r+Ns/o1XvjZp6v5O39Us9e7as+qh7F5UvU0oF8+eTzzttlCtnDhkMBqXz8lKbls109sJFm1/RFyxdoYplS6tD67c0f8nyJ3ovqennP/5Wp3Zt1bZlc+uPF/nz5tE3n/eL837UhzZu3S4XFxf1eO9dubm5ysnJSZUeO2Nw6fIVde7dV281axznBDeJtXTVarVp2UwvFCwgZ2dn9erso2s3bijw3wcTKf177LjerFdHRqNRxYsU1pv16ljXfalEMZUp+ZKcnJwUERmp8IgImf+f0MyYt0Debd623qrh5uaqKhXLK3siriB4Hv177LjKlCypgvnzycXFRR90fc/mj/0SxYqqi3d79R88RF9+96OaNKynV16uGGtbJpNJ5cuU0rDBX2vP/oPavH2ndVmBvHnVonEjGY1GvVa1il6uUE4rVsc974aju34jSDv37lefnt3k5uaqnDmyq0vHdlr0/+Sj+itVlT9vHhkMBoWGhSrKbLY+Bu7mrVvK+8hkcVevXde+wEP6oOt7cnV1Ub48udWiSaN4+z905KiuXLuunp19rFeF5MyRXa9WeTne/i0Wi1atW6+enX2UzstLWbNk1rvvJP9HwGdROi8v9ezso4L588loNMrNzVUdWr+lO8HBOnPunNzd3NS0YX2l8/KSJBUpVFCdO7bT1p27ktzXkxzzlgesUcM6tVTqxRJycnJSt3c7yP2RpCahfTuh78rHP2eOyG/WHPX85Aut37zVpnzTth3KnCmj3m7eREajUeXLlFKjurVtbgGIz/LVa+XzThtlyZRJXp6e6urd3mb50pWr1bljO+XInk3ubm7q98H72r57T6xn+Q0Gg0oUK6qhg75S0K1b1u8ISXJ3c1O3dzvIyclJpV4soYZ1amnpytVPsCUcT8H8+fTdl5/J09NTU2fO0bETJ5UnZ06VL1NKRqNR77Ztbb3FVZLmLVmm+rVq6o3qr8poNMrL01OlX7K9/Hvz9p0a8N2P+mXw16pcoXys/XIcfLqioqL0ycDBOnfxksb8/osypk+fqGNSvVo1bL4rb92+rQOH/o2lB8SGy/sdxNqNm/XJwEHq+m4Hfda7pyyWaB04dFhdP/5Eh48cS3Q723fv1eiJU/T7D4Pk6uqqWfMX6ez587p3/36SY9qyfacC1m3QzAljdP/+fS1ZGaB9gYn/pe3IsePq1Osjde/krdlTxsnJ5KTrQUEKWLdBx06ckoeHu4oXK6I2LZspfTovhYdHaF/gIX30xVc27Vy8fFm79x9UmZIvaumqZ/9AunHrNn3wWX919e6gHp0fXLJ59ep1LVkZoBtBN5Utnss2wyMi9H7fz/TJBz20bJa/JGnnnn0x7uu/cvWaunzUT2N+/0Umk0njpvg9UayLlq9S5oyZ9MeP3yldOi8d+veoPu4/0Ho2cugff2vwl59p49L52nfwkBatWGU9AHt5eKpvr+7Kmzu3osxROhB4WEN+/1P/a+/O42u68z+Ov24SIZKQRHjIYqulSsdWsVW1RQ2CqqXTqaWCUDtFVFRsnYmWTktr31JBo5YISezaYBDhhw6tNWKJoLKHm/Vm/jBzf72NanTaaq738/HIH+fc7/mc7308cnPuO9/v9xyA/YeOYG9vT9DEcXh5epCXm8fp784ye95nv6if1i7uxEk2bY0kZOE8srOzWbwqlLvG+/ficChThtnTprBg+SrzOv5Zcz5m5uQA/jJwKCn/ecTlqgWfYDIVkl+Qz5Wr14nevZewzREW5zl0NI4G9Z/hneFDSUlNZcr7s7mWeOP3fKt/OIEz/86ksSOJ/nItOTm5bN+zl5D/jLJW8fIgYPRw3FxdMBqz2bv/IBsiIgFYu2EzMyZPJCYqnJPfnGbM5KkEzgpm+qTx7AnfwNXr14netZdOr/z0WlGTycSYd99j9NDBbA5dgWNZR27eusWmbdFA3EPPP/uTz5g6cRxR69dwJyWFDVu2/mr3kPgjycvPo5K7O59+8DfcXF3Iyc3l7PkLjJwYSHZ2DmXKlKZT+5cZN3wI9qVKkZKaxt6YAywOWf3I5/ol17zY4ydYtDKEubOCKF26NBsjIrmUkGB+/WGfbfj5v5UP+j2zNhmZWcQeP1Fkf2ZWFiMnBjJh1DBG+Q/i++Rk/v6PecUe8Vseuo4Kbq5sCl1BVtZdQr5Yz4utWpKXe//70Mq1X+BQpjSfL5yHvb09x06c4r33P7CoERwUSEGBCZPJRGJSEl8fPMTqsA0Wsy8vJSRga2vL7vD1ZGfnsGD5qiLX7CfJmLf9GT7ID5PJxO07dzgUG0ffISNISUsjOTWVeUuWMWdGEDY2NqzbFG7xeTl7/gITg2YyfNAAZk4OwGg0sm5juMW6foDDcceZPONvzJ4+hSmzgjkcdxzQdfD3VFBQQMC0WQQHBbJ03lzeHhdAwJgRD70mRUTtYPTQwdSvW4eL8Qm8M2Waxew3eTiDk3dN6577Jf8TOzs7vt62mRETJ3PqEQK7iIj8b/z6vEGzJo0YNv7hdwT/NTxdqyZfLF9Ek5c6/Hxj+U2FrVjMug2bi0xXl8erQf16LJs3l+btHz4DR0Tkj0jT+6WItm1aU7q0PWXKlGbs2/6kZ2Rw5uy5x90tERGrVrdObfMzo+vWqc1fe3Rn9w+eJy8ivx83FxeaNmpovrfRSP+B7I058Li7JSLyi2h6vxTh26E90yaNx4CBcxcvMXbyVPM6VBER+W24li/HlJlBuLm6kJqWzubI6BJxHxIRa2RjY8OEUcOo4uVJdnYOR44d58P5Cx53t0REfhFN7xcRERERERGxUpreLyIiIiIiImKlFPpFRERERERErJRCv4iIiIiIiIiVUugXERERERERsVIK/SIiIiIiIiJWSqFfRERERERExEop9IuIiIiIiIhYKYV+ERERERERESul0C8iIiIiIiJipRT6RURERERERKyUQr+IiIj8rqLWr2Fe8KzH3Q0REZEngt3j7oCIiIj8+rp17MD0dyeYt3Pz8sjIyORC/GUOHoklInon94zGR67boH49Wvo8x7qN4WRmZf2aXRYREZHfgEK/iIiIFVu48nNuJN3Ezs6OCm6uNG3UkAkjh9H39V6MnTyVC/GXH6leo2frM3RAP7bu2KXQLyIiUgIo9IuIiFixf8Ye5btzF8zbq9aG4dO4EfNmz+KT4Fn06D+QnJzcx9hDERER+S0p9IuIiDxh4k6cZNnqtYzyH0jnV9oTHhlN7adq0Pf1XjRp+CcqulcgMzOLg7FH+WTRUtIzMgEYOqAfQwf0AyAqLNRcz/eNfiTdvEW3Tn/Gt0N7atWojpOTI9cSbxC2eQsbIyIf2I+WPs8x5m1/qletwvUbSSxcEcK+/QfNr5dzdmJQ3zdp1awpnh6VMZkKOXX6DPOXLOf8pXiLWm/06E6vbr54elQmNy+PxBtJrPlyE9v37DO3qehegeGDBvBCi+Y4Oztx7Xoiq9dvZOv2nY9cS0REpKRQ6BcREXkCRe3awyj/gbT0eY7wyGha+DyHl2dlIrbvJDkllZo1qtGjS2dqVq9O/2GjANi3/yDVqnjTsd3LzP1sEWnpGQCkpqUB0PvVrly6nEDMPw9RUGCiTasWBI4bjY3Bhi+3bLU4f9Uq3gRPm8KmrVFs27GLVzt15MPp7zEyIJAjx/4PAC9PD15q3Yo9MQdITErCzdWVXt18WTb/I3r2H8Sd5BQAXuvSmYDRw9kTc4B1m8IpbW9P7ZpPUf+Zp81BvYKrK6sXfUphYSFh4RGkpafzfHMfpk8aj5NjWdZtDC92LRERkZJEoV9EROQJdPv7O2TevYu3pwcAX27ZSuj6jRZt/nXmO4KDAmnc4FlOfHOaC/GXOXv+Ih3bvcxXBw+RdPOWRfvBY96xWCqwPjyCBXOC6ft6zyKhv5q3FxOCZppH9rdE7SA8dCWjhw7myLHhAFyMT6B7Xz8KCwvNx0Xt2kN46Eq6+3Zi+eq1ALzQsjmXLicQMO2nnwgwwt8PWxsbevv5m2cubIyIJDgokKF+/dm0LYqcnNxi1RIRESlJ9Mg+ERGRJ5TRaKRs2bIAFmHd3t4el/Ll+Obb7wCoW7tWser9sIaToyMu5ctx7OQpvD09cHJ0tGj7fXKyxVT+u/fuEblrN3Vr16KCqysAeXl55sBvY2ND+XLOGI1Grly7zjN1apuPzczMolKlitSrW+cn+9a2TWtiDh3GYDDgUr6c+efw0WM4OzpSt3btYtcSEREpSTTSLyIi8oRycHAgJTUNuL9+fsiAfnRs+zJuri4W7ZycnIpVr+Gz9Rk2sD9/qvcMDmXK/KiGI1l375q3r16/UeT4hKvXAfD0qExyaioGg4E3e71G7+7d8KpcGVvb/x+r+O/SAoCQL9bTvGlj1iz+jKuJNzgSd5zte/Zx6vQZANxcXCjn5ETPrr707Or7wL7/9z3/XC0REZGSRqFfRETkCVSpojvOjvdvtgfw4YypNKhfj9VhGzh38RJGoxGDwcCCOcHYGAw/W8/b04MlH39IwtVr/GPhEm7e/p78vDxat2hOn949MBSjxo8N6vcmwwe+RcT2nSxaEUJGZiYmk4kJI4dZ1Lt85Srd+/rRpmULWjXzoV2b1rzevStLP1/D4lWrzW2jd+9l245dDzzXhUuXi1VLRESkpFHoFxEReQL5dmgPwKGjx3B2cqJZk8YsWrWaZZ+vMbep4uVZ5LhCCovsA2jTqgX2pUoxNjCIm7dum/c3bdzoge2rehetXb2qNwA3km4C0P7FF4g7cYoZH3xk0c7Z2YnUH4z0A2Rn57Drqxh2fRWDnZ0dH82axqC+b7JybRip6encvWfExsaG2OMnHtif4tbKzdXjDUVEpGTRmn4REZEnjE/jRvj370Ni0k2279mHyWQCwIDlaHyf3j2LHGvMzgag3I+m/JtMRf8Z4OToyKud/vzAPlSsUIG2bVqbtx3LlqVLh1c4d/ESyampABQUFBSZIdD+pTZUcne32Fe+nLPFdn5+PvEJVzAYwM7WFpPJxN6YA7R78QVqVq9WpC+uLuWLXUtERKSk0Ui/iIiIFXu+eTNqVK2Kna0tbq6u+DRpRIumTUi6dZuxk6eSm5tLbm4ux0/9i7f+2hs7O1tu37lDS5+meHlULlLv23PnARgx2I+d+74mPz+fmEOHORx3jLz8fOYHv8/GrZGUdXDgtS6dSElLw72CW5E6V64nEhTwDvXrPk1ySgrdO3fCzdWFabPnmNscOBzLkLf6Mn3SBE6d+ZZaT1Wn8yvtuH4jyaLWwrmzSU5J5eTpMySnpPJUtar8pcerHDgSyz2jEYBPl67Ap0kjVi/+lPCo7cQnXKG8szN169SmedMmvNSlR7FriYiIlCQGJ++aD56nJyIiIiVWt44dmP7uBPN2Xn4+GRmZXIiP58DhWCKid1qE2IruFZg0ZiRNGzfEYDBwJO44c+YvZNfmMJaEhLIkJNTcdnD/PvTq5ou7mxs2Njb4vtGPpJu3aNOqBSMG+1HV24vklFQ2bNlGano60yeNN7cBiFq/hovxlwnbvIWxw4ZQrYo3iUk3WbgihL0xB8znKVWqFCMH+9GpfVucnBw5e+EiHy9cyqghgwAYMvb+++vRtTOd2rejZo1qlHVw4Nbt79m3/yDLQ9dx9949cz03Fxf83+rLi8+3xN3NjfSMDC4lJLBzXwzhkdGPVEtERKSkUOgXERERERERsVJa0y8iIiIiIiJipRT6RURERERERKyUQr+IiIiIiIiIlVLoFxEREREREbFSCv0iIiIiIiIiVkqhX0RERERERMRKKfSLiIiIiIiIWCmFfhERERERERErpdAvIiIiIiIiYqUU+kVERERERESslEK/iIiIiIiIiJVS6BcRERERERGxUv8G6ejVqOEPRPsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "originalCsv = 106.8\n", "clickHouse_size_on_disk = 20\n", "influxDb_size_on_disk = 84\n", "postgresql_size_on_disk = 128\n", "S3_size_size_on_disk = 31.8\n", "mongoDb_size_on_disk = 174.5\n", "DuckDb_size_on_disk = 36.5\n", "Kdb_size_on_disk = 99.2\n", "\n", "\n", "def plot(dark):\n", " mpl_style(dark)\n", " plt.figure().set_figwidth(12, 10)\n", " x = np.arange(8) # change here\n", " width = 0.50\n", " y1 = [\n", " originalCsv,\n", " clickHouse_size_on_disk,\n", " influxDb_size_on_disk,\n", " postgresql_size_on_disk,\n", " S3_size_size_on_disk,\n", " mongoDb_size_on_disk,\n", " DuckDb_size_on_disk,\n", " Kdb_size_on_disk,\n", " ] # change here\n", "\n", " # plt.bar(x - 0.2, y2, width)\n", " plt.bar(x + 0.0, y1, width, color=(0.2, 0.4, 0.6, 0.6))\n", " plt.xticks(\n", " x,\n", " [\n", " \"Original CSV\",\n", " \"Click House\",\n", " \"InfluxDb\",\n", " \"Postgresql\",\n", " \"S3 Parquet\",\n", " \"MongoDb\",\n", " \"DuckDb\",\n", " \"Kdb+\",\n", " ],\n", " )\n", " plt.xlabel(\"Databases\")\n", " plt.ylabel(\"Megabytes\")\n", " plt.legend([\"Size Ocupied on Disk In MB\"]) # ver\n", " plt.rcParams.update({\"font.size\": 8})\n", " plt.style.use(\"dark_background\")\n", " plt.title(\"Size On Disk Occupied with the Same Archive on different Databases\")\n", " plt.show()\n", "\n", "\n", "plot(dark=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "428abef6-c1df-4abf-83f8-a74cb8af4208", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }