From 36669b71c4cc3a48eee69437001ed2213cdefaef Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 3 Jul 2025 19:28:56 +0800 Subject: [PATCH] first commit --- json/build.sh | 3 + kyapikey/client.py | 15 +++++ kyapikey/server.py | 115 +++++++++++++++++++++++++++++++++++++ models/kydownapikey.xlsx | Bin 0 -> 16874 bytes models/kydownapp.xlsx | Bin 0 -> 16602 bytes models/kyupapp.xlsx | Bin 0 -> 16571 bytes models/kyupuserapikey.xlsx | Bin 0 -> 16782 bytes models/mysql.ddl.sql | 58 +++++++++++++++++++ 8 files changed, 191 insertions(+) create mode 100755 json/build.sh create mode 100644 kyapikey/client.py create mode 100644 kyapikey/server.py create mode 100644 models/kydownapikey.xlsx create mode 100644 models/kydownapp.xlsx create mode 100644 models/kyupapp.xlsx create mode 100644 models/kyupuserapikey.xlsx create mode 100644 models/mysql.ddl.sql diff --git a/json/build.sh b/json/build.sh new file mode 100755 index 0000000..6fd2291 --- /dev/null +++ b/json/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +xls2ui -m ../models -o ../wwwroot kyapikey *.json diff --git a/kyapikey/client.py b/kyapikey/client.py new file mode 100644 index 0000000..778510f --- /dev/null +++ b/kyapikey/client.py @@ -0,0 +1,15 @@ + +from time import time +from appPublic.aes import aes_encrypt_ecb, aes_decrypt_ecb + +def build_beardata(appid, apikey, secretkey): + """ + this appid is isusses by upapp we connect to, + secretkey is with the appid, is s fixed key from upapp + apikey is user's apikey assigned by upapp when the users is synchronous to upapp + """ + t = time() + txt = f'{t}:{apikey} + cyber = aes_encrypt_ecb(secretkey, txt) + return f'Bear {appid}-:-{cyber}' + diff --git a/kyapikey/server.py b/kyapikey/server.py new file mode 100644 index 0000000..c25842d --- /dev/null +++ b/kyapikey/server.py @@ -0,0 +1,115 @@ +from traceback import format_exc +from appPublic.log import debug, exception, info +from appPublic.timeUtils import curDateString +from time import time +from ahserver.serverenv import ServerEnv +from sqlor.dbpools import DBPools + +from appPublic.aes import aes_encrypt_ecb, aes_decrypt_ecb + +return_messages = { + -9: '用户同步:未知未知错误', + -4: '用户同步:添加用户apikey失败', + -3: '用户同步:添加用户失败', + -2: '用户同步:添加机构失败', + -1: '用户同步:用户已同步' +} + +def get_dbname(): + dbname = get_serverenv('get_module_dbname')('dapi') + return dbname + +def get_secretkey(sor, appid): + recs = await sor.R('downapp', {'id':appid}) + if len(recs) < 1: + return None + secret_key = recs[0].secret_key + f = get_serverenv('password_decode') + return f(secret_key).encode('utf-8') + +async def get_apikey_user(sor, apikey): + f = get_serverenv('password_encode') + apikey = f(apikey) + users = await sor.R('downapikey', {'apikey': apikey}) + if len(users) < 1: + return None + apiuser = users[0] + if not apiuser.enabled: + e = Exception(f'user(id={apiuser.userid}) is not enabled') + exception(f'{e},{format_exc()}') + raise e + if apiuser.expires_at < curDateString(): + e = Exception(f"user(id={apiuser.userid})'s apikey is expired({apiuser.expires_at})') + exception(f'{e}, {format_exc()}') + raise e + users = await sor.R('users', {'id': apiuser.userid, 'orgid': apiuser.orgid}) + if len(users) < 1: + e = Exception(f'user(id={apiuser.userid}) not found in users') + exception(f'{e}, {format_exc()}') + raise e + return users[0] + +asunc def build_beardata(appid, apikey, secretkey): + t = time() + txt = f'{t}:{apikey} + cyber = aes_encrypt_ecb(secretkey, txt) + return f'Bear {appid}-:-{cyber}' + +async def get_user_from_bear_data(self, bear_data): + if not bear_data[:5] == 'Bear ': + return None + bear_data = bear_data[5:] + appid, cyber = bear_data.split('-:-') + db = DBPools() + dbname = get_dbname() + async with db.sqlorContext(dbname) as sor: + secretkey = await get_secretkey(sor, appid) + apikey = aes_decrypt_ecb(secretkey, cyber) + userinfo = await get_apikey_user(apikey) + return userinfo + + return None + +def return_error(code): + return { + 'status':'error', + 'errcode': code, + 'errmsg': return_messages.get(code, '未定义信息') + } + +def return_success(data): + return { + 'status':'success', + 'data':data + } + +async def sync_user(request, params_kw, *args, **kw): + dappid = params_kw.dappid + db = DBPools() + dbname = get_dbname() + async with db.sqlorContext(dbname) as sor: + ret_users = [] + for o in params_ke.organizations: + for u in o['users']: + exists = check_dorgid_exists(sor, dappid, o['id']) + if not exists: + orgid = await add_organzation(sor, dappid, o) + if orgid is None: + return return_error(-2) + u['orgid'] = o['id'] + exists = check_duserid_exists(sor, dappid, u) + if exists: + return return_error(-1) + userid = await add_user(sor, u) + if userid is None: + return return_error(-3) + apikey = await add_apikey(sor, dappid, orgid, userid, u) + if apikey is None: + return return_error(-4) + ret_users.append({ + 'id': u['id'], + 'apikey': apikey + }) + return return_success(ret_users) + return return_error(-9) + diff --git a/models/kydownapikey.xlsx b/models/kydownapikey.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f452696f7c2d0f475438e43890b69a646567ba91 GIT binary patch literal 16874 zcmeHuWpLbFvbLFHX2zJAA!cUAIA&&MW@d&MWW@cvln`C!y-p#&S_5HtB zQ>7`5)Xzvd{q*V6ATI?9h6)4$1O)^HLoe2$w=T4kg#P-jisxX%)&LS6`FJ|w-DdHg^$-Y+2Y^PWpT82H&1Se z+K{2+t2JlG1nH7}H;p~rncTJAzXz7m?&c9+&MWFG2;?(3;M1H*Yn!58m{1g|^-3oZ zLbk2SqmLo0OBVMcZcXAz&$fQq_U;^}CPOh0v2Wp;SKJYF)5#D-f=xP8eIu4waWsdS z_?F5Jmz9f>(MV{oK}xtMkGt^F|j z-UTe5$W7G`U!{9>Coh?RZsh&gX!Q!Awib$3BJ0o(n-%W+Exp8xS-#5HIUTUmuLicH zTw^i9{k?JfjXcPB-9A$SnL&hG4sWH%dasR`;=|bI6BmdAZ~EVqfnEeNt9LrVpLV>$USoXgy_u>w+dQ4a7vc(Q_ z?Du~L=-}HMD3JWW5gFxEyAcS0$ZG(e!UBk_V{c^XKu`B`|9=GjU(DLSJbGEYj1(v% zV(^*&8_`G`_YxKHlqJ2$zKr1uFk{+_E_+&RLG#O#K7>ul$|o_ z1hr{OHBaq9LWOXXK{_zY{QO!n0S|WYq{{YnVS;<_txiURjT2Ye`;>qB9jqTq?I|#g zQawoga}hi)2}Z+-n!}Ge2^aUnlT$}x1}e;QIOsoZ)%YSXrU^4ID0i6eNhvW)mv9+>40Df__$SN{~cNt z&bVH}zvT6dJAvP{I^>&3SX9$hzl#gO-f*eaSUGD_co?zhX<7h{CMmH|FOw+3oy#qF zb>e#w$wms(Nb{13+5MxG;i%ZsCPZpjAQ-fK=_95tbuz5cFfJ4_+V9nfOyt3VxFae5kDUjQA z!8>lYQLOwh+W8dgNpp~%hV5KtcrT!;7lMZW{o~%WDV=!fq$Jqj6QSmW-POdteJ6+4 zvcx>G(L=)a7e!o+ObV|ICYfo>tZqfi{S5(M8jU1&v@KmH?fw>i*O@`L_j)1vnVuNr@d;Nw{jL1`PrUPxS?%pN{C8S{(0^9QITli#w84?vrYtoX@m*vRUh~_&6v6&EV zWbO!dX9}FpKaw)pf7bCl^W-@P?T7D6$i@5g^v#R89cOWV%nI?b8)t8h+b2lZ5R=Sb znQIASmcM@>1SUJxJJ!m=F6*oQfnQ%lO@}2j!MpO4Suo4Rd6Ik_CyEXY%_VZx0(}&c zaX-4CvSw|_Jt7+RsGG1tE>QTfiKA?5}o5g-z zIkv=o`w3-i>PywFGn_j&L_hcX58vqxAcU9vfV;O1I1}mdr876k{#C3Uqw#sqZmU$i z{1vtj&>Mr&n#Sgr8&7`oIUBd%v0ng2^gqdvw3`8c0wBWyfDD+w$>3mWWaQ{T|Lcq8 zrQ_2x8eiztvu)_RR`+Y_K*Z`=lgc zAL#2Y!S3DhMuDL%&{5zdc$gRxG{1uqbQ|qJ%vsDvBG?$SHlrB}>NXaxTdL1912=Yy z!#iJu*c@#E?6ajz#eN+5ktk_c?6sLbs$Dy?hM78a^;sLm`1cAdx#7?LTP9FDz>88>PL^VEW{LGl3eLwrB!Y$S$!S^9EQudKp~he# z$f8$(on0$_8P`!!^w-*wJ`ofDVlp~^V#1OiiBNF#YSYzYV7@`v4BVa(C-(!codgCm>|@OeWR&Ty>OQA%6mKTn)7Fs-PD`KVr30OC z#n-dEK!RgH6A3S_X7L_hU39R7Xrw}#ZMGtU`&V~$EGzZkB}sh3hS*)RV_ zxV^EjD+U_RhHb3wUS8o&y8dXVR-dhXv^9;dal0(UA-||^K2_rmB__zoM%K)@GRMrb9y7F(dmx6VU%v`8{*F#B?mk zG|DS4G}my2Xa2YjP|bw zVHuHu>0&_ay(kUj^hFb1W?5;pCvpukB`5fL)n)kA)kBM@<<2AGO`SQgoX7f*xQDK$ z2$b_l^_G-F2z^eKkVV?yU08*HQrzw*+|g-o7vdtao%VM(Z}@{NdciJgy9_nfnpa4b z(RJLOIpfJ`R*!!>UlgzpBnW~60a-!+SBkLygCc|0fV&MoOL~M)K3fOd7Zm2FRheBa zDH&eiK+)eIs~c5R@w$r^f)@XXm~0@|cfrnlaW-j~kEY>wHI<(EWhD@qp$mO##NqMv z_D54;52Q8Bw=%y>?|`C&i=AFmtCcP_AV0#+`%G1$87zZO$~jGEi`a1A66ehD&u2%| zD)7$p77Eag$Oc)bKVmnN8J?mB(@IgUcZL^2pwuHmhC`05sa4-{r=u6Gv$#YUtstq+ zho(x9b-RET3P&8fS(j}w2RYeH0b>|$Ron6%LfVGLSkT-iMcu^E1> zE!cXL>nZ@<)g{{kK2>PDQk1OFRJB1k`V8G-t#{$lWJwv3`AYg$9^il-Qjl=HWjo=0 z;HoUnv!RY=C%=15H;O+6Y_z37l7j$k;iH@IwLh&cqVYV^4q4b$o-mIIs^1J;NuH|c z?%^62AX%P7=>yZuQo^wgfJnEE6 zGT9EjcPci&h4nJI|9s(9cgf~__WAegVTl%i>5_*Nu0Xa2q7Dt6Sc{^@@Si~Ov|1#X zAuUjtoYv|+-5uQ=ol#Y$xc7A2SJ7W1`$*I?Op&`UyCc9`4WlY!<(4CK>t_^5eG_Nf z^n;KC!DuY^)?yxtJZfS|I>=t^wNPTMv=7e5M#_%8(sG-&qv(RxpDRH)+Ke~1IK(9S zEbg$_8w*x}h2R(4|6DL9W?vi7f&l^bz5B1cWBUj1WMY;GfANk0@eXXuHNPjkrlelm z$wpqSdUYg~v%5=eBW+u} zxZ~z(Lw`_|cWFTu_6$55Evb{UVQ=wXNQ>Ls-xu7EL9nkpN0H|j)U2xNg&R7rURm8s z)f);%7cAYMb)83Ya(qqw4ol^=mVDnmAW2`jz^!+MgdQ`zwAa;_0J4MV3@;8&mIhn|y)>Ai+D*WzE9 zc@MiI6v?EOsYqkq^F>+xya!G%vvrY^&qeog8A zI=3{pqwk#g3lX%#C!lW;FHByPn7yAn0}VnV6IB6QQi%q&r#4E{lQ6Ywbk4+Ocuz!Uk7N zXOr)HpsX){SOn$f>$tI14k+d zL#6rlMZtDb_Y~{}3|>!6Q?0I&B5F5!s6@E$_*z!=wab+hiXpzk`8rgg5-HkEL?6v* z=+izHF@0R4^Mxuu-*N!yh~w&Rm4FM19lIjwFIHW!(W!~PZJY--aIf5@QXiS{S2=E zS_(Rv8d(|9|JpPDv@XXQaxplps2wC1c%lwP63$me8mw9;yK)%L4du;d3Nd4m%v*iT z_zPp!4nikL(9jC<^x~ngkYLK@WU&;VjinSQ6+1x2vkm)JIV`p66$NDIu*T0m@O9ih zdw7opMKqus;_1^tNpX9he4M?r#jcDkQ0VXA#r3pZy$cjJ3#E{<>;J5`p|kAy)&^@T z)W^|@KTxC(>h!EWWSOss1Pn)F7j485FIS>(BpF#YB8!gVa_xEL0@ucUvNUYU})OD;wc{S;)PybEZ(~d zs{;>IXlQyaZxx^Cq1_;u#Z*{@Cc(K_oc-~S)^v!nbJv+X*k}oJM^Ww$r4tpv%5+ zC&1}7UEd8|ybF=jv{-2ln$N*q``Fb`qSfX;++`szEy1NBsD?9obE;nlZaA_Zjk0Pz z16f|zbcqbUAa9tGu0NvKL^Y4>7;ym%gc?gMp(r=T#3Kq^V27c=wAr&nqChjtVhT#K z<;9B{T1dp2PYxo>v~a;UglHM5cofmk*XsH_;c;=_d66a7@8Zqd?s0cNCf7tKWeZst zM|uC;GXD1Xh;lX_vc}VKSBOI|{d~sf{kYvgzs&zbtWZR*!~MKJA5!kj=l1x?1O6Ue zj0A<36dHZi$a7oU0J=`XbCW!6A=Z3haZw1^`pm|;(cu1 zK+8}8Z2R~zUS2j4JcTyaDGr#{25%PBH&BQ4_es!stI|y*$tesqcUzIsNOLrxJ=Paa zf>TO^Pk2`JB@5`}W1}?={$*+#uK}nlLetk&!P-?H^Hv$Jxr1-t?%>+Y=|6v=W z(avtXdEnM?d&WnRMA(kp{E#cR4gw?3;VZC$z5iNi+Fy<7J%;dvPPZvO?3y_k6Bdb} zpV)cO_9bIbd_+a8YdF>Sn*zd7JNoB|at~j#>hZ4Dqq14$khFvl{%YI`ws5^L~%D9W76;B}~!?3QIc9{(QtB)faS3gtP}gUyx8EAV|84PbSf? zHcVgb_a$AZ)~b$`FtA~+k!@mV$ru-G1)d2%#*T2b5{KlGOBB?1!{M84`|M@~f@-`a z%m#00H;IjK(KEI`szt5&kRK6}ZLiXB8y0e75>05?NC!%gnQY5$UCvmpC+;MT=vBCW zyc_&Hsb*^a=Sz_zDoFU+kGg#0up1PL;I}$zE7MYSmze_TMx(XrA}TWMY3)tKHtH(q z3d1Ft%}z^%lHV-o8{v^>HOOR(o9Pu0;iiWMX{Hl*)-OWT-eI=`0Pt5j{fzr8Sx-CRhmm+(M|C_6Os^|6y4l2KGFA8ws(O-!lTV&_uZlE5$|MI|uNe#nA2~PC@2%Nyo5|UZmaRwe}%3L7uwM*SBN(6kIf(wgD=reN0OLyta8Hmu{6_Qq)q|=d z#KF8&3TAE`C?&i3vMx@vNV(+_a3Yz*Z*NANp+T5h(t012wEXkp^!ADqbYEWNIX7~l z`ulHkQHYbd;(Mtl8`_dYs^g0TADb+=#GrFn(l`TE1X?c~Gvn>AV#c%cIvMOGw z7jXGipXW!uly^c^l;|XjGrT&dOkt6|Hlb0n%KN(^&rvcY8f7G(_2M;n7~xI|J|+ey zppmJb99^vnaT{VJ^7!6OWaew0XI1t?ElC0Sz*ko6zsT)D%5jw{J}M^94|`UrgI||1bmxf!<)d8W|l8)-#3_>)U@gGAB!;HR!>m zxXybv739*;^#?35h|Lm)s-3cFFEORh=IJ>a)<0rJL*iRYojS^6HIRai3PLw;iW3FmZoxqTSTNNaFDy-qwb{AR#M7`Yo2)~!JjP~2-NDCM@b8C0`H z9x44DsV=UYVhm@RgFzMp9)AEFc>KEt_I4E0-fDpvgeq1G1;+@Fv|iDGCx)HtwUqJt z1LlGNmcc34Zk*+9>H)D}RAg^SVz);OK0A|&8aiyhNc_b+0M3;U{(N33a<&;vP;b17tD#+99 zHm6<^hT+@tHGwfvSCTpK}ABwo)jO0XY~mwt2IwI?ZJE!>MLHIGZPnaAwPczwTxh5el%T~`s9AGa`+D= zbAr+~?aQ$8hyYHy}e&a1;eJEf@ziEw!& z0phUVYRmL_r@&p)(7PpL=OWts5x0l6p)2HQ&77A1Rn>#|&_$%-i?9uiC~gQ6jp}yI zw|%z6X5ntW1#;Hnn*!T|q|7z263GpSQ0^0%rgQ!XSgeSqr$O4BVzJ1=18V4IUsbzD zpjD@k`S>9EjUl#71fAAba152Nlc!Fqy~|~D@rDj6^~tDVT1RbicPvTqqvb2R z#!Q*=ZQENYA#^g4pIbdmi8Exf!{Q8IvZ^nrH3ttR?}-MhqcRWY(x zz|FrWpL63=GEDqjvr*0bh?2-o!QH*Te#$z+SHZrLHI<^teTFM%cM{zD)tn4*IYq4d zWS_V3hIjSItDT_zC@_m`I}RqA)~83>YTFI;LR8onA<_|O7U<1!8HutW1$g@Frd_!x zsa_{LdjD;b-&IVge-Y2-79rWtD!zmo?!scS+*v_4&|S(6!U2OknN`tnP<^Tvii1@S zv*qjU*1Nn{b;tTU_2bYabZVPz&krA>N3G>CH(8RIT3MbL3v}KfNwBdoq4KtO&ni-o z?1%{@@9hS-j=?}O+%f2cP|jg=hW+6DnqAmF@&7xm5!U3I3#}VldbGw=XW!f@hdbi->u&@)?vQvP0F|ysU>wvmS~+CdTe&P_usgkIlh3fV!!A4APU`osNGbjG}xd% zjb@~LX0AQ3d9XdJDITN-m!ta0SE=-}Z>WK47OPn8Y+-{%r8>5W7ql&U#34QY$<~0} z*>=$aWK?c?J1F{S?Xpc#ZU&Vjd|6(IAYI0R(owIl8kI|6%UO?&c2$c#6}S!G-gsJ> zshH*+jX>-nnjfbbDeud})0&Uh*FrXRG=A$EJJi&=^hMQpC8$~r$H>V(M;l5u8+^qK z1KEXdlZSk=dj=B-qmkKzStvi;N+QT(w!wF)MXJJ^CSxG4?e#eSl0y?Q>se-~uP!b~xT(al3ZB&Fm)wOn(>5iK;% z?INat*jce_H5;xJ7Z+}5>wXyN0%4u1%m;C4g4pxH9}%%9p925MZo5f9x#jKzDf2U; z03M94519(YN`5IPuW-9Yx(wDJ>vl}uQIwl`Q_x$|3^vuVWx7IZG6=JhKr>!<)`U|| zC#kqij)0>GY>H+*>oDV?)(NDM1srQ&Kps$ykehtH-L9UFW)Yzs(0i zJE52cOO*!_LfqUnG1ap)NZPttn~js?6X{t79`+iyECXY2WuWLv_}O*7TKJDXosS1? z@3IHA5a94+H@THNC?CSV8oeal)1bb6l$2Seik~i#tFno=jotd9$736N_Juq1S?ST6 zx>L8B@1u+7TgjH;fH&`1*P95<8CuC}C0pU4k=p08siwH_cF1%{@F#xgkh~B3cnw_r z?Oj^CDBJ>{dA*KqM04a8smp z&UD^?C3xd!(zF*pS3RU{i)&Vm%kh3*to63Bw2YPPpv%$eo~A;RnV?U(x^lH^x;`1m z5_4uC&czG43c`cHxa!r%YH9blI9i{(MRTctjEA-whkXwokdbAcW!0&3V*!mVjeUPp zME)ILKjx+CiRt>I2dDi9Zp^KL=)U}kPr=z8n2=Y)wpj3$A#$xtP0@R-4Z@(jnWjU~ z`FUF<2BwWLq@CBWvK)9QvOWQyUts?(m&$F$B-IJ98-jo|63IX8$Irrof96vEQMvN# zfa#~3@T+bmFs2ibq(Bw91AP^8^+=ctf)i3=CvH^P1J!?Agjh<6y+eKRsKGV*zO!RH zzQdOB#8Zr83?D}`(+m={ZGd4~dG4`D+aXZJakz{MP0JIjH%-@`4k{}v8P*@Gjs{y5 zq(J(D+3nr4P!$bb9Lu}AAQ9%qF!&IGGf`GzZgr^xSxYZlcSf`Ar53>TK~dxNINFPV z$2z}bO#E^@P=Yg7mp4zGb3o+e(pO*L$mKTM!V4bki`B^R)h%G9^q<*e^zq`Zae#Z& z3He_`_P>H^nF(t)fRKIv8u^J2e{27bZ%1?rndTN~<@D3FpT{vj148!r>!d3)Z(boN z+)0-^%X=QS{gzLB)nGl>6fZM+=aWnR`~fNoKh@v@_Cw^3rJ9z;dH>~pC6X!NMNmRYFN(P?CUzv6QODY6Y&S9@%(3aMltH48=Gaht9V@Aw zwqV;?ztH5zD30C(7;L{0Mq3%oBR%g2=HrBko;~ACkK9rtGRAH_wH`t3iI~An#zMylMrcws=oiESki0Yu@1Or(Hj$ zfg|amB3F@V1|Nm03?K+~@B!CQ4AyYS*-%n;KGearCx))N<%`Xt971(=V-ltYAlYN& zJ{7{^Yy*lN|FyoVrW_NOp|z8sk*KYq9HLjFs8(T8R-~X4AEAb*E|X3?wu~3>kLI65 z)+*E|>=+sQE(+L*@?lZ!1=5&=Qtd_3m;_So`O}!drA$LMgPvlNltlxFEmCO^a}G|S zj>@D;jv%S}wr#^HgWScZVWq!3hWY~d_OHK>R9KSjW`KK1LcCZkY?(GMudO2_^6No4 z%axiBC8Y}+4o7^8K47Cm7T@lSmMh!J+)`QcRr*@WJ#KF6+BSNh%Is;T(uaq-o}Gk% zjf?S6lEm#q{UY1)J+g#x>%w#}ZN6pKQOp$5aclvU(Eo!UkPQAgm00*t4a(z zaL5Q(1@o&WYD&b7XM1G)&X-VQ1PqBOL!TdoX51u=Onf9(uDLtm$TAt6 zRfM6Q}Nq12`Se3iQ5ohCdbbiBMZqJ^RY9eEppy-$t8l&p zGgkqBwnt77FO3T&VWfH$s$%TrEpp{)flrNcW0R=9PDgIK=uGETBIko5&qCb$G|>N+ zY?uYM_bL8W%zj$J_LM9k;<$Ik3N}K3ysh`Vm3Z!S0OvPRJ(E_f0~p|fbP9)HeMJxds^ja9#{}4mwH+iXr5TGmze216=>F2 zKxcaJdA`TT&wJXS7B#SyC`w0(C_GY1ZXy ztdB;FF6vblY$8=z$)r))Qx&dMrr6U((XBt<2bH`P+z4N(8)lGHq@ENSq@XH12mZcx ze=FNk9q^+H?r?dN)snfpQB0ugi+sd3rqOomSgy#PC5tba?5BwBt$M3+Xc6+G#JJo%cvvQCy(jWuaA?W-!-#bp6dQEndp2XaaGTvwI(nTk2X2~9Rw>=Tm!_P z;9k`lO)FTQDI5v;L52z>*$)aNJjP8aCJD#Lb{AXB-ku6;v+Ad1mbx!>`;&LZ*Gx=G zAO{s{`D&;AdPdpEdF{>{HaX+u1D<>9kO-k^nR=a{lMk|D`>3RFp>Y+&o$!}3G~IB>dnsKVKPNbF6Xq;V}x41Y^XAOdbz=6H|&Jga#SGO)l5@r>vbia+07xI zfd6bH>n@z6Xug;oGeRReY0faQkrxyvI3Jd*lwVt@>po_OYr5_REweumNGf8SQJ@uk zoc*rLox8$LGqpg4%oVs=(GwzsK$G__X6?*-b(}CVDc~LGajD;6znjySkQdPsXqzTR zXFd8sQHzO+1jsB|F|yCCR}SR}(R~gd-b_EW?JK!}DX_Ga(EmQSS?4~y39XqFoIqp<6Q+!+Q{Wg6)tdSz+qY`9|!V%Amu9X1q%(Ke-zjZ}D74INH0n_5o zVk$t_5U`<*fxNwqtpmM*lY^s;)ldHu&~)&BCDQ{B0UYCw^QdM%T4a+^vD<$OZ{Ni(W{h2vPgzYD6?M@aVM5xhG!kc3M zijWUOMCZBlLVQ@XRE;nQ4L2w6Je>PrFbd8Ikr&m@as6o-Z=Y$D&k`_?QX~6{d3z?a zDzU@{MNIC?0^w7U?PDH}0~7{c?ar5|Q_gkl8J?%c2oOr6oGfkwDs+_v;L)DI$6dV&NWx>!kPH32RPX@iV75^T9>noG z=f$P6@AwAQQD4T=r>#kS!XJed5AEk0%euwc?gcZ)?c;LUb8EeoLR)U0YS@WMAawj; z@nNgPkW(IaVCy1tdk4@drO0^D@{Fx96yuAlfYZqq$O~brfMu^QFDdC3M-@GT zJ?TcOt?}gBp!zr{1yjg5qQruWdAIW z+gH(fUW=KD$Lnn${D;oRamV>@-K-3}W9J-SRau2;rhgzX^McLDVCy(~#g$?|Lk#z4 z?g@5y+-*Tl?_FuUQppXogi$_RCtd3R#_d0stTM|`^U45iHv<$wBmGs|4Q%X<{!iWi zrR+dJp79D&-3+KfYv6A}gB}?L(=w7venZ)~FwPY1LEFx-776jfEiWF^&ZT(aG3L?IiigEx!TGDEwG)^|oChmQdU{+z+wx<4X? z9R*={i8JJsZh$%&mE{BM(WgT<2`WI9miRE-jW){)x!KyMDNhq=?+K$%1CsKqtd_oJ z-7tE3hp)}cRd~(Hmz=8N%4fr5+k%dmC7dm>^(Hj6X!n+BJu#;s_q;IbNLkm;7Q$u^ zE80V`p-YGR;CyJPVEirs#;eXW!$ECR6Vk6AbeTG_6gwh>jo}zK;U+jBma?Va0n5cR zQ^fLyY#{eB&`?!A-F07vhbSA^?eo*6!}i+Ws$$2$RnX5f=YSYAIp7-*f3^i=l^l)i zm5dx6f2NoIJZ7ZRH?uyDTY&*qKn?21r`(!S~Gte`h(d-$`2n!G}5WB+38@N43oM;IVg&cehYI?dKH?k zzm{m2Qf)Mnu>k9fqM(Oh#NqJpIB4=DUBvEKHr5i$1y-emcYB-&^SrTOg5gB^J3lXO`Wgl>FH9zYAc}Kt?w18yW-#0`9F8a6aZ`z~frT!h@-y1Ri zDm@68@&3}5`KRE&x1;@4@EOoO0T`|S(wz1u&YulPzmXIHQ8fV0U)z!X6#lbei#tP=it3x7rVRpI_8%AXawzfm5M{}$y}z3!hVe-`2WM$yLj zh4N=f-k$(}R&V?UFv9!W+xS(>@h8fksomcw(L}#c{v*-*C&Hikqu&S?WdA_;pKQ{f zqJM^te~Xq<{`m-h8%X{W@Xtu>Z@_Y@KLLM@^RKw3?Lvj79gO%S(^L_@b4b!Ujgjd{sQn%|MXAkf1lz1Dy_@;7wLb^_kW82X_bEi g9C8182me1dT3!kqU?PBkkO7}wfO$vw@bl>Z0r*Q!vj6}9 literal 0 HcmV?d00001 diff --git a/models/kydownapp.xlsx b/models/kydownapp.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d02a9f258f5344a30ab01d81ad74eb30f9d35b2e GIT binary patch literal 16602 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%0A%UYM-h9M_YkGXaT&~-#0D)5zl}8_ctxf@>2f} z@bAr%e+3u>IK02KPQD%Z?=5409ry&8&;Q;)_7>-Dlh7X|ML=fkP0P^R!EYNY{tVWH z`=7!8(Pr@$*fBSr~*P; zz_Yxqo_h=Mw$S1afHwZ$KF05|i?=9mS=c`)!9>4N{)3Z!i}02M`hy@v_78;rVT9fe zeVhLMGc=s??N9jIWbj+Sx7pM`fRR*h0e{c)@7(HJl(%`AKPaJq!h^pNliyjIw9+3VO0F&)60RIe6-;Vxw2mja6;2-`n`d{w;?eMo&`42!e e*Y9`m|6`-&rN99u0tg5N@aYAZ_gd~>NB