From 02c067420a1d9a695a284023a718ddcd99e84556 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Tue, 6 Sep 2011 14:33:27 +0100 Subject: [PATCH] Initial import --- .gitignore | 3 + apishiv/__init__.py | 135 ++++++++++++++++++++++++++++++ apishiv/cache.py | 77 +++++++++++++++++ apishiv/static/icons/cross.png | Bin 0 -> 12008 bytes apishiv/static/icons/tick.png | Bin 0 -> 13269 bytes apishiv/static/knife.png | Bin 0 -> 48460 bytes apishiv/static/skills/level0.gif | Bin 0 -> 73 bytes apishiv/static/skills/level0t.gif | Bin 0 -> 434 bytes apishiv/static/skills/level1.gif | Bin 0 -> 76 bytes apishiv/static/skills/level1t.gif | Bin 0 -> 435 bytes apishiv/static/skills/level2.gif | Bin 0 -> 78 bytes apishiv/static/skills/level2t.gif | Bin 0 -> 440 bytes apishiv/static/skills/level3.gif | Bin 0 -> 80 bytes apishiv/static/skills/level3t.gif | Bin 0 -> 442 bytes apishiv/static/skills/level4.gif | Bin 0 -> 84 bytes apishiv/static/skills/level4t.gif | Bin 0 -> 444 bytes apishiv/static/skills/level5.gif | Bin 0 -> 84 bytes apishiv/static/style.css | 112 +++++++++++++++++++++++++ apishiv/templates/character.html | 94 +++++++++++++++++++++ apishiv/templates/characters.html | 29 +++++++ apishiv/templates/index.html | 15 ++++ apishiv/templates/layout.html | 22 +++++ apishiv/utils.py | 5 ++ app.py | 10 +++ requirements.txt | 2 + 25 files changed, 504 insertions(+) create mode 100644 .gitignore create mode 100644 apishiv/__init__.py create mode 100644 apishiv/cache.py create mode 100644 apishiv/static/icons/cross.png create mode 100644 apishiv/static/icons/tick.png create mode 100644 apishiv/static/knife.png create mode 100644 apishiv/static/skills/level0.gif create mode 100644 apishiv/static/skills/level0t.gif create mode 100644 apishiv/static/skills/level1.gif create mode 100644 apishiv/static/skills/level1t.gif create mode 100644 apishiv/static/skills/level2.gif create mode 100644 apishiv/static/skills/level2t.gif create mode 100644 apishiv/static/skills/level3.gif create mode 100644 apishiv/static/skills/level3t.gif create mode 100644 apishiv/static/skills/level4.gif create mode 100644 apishiv/static/skills/level4t.gif create mode 100644 apishiv/static/skills/level5.gif create mode 100644 apishiv/static/style.css create mode 100644 apishiv/templates/character.html create mode 100644 apishiv/templates/characters.html create mode 100644 apishiv/templates/index.html create mode 100644 apishiv/templates/layout.html create mode 100644 apishiv/utils.py create mode 100644 app.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..649c7b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +env +*.pyc +build diff --git a/apishiv/__init__.py b/apishiv/__init__.py new file mode 100644 index 0000000..fcc844f --- /dev/null +++ b/apishiv/__init__.py @@ -0,0 +1,135 @@ +from datetime import datetime + +from flask import Flask, render_template, request, redirect, flash, session, url_for +from jinja2 import evalcontextfilter, Markup +from eveapi import EVEAPIConnection, Error +from cache import DbCacheHandler +from utils import mask_check + +eveapi = EVEAPIConnection(cacheHandler=DbCacheHandler()) +app = Flask('apishiv') + +API_ACCESS_TYPE = { + 0: 'Account Balance', + 1: 'Asset List', + 2: 'Calendar Event Attendees', + 3: 'Character Sheet', + 4: 'Standings/Contacts (PCs/Corps/Alliances)', + 5: 'Contact Notifications', + 6: 'Faction Warfare Stats', + 7: 'Industry Jobs', + 8: 'Kill Log', + 9: 'Mail Bodies', + 10: 'Mailing Lists', + 11: 'Mail Messages', + 12: 'Market Orders', + 13: 'Medals', + 14: 'Notifications', + 15: 'Notification Texts', + 16: 'Research Jobs', + 17: 'Skill In Training', + 18: 'Skill Queue', + 19: 'Standings (NPC)', + 20: 'Calendar Events', + 21: 'Wallet Journal', + 22: 'Wallet Transactions', + 23: 'Character Information', + 24: 'Private Character Information', + 25: 'Account Status', + 26: 'Contracts', +} + +def auth_from_session(session): + return eveapi.auth(keyID=session['keyid'], vCode=session['vcode']) + +@app.template_filter() +@evalcontextfilter +def humanize(eval_ctx, n): + if type(n) in [int, long, float]: + s, ns = str(n).split('.')[0][::-1], '' + for x in xrange(1,len(s)+1): + ns = s[x-1]+ns + if not x % 3 and len(s) > x: ns = ","+ns + if eval_ctx.autoescape: ns = Markup(ns) + return ns + +@app.template_filter() +@evalcontextfilter +def unixdate(eval_ctx, n): + ns = str(datetime.fromtimestamp(int(n)).strftime('%Y-%m-%d %H:%M:%S')) + if eval_ctx.autoescape: ns = Markup(ns) + return ns + +@app.route('/', methods=['GET', 'POST']) +def index(): + if session.get('characters', None): + return redirect(url_for('character_list')) + if request.method == 'POST': + if not request.form['keyid'] or not request.form['vcode']: + flash('Please provide a Key and verification code') + else: + auth = eveapi.auth(keyID=request.form['keyid'], vCode=request.form['vcode']) + try: + res = auth.account.ApiKeyInfo() + except Error as e: + flash('Invalid KeyID/vCode, please try another') + else: + if res: + session['keyid'] = request.form['keyid'] + session['vcode'] = request.form['vcode'] + session['accessmask'] = res.key.accessMask + session['characters'] = {} + + for c in res.key.characters: + session['characters'][c.characterID] = c.characterName + + return redirect(url_for('character_list')) + + return render_template('index.html') + +@app.route('/characters') +def character_list(): + if not session.get('characters', None): + return redirect(url_for('index')) + + auth = auth_from_session(session) + access = [] + for id, name in API_ACCESS_TYPE.items(): + access.append((name, mask_check(session['accessmask'], id))) + + charinfo = {} + if mask_check(session['accessmask'], 3): + for id, name in session['characters'].items(): + res = auth.char.CharacterSheet(characterID=id) + charinfo[id] = {'corporation': res.corporationName, 'balance': res.balance, 'sp_total': 0} + if hasattr(res, 'allianceName') and type(res.allianceName) == unicode: + charinfo[id]['alliance'] = res.allianceName + for skill in res.skills: + charinfo[id]['sp_total'] += skill.skillpoints + + if mask_check(session['accessmask'], 23): + status = auth.account.AccountStatus() + else: + status = None + + return render_template('characters.html', characters=session['characters'], access=access, charinfo=charinfo, status=status) + +@app.route('/characters/') +def character(character_id): + if mask_check(session['accessmask'], 3): + auth = auth_from_session(session) + charinfo = auth.eve.CharacterInfo(characterID=character_id) + charsheet = auth.char.CharacterSheet(characterID=character_id) + corp = eveapi.corp.CorporationSheet(corporationID=charsheet.corporationID) + skilltree = eveapi.eve.SkillTree() + skilllist = {} + for skillgroup in skilltree.skillGroups: + for skill in skillgroup.skills: + skilllist[skill['typeID']] = skill['typeName'] + return render_template('character.html', character=charsheet, corp=corp, skilllist=skilllist, charinfo=charinfo) + return redirect(url_for('characters')) + +@app.route('/clear') +def clear(): + session.clear() + return redirect(url_for('index')) diff --git a/apishiv/cache.py b/apishiv/cache.py new file mode 100644 index 0000000..364778e --- /dev/null +++ b/apishiv/cache.py @@ -0,0 +1,77 @@ +from hashlib import sha1 +import logging +import sqlite3 + +try: + SQLITE_PATH = getattr(settings, SQLITE_DB_PATH, '/tmp/apishiv.sqlite3') +except: + SQLITE_PATH = '/tmp/apishiv.sqlite3' + +class DbCacheHandler: + """ + Database backed cache handler for Entity's eveapi module + """ + + def __init__(self, conn=SQLITE_PATH): + self._conn_url = conn + + @property + def log(self): + if not hasattr(self, '_log'): + self._log = logging.getLogger(self.__class__.__name__) + return self._log + + @property + def conn(self): + if not hasattr(self, '_conn') or not self._conn: + self._conn = sqlite3.connect(self._conn_url) + self.setup() + return self._conn + + @property + def cursor(self): + if not hasattr(self, '_cursor') or not self._cursor: + self._cursor = self.conn.cursor() + return self._cursor + + def setup(self): + if not hasattr(self, '_setupchecked'): + self.cursor.execute('CREATE TABLE IF NOT EXISTS api_cache(docid TEXT PRIMARY KEY, xml TEXT, cacheduntil TEXT)') + self._setupchecked = True + + def disconnect(self): + if hasattr(self, '_cursor'): + self._cursor.close() + self._cursor = None + if hasattr(self, '_conn'): + self._conn.close() + self._conn = None + + @staticmethod + def _gen_docid(host, path, params): + return sha1("%s%s?%s" % (host, path, params)).hexdigest() + + def retrieve(self, host, path, params): + docid = self._gen_docid(host, path, params) + self.log.debug("Retrieving document: %s" % docid) + try: + self.cursor.execute("SELECT xml FROM api_cache WHERE docid = ? and datetime(cacheduntil, 'utc') >= current_timestamp", (docid,)) + res = self.cursor.fetchone() + self.disconnect() + except sqlite3.Error as e: + self.log.error("Error retrieving document: %s", e.args[0]) + else: + if res: + self.log.debug("Found %s documents for ID %s" % (len(res), docid)) + return res[0] + return None + + def store(self, host, path, params, doc, obj): + docid = self._gen_docid(host, path, params) + self.log.debug("Storing document: %s (%s)" % (docid, path)) + try: + self.cursor.execute('REPLACE INTO api_cache (docid, xml, cacheduntil) VALUES (?, ?, ?)', (docid, doc, obj.cachedUntil)) + self.conn.commit() + self.disconnect() + except sqlite3.Error as e: + self.log.error("Error storing document: %s", e.args[0]) diff --git a/apishiv/static/icons/cross.png b/apishiv/static/icons/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb863dbca97d15335e61c585a26a1d47ea53729 GIT binary patch literal 12008 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 literal 0 HcmV?d00001 diff --git a/apishiv/static/knife.png b/apishiv/static/knife.png new file mode 100644 index 0000000000000000000000000000000000000000..42018f0d266cecb676c75d9c7515a429a8a245b3 GIT binary patch literal 48460 zcmeFZ`9G9z^glioA(177V#uDQ$i6jF7`qTdB>Ns&vX@e$EZNCg_H5aAddb=pvSu&) zF3Z@L@0s53&*S??d_MDd^huesD3{W5sNxbVqJ#XHy3MWyq(X{624g{e<@*ric`l^8Y^nw^$(UPH0#d z<;rNa$k@CWyfo58Kb;#<)nOqlROWav`=HhXFX}A_UtlksB7LtTm7GEyAu>BVTcNJ0 z$=W}^N4SNB2x()7S;Dgm-w+jbcSxT*jX*q`C%x4j&5x7P!mrz8_BHqQ^>t7rQo-eq zP>4V)(Yalj{Ai|x_wS`@*-B3#5V!aV*Ke;)$WOUSW=GffdwcI6)@Tx(u~;iK1@YU` z+uK`Pv4o}a-&&IY^I)~s*>RGV@Rh~?+{R6j*idD_ zuc4-)!4fzB5*|p!2=587-4wu;_zSVqY~+k34eSpuEG&d`h+Kmk6~P!;mLnAlEL7a8 ziVafm4qccfiEJXUAQmiA#*g#P-&hl+zkK)$o>{nuFA7jE05d-0BHWo-?$2MPmsYtp zQn^-k?qd#~3!2|Hm%{VdJa zakR=M9LpbHriWIMO5Q%Npg2v0E8+539raRhpoMkZvH_ELgzE?V#Rb|Fa3*W0!ew?F zuPYqGH8eCDgc}wJFL@qbQaara*`NKuQkbz3Y0+MiKjN|cYkm9DEP&gycknXH`b0>S zAyvc|Bu8F(gB9#>K+6pjEF}Ia0#)jhGZ1zPg~hhZYiMc)=-L11BDh8J-^rk?tZ46F zQ#ID9RJdYAMY$65wlLPPkdSG+piD8_x|K`5xh_y zmL-}QJx9ae%a6rsQ@PqnC9~A8H5?2C{r@-1Zgt-df1~_gMuEuuV_{N-uxl~sd+-qw zOJ#!}X!?6hC)~|Jc$sU|k^@WroPXyR7cmiZF1W~xZ}0HNp#8&>w9)ko;Foo!v3u~l zUzi!G%1%#3eGV)^vfoX3CpS{z48HDNx$p#D>ftK{k$RUiYx|#rl%2ZMk!eUp-Wa-w zJT7i-c{4FpfKo z3UH}BRbQ(R`Q(i(?B!wcNxGN1p?m+$$;?TL&u)6z1;HZ~6%m2@f1gC%?N6YL;#Uqb zrP7(n*X0ux78Sko&!I?Rhqg4N7BZCXOyAO~#gro1$5B}G?@@Ow9<_yC>7u|R;W7Md z2$X6!=ASh2LYNP|0fOs$PR8Uv`QynFYq zFD~y4*oR{@&@1gZY@Umj;(pz#QEa*Hm@#iTdv{Lfqbkdrb=%?m{QOwQ5q6qOb%#EJ zaXw3`CL58Gjdx)o$sy-SF&&ymPVcS6ng{_R7$@@WCAK|*oSb~5wXH4uW(ok*t=C`^ zTsLOz{7)uMu<4!j__3s(hmOkVYRn;-HRrUK69HSB)!+eFJDi1 zHHS!s1w%hqb%qZIo!B1lU0pZMaD{?#q)we8#k|t_Hh`H}8*CMLiWMQ( zVJxbx9l1$b9IZ2vl$3PnE6@d4VIvOv!Hedd2%R?*VJhDyV|#%T8 zSik%;1anMGRG0x z-rip3+nNvzX+f~i8J_a-|%CBPc*I0+gwQ=ao*krUN6RB>c$e8b{c*Ot)5~YHrR@uPB(%M?U z$$A^B>Gf5D85AIEaoQGC9*k}t@zZG1b0||JPyvM4TUpHxbabc;-fQ?j>x|U-_JkEX zAQiDVr_Go3nhfw+51sq7xVX67ObRx->@@gH1^_!3d+QzXNvXifSQnjK-FY=IzC=`q z8X_3OcsfU0I+D^5G`Y28_IPLJE6e8W_o3?&p-dY-#TPO_hX0~Q$XPZ)c11&|U zzd;ZcET>!#WlkXeiBaW?`NT=e*n^o66BWhBc3&Vk4k5!DVwSX1eQ?K&uA|NSeV1NN zD^3r0bab3BdOspO1b|KeSFz$#x9UYq6xtbx?YsQa0G%rYhW1PN=UOq^Bt!y^fG>>~ zBN(KLu4Qt>pal+=>sUE*G_@X36_h)tx>oaVZf=$ni5R8$?=Q&9Z+;iar2~+~Py)!_ zEWoc&_*Sg>RU$HLG(!`ps3X+Be*IcWU^PK25S`tG^ko}sIX3Abn{(-d%D@K}KRXJA zXq_Up?A~;6oq$W9AdTF5LGW=3O3Lx8>>^G(i^ccZ?dTO1IUwD6dV0=VU(3|^?C8Un z+LcOGBSN?wFe+2_WUosI+wM{6QxHk8l2meRN=nL?;=C)AP6L=&Q8~b>Z(7N)OH73D z*W`6C9l?7i)6*%@XAB^xKcAwmcC@owTq$>h6q&;f8~GwY+|dRC?Cg2`wg7R(f|9a>5jx4P-e2IRxKJzL7tzOXHvTQU>Ns{M|?x-?L5@Ta|9 zxzpDJF2n=3sCZ}?J16%J!+=Y6NX1gXNmCQPQ_yIpYE(r{pYdV1R4 zmvB|i888+FuEdEZf{t6hUz(hzuWhpb%AmN>ez!eH?3W_|d>HD~K4c z-V;+(FDx!@P$-;lJ!)!hZk{o!aQHLFia_*T5klHr%hg>xn;E?(oR2BFT&}#4W7>#p z=BUy}`#m13aTi}5t?sQ`mV(VY4>?wUpvd$jUdK+@q4BOI>LU@awg?-$tA4I-js09_ zvi-;N;M!DY!3bfFBl2!mr|ih+C*N&xc^1JV$z6YSWa`-d%g3Vrz;kaAfp<$|mX?}b znDk|Znaa0IkSO$Le?RAg2M=(C zLG6K9>}A`L?RKzk!aq!Tc?S{b;a z10jsxokB_1Vk~A<8}8LwqRIw(#>VQS$#U7qbryCSR##UGPS#mZPy{YR#SA+xP=Id) zzicaS4sR_e*EIG)@zvDUawh(G#nScXdv$fSBQOr7yH^Mq9HP_F;p;1kC+J*OERpr8 z;Tz=a>^;4`SBD%bW`Q_jb?jc~*gb;m8vmXI79#;r>Zoq-7lbP}IQ^Vs|0!&wOg7C+ z#Si8Fg>d1cN0S-KXHFrWg+WrRr~tROrQQo_7cqQyJs~u$!YLuhn}6`!NJDlu_ab%u z$8wW&sD&U_uJzpd-*iix58Kkmovy8#$^jg5-9kYzLy6aY3X&K}IwkCY6d_JbxT5w_ zu+fV8R;Wpyo4@!B0sh9v$0Y)(RPFut;97=7J#`jH5*HSqrCnVft=_y#Eon5Jz~G6K zx)?C1L(;q_*~!G>Z!R?wAF?2}y1bl!@ofv;N>dLefIF(AE&y!OcMe|oE+nk0Jeh(; z`<~Rf0rVVUb42Ch3+d63?fwNuVRG&5l!tcz^D~>5rJXaJQt7k6zM+|?bYXq-)?a$IvwaD$6bh2R1DKc zhia;+IfR&B2l!8ckh>w~G+L!(fAr#;bqTU-erYMnP0Dd}{H>0if#T}>`1q$!rvC#k zFk(lblzw7NXI+03)&DH#*w>A>LfMfye8TVSw9&l8Dr+eE$9K)0@P!es_5s$XB)O0g z+XDIWGapPr69do<761 zz{HR$Q#UDr>L=!;2m&k5b7h#WdY=t4>jlDL+Mz8=yV;`tdR$k4^!i3uS9 ze7DAPZ96BOM+Z9-HBaU`pT8#oe{g((Ai6TQ)vGCFTM$PG4-3>MU12uuK&rNw9=gBh5J^nNEF-ZK7r&J|BgxgY{f`es0BwJ^(1Om* z1>Qbo#{@xDMtqveEn_NN-v6#*!vjA79`eboaa_(~0x@+&I|}<&o<9yZwdZ?G=RyG? zg&{vhDm4HAk;$&}$=3%E_tK0|z}{8%jrv9V zf+XVLDMk~T_LmlSrr*P!%TN9L^|SEnWkEqfs*25pzGAuLJ;6{(S_e|$&h50l()?n< zo7o_9cs#mMZVd*%#d5EnjXK+M`+7)>#?M61Iw$Lv^ix z!zw1{B`zLRIO3k4A!)8~Ol83_5?wOdUL8A_vrh4{`tPY0_)sKx|5OY*Q}vVl;QQjg z=E7E&yKOh zPs=p$Us?LumOysH@72PS!{Kb5+-?;1`Tbc}NrHcL&w{6hGa3OZ{bzQMHV0_WEgvYB^Ul#dB$8Yy>-89}@bkfoX7-i%QT~W0zOfRe2syP_ zjkH_=R$&gPPh3pIh&mV4ls#6Mm_lRuF~aa&)f-x=kt`kFg|#*DZ;#_y*!W-D2SLqT zd5NI6lo6e#`u+KyrYs(+GK&5|wXhj?y8(V|$EETL&Fo&`>({BczFd#cLqCuPdJ`c* z0$eZ@TuT3;|G2%Ph=@q)6Q7ich*GmSaW8;H{&YJxdc|fLQZmL21I$vBRdQdf<+1m&tx$@T#BBcA=66UnO!A}Orx9MGAQ(aPc-=Z++qzaYvxl>PFv&+^ zl9B~e5U!#X^}{N&v2kLjS`>3%Fs=3N& zK%FCN`p@J_tkrD-{h6y@9jUldZS#=kKnx=K#)ILR^2^s=g)YWoeW9p~{AU^j)L^1n zs3#8p;oIBWUmYJG2ZJdQO(ptrVf@&Gxt5kYl28BsE;(=^ri4VgwX<`Nuxc)VYyEp` zh-MmU&_MR}`C>498uPwp9^?vA)e>giPgTycVU}tIaNfNg+^NgnZy3RK`C}h`co1Y* zNN14o_c;m6ZU%N4kg(xlts~lbfQbb^Puo|Kmv=31h%sa}cX@$0+=)*0pBUm?e`@Ce^sLj4y`+vrn54U>=Yf@iaKd*T)5;<= zax#LVgE!M(0>JTpD=h>>FeEN%EQYn&nRfq8YJ@a+z!S_8w=cJa0c%DR2l?b6w=&j` zHX>zeVEksz!s==)P>T0Ufd;Xhetv!g)-{=;^Q{MC`o3%KpFh7SCcE-OaDie@l=#m` zg`;#H)cm;$HG`^-u+{rJ*YOgOIe*NgvO27b?6vpr%XR(u(eeHJ_YxoApM}qZ;-J7Q zEiJ{xe${ITD8TQ$e)Vcxl@RMpkkSgi+LaAjb3#d zM!Op0=6zZC? z@EMxS)KR~kF=v)bm#Q$$CqXr^lKAhpXc*s0#CdW;E~HLKNQkJemZX++JMSECY0!_( zjQsxNM>SoDZ*vJh0qFmgVdvDu6O_h6ScdaV@Sm8!&1|T%9}7+SD{YFIQ(WlXRspQB z7|PmE_<#gHT$m7sjNvry_i?2(vL4xnGKhoV>p8TL6F>b5+o?Y}J`e(rC9?yVxx+E) zn!{oDbT^c7XQNOe)&tm!5HTA_Ryuq!`eovKI%pMmZK!_cuD*60X)u5ED3B1|eWz4E zck@jeyoxdS;y3ufGg($b;%O-MMAgIco;PMSH(d= z#D>PkZYC9Xrkg^U#g8Z6lYsj_hkU8mTzvjoF(;)#D4*tZEy_ec7EUAomkv<@SSb z$}u2MO97npKPCQQrt$R+(^H@A#y_u^2a1d;R|N~)f8*@=V(jv0i|Yy#Iz_%eJ=j@` z11M9;?iEc9;oMNWE+H@9Sf-TyExE$6aiQ;?X0po?IRarv01O_xyUpizH@0TQ8}}N9 zhK9OGEK!OnxsKYQ{8+=(|NcWk)ffrM46OfQ_D@E1WJ(GPJh;=SsF?pP!RpOWNvyD| zb^jR@+vsX0k^B3+C>ovV6T(IFi1o#S36(g?2i3H7!%w3JrOrvpOaE4f=i+y6!_57I zwbfM*X||=z1vhUfI3|NcWx-AJZvoauxv9TvKTrX~n+_2uP&IprbdICty_(JU6V^p8 zk*l;~40D}oQftl859i0~pkKXu#SzuPPfTILNO><;_nSa`M{qkHSmxpTvjE!c3W(EHxkTKe z&UcHR_9l*Rb+tTNpHLr`63-kgeWes%k2E`z=-o$`OT-3d$~7><`$btAbUte-;Rjsv zpqD9AoG$T|3n2R!P83j4C8)$+)pl4Qj|MrafiL9+E5fc2Oc_eWz zr_t1Q(uWUhDw#S?dYz$?XQGS+=R6b!z;n6&F*J%_X9D%DFtiyFJ}96TwG&6HZ%zLO zGK^+MV~W3ewcNgPfNEMLUSFbhD~Q<%)Rnhi8?R?)cgn`>ZIHX33krm;g7txP`2c~- zB7u&T2{$4*!hXzi?Wh~DvsX^|AB@~Dz~I%>DfLjw-K{Q-VkW8e!yGrVQYGHfO1&tp z_t|-4Y1qlB8xf7>tX%$fwBWXnCshBm#j>P`XJUkeJV%GjpcsxH6(_qD@*?`@&!4KU z)k#0OW*5;57O2CKsZeXTr% z)=R{@MRG1_)3%pAXvTF2@12y`wKSA%0`+#ZPKjMVU$LXK?tg8_SW6Xfu+0NWjAHBN zo(#d_q~NU{da9OgMTn~vm4iwwUd;`wHA~~>HN5pSFZ)U(y}C88<|6g<5@ZZ=`uBe?3jLCr&a%z8dO=% zM=eeer`t1erv4_?#>YV_2j8sh#GQN;)cR|~MXG}BeWQ+Zb6R&ttT zbzS$l0bbl6c+Wj8N)LmW$xz0ME%yd#@OyXL9b-TjY+n4_T+mdi?(KTr<&)FAj$@d7lW) zjE&K%k=HBt#wsGoT%1;m=qm)#?%N!RKMHf`K1MS!va*T~Z=ONik_Ks@Hu&0OWsdg8 zdzjgN$ZCxc7yexqT17`le;?GM_K}R*b=@VCcRVd*$$ThfowgY(VMc4J$b0B92{Ezl z{}fqB5x1g%7;=+E5tG%d)mdM*Alln)lRq8=NiSPvWbyP<6)Q@nWI&j&v{{b$R=1*h zWL8YySVPZ3S?Mtr1kjnOsVP%z%@7OXnLZ&s>UQxftD|0}`pTJBfs1zj#K_b4>D#a9 z`+Qu1o<uvoGN?)UG9j}qSL@^LO~y;+e>1;L}r4y4BC2mU~`85|Upq&Lr<-DHl{O=pvO){omqjMpsC@!cmBv z=|Z@d&j+pD(q2vZWXNgHDnRt|nB8_=qjyl0#DC*Bqx0m|G`Q@L8zF+6dMaFnV>^Nk zI_=H!LK3%ax4|C<`A$suVk}OMkBW&dJAHcb?vwRsT!+Q@;~o`m*@$*fkZow7nDsPa zd~^L2wzPf|vyA)vDKsR+x1p$L%{Qtd2EE{<`kBdv-#OlH_D3|aHd^I_*5e;9o9Uu$ z3gRefa?V{0FcOS2^&Ga%mc4|79*>Q}@+nm9=5X7e{4kcXiLcI2ygv5#PppS|`W9;O zjGFgUc;BnR28g8%h4nf1nNStk4>{>}N`Bg!5AediuF!ER0YX0MZUoFhyPKRnbZD-CP zw44t^UujHMvW*Gb%nb~z_{QzWJ0A!lcb z78Pj{%DT4m=_NvnyfdTmg6Le4lA&cnuT?u(<}%`$6ckI@H^^=&DjvqxG#CFFU287* zl8PH~ZuI-JJ>o3iR*lug>lf>Jm~Hq>M4rr3NU?xYEe>2&^1%1scb3`yWgfu8K9p7wqrL#l zYGS~VHx}Ct>Xd~Q*ASg{45uMwEpU>rw%N&I$@5=NA(RoIh_Dx(f3@k|m#H7@d`WID z>B$DjH+|M>!%~_CZ|sBbz01MX0t6<4XYY9Ssv2d8OGxMb|txujz`7u;gj}?RufQyVXmS|-hqM0^Pr1~9 z@BweZ`BRvsOf}_NV5BLG_l>MmzsbLT{hBk8LgvC3gZPIkipL-G@|I>JA|fn0VTKRM zWpN9!7Iz>~itOK^r8o@u`+_xTuWnA(xm0CDm#@4mpL>-(fXi=~mt4neq+)rz-snxs z$0ZT9Ih{WYm%K(t6406Bk2gBF~fP&(JX^5m8cziic5827s5))@?s?uL!3t{Wbl3WK8PRr^Es#Z`D;aQ6YpE3s}TA4EYDnQE;Vb=tS z{1WvuMAzSQlu3gx0N_-SWeUlzm!=*q15x<$ z{jK8&3@h9>F0u^1*L{g==j&P09|qSH6*FpUjR58C7L5cHxHtva6G63;r}LtLQtg@g z{1>!8b5HUq#qO*v?|zc?a`&YH&%y__+o?yxx+b4{7s@hpaxHh>&nV`9EB8*q((OR4 zxg4>#=hbDMfHhMY9XvT`JUIwdPZaCVyv2n;IFa6Z7E^cnOy#qt>G=nZ$g4R44g_o! z0x)mrTJp!^9J!(li=WpdyrK0@#?I8ybLHGfa4wj7dwG9iCpSAqST1EywGY71?_RNi zZ`(q4Y6F!m5~|Z?8vciwi@k+OgHz)dbSgjfCyF`lkAff{KX|mrU>$XY)KFnKm%n=N z0W-()u8UypIgtjPPd~ZM^=4f>#1iYTrgmKrcVmYZ)*Yy^Hl^usUP6l<_uUOCOF_x% zv5b4*;gqYp@2F)|fPXX5Cq8BJ4wLd{Fgy0gl35CjLa?WX(6!}a*j+ziL&8Es3*HjC zF-=Issk%K!WzPW;GN!g7^|65|(Tv1qMJS^G`|rPQb4Vn9Nji4y(1!1xuZAWVbQymC5PJOBMBLDBhQX%Kk#`_l4xdXB zaI|Dya5cLeMV)a_$X0cb2Ml*hI!>ISFT*~vowar2o-bz z|IRTydpUN2#xtVnee#n|$x5iq4%Wt2B~6`FGb4X(i`)w@olm`=>d^%q&hr!$FqTCj z>vZ}RKdwd~wW~4nC+#VO8?-8r@%JB6d4RCnJvopiXmYYYXeuTy?)gGx5|CHj!7^K_6ulz09S27Vh+sdYI(O4jODw_T0u zSu^NLf!*Z;vCRNYMa6)9qaP|bp;j$t@On)mU~C-5+c`?xEF`S-(qdxZSg`t&ofc43@iDj(NKgv|x_O@6MAj zD`=s#PkvGmM41XR8}Iotxg!cBWM-4uH?p9!;Lf!TI;0fz`;eD=)4h&{-;Wn{W<0gJ zak}-oS#rSfp1j}gpVvadw#I^SagOLB>@{*4&(w@kq}lA`pvTjv2Eqwy^K+aL#F8?z z_R%^c;67n*jtK46yNJ^-X{{D?`;L$?V%h;3M}cvf#V`Qj_I148r%`+C=h93CSd7Jo zSS|Hudp**HU)(+xz0hAauq2Z3eRqC-zBn|69FgXCvuncb*3w^adywY`aRFLd<|W)5 zvFAIo)Ds00Qd1j8G73ig-`%xF)t%1L?+DE3wPj>sp**T1f{8ZvEhr3KirXtA)~2ozUCV|G+87MQh4x&wpAN@ zy)%t#m0uZO57O9~GiMsiMZW-0wgc)Wgu={O8XkbMeEr0ZwD z_<=Lx6TX{14kMJKzRRA%v84|TT&z(azvr4HB)@t7{8Yz`t5uXV{~u^-D?^4`0?GQ| zQ2-Upcu~O;@hie;(WlphGDjh~#Nv!yJDdZyOH-3QcdHwODk~gSbIW|~@aH8a z?bZglgVVTj))xEo;xw4;*=?z-A2~QIm;PIzyUTeYs^t6iM5_8MnaplmPTi58(vFLV zfqPcl4;CKfEC0p0b45i!R@{;dHuq9*3vuNynt1BM!o1w-Rd2xmElN|4QPPMurY-(t zb}#5lj3bDBZ%V z=10*hmxX$EA2C@+FP0OWUWm0#rp}E1-r4yrMb<}VM7sY5f|`0S!qU)rq{?MVVfg|v zqD&z6;i;c{$+|NhLN>fH6Fq`tRSdNk{N`_`niv}=iP;)S0^D9!EmhO}EG!!<{>>!x zv*TB2nW_?m=hvkN+9U;q!*tA#MX8$8$<@W`6 zk}onAlxNy@cz|%lMXGxk@f(%^bhjkK6vWoBM=b zFTQjpWTuKBOi@nI8~}|a^slj| z^&s5Y%VRm&2bjnIzQS2sTRRIcXyrz0&~qFf*6nZa?5JvLhObLdyd&VHl$5uBIyV$d z8bruj!Wfr(HTNT$>DrD{d{(Oi9`IaT6=y8d;;AxOi{@7rIM58t$CQ7|Q8s%)5M*L? z7E6G4G`{sCw8WJVr#Z666MNJHsnQWw+nxP46MMuP)sj>u z`)+EO@!aBkAz&kUP}7M7^h$SHc<^bXb)(I70nESYac3RENVzgWrL6vF2Gsw+=Yc z{$C@L8G5a%2YDvwnYuM&J31xAqdMNB0%yOaOp*&MhvHEvSjL+vuS7E;UWUyjpqE<*3Fz1sl`U z6lm=B^A3Z6px|*|M*U!xo4iYX_uw`1N5k@A4P1B5C9=Vc)K7HoI(#Txx=0Y+OoSDl zzSO}Eg9@B1#M#G`B)UZBfP)cDsQ>+Va-)jd19x|>T)Ombb=9fs zK%GD?7E1Y-2EfJCT{>YIhp>!R(r+&%M$YOfgwtd+FMfP0SaSksa5%x`2;?Ff-Q`;w z+8)@<*mqM37y*H9r?UsCvtMH$geKsL9>LRdSWi=>-8dAc<&5(w02u{~J={w@*$Yqc zUd$~@ETixd)*m(eN5tC7-kBA2k=rrrW_<4W=kNpjJp_`#;bMFpk+!ErLS)0=`2LDv zoR9xp!G1sUjRn>`V?paN@1=sco$c)gv77=ObWKf7tcgYX0P&5z%Sr*2VovU;NhbO4 z2GHg&vF>6SJpQ4@(EK$fTz30cH4w~CMxW0ka^!`Px6Jn}xy}jh0KF-KGzl$$19R4c zUrKLVCeNT8%LhuTsxH|sXbboaixMWS1_!xeZohEn{dIDk^#^yO(9(v$n1k)olcWL7tQkJb$hkA63j0 zK}<&5*C$OriLdvf<8_#X9NBIUx=01hOBlOgN1S^9dZNRi6T!LIVcKH(xx9Q%!HEOz-i8jxO$NAI4xUJI zR@`dz8PK5DFTlW>-xAg=cSA~QznJ6fSw!E3nC|DZv-ij9T)SMWXIqLkY6g!a{I&l` zweB>Y9I3Zme)63`?QFYM=?4)u?N6bJW#N&TSf9hRhR&{9&$U=+OJ#Pc8($gwA(;(9 zwiCs48S#!E9Q+A6#9D!<0v{v!$hzeBRBE^%;90s7s`>+It``jFhMRUEwOypL2xQs<7-7Lzft(!5OLn=`lW{FMMjx8s+b)Npl9?mS5(Kj2NUXwtJ^}ub zLR;k(7e>T8CtsqxeSARp64FhzGBX^wfzC~YxwaU`En@@%2ArM^(CBV{jh*>VQOl?C zAV$o6y}Zb8B?890%%ZIIQ$u35$m>-Oa!~5g7&f!H*#Unb`z1rS*ZvB`0-{RpL47-} z7D|P%xdN}dMD|3+dFDMs)RfPXe$L-?)}#69faAFU6NjD(1AcU_uB%_Qdd;pWh}OM> zH*MZ59hjC{g&M@pNLrQZpo4W5lOgA%{#%+AX3m)r(a%r4ZsZXe^SEtOYDAj&$^>&B z>&b3gfVhmzp+;0iwQ=DFP0g~m>>Jv7FVn5o{mt>Hd$ft`Kh`32wKPt_*%jw2PcOp-wUKw(aECnhHDOl!*Ui=JzljZk9Y zJ^U(v_>~y?o)KvkW*V(%Zy~HLYf;?6-8HZnBNJ0(VPRqS=5_7YX<6Jc=&|n|28ixa z!cNdfS3f3K2yETFS9ye#2Q(wFNcXv+3R#$~aTV6@L!`&bmCN+rv>_E~P@!+;P}W8Z ztdQ8YKq0+vgDWYVv*1VAm=HEX#87U=VXbA_B0ue*cyA-F@i5V6t$s&=%u6^nRUdHC zN_=wP1lkyvU7D#svKWQ*7f`LXREejLFNjz9vj!j3&HWpz13Uv8}DD;sMm?+qFQA7Qu`^8bU zm#)Ghl(c4>RvJvHw9i$sx|QhXcgpUJcKzt;T03u-9UTc{0mUoUS$F9(wk@rJ{za&9 z(K@+OOz$4U3M|@kMXerM!N@;i1&)0e$pbSq>U(#T>o35 zD5ANpYtp{;r@~|fcXnzIAO3?dTCry>yJSc!^z=XS@r>w=!*btDiB!jtNR8~c2cGu! z-V@U%(T`rc&~x8poY?XK;VlxKY2oibZa({?WyVJ`tFh74alCFX<*XVB;&-=HE%~XJ zmO5iHE4#~sayE6|SA6XJrkE$5_V44DgfG3GG+E(zhUVGwehdzV+j|;c>xBc(?cXJP|IuHF zFkCe_$Y6I~o`T0?SMJTl)3>Gof|J>DvR=1;LuPOsKMxcbfBs^n%Jj)Q>gm};=W)Ny zAL0S+6)VJ*2mOTN9Ois9EKp6d_Jq<;Y)AZB>Z9;~tAhBFdad$pZSWCN z&hTA2@c({{{jng?GpWf757IV?9MPVu>!g?lOV`n&R4wMNqq?apYgN9`n7-@I0z)Z& z;dA(&PT;b!5%}%xZ(qJVTNgRHi3GOj+6ppA8}s@@#JnzHUBZ$Y;+@D0Vf~Lj3NSoj z{Pa&yYD#MAN%dyR2yO+$|6ki1wv~?nz#d=k2<($8`t!#O#&XVyderX`i({6$AQd~B zU&%g$xDtvWnpevbl|_ejp-^|D)s*@D_i(0y#vVhK4AD5tsi@+~cA}TIrs0KA%1}+(0vIxaj%e5X^;B9fVb5@7ca=NVs|P~oxVql9KtQL|tyGK%x}}87Y`ZRb z3hNUazI(Xfh6$6H#A=xj8r^zas-Y-0Xv>G_{t3?AX@$Ake3O)nsmKY{ZcBX!PJ{i= zEWpI^%Ea-OHRNp*7EV=?%iq=CPMKc=>u)1!@IJV5mI-) z9!HaO>z2?Qk_Q{>F)ux46+-RwzHX%P>{S;AiIhiNLV>@;hMF+W4p0Z!hyU2lNYr~qu(WlfTk6~MRb%)c4?mz9% z5L9F)m>CD!=ng1!;xFC}X#usYp~iWlVMKjcP*4zEZEUiC*^{0FeS(R5kgy$Gv)3?8 zt#p|!SNGHGF+0VNz-c%?HsVxUkgZMo??mD0v?j2mI~5IQdyeXdrmx)QekJ=B{EcxV zFbYmU3*h~e=a`zVFRYa_a1^d(4(+_SL?kY>ys}cC&+_EdGYv(=>9qH@q3^yid-ox~ za%}44Wv2TFz^>8@)^GKYt7huV10WlpyXbKU0wZdrX=@249$}iBv3#fJ3qRJT;Dn%R zB~!o@VA+k+R0s_h5;iVT1vo<%LVn2vGNz^z9P(KpEXoL~3n@u*nr%bEWa!w~6}vj` z8)Qy!{%;hp>xO$gCBp3@;SpTidewTW;WQSzW8vxO8jw2}8h2Yvmwy#cMR8sEq}hs= zLSjqqUtQcaJ9yO*$dk#wMq&%cJQeprX!aN^eBe*Qhd?L**8FarerjS(MI+k&IddEN zRY=)Ttd*F-`0>uy3-X7e5x?U=aOQ!oV+%e*gv4b_lpE`KHe65iobZENU1T{sfap#Q}$YOZCQJPM}k2+|@aoUXHeU*|CA zDhY#Z#jH5ynH;023bR=Tyuo;y*Xl&0>Gtx_)ZQUdWu=8I;-}ZwYbNV&0yHgX5Zz|r zB7e0!WJ0Cr@)CZ9%QqjnXE(at(pNWHU7!Lh$G&)`R8<=VeZ17d`Nyo>J zwYW=_Q4?qld9dx zw?aG@&uJ17(Dv}~@C}kwubxd7mRjb5^G*Pg9ORrjasmV0;q_)?V(U$4v?7+%KW6 z6^=y)kQRobZ4V^kG=doA9VR~a55?$!7YIPHd~Nuq4)*tKIE&YGM17*Ta|+s34$-{| z_PAb-wCeA)8OyOtv$VEb)znC^!0y{Tdx~ z3O?UjRP`1c`-c~anhpeT)`3X&0Bt{w9(5qj_bE>64zI33b!raa!2?~Mi!7qHrhdZu zmlIw{#EQ4v@Rx01h`5b67|1uIT{L7@k0LJS$L+7e@x~_woM)cV-+~9}qg3-0NAofd z*2xvrM1&$jLPC~n7eD36LCfJxxZS7AUG^KyCz!r#zjG`PF^%HZjSUTQaA2ayHlO3= zd8d@b4vU7QK4V1M1KcAJIh_HTYy{ZWdX?KU=48!Mm>VGU zv9JKo5#3fW_1E07Ws#5m z{ZJ?8^N0SPx!KueP2Wk{fcmPc-FGSn&@LTBX0VhiG;N7eT>fYw+Eg)!!9kk=H1TVF zyFV1{j|lCqIWcb*MECN)$CYV)D8}%_iW=dvS-?_hMyPp*Rdm2(15=`vZ53jPmU;i zn>F+wN!p5Ts`pGwAsx-wr}8K%abK7H|8PG~lvVPQm&RQ$Lfrm(w$+}qLu6Y(FdC?`!k`a=xgy@C9u zB52KYk1P8XzjCoX&T+z93?Qcywu9v z!-xCvWiWXhOCSmf{MbDiV2(2T^XaYGZ$(wIB+|i8t*5*!HeF)2Q69!A^*7_RFOCm4tZ?>+*v3Te)`|VzPvRk^D*E7Cx>E8X&I4q3I z#uD_npZ8#PvmCgHc#dDL?msT1Gv;7OHCJx+El{^aiJbgDl6+BZ7X`2Nx28!Apd#NyR2{vpX|HIKf%Z_+&m3gg_92=vMtNn!1a59Ipc@Ra3|m>W-5> z5iy#W>-#@Q{-u*o!s`3j1Lis8y?(wmam&)-oA)87dwCPi2gWvN2WEbo13B5yz~G%u zuFJKUrnBO)mK`{g?UK=f0wYz-()E)oh13y)Z`zdhmoHDEGr^`#KzJcQyVBgHgU$1B5P%wER(5vf3m=LcFxr(O z>Y&I;eQ%`?F6)$}dNiM%gq;bayVZ#}_#Nmc_&o8m2a>Tcw-ap~8~3_i)Fh7TJuIU! z&X)Dv4?l+Z{_T$5MWsYO)K-B|Bz_4~DSy!Iu*5&-zH6~# zGJ4t)fq`$smjKxmNEb~e3D@)9EzioTsq?8%(TU$6!(m2_kOs*&gZsmp57M)u7S&Q| z6Q)h#5QPVwliwtZ3Gme_r9U{pZg7(qzW(vKwc5K^gAoY+z-j5?q66$5yYbw9+7WVc za!rxsbWEwmwTEpThTQASG(()+)e)WV0-xg8C_`jsJ}+QO?QPvqXG?vTlChlk3=tP- zSEj*XIGp@aIr=pS%#q-%?f&$>90H1-3I^T}POKg4FBHo;+Nv7p41v-JN&WHeWL=fh z`0*dWH4ZEom-XZ-c37aXx_P87Jy~!(eOiP4{Q637otF_u~I#`p2jo?@qL| zTn+#&?_<5Bb9(qKfXXD-NPGK^7CfZq{r2ZOiZ2-rikw&feGAmeukYQOYdYRvn5`J7 zw7>3Yz{BlCAD4dB(usT$SM?DTI5rg}0DWd2NiYRi@EP+=&8nR29RnFg$+=s+<4yMK z^-;U`l}WC(tc+o8se~?d54AaU7Dgt%A${^vA#FImk7lQ3W;NzOiwiok_x$|)2jR95;>wBcnex}}^X z^PR3L9`X>@VJc8ZFhk@Tz|Pc6MlaL>5X~;{j75D)$(In|E0`6x*bOq$sE(J z=8R8m!cthXg%YcjN5@l=WK8%`P=L{g_c z$cdK4nPAWS-0>PSh{i_w2ss(~zXi!w$RJGDh|h_Z|HKunQPk^qypfsd`~7J~x#-MX zy|%jaS4BRYHqbDtN}eHQyy)<0yia?AL!F?X?aaLB1f8iSDl_M+`A_AO!wnTl1%-o` zL64zr0nO6a*Js3aibS{b9TM1^lC~Y6A}pHzf``7_w(UZl!I9xgCDCt=#;!E;5@O`7I#foC%;Rf+|2voJ4TVOc+@+mKA(a>aq~} z2xBJN`OPlzUMZXeowyEJI0}leN!O#C{CMt{*b4B6Z-*Tkj^N{~8i7~3l#_MD#=Wc- z(Y02WsQQ&jVAsKbAx61f?b{V9rAv?X2Yz#ahQCSY!nvC5ru!FxTvOz2qW(thO3GUN z#alM=j?nvs{{0t(3og{z))scyGkzGg2tN4ZwZqbg5l-&gd|NO=A_S~eE>VN$+*`AhIiCL_c7Zh}G*Y!*t=YRLEPIBB& zuueSq`}@otZw~&lYn?zPIqdL}A~ToZ0^lioXOP0Bxo2X6dwlP^C*U0_-(hb`0WebM zqkuBT7L5AQ(Zt=_YR?Q+S8qvl4t@T?fK2jvzYCA}6TR9AxH-c$mN+@Vv1%@p?tQ->mQ z#4{f5lsQMEbs0AzVl$Lx0zafMG`41AVI2mM9i5Coi=>yA35eB9Otwy+J_~7XDm|)k z<|?`8ql>GVclYl|?bA03p3xh#y-&9n^^Lu!&mn&RC6x4zao-ONKCviwx~$%I8~OE@ z6>6GhTWMmo{cGv8VW5wlY252^I_?7WWcj9S#@&ypRo?~)rk&t@cgGRvMc_tNU>45=ZCG<>KLlU9>iqfM-zf|~b97mK{V*o&H zweZ^vqQ+D3+eYgx4pgCaDWv{=Gk>zbI6 ziqFd!#-!b+zDeUb3|0#FJaUHYFEos8kt*#GD4+bm^ zIv&+#9@O5RajpHcQzG;d)LcpITt}}7BkQD>4j?_-@H;sepM|+atSSL-2913ka$Yw0 zj^c@3@e92TB;`|6>F}#*8c}rR6LBFeknt@PKGmUFd}*x_BHf?4vMXk#HoqkgAcNS+ zD%A;!Cq}WQ_USC%_(Ow3yWc5y)O{lGsA=XN${FClDiI&c;u0Z=#01EQXzC~T1|DxT zxx&{32syr)lm)R5_QG1tCYA@kG5#{KyhCi{6N`%T40wd=RF z+I26UyO?_{ou+G1;El8$ZHaBe@qPN0fSo#|#Zid0@b|!589sft^|dP?9Zfq! z|L!=@8vpw|Be6|k0Q)xoflv2d`+RNpNyNS4!M7b8frpvOyUkRM?_suJc$6elh)=^U zfdXbbmT-?kw24M4`4L)C^%MS=sMHfeJq~ zobJ@P7qc@ScoH+avA0&U26Kg=bORl01wHRSBbjtMgQTks#SJ7qcb>JmcV$suhcDD}e zuAF;$RR}$g5z;KuorE@IGvmy6NE^_Qz?A6&e4a- ziq9TxSTz$U4*blyRt&n))n`1{qWw4>13Fwj3@*GzPg9u4Ct5dtunXLf2~0q;t?V7H z1!)RDN5mzlgGV4wlXpZ>Z=seS8J~N2#XQOGDj}B(y7DkhO#@XheV7xYyx$JfMSR^s zthYj*)_I`n6atxY1@wm|Wj`i66v@RRX0EWZhRtW z`{Rf0^PFEooszwZtsTnS;_hPOjMA&4J&k8*m>lQvxw%6xYE^IEVmbG`C)JRRu9{q^ z@^W_UK|#}g!3i?qt0VOLL3Jg_w_in7Zrd(;(6BYv{{Xd@e2dGJ)c{l<@`lw z9KAoMFPo>#$u050e!@2(MO-7EohzSMQv^$B=Pr=?X>eg1-k>x_R7glM+0rlXu9;O{ z<<;wHjcmu*?1T(%t-4jYNmbP?f1Drc`bKb$uy@c!N%dWl{`rqgbDeX)-akYb(kG)Jfm4a=oxL{E zKKMk6^x0)?>Ub+*&9uG4<9{*75gf;>;WVD(Dv&dRFmD#L6|*2+ora|EFGz>}uKsOZ z94Zh0`0;`e+T7dQ`w`o`qy)YqZhg&=3^#YHmK2ysh_qtBmtbumXey{QqBMVu=VHl) z!sxCMr^9xq`mM(SGmnp9W{1I;%Hm%S5Ivi_2-8#y>Bo{Wh^&H!t=b_~uL%TSvry?y z!Q+6~W2UcL&Xv3O?+D=A?-@$yg5t(+cEt_t>+9>*qx(6i1L=jHtClqvV98s#9qS(1 zEb&bI_;N2Pv#St%asB9^^|gD0ldCp?O|#_PD3^l>M`@N+*X0slhJX$h>CiUGd1LU-whw3kmRK@|#Zo~lw9 z>IR*IDI`{WxPLKwXBbV%q1>%7wnhoCT<7%2NuiF~wLjwMvOkUf3e_X7WXK;J2z?`+ z=M69rF8yO9u7Jqkv6DlM*e%Zp8IS$m6%JxV^P3=4!)%oCR$ZrUTE}9a)>2X*&TyF&Au>Mw zPx?mgX+8_OOlZU)wyE34oF-1}TTnzq+vCfJsWCOvhAyeGM%{at43-a|>-lE4jbC{! z6J}==FI1$|8i`0sNc0KmhTE5M0$bq_j_N;aN2T;{&7s7#do$^hUG|o7=aIx{e79ZZ zOB_Y1%Yxc(z|*C}B!FePHrjUt&$zr@BOLh4L%Ww|B(Y&>?xf`zSwCbqiu>SV>pRAU zl|E|ZsO8^@hQ`@@+z?z$@Hj5+p_nx;OIUiZ)80yEbt+{|kSOn|< z8b-sxommT9j1II$q>+RpZa0JDN8__%&$_XawOApNNK&yr>rYP~e}D7wjlBDO=5o`? zvFAC`XI-xcWrnJ5RvK7YSv}Lp3AWM~X6ujQ)sLN?whGws46IJCB!@u`sfh0x`fbXy z2(a*EXB-bOXx{>GCx&L-!n4^fICod%vsR8V*Td)Qk=e3Ww{hu^c|8$3O zeF4a#*)X+F`C%dh8~^PL_&?o`DT+&jY_SXaH~6?|uR@^gOsi=R{lV^XDDJZ}fAC)DqnJ0&v$GQSLEbhodco82K~;fTc4>u75bT*o3-!SSi! zsuk9iJ|Qw9Oo!%6gl1jt)hRjf{m&NFo-K^6<;Q5wfFhnWbN}~yWuM*EznN&)vD~Z6 zu#5brcsS6d$E&G~gr9mZ!&%f*rN;dh;zU(XE%fM{cUqU5zhEgeaBFgMx z0j2}M;`~d_scS(UK?w_~|9gf_{!{P1432zgcRCuR!`w+kQRox^sKQA)Oblz1m6R+m z|HZxa0U3IGxb1Wzoh-UzeY4z3f5f?!0%lLl435R9bx2G8(UeGr{|IzYqgvNz(E5{X zzRmU9Fz6(N<^IbE%j>Z3H0zmvszn6WCfz*T{*ulP&jL{KebeeQQ9u67-V-#$eNteq z9|)tb*9kjkA(=BU-y7-*7M4frhN>J4Hx>fOq~CoX_1oxKptx)uB#BCRdyA8sR-?`| zGJ;n|!|l%B@wrdxUq&lJUYn0eYCnS_HnRzwTFhaK=wZwE>V_o;8GZ_lLk06kU)&;1 zj;Bp#pil6q_U9H*@JHN!-Ru$e^mTY#Ak?l9-3mR{tH%CY{kH;dIN`|PXb&AtT~&XL zOGBfT^SrL&;$n=9y8#PTnvlkbqk&5gd0oaCTo0T;y@Gya=l#vOR-_R32-yFX*?8Ch z$0=`mdV23lIHdy<6O)!3Rh7erVbhjj{brx`qsHm)Z1Qdqkc!TwzHp3|k>Y}ryI66% zleYxVuPNc>RrMAD$Qj~q#bxo}Z{hGy+94m{Kt3cHc@q8`%A*HM|cgL$>kdHp=%J^L0Q9t)MKEfC&w zC!^OE%X`;dY`X@AQ_Aonk%C+{^i@v9*n<$1pV*zejq87Y$T33yJ@*5x(n7EWDzbv%Ma1p}P=@Gd)?{$--J4iS zGJY=;5_>}6R!QemERc-u$$R*Nr5R=Y3Z@VsXGReQ(%!##?ye92s)>tdC>_mQ3gS|> z?5NqoQkMTUoDH+bKi-Mh;Sd0%n{33RIx{4^VzTu+6jhY0vM88+HoRZmmeO+Mxu==- z5`@Nx5iNN>&xU_Il$wcm`-PKb(74EiGoA2~ zK{Wm{t}LG4g`TV2+(;U)UiP5lD9}z%qos*1Nk8Ml&phDl$+FCpL1HxN34!%AqZ`7|yfA{){uUSFwqp|SEyYMS>cBAF6+Nt!pt zbW&pj$?PNdl!-#D^n-CVMG5iKr5g2w%AU^Nisn$cb$tcpV5)!HH#_1qm@j|$Yc181 zq`L=@(`64Es>>lEJ@sVqYo7KZWN_;LOZI@$yC`Fyn01#Id38 zCFFx*Z}JGz(44748LWB7o-;TJF?ys#pVufaGJi7O-~TX0{CVykr)thmRFwm3#~DA| z>{%ZNzaO;~lcC0txDy+ORD=cK@5Z?wbrRaDbf31-Wot|Fr;@C1jq@Oach`%&5^Y|Js%I_mpqQ1EodcM zoF8Hn6u85L8^E>xnHVOv=HC$z_!A*pWzj+T*{Bw>BnHjDB&!m!Um_qaO@_iP!Yz|R z=#Bme-_cx}GD6 z7)xt&k7k&aP`9^JKJVw^h*}X5I`gvg`Qw@yTp_*Hp4y7g#{JDb57TQ{1Z}ilC+q7@k1E+cvqYCpc#M|m z8_u7rcC*WZWTc9`;9=5L!nfKA$_u_ntKlj)lr#68UY{`iDUCk4!7agy`0F7rm#Z^o zsj)RJZq5fW>gVbe3M>NXH5>jkWkS((J+BXCdGU)}fW7@IgQE72_ugxovC5JtzMkQx zVNynRxb!vff$^iIC8u0Zv&{PoQ&rs{4$tcsFf_+96}}jHD95h6h@l^K+me+ z@#^(55j*~^{DwQ~M45;S8lz^oLqN!7Z8%;(s~4N~dG0)xXQ5`i@wd&TG`OZpb3&H2$(_ZaR;Ye{j^xW^yI`fU+Q>pTBk)pgHSd|rPijt1mU&6UF`ENHffP5? zUvX%vp-bvBcYMTPr|HbXc>yiuY?RCxXC6zCHmWHXdH3Ygcc)_rQ-#K*$-8sz!YEAe zmAB*8fn^TquC+Hrk{55=las^M^v-V ziUTFrKIJ5tSokODFO;x)laqh-P^J+2ou1IP`f9Alp>+d{t!=4tF!o)Nx_c341z)+< zU{#R&$_+5R=E}NADk=KOZ(FL%%)Dfmg|P1j1JjQ>3|~=(av;Woff=kyKChotUcW9` zGgMXl9(nzk)7Pi3I7l?PbNc>M6000MGi)}%A1_c+^AYyyGza$SV>h?g48~r;lp|-} z5N0e+nbR<_BAe4E6aT)8-Q{;sPKeT!tD}u(1EqpI@$0_04k~?jVf{8O@q>kGr$K%! z@cSix$i!_tM>7c;Dc-Cgzd(-s!v3|ye}&JhlQp9&Ie9*H{Z+^zj!)OFNnN<;TU?{v7mCC5MW^z>*Vpab zkN>~@0_9}FOc>6u8if*nrk(M;2y!N5!yNJ3+a}TsNGW~D@~7W5i5y$^G))!u?lIY> zK=ul7%z8l7nOY^6y~b1XY;JrR-gwUG^o{Sa$$W@-qW8}Ps0=rq@M{Qb8tpuXCt;oL z2#`Nmjs3bC8F>bp9}2d&Y(`#USf)yE@x#mJA{#AG${GJfMZ@L84pP)@w>frSbjla&Q=bi{ae4lgDlFuSuik(*SpxoVQ+o536 z8y$9)r1o7NSAS|y;;j~cIb;^=H8|Aq4Wxn0kFMGZN~rkZ_zV(`~2@2uBg zawyMtxOC2Lz}(dgAM8q{DbGKsF)ggE^M5&bM@g)f*Szgh7&g#W-w#LjQ?nUqFIgBd zm-VZmFP*P^*>Vo9Q_Hw_uuyJR=1SA{0j$6J+zDq ze<@=rv4Tix<&$vw=H~_l+g8qv;8=dK^ZY$&k8vFMpRJk#RXSogU=D7{Et$X8YwV9! z)Vce7kr+u{#S07iyo#TsM!WR-`JE1_8;GlexnWQmE5bZYOKby59IFo1r{>BXIN&Y-d#G5k>CDxXb6*;YPzmjjZJJ(5Q5Z zNOahJmt^~f_Y0oCTkSFV;1@<({Y9f<Ydmwpozmp(0EI) zSJcNRN34!m9fDhUO>MD{)n0t%u6^{AgulFHDI1`h;Iz6X?xuz(*21M#|n7Jzlt@?2N^M2`*>*pCpox z;2Gf^pMTkH0B;(DE{q56ZFKA6|fr*B(~AZ(>mv=nc=BOoRx z*R|2Ba$6&Sb(aNeq)YdrbLP}YtnHj7IHQ4nmRox4vZRMXR}Sl1HVMVg+UK$~K?y5F z*0)ikP~lJ19~!Y)nSGQ8c2y^>Nu_LJg%;SWz4o5J^qWk5iQ^wYS7B@4`L~u1(ziX`ODJos7oiE?i!ivtLp`{c1^_XSK4J!FHyHWX9s*TCuL#3 zs*nB*SNcPu;E6@y!bJ#457gvQ2f@THWWTQF_991{$^O_%*O*W2jNv;gBfMyw@bZSr zF+GX4N@+P?pkrIH+Ebsw@HSz zqq$57Cd~aHL{4_49Yb-`vHZhgMg7ecB_!@Y~1qc8U0i5 z&VD=zuS}*&T1a>Shd(Ir>Tdk!V0vA$J~FDEQTEJ!BY5#@=LI!o{6b5qj}dOCVX~QC zH^`V%A7`Q`L8B-c#Liz% z6FO5C3c2N;S7E}xF7_S!PMpUo)f_QC*Uc{3o}AAkJ~k$k4*7nLln{WNG9gXk8WvB( zF^2Lt_tn4rx5VFQ8tWc-Zz+a}{<=uO>gha)2^4tAvUrV;%v^uq|C#Omt+(IGIN7ir z&dKJ&kL5l_SRxJIPHY(omFo3ELQb_*$`i(7IaA{0f%+?5F08=f4~cT`PIL)(3(_*> zSpCmVr#raj9bRl)|Hh9rinWWr?Tm6Gs42M-$~lXLrk-O9jP$e1+4^LC14FwE;Qxj>2WLB2?W}LLptMBOr^4-`^5~mvvb}Bz2U0()R;&_EVs^FF8YdcCVw(| z>kvOslz>Hz1H2Sm57G67(;rWkK=Ji-E_XZ|5+6g+Ldk$%AB<$q1!2$Y?auhIr4WwM zOL%0t_q`GOrzc8)R6}HJeYlR-v`f`}{yPZt5AY}0e%a#St&*N&wF6C;79>`8f+$#D zd6@)VbY`x8+$xS0#}cDdaK}xKM(Q(+**xj1e{C`T)qi{Q?`YECzb(WXj!iqeyRzVi ze!ah)04d(JAYx?s2Sh)ty#}igDNOHXaq`-aWtBd_qEQcn7o4lrM?+Y|y8jNmtPifU zv{S0Wlff=~x$!SwnaOuy4ToF_if_4@BO85PjQEPlfv+v(U^~8J8|=Wrvjt{Q*NI7nPnG`EdafM&JlD&<*(9R_M{z&tYu0Zc*g!zEzMNb|M2}UYx{h< zz+a2_zqvJ;(9E5}kImLe5A`dExW@{wIl3GD*$VhR?;?mb5|u-~lk!jP{`{u^r&}o= zellaeaKQo#;T+Bi(J`xx1^8Oc)3+c)J9>puzFd8!@n?gtpI*5+;m<@da$Y}XVq0)%v?#r6cGRS_l^$~EMs315`c=x2JiRC(e)_nn z)2J`a;^}Lk68M9rYWnll-ROrb4dj9sQJO3y!notDqkTIb@jI$oAef$s)+3dcr>g&Q zKUO&uQ$BN`f9oQ5*XaTGGh^#%facY}7aaxTA(~nFIIEzz-()B{ltax;I>||4&G0dw znw9O{!Wjv+zTP)-SK7yrf-A2O-oop@&-mlZc)LS12U;x|Ci4 zzPNT#NC?5nT|uW7jgq~Lc{~q1fp4fE zksi|MIfG>LmaA8nT&IihOG%3H#ozu4W&gIY*&eN@Z)IXkWK6Kk1BG8{R*2i3k~ojg zK!x?l;q*T%i*xF?Xm6hSX-RZJ3wujLCC6L(H|Y-Ebq+aCpaX4vWlW3c+4gBB;H&(9 z^FVR&pG6^?nBYJn<8R0dAdPlQ*|2l(eCpbt!FcBDEl>U1LflKIn=72?FVvoD z;SKU40-6yRkHO|5V)3D*01~nI8azdckzRSYE5oHksKCl_%#0Ll*8YCxya8q@;JdQ!0+sd`7L{4nb({d^H!} z%=RtkSoXE``&|o`b=~~;vyiM$cw~(8giR)eK2GFxrzqBAmVHvYHO3@G3i&nTH^gex zI<-cM3>A(W<2Q-U$V+!l{`xK@F5dj@8!3$5I&X0h3^+ORU3RD6MHQI!*DA?4)kUX= zc&R_e#qjrl?ySL%Zk5v1O*nc^3vPH$;chv}A;A@sG7Ak$NcA`E~!^Y7Jf5)6PkCi zr8=g})$Ho(Urzm?^BOU;F_a@4-bPMTbb4(^A}+ce($0fJRF^qjS!KiOEZ2+<`uGl??^GFyqj^ktrd;TOqycE>o?Agw|Fm;o)L#v;K_n)3h)JnTA+!s?)Uq2ERve|(0 z#;$=cVDdQqxqEN1Y^66iO~JmVT%T~c3JGcRPp;jiTn_c~caJ75Qq!s~I=k9XT&kb17>GGcgRMU8qfTBPx-{S8C&)Wq~lVyB5 zWV7k(5@^twPBW^J7Sg_@{-AqbS9VMN_>2OXz z8=c>PM6zhTRz@f@#>#{|pr8kG&s>Oa@a^mnx40XpYv_2KMpdkVlG}*osAfegGf6O^E(^cM8W^_#xR!F)WszZ?(K*x9j&=3z=1|S z6RGgk=fhTBJm~OG*|t{dz7k+$_9b&p*u0FMPfR~sNmjg>s$gZj>#hi0ti7d}tBdl!yz9ro1N5eM%Fu_9%+kQF8v3Ez}xrka%+hKnJ} z9jLFFYBXR4w0Z&kIT7r^V>YuiSZeBY`Xv z`6>!)efjtzBo)u2pm?DX|5T$Nl|}5c@nfaON48*aH`&tNZs$UR+8RTSuOzF+Z(nZ~ zZfkvkm4@Egpq+$5sPLh#jZPKlI6nMk1X35g&AP6EpY1r=@!p zX2sLJGo}7&uB`wijQU=|FkIEs*+~L3$Q1xNv;YhXI`>7o3m;E$Ov%B`%}Wd-Mp)>8 zTG~@N66FeF93si_k(Zxf0Q#CK&xg6Jxi^mU(l?~veKQa<{aoY~onDGA$h_8YBP!x* z+4Q|JQ{IahGYLg~VYDkG=N$Z2rjxRiQ5vClKf*1-XF*4VG~uDwg>y=UIK~a24g~-N zuE33f+dOD7+n>Lq+x%-V>$+tbdX|jHo{ZzaL^Luh=bN-B;GL_<=z+F z9W&-|AHa*O&?iX9(`)v3meHr#_-QG|YJmTS$SyeIO4+yrALef_cDLz$$%fW6R7;}- zi`RW!a(;4V_QFV)BSF)gaRv*GA&m!zGVr#rUv^hiNZxTvvP)`^OGWn?Vx{@C=R{HE}s(TlcX z=4EW|BRGQpd?j~SlPDtXqHPq(6jj%WqL(S;DFp=u!4j7|+e0deffCUHq=1yPG;=Gf zygZFIh0hN|f_pk!rZ&8xT$BYgn+c5{9#jk&O=lL8(Qs@1siE3-8KSmv*q(jlGhK8d zMzyWhtZ|nQE3Otk_i%zr<8Wu{ad}me3Oqjec66ocR}RxQ{ruKEJ!=M`dndTdp_Sga zFzg%Dv>E`G+1h>_`u#&;>_8lG%J)Orw2LB`?eVR5d>~sy7`Eqo! zj?5I7u6PeX4&dpXc;SUi-P32n6p}-USym6}?bPn22|bs&vd-)*$aYD<2*?m%Q(#La z<>~dL8~XoXXJN5;^5g|5sjRURO5-s|^ALeFK@@qFVFdq>X*lU2uQ;;Pz3hGzsTa?_a0K_#30J^G@YIRFHqqm{hYCwW^#)_E%uKF#P zD)uh>E?;2ofnF!#=DRY{U##*AbRT{YK7Y`9-8#jTUwAa;vP$b<0Ohh9A}pS4|aM5*Zf6a!?QU)RsCiPy(B%m z`-~Mw%RbA!hIdv@%ICOGBD$+S7$6{3>CFE0ehq`s~RS?8@M+>(1&%_3dN zu@|&+3HQMt*Uy{}gLSa&6*3KAJ)q^GL*3t)m%=@Xyg*`cI8qN$=2IG2Xx8}A0cT-q z%2K9kx(9dg?=}%l90_vta>ukQ0`s5JSTBlMs5<6KvFlCgiHA~YNrnCAOpA#q|0 z&sjw*W9GSCB{Rel_$O&H$%;@pf&~FGBHp_5268iu}5d2kQ@Xpls8NqydtT&uqusB zD6~SWw;||M1o_2#y=DoYRapnhIQVMB*!qsppY2;bJFhc`rA+Ks=hmpOc4YswLC%6m z@=O1J+kuaS=%K3)7eW(6$E4Zuba-wwfM5ThTL28Y=dW&Jk1+=UNHoSnj=99Y`5LO- zSP``8BoT4`HBAbcx`|AlPdG}ShO!6kYH&Nd#4r|R!gVT5fQQ-Tj`CtLyY{AU3AKCF97Fu$q6_AC_;T6Bis@WOR!AK^Hy7x}7_c7K;L=u8OH1Ch z*6NcH2sMz0{9f2yM%HL5NWoEMfqXimE@48~P%1Q#!XyzN*B> zf0#3uMr>^5Dz>2}Q0{i2L6Nkb8p{8}tu#V$nAX#7P&K=h3|MR}kaf}k0l;VA^v>ksp$m(f6RzTGKclq6GJs|Hv`T;`V zq~VxLsj+^_w*gp^o?U<+E?7h80Go5a5Ov6_QA$6u>e-hO2y(BU3*#2_tqsQ%fm;6i zX>RHMPY(M_Sw#sxj$0|-Z;2dnt!c-oup(d6GBThf4JTqc4tG8Y^@1MZX}l$t|3kup z6o%34O4k{TsQemPz`Q(&dAS{>bG{kyZ^~K^7O>i3miCifQztgECcWR0{W2k9C#jLX z-(U>Hf4GKeILVxlkQaoB=I{l1dFPp&>~a%ZT=wb0Sw;=5UA#$s*ZAnmEiX~(6PNJS zF|Kwk>?4$3i|_lNHka(=>e>2!Szjh4^qfxdeE7i_`LWxQ$z3>a6_UNX+8sx35@mcx zHUc6XQO`|0b2)x7)(S7OZ+=#-l2=FRa!51_1(tg?I#-6$@rRg_5{#S|)-IixS2>)8 z^PJr^Te<3scnZ-yYC91O#`SKi;wbUYZ#F%H00nJq$Hz;;zNb6-K2LlK&?=_DFZq%?cYEJ_2ZnaMV$u{N zO-D!9lc#4!^;ZpDUXLV|dU|@Os-+An_ITEfW5suP;g_>jl{07ILWs3v8^g~Ow3kd& z>8ISY1P_j0Y@R0C+&^znOQe|=2KpKYUfcNK6PuN1*p5c|qb$n|pI^^wnaWjAyhujt z(cL-i3S=r6a44n}PXYv=e- z;u)YJ-@lkRS0tzk4yAq#qWOJGnzu^b%u)DlSGLf z)J&I=D5@S`sx=@!YAuYi!5)9!dMwRcgR6DtttQB)U)Fs6M;t%q46XoR(et}v@5U6z3 zQhmVd?7r-7O=CzSf60&e=}#)ZK?PFf05p%`<31;4s{MaQikZDKWPRl% z(k;e1`mYLSsL}=h=|OG^Y1?du?`OI8Ou|TuvB6}*A#Fo#t)DM+$T586zb8z{ zieF7*e#bwE!cU~9N4KEg`ij~;&1KnJ8`CGlzT^fRogn#zSld$^`kBl}fQlJ@xXX*j z=J>?N4e~SMsm;7^x|O6oBPSbab>d$D55kzfXC0`E1}usox9kpgqIl*X;No zWu~v0Q7s>@y(MBfeyXCV^vgy{2Ul!ajvZ@X1CjQ1wOS z>51a6;PBNGw;r!MVx*%d#iXU5Ps;W@Dt%X#zol~HpqvY;k?hIAgpUzuPTsCRx&AAs z@`B+qPHM*cVP!&sLaTeXCbZP|QzVc;xKOR`tlQdq_A`dyvErwi=13E^YJpMF5>BOm zqN{v1Fmj3+^h3@kJ|@M3bXMZ^-6>sNTA&EZCmdhs3FCcRmmn1B-Ec5kL@~z_rC~F} zzxY6)qUg=R&Mux-oLU}qg(5ViKh?Oi>nu3g4=^*O!44k%fv%7oqB%J%M{$ja%-uBm ziUFNO@gOLAh)2R7|H={*az2B}A1o7k@zuPXbM(#2PirJ-)7+2e=PoV8JxJpHM9=$# zDQO2t7#qYQ=dteC$SSg{M6XUiXov*;WLLPP${u}C>&YHi)q2=y{La6?BuI3k>rG12 zZ(=3q*$r>-q@bqhDFtJFv=izs1x-(z`U1!DWEuN$_(sVNDP2;to|C^;8hK86N(>i)g<g z*nV7EEfWGU&oDV_H>JK#CFj`WO!J7JGUznyZ~d_yXgz5h>rGgGbIyHbq3Fz7W_nuM z1n2;O08upE0DVIp6}Yf&a1mWLkF)BHy^fJNFQJOC>S($Kj6%f63}WP)w|K~KJ5W8* z1pSeaI;m(TI28=?q08XwghWMUVjjRKp*6K3l9kyp;`RSv0B%WQ9sQV^HCu^uTIGy7 zJ8-csK@`Qekd)d4p;pq5gb+W7GEU=%y?6CU)C7fCl4jLeG>N=1VPl^}^AlB?s}ad3v5{fy49P4=&*S|8_0ZEyy!? zevUfm&=o7gDWO_H0AuxeeYKd+rUm6_x`kdo@o1PCW?gFP=*6qXQRv1!xhu5NS~3^m zh(}z07A?fHE}}wOFu9uX((uJ}(|47JKlXU9PHA<73yW*hiV;K+S92bL>$5vCvrjiK zWlX;+-Yp^2+v~~f#VDI-gBPcqd%9+xVZzxU2~!TK!bV-RH{q&L`#amvaYQ(0oMa^~ zBQr>A1o^=wN&e%e!w#kUFc}u`5n8K@A>YqG+CTe{lU-VQF|FhvGHp=SYZWj+c6&Le zDmltYDp$N0KLeFr;W_XBdrpdj2WH?8!7D*xzvax169t72YG#xv#C*XEY4~jKtqMl7 znpV>h_2VVxsF^`qh~WrCg!iJP@LIf(R-gT~KW}W?zxHr=I6^h{J~QBp91O0yo_BY` zN)NcfPb%}sZB$mT6*|asO58c!5_1_@4jxCJ3eRPSOR;WRtJNE>4i^miR8JA^%4d+j zI&+cy1b+?c8Esr2$ZY|kqxU4Xx&+i*s81*kH6~vSg|@%%YO&O(i{E5Lfdp=-{PAt{ z$gz;-ZwVN_Jv**sC%U@*!|8r*FQTI3?o*mMqb&0F2g-icx6Nc>77 zPv6fdZgU6)5-2!~HtHv9l%r*wnNiZz_ZkOx3k6ZPMkq1M1Oj<0$sV?lL zAH(4_axLHYlCSS|oKID;Euq<3j~)kA5|EVcmuHO}79NfMY$XtC{X(J`|Ia*5`5i*_ z|zR+2#>Cg+h=1WY#Y9R`*z(X%M{~*MjP?~Ee7b(G33%A zW$Zds$75?Q&`q2S857jPq1$918-#hUzi2g6$nX5=#T`DWNfvjBp{j*ZaHmUc2d^a+C+R^XT)}KreC3=<=aEDb8pH{pgn=hc< z^p|3eO3GAl#`7v$0*mG&9-y;5O}sD8(!|=AmlVdN3-O z+yBPtj*RL@^*E{@QF=Is5;>`T3EUCfxMY<3cIYblAiQ11r7mYh0#0DQ9{HD%NAj2C z4FD+sNdP9^Bs2zu zE#7(1Z3Kvpy=`@_dv}7nwsnQu|H^;QPv#{nYcWs?zbQ>PXVRWOV@==m_iQCNd0_dQDQCBd#y!wf^NQYWyD8Jd~cKL+$1j5+is#hOD)QYY-#ElRY z7{RL-Tqox4d;H&iQA{5&-w@Mo>;3q*bBDpy;{CnY7GIDAB8= z&b~=cx1&$@CF{*TG8?HfbnMdukuB#CT%A{)DD>;WfHF}kXjasn=(Kx zI3td!G7K0nQ`w01iK8M6;NkYau3ZAjs&x3=2F+H7YTyYqOEpR{+|bhTugKSL@Mm4+ zCz0@1A11Gzd0!c_R=5BL(^@JgBQHN(b(Sp4NaVf9uE<$Z#GSKhCEXzGVbFc!_%izNU*WT)rzO-RWNs1?vD_O$|@>;-!)?66R-mo;ZTy9m_@@NMhQvH`)ddItI?l9!a z*obP%bR1!}(iYYlIu=ldK^Im~B_VF;GDbEwhc2U_IzKx%w@X$3r@im~r}~ZmJ`qBa z)o`*tR>nym5g)QjI5g~R5;8-w_b!!jtPqJ)DcL#p7I8um$DUak$3C|EMc?n^{`LL? zZVx~5e!s8ldadgJk*sqZFKA3JbNn0N9sV5WcTMP^c#gJ?S&B2(t}h|4U*voLX8 zhL1m}^LBP-7{Cn#y;RDq8yqysU_E(oWB2H?C2+axw3w{zqbstxo0VN#nT71m#e%?I zVQ83pg^q24?4m=nQ1D^(7P|2Z(Kw+5_cC2Q1ut#K)1dli1DdO-d|at+M^0=Yj+HDn z?4(1!_*W0_kauc{`jF{oS!jyTbR4hZ6FhO5eilvB9{Ylx_Re^MC+~k(uUu(>;YEYt zY|W3yhcihK%2ZOxl(Yo=kh1`v)OL^en)evngP;>BqYiG*BuySV7@AIGd)O*NZb7Y} z3%Yj#pvN!js)27=TODE!6?Re@!XQ%LWfrf1-%CJ0PFeZL~MD0 zFZ@zT1f%$yQN$_Ham%lra7;pJKV5M<Ljj+N|+Fa z0NgPxuiF+ycV0`l!HaVxoV%0%NEz3{c+?7ZAJn`3q=E3O$+uBE)?}5zf4pC$#t%?ws(gu^N(gsc2 z<*DQg`25yMoD9VxzgGiUO!eQipF59ngr(>O1^g$o92c)kqdKO(Ne=@Am(oe&@$vDv z1@pEW%Yc$qq*Qlsb{iNFt|pq_T$Y0+c|yLD(RiXpc2@Kgmc;bsg`mCtkInq_-#|-l z`(K*Hd0lzR-^$d($8KZu4vUQpvnX_ed7Ed`s~2H%KTgb@CtIj6-@CFDu~ly&7Q`Nz z-ECWR#{$w7mL!;Zt^@QK=hr>;E>}Kmos08?@iGTCLU0p*PTf*Os~b<7`Kzr=Q7(;R z`1Vxk!`NxnBlG78VI@+HsXW`aC`A*VPO86qc_wA!ozDJfQ1`$8^%Sxx)F)U|7E5M z#(O?b*7ZAI05lWbJoHV%XyWek(ud;He+y zC-Ru;!=5NbtONxLs6rpOeT@(_18sy=WY?N{Qvs*8}kY;$-?#tSH>K5qP z?*Q9a^l4tSdW_hW@hVvx&dIiZk7i^4y>-+`%GMTEFD#yXIHHiVv-$7IW0#^laEk=sY`qtzM3Yy9mC^uC*)?~%EPfT-hWuS&Y9=><;`H9uzst>p_pouxAe z;0^0)rwbp-AiS^)Vpb9_?>s&1uYf=)i5_N2zG8`n_{nCe4l3K(|bf!$9& z*MqJ>PYSEN!0)d{nu-1BHc!7#!Ew(P{tRR|GwLQKIqIKP~IzGYKcpa~?&WZyk#A zfB4ZRSQZp^vJwHl2X|@KNr#@xF3;gsdqz1Il(-R5K&_LiU&U61kaQg@S zFrACcyL8mV#gC;=;n~AkJxG^lcDwygSn<%(3FwCM_*J zP?(cu_7rES2g}I$als5qcD4P%o6wI45SA!>UQjs}Ic4X_$BFLYwq_Uc z&u3uX+{{z!RQY%D)r2JK*a<~q803t0n-`UiJze8EQu@7Y)hBFJUlwgybfVL+65q&{ z2*a@uQqV%{IVdpBq0M`1#WEows3tV)-Q8h8vz%kV8MPiqqMImuQ@=Fv%*>^eB%Ma( z@&EcG#(ja_!~aJ8TmUt5h{~J48QYP1Tt6La>`ljL<$%>G+5ucrirw8tF;+T=G6$By z7vgd}M*vkV;RSW0*EW6h%vO21ALwPefj=afg1FTlmgT=~B_J7CdyG zUh-A`tK~({Od}?ZRV`(=X*(S1gPDp_61H{~h%L~0a9H;-o!?tOIVyV#=CWe(IWj?z z4u%$vkqsvf+-lrd8)f6ms81rx>}pKbifwk)gnYY74rnGBy7n+)Gc)1-)?g&r>Di+O zb;WJdUyOnchW6|@W+AkK*C~%PBe+T!LZL7?Fd$0aF?5lEZtTX+)6NLQ1p-=8LA!Qs z?Fs%jScSI#Dp$9I5m&;KI!t@v-vwuUIyoDR=Jw7>T(vbhD1df$oR4viZkHHOB^{jp z!=uwb8FuJTk}$$v!C&n06_u42N`0ULP9Yl-_44JvfRMM6?gwfJp2a$>-t;rv;GtK+ zfnSI?jV61MpPFAeT}fgT^N%Yn04!wNEh%9a=0c{PoKhJD#qF@8__EH7X$0Ab^a!z( z{@zn{pOE4*z2tzmOQxl?R5(d2gN#YB{YSfjtAN^qj{k}%DV2dcS8iYWfyb|QT^pcC zdV$tUhem}i(Zm|Ax1?$^99K0AApY<7NAgrD+)~)~@(O1x!2V5xWBrZAUT#w>KZhg(?vDe?^uCm<*;!W0TXAsN`32f3YI zT|qUllAp@3)cc>T!^wowpfxEwg$A0jDuoQ1&MN)51P9MNld66kDsMtE5Fb&C`jiIc zmH)27OdhmbjBciXrzq8r#@?JkH;4GLi^&R?o~ZCAZbBlqlR?IsbeZ$hso%QH0V*6v zvMZ_woxjUhd0+gYV@$ZcoVLSW?cmv_DJud-jb3DT*tbU>u)41@R1?MAdi#}fqT`BkrIEU~{4K!KgWpv<3WHSyOiN#XmI_2`E zniVU>T?{jJpq5a{53?8CC6nuNad2HflzMXiVuMMT&9#ms`HAh;$-hYxl;chhKeES2E=8b|q3K~Bz6-a`E-1U`Qa?G-FspsUWVyUNgA`onwCbM(9m zRL~(-Go&<3=r&4bSxel54iRYUFw89jICQhCycYxhy@gWI?!m_TaVe~Zu&Jf+763mW zIoTt``1BApp2TjebkX+^@CK$rR6CItT)$oNAS7YwD66S0IgEQA53Fz%wLOadtK87s z-!(WaVgE6%L}jS(GhA8r?JyRC_3fV1)crO>!sJY@BKwHOkrzJ>WUGb0DVPa)<;Kds z_0NLTRj^R5#8c>m0_cc6wSrruC&V&|K;^37OUC8LzgS({rT7!}Uk&uCCLl6?S~~$q z#+0iD{l*m6(ELS~675zw)Bf~2>8Jyj1HFU6{eC9@AIu4;h*_!(;iqd9NA@pR2<;dR zfJ1_dnCyd^s*0_bLTYo8``M5CEE7`;*=l%(&|XrhiZ5sASh)(!&ZsyfJYFn!irIVS9kO&Z6yCpTWcxT|*18F~z3KL@y;XA1-WhL#t z%ijO(`(ZVWNNMFdZWZr#Ha*i;O9R8Zf88HlAtyoDa0BQ=szMiWm5_GququKq2>sv} zB9Un4;DB;%syE@!4H3MfDbKjbi>A5mvnp4gM@PkperL|j?JF})1k(7#UW4}0rA-^(96U>KIInjaQ2tvKpP`W{B2k}hw^*_m5iLm({`R= z6RVgOaPYGo^g=hAWhW4XYX>)FY-DuuBzIf}vRaz02$h$&CeZF&#N#{%QQO9xQ$F+l zcLBG0FJ=3$&(#1Y77;)&?X-`6-x+WIwT-gC(!c?IFrU^tG_;ViIP|E*yGS8J^rVF2 zaNHA*Sd$#x_1&%2;exE$8C||uYKt?GofrIA=ejKHGDLYa+NL*N^CLVBE##fhfL@Gn z66a~7biTsjOgHN+!z-TT{rm&Q?-9M56kASS9tjmG)X-`n%6k6%Psl}#iX)N8z-mA) zHOntj!1R1*!CH0f*rJn&37*T34Z+}`Md+afsQJ|8xKtc+7%RLk~ zIn+lT$ybmRQTjL&jN}|uft$N~F%EY|(#mmV==;+YiUQ)pgO`FIXrA{gNmLFe_Nl~j z0h_9?T;kZ+SnrA$x>_Gti%OaQz5`RL>?meEof#ZSH>505>5^jNRM z$0{gm_a!jb6eZ*cY=3<1;AxnX&_f{X>?ac`c{RYKl1of2xETW2zop2Gil~^_uY0)o zCg-4-tkH%NoY5sa|AQsvw2o<}hp$wIPktNt2l2nV{)Nfq(%=EZy+=A4{+V7qp2pz! z2L=X)9XvBzGX{~{aId}5Io9U=PV*qxBDh9y4IN7@|yGl>#i?zdMCg)p+| zn(aSAI@#UT=-K-lO?##K^rSMPPx5;=k}GT+AYuegz$guFYmgek=+X9< z_aCl+Ji0V&t+bDGL&^~2H_vWlY)ofC<} zY|Prg0gvxSIdP~wMKzF7o~cPkAk37Pd9@eIzW8!i&uR0>JfW}lT33Zss^j%?<~LuX zVZOgTdH8topqPEA|;R^?+bHxI0BqO*5=NKkON9FIPU8BB`l9qPo^}*Q6an7QD z$b*gnLoKkJfp2ndj9xt`9s_^QUei{^$8TOaY1u zR^96Pm4Y_=%9;W_HKkNwP@reluYrp~U>8JJa$cnzx68X;t z{u6qc8E4iWzOOI20QUD+)~@L9ulTV8VGh3w5k|KSsPw*a*2OOZ?O zft;vl2B6CI61x(qS5697URoqx9^Is%Kp=DvCDN%rIb%m@zCY_&C=2>PkbeRUCOkB? zbWZD)G{F+>eYkYsX|+Uxu;Ecrll50CLn@ z`>QGCTi4!-y@XYW9jzi8JHsd_Az6@g$}~DgXE#^xHaZ*Q_nX~FUtc4;TgoT+DateR zQFVBDxa+~bFAyHB#~Y)Bg=c`bNEfPH_Db$I+qj<%2ng9$3@uFqt15kQNeRIltc19< zwD;#)e1o6X;KY5iWjr+kQJjp9!G@-ipNzRM<9&;y^U^IA-?|=om86YoE9b3VeF8E9Lq9JV#Ty#s%_|D{NVQ8 zyLLdlfKwQpl$Mi{`UG>g3q&H7Te5A*K!0!VkEyBmkg9&~BRfKp9TUx2dRZfKTE!r- z#X|d|_8QR8$Srw7e#8}OMckG$gUyG*vlnLndZ!v%2c1*>96=rcP8+fLi{+%45h^MD z21ZI$L1{!jBKJMkr_r?^)59whon*>|hWkl!QqnByu{U?;qYj}Ylo2I?T=4h8MRs!d697tSvFm6VNj zh^=5`g%ycZOQnd(z-JsT9=crs>`xw--Zcva7#kZKbg{v0px!PsTKuL@kK_y`^gUSj zGKNq2)zqXk>H@QnrqB%WEKoacVPT>6jsa%hq%*3*lwj$HtE~lYKLkSKlm!{p$X3SfhhFhp^7C}1%SuRm01~{zZy@*j(Die1 zF&7-S&PQ!As5>D~%ut?dZi%#aaG2dAjSx0A+(xeeEuSIWD4&g_5WS0|AYtxA|IM8j zb3~`)1;_yfsZB$sb{Hb*e`Lgo&*pA-sO^f`#`AgZTcvYvgj1&faef=07K<2FdvW)#44kH5VGe5a~m+Gi|Z=4zNS-lM$ zYjY}Z21r$YfI#_(Qzv#!SxUG940f%QS2aDzrua=XQ`*FT|5YJ}rU?&nudq6^&6V)( z1^NQH&Kf`o3%nub4NKX!U>tpm4Z87(BE`kUlb&DSniph2L1U=Y`36|sswP*{*scEl z4u z(_?x&eP4@#ph4O!;T{Z3S z!#c3)jOlnp0G`%Akm6tbNNk-Cuw)1@GXsVdM1YtQ^LIDBzQyIwtGneH)9Sse8pAPb zY@~J4;!xMx+FHS*Ur`w*d3L_O#t=i=ij6m=U_qV4;EWGJwS8UC<0i4c0fu=jV3x$Q z7q$8tPV6~51k}+=YE#u*l|#8hldVGuB_C(Po){)F7dsGf*z;(|0rH)lo#d1ht*giv zHjzc*j<2B_37dtKcw}vEejV5^+pMl!PL;{AznYztbY8||NggDGe|vsxHT90NsqcEc z;drsgY!t|7(qd-rCRa>t=rh$o*sqXy3$o`8Mbe$V!zX0uvlWe+x0RE|LT;kL z^ZWo%x+k!@3IE4YrIZ^m4+BO;O?2P`3srE0S(A|PbN#ISGQaslWUU{nB} z9{k;hc8^BiGjD*M%}ISt<@;_eFED7s8QJ2Gb7`fy@KUIK*92`h3*V^S z-Y$o$zP9igE&tvwYwg7Ecl1K9`y1l*6GFb`(6{YJV>#Go$7?B`Z{x|~Jnr7y?@W7t zYjjjLYED5#>L3vNri=;-liRp2GH8J=&s@3LV&jyQl(8EJv-&+77sx5e4zEU%pQ`2R z+;x~Mmxu28*r8P$w8q(DQiwI}TSj6IiFo&foZK zmQHqlTL>LhAs3r<^2Fun!;rNWU2L%^P~Z0wcMAFAT?4{gY{~#V?a)W~gzezni>RnJ z$(w_g(ALSvFbz9XHB%WJ)^*Y>?V4xCp09gjgo)~Qa5#A^Az3|9Q4s!$xqa;X;_&7khQadlB(k zyS@=sN?M)GqQ}|?7R8Y-!+Lspv~zUDWo2_?Vq$3V<`+V%nt*c^{7J)ygBzVAfAW9U z4EvTE(A;@PMM-mX+^DNgOY!DtWudQy6;_tra&nCe0tLikPA!bL`!ZyaRlR3g?3y&jPmRIS1n4UvF8KNDR~&fa9$J+;dXHEEeG1d`3?>9-wi4+ZdmCfTNf4TPP>}-U-&9*rGwg@^cB*bLa=%BBo z?eo5|+SH@%3w9)a&5k-xhcEW$%uE)**T83kFZ~n~!vMAkti8!>0@2l`uNbr)Y!@IE zdwY9VHPC!CqZjJGikEY``0Y50?wx(Juc}Pg zEbrSR$w*8!?<|33q?cU?FlS`!TjDAv9j~V7R186yMe{=!M3|s{nwdYFAH9)-)>qVHXg1q#Nz6A-jP$bYTFHl9n*pVb&{7 z@sPj&UHd?gGY?@(f2HR=7W^tdV4hwr#-(C<4Y_%VLD`_-pfj-R<&#GvC>%zI#T z+RW@QTM|$tCgMNal@(O?4D~gl)l6kpwV?j?tj$Z+g);CSa1{?3+wq4EybXJp!}U>kwd$Qfcm%C%vS^*s zhn+zyRjIeG@r&MM#hQ&NnKrvF zYxg|EcR;azY$SikK}{B|6oL@QD6J=o0ynC{rmOY zHwy+Omehio8K>UiB?j4Wx-)-!JHK%f%+p6cOCD0F`uv| zFEK$1H?``No{&oOxY*9=0lgri*3(wdD^1zBZa*q`k$|qy@56jna$m5C*9{FVI=9IE zjP6>i>ZvpHQrRdi^GRf8H5Y4#bIXy4tp19lX7sVt!mYJBsFqZ*+brtO3)30mp1gMO zxC>;uy;P)Gi;u%u*GvJ{{ZExIxI_>(SuI|RcWA-mX$%d$Ywf`JdyR#;+0-RE2!Lg z|F4YC@G0(V=+iOX_tnSuk*7ScqsJeU?(?T{NSwCD*97a_{;BnoTGnayDDZn87oQZy z9^d_~RgO(Yi0LWwlk&b7tL7!Y=%^SqwAy)t=qve-M3nQDjuY*0KEoD1Z{9xU`EZy7 z-2hTk%il)l_MW9)ZrJX?5?SJ@!w)&ftfiW^b044QQ>T>c?WY|a%TgfiQdZ$o#wvO~ zDtY>~PAs)-0O4rU&hbzr$@ADGG(Ww?$rvwQQ1{e9QZBoXQ}*Q#Zrj_Mqg+X!Rc6;@ zS)G=TJ|exPpLIc<(y!#DQ+glbxe6*w#N%=Ws`!{Z6e;);hA4z=*qmmM zPE$er?S78OL@BSH&9=fITmJ9LyPJFSx%W2atY-8u$*U@>$-YU(`2hsRqffVR+fdeY zd`fiXe%tIxooL3!tKO&agj;IK;3z;!tkY;M9M2u|zVJb=u`NXGMpWjawxxS*#vskT zqxF>DdJN-W^#Y~@w(B!~Y^V6_Yn?S6*xJdsCIW?y;szrnH~BG3q@rFd^|ku0jzFQ{ zLnSnFb31)sVY*`I5v$uNm76Vwi)4Qv=#d(N?C6k|Hs6tFjbN8OVPtcpWv*844J+bl zZ+HyHuf84#n7Alya_rujBQf|?81YE9WN?dP5dz8o|MUO015Pyi9A~cjm42#<{rB)c N&^PZW=3X}o`acI|I3fT5 literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level0.gif b/apishiv/static/skills/level0.gif new file mode 100644 index 0000000000000000000000000000000000000000..65eb4773dadbbc5f3fce29a339cbcece1f8e86ee GIT binary patch literal 73 zcmZ?wbhEHbG+^LhXkY+=#>N)KpDbXe4u}NFFfb|f^shYK%dmLPmRsCB_x8NzYrCjE UO*(U#$f|8KnU8M@WMHrc0DIdNaR2}S literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level0t.gif b/apishiv/static/skills/level0t.gif new file mode 100644 index 0000000000000000000000000000000000000000..191c872c0b6be859b0817878ba2fd833a5de5219 GIT binary patch literal 434 zcmZ?wbhEHbG+^Lh*v!eWdGpp;v*w;Xd+yn@XaE2IZ)$33YHVq2Y++zv0CIsO8c_Vt z?dKX2?CcoeYNTht%m|cL{K>+~z`)6%15yeymVw3O!wJvVh8C|6?f#!osF0F5FJslZ zj*bW+?eojH`%CuS+VF01+r_u;Dy-cnLOvYJ@iMuPp~i$Th>3v-XbcO`Aa;Wjo~!qo uV3!lXBNu>2t^i3+8RT#z`z9dCfjxyJhpZ1>4xfDjc+51wBliI+XAJ<{>|}BP literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level1.gif b/apishiv/static/skills/level1.gif new file mode 100644 index 0000000000000000000000000000000000000000..bae1da42facd9d1437429415396b2e1da63de1a7 GIT binary patch literal 76 zcmZ?wbhEHbG+^LhXkY+=#>N)KpDbXe4u}NFFfb|i^shYK%dmLPmRsCDaXYG48s6_{ XmFe_bHfh_0XUC>EU;h@!z+epk&e|Aq literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level1t.gif b/apishiv/static/skills/level1t.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9f823f9748366d1c3c96dc58dd8077e2f2c0af8 GIT binary patch literal 435 zcmZ?wbhEHbG+^Lh*v!eWdGpp;v*w;Xd+yn@XaE2IZ)$33YHVq2Y++zv0CIsO8c_Vt z?dKX2?CcoeYNTht%m|cL{K>+~z`)6%15yeymVw3e!wJvVh8C|6?f#!osF0F5FJslZ zj*f^++?z{Y9a4^a|J3&Np1F$OXR~G>UL4esZKXbIg^4gD!X$16CZIViK$F-FPI#`~ wYr=$8P5_Tw03NvlBspb}%aQDxfFuX@6_OmXK6E*J_6guI(*Td$2dJDi0IeQn7ytkO literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level2.gif b/apishiv/static/skills/level2.gif new file mode 100644 index 0000000000000000000000000000000000000000..627681da3bf75d8ac2e31d3cbe8940059ffd7cc7 GIT binary patch literal 78 zcmZ?wbhEHbG+^LhXkY+=#>N)KpDbXe4u}NFFfgh1^shYK%dmLPmRsCDanTRsGkvBv Yq^T4=&RllyR9%!$^SR#V?u-o90Q9FAmjD0& literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level2t.gif b/apishiv/static/skills/level2t.gif new file mode 100644 index 0000000000000000000000000000000000000000..6220340fb6b21c8c302ec24e1bf104d04b55f3cc GIT binary patch literal 440 zcmZ?wbhEHbG+^Lh*v!eWdGpp;v*w;Xd+yn@XaE2IZ)$33YHVq2Y++zv0CIsO8c_Vt z?dKX2?CcoeYNTht%m|cL{K>+~z`)6%15yeymVw3U!wJvVh8C|6?f#!osF0F5FJslZ zj*f^++^5BM@A@#~^3=7DHs3whZuFw*gw)5B7_0dl$$4H=GuGYkVL=!t!oUPHj0I>M zyTJ+1)q72tu*wPGkqf{hSAZm^401k_eG`!6z+OX=L)M2bhtEC%JZ2i;k^2CZvjzb0 CrfJOp literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level3.gif b/apishiv/static/skills/level3.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b186c9596549a1a5a503e35cd337130b450feb0 GIT binary patch literal 80 zcmZ?wbhEHbG+^LhXkY+=#>N)KpDbXe4u}NFFfgh2^shYK%dmLPmRsCDanWB}Vx>OY brbP70R4$tQYU7;WY+rh(pF8)SmBAVSFvuF& literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level3t.gif b/apishiv/static/skills/level3t.gif new file mode 100644 index 0000000000000000000000000000000000000000..156b46534b0c7fa630ac177d9dee934b9f168046 GIT binary patch literal 442 zcmZ?wbhEHbG+^Lh*v!eWdGpp;v*w;Xd+yn@XaE2IZ)$33YHVR(U}$V?0dj#1G@$sO z+s`#5*x50_)kx2PnGq+Z|fq|1j2c#5aECY*;z)4SSBa7FEcK=Uklu5~)m$7PH zdqu=0?$cti8})2nnO*hYaks~P&RU*BQGuBuijfyqh^$;4r8;YknJ^>5Kv@PRpm8if z1KABuc&^@S!h}^$0FPV%9=QS}Ic1OsknEd)BnS2!k{q%=bUA$X3E(l)0FN9nFu{Je F1_1kZWZVD% literal 0 HcmV?d00001 diff --git a/apishiv/static/skills/level4.gif b/apishiv/static/skills/level4.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f7e9ac098347440fcc87ce4dbe745607d9bb51a GIT binary patch literal 84 zcmZ?wbhEHbG+^LhXkcJyY;0j*U{L(Y0wft2bU*}1hJi`DrGMq=UdF|9w%n5TiHrXF j#di9!mUhn~<%Ug9S4XX6zg)O9@z*}+Z|fq|1j2c#5aECY+3z)4SSBa7FEcK=Uklu5~)m$7PH zdqu=0?$ctiH$$us{XX+pIN{7!?O%PS&g;`sl=8i%m3W1IS{KoocKWOfl96f*Oh5x! zfJU+#obX(|*MtdS9g>^?9=QNKas^0o${;TwnK=PT4(vT7Ib?n4a`@~Mz+ div { margin-bottom: 2em; } +.character_info .character_portrait, .character_info .character_corporation, .character_info .character_alliance { float: right; } +.character_info .character_corporation { clear: right; margin-left: 2em; } +.character_info .character_corporation span, .character_info .character_alliance span { font-weight: bold; display: block; text-align: center; } +.character_info .character_attributes ul { margin: .25em 2em; padding: 0; } +.character_info .character_skills table { width: 100%; } +.character_info .character_skills .intraining { background-color: #cc6600; } +.character_info .character_stats table { width: 300px; } +.character_info .character_attributes .stat { font-weight: bold; } +.character_skills th { cursor:pointer;cursor:hand; } +.toggle_off th { background-color: #000; } +.skill_controls { margin-bottom: .5em; } +.skill_controls a { + background: none repeat scroll 0 0 #377BA8; + /*set up the layout just right*/ + display: inline-block; + padding: 5px 10px 6px; + position: relative; + /*style the cursor and text of the button*/ + color: #fff !important; + text-decoration: none; + font-weight: bold; + line-height: 1; + cursor: pointer; + /*add rounded corners in mozilla and webkit*/ + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + /*Add box shadows and a bottom border with rgba colors*/ + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5); + text-shadow: 0 -1px 1px rgba(0,0,0,0.25); + border-bottom: 1px solid rgba(0,0,0,0.25); + + +} + +table +{ + text-align: center; + font-weight: normal; + font-size: 11px; + color: #fff; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 15px; +} + +table td +{ + color: #000; + padding: 4px; + text-align: left; +} + +table tr { + background-color: #ddd; +} + +table tr:nth-child(odd) { + background-color: #eee; +} + +table tr:hover { + background-color: #eed; +} + +table tr#alt-application { + background-color: #FFA545; +} + +table th +{background-color: #cccccc; +color: black; +padding: 4px; +text-align: left; +font-size: 12px; +font-weight: bold;} + +table th a +{color: #fff !important; +} + +table th a:visted +{ +color: #fff !important; +} + +form span.helptext +{ +color: #666 !important; +font-style:italic; +} diff --git a/apishiv/templates/character.html b/apishiv/templates/character.html new file mode 100644 index 0000000..610c588 --- /dev/null +++ b/apishiv/templates/character.html @@ -0,0 +1,94 @@ +{% extends "layout.html" %} +{% block body %} + + + + + + +{% endblock %} diff --git a/apishiv/templates/characters.html b/apishiv/templates/characters.html new file mode 100644 index 0000000..ec76dd6 --- /dev/null +++ b/apishiv/templates/characters.html @@ -0,0 +1,29 @@ +{% extends "layout.html" %} +{% block body %} + +
+

Characters

+ +
    + {% for id, name in characters.items() %} +
  • {{ name }}{{ name }}
    {{ charinfo[id]['sp_total']|humanize }} SP
    {{ charinfo[id]['balance']|humanize }} ISK
    {{ charinfo[id]['corporation'] }}{% if charinfo[id]['alliance'] %}
    {{ charinfo[id]['alliance'] }}{% endif %}
  • + {% endfor %} +
+ {% if status %} +

Account Status

+

Paid Until {{ status.paidUntil|unixdate }}
+ Created Date {{ status.createDate|unixdate }}
+ {% endif %} +

+
+

Access Permissions

+
+ + {% for name, c in access %} + + {% endfor %} +
{{ name }}
+
+ +{% endblock %} + diff --git a/apishiv/templates/index.html b/apishiv/templates/index.html new file mode 100644 index 0000000..d75bd30 --- /dev/null +++ b/apishiv/templates/index.html @@ -0,0 +1,15 @@ +{% extends "layout.html" %} +{% block body %} +

Key Input

+
+
+
Key ID: +
+
Verification Code: +
+
+
+
+ +{% endblock %} + diff --git a/apishiv/templates/layout.html b/apishiv/templates/layout.html new file mode 100644 index 0000000..1183dc3 --- /dev/null +++ b/apishiv/templates/layout.html @@ -0,0 +1,22 @@ + +API Shiv + +
+

API Shiv

+ {% if session.keyid %} + + {% endif %} +{% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} +{% endwith %} + {% block body %}{% endblock %} + +
diff --git a/apishiv/utils.py b/apishiv/utils.py new file mode 100644 index 0000000..0b66050 --- /dev/null +++ b/apishiv/utils.py @@ -0,0 +1,5 @@ +def mask_check(accessmask, bit): + """ Returns a bool indicating if the bit is set in the accessmask """ + mask = 1 << bit + return (accessmask & mask) > 0 + diff --git a/app.py b/app.py new file mode 100644 index 0000000..9240b4d --- /dev/null +++ b/app.py @@ -0,0 +1,10 @@ +import os +import logging +from hashlib import sha1 +from apishiv import app + +logging.basicConfig(level=logging.DEBUG) +app.secret_key = 'b63a3eb385a757d41ff5217f96d1bef965a6f657' + +if __name__ == '__main__': + app.run('0.0.0.0', 3333, debug=True) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8a23728 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +flask +-e git+https://github.com/nikdoof/eveapi.git#egg=eveapi
+

{{ character.name }}

+ +
+ +
+ +
+ {{ corp.ticker }} + {{ corp.name }} +
+ + {% if corp.allianceID %} +
+ {{ corp.allianceName }} + {{ corp.allianceName }} +
+ {% endif %} + + +
+ +
+

Stats

+ + + + + + + + +
StatValue
Intelligence {{ character.attributes.intelligence }}
Memory{{ character.attributes.memory }}
Charisma{{ character.attributes.charisma }}
Perception{{ character.attributes.perception }}
Willpower{{ character.attributes.willpower }}
+
+ +
+

Skills

+ + + + + {% for skill in character.skills %} + + {% endfor %} +
{{ skilllist[skill.typeID] }} Level {{ skill.level }}{{ skill.skillpoints|humanize }} SP
+
+