From 4c1e326b51306098ac907f47dd9a4bb72c6dab17 Mon Sep 17 00:00:00 2001 From: Steve Nyemba Date: Thu, 14 Jun 2018 03:55:14 -0500 Subject: [PATCH] - --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 0 README.md | 0 init.sh | 0 log | 0 requirements.txt | 0 src/.DS_Store | Bin 0 -> 6148 bytes src/Domain.py | 0 src/api/.DS_Store | Bin 0 -> 6148 bytes src/api/__init__.py | 0 src/api/index.py | 107 +- src/api/static/.DS_Store | Bin 0 -> 6148 bytes src/api/static/css/fa/HELP-US-OUT.txt | 0 src/api/static/css/fa/css/font-awesome.css | 0 .../static/css/fa/css/font-awesome.min.css | 0 .../static/css/fa/font-awesome-animation.css | 0 src/api/static/css/fa/fonts/FontAwesome.otf | Bin .../css/fa/fonts/fontawesome-webfont.eot | Bin .../css/fa/fonts/fontawesome-webfont.svg | 0 .../css/fa/fonts/fontawesome-webfont.ttf | Bin .../css/fa/fonts/fontawesome-webfont.woff | Bin .../css/fa/fonts/fontawesome-webfont.woff2 | Bin src/api/static/css/fa/less/animated.less | 0 .../static/css/fa/less/bordered-pulled.less | 0 src/api/static/css/fa/less/core.less | 0 src/api/static/css/fa/less/fixed-width.less | 0 src/api/static/css/fa/less/font-awesome.less | 0 src/api/static/css/fa/less/icons.less | 0 src/api/static/css/fa/less/larger.less | 0 src/api/static/css/fa/less/list.less | 0 src/api/static/css/fa/less/mixins.less | 0 src/api/static/css/fa/less/path.less | 0 .../static/css/fa/less/rotated-flipped.less | 0 src/api/static/css/fa/less/stacked.less | 0 src/api/static/css/fa/less/variables.less | 0 src/api/static/css/fa/scss/_animated.scss | 0 .../static/css/fa/scss/_bordered-pulled.scss | 0 src/api/static/css/fa/scss/_core.scss | 0 src/api/static/css/fa/scss/_fixed-width.scss | 0 src/api/static/css/fa/scss/_icons.scss | 0 src/api/static/css/fa/scss/_larger.scss | 0 src/api/static/css/fa/scss/_list.scss | 0 src/api/static/css/fa/scss/_mixins.scss | 0 src/api/static/css/fa/scss/_path.scss | 0 .../static/css/fa/scss/_rotated-flipped.scss | 0 src/api/static/css/fa/scss/_stacked.scss | 0 src/api/static/css/fa/scss/_variables.scss | 0 src/api/static/css/fa/scss/font-awesome.scss | 0 src/api/static/img/logo-0.png | Bin src/api/static/img/logo.png | Bin src/api/static/js/.DS_Store | Bin 0 -> 6148 bytes src/api/static/js/jsgrid/.DS_Store | Bin 0 -> 6148 bytes src/api/static/js/jsgrid/i18n/jsgrid-ja.js | 90 +- src/api/templates/bill.html | 0 src/api/templates/subscribe.html | 0 users.log | 1682 +++++++++++++++++ 56 files changed, 1794 insertions(+), 85 deletions(-) create mode 100755 .DS_Store mode change 100644 => 100755 .gitignore mode change 100644 => 100755 README.md mode change 100644 => 100755 init.sh create mode 100755 log mode change 100644 => 100755 requirements.txt create mode 100755 src/.DS_Store mode change 100644 => 100755 src/Domain.py create mode 100755 src/api/.DS_Store create mode 100644 src/api/__init__.py mode change 100644 => 100755 src/api/index.py create mode 100755 src/api/static/.DS_Store mode change 100644 => 100755 src/api/static/css/fa/HELP-US-OUT.txt mode change 100644 => 100755 src/api/static/css/fa/css/font-awesome.css mode change 100644 => 100755 src/api/static/css/fa/css/font-awesome.min.css mode change 100644 => 100755 src/api/static/css/fa/font-awesome-animation.css mode change 100644 => 100755 src/api/static/css/fa/fonts/FontAwesome.otf mode change 100644 => 100755 src/api/static/css/fa/fonts/fontawesome-webfont.eot mode change 100644 => 100755 src/api/static/css/fa/fonts/fontawesome-webfont.svg mode change 100644 => 100755 src/api/static/css/fa/fonts/fontawesome-webfont.ttf mode change 100644 => 100755 src/api/static/css/fa/fonts/fontawesome-webfont.woff mode change 100644 => 100755 src/api/static/css/fa/fonts/fontawesome-webfont.woff2 mode change 100644 => 100755 src/api/static/css/fa/less/animated.less mode change 100644 => 100755 src/api/static/css/fa/less/bordered-pulled.less mode change 100644 => 100755 src/api/static/css/fa/less/core.less mode change 100644 => 100755 src/api/static/css/fa/less/fixed-width.less mode change 100644 => 100755 src/api/static/css/fa/less/font-awesome.less mode change 100644 => 100755 src/api/static/css/fa/less/icons.less mode change 100644 => 100755 src/api/static/css/fa/less/larger.less mode change 100644 => 100755 src/api/static/css/fa/less/list.less mode change 100644 => 100755 src/api/static/css/fa/less/mixins.less mode change 100644 => 100755 src/api/static/css/fa/less/path.less mode change 100644 => 100755 src/api/static/css/fa/less/rotated-flipped.less mode change 100644 => 100755 src/api/static/css/fa/less/stacked.less mode change 100644 => 100755 src/api/static/css/fa/less/variables.less mode change 100644 => 100755 src/api/static/css/fa/scss/_animated.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_bordered-pulled.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_core.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_fixed-width.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_icons.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_larger.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_list.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_mixins.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_path.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_rotated-flipped.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_stacked.scss mode change 100644 => 100755 src/api/static/css/fa/scss/_variables.scss mode change 100644 => 100755 src/api/static/css/fa/scss/font-awesome.scss mode change 100644 => 100755 src/api/static/img/logo-0.png mode change 100644 => 100755 src/api/static/img/logo.png create mode 100755 src/api/static/js/.DS_Store create mode 100755 src/api/static/js/jsgrid/.DS_Store mode change 100644 => 100755 src/api/templates/bill.html mode change 100644 => 100755 src/api/templates/subscribe.html create mode 100755 users.log diff --git a/.DS_Store b/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..412384e1781ddcb34d2d38ad0d204037c096e61c GIT binary patch literal 6148 zcmeHK!A{#i5Zz7EV#gO(1qq4EUXgML&@@*!z!52u5ePw*+Snp1S$1SQL{${Y2Tptj zEiM01m4E1`^v2BY27%JvstVAIH2Y>}XLhr1qa80}jQ7UT24gN`%mPKM+0gt!a2$0( zYQ}@eagJgXCRqr*-{EK>njBA&0X(}pD_G7>!^y+*OJq^D+rN0N-gxzT$+DY{<1`)j zP4lBa%qD&rl;ffoh2cDgOG+3Cz$V%qJt zTjJf;``OIBu&lN9&WF9D(d_c-%h&5~-*0~W)Mvoq@2cdj!8zQ5Vdyyb^EAoQGw{r# z=TU^j05L!eJaY!jwPrcbd>{1li2-8Z-!p*sg8)VJ3|1P|)d3BDKH_)-5d~~~OCSn^ zp212ZjDT>R3aC@Ld17##4t`Ja7Fs8S5ESc+Fc am4IKM0q7a5G=c|&J_HmE)DQ#zm4Q1|Vq+8l literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/init.sh b/init.sh old mode 100644 new mode 100755 diff --git a/log b/log new file mode 100755 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..9e965a2dc35215e058e7a0e760f7d8bf177abd19 GIT binary patch literal 6148 zcmeHK%}OId5bjR0?o8$~;tGP7zAogD)s4B1(LD-*S(HU3&M<>%7-m9dVpu|84xW6B zUH{%gcHdzi#hX>#9Z{k;5nZaF`m3(4>P~+hx~3UpyfccvFy=DGEKtOX4b2mR^oQvg?lH)E#%R ze(3kJv0ntmDDMQrebtju92&bD6#bd~J5f;-_WXwq^I+mC0nS)ozHjR%_Z2lXkn= z5MS3frc?LSvQ|I0Hg|purf0u?pI=;FUEloCXTag_s$|LF4E};)=s59*X_BSK;F(3w zq6morVt^QU=M0!@&2rxPKIrEY1H{0~Gl2Jl07di+mKxR70S$gW;&=@a1#EmvAPR$? z!BQiPfN-4(s8hLlVsM=feqrJ~gQZ5D&bV3`<}oXC^FrZjb?^%n&bX(MT4I10c+5am zcU`Ri-=2T}KTe_^F+dFbR}Aplw!hthEt%Rnw>hk}0`v$J1>;JM_bFhgQVg+JidR6D ZfM1{i=ou_Ef(L{?1QZR_5CgBuz#aWdV)y_6 literal 0 HcmV?d00001 diff --git a/src/Domain.py b/src/Domain.py old mode 100644 new mode 100755 diff --git a/src/api/.DS_Store b/src/api/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..81b2a310514dba5def7d21032b945d9d00f4d76e GIT binary patch literal 6148 zcmeHK%}(1u5Z( zD#nAz)f|$Ygp+(2CRw-?O^&C?0Pfu?%UQt!(8c|`3x|o!i$>#?S5~U8R@W@M<~UBx zabMSt{XsVIi=Y_i?O=4IdNPVbV|RjLFt5+*6V&LC0faik%Mf41o8r9JO4gNmjcoh)^Y`jY# z3WJ`(QX`CjaGeUMQ@OcfaGef*Vd6Z4rAD33xLO(JF)MR(L*Z(5@Cy~rxTld?Vt^P} zWMD;iU9A86f4~1PCQ*+VAO>C(1H8KD@3rBTOl@6yIjpq;^b05o#+4c$QovB97-F#$ cZ-OcTzd!@fGgxW_4+#ATC>p3C2L3Ap_q?ZNbN~PV literal 0 HcmV?d00001 diff --git a/src/api/__init__.py b/src/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/api/index.py b/src/api/index.py old mode 100644 new mode 100755 index 9af2c9e..57b442c --- a/src/api/index.py +++ b/src/api/index.py @@ -1,6 +1,11 @@ """ + Steve L. Nyemba + The Phi Technology, LLC - Store + This file handles customer & plans associated with a given product/app - The subscription works as follows: + We understand that a product will have multiple plans under it and we make sure that we always have a free version: + - Having a free product insures there is no excuse not to signup users + - If a product doesn't fall under this model we will find a way to fix it. - """ from __future__ import division @@ -34,49 +39,71 @@ COUCHDB = Server(uri=CONFIG['couchdb']['uri']) ; This function will set the user information to the session and update the information @header uid user email address """ -@app.route("/init/",methods=['POST']) -def init(app_name): - plans = [] - handler = None - uid = request.headers['uid'] - plan = request.headers['pid'] - auid = None - if 'uid' in request.headers and 'auid' not in request.headers: - id = uid - #couchdb = Couchdb(uri=CONFIG['couchdb']['uri'],dbname=app_name,uid=uid,create=False) - #DB = couchdb.dbase +@app.route("/init/",methods=['POST']) +def init(product): + """ + This function initializes a product to a given user, + if the user has provided a user identifier it will be used as her primary email. The understanding is that a product may have multiple plans under it but always a free one + @param uid user's email (primary) + @param pid plan identifier + """ + email = request.headers['uid'] + plan_id = request.headers['pid'] + user = User(stripe=stripe,store=CONFIG['couchdb'],product=product) + user.susbscribe(uid,plan_id) if 'auid' in request.headers : - auid = request.headers['auid'] - auid = json.loads(auid)if auid.startswith('[') else auid - if isinstance(auid,list) : - auid = list(set(auid) - set([uid])) - - if len(auid) == 0: - auid = None - id = uid - else: - auid = auid[0] - id = auid - couchdb = Couchdb(uri=CONFIG['couchdb']['uri'],dbname=app_name,uid=id,create=False) - DB = couchdb.dbase - #handler.update_user(id=handler.getId(auid),uid=uid) - - handler = Domain.User(DB,stripe) ; - if auid is None : - handler.init(uid,plan) ; + auid = request.header['auid'] + user.update(emails=auid) + user.post() + features = json.loads(users.me['subscriptions'][pid][0]['metadata']) else: - if couchdb.isready() == False: - handler.init(auid,plan) - id = handler.getId(uid) + features = user.get(uid,key) + user.refresh() + return json.dumps(features),200 + +# @app.route("/init/",methods=['POST']) +# def init(app_name): +# plans = [] +# handler = None +# uid = request.headers['uid'] +# plan = request.headers['pid'] +# auid = None +# if 'uid' in request.headers and 'auid' not in request.headers: +# id = uid +# #couchdb = Couchdb(uri=CONFIG['couchdb']['uri'],dbname=app_name,uid=uid,create=False) +# #DB = couchdb.dbase +# if 'auid' in request.headers : +# auid = request.headers['auid'] +# auid = json.loads(auid)if auid.startswith('[') else auid +# if isinstance(auid,list) : +# auid = list(set(auid) - set([uid])) - handler.initialize(auid) - id = handler.getId(auid) - handler.update_user(id=id,uid=uid) ; +# if len(auid) == 0: +# auid = None +# id = uid +# else: +# auid = auid[0] +# id = auid +# couchdb = Couchdb(uri=CONFIG['couchdb']['uri'],dbname=app_name,uid=id,create=False) +# DB = couchdb.dbase +# #handler.update_user(id=handler.getId(auid),uid=uid) - plans = handler.plans() - #return json.dumps(plans) - _features = features(app_name) - return _features +# handler = Domain.User(DB,stripe) ; +# if auid is None : +# handler.init(uid,plan) ; +# else: +# if couchdb.isready() == False: +# handler.init(auid,plan) +# id = handler.getId(uid) + +# handler.initialize(auid) +# id = handler.getId(auid) +# handler.update_user(id=id,uid=uid) ; + +# plans = handler.plans() +# #return json.dumps(plans) +# _features = features(app_name) +# return _features """ This function will update the user's email """ diff --git a/src/api/static/.DS_Store b/src/api/static/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..b26b115765c22f99443820728ba2467fbf1d0074 GIT binary patch literal 6148 zcmeH~zmL-}6vyqh2T8L8afp*xG9FTgv{15!Qji#sDh1sMaZr+`YJ<|aYSODvRVf1# ze+IuLW)?<%O^hu35BvczmG^8H_1CTFg#0A?Yd^o|$e+}8ObDTkaabk9B!p;CP)lW~ zwiu3M*|382U>?OeSSN^C06m;enIfPFoOS}ZcZ(z<1Jb)4uk7DjFtR`A#up)@f=N1* zyZm=BjH5KO?H{yIEbW{*tLbIKFv^B`uKd93vx%4a**I$lAdtx@+FQd@q~J&4jM zh~g-FqUpM>>1}gwI<3{6idC!EXBBJeICjOldga<|WCo;`o@^404% zZ$EtzZ;isA8n^RO7xEPv634MON@AAuz=P2R@|dJ+AisfsAIIl&sAbF&#$VeomN`b_ z)L_&&#*2W_26Q$;tlD<1VmXe36!i^?A3yWek`pN+WzH+^RlN=y40(L%{m+Gez?#i) zoOKBK{_w*)KFZ??(Iy0JJs vYb_{`prBz~E|jN0C68m?z@vB%3O5+DumS2y&4q#oOnnG&460HD{waY!mi67C literal 0 HcmV?d00001 diff --git a/src/api/static/css/fa/HELP-US-OUT.txt b/src/api/static/css/fa/HELP-US-OUT.txt old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/css/font-awesome.css b/src/api/static/css/fa/css/font-awesome.css old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/css/font-awesome.min.css b/src/api/static/css/fa/css/font-awesome.min.css old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/font-awesome-animation.css b/src/api/static/css/fa/font-awesome-animation.css old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/FontAwesome.otf b/src/api/static/css/fa/fonts/FontAwesome.otf old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/fontawesome-webfont.eot b/src/api/static/css/fa/fonts/fontawesome-webfont.eot old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/fontawesome-webfont.svg b/src/api/static/css/fa/fonts/fontawesome-webfont.svg old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/fontawesome-webfont.ttf b/src/api/static/css/fa/fonts/fontawesome-webfont.ttf old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/fontawesome-webfont.woff b/src/api/static/css/fa/fonts/fontawesome-webfont.woff old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/fonts/fontawesome-webfont.woff2 b/src/api/static/css/fa/fonts/fontawesome-webfont.woff2 old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/animated.less b/src/api/static/css/fa/less/animated.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/bordered-pulled.less b/src/api/static/css/fa/less/bordered-pulled.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/core.less b/src/api/static/css/fa/less/core.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/fixed-width.less b/src/api/static/css/fa/less/fixed-width.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/font-awesome.less b/src/api/static/css/fa/less/font-awesome.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/icons.less b/src/api/static/css/fa/less/icons.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/larger.less b/src/api/static/css/fa/less/larger.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/list.less b/src/api/static/css/fa/less/list.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/mixins.less b/src/api/static/css/fa/less/mixins.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/path.less b/src/api/static/css/fa/less/path.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/rotated-flipped.less b/src/api/static/css/fa/less/rotated-flipped.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/stacked.less b/src/api/static/css/fa/less/stacked.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/less/variables.less b/src/api/static/css/fa/less/variables.less old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_animated.scss b/src/api/static/css/fa/scss/_animated.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_bordered-pulled.scss b/src/api/static/css/fa/scss/_bordered-pulled.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_core.scss b/src/api/static/css/fa/scss/_core.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_fixed-width.scss b/src/api/static/css/fa/scss/_fixed-width.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_icons.scss b/src/api/static/css/fa/scss/_icons.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_larger.scss b/src/api/static/css/fa/scss/_larger.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_list.scss b/src/api/static/css/fa/scss/_list.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_mixins.scss b/src/api/static/css/fa/scss/_mixins.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_path.scss b/src/api/static/css/fa/scss/_path.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_rotated-flipped.scss b/src/api/static/css/fa/scss/_rotated-flipped.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_stacked.scss b/src/api/static/css/fa/scss/_stacked.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/_variables.scss b/src/api/static/css/fa/scss/_variables.scss old mode 100644 new mode 100755 diff --git a/src/api/static/css/fa/scss/font-awesome.scss b/src/api/static/css/fa/scss/font-awesome.scss old mode 100644 new mode 100755 diff --git a/src/api/static/img/logo-0.png b/src/api/static/img/logo-0.png old mode 100644 new mode 100755 diff --git a/src/api/static/img/logo.png b/src/api/static/img/logo.png old mode 100644 new mode 100755 diff --git a/src/api/static/js/.DS_Store b/src/api/static/js/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..f7b852b387e0c6e18269a3f93306228952b39e7d GIT binary patch literal 6148 zcmeHK&x_MQ6n?XH1^zV!Xzp&qBX|rm2%$KCX;HX|et9KLzB+MJ z7$K8Gurb$(`+>OVY_%$L{dt<`b>XX@L_EzL=M&qiR8MW6uGM!MbXjK_58SbsyP22G z(ylkXFYkB|`nultvhlipSBU6)-ShW(I3HN&u8TPHcpOeQQV$P!9Ef>W%;F$DbX9)` zJjlia>wJG29${+Vi^F}Ma-T;$JFeB~8dw(=i(SWQ+Rn0RFItYX+qB#5_Ht=Gsn;%D zxwd!bUb1}p?D>nAuU@}-`%aD;7_NoV&T3r4d#n`ni$*PXC?<&{RBm7WF+LH!UNFms z03YqoUnHxLKM}!ilV|7tn^$eqTKh({P%zq2Hn;zTH*zj>{3B1UTlX%sLD{D}gz zKG^7l9gVp{xpZJ5j{t~jb5Sw+6`&kjV@G4I5F=nJp(QNSorRG^}6E!zKY{QCS~Ofq*y0i(cwr2wn;++G)l zr1#d+;ApS4(I29d5ieILQ?St6v8>Qmd=Xt5#%!t}b~NS+u?5Zi2uK-BVHEhQ3VZ{- C1eSFG literal 0 HcmV?d00001 diff --git a/src/api/static/js/jsgrid/.DS_Store b/src/api/static/js/jsgrid/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..6fe4091646a22f7f7199343ac8caa6835d54a0c5 GIT binary patch literal 6148 zcmeHK%Sr=55UgGoOcZ4g9z5>Ri$ZQ5mk4 z6p?P|sd-h;PAzP21CajPxCayfI&{UX%cjM2U46~6II~L>jd3-ZkA{=^kYf$#_V*Rg zcbDS{J)C2fyuVAXoqPog7b)blzxU0R~8BXBjF!y;ZGTJ)*eT$ zlQ?^gIIU;PXTs?w9Nwh)wApRKI7}E@o)D_k`-)Nr8@OwyLN!`ta_Hs?xB{-gk1N2O zt=8E$^wt${1zdrp0{VR@>55gv+Aw@N*n|>*m~%Q9`{CE0Sn33^idY+Rh9*WO8dYM6 zA+d50qjSBA`)fm^L&C|76Hk^{p-3z|qzv03m7%w;fGf~cV8@1q=KqV$^?#G(BUiu` z_*V)@KDZh5d8L?J*Dj~Iwxr+D)pTENxTLTXQZe^xDn6zM<9w+dVimDA