{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import time\n", "os.chdir(os.path.dirname(INSERT_PATH_HERE))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import requests\n", "import numpy as np\n", "import pandas as pd\n", "import json\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "96 entities not found\n" ] } ], "source": [ "df = pd.read_csv ('1kmovies.csv',sep=\"\\t\")\n", "dfX = df[['Movie']]\n", "\n", "not_found = 0\n", "\n", "vectors = []\n", "entities =list(dict.fromkeys(df['Movie'].to_list()))\n", "for e in entities:\n", " entity = e[e.rindex(\"/\")+1:]\n", " r = requests.get(\"http://kgvec2go.org/rest/get-vector/dbpedia/\" + entity)\n", " x = json.loads(r.text)\n", " # Catch case that an entity is not found in the API\n", " if 'vector' in x:\n", " vectors.append(x['vector'])\n", " else:\n", " vectors.append(np.zeros(200))\n", " not_found = not_found + 1\n", "\n", "print(str(not_found) + \" entities not found\")\n", "dfXvectors = pd.DataFrame.from_records(vectors)" ] }, { "cell_type": "code", "execution_count": 4, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Movie012345678...190191192193194195196197198199
0http://dbpedia.org/resource/Playhouse_90-0.137760-0.589059-0.037958-0.534860-0.4136750.4899860.8348270.483092-0.237307...-0.7463740.178704-0.3009271.041487-0.1146650.074592-0.0486730.689411-0.3758390.637875
1http://dbpedia.org/resource/Looney_Tunes-1.042180-0.4267870.223503-0.041168-0.4137340.1035940.745793-0.070818-0.486270...0.041576-0.289932-0.0113910.7440240.575132-0.176852-0.2891610.196203-1.1270210.352837
2http://dbpedia.org/resource/Merrie_Melodies-0.735772-0.306961-0.0057320.092917-0.477233-0.0229620.886615-0.086885-0.621619...0.165683-0.267800-0.2121830.8356900.5368590.230216-0.4523820.141061-1.0832070.298553
3http://dbpedia.org/resource/American_Playhouse-0.218308-0.3831180.6980630.291182-0.1293090.2272230.1601460.404174-0.492890...0.327066-0.3082090.1565680.2297400.084384-0.2695710.1282570.5005170.0306790.423012
4http://dbpedia.org/resource/Fantasia_(1940_film)0.012596-0.363675-0.200341-0.288007-0.9182490.103618-0.0337920.1843930.351371...-0.8452040.2327620.1356840.178445-0.213599-0.1510710.185861-0.250488-0.5606390.046183
5http://dbpedia.org/resource/Snow_White_and_the...-0.110619-0.022438-0.4365840.132460-0.9681460.210315-0.113157-0.333683-0.110539...-0.721070-0.044716-0.1403880.7409210.212634-0.4322970.4831200.281024-0.7830870.206580
6http://dbpedia.org/resource/Band_of_Brothers_(...-0.301021-0.601196-0.667036-0.477340-0.5210350.2385520.4454940.480574-0.397435...0.194413-0.0416890.322213-0.010924-0.0495400.073796-0.251234-0.478446-0.8187310.169260
7http://dbpedia.org/resource/Pinocchio_(1940_film)0.058439-0.564881-0.317060-0.099454-0.334787-0.0126350.1996920.5487220.033585...-0.3360760.0843920.3695340.6918760.038075-0.2104860.173873-0.005578-0.7965970.358472
8http://dbpedia.org/resource/Harry_Potter_(film...-0.138585-1.1587170.065944-0.110256-1.0142480.0952000.2086440.7833790.462843...-0.144742-0.565039-0.1182080.6906980.125068-0.759913-0.156163-0.250222-0.0470050.022732
9http://dbpedia.org/resource/Red_Dwarf0.131227-0.7951820.650905-1.366069-0.648056-0.0677800.0271300.2168610.528318...-0.493793-0.5400190.1724660.1080050.014064-0.350497-0.185962-0.084622-0.049915-0.043591
10http://dbpedia.org/resource/Gimme_a_Break!-0.426197-0.643072-0.1436840.021588-0.534515-0.5419240.903420-0.0276600.516001...-0.3059900.2792920.0805570.3457030.4337650.0371071.373668-0.186867-0.3588730.585094
11http://dbpedia.org/resource/Last_of_the_Summer...-0.387616-0.8496540.520858-1.152769-0.395122-0.0788610.1342760.767099-0.086088...0.074024-0.180376-0.568238-0.009507-0.7062410.183831-0.243164-0.830150-0.0992410.196781
12http://dbpedia.org/resource/The_Lion_King-0.185161-0.6677580.351287-0.071545-0.7152350.6549800.9425130.299595-0.796929...-0.103406-0.306330-0.0345030.2777800.518103-0.6051220.536551-0.022816-0.4289240.105254
13http://dbpedia.org/resource/The_Philco_Televis...-0.427943-0.492605-0.227726-0.551582-0.155778-0.0702010.7490410.6924730.142140...-0.951145-0.113896-0.2341530.714249-0.2559020.0194030.571655-0.1556270.0627350.238491
14http://dbpedia.org/resource/Sleeping_Beauty_(1...-0.594262-0.284907-0.208800-0.275717-0.7983830.5036910.1536420.466465-0.296610...-0.5424770.1053570.0775650.9307460.081768-0.2181560.095910-0.159626-0.5584230.424275
15http://dbpedia.org/resource/The_Bold_Ones:_The...-0.275917-0.4906520.058167-0.349791-0.6160280.1178020.3159080.584220-0.168284...-0.5896130.179460-0.0829520.514616-0.1245560.3268070.1900470.1405600.3245200.007021
16http://dbpedia.org/resource/Dumbo-0.090244-0.497215-0.320145-0.082811-0.8044570.0490520.170885-0.0626570.201343...-0.5412160.2351220.1322510.4393900.147823-0.2288220.4375670.228110-0.5780950.010694
17http://dbpedia.org/resource/Frozen_(2013_film)-0.632902-1.110231-0.051083-0.036203-0.6184830.6443210.5208050.568159-0.492555...-0.619857-0.0958980.736908-0.0294180.117501-0.3164090.3413460.652590-0.3818500.527155
18http://dbpedia.org/resource/Casino_Royale_(196...0.7730640.109179-0.051000-0.132526-0.7151550.0914280.640842-0.264343-0.260256...0.158924-0.7398660.4991080.398301-0.216687-0.3424710.326373-0.205443-0.1028620.162528
19http://dbpedia.org/resource/The_Pacific_(minis...0.069477-0.758959-0.425278-0.280973-0.8937120.1489440.3986240.288982-0.399282...-0.178115-0.176143-0.460993-0.310192-0.304817-0.0023300.326521-0.118486-0.749635-0.003137
20http://dbpedia.org/resource/Star_Wars_(film)-0.504468-0.495121-1.276071-0.247087-0.5103090.0430880.9046670.165914-0.123610...-0.089242-0.0659290.2803220.7072750.042698-0.2264980.118022-0.405879-0.3227030.222759
21http://dbpedia.org/resource/The_Dick_Powell_Show0.3480110.107263-0.0634370.058328-0.0913510.0223630.2197580.7670880.308749...0.0260860.0051910.2430430.5379950.2507070.2085930.2379560.294168-0.0620480.157651
22http://dbpedia.org/resource/Beauty_and_the_Bea...-0.188234-0.4916750.664066-0.080035-0.6514260.3731240.1296130.297080-0.431981...-0.452267-0.3570040.3463600.0432670.086430-0.4565170.2350750.006192-0.2329160.730093
23http://dbpedia.org/resource/Aladdin_(1992_Disn...-0.485015-0.3215460.368292-0.076003-0.8250970.2389730.1730730.299280-0.567592...-0.634339-0.6746950.2044780.102706-0.259019-0.3507330.1333050.3262420.3841480.450761
24http://dbpedia.org/resource/Cinderella_(1950_f...-0.136178-0.4272340.593715-0.105923-0.3910590.3394420.0647060.549290-0.405299...-0.776572-0.4266980.0459250.0318470.034778-0.4387050.449561-0.188039-0.2605600.615081
\n", "

25 rows × 201 columns

\n", "
" ], "text/plain": [ " Movie 0 1 \\\n", "0 http://dbpedia.org/resource/Playhouse_90 -0.137760 -0.589059 \n", "1 http://dbpedia.org/resource/Looney_Tunes -1.042180 -0.426787 \n", "2 http://dbpedia.org/resource/Merrie_Melodies -0.735772 -0.306961 \n", "3 http://dbpedia.org/resource/American_Playhouse -0.218308 -0.383118 \n", "4 http://dbpedia.org/resource/Fantasia_(1940_film) 0.012596 -0.363675 \n", "5 http://dbpedia.org/resource/Snow_White_and_the... -0.110619 -0.022438 \n", "6 http://dbpedia.org/resource/Band_of_Brothers_(... -0.301021 -0.601196 \n", "7 http://dbpedia.org/resource/Pinocchio_(1940_film) 0.058439 -0.564881 \n", "8 http://dbpedia.org/resource/Harry_Potter_(film... -0.138585 -1.158717 \n", "9 http://dbpedia.org/resource/Red_Dwarf 0.131227 -0.795182 \n", "10 http://dbpedia.org/resource/Gimme_a_Break! -0.426197 -0.643072 \n", "11 http://dbpedia.org/resource/Last_of_the_Summer... -0.387616 -0.849654 \n", "12 http://dbpedia.org/resource/The_Lion_King -0.185161 -0.667758 \n", "13 http://dbpedia.org/resource/The_Philco_Televis... -0.427943 -0.492605 \n", "14 http://dbpedia.org/resource/Sleeping_Beauty_(1... -0.594262 -0.284907 \n", "15 http://dbpedia.org/resource/The_Bold_Ones:_The... -0.275917 -0.490652 \n", "16 http://dbpedia.org/resource/Dumbo -0.090244 -0.497215 \n", "17 http://dbpedia.org/resource/Frozen_(2013_film) -0.632902 -1.110231 \n", "18 http://dbpedia.org/resource/Casino_Royale_(196... 0.773064 0.109179 \n", "19 http://dbpedia.org/resource/The_Pacific_(minis... 0.069477 -0.758959 \n", "20 http://dbpedia.org/resource/Star_Wars_(film) -0.504468 -0.495121 \n", "21 http://dbpedia.org/resource/The_Dick_Powell_Show 0.348011 0.107263 \n", "22 http://dbpedia.org/resource/Beauty_and_the_Bea... -0.188234 -0.491675 \n", "23 http://dbpedia.org/resource/Aladdin_(1992_Disn... -0.485015 -0.321546 \n", "24 http://dbpedia.org/resource/Cinderella_(1950_f... -0.136178 -0.427234 \n", "\n", " 2 3 4 5 6 7 8 ... \\\n", "0 -0.037958 -0.534860 -0.413675 0.489986 0.834827 0.483092 -0.237307 ... \n", "1 0.223503 -0.041168 -0.413734 0.103594 0.745793 -0.070818 -0.486270 ... \n", "2 -0.005732 0.092917 -0.477233 -0.022962 0.886615 -0.086885 -0.621619 ... \n", "3 0.698063 0.291182 -0.129309 0.227223 0.160146 0.404174 -0.492890 ... \n", "4 -0.200341 -0.288007 -0.918249 0.103618 -0.033792 0.184393 0.351371 ... \n", "5 -0.436584 0.132460 -0.968146 0.210315 -0.113157 -0.333683 -0.110539 ... \n", "6 -0.667036 -0.477340 -0.521035 0.238552 0.445494 0.480574 -0.397435 ... \n", "7 -0.317060 -0.099454 -0.334787 -0.012635 0.199692 0.548722 0.033585 ... \n", "8 0.065944 -0.110256 -1.014248 0.095200 0.208644 0.783379 0.462843 ... \n", "9 0.650905 -1.366069 -0.648056 -0.067780 0.027130 0.216861 0.528318 ... \n", "10 -0.143684 0.021588 -0.534515 -0.541924 0.903420 -0.027660 0.516001 ... \n", "11 0.520858 -1.152769 -0.395122 -0.078861 0.134276 0.767099 -0.086088 ... \n", "12 0.351287 -0.071545 -0.715235 0.654980 0.942513 0.299595 -0.796929 ... \n", "13 -0.227726 -0.551582 -0.155778 -0.070201 0.749041 0.692473 0.142140 ... \n", "14 -0.208800 -0.275717 -0.798383 0.503691 0.153642 0.466465 -0.296610 ... \n", "15 0.058167 -0.349791 -0.616028 0.117802 0.315908 0.584220 -0.168284 ... \n", "16 -0.320145 -0.082811 -0.804457 0.049052 0.170885 -0.062657 0.201343 ... \n", "17 -0.051083 -0.036203 -0.618483 0.644321 0.520805 0.568159 -0.492555 ... \n", "18 -0.051000 -0.132526 -0.715155 0.091428 0.640842 -0.264343 -0.260256 ... \n", "19 -0.425278 -0.280973 -0.893712 0.148944 0.398624 0.288982 -0.399282 ... \n", "20 -1.276071 -0.247087 -0.510309 0.043088 0.904667 0.165914 -0.123610 ... \n", "21 -0.063437 0.058328 -0.091351 0.022363 0.219758 0.767088 0.308749 ... \n", "22 0.664066 -0.080035 -0.651426 0.373124 0.129613 0.297080 -0.431981 ... \n", "23 0.368292 -0.076003 -0.825097 0.238973 0.173073 0.299280 -0.567592 ... \n", "24 0.593715 -0.105923 -0.391059 0.339442 0.064706 0.549290 -0.405299 ... \n", "\n", " 190 191 192 193 194 195 196 \\\n", "0 -0.746374 0.178704 -0.300927 1.041487 -0.114665 0.074592 -0.048673 \n", "1 0.041576 -0.289932 -0.011391 0.744024 0.575132 -0.176852 -0.289161 \n", "2 0.165683 -0.267800 -0.212183 0.835690 0.536859 0.230216 -0.452382 \n", "3 0.327066 -0.308209 0.156568 0.229740 0.084384 -0.269571 0.128257 \n", "4 -0.845204 0.232762 0.135684 0.178445 -0.213599 -0.151071 0.185861 \n", "5 -0.721070 -0.044716 -0.140388 0.740921 0.212634 -0.432297 0.483120 \n", "6 0.194413 -0.041689 0.322213 -0.010924 -0.049540 0.073796 -0.251234 \n", "7 -0.336076 0.084392 0.369534 0.691876 0.038075 -0.210486 0.173873 \n", "8 -0.144742 -0.565039 -0.118208 0.690698 0.125068 -0.759913 -0.156163 \n", "9 -0.493793 -0.540019 0.172466 0.108005 0.014064 -0.350497 -0.185962 \n", "10 -0.305990 0.279292 0.080557 0.345703 0.433765 0.037107 1.373668 \n", "11 0.074024 -0.180376 -0.568238 -0.009507 -0.706241 0.183831 -0.243164 \n", "12 -0.103406 -0.306330 -0.034503 0.277780 0.518103 -0.605122 0.536551 \n", "13 -0.951145 -0.113896 -0.234153 0.714249 -0.255902 0.019403 0.571655 \n", "14 -0.542477 0.105357 0.077565 0.930746 0.081768 -0.218156 0.095910 \n", "15 -0.589613 0.179460 -0.082952 0.514616 -0.124556 0.326807 0.190047 \n", "16 -0.541216 0.235122 0.132251 0.439390 0.147823 -0.228822 0.437567 \n", "17 -0.619857 -0.095898 0.736908 -0.029418 0.117501 -0.316409 0.341346 \n", "18 0.158924 -0.739866 0.499108 0.398301 -0.216687 -0.342471 0.326373 \n", "19 -0.178115 -0.176143 -0.460993 -0.310192 -0.304817 -0.002330 0.326521 \n", "20 -0.089242 -0.065929 0.280322 0.707275 0.042698 -0.226498 0.118022 \n", "21 0.026086 0.005191 0.243043 0.537995 0.250707 0.208593 0.237956 \n", "22 -0.452267 -0.357004 0.346360 0.043267 0.086430 -0.456517 0.235075 \n", "23 -0.634339 -0.674695 0.204478 0.102706 -0.259019 -0.350733 0.133305 \n", "24 -0.776572 -0.426698 0.045925 0.031847 0.034778 -0.438705 0.449561 \n", "\n", " 197 198 199 \n", "0 0.689411 -0.375839 0.637875 \n", "1 0.196203 -1.127021 0.352837 \n", "2 0.141061 -1.083207 0.298553 \n", "3 0.500517 0.030679 0.423012 \n", "4 -0.250488 -0.560639 0.046183 \n", "5 0.281024 -0.783087 0.206580 \n", "6 -0.478446 -0.818731 0.169260 \n", "7 -0.005578 -0.796597 0.358472 \n", "8 -0.250222 -0.047005 0.022732 \n", "9 -0.084622 -0.049915 -0.043591 \n", "10 -0.186867 -0.358873 0.585094 \n", "11 -0.830150 -0.099241 0.196781 \n", "12 -0.022816 -0.428924 0.105254 \n", "13 -0.155627 0.062735 0.238491 \n", "14 -0.159626 -0.558423 0.424275 \n", "15 0.140560 0.324520 0.007021 \n", "16 0.228110 -0.578095 0.010694 \n", "17 0.652590 -0.381850 0.527155 \n", "18 -0.205443 -0.102862 0.162528 \n", "19 -0.118486 -0.749635 -0.003137 \n", "20 -0.405879 -0.322703 0.222759 \n", "21 0.294168 -0.062048 0.157651 \n", "22 0.006192 -0.232916 0.730093 \n", "23 0.326242 0.384148 0.450761 \n", "24 -0.188039 -0.260560 0.615081 \n", "\n", "[25 rows x 201 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dfXcomplete = pd.concat([dfX,dfXvectors],axis=1,join=\"inner\")\n", "dfXcomplete.head(25)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 -0.230488\n", "1 -0.439156\n", "2 0.197780\n", "3 -0.135158\n", "4 -0.728127\n", " ... \n", "195 -0.274856\n", "196 0.331307\n", "197 0.062966\n", "198 -0.103116\n", "199 0.321939\n", "Length: 200, dtype: float64\n", "http://dbpedia.org/resource/Cinderella_(1950_film)\n", "http://dbpedia.org/resource/Aladdin_(1992_Disney_film)\n", "http://dbpedia.org/resource/Bambi\n", "http://dbpedia.org/resource/Beauty_and_the_Beast_(1991_film)\n", "http://dbpedia.org/resource/Tangled\n", "http://dbpedia.org/resource/Peter_Pan_(1953_film)\n", "http://dbpedia.org/resource/The_Three_Caballeros\n", "http://dbpedia.org/resource/The_Little_Mermaid_(1989_film)\n", "http://dbpedia.org/resource/Beauty_and_the_Beast_(2017_film)\n", "http://dbpedia.org/resource/Saludos_Amigos\n" ] } ], "source": [ "from sklearn.neighbors import NearestNeighbors\n", "\n", "knn = NearestNeighbors(n_neighbors=10, algorithm='auto', metric='cosine')\n", "knn.fit(dfXvectors.to_numpy())\n", "\n", "user1 = [\"http://dbpedia.org/resource/The_Matrix\",\"http://dbpedia.org/resource/Interstellar_(film)\",\"http://dbpedia.org/resource/Blade_Runner\"]\n", "user2 = [\"http://dbpedia.org/resource/Bambi\",\"http://dbpedia.org/resource/Aladdin_(1992_Disney_film)\",\"http://dbpedia.org/resource/Cinderella_(1950_film)\"]\n", "\n", "def get_recommendations(user_profile,df_vectors):\n", " df_uservector = df_vectors[dfX['Movie'].isin(user_profile)].mean()\n", " print(df_uservector)\n", " return knn.kneighbors([df_uservector], 10, return_distance=False)\n", "\n", "for index in get_recommendations(user2,dfXvectors)[0]:\n", " print(dfX.at[index,'Movie'])" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3 4 5 6 \\\n", "55 0.318401 0.139367 -0.701737 -0.279444 -0.897473 0.299331 0.466589 \n", "59 -0.256155 -0.262864 -0.451567 0.016916 -1.072240 -0.461869 -0.136405 \n", "362 0.140722 0.256464 -0.289506 -0.067005 -0.788516 -0.310958 0.428743 \n", "719 0.011412 0.284625 -0.402758 0.161706 -0.642788 -0.145495 0.289870 \n", "413 0.276396 -0.000320 -0.489742 0.338217 -0.533667 0.146200 0.010560 \n", "828 0.647876 0.425028 -0.850197 0.543665 -0.848872 0.073361 0.156451 \n", "986 0.442210 0.337279 -0.566876 0.210853 -0.584514 0.171120 0.322006 \n", "283 -0.426962 -0.150118 -0.368088 0.185758 -0.907161 -0.417741 -0.040905 \n", "473 0.322986 0.083523 -0.458807 0.396477 -0.595785 0.204056 0.398959 \n", "209 -0.013298 0.115373 -0.373912 0.026581 -0.619941 -0.011785 0.265499 \n", "24 -0.136178 -0.427234 0.593715 -0.105923 -0.391059 0.339442 0.064706 \n", "23 -0.485015 -0.321546 0.368292 -0.076003 -0.825097 0.238973 0.173073 \n", "73 -0.070271 -0.568688 -0.368667 -0.223548 -0.968225 0.254485 0.300212 \n", "22 -0.188234 -0.491675 0.664066 -0.080035 -0.651426 0.373124 0.129613 \n", "79 -0.412844 -0.120966 0.301059 -0.398393 -0.912849 0.290974 0.357487 \n", "28 -0.534488 -0.845421 -0.352786 -0.010685 -0.768865 0.090177 -0.008820 \n", "100 0.019181 -0.419963 -0.257470 0.046528 -0.791790 0.003891 0.234078 \n", "27 -0.566510 0.098564 0.704964 -0.300415 -0.802405 -0.135183 -0.414215 \n", "480 0.156848 -0.703100 0.132047 0.089070 -0.618986 0.162045 0.177390 \n", "251 -0.377803 -0.470877 0.000738 0.019628 -0.452400 0.438161 -0.055662 \n", "\n", " 7 8 9 ... 190 191 192 \\\n", "55 0.063447 -0.631822 -0.277138 ... -0.176155 -0.744473 -0.330266 \n", "59 0.559580 0.262314 0.568922 ... 0.052474 -0.300920 0.326962 \n", "362 0.183505 0.100805 0.693227 ... -0.072536 -0.380478 0.196136 \n", "719 0.299873 -0.330871 0.628309 ... -0.208002 -0.316287 0.055104 \n", "413 0.314999 -0.064188 0.285488 ... 0.265778 -0.038251 -0.096124 \n", "828 0.250268 0.447005 -0.032032 ... -0.206418 0.091566 0.171927 \n", "986 0.062472 -0.071037 0.296194 ... -0.364699 -0.091305 0.061686 \n", "283 -0.090521 -0.153316 0.268322 ... -0.266540 -0.365087 0.009403 \n", "473 0.758679 -0.111542 -0.099624 ... -0.460300 0.174754 0.546240 \n", "209 0.155927 -0.212716 0.207713 ... -0.178869 -0.107379 -0.075707 \n", "24 0.549290 -0.405299 0.323797 ... -0.776572 -0.426698 0.045925 \n", "23 0.299280 -0.567592 0.222896 ... -0.634339 -0.674695 0.204478 \n", "73 0.052589 -0.029153 0.247146 ... -0.594128 -0.133593 0.039135 \n", "22 0.297080 -0.431981 0.024356 ... -0.452267 -0.357004 0.346360 \n", "79 -0.373975 -0.735043 0.191279 ... -0.470608 -0.775667 0.453187 \n", "28 0.141059 0.042978 0.301992 ... -0.723882 -0.407864 0.334190 \n", "100 0.513376 -0.350695 -0.039778 ... -0.065682 0.462035 0.110817 \n", "27 0.170616 -0.434117 0.171072 ... -0.968996 -0.331415 -0.259925 \n", "480 -0.120469 -0.291758 0.419111 ... -0.427550 -0.549338 0.302811 \n", "251 0.521283 -0.131151 -0.294863 ... -0.703387 -0.138630 0.206960 \n", "\n", " 193 194 195 196 197 198 199 \n", "55 0.049837 0.209204 0.004850 -0.342679 -0.444115 -0.132099 -0.176516 \n", "59 0.671042 0.403135 -0.007217 0.093031 -0.461279 -0.175980 -0.048493 \n", "362 0.741731 -0.111106 0.415001 0.382035 -0.388946 -0.468983 0.506479 \n", "719 0.648155 -0.426689 0.325136 -0.040030 -0.278267 0.202169 0.406792 \n", "413 0.239046 -0.383956 -0.292289 -0.253236 -0.492697 -0.206753 -0.161367 \n", "828 0.484794 -0.436635 0.042103 0.073556 -0.015005 -0.893553 0.354957 \n", "986 0.498790 0.065654 0.063530 0.546541 -0.054107 -0.741318 0.142517 \n", "283 0.502563 0.363444 -0.033896 0.385330 -0.580187 -0.047346 0.336268 \n", "473 0.692509 0.051536 0.205738 0.086837 -0.353917 -0.586069 0.198249 \n", "209 0.552940 0.121073 0.056891 -0.245650 0.146369 -0.429660 0.507857 \n", "24 0.031847 0.034778 -0.438705 0.449561 -0.188039 -0.260560 0.615081 \n", "23 0.102706 -0.259019 -0.350733 0.133305 0.326242 0.384148 0.450761 \n", "73 0.793185 0.186650 -0.035128 0.411055 0.050694 -0.432934 -0.100027 \n", "22 0.043267 0.086430 -0.456517 0.235075 0.006192 -0.232916 0.730093 \n", "79 0.480819 -0.315200 -0.259552 -0.207007 0.101626 -0.427244 0.565416 \n", "28 0.799243 -0.052781 -0.720815 0.528965 0.235538 -0.320678 -0.237203 \n", "100 0.392284 -0.060565 -0.551313 0.285942 -0.047484 -0.520079 0.261523 \n", "27 0.289119 -0.149168 -0.367965 0.236865 0.200093 -0.042937 0.716321 \n", "480 0.121103 -0.189923 -0.379302 -0.177058 -0.413966 -0.194548 0.269128 \n", "251 0.596162 0.093474 -0.143856 0.398926 0.555437 -0.403876 0.016331 \n", "\n", "[20 rows x 200 columns]\n" ] } ], "source": [ "arr1 = get_recommendations(user1,dfXvectors)\n", "arr2 = get_recommendations(user2,dfXvectors)\n", "arr = np.append(arr1,arr2)\n", "df = dfXvectors.iloc[arr]\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfoAAAHgCAYAAABNWK+0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAB96klEQVR4nO3deVxVRf/A8c+AK2pqbpkloinKegVxX8C9NMstLSxxzdyefMrKx0wr/WXpoz36VGaLWJKamKYt5kruj4KCAuKOmltoioKiLPP748IJZLvIfv2+X6/74p45c2bmTje/98yZM0dprRFCCCGEdbIp7gYIIYQQovBIoBdCCCGsmAR6IYQQwopJoBdCCCGsmAR6IYQQwopJoBdCCCGsWJnibkBhqFatmn7iiSeKuxmlWnx8PJUqVSruZpRq0of5J32Yf9KH+Vca+jAkJOSK1rpWVvusMtDXqVOH4ODg4m5GqRYUFIS3t3dxN6NUkz7MP+nD/JM+zL/S0IdKqTPZ7ZOheyGEEMKKSaAXQgghrJgEeiGEEMKKSaAXQgghrJgEeiGEEMKKSaAXQgghrJgEeiGEEMKKSaAXQgghrJgEeiGEEMKKSaAXQgghrJgE+kJw9epVTCYTJpOJRx55hHr16hnbd+/ezXf53t7eeVriNygoiN69e+e7XiGEEKWPVa51X9xq1KhBaGgoADNmzKBy5cq8/vrrxdsoIYQQDyQ5oy8iX3zxBV5eXri7u9O/f39u3boFgJ+fHxMnTqRt27Y0bNiQwMBAAFJSUhg7dixNmzalW7duPPXUU8a+9DZu3EibNm3w8PBg4MCBxMXFAbBhwwaaNm2Kh4cHP/zwQ9F9UCGEECWKBPoi0q9fP/bv309YWBjNmjXjq6++MvZdvHiRnTt38tNPP/HWW28B8MMPPxAdHU1kZCTffvste/bsyVTmlStXmDlzJps3b+bAgQO0aNGCefPmkZCQwKhRo1i/fj0hISFcunSpyD6nEEKIkkWG7otIeHg4b7/9NtevXycuLo4ePXoY+5599llsbGxwcnLi8uXLAOzcuZOBAwdiY2PDI488go+PT6Yy9+7dS2RkJO3atQPg7t27tGnThqioKBwcHGjcuDEAQ4YMYfHixUXwKYUQQpQ0EugLUEAATJ0KZ89C/fowa9bf+/z8/Fi7di3u7u74+/sTFBRk7CtfvrzxXmttcX1aa7p168by5cszpKfNDxBCCCFk6L6ABATA6NFw5gxobf47ejQcOmTef/PmTerWrUtiYiIBAQG5lteuXTtWr15NSkoKly9fzvDDIE3r1q3ZtWsXJ06cACA+Pp5jx47RtGlToqOjOXnyJECmHwJCCCEeHBLoC8jUqZA6v85w6xZs3Wp+//7779OqVSvatWtH06ZNcy2vf//+PPbYYzg5OTFkyBA8PDyoWrVqhjy1atXC39+f559/Hjc3N2PYvkKFCixevJhevXrh4eFB7dq1C+pjihImIAAaNAAbG/NfC35DCiEeMDJ0X0DOns06/caNGaTdWffKK69k2u/v759hO23WvI2NDXPnzqVy5cpcvXqVli1b4urqCpDh7L5z587s378/U7k9e/YkKioqz59DlB5po0hpPzDTRpEAfH2Lr11CiJJFAn0BqV/f/A9tVun3q3fv3ly/fp27d+8ybdo0HnnkkfsvTFid7EaRpk6VQC+E+JsE+gIya1bGsysAO7uME/LyKqvr8kKkyW4UKbt0IcSDSa7RFxBfX1i8GOztQSnz38WL5cxKFJ7sRovyM4okhLA+EugLkK8vREdDSor5rwR5UZhmzTKPGqWX31EkIYT1kUAvRCklo0hCCEtIoBeiFEs/inTunC1z5phwd3fHw8OD3bt3AxAdHY2Li0ueyvXz88vy2QrZmTFjhvGURicnJ1m7QYgSRAK9EFaiYsWKhIaGEhYWxgcffMCUKVOKtP5JkyYRGhrKjz/+yMsvv0xiYmKR1p8mOTm5WOoVoqSSQC+EFbpx4wbVq1fPlB4dHU2HDh3w8PDIcNavtWb8+PE4OjrStWtX/vzzT+OYkJAQOnXqhKenJz169ODixYs51t24cWPs7Oy4du0aQUFB9O7d29g3fvx4Y+2IBg0aMH36dDw8PHB1dTXWfZgxYwbDhw/H29ubF154gQULFhjHL1u2jJYtW2IymXj55ZeNoF65cmVee+013N3ds3wAlBAPMgn0QliJ27dvYzKZaNq0KSNHjmTatGmZ8tSuXZtNmzZx4MABVq5cycSJEwFYs2YNR48eJTIykm+++cb4AZCYmMiECRMIDAwkJCSE4cOHM3Xq1BzbceDAARo3bmzRiow1a9bkwIEDvPLKK8ydO9dIj4qK4rfffuOzzz7j3XffJTExkSNHjrBy5Up27dpFaGgotra2xnLS8fHxtGrVirCwMNq3b29xnwnxIJD76IWwEmlD9wB79uzhpZdeIjw8PEOexMRExo8fbwTKY8eOAbB9+3aef/55bG1tefTRR+ncuTMAR48eJTw8nG7dugHmYfG6detmWf/8+fNZsmQJx44dY/369Ra1uV+/fgB4enryww8/GOm9evWifPnyVK1aldq1a3P58mW2bNlCSEgIXl5egPmHTdqPCVtbW/r3729RnUI8aCTQC2GF2rRpw5UrV4iJicmQPn/+fOrUqUNYWBgpKSlUqFAhx3K01jg7O1s0HD5p0iRef/111q1bx4gRIzh58iRlypQhJSXFyJOQkJDhmLQnN9ra2pKUlJQpPf0+rTVDhw7lgw8+yFR3hQoVsLW1zbWNQjyIZOheCCsUFRVFcnIyNWrUyJAeGxtL3bp1sbGx4dtvvzWucXfs2JGVK1eSnJzMxYsX2bZtGwCOjo7ExMQYgT4xMZGIiIgc6+7Tpw8tWrRg6dKl2NvbExkZyZ07d7h+/Tpbtmy578/UpUsXAgMDjfkDf/31F2eyWndaCJGBnNELYSXSrtGD+Ux86dKlmc5yx44dS//+/fnmm2/o2bMnlSpVAqBv375s3boVJycn6tevT5s2bQAoV64cgYGBTJw4kdjYWJKSknj11VdxdnbOsS3vvPMOL7zwAqNGjeK5557DxcUFBwcHmjdvft+fz8nJiZkzZ9K9e3dSUlIoW7Ysn3zyCfb29vddphAPAqW1Lu42FDhHR0d99OjR4m5GqRYUFIS3t3dxN6NUkz7MP+nD/JM+zL/S0IdKqRCtdYus9snQvRBCCGHFijXQK6W+Vkr9qZQKz2a/UkotUEqdUEodUkp5FHUbhRBCiNKsuM/o/YGeOex/Emic+hoNfFYEbRJCCCGsRrEGeq31duCvHLI8A3yjzfYC1ZRSWd/EK4QQQohMivuMPjf1gHPptv9ITRNCCCGEBazm9jql1GjMw/vUqlWLoKCg4m1QKRcXFyd9mE/Sh/knfZh/0of5V9r7sKQH+vPA4+m2H0tNy0RrvRhYDObb60r6rRAlXWm4naSkkz7MP+nD/JM+zL/S3oclfeh+HfBS6uz71kCs1jrnR2cJIYQQwlCsZ/RKqeWAN1BTKfUHMB0oC6C1XgT8AjwFnABuAcOKp6VCCCFE6VSsgV5r/Xwu+zUwroiaI4QQQlidkj50L4QQQoh8kEAvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0BfjK5evYrJZMJkMvHII49Qr149Y/vu3bsFWldUVBQmk4nmzZtz8uTJAi27sMyYMcPoEycnJ5YvX17cTcq3BQsW0KxZM3x9fTOkh4aG8ssvvxjbM2bMYO7cufddj7e3N46Ojsb3KTAwMMe8wcHBADRo0IArV67cd71CiJKnpD+9zioFBMDUqXD2bA3q1w9l1iw4fnwGlStX5vXXXzfyJSUlUaZMwfwnWrt2LQMGDODtt9+2KL/WmpSUFGxsCua34P1+lkmTJvH6669z/PhxPD09GTBgAGXLli2QNhWHTz/9lM2bN/PYY49lSA8NDSU4OJinnnqqwOoKCAigRYsWBVaeEKJ0kjP6IhYQAKNHw5kzoLX57+jRcOiQeb+fnx9jxoyhVatWvPHGG+zbt482bdrQvHlz2rZty9GjRwHw9/enX79+9OzZk8aNG/PGG28AkJycjJ+fHy4uLri6ujJ//nx++eUXPv74Yz777DN8fHwAmDdvHi4uLri4uPDxxx8DEB0djaOjIy+99BLDhg1jx44dNG3aFD8/P5o0aYKvry+bN2+mXbt2NG7cmH379gEQHx/P8OHDadmyJc2bN+fHH3802tinTx86d+5Mly5duHjxIh07dsRkMuHi4sKOHTss7rfGjRtjZ2fHtWvXAJgzZw5eXl64ubkxffp0AN566y0++eQT45j0Z8VZ5Y+OjqZZs2aMGjUKZ2dnunfvzu3btwHYv38/bm5umEwmJk+ejIuLi9G/kydPNsr6/PPPs2zvvHnzGDZsWIb+HTNmDKdOneLJJ59k/vz5Rt67d+/yzjvvsHLlSkwmEytXrgQgMjISb29vGjZsyIIFC4z8y5Yto2XLlphMJl5++WWSk5Mt6sNXXnmFFi1a4OzsbPRBTrKrp3LlykydOhV3d3dat27N5cuXLapflC4BAdCgAdjYmP8GBBR3i8R901pb3atJkya6pLK319oc4jO+qladrufMmaOHDh2qe/XqpZOSkrTWWsfGxurExESttdabNm3S/fr101prvWTJEu3g4KCvX7+ub9++revXr6/Pnj2rg4ODddeuXY36rl27prXWevp0c/laax0cHKxdXFx0XFycvnnzpnZyctIHDhzQp0+f1kopvWfPHr1t2zZ9+vRpbWtrqw8dOqSTk5O1h4eHHjZsmE5JSdFr167VzzzzjNZa6ylTpuhvv/3WqK9x48Y6Li5OL1myRNerV09fvXpVa6313Llz9cyZM7XWWiclJekbN25orbUeMWKE3r9/f6a+St/mkJAQ3b59e6211r/99pseNWqUTklJ0cnJybpXr176999/1wcOHNAdO3Y0jm/WrJk+e/ZstvnTPt/Bgwe11loPHDjQ+BzOzs569+7dWmut33zzTe3s7Ky11vrzzz/X77//vtZa64SEBO3p6alPnTqVod1p/fvLL79k6F/zf397HRMTk+mzLlmyRI8bNy7DZ2/Tpo1OSEjQMTEx+uGHH9Z3797VkZGRunfv3vru3btaa61feeUVvXTp0kzlderUSTdp0kS7u7trd3d3feXKFeO/Q1JSku7UqZMOCwsz8qb1f1r7cqoH0OvWrdNaaz158mSjPwrDtm3bCq3sB8X99OGyZVrb2aX9+3RFg7tWyl1XrVpHP/roo9rd3V1XrVpVN2vW7L7bdenSJd2rVy/t5uammzVrpp988kmjvb169crymBEjRuiIiIgcy/3ss8+y/H8iP0rD9xAI1tnERBm6L2Jnz2adHhv79/uBAwdia2ubmh7L0KFDOX78OEopEhMTjXxdunShatWqADg5OXHmzBmcnZ05deoUEyZMoFevXnTv3j1TXTt37qRv375UqlQJgH79+rFjxw769OmDvb09rVu3JigoCAAHBwdcXV0BcHZ2pkuXLiilcHV1JTo6GoCNGzeybt064+w5ISGBs6kftFu3bjz88MMAeHl5MXz4cBITE3n22WcxmUwAfPnll9n21/z581myZAnHjh1j/fr1Rn0bN26kefPmAMTFxXH8+HFGjBjBn3/+yYULF4iJiaF69eo8/vjj/Oc//8kyf/369XFwcDDa4enpSXR0NNevX+fmzZu0adMGgBdeeIGffvrJqPvQoUPGNe/Y2FiOHz+Og4NDpv6tWLEilStXNvo3rX5L9erVi/Lly1O+fHlq167N5cuX2bJlCyEhIXh5eQFw+/ZtateuneXx9w7dL1q0iMWLF5OUlMTFixeJjIzEzc0ty2NzqqdcuXL07t3b6LNNmzbl6XOJkm/qVLh1K22rBhCK1gAzmDTJfIkxOjra+B7cj3feeYdu3brxj3/8A4BDacOaOcjp34o0Y8aMue82WSsZui9i9etnnZ4arwGMAAwwbdo0fHx8CA8PZ/369SQkJBj7ypcvb7y3tbUlKSmJ6tWrExYWhre3N4sWLWLkyJF5al/6uu+tw8bGxti2sbEhKSkJMI8KrV69mtDQUEJDQzl79izNmjXLVF7Hjh3Zvn079erVw8/Pj2+++SbX9kyaNImIiAhWr17NiBEjSEhIQGvNlClTjPpOnDjBiBEjAPOPpMDAQFauXMmgQYOM9mWXP6s+zInWmoULFxplnT59OssfUwUhq7ZprRk6dKhR/9GjR5kxY0auZZ0+fZq5c+eyZcsWDh06RK9evTJ8l+6VUz1ly5ZFKZWhXcK6WHJCAuZLWVld+jp58iQ9e/bE09OTDh06EBUVlamsixcvZpirkv5HZ1xcHAMGDKBp06b4+vpiPmHNOHE0u0tI6S/ZeXt78+abb9KyZUuaNGliXC68desWzz33HE5OTvTt25dWrVoZ5VojCfRFbNYssLPLmGZnB507Z50/NjaWevXqAeZr3rm5cuUKKSkp9O/fn5kzZ3LgwIFMeTp06MDatWu5desW8fHxrFmzhg4dOuT1oxh69OjBwoULjf8ZDx48mGW+M2fOUKdOHUaNGsXIkSOzbFt2+vTpQ4sWLVi6dCk9evTg66+/Ji4uDoDz58/z559/AjBo0CBWrFhBYGAgAwcONNqXXf6sVKtWjSpVqvC///0PgBUrVmT4rJ999pkxsnLs2DHi4+MzHJ/WvwkJCRb3b5UqVbh582au/dClSxcCAwON9v/111+cOXMm1+Nu3LhBpUqVqFq1KpcvX+bXX38tlHqEdbDkhATg+PHjjBs3joiICKpVq8bq1asBGD16NAsXLiQkJIS5c+cyduzYTGWNGzeOESNG4OPjw6xZs7hw4YKx7+DBg3z88cdERkZy6tQpdu3alen4+Ph4WrduTVhYGB07duSLL77Iss1JSUns27ePjz/+mHfffRcwT4qtXr06kZGRvP/++4SEhFjSLaWWDN0XsbS7qsyz7s3/Q5ln3Wed/4033mDo0KHMnDmTXr165Vr++fPnGTZsGCkpKQB88MEHmfJ4eHjg5+dHy5YtARg5ciTNmzc3huLzatq0abz66qu4ubmRkpKCg4ODMdSdXlBQEHPmzKFs2bJUrlzZOKMfOXIkY8aMyXWG+DvvvMMLL7zAkSNHOHLkiDG0XrlyZZYtW0bt2rVxdnbm5s2b1KtXj7p16wLQvXv3LPOnXR7JyldffcWoUaOwsbGhU6dOxiWSkSNHEh0djYeHB1pratWqxdq1azMcm9a/r7zyCpUqVTL6Nyc+Pj7Mnj0bk8nElClTss3n5OTEzJkz6d69OykpKZQtW5ZPPvkEe3v7HMt3d3enefPmNG3alMcff5x27drlmP9+6xHWYdYs8yThv4fvsz4hyerSV1xcHLt37zZ+aAPcuXMnUx09evTg1KlTbNiwgV9//ZXmzZsTHh4OQMuWLY2zfZPJRHR0NO3bt89wvKWXkPr165ehfWC+vJZ2ycDFxSXbS1hWI7uL96X5VZIn45UWpWHySWG6efOm8f6DDz7QEydOzHMZD3ofFgTpw/y73z5ctsw8eVgp899lyzJOkD19+rQxSVVrrefMmaOnT5+uY2Nj9SOPPJLn+nr16qUDAwMzTcYbN26cXrJkidY648TRSpUqGXlWrVqlhw4dqrXO2Mb0+WNiYrS9vb3WWutnnnlGb9261Ti+efPmWU4ITlMavofkMBlPhu6FyMLPP/+c4TZAS9cfEMJa+PpCdDSkpJj/3rPGU7YeeughHBwcWLVqFWA+mQwLC8uUb+vWrdxKHTK4efMmJ0+epH521wwKWLt27fj+++8B822shw8fLpJ6i4sEeiGyMGjQIEJDQwkPD+fnn3+mVq1axd0kIUqNgIAAvvrqK9zd3XF2djbW1kgvJCSEFi1a4ObmRps2bRg5cqRxl0dhGzt2LDExMTg5OfH222/j7OxsXJ6zRkqnTqCyJo6OjjptYRlxf4KCgvD29i7uZpRq0of5J32Yf9KHmSUnJ5OYmEiFChU4efIkXbt25ejRo5QrVy7L/KWhD5VSIVrrLCc6yWQ8IYQQD5Rbt27h4+NDYmIiWms+/fTTbIO8NZBAL4QQ4oFSpUoVq75v/l5yjV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRDiATdp0iQ+/vhjY7tHjx6MHDnS2H7ttdeYN28e69atY/bs2QDMmDGDuXPnZiorOjoaFxeXTOl9+/Zl7dq1xrajoyMzZ840tvv3788PP/zAokWL+OabbwDw8/MjMDAwU1lBQUH07t07U3rz5s0JDQ0FICkpicqVK7Ns2TJjv6enJwcOHMimF7Lm7+/PlStX8nRMSSOBXgghHnDt2rVj9+7dAKSkpHDlyhUiIiKM/bt376Zt27b06dOHt956K991XL16lUqVKrFnzx5j/549e2jbti1jxozhpZdeyncdYWFhNGnSxNiOj4/n5MmTuLu756lMf39/rl69el/tKSmKNdArpXoqpY4qpU4opTJ9e5RSfkqpGKVUaOprZFblCCGEuH9t27Y1gm5ERAQuLi5UqVKFa9eucefOHY4cOYKHhwf+/v6MHz8+0/EhISG4u7vj7u7OJ598km0daUF39+7dPP3008TExKC15vTp01SsWJFHHnkk25GCDRs20LRpUzw8PPjhhx8sqmPMmDHGGf6+ffvw9PTE1taWZcuW0bJlS0wmEy+//DLJyckkJyfj5+eHi4sLrq6uzJ8/n8DAQIKDg5k1axYmk4nbt2/nuW9LgmIL9EopW+AT4EnACXheKeWURdaVWmtT6uvLIm2kEEI8AB599FHKlCnD2bNn2b17N23atKFVq1bs2bOH4OBgXF1dKVeuXLbHDxs2jIULFxIWFpZtHk9PT8LDw7l7965Rh6OjI0eOHDFGDLKTkJDAqFGjWL9+PSEhIVy6dCnLfOnP6Hfv3k3Hjh0pX748N2/eNOo4cuQIK1euZNeuXYSGhmJra0tAQAChoaGcP3+e8PBwDh8+zLBhwxgwYAAtWrRg6tSphIaGUrFiRQt7tGQpzjP6lsAJrfUprfVdYAXwTDG2RwghHlhpZ8NpQbhNmzbGdrt27bI97vr161y/fp2OHTsC8OKLL2aZr3z58jg7O3PgwAH27t1Lq1atLK4jKioKBwcHGjdujFKKIUOGZJnP3t6eu3fvcunSJaKionB0dMTLy4v//e9/Rh1btmwhJCQELy8vTCYTW7Zs4dSpUzRs2JBTp04xYcIENmzYwEMPPZSH3ivZyhRj3fWAc+m2/wBaZZGvv1KqI3AMmKS1PpdFHpRSo4HRALVq1SIoKKhgW/uAiYuLkz7MJ+nD/JM+zD9L+7BWrVp8//33hIeHc+XKFZKSkvjll1+oVKkSPXv2JCgoiKioKM6fP09QUBDR0dFUrFiRnTt3cufOHaOOkydPEh8fn2Wdjz/+OEuWLOHChQuEhYVRpkwZVq9ezYkTJ/Dw8MhQblBQEJcuXSIiIoLr168TGxtrlHn48GGuXr2aZR1PPPEE//d//0f58uX5/fffqVy5MgEBAezatYtXXnmFY8eO4ePjw6hRozIcFxYWxn//+1/27dvHzJkz+c9//sObb77J9evXuXXrVun+Hmqti+UFDAC+TLf9IvDfe/LUAMqnvn8Z2GpJ2U2aNNEif7Zt21bcTSj1pA/zT/ow/3Lqw2XLtLa311oprevWPahr1XLQXbp0MfZ7eHjoOnXq6JiYGK211kuWLNHjxo3TWms9ffp0PWfOHK211q6urnrHjh1aa63feOMN7ezsnGV9a9as0Q0bNtTDhw/XWmudmJiomzVrph9++GGdnJycqdyhQ4fqVatW6du3b+vHH39cnzhxQmut9eDBg3WvXr2yrGP+/Pm6YcOG+r333tNaa33hwgXdsGFD7eLiorXWOiIiQj/xxBP68uXLWmutr169qqOjo3VMTIyOjY3VWmt9+PBh7e7urrXWunfv3nrevHnZ9mFJAQTrbGJicQ7dnwceT7f9WGqaQWt9VWt9J3XzS8CziNomhBBWLSAARo+GM2dAa7h40ZWYmCtUrtzayOPq6krVqlWpWbNmjmUtWbKEcePGYTKZ0k7SstS2bVtOnTpFmzZtAChTpgy1a9emRYsW2NhkH44qVKjA4sWL6dWrFx4eHtSuXTvbvO3atctQR926dUlOTjbmADg5OTFz5ky6d++Om5sb3bp14+LFi5w/fx5vb29MJhNDhgzhgw8+AMy3+M2fP79UT8YrzjP6MsApwAEoB4QBzvfkqZvufV9gryVlyxl9/smZVP5JH+ZfSe7D06dPZzpzTX82mp3BgwdrV1fXAjlL3L9/v54wYUKOebLrQ3t7rc0hPuPL3j7fzbI6Jfl7mIYczuiL7Rq91jpJKTUe+A2wBb7WWkcopd5LbfA6YKJSqg+QBPwF+BVXe4UQIr8uXbrE/v37OXHihMXHJCUlUaZM1v9Ut2jRghYtWtxXW86ezVu6KL2K9T56rfUvWusmWutGWutZqWnvpAZ5tNZTtNbOWmt3rbWP1jqqONsrhBCW8Pb25s0336Rly5Y0adKEHTt2ANC9e3fOnz+PyWRix44dhIaG0rp1a9zc3Ojbty/Xrl0zjn/11Vdp0aIF//nPf9i/fz9ubm6YTCYmT55srDyXtkJcSkoKDRo04Pr160YbGjduzOXLl7l+/Tr9+/fHy8sLLy8vdu3aBcBDD80AhgPeQENgAQD16xdJF4kiJCvjCSGEhQICoEEDsLGB9u0hNjb7vElJSezbt4+PP/6Yd999F4B169bRqFEjQkND6dChAy+99BIffvghhw4dwtXV1cgHcPfuXYKDg3nttdcYNmwYn3/+uXHf971sbGx45plnWLNmDQD/+9//sLe3p06dOixcuJBJkyaxf/9+Vq9ebSxt27kz2NhEYR5U3Qe8S8WKicyaVUCdJUoMCfRCCGGBeyevnT+vOH/enJ6eUgqAfv36AeaFYqKjozOVFxsby/Xr1+nUqRMAQ4cOZfv27cb+QYMGAeb71G/evGlMLnvhhReybN+gQYNYuXIlACtWrDCOP3DgAOPHj8dkMtGnTx9u3LhBXFwcbm7Qv38v7O3Lo1RNypSpzezZl/H1vc8OEiWWBHohhLDA1Klw61b6lBpofY2pU/9O+euvv4wZ6uXLlwfA1taWpKSkPNdXqVKlPOVv06YNJ06cICYmhrVr1xo/NFJSUti7dy+hoaHG6m+VK1cGoGXL8kRHQ0oKODra0qdP3tspSj4J9EIIYYHMk9QqA3U5c2YrYA7yGzZsoH379haVV7VqVapXr25cv//222+Ns/v0qlWrRpUqVfjf//4HmM/Ws6KUom/fvvzzn/+kWbNm1KhRAzBP2Fu4cKGRL23td/HgKM6V8YQQotSoX988bJ/RN5QvPw6T6Z8ATJ8+nUaNGllc5tKlSxkzZgy3bt2iYcOGLFmyJMt8X331FaNGjcLGxoZOnTpRtWrVLPMNGjQILy8v/P39jbSJEyfy3Xff4ebmRlJSEh07dmTRokUWt1GUfkrnsLhBaeXo6KiPHj1a3M0o1YKCgvD29i7uZpRq0of5V5L6MO0affrhezs7WLyYQr+uHRcXZwy3z549m4sXL/Kf//zHomNLUh+WVqWhD5VSIVrrLO+1lKF7IYSwgK+vOajb24NS5r9FEeQBfv75Z0wmEy4uLuzYsYO333678CsVVkOG7oUQwkK+vkUT2O81aNAgYxa9EHklZ/RCCCGEFZNAL4QQQlgxCfRCCCGEFZNAL4QQQlgxCfRCiPuSft33Bg0yLwUrhCgZZNa9ECLP7r2n/MwZ8zYUz6x0IUT25IxeCJFnmdd9N2+nX/ddCFEySKAXQuRZ5nXfc04XQhQfCfRCiDyrXz9v6UKI4iOBXgiRZ7Nmmdd5/1tl7OzM6Tl59dVXqVevHikpKRbVc+7cOZ566ikaN26Mh4cHzz33HJcvX76vNq9atYpmzZrh4+NDcHAwEydOzDJfgwYNuHLlyn3VsXbtWiIjI43td955h82bN+d4jJ+fH4GBgfdVnxCWkMl4Qog8S5twN3Xq38P1ua37npKSwpo1a3j88cf5/fff8fHxybGOhIQEpkyZwmeffcbTTz8NmB8uEhMTQ506dfLc5q+++oovvvjCeIxsixZZPv8jX9auXUvv3r1xcnIC4L333ivwOoTIKzmjF0LcF19fiI6GlBTz2b1vu2hwccmYacYMmDsXMAdpZ2dnXnnlFZYvX55r+d999x1OTk5GkAfw9vbGxcWFpKFDuVGxIscrVKB58+Zs27YNAH9/f/r160fPnj1p3Lgxb7zxBmAOuDt37mTEiBFMnjyZoKAgevfuDcDVq1fp3r07zs7OjBw5kvRP9Fy2bBktW7bEZDLx8ssvk5ycDEDlypWZOnUq7u7utG7dmsuXL7N7927WrVvH5MmTMZlMnDx5MsPZ+nvvvYeXlxcuLi6MHj0aa3xyqCiZJNALIYrE8uXLef755+nbty8///wziYmJOeYPDw+nSZMmkJSUaV9gpUrM69aNxk88wfLlyxk6dCgJCQkAhIaGsnLlSg4fPszKlSs5d+4c77zzDi1atCAgIIA5c+ZkKOvdd9+lffv2RERE0LdvX86mDlEcOXKElStXsmvXLkJDQ7G1tSUgdbGA+Ph4WrduTVhYGB07duSLL76gbdu29OnThzlz5hAaGprpufTjx49n//79hIeHc/v2bX766af77ksh8kICvRCi0N29e5dHvv+eF2bN4qH27VmpFL/99hvEx8Pw4dCyJTRvDj/+aD7A35/hP/7IhLVroUuXTOWtvHiR7oMHA9C0aVPs7e05duwYAF26dKFq1apUqFABJycnzpw5k2Pbtm/fzpAhQwDo1asX1atXB2DLli2EhITg5eWFyWRiy5YtnDp1CoBy5coZIwKenp5ER0fn2gfbtm2jVatWuLq6snXrViIiInI9RoiCINfohRCF7rfffmPszZs0q1aNuwkJlElIoNXy5fTevRs6d4avv4br180Bv2tXAByuXeMld3dWpw7LW6p8+fLGe1tbW5KyGBGwhNaaoUOH8sEHH2TaV7ZsWZRSFteRkJDA2LFjCQ4O5vHHH2fGjBnGCIQQhU3O6IUQ+RMQYF4tx8EBjh3LvBauUuZr8q6uHPPyInrmTMIiIti0aRPJGzbA7NlgMoG3NyQkGLP7yvfqxd5jx/j555+NorZv3054eDgdOnRg7dq1ABw7doyzZ8/i6Oh4X83v2LEj3333HQC//vor165dA8wjA4GBgfz5558A/PXXX7mODlSpUoWbN29mSk8L6jVr1iQuLk5m2YsiJYFeCHH/UtfCvaU1TYBLiYk89uKLzPP1Zd26dez95RfuVKnChg0bqBQUBOPGwYEDVPL2pmPbtsRev86WsWN5p08fCA01B/lmzQAoU7UqH3zwAQsXLqRx48Y4OTnx6aefUqtWLcaOHUtKSgrHT5xg0KBB+Pv7ZziTz4vp06ezfft2nJ2d+eGHH6ifuhiAk5MTM2fOpHv37ri5udGtWzcuXryYY1mDBw9mzpw5NG/enJMnTxrp1apVY9SoUbi4uNCjRw+8vLzuq61C3A9ljTM/HR0d9dGjR4u7GaVaUFAQ3t7exd2MUu2B6MMGDcwL3d/L3h4OHIDWreHXX81n+2fPmvMnJpr3R0bCRx/BjRuwcCEoBQcPmq/V+/tDcDBBAwZk34fR0dC7N4SHF9rHswYPxPewkJWGPlRKhWits7xnVM7ohRD3L7s1b8+cMV97nz4dGjWC5GQYMgRcXc2BfOJEqFYNpk0zB343N3B2Nm9b4vnnoU0bOHoUHnsMvvqqwD6SENZGAr0Q4v5lt+atvb15KD5tBZ2yZWHnTjh82HwG/tZb5vSKFeHzz83pERHw00/Y2tpi+vhj3HfsYPTo0ezevRuA6OhoXNLu01++HC5eNP9I+OMPGDEiy2bkddW5GTNmUK9ePUwmE05OThbd719UJk+eTNOmTXFzc6Nv375cv37d2PfBBx/wxBNP4OjoaL6bIZ3k5GSaN29u3CUAsHXrVjw8PHBxcWHo0KH3PWFRlA4S6IUQ9y/zWrhYtBZuDipWrEhoaChhYWGMHDmSKVOm5LOReTNp0iRCQ0P58ccfefnll3O937+wpC3Ok6Zbt26Eh4dz6NAhmjRpYtwNEBkZyYoVK4iIiGDDhg2MHTs2w7GrV6+mWeq8BzCvUDh06FBWrFhBeHg49vb2LF26tGg+lCgWEuiFEPfP19e89q29vfkau7197mvh5sGtW7eM+9rTi46OpkOHDnh4eODh4WGc9WutGT9+PI6OjnTt2tWYMQ8QEhJCp06d8PT0pEePHrlOrGvcuDF2dnZcu3Ytw0p6YF78xt/fHzCvjT99+nQ8PDxwdXUlKioKMI8ODB8+HG9vbxo2bMiCBQuM43Nace+1117D3d2dPXv2ZGhP9+7dKVPGfEd069at+eOPPwD48ccfGTx4MOXLl8fBwYEnnniCffv2AfDHH3+wd+9eRo4caZRz9epVypUrZ16MCPMPiNWrV+fYF6J0k0AvhMif9GvhRkfnO8jfvn0bk8lE06ZNmTt3LtOyuG5fu3ZtNm3axIEDB1i5cqXxgJo1a9Zw9OhRIiMj+eabb4wfAImJiUyYMIHAwEBCQkIYPnw4U6dOzbEdBw4coHHjxtSuXTvXNtesWZMDBw7wyiuvMDd1yV+AqKgofvvtN/bt28e7775LYmJirivutWrVirCwMGNN/qx8/fXXPPnkkwCcP3+exx9/3Nj32GOPcf78ecD8EKGXX34ZG5u//6mvWbMmSUlJBAcHAxAYGMi5c+dy/Yyi9JIFc4QQJUra0D3AJ598wksvvUT4PTPrExMTGT9+vBEo01bF2759O88//zy2trY8+uijdO7cGYCjR48SHh5Ot27dAPOweN26dbOsf/78+SxZsoRjx46xfv16i9rcr18/wLxK3g8//GCk9+rVi/Lly1O+fHlq167N5cuXM6y4B+YfNmk/Jmxtbenfv3+Odc2aNYsyZcrgm8sPqp9++onatWtnWl9AKcWKFSuYNGkSd+7coXv37tja2lr0OUXpJIFeCFFiOTs7c+XKFWJiYjKkz58/nzp16hAWFkZKSgoVKlTIsRytNc7OzpmGw7MyadIkXn/9ddatW8eIESM4efIkZcqUyfBo3XtXtUu7h//eVfKyWqUvpxX3KlSokGPQ9ff356effmLLli3Gynz16tXLcEb+xx9/UK9ePdatW8e6deuMHx43btxgyJAhLFu2jDZt2rBjxw4ANm7caPxQEtZJhu6FEMUuIMB8i72NjXmRvbTF9c6ePUtycjI1atTIkD82Npa6detiY2PDt99+a1zj7tixIytXriQ5OZmLFy8aT7VzdHQkJibGCPSJiYm5rjXfp08fWrRowdKlS7G3tycyMpI7d+5w/fp1tmzZct+f9X5W3APYsGEDH330EevWrcMu3QTIPn36sGLFCu7cucPp06c5fvw4LVu25IMPPuCPP/5gxYoVrFixgs6dO7Ns2TIAo+47d+7w4YcfMmbMmPv+PKLkkzN6IUSxSl1cj1u30lJu8+KLJv71LyhT5iZLly7NdJY7duxY+vfvzzfffEPPnj2pVKkSAH379mXr1q04OTlRv3592rRpA5gfQhMYGMjEiROJjY0lKSmJV199FWdn5xzb9s477/DCCy8watQonnvuOVxcXHBwcKB58+b3/XnTr7iXkpJC2bJl+eSTT7C3t8/xuPHjx3Pnzh3j8kPr1q1ZtGgRzs7OPPfcczg5OVGmTBk++eSTXIfi58yZw08//URKSgqvvPKKcYlDWCdZGU9kqTSsBFXSSR9aJqfF9fz9pQ/zS76H+Vca+lBWxhNClFjZLa6XXboQIm8k0AshilV2i+tlly6EyBsJ9EKIYlUIi+sJIdKRQC+EKFaFvLieEA88mXUvhCh2vr4S2IUoLHJGL4QQQlgxCfRCCCGEFZNAL4QQQlgxCfRCCCGEFcs20CulXJVSe5VS55RSi5VS1dPt21c0zRNCCCFEfuR0Rv8ZMANwBY4BO5VSjVL3lS3kdgkhhBCiAOR0e10VrfWG1PdzlVIhwAal1IuA9S2QL4QQQlihHO+jV0pV1VrHAmittyml+gOrgYeLonFCCCGEyJ+chu4/BJqlT9BaHwK6AD8UZqOEEEIIUTCyPaPXWn+XTfpZYFShtUgIIYQQBUZurxNCCCGsmAR6IYQQworlGuiVUu0sSRNCCCFEyWPJGf1CC9OEEEIIUcJkOxlPKdUGaAvUUkr9M92uhwDbwm6YEEIIIfIvp/voywGVU/NUSZd+AxhQmI0SQgghRMHI6fa634HflVL+WuszRdgmIYQQQhSQHFfGS1VeKbUYaJA+v9a6c2E1SgghhBAFw5LJeKuAg8DbwOR0LyFKnatXr2IymTCZTDzyyCPUq1cPk8lEtWrVcHJyuu9y/f39UUqxefNmI23nzp0opQgMDMzxWD8/PyPPxx9/zK1bt+67HbkJCgqiatWqRh907do1x7y9e/cutLYIIYqGJYE+SWv9mdZ6n9Y6JO1V6C0TohDUqFGD0NBQQkNDGTNmDJMmTTK2bWzyt6yEq6srK1asMLa3bNmCu7t7nsoo7EAP0KFDB+Mzp/9hIoSwTpb8y7ZeKTVWKVVXKfVw2qvQWyZEEUtOTmbUqFE4OzvTvXt3bt++DcDJkyfp2bMnnp6edOjQgaioqCyP79ChA/v27SMxMZG4uDjOnz+PyWQy9r/33nt4eXnh4uLC6NGj0TrjQyAXLFjAhQsX8PHxwcfHB4CNGzfSpk0bPDw8GDhwIHFxcQC89dZbODk54ebmxuuvvw5ATEwM/fv3x8vLCy8vL3bt2mXR5963bx9t2rShefPmtG3blqNHj2bKExcXx7Bhw3B1dcXNzY3Vq1cDsHz5clxdXXFxceHNN9808leuXJmpU6fi7u5O69atuXz5skVtEUIUPEsC/VDMQ/W7gZDUV3BhNkqI4nD8+HHGjRtHREQE1apVM4LZ6NGjWbhwISEhIcydO5exY8dmebxSiq5du/Lbb7/x448/0q5dxnWlxo8fz/79+wkPD+f27dv89NNPGfZPnDiRRx99lG3btrFt2zauXLnCzJkz2bx5MwcOHKBFixbMmzePq1evsmbNGiIiIjh06BBvv/02AP/4xz+YNGkS+/fvZ/Xq1YwcOTLLdu7YscMYup81axZNmzZlx44dHDx4kPfee49//etfmY55//33qVq1KocPH+bQoUN07tyZCxcu8Oabb7J161ZCQ0PZv38/a9euBSA+Pp7WrVsTFhZGx44d+eKLL/L030IIUXBynYyntXYorMqVUj2B/2C+L/9LrfXse/aXB74BPIGrwCCtdXRhtUc82BwcHIwzcE9PT6Kjo4mLi2P37t0MHDjQyHfnzp1syxg8eDALFiwgNjaW5557ji1bthj7tm3bxkcffcStW7f466+/cHZ25umnn862rL179xIZGWn8YLh79y5t2rShatWqVKhQgREjRtC7d2/jOvrmzZuJjIw0jr9x4wZxcXFUrlw5Q7kdOnTI8CPj3LlzDB06lOPHj6OUIjExMVNbNm/enOGyRPXq1dm+fTve3t7UqlULAF9fX7Zv386zzz5LuXLljHZ5enqyadOmbD+nEKJw5RrolVJ2wD+B+lrr0UqpxoCj1vqnXA7NrVxb4BOgG/AHsF8ptU5rHZku2wjgmtb6CaXUYMyPzh2Un3qFyE758uWN97a2tty+fZuUlBSqVatGaGioRWW0bNmSw4cPY2dnx+OPP26kJyQkMHbsWIKDg3n88ceZMWMGCQkJOZaltaZbt24sX7480759+/axZcsWAgMD+e9//8vWrVtJSUlh7969VKhQwbIPnGratGn4+PiwZs0aoqOj8fb2ztPxWSlbtixKKcDcl0lJSfkuUwhxfywZul8C3MW8Sh7AeWBmAdTdEjihtT6ltb4LrACeuSfPM8DS1PeBQBeV9q+HEEXgoYcewsHBgVWrVgHm4BsWFpbjMbNnz+b//u//MqSlBfWaNWsSFxeX7Uz8KlWqcPPmTQBat27Nrl27OHHiBGAeDj927BhxcXHExsby1FNPMX/+fKM93bt3Z+HCv1entvTHSWxsLPXq1QPMdw9kpVu3bnzyySfG9rVr12jZsiW///47V65cITk5meXLl9OpUyeL6hRCFB1LAn0jrfVHQCKA1voWUBDBth5wLt32H6lpWebRWicBsUCNAqhbCIsFBATw1Vdf4e7ujrOzMz/++GOO+Z988kljMl2aatWqMWrUKFxcXOjRowdeXl5ZHjt69Gh69uyJj48PtWrVwt/fn+effx43NzfatGlDVFQUN2/epHfv3ri5udG+fXvmzZsHmCfzBQcH4+bmhpOTE4sWLbLo873xxhtMmTKF5s2bZ3vm/fbbb3Pt2jVcXFxwd3dn27Zt1K1bl9mzZ+Pj44O7uzuenp4888y9v9WFEMVN3TvzN1MGpXYDXYBdWmsPpVQjYLnWumW+KlZqANBTaz0ydftFoJXWeny6POGpef5I3T6ZmudKFuWNBkYD1KpVy/P777/PT/MeeFld2xV5I32Yf9KH+Sd9mH+loQ99fHxCtNYtstpnycp404ENwONKqQCgHeBXAO06Dzyebvux1LSs8vyhlCoDVMU8KS8TrfViYDGAo6OjLojrjA+yoKCgArlW+yCTPsw/6cP8kz7Mv9Leh5bMut+klDoAtMY8ZP+PrM6o78N+oLFSygFzQB8MvHBPnnWYb+/bg/lBOlt1bkMQQgghhDBYuhRYBeAa5ifXOSmlOua34tRr7uOB34AjwPda6wil1HtKqT6p2b4CaiilTmCe+f9WfusVIr8CAqBBA7CxARubygQE5Jy/IFe7CwoKYvfu3bnm8/f3Z/x481WwGTNmMHfu3AKpXwhR+lhye13aLW0RQEpqsga257dyrfUvwC/3pL2T7n0CMPDe44QoLgEBMHo0pI/bo0eb//r6Zn3Mxx9/zJAhQ7Czs7O4nuTkZGxtbTOlBwUFUblyZdq2bZvFUQUjKSmJMmUsuaonhCgNLDmjfxbzffO9tNZPp7765HaQENZo6tSMQR7M26+9Zr6GN2DAAJo2bYqvry9a6zwta9ugQQPefPNNPDw8WLVqFQsWLDCWuR08eDDR0dEsWrSI+fPnYzKZ2LFjR56Xvf3iiy/w8vLC3d2d/v37GyMNfn5+jBkzhlatWvHGG28UeL8JIYqPJT/bTwFlgeyXAxPiAXH2bNbply/D7dsHiYiI4NFHH6Vdu3aEh4czceJE5s2bx7Zt26hZs2aGZW0rVarEhx9+yLx583jnHfNAVo0aNThw4AAAjz76KKdPn6Z8+fJcv36datWqMWbMGCpXrmysb//CCy8wadIk2rdvz9mzZ+nRowdHjhzJtv39+vVj1KhRgPmWua+++ooJEyYA8Mcff7B79+4sRxKEEKWXJYH+FhCqlNpCumCvtZ5YaK0SooAFBJjPxs+ehfr1Ydas7Ifac1K/Ppw5kzm9Th1wdW3JY489BoDJZOLSpUuZ8mW3rG2aQYP+XvjRzc0NX19fnn32WZ599tks25PdsrfZCQ8P5+233+b69evExcXRo0cPY9/AgQMlyAthhSwJ9OtSX0KUSvdeVz9zJvfr6tmZNSvzNXo7OxgxAsLCMi6hm5ycnOn4nJa1BahUqZLx/ueff2b79u2sX7+eWbNmcfjw4Uz587rsrZ+fH2vXrsXd3R1/f3+CgoKyrFsIYT1yvUavtV4KLOfvJ9d9l5omRKmQ3XX1qVPzXpavLyxeDPb2oJT5tXgxdOuW/TGWLGt7r5SUFM6dO4ePjw8ffvghsbGxxMXFZSgL8r7s7c2bN6lbty6JiYkE5Ha7gBDCKuQa6JVS3sBxzA+g+RQ4VhC31wlRVLK7rp5dem58fSE6GlJSzGfzuY0KWLKs7b2Sk5MZMmQIrq6uNG/enIkTJ1KtWjWefvpp1qxZY0zGy+uyt++//z6tWrWiXbt2NG3a9P46QAhRqliyBG4I8ILW+mjqdhPMS+B6FkH77oujo6M+evRocTejVCvtK0Gl16BB1tfV7e3NAbuwWFMfFhfpw/yTPsy/0tCHSqlsl8C15Pa6smlBHkBrfQzzLHwhSoVZs8xn3unZ2ZnThRDC2lkS6IOVUl8qpbxTX18AwYXdMCEKyr3X1e3tzdv3M+teCCFKG0tm3b8CjAPSbqfbgflavRClhq+vBHYhxIPJkofa3FFK/RfYgnkJ3KNa67uF3jIhhBBC5Jsla933AhYBJzE/vc5BKfWy1vrXwm6cEEIIIfLHkqH7fwM+WusTAEqpRsDPgAR6IYQQooSzZDLezbQgn+oUcDO7zEIIIYQoOSw5ow9WSv0CfI/58bQDgf1KqX4AWusfCrF9QgghhMgHSwJ9BeAy0Cl1OwaoCDyNOfBLoBdCCCFKKEtm3Q8rioYIIYQQouBZMuveAZgANEifX2vdp/CaJYQQQoiCYMnQ/VrgK2A95vvohRBCCFFKWBLoE7TWCwq9JUIIIYQocJYE+v8opaYDG4E7aYla6wOF1iohhBBCFAhLAr0r8CLQmb+H7nXqthBCCCFKMEsC/UCgoaxvL4QQQpQ+lqyMFw5UK+R2CCGEEKIQWHJGXw2IUkrtJ+M1erm9TgghhCjhLAn00wu9FUIIIYQoFJasjPe7UqoO4JWatE9r/WfhNksIIYQQBSHXa/RKqeeAfZgn5T0H/E8pNaCwGyaEECWNra0tJpMJd3d3PDw82L17d4GUO2PGDObOnZsp/cKFCwwYIP/civyxZDLeVMBLaz1Ua/0S0BKYVrjNEqL0CgiABg0gJMT8NyCguFskCkrFihUJDQ0lLCyMDz74gClTphRqfY8++iiBgYH3dax8D0UaSwK9zT1D9VctPE6IB05AAIweDWfOmLfPnDFvyz+y1ufGjRtUr14dgLi4OLp06YKHhweurq78+OOPAERHR9O0aVP8/Pxo0qQJvr6+bN68mXbt2tG4cWP27dtnlBcWFkabNm1o3LgxX3zxhXG8i4tLntsm30ORniWT8TYopX4DlqduDwJ+LbwmCVF6TZ0Kt25lTLt1y5zu61s8bRIF5/bt25hMJhISErh48SJbt24FoEKFCqxZs4aHHnqIK1eu0Lp1a/r0Md+YdOLECVatWsXXX3+Nl5cX3333HTt37mTdunX83//9H2vXrgXg0KFD7N27l/j4eJo3b06vXr3uu53yPRTpWTIZb7JSqh/QPjVpsdZ6TeE2S4jS6ezZvKWL0iVt6B5gz549vPTSS4SHh6O15l//+hfbt2/HxsaG8+fPc/nyZQAcHBxwdXUFwNnZmS5duqCUwtXVlejoaKPsZ555hooVK1KxYkV8fHzYt28fJpPpvtop30ORXrZD8EqpJ5RS7QC01j9orf+ptf4nEKOUalRkLRSiFKlfP2/povRq06YNV65cISYmhoCAAGJiYggJCSE0NJQ6deqQkJAAQPny5Y1jbGxsjG0bGxuSkpKMfUqpDOXfu50Xf3/frjJv3kjABDyCjU09TCYT1apVw8nJ6b7L9/f3RynF5s2bjbS1a9eilMp1ToG/vz8XLlzIdv8777yToVyRfzlda/8YuJFFemzqPiHEPWbNAju7jGl2duZ0YV2ioqJITk6mRo0axMbGUrt2bcqWLcu2bds4k3ZxPA9+/PFHEhISuHr1KkFBQXh5eeV+UDb+/h7W4J///BIIpUyZMTz33CRCQ0MJDQ3FxiZ/U61cXV1ZsWKFsb18+XLc3d1zPS6nQJ+cnMx7771H165d89U2kVFO/6XraK0P35uYmtag0FokRCnm6wuLF4O9vXnb3t68LddFrUPaNXqTycSgQYNYunQptra2+Pr6EhwcjKurK9988w1NmzbNc9lubm74+PjQunVrpk2bxqOPPnrf7czqe/j00+Dh8Xee5ORkRo0ahbOzM927d+f27dsAnDx5kp49e+Lp6UmHDh2IiorKso4OHTqwb98+EhMTiYuL48SJExkuNbz33nt4eXnh4uLC6NGj0VoTGBhIcHAwvr6+mEwmbt++TYMGDXjzzTfx8PBg1apV+Pn5ERgYSGxsLI6Ojhw9ehSA559/3pikKPJIa53lCziew74T2e0rCa8mTZpokT/btm0r7iaUetKH+Sd9mH9pfTh9+nQ9Z84crbXWp0+f1ra2tvrgwYNaa60HDhyov/32W6211p07d9bHjh3TWmu9d+9e7ePjk6nMJUuW6HHjxulJkybp9evX62XLlukZM2booUOH6lWrVmmttb569aqRf8iQIXrdunVaa607deqk9+/fb+yzt7fXH374obGdvoyNGzfq1q1b6+XLl+sePXoURHfcl9LwPQSCdTYxMacz+mCl1Kh7E5VSI4GQQvnVIYQQokg4ODgYZ+Cenp5ER0cTFxfH7t27GThwICaTiZdffpmLFy9mW8bgwYNZsWIFK1as4Pnnn8+wb9u2bbRq1QpXV1e2bt1KREREtuUMGjQoy/Ru3brh6urKuHHj+PLLL/P+IQWQ86z7V4E1Silf/g7sLYByQN9CbpcQQohClH6SoK2tLbdv3yYlJYVq1aoZdxbkpmXLlhw+fBg7OzuaNGlipCckJDB27FiCg4N5/PHHmTFjhjE5MSuVKlXKMj0lJYUjR45gZ2fHtWvXeOyxxyz7cCKDbM/otdaXtdZtgXeB6NTXu1rrNlrrS0XTPCFKp6tXrzJy5EhMJhOPPPII9eoV3Gzn8ePHZ0p/6qmnuH79OtevX+fTTz810qOjo/nuu++M7aCgIHr37m1xfdHR0SilePvtt420K1euULZs2SzbUZiym42d188ksvfQQw/h4ODAqlWrAPOl3bCwsByPmT17Nv/3f/+XIS0tqNesWZO4uLgMM/GrVKnCzZs3LWrP/PnzadasGd999x3Dhg0jMTExLx9HpMp12qXWepvWemHqa2tRNEqI0q5GjRp8+eWXhIaGMmbMGCZNKrjZzln55ZdfqFatWq6B/n44ODjw888/G9urVq3C2dk5T2Wkv43sfsls7KIREBDAV199hbu7O87OzsYqf9l58skn8fHxyZBWrVo1Ro0ahYuLCz169MhwB4Gfnx9jxowxJuNl5+jRo3z55Zf8+9//pkOHDnTs2JGZM2fm78M9oCxZGU8IUYDSZjvv3r2bevXq8eOPP1KxYkVOnjzJuHHjiImJwc7Oji+++MLi2dsNGjQgODiYt956i5MnT2IymejWrRs7duzgyJEjmEwmhg4dSvPmzY1j4uPjmTBhAuHh4SQmJjJjxgyeeeaZTGXb2dnRrFkzgoODadGiBStXruS5554zbpGKiYlhzJgxnE1djeXjjz+mXbt2zJgxg5MnT3Lq1Cnq16+Po6Mjp0+f5tSpU5w9e5b58+ezd+9efv31V+rVq8f69espW7Ys7733HuvXrzdmZHfq1AmlFH5+fvTu3ZsBAwawYcMGXn31Vezs7Gjfvn2mNovMZsyYYbxv0KAB4eHhxvbrr79uvHdwcGDDhg05luXn54efn1+mdH9/f+P9zJkzswzM/fv3p3///sZ2+kWD7i3jyJEjxvt58+bl2CaRPVmzXogidvz4ccaNG0dERATVqlVj9erVAIwePZqFCxcSEhLC3LlzGTt2bJ7Lnj17No0aNSI0NJQ5c+Ywe/ZsOnToQGhoKJMmTcqQd9asWXTu3Jl9+/axbds2Jk+eTHx8fJblpk26OnfuHLa2thlu/frHP/7BpEmT2L9/P6tXr2bkyJHGvsjISDZv3szy5eYVtE+ePMnWrVtZt24dQ4YMwcfHh8OHD1OxYkVj1GD8+PHs37+f8PBw7t69y08//ZShLQkJCYwaNYr169cTEhLCpUtyJVGInMgZvRBFLLfZzmnu3LlTqO3YuHEj69atMx6PmpCQwNmzZ2nWrFmmvD179mTatGnUqVMn0wzpzZs3ExkZaWzfuHGDuLg4APr06UPFihWNfU8++SRly5bF1dWV5ORkevbsCZBhOdht27bx0UcfcevWLS5dukRERARPP/20UUZUVBQODg40btwYgCFDhrB48eIC6BEhrFO2gV4pdRPQWe0CtNb6oUJrlRBWrCBmOxcErTWrV6/G0dEx17zlypXD09OTf//730RGRrJu3TpjX0pKCnv37qVChQqZjrt3NnX65V/Lli1rLPOathzsvbO1/fz8cpytLYTIXU6z7qtorR/K4lVFgrwQBet+Zjtn5d4ZzTnNcO7RowcLFy5MWwSLgwcP5lj2a6+9xocffsjDDz+cIb179+4sXLjQ2M7Pj5V7Z2v//vvvmfI0bdqU6OhoTp48CWBcFhBCZM3ia/RKqdpKqfppr8JslBAlna2tLSaTCXd3dzw8PNi9e3e+y7x3tvPs2bMzDImn8ff357HHHjNef/zxh7GvRo0atGvXDhcXFyZPnoybmxu2tra4u7szf/78DOVMmzaNxMRE3NzccHZ2Ztq0acbyo1nVWb16dYYOHQqYJ2+lzZhesGABwcHBuLm54eTkxKJFi3L8nNHR0VSsWJHbt2/j7u5O27ZtuXLlCpB5tnZWkxErVKjA4sWL6dWrFx4eHtSuXTtTno8//phb9z6nVYgHVXZL5qW9gD7AcSAeOA2kABG5HVecL1kCN/9Kw5KPxalSpUrG+w0bNuiOHTtmypPfPky/FGhRya7OrJYtjYmJua86Tp8+rZ2dnY3tRYsW6ZdeeinLvPfbh/lp372WLdPa3l5rpcx/ly0rkGKLjPy/nH+loQ+5zyVw07wPtAaOaa0dgC7A3kL51SFEKXTjxg2qV69ubM+ZMwcvLy9GjBjB9OnTjfRnn30WT09PnJ2dM0weq1y5svE+MDAQPz8/du/ezbp165g8eTImk4mTJ0/ike6JJMePH8+wneaLL77Ay8sLd3d3+vfvb5zV+vn5MXHiRNq2bUvDhg2Ns3atNePHj8fR0ZGuXbvy559/ZiozqweRACxcuBAPDw9cXV2NB5/Ex8czfPhwWrZsSfPmzXO9B/ve/ktOTmby5Ml4eXnh5uZmzAWIi4ujS5cuRn1p5cbHx9OrVy/c3d1xcXFh5cqVLFiwgAsXLuDj45Pp/u68CgiA0aPhzBnQ2vx39GhzuhClRna/ANJepP5KAMIAm7T3uR1XnC85o8+/0vALtjjZ2Nhod3d37ejoqB966CEdHBystdb6t99+06NGjdIpKSl6y5YtulevXvr333/XWv/9kI9bt25pZ2dnfeXKFa11xtGBVatW6aFDh2qtM59de3t7Gw8hmTJlil6wYEGmdqWVqbXWU6dONfIMHTpUDxgwQCcnJ+uIiAjdqFEjrbXWq1ev1l27dtVJSUn6/PnzumrVqhaf0aeV/cknn+gRI0YY7Up7OMq1a9d048aNdVxcXIayTp8+rStUqKDd3d11w4YN9SOPPKLPnDmjtdb6888/1++//77WWuuEhATdpEkTferUKZ2YmKhjY2O11lrHxMToRo0a6ZSUFB0YGKhHjhxplH39+nWjfQVxRm9vr7U5xGd82dvnu+giI/8v519p6EPyeUZ/XSlVGdgBBCil/oN5GF+IB1bFihUJDQ0lKiqKDRs28NJLL6G1ZuPGjWzcuJHmzZszevRooqKiOH78OGC+lu3u7k7r1q05d+6ckW6pkSNHsmTJEpKTk1m5ciUvvPBCpjzh4eF06NABV1dXAgICMjxI5Nlnn8XGxgYnJycuX74MwPbt23n++eeNe+M7d+5scXv69esH/H2LIJhv2Zs9ezYmkwlvb2/jlr17pd3rf/LkST7++GNGjx5tHP/NN99gMplo1aoVN27c4Pjx42it+de//oWbmxtdu3bl/PnzXL58GVdXVzZt2sSbb77Jjh07qFq1qsXtt0QWTc8xXYiSyJL76J8BEjA/5MYXqAq8V4htEqJUadOmDVeuXCEmJgatNVOmTOHll18mKCgIb29vwLwe++bNm9mzZw92dnZGEASMW8yAHG8l69+/P++++y6dO3fG09OTGjVqZMrj5+fH2rVrcXd3x9/fn6CgIGNf+tv6tM7qztm8SSvP1tbWWOJW5+GWvTR9+vRh2LBhxvELFy6kR48eAEYf+vv7ExMTQ0hICGXLlqVBgwYkJCTQpEkTDhw4wC+//MLbb79Nly5deOedd/L92dLUr28ers8qXYjSwpK17uOBWsBTwF/A91rrq4XdMCFKi6ioKJKTk9mxYwfz5s3j008/NRaM2bt3L02bNiU2Npbq1atjZ2dHVFQUe/f+Pc2lTp06HDlyhJSUFNasWcPOnTsJDAzMdGvc3r17uXv3Lq+88grNmjVj9uzZmdpy8+ZN6tatS2JiIgEWXEju2LEjK1euJDk5mYsXL7Jt27Ys81n6IJK83rIHsHPnTho1amQc/9lnnxkPLzl37hzx8fHExsZSu3ZtypYty7Zt2ziTGn0vXLiAnZ0dQ4YMYfLkyRw4cCBP7c3NrFlgZ5cxzc7OnC5EaZHrGX3q8+ffAbZiXixnoVLqPa3114XdOCFKqtu3bxur22mtWbp0Kd988w3t27enUqVKtGnThvj4eKpVq0ZKSgo9e/Zk0aJFNGvWDEdHR1q3bm2UNXv2bHr37k2tWrVo0aKFcf/84MGDGTVqFAsWLDAmz9WrV48zZ87wzjvvYGtrm6ld77//Pq1ataJWrVq0atUq12DXt29ftm7dipOTE/Xr16dNmzZZ5kt7EEnFihXZs2dPtuVNmzaNV199FTc3N1JSUnBwcMi0hC1grMevtaZcuXLGs8ZHjhxJdHQ0Hh4eaK0pW7Ysffr0wdfXl6effhpXV1datGhh3HZ3+PBhJk+ebCzA89lnnwHm5YR79uzJo48+mu2PF0v4+pr/Tp1qHq6vX98c5NPShSgNVG5DeEqpo0DbtLN4pVQNYLfW2vKxuSLm6Oiojx49WtzNKNXSDzuL3MXFxeHo6Mi2bdt4+umnOXr0KEFBQTRo0IDevXsTHh5OdHQ0L774orGe/H//+1/atm2L1poJEyawadMmHn/8ccqVK8fw4cOzfHjLpk2bGDBgAI0aNSI4OJj//ve/+Pn58dBDDxEcHMylS5f46KOPGDBgQDH3SMGQ72H+SR/mX2noQ6VUiNa6RVb7LLlGfxVIf1pwMzVNCJHqxx9/pGfPnjRp0oQaNWoQEhKSKU/t2rXZtGkTFSpU4Pjx4zz//PMEBwezZs0ajh49SmRkJJcvX8bJyYnhw4cbD2/ZunUrTzzxBI899hg3b97kH//4R6az5IsXL7Jz506ioqLo06eP1QR6IUT+WTLr/gTwP6XUDKXUdMz30B9TSv1TKfXPwm2eEKXD8uXLGTx4MGAecs9qWdbExERGjRqFq6srAwcONFa9y27me/qHtyil+Oyzz+jYsSM1a9bMVHZWM+qFEAIsO6M/mfpKk7YCRpWCb44Qpc9ff/3F1q1bOXz4MEopkpOTUUrRq1evDPnmz59PnTp1CAsLIyUlJcuHwNyvgp5RL4SwHpbMun83p1dRNFKIkiwwMJAXX3yRM2fOEB0dzblz53BwcODQoUMZ8sXGxlK3bl1sbGz49ttvSU5OBrKf+S4PbxFCFIRsA71S6uPUv+uVUuvufRVZC4Uo4ZYvX07fvn0zpPXv35+tW7dmSBs7dixLly7F3d2dqKgo4xGuffv2pXHjxjg5OfHSSy8ZM98teXiLEELkJttZ90opT611iFKqU1b7tdaZnx9ZQsis+/wrDbNMSzrpw/yTPsw/6cP8Kw19mNOs+5yeR582bTgY2KG1/j01uO8E9hd8M4Uo2QICoEEDsLEx/5UHmwghSgNLZt1vAdKvDVUR2Fw4zRGiZMrqKWbDh0PNmhL4hWWuXr2KyWTCZDLxyCOPUK9ePUwmE9WqVcPJyem+ylyyZIlRZrly5XB1dcVkMvHWW28xY8YM5s6dW8CfIrPExETeeustGjdujIeHB23atOHXX3/N8ZgGDRpw5coVi+vw9/dn/PjxAEX2uayJJbPuK2it49I2tNZxSim7nA4QwtpMnQqpT3w13L0LV1NXlEh7fCnIqmkiazVq1CA0NBQwB6vKlSvz+uuvEx0dTe/eve+rzGHDhhnPCWjQoAHbtm0zbr+cMWNGrscbTzezseScL2vTpk3j4sWLhIeHU758eS5fvszvv5ecK7tJSUmUKWNJqLNelvzXjVdKGQ++Vkp5ArcLr0lClDyWPK3s1i3zDwIh8io5OZlRo0bh7OxM9+7duX3b/E/syZMn6dmzJ56ennTo0IGoqKg8lRsZGcmrr75Kw4YNWbBgAQDR0dE4Ojry0ksv4eLiwrlz55gzZw5eXl64ubkxffp04/hly5bRsmVLTCYTL7/8snGnSJpbt27xxRdfsHDhQuMWzzp16vDcc88B8Morr9CiRQucnZ0zlAvw0Ucf4erqSsuWLTlx4gQA69evp1WrVjRv3pyuXbvmuiZEdv2TtmRzq1ateOONNwgNDaV169a4ubnRt29frl27BpifKOnk5ISbm5uxDoY1siTQvwqsUkrtUErtBFYC4/NTqVLqYaXUJqXU8dS/1bPJl6yUCk19yUx/UWwsfVqZPL5U3I/jx48zbtw4IiIiqFatGqtXrwbMa/YvXLiQkJAQ5s6dy9ixY/NUblRUFB999BH79u3j3XffNR4WdPz4ccaOHUtERARHjx7l+PHj7Nu3j9DQUEJCQti+fTtHjhxh5cqV7Nq1i9DQUGxtbTM9KOnEiRPUr1+fhx56KMv6Z82aRXBwMIcOHeL333/PcMtp1apVOXz4MOPHj+fVV18FoH379uzdu5eDBw8yePBgPvrooxw/X07988cff7B7927mzZvHSy+9xIcffsihQ4dwdXXl3XfNd4bPnj2bgwcPcujQIRYtWpSnvi1Nch3P0FrvV0o1BdLWtj+qtU7MZ71vAVu01rOVUm+lbr+ZRb7bWmtTPusSIt9mzTIPzd87fH8veXypuB8ODg7GQ5I8PT2Jjo4mLi6O3bt3M3DgQCPfnTt38lRur169KFeuHDVr1qR27drGGbK9vb3xYKWNGzeyceNGmjdvDpif23D8+HEOHTpESEgIXl5egPlBTnm9xfP7779n8eLFJCUlcfHiRSIjI3FzcwPg+eefN/5OmjQJMAfnQYMGcfHiRe7evYuDg0O2ZefWPwMHDsTW1pbY2FiuX79Op07mG8iGDh1qHOPm5oavry/PPvsszz77bJ4+W2li6YULL6BBan4PpRRa62/yUe8zgHfq+6VAEFkHeiFKhHufYvbww3DjBiSm+8krjy8V9yv9yoa2trbcvn2blJQUqlWrZlzXL4hyk5KSAIw1HMB8nX7KlCm8/PLLGY5duHAhQ4cO5YMPPsi2/CeeeIKzZ89y48aNTGf1p0+fZu7cuezfv5/q1avj5+dHQkKCsV8plen9hAkT+Oc//0mfPn0ICgrKcZ5Bbv2T/jNm5+eff2b79u2sX7+eWbNmcfjwYau8np/r0L1S6ltgLtAec8D3ArK8Vy8P6mitL6a+vwTUySZfBaVUsFJqr1Lq2XzWKUS++PpCdDSkpMCVK7BkCdjbg1Lmv4sXy0Q8UXAeeughHBwcWLVqFWAOyGmPMC5IPXr04OuvvyYuzjzn+vz58/z555906dKFwMBA/vzzT8C81POZM2cyHGtnZ8eIESP4xz/+wd27dwGIiYlh1apV3Lhxg0qVKlG1alUuX76caSb+ypUrjb9pi0TFxsZSr149AJYuXZpjuy3tn6pVq1K9enV27NgBwLfffkunTp1ISUnh3Llz+Pj48OGHHxIbG2v0gbWx5KdLC8BJ53EBbaXUZuCRLHZlmK6ktdZKqezKttdan1dKNQS2KqUOa61PZpVRKTUaGA1Qq1YtgoKC8tJccY+4uDjpw1zUqwf+/hnT0neZ9GH+WWsfRkdHU7FiRYKCgrh06RLx8fHG5zx58iS3b98mKCiICRMmMGfOHN566y2Sk5Px8fFh6NChWZaZkJDArl27qFq1aoY6mjZtSlBQEPHx8ezduxcgQ33lypUzJuIBVKxYkX/961/Uq1eP559/3niUsq2tLa+++mqmWwG7devGV199hYODA+XKlaNChQoMGzaMWrVqUbduXezt7alVqxaOjo5ERUURFBREQkICYWFhNGrUiLJlyzJt2jSCgoLo378/Tz/9NJUrV8bDw4Pr168TFBREVFQU58+fJygoKEPfZdc/ly5dIiIiwrgDYcKECbz88svcuXOHunXr8uabb7J161YmTZpEfHw8Wmt69+6d7ehAaf8eWvI8+lXAxHRn4Pmv1PyMe2+t9UWlVF0gKLfn2yul/IGftNaBuZUvK+PlX2lYCaqkkz7MP+nD/JM+zL/S0If3tTJeOjWBSKXUbwW41v06IO1n6VD+fiKeQSlVXSlVPvV9TaAdEJnPeoUQokjJioqiuFkydD+jEOqdDXyvlBoBnAGeA1BKtQDGaK1HAs2Az5VSKZh/kMzWWkugF0KUGmkrKqbdrSELK4niYMntdQW+xJHW+irQJYv0YGBk6vvdgGtB1y2EEEUlqxUV0xZWkkAvikq2gV4ptVNr3V4pdRNIfyFfYZ5Dl/UKCUIIIYDsF1CShZVEUco20Gut26f+rVJ0zRFCCOtRv755uD6rdCGKSo6T8ZRStkqpvC2uLIQQAjAvoGR3zyPAZGElUdRyDPRa62TgqFJKfn8KIUQe+fqaF1KShZVEcbJk1n11IEIptQ+IT0vUWvcptFYJIYSV8PWVwC6KlyWBflqht0IIIYQQhSKnWfcVgDHAE8Bh4CutdVJRNUwIIYQQ+ZfTNfqlmNe5Pww8Cfy7SFokhBBCiAKT09C9k9baFUAp9RWwr2iaJIQQQoiCktMZvfGkbRmyF0IIIUqnnM7o3ZVSN1LfK6Bi6rasjCeEEEKUEjmtjGdblA0RQgghRMGz5DG1QgghhCilJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRClWEAANGgANjbmvwEBxd0iIURJI4FeiFIqIABGj4YzZ0BrOHPGlhdfNGFv746Hhwe7d+8u8DrXrl1LZGRkgZebEz8/PwIDAzOl+/v7c+HCBWO7QYMGXLly5b7qiI6OpmLFiphMJtzd3Wnbti1Hjx697zZn5eOPP+bWrVsFWqYQlpBAL0QpNXUqZIwbFdE6FKXC+OCDD5gyZUqB11kcgT479wb6/GrUqBGhoaGEhYUxdOhQ/u///q/AygYJ9KL4SKAXopQ6ezb79Bs3blC9enUjbc6cOXh5eeHm5sb06dON9GeffRZPT0+cnZ1ZvHixkV65cmXjfWBgIH5+fuzevZt169YxefJkTCYTJ0+exMPDw8h3/PjxDNtpvvjiC7y8vHB3d6d///5GsPPz82PixIm0bduWhg0bGmftWmvGjx+Po6Mjr732Gn/++WemMgMDAwkODsbX1xeTycTt27cBWLhwIR4eHri6uhIVFQVAfHw8w4cPp2XLljRv3pwff/wx175N33/JyclMnjzZ6L/PP/8cgLi4OLp06WLUl1ZufHw8vXr1wt3dHRcXF1auXMmCBQu4cOECPj4++Pj45Fq/EAVKa211ryZNmmiRP9u2bSvuJpR6hd2H9vZamwft0142Gtx1mTKO+qGHHtLBwcFaa61/++03PWrUKJ2SkqKTk5N1r1699O+//6611vrq1ataa61v3bqlnZ2d9ZUrV7TWWleqVMmo5+dPPtHnqlXTWms9dOhQvWrVKq2nT9d6zhzt7e2tDx48qLXWesqUKXrBggWZ2plWptZaT5061cgzdOhQPWDAAJ2cnKwjIiJ0e3t7rb29dexjj+nTlSrp5Hnz9KpVq3TVqlXNdd6jU6dOev/+/en6w94o+5NPPtEjRoww2vXtt99qrbW+du2abty4sY6Li8tQ1unTp3WFChW0u7u7btiwoX7kkUf0mTNntNZaf/755/r999/XWmudkJCgPT099alTp3RiYqKOjY3VWmsdExOjGzVqpFNSUnRgYKAeOXKkUfb169eN9sXExGT6HIVN/l/Ov9LQh0CwziYmyhm9EKXUrFlgZ5c+pSJ2dqH4+0exYcMGXnrpJbTWbNy4kY0bN9K8eXM8PDyIiori+PHjACxYsAB3d3dat27NuXPnjHRLjRw5kiVLlpCcnMzKlSt54YUXMuUJDw+nQ4cOuLq6EhAQQEREBAA2KSk8++yz2NjY4OTkxMWYGPj3v3mnf3+2f/ghNp99Rv24ODp37mxxe/r16weAp6cn0dHRAGzcuJHZs2djMpnw9vYmISGBs1kMh6QN3Z88eZKPP/6Y0aNHG8d/8803mEwmWrVqxdWrVzl+/Dhaa/71r3/h5uZG165dOX/+PJcvX8bV1ZVNmzbx5ptvsmPHDqpWrZqnPhWioJUp7gYIIe6Pr6/579Spfw/jL16clt6GK1euEBMTg9aaKVOm8PLLL2c4PigoiM2bN7Nnzx7s7OyMIAiglDLy3blzJ9s29O/fn1OTJnHrhx/YevMmNcaNgxUrID4eJkyA8HBqhoXxzYcf4vDqq+wcOZJKP/8MnTvzRmQk4X36GGVdUgo8POCbb0iqWBGaNaN8HifXlS9fHgBbW1uSkpIA86jl6tWrcXR0tLicPn36MGzYMOP4hQsX0qNHjwx5/P39iYmJISQkhLJly9KgQQMSEhJo0qQJBw4c4JdffuHtt9+mS5cuvPPOO3n6HEIUJDmjF6IU8/WF6GhISTGf3acF/6ioKJKTk6lRowY9evTg66+/Ji4uDoDz58/z559/EhsbS/Xq1bGzsyMqKoq9e/ca5dapU4cjR46QkpLCb7/9ZqRXqVKFmzdvGtsVKlRgYnw8rklJRC5fDosWmXfMmgWdO8O+fTxdqRKPL1xI4vXr7NmzB/u//oLAQGb37JnlZ+rYsSNB/v7ogweJrlOHbdu2ZZnv3rZkp0ePHixcuBDz6CYcPHgw12N27txJo0aNjOM/++wzEhMTATh27Bjx8fHExsZSu3ZtypYty7Zt2zhz5gwAFy5cwM7OjiFDhjB58mQOHDiQp/YKUdDkjF4IK3H79m1MJhNgPgtdunQptra2dO/enSNHjtCmTRvAPNFu2bJl9OzZk0WLFtGsWTMcHR1p3bq1Udbs2bPp3bs3tWrVoluTJkb64MGDGTVqFHf++osBw4ZRE9CurnwSFkaPmBgok/pPysaNsG4dzJ3LvkqVuHzmDJM6dKBP3bpE3LlDh4cfzvZz9O3WjRZjxjChTBn2/uc/Rrvv5efnx5gxY6hYsSJ79uzJtrxp06bx6quv4ubmRkpKCg4ODvz000+Z8p08eRKTyYTWmnLlyvHll18C5ssT0dHReHh4oLWmVq1arF27Fl9fX55++mlcXV1p0aIFTZs2BeDw4cNMnjwZGxsbypYty2effQbA6NGj6dmzJ48++mi2P16EKBTZXbwvzS+ZjJd/pWHySUlX6vtw2bK/Z/zZ2pq300yYoLW/v9Za67kffqi/GjJE60mTtG7aVOvERK09PLSOispc5pIlWo8bl32dd+9q3b271v/+t9baCvqwBJA+zL/S0IfkMBlPzuiFEJmlrcaTdt93cjKMGGF+/+STsGED/OMf9Hv2WW5FRbFs506oWtV8fT4uDnr0gIULzS+l4OBBaN485zq1NtfRrBn885+F+/mEeIDINXohRGaZV+OBO3dg2DDztffp06FRI35YtYoNNWtS08fHHMgnToRq1WDaNEhMBDc3cHY2b+dm1y749lvYuhVMJjCZeDjdvAEhxP2RM3ohRGbZrcaTlAShoX9vly0LO3dmzlexIqQuLJOBn5/5lZX27c1n9en8FRRkQWOFEDmRM3ohRGb16+ctXQhRYkmgF0Jklnk1HvP2rFnF0x4hxH2TQC+EyMzX17z6jr29eTKdvX361XiEEKWIXKMXQmTN11cCuxBWQM7ohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRBCCCsmgV4IIYSwYhLohRAlVpcuXTCZTLi4uDBw4EBu3bqVbd7Q0FB++eWXfNdpa2trcZ1ClAYS6IUQJVa5cuUIDQ0lPDyccuXKsWjRomzz3k+gT0pKypRWsWJFi+sUojSQQC+EKBU6dOjAiRMniI+PZ/jw4bRs2ZLmzZvz448/cvfuXd555x1WrlyJyWRi5cqVWeYD8Pf3p0+fPnTu3JkuXbpYVOf69etp1aoVzZs3p2vXrly+fBmAGTNmMHz4cLy9vWnYsCELFiwo9H4QIq/k6XVCiBIvKSmJX3/9lZ49ezJr1iw6d+7M119/zfXr12nZsiVdu3blvffeIzg4mP/+978A/Otf/8oyH8CBAwc4dOgQDz/8sEV1tm/fnr1796KU4ssvv+Sjjz7i3//+NwBRUVFs27aNmzdv4ujoyCuvvELZsmULv1OEsJAEeiFEiXX37l1MJhNgPrseMWIEbdu2Zd26dcydOxeAhIQEzp49m+nYjRs3ZpuvW7du2Qb527dvZ6rz6NGjDBo0iIsXL3L37l0cHByM/L169aJ8+fKUL1+e2rVrc/nyZR577LGC6gIh8k0CvRCixEq7Rp+e1prVq1fj6OiYIf1///ufxfkqVaqUbZ1p1+jTmzBhAv/85z/p06cPQUFBzJgxw9hXvnx5472trW2W1/2FKE5yjV4IUar06NGDhQsXorUG4ODBgwBUqVKFmzdv5prvfsTGxlKvXj0Ali5det/llBazZs3C2dkZNzc3TCZTph9R9/Lz8yMwMDBPdTRo0IArV67kp5mA+RJLrVq1eOutt/J87IULFxgwYEC+21DSSaAXQpQq06ZNIzExETc3N5ydnZk2bRoAPj4+REZGGpPxsst3P2bMmMHAgQPx9PSkZs2aBfVRSqQ9e/bw008/GfMYNm/ezOOPP17czcrWpk2baNKkCatWrTJ+1Fnq0UcfzfMPlFJJa211ryZNmmiRP9u2bSvuJpR60of3Z9kyre3ttVZK6wULtully4q7RaVbXr+Hq1ev1r17985y37vvvqtbtGihnZ2d9ahRo3RKSorWWuuhQ4fqVatWaa21tre31zExMVprrffv3687deqktdb6ypUrulu3btrJyUmPGDFC169f38j373//Wzs7O2tnZ2c9f/58rbXWcXFx+qmnntJubm7a2dlZr1ixIss2vfjii3rlypXa29tb79q1y0i3t7fXb731lnZ3d9eenp46JCREd+/eXTds2FB/9tlnWmutT58+rZ2dnbXWWsfHx+uBAwfqZs2a6WeffVa3bNlS79+/X2ut9dtvv61dXFy0s7OzfuONN7TWWiclJemhQ4dqZ2dn7eLioufNm5enfi5oQLDOJiYWyxm9UmqgUipCKZWilGqRQ76eSqmjSqkTSqm8j8sIIUqVgAAYPRrOnAGt4e5d83ZAQHG37MHRvXt3zp07R5MmTRg7diy///67sW/8+PHs37+f8PBwbt++zU8//WRxue+++y7t27cnIiKCvn37GhMjQ0JCWLJkCf/73//Yu3cvX3zxBQcPHmTDhg08+uijhIWFER4eTs+ePTOVmZCQwObNm3n66ad5/vnnWb58eYb99evXJzQ0lA4dOhiXF/bu3cv06dMzlfXpp59SvXp1IiMjef/99wkJCQHMw/uLFy9m69athIaGsn//ftauXUtoaCjnz58nPDycw4cPM2zYMIv7oqgV19B9ONAP2J5dBqWULfAJ8CTgBDyvlHIqmuYJIYrD1Klw70J0t26Z00XRqFy5MiEhISxevJhatWoxaNAg/P39Adi2bRutWrXC1dWVrVu3EhERYXG527dvZ8iQIYD5ToXq1asDsHPnTvr27UulSpWoXLky/fr1Y8eOHbi6urJp0ybefPNNduzYQdWqVTOV+dNPP+Hj40PFihXp378/a9euJTk52djfp08fAFxdXWnVqhVVqlShVq1alC9fnuvXr2coa+fOnQwePBgAFxcX3NzcANi/fz/u7u7UqlWLMmXK4Ovry/bt22nYsCGnTp1iwoQJbNiwgYceesjivihqxRLotdZHtNZHc8nWEjihtT6ltb4LrACeKfzWCSGKSxZ3yeWYLgqHra0t3t7evPvuu/z3v/9l9erVJCQkMHbsWAIDAzl8+DCjRo0iISEh07FlypQhJSUFIMv9lmrSpAkHDhzA1dWVt99+m/feey9TnuXLl7N582YaNGiAp6cnV69eZevWrcb+tDsibGxsMtwdYWNjk++7I6pXr05YWBje3t4sWrSIkSNH5qu8wlSSJ+PVA86l2/4jNU0IYaXq189buih4R48e5fjx48Z2aGgo9vb2RtCuWbMmcXFx2U5ia9CggTHsvXr1aiO9Y8eOfPfddwD8+uuvXLt2DTCvVbB27Vpu3bpFfHw8a9asoUOHDly4cAE7OzuGDBnC5MmTOXDgQIZ6bty4wY4dOzh79izR0dFER0fzySefZBq+t1S7du34/vvvAYiMjOTw4cMAtGzZkkOHDnHlyhWSk5NZvnw5nTp14sqVK6SkpNC/f39mzpyZqX0lSaHdR6+U2gw8ksWuqVrrHwuhvtHAaIBatWoRFBRU0FU8UOLi4qQP80n6MO/mzTNfn089IeSxx+KYNy8Ie3uQrrw/ef0eHj16lIULFxIXF4etrS316tXjtddeIzQ0lO7du/PEE09QvXp1Hn/8caKjowkKCuLSpUtERERQs2ZN+vTpw+jRo7Gzs8NkMnH9+nWCgoLo0qULM2fO5Msvv8TFxYU6deqwa9cuqlatSvv27XF2dgbMw/qxsbFs2rSJzz//HKUUZcqUYdKkSRk+x4YNG3BxcWHPnj1GWo0aNfjhhx8YPHgwCQkJRvlRUVGcP3/eOD5t3+3bt4mPjycoKAgXFxd++uknGjRoQP369bG3tycqKoq4uDhefPFFWrZsidaa1q1bU7VqVdauXctHH31kjF6MGjWqxP7/rnQeb0co0MqVCgJe11oHZ7GvDTBDa90jdXsKgNb6g9zKdXR01EeP5nZlQOQkKCgIb2/v4m5GqSZ9eH8CAszX5M+ehf/8J4iHH/bG17e4W1V6yffQMsnJySQmJlKhQgVOnjxJ165dOXr0KOXKlSsVfaiUCtFaZzm5vSSvjLcfaKyUcgDOA4OBF4q3SUKIwubrixHYg4KghP/7KqzErVu38PHxITExEa01n376KeXKlSvuZhWIYgn0Sqm+wEKgFvCzUipUa91DKfUo8KXW+imtdZJSajzwG2ALfK21tnyKpxBCCGGhKlWqEBycaXDZKhRLoNdarwHWZJF+AXgq3fYvQN4eMC2EEEIIQ0medS+EEKKIBARAgwZgY2P+K4sUWY+SfI1eCCFEEUhbkTBtsaIzZ8zbgEyEtAJyRi+EEA84WZHQukmgF0KIB5ysSGjdJNALIcQDTlYktG4S6IUQ4gE3axbY2WVMs7Mzp4vSTwK9EEI84Hx9YfFisLcHpcx/Fy+WiXjWQmbdCyGEyLAiobAuckYvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVk0AvhBBCWDEJ9EIIIYQVK5ZAr5QaqJSKUEqlKKVa5JAvWil1WCkVqpQKLso2CiGEENagTDHVGw70Az63IK+P1vpKIbdHCCGEsErFEui11kcAlFLFUb0QQgjxwFBa6+KrXKkg4HWtdZbD8kqp08A1QAOfa60X51DWaGA0QK1atTy///77gm/wAyQuLo7KlSsXdzNKNenD/JM+zD/pw/wrDX3o4+MTorXO8lJ4oZ3RK6U2A49ksWuq1vpHC4tpr7U+r5SqDWxSSkVprbdnlTH1R8BiAEdHR+3t7X0/zRapgoKCkD7MH+nD/JM+zD/pw/wr7X1YaIFea921AMo4n/r3T6XUGqAlkGWgF0IIIURmJfb2OqVUJaVUlbT3QHfMk/iEEEIIYaHiur2ur1LqD6AN8LNS6rfU9EeVUr+kZqsD7FRKhQH7gJ+11huKo71CCCFEaVVcs+7XAGuySL8APJX6/hTgXsRNE0IIIaxKiR26F0IIIUT+SaAXQgghrJgEeiEeQJcuXWLw4ME0atQIT09PnnrqKY4dO8aFCxcYMGBAnsry9/dn/PjxBdKu9GXNmDGDlStXFki5QjzIJNAL8YAICIAGDUApjb19X+zsvDl58iQhISF88MEHXL58mUcffZTAwMBCbUdSUlKhli+EyEgCvRAPgIAAGD0azpwB2Mbdu2VZuXIMAQHm/e7u7nTo0IHo6GhcXFwA89l1v3796NmzJ40bN+aNN94wyluyZAlNmjShZcuW7Nq1y0iPiYmhf//+eHl54eXlZeybMWMGL774Iu3atePFF1/MNl92vvjiC7y8vHB3d6d///7cunWrQPtHCGsmgV6IB8DUqfB3bAwHPLl1y5yek9DQUFauXMnhw4dZuXIl586d4+LFi0yfPp1du3axc+dOIiMjjfz/+Mc/mDRpEvv372f16tWMHDnS2BcZGcnmzZtZvnx5jvmy0q9fP/bv309YWBjNmjXjq6++ur+OEOIBVFxPrxNCFKGzZ/OWnqZLly5UrVoVACcnJ86cOcOVK1fw9vamVq1aAAwaNIhjx44BsHnz5gyB/8aNG8TFxQHQp08fKlasmGu+rISHh/P2229z/fp14uLi6NGjR84NF0IYJNAL8QCoXz9t2B7AGQg00nNSvnx5472trW2u19dTUlLYu3cvFSpUyLSvUqVKFuXLip+fH2vXrsXd3R1/f3+CgoIsOk4IIUP3QjwQZs0CO7u0rc7AHcqVW8ysWeaUQ4cOsWPHDovKatWqFb///jtXr14lMTGRVatWGfu6d+/OwoULje3Q0NAsy7A0X5qbN29St25dEhMTCUibWCCEsIgEeiEeAL6+sHgx2NuDUop69dZgMm3mnXca4ezszJQpU3jkkaweNplZ3bp1mTFjBm3atKFdu3Y0a9bM2LdgwQKCg4Nxc3PDycmJRYsWZVmGpfnSvP/++7Rq1Yp27drRtGlTyz+4EKJ4n0dfWBwdHfXRo0eLuxmlWml/LGNJIH2Yf9KH+Sd9mH+loQ+VUtk+j17O6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrJoFeCCGEsGIS6IUQQggrZpXPo1dK3QTkgfT5UxO4UtyNKOWkD/NP+jD/pA/zrzT0ob3WulZWO8oUdUuKyFGtdYvibkRpppQKlj7MH+nD/JM+zD/pw/wr7X0oQ/dCCCGEFZNAL4QQQlgxaw30i4u7AVZA+jD/pA/zT/ow/6QP869U96FVTsYTQgghhJm1ntELIYQQAisJ9EqpOUqpKKXUIaXUGqVUtWzy9VRKHVVKnVBKvVXEzSzRlFIDlVIRSqkUpVS2s0uVUtFKqcNKqVClVHBRtrGky0MfyvcwG0qph5VSm5RSx1P/Vs8mX3LqdzBUKbWuqNtZEuX2vVJKlVdKrUzd/z+lVINiaGaJZkEf+imlYtJ990YWRzvzyioCPbAJcNFauwHHgCn3ZlBK2QKfAE8CTsDzSimnIm1lyRYO9AO2W5DXR2ttKs23mxSSXPtQvoe5egvYorVuDGxJ3c7K7dTvoElr3afomlcyWfi9GgFc01o/AcwHPizaVpZsefh/c2W6796XRdrI+2QVgV5rvVFrnZS6uRd4LItsLYETWutTWuu7wArgmaJqY0mntT6itZZFhvLBwj6U72HOngGWpr5fCjxbfE0pVSz5XqXv20Cgi1JKFWEbSzqr/X/TKgL9PYYDv2aRXg84l277j9Q0kTca2KiUClFKjS7uxpRC8j3MWR2t9cXU95eAOtnkq6CUClZK7VVKPVs0TSvRLPleGXlST4xigRpF0rrSwdL/N/unXiYOVEo9XjRNy59SszKeUmoz8EgWu6ZqrX9MzTMVSAICirJtpYUlfWiB9lrr80qp2sAmpVSU1tqS4X6rUEB9+EDLqQ/Tb2ittVIqu9uC7FO/hw2BrUqpw1rrkwXdViHusR5YrrW+o5R6GfMISediblOuSk2g11p3zWm/UsoP6A100VnfM3geSP/r67HUtAdGbn1oYRnnU//+qZRag3m464EJ9AXQh/I9zKEPlVKXlVJ1tdYXlVJ1gT+zKSPte3hKKRUENAce5EBvyfcqLc8fSqkyQFXgatE0r1TItQ+11un760vgoyJoV75ZxdC9Uqon8AbQR2t9K5ts+4HGSikHpVQ5YDAgs3XzQClVSSlVJe090B3zBDRhOfke5mwdMDT1/VAg0yiJUqq6Uqp86vuaQDsgsshaWDJZ8r1K37cDgK3ZnBQ9qHLtw9Qfn2n6AEeKsH33zSoCPfBfoArmoeRQpdQiAKXUo0qpX8C4JjUe+A3zf5zvtdYRxdXgkkYp1Vcp9QfQBvhZKfVbarrRh5ivl+5USoUB+4CftdYbiqfFJY8lfSjfw1zNBroppY4DXVO3UUq1UEqlzXBuBgSnfg+3AbO11g90oM/ue6WUek8plXZXwldADaXUCeCfZH9HwwPJwj6cmHoLbRgwEfArntbmjayMJ4QQQlgxazmjF0IIIUQWJNALIYQQVkwCvRBCCGHFJNALIYQQVkwCvRBCCGHFJNALUYTSPXUtXCm1Silll02+3fdZfgul1IJ8tC8um/RHlFIrlFInU5c//kUp1eR+6ykJlFLeSqm22exrqpTao5S6o5R6vajbJkRBkkAvRNFKe+qaC3AXGJN+Z+qKZWitswxAudFaB2utJ+a/mRnapIA1QJDWupHW2hPzEyKzW4e+tPAGsuvnvzDfJz23yFojRCGRQC9E8dkBPJF6ZrlDmZ+rHgl/n1mn7gtKfYBGlFIqIO2JY0opL6XUbqVUmFJqn1KqSmr+n1L3z1BKfZt6ZnpcKTUqNb2yUmqLUuqAUuqwUiq3J3T5AIla60VpCVrrMK31DmU2J3WE4rBSalC6dv+ulPpRKXVKKTVbKeWb2s7DSqlGqfn8lVKLlPkBNceUUr1T0ysopZak5j2olPJJTfdTSv2glNqQ+pmMJUiVUt1TP+uB1NGSyqnp0Uqpd9N93qbK/Cz2McCk1BGWDuk/sNb6T631fiDxfv7DClGSlJq17oWwJqln7k8CaSsLegAuWuvTWWRvDjgDF4BdQDul1D5gJTBIa71fKfUQcDuLY92A1kAl4KBS6mfM68f31VrfUOYlZPcqpdblsByqCxCSzb5+gAlwB2oC+5VSac8+cMe8it1fwCngS611S6XUP4AJwKup+RpgfmZCI2CbUuoJYBzm59q4KqWaYn5iYtqlAlNqn9wBjiqlFqZ+9reBrlrreKXUm5hXf3sv9ZgrWmsPpdRY4HWt9UhlXkEzTmstZ+3CqkmgF6JoVVRKhaa+34F5WdK2wL5sgjyp+/4ASD22AeZHjF5MPetEa30jdf+9x/6otb4N3FZKbcMcUH8G/k8p1RFIwfwozjqYHwubV+0xP80rGbislPod8AJuAPvTHjmrlDoJbEw95jDmUYI032utU4DjSqlTQNPUchemfrYopdQZIC3Qb9Fax6aWGwnYA9UAJ2BXah+UA/akq+OH1L8hmH+cCPHAkEAvRNG6rbU2pU9IDUzxORxzJ937ZPL2/+29Z+ka8AVqAZ5a60SlVDRQIYcyIjA/BCWv0rc7Jd12Chk/Q1ZttLTctP5QwCat9fO5HJPX/hOi1JNr9EKUTkeBukopL4DU6/NZBbBnUq9318A8+Ww/5seT/pka5H0wnxHnZCtQXik1Oi1BKeWWel17BzBIKWWrlKoFdMT8wKO8GKiUskm9bt8w9bPtwPyDhNQh+/qp6dnZi/mSxhOpx1RSud8VcBPzw7CEsGoS6IUohbTWd4FBwEJlfpLWJrI+Kz+E+Qlve4H3tdYXgACghVLqMPASEJVLXRroC3RV5tvrIoAPMA/1r0mtIwzzD4I3tNZ5vQRwFvOPg1+BMVrrBOBTwCa1jSsBP631newK0FrHYH6S2HKl1CHMw/ZNc6l3PdA3q8l4ynw74R+Yr/O/rZT6I3UehBCljjy9TggrpZSaQQmfbKaU8gd+0loHFndbhLBWckYvhBBCWDE5oxdCCCGsmJzRCyGEEFZMAr0QQghhxSTQCyGEEFZMAr0QQghhxSTQCyGEEFZMAr0QQghhxf4fwUgdwD6Hi5UAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.decomposition import PCA\n", "import matplotlib.pyplot as plt\n", "import random as rd\n", "pca = PCA(n_components=2)\n", "pca_result = pca.fit_transform(dfXvectors)\n", "principalDf = pd.DataFrame(data = pca_result\n", " , columns = ['principal component 1', 'principal component 2'])\n", "\n", "finalDf = principalDf.iloc[arr]\n", "fig = plt.figure(figsize = (8,8))\n", "ax = fig.add_subplot(1,1,1) \n", "ax.set_xlim([-2.0,0.75])\n", "ax.set_xlabel('Principal Component 1')\n", "ax.set_ylabel('Principal Component 2')\n", "plt.scatter(finalDf['principal component 1']\n", " , finalDf['principal component 2'], c='b')\n", "\n", "for i in arr:\n", " str = dfX.at[i,'Movie']\n", " if str.find(\"(\")>0:\n", " str = str[str.rindex(\"/\")+1:str.index(\"(\")].replace(\"_\",\" \")\n", " else:\n", " str = str[str.rindex(\"/\")+1:].replace(\"_\",\" \")\n", " ax.annotate(str, (finalDf.at[i,'principal component 1'],finalDf.at[i,'principal component 2']+0.2*rd.random()-0.1))\n", "\n", "# add users as red dots\n", "def add_user(user_profile,plt,label):\n", " df_uservector = principalDf[dfX['Movie'].isin(user_profile)].mean() \n", " plt.plot(df_uservector['principal component 1'], df_uservector['principal component 2'], 'ro') \n", " ax.annotate(label,(df_uservector['principal component 1'], df_uservector['principal component 2']),c='r')\n", "\n", "add_user(user1,plt,\"User 1\") \n", "add_user(user2,plt,\"User 2\")\n", "\n", "ax.grid()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 2 }