From 37a6af2e6d36ab514d01a93dbd5be6538a2572c7 Mon Sep 17 00:00:00 2001 From: 1004268 <isaac.pedrozaaguirre@student.unimelb.edu.au> Date: Mon, 21 Oct 2019 20:12:13 +1100 Subject: [PATCH] Max changes --- .../GUI/ChatScreen$1.class | Bin 2140 -> 2505 bytes .../GUI/ChatScreen.class | Bin 6677 -> 7001 bytes .../GUI/PaintGUI$1.class | Bin 4408 -> 4408 bytes .../GUI/PaintGUI.class | Bin 2893 -> 3460 bytes ...ss2-infinitymonkeys-remaster.kotlin_module | Bin 0 -> 16 bytes .../client/ChatUpdate.class | Bin 1564 -> 1626 bytes .../client/Client.class | Bin 3139 -> 3672 bytes .../client/ClientUpdate.class | Bin 925 -> 1439 bytes .../client/DrawingUpdate.class | Bin 936 -> 1231 bytes .../remote/IChatController.class | Bin 380 -> 479 bytes .../remote/IChatUpdate.class | Bin 374 -> 375 bytes .../remote/IClientController.class | Bin 456 -> 478 bytes .../remote/IClientUpdate.class | Bin 283 -> 343 bytes .../remote/IUpdateController.class | Bin 431 -> 0 bytes .../server/ChatController.class | Bin 2237 -> 2833 bytes .../server/ClientController.class | Bin 2730 -> 3445 bytes .../server/Server.class | Bin 2056 -> 2119 bytes .../server/User.class | Bin 1065 -> 1273 bytes src/GUI/ChatScreen.form | 4 +- src/GUI/ChatScreen.java | 60 +++++++++--------- src/client/ChatUpdate.java | 17 ++++- src/client/Client.java | 49 ++++++++++++-- src/client/ClientUpdate.java | 26 +++++++- src/remote/IChatController.java | 1 + src/remote/IChatUpdate.java | 2 +- src/remote/IClientController.java | 2 +- src/remote/IClientUpdate.java | 2 + src/server/ChatController.java | 20 +++++- src/server/ClientController.java | 31 +++++++-- src/server/User.java | 2 +- 30 files changed, 168 insertions(+), 48 deletions(-) create mode 100644 out/production/comp90015-dsass2-infinitymonkeys-remaster/META-INF/comp90015-dsass2-infinitymonkeys-remaster.kotlin_module delete mode 100644 out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IUpdateController.class diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/ChatScreen$1.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/ChatScreen$1.class index 7c1974a1de9a270cac93185b5febe95a045199fc..bf673f8ea6d84ed6e9fd40503c8a4767a75048d6 100644 GIT binary patch delta 1140 zcmca3a8kJb)W2Q(7#J8#7-n!X$TB!_F~~7Eb1}FuxN<Q#GPr>VcP<7G22TzKFA(hw z67k_;@MZAhWbkJQ;9v;kVhCag1__67F@!RNflLVJV2I#ih-8QYDU9Z3h+&8Y5pnDc z@mvgI3<)6Bi6FToF%E`gZiW<wR4xX8hBS7DbasXec81J}m8aO*O7cUCQ;R0&GKx=j zX4IM7!q_j6#m<n;&JYh)m&4AGJ6V~@xIT}EL4iS$he3%UpPeCxhoOL>kcXj&p_qrE zgrSt3p^S&2oS}k|fq{pilA(%+p_-wFouQV8p^l-RouPq;p^>49kwG{(H7`XWskEdd zKTn~cD7CmaHHDp_nTMeTq@|Uijh&&LhoJ*xawo_zX2+Zyc7`k-hAsx%ZXSjnh6;9u zY#xSQhCUvKeufE*3=&z1Wr_MlxtaPwsk!+jsjd~tsRbpO`FT7H6B+V(7$$+-H<@9| z<hM+++_^jqQ$hAjW0*c!l-Xl)6|>IdSY}y9iOKwI5}WrkpJC+VN=!~pEiP6uHZWjh z(46eRq7d(#pPQ8LlwV=Z$RG-`twO)JJTos{-wP(e$iSbTS`wU^lbT$Tn&MfKn#;(* zQIa2AQk0pO&d9))T3DKxQ_RR9s^J6Dub-2cm#*)hl$DxXVyzi9xs%mbOsF_DFD0NT zvn;VB)i<@cI59nyk->8EMi$}82UvwBA7C|LG@1O7)n8VYL5_iuL7st8KmZgQ3=9lR z3=9lP49X0Q3@Vdj*`&Qy85kJY7#JBC7`z$O7#JADz$&;H)EP7xK!6LZkCB0qL5o2f zq>F)p@f-sS11kdq!%^*R49r?v7#Mdjuq<P!nS7W{s~*DT+s44ZjX}VQMUq8Ga2tcr zOa=*Ehz#d824S6@3?j@7;maAskpv}Kbapa`vVerSK>D^Zh%aYwK-eI$jKK(Qgrx5# z25up#Z4A6Ra53SX4AM;X49q(iWR^2<_~~wA5Z}na#9+Ws#Zb#2#;|~455s;2F$QJ^ zke8zv#26SD{22Hc0vIG20vS{pf*1@KLK!R=!WrBdA{hc1q8ZW{;u)$KQW<I)k{Ie4 zQW#no(iqwq(ix^QWHKyZ$YEH)kjt=xA&+4XLovgCh608I3`Gp}M;J=M;TXig!Qjqd z%%H=d%fP}=&%nx{$Dq%^!XU|z&0xTw3wBrtgCT<v12e+`1{Sa^Gs6M~6$WDl6L1_H zg~!2B22%zz21W*R1_lOw2KIlTENQ{cV9Cy4@ryy&iJigfCj%SPe+F{~W>a<sYjy@3 vb_QDpMs^0PUkoe^%nWwmc(-S8U|?WiVQ^$%V9;P-VBlh4WRL|#F#`ht8HD0v delta 846 zcmX>pd`F=E)W2Q(7#J8#7#cVk#2Ku)7$g{MxEO31?6?@L80<lW0~doMgA)gXGl+Hp ziMVnxxG}hMGI%g}axi#tF?cihfJA(`8T=Uh*%<=37z7vsK?;LF!oeI2A>0h13}IXh z9t`2^3=!-Mk?agnj0|ig8JQDjADLXss3R=ola*MOsGpOVm#!aNQk0pOZasN9<3xc7 zc7|wnh8T8+Saya0c80jg9!$ng@jMJt4AMLdG7Jgq4ADFci3~|R49N^BJPfG}Y3vN? zJPa8OnT!k!JPcV3**pw647uzKc{~jH3<c~Ag**&J48@c8GD!%R@Gz8u<jWW`*%@Ma z7|IzcCi61O@>Vh=@Gw+?jH_m-nQYE1%N@tVPzzF7$51~xp4nsaWoFsQ%b9gHe_(#f zI5~yQdlI`8qw!>EcK>>D1_=g621y1+0RfO385kIt7#J927-Sh38RQrk80;9Bz#?2) z+FKbIwYD=bZ3L^4XJBApV_;-pVDMm2U|?VngQ#LqWKd=R0WPp<j0}tnDh#R+vlzP> zm>F0Z7#OB%Z)0HA+QPuNgMo!*8H3N{x9nQ=x)1@*Z47)mI~n+y8N!z{a9OcPvTS1z zT+ZNt&?2;q!3eHa*mn~Hw~)v-23{Sw7~f6?Q6>iF9Sma2894lOw=oEAWME=2VDMt_ zWe{K}VCZ4!XAoduW&nA?k3pD$fx(-Bub#n|L6X6bL6yOu!GIx%!Ga-}!HXe+!IvSF z!Ji?VA%r24A)FzKA(bJ9p@1Qtp@JcSp@Sijp@$)jp`Rg{VFE)c!xV-La9DUSurv5G zurjDIs57uINHSP6XfSAkouI;?#h}f=%rJq01uV<VP{5$Vpu?ccPzVb4sqo;N%Am)f z&%nrFz`(#@#K8KW!Iy!BoxzZu!HAu~n4Q6dfsviT^d|!w(|-nY24<Ly8Cdui0}BH) igE=^wEEp^q7#LU>tQZ&=lo%KoxEL52#6j`HzyJWkON2fE diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/ChatScreen.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/ChatScreen.class index 4a465635ebcb3e55802d5a8bd8dd0b4bd39c2976..f4e30aaffc4a45f3d431149a0acbc881b95b8b2e 100644 GIT binary patch literal 7001 zcmX^0Z`VEs1_l$x2u=n?hIkN>03s4WL=uQd=3-D{NMUD4<zirGNCSzagNO_+hD?Sm zE{1G|91u5`iy@C8pPiwAgQ1X%fuErWBv=e0N<iFFE(S%0G7zgAL{xx?N)S=S#Zb*q z!^Kd`P{+<t&&43a&;TMDK{}g2L^C@>3p+zABLk0TUS4XEb53G$acVIm16x62UTTgJ zBZG)fR$^IVg?@2)W?s6!R{%)ZnvsF4I5jWDskEddKaY_?6jcpG*qV`nC#5J6qz$Zz zk%2qEBqOz`7|Ig`nc$mRT%4Gm8j|mvpPQ8LlwZNfAdYGnOv0LxfiF2DvBV{_xF9F7 z5}VSH)QS?vqSQodMh2nM;?$zx)ST4h5|{yu47}Ny$=Uv;B@p*9GKduv<>%&?q=w}C zCgvrkrxw8^ct93;<`tBdfUS{0brHxKx6IU>6p%eAp72RbO3lFtGO(yMBZFWr#Fk>e z#N1S{AR_~BWqxT95}zN&hkBEdK^R#VT$DSv668~8Q1ZgmK>3^?_e0r2sTG+eAsLy) zLHYT)Fb{GSmS)0(fi<ltF*g;%*=`_FYeojP<ebdZyb?wRejf-+-x(|bijc(QlFa-( zpUmQt)V$OpMh1CsNa-h*m*}UKrRJ6BJEAB6nP!ujmsw)R$RMPFW}IdiBLj<beo89H zrp&xlztY^K)S{5Yq?}Yn1|gsP<iwn?#G*_PA1cUFl95@=$ROb39_p#@oRL@(oLrQe zng@!O<f7EXlGIR7=ltA){Jhk>l43>%W(|-Pg6XLxAhpn-1V^x>h9=nI@Kg?pVo>;6 zGcrh|r<Me#=A~dssTkT|NzIy(fj>R9#04ewi=kTrjv!E0N=!~pEiP6uFfd?bP}e~B z4Vu#+QE1J`z*J$t$iM~FYY5V-MMy8mTd<T1(`f|Ksfa}<dSt^i7=tuuV$pz7P9OyZ zOrr@%BUf;KX;E^jTP7%0`9To@i8MWsZXO0326Y|=Ee35K1_uU59tJ}OBOV4dkeCaD z4<myBYDB9T@-VnCwDB-FF*x%um@}BLGqm$CbTD+XGj#DVbTjnuFxWDvvorMaF!V9> zGcpK)?10BHIDIoRa61+h<YXo%f)X;wxE>w`I|h3m1{DTX9)<}F6L}cC8GLvcCNWIr zVVDA9O=XzI!!Vs;8au-b9)_6=v)CDC^DxX|n9In(19DzKVrE{6d#ESKELR?ec?>~3 z3>qM_bQp9Q8Tdd-5WZ$)5CFMJKPNFSUEe<`D>b=<kwF+UY{M8Ccv0emk%2oswIsAS z6<l~QGKfGE7sRCClA_GKbWlD3nGW|cw9H{IPAvhY1V#o?4REqY(FDpP!YJAxDUOjr zFfk<sH9s>lC_zoYnd3pm@fD|*IOpe;q~?`?(mW%BIFc@qL}F%MYLPWasYG#ViA!o) zVrfo^b54G7s((Rh5jbiX8CWztK`K}Z5|gtT8F-3QOM+61Gpj)50Z1|mB*|5rS`wC7 zoCz*7q>z0P4627hOEPmZOEN+A8z}gK^7Ek%(nWC)w8*eV%Xu*6){G3I$VPj?Bp4Y4 z5YC5%ngqmXcqBl?!Jg$zPc3oJ$xlkmVPxP{QBf&QEh#Ms^;A(&;bEB1-~+1D7oewF zPyptzGc4j_Sj>>Z$e@>;pR1plSCX2OlbNMon(2~SoSB}NTBM(xUzDovUX+>QlUSKw zS^}-$*cp~GGVp^O4=$rU^NLeTirE>KGcvGiczSwzYKDQ5?Mg0&6%4Bw8Kg8kJs}AM z6ul6|)}EeGQ4nQoxEPi(tc5xdY#ux=*%{U|GH@2BmOyN0WRQl00$3G94C*3lkXaiU zHgPd*VAzaomP=-CYF=?>ejYo+Rz?O^4VdG$b1`gV*ulsk2J!_wRN>`3JHswU22g_Y zO{~bwEzJ$itV%^qaBzdcR_|fh%f+ypVINdeW*$rv55ob7)ImtJ1{9^Hr4|*XrhrW3 zVK@wtJi^1E$)E~qNF8Hj&><KZ&iQ%8B}JeTqL`iG1S5kxIMhKQj|gXk`-l|-1)&SW zDK3VS45t|xm=jY{7#TE?0vsMV)({hsN*iz(oMku%3jXsv43-eTTx4Wm_pMX_)qorf zml+u(k;B?4zbGZO$SpCsB)_PVo#84YgAk;)4aqFYNlk%BGcpuH8~}@<B(N@hh%B-@ zpk)<uN^{H4D}gEjB|PW+octoR%m_6O*-C33hU*MBxEQW6+=Qe(h+T{fa`;>V3cK43 zcR*?2E~vGg!oy(7U;>KJ2aF8t>8T|k$1pMo!pc{WgFr&oJPeN*9)ol|fn;8&QWX^y zMg|jzjVR?Rh6f>~3phtW4SdG%9F*r@FfxFOXpkVdnFI=agfftWUopG}+5Co)fghTU z)Qc5Btw<{lhIfn%%6QXZa6w{nY7slb2QG$>3@JPeW)SawW@O-s%r7m1ne&yALDVC) zC{-anKebo^RMSB1;9&U9!(atTC_hnL5R#vtQ_R8e8@+slwFTH2{&F$=1KFv^pv}pk z$jHFRpaAk6ERn!UerR97H$Npchn<m$i;)>r)^QZ4mVkvYq7-HUSQeC|8Ce<GxETI1 zvV*!!DLf4N4C)~JxEL8Yyfc%t75qy}I2d^t8BnSS$0ShROoq0L*%|q`82K4;co+;I zngtmdgaRNP28EJ*1!%x?FbeZ9Sb&3&QIwHE3=w3GDY=<>urOm3XJp`Wt;j4<05!!G zKy7gjMoC5np1{(~5`}=G{Pd#4Tn<KQ9tLZ0$TG?@GH`<036M<4D9^~i1CAYNGn9i- zk&%G~)Gp;<RAyulM-D}=;N+tGoE%V1!Op14#i#}fJk%NsRQ-c;H#?&S7o#RfULM(m zlGKV4eJ_wAc+tVmsLja0U7T9tnvz)ps&jc5bs45{G3qetLBxGB^HRf$5({`34M5_W zjE0O1{NU<1wY(s|s3a^iwH&n|hMNtJF=Iv(E=Dy*Q}mJ@<O*<`m7UR?i_rp<dW<2# zZN<nS015#GXqYI3<Xdqt+AuQkKpWoBu(M-i;05^(o`={O9T*wJR8&;bQ%gW~H{2oM z%qs=W>aaxV1(&vlln9`V#>42s(8<N<$mojj6S!D~7iXY+>cZ#_QscqMz?Gbs2kmiy z8Y|A4Q9O)ZjNTwwA4UcaP#>eD64WGS*3k6iVf1742T27$ECkm$j6o2wV3al^#5#7y zP(}vc;F84TY~REJaPNpgkwK9`iGhJZoPiP4mStdIU;?$I!L$a0Dwx)U(pn7KV7?B6 zE|}JX^7R?i!F&TKZOC8*<{LAZfN4`GZ3d;yp|k~*wuG8*1*NT_v<=ieTPSVEU=KFW zfx(dh1e_S085kIN85kK{7+e_`8Qd5c7(OttGB7bPFtliGXJFIX&A=Y1rL~=5;dTa& ztqh!6+FKczwYD&DX>ViT-p0VAwS|FKYYPMCHU>VeEexzM=57Z5NFjmk41!x3gtWGR zvG6tq5v}bEq988YHU=>ey^TQ}L@{q;kO0vv+ZZH4rtDyl0#Vx-q&I?H>(0QyV8_7E zz`&rvz{23gAi|)@AjzP`pu(WTpwFPoV8x)v;Lf1W5X4}>5XNB05XWG|kjh}pkjr4g zP|9G&(9B@Y;K9JaAO`UlgC~O*$ny*>puP_SBLfqt=K=M-BLfQqBLf42u-0w{nMkcI z49wdZWVbQMZDo*0IED*skQIXvgEiP-9*7pG!Hf*P41Q4K^cg^9F9SGa6gI$p!v@x1 zhoqSmuGya<0E=cObj{9KH3u>TVbLs)uGt+^vj7J}Fhd9y&8+B}c~CTmf&x>3gCUF| z9E)Za;xtDvL}Jm*Oq}K@hG;CBF#-&`vtzLOnUNTqnLvF9h|R3E41x@@3=FI;pd`MV zVR7Vkh9y3r%p$D4n_*cbE9-8C6_L!$%*@*vRx>eysCC;IwrKBW*cQpew4Gt+HirGk zoI_xaAj<|prU<a?QK*@|S~^=9j_cqvQ)f5B$w(F!78YhUHa12^#_bGewlQ3Q>i5&q z-O6xD7o=Z+hXt#nbaX)mFoO+X5nzX#pvx$9g_)U=aR<Y#Z4CEzGh|0@XSi?0q9w_) zmEoZlBZ~l^B+E92r`s4_TCqy99%JB=WRYau#_(2>Md<xD1|D5W7Ld8@%q%Pd9Lykt z;4b?Zxt-yY6`QUk8%Tu!7c&bBGb@V#vg09^v1>`PZ)Nxbv5XyR8HXeX$TD_G4v=N+ zLf^oav4f0a#bO!6Bu*_!&aDhwlAJ<6z{)v6%Gt0e2gjrpmzE^gR)$}aT%dqs#~yCF zAlZ|V0w7aRf?kq~QRolI!?2M17rC9`zZJKZB==TEMoI47jLebS8Ck4&Bzd+ma!7JX za)TVh40a3)D>FO-b~8W%idT|Lk{6@|Y!g~Q<wb61<h0_`lH}XU$Suhy%*eZqQ9zPQ zk`JVT1r)L@Y{*7J)bnde@^57nlH?a=6oIJc2dM{zA2X_YNbm`0NeXOb6q6JXW|RPj zp8!ZX2iVEj;#N>sQV^s<fE(ljtWFlvk`&s?z$hss%qX>uQ9xHx2&4fN3TQ5XxL8<A zQg|x^ucWXrqYPNNFi1HT4?-ePL`za+E2EsG2q*#t*s#Z-4oLcBBr`KB3p1Ml8&cYr z6k!x*R6veHNH~Z}iV8C-ZDZh(6p<7KIRF$T=*b)6U@<L8v8@cOl48P)Dxe@1krV@I z0EHQ<2N~5Ow==3+iA#z|ii1>ugMdwd9mzSn88sufGiq5$Xh}+JWl)fmVA;l~4<?Ny z#U&-SF`DgWw20i!XlW&>B`LX;fkje8QW9hqB=@lhurV`&iXK6RX`sRfo)ICQlG2it z+RA7xDJ9Hk3-Ov1NG~XC(Y*#q$<kVq(pwprBt;~pK?*^sMt}o3<!WtVkhhZ2mXrZW zLxPtDk-H^j7=;<_5rGS;XBip885kJU8JPYv3Nf&;Gbpk%EQX<Mc1A}AhJOq>><k~- z89+P%Mn)$_XGl@ZAc$1u3WLgV1_369XAI9F(u|@EtPJc73=HX#EXNsG88>JjXW*4& z*~aK*#k!oqa5tl4q&Bkv*LFrvD>g|sfy8Z$zB3twCD{ZF!7NT~kTNc)29Rn=R+-rh z>@v$4I6#7dva=c3Wucsq?Tnrv2S7YChk=8g_b-DQ13RPRe+D*)uNcD^8QB>f*%`wa z82&TxVhA#GFgSBCII}Z`{byjokY$0(GX7^^$1jbkn-!rO)CN*!U|`^4U<3yasCg6% IZmq-t0IAi!H2?qr literal 6677 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 diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/PaintGUI$1.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/PaintGUI$1.class index 8b9146bbbc79617544b13a9369add59d22f980de..cc90a9c6246be3e81b09d9081b834ead1f6cc592 100644 GIT binary patch delta 310 zcmdm?v_ombT~5ZJ&G$G1S?j|Y_!uG>q#2?aG#O$TEE!@MY#HJi+!+!WLKu=5A{kN` zk{L1?N*J;j+8DAKx)^d8rZVI*EMO>P*vL@Cu#cgX;S56=!!3q#hBpiq3?CRO8GbWV zF|sk#F^V(PGs-bEG3qe1Fj_IRF^e#CFv~G?GAlB4Gix*SFzYe&F<aC#^fOyCOk{Rt zn8fVCFoijYVJdSd!*u3&h8fIB46~SX7-lo)Gt6bKWSGZX!?1w4jbR~kC&Oaq$qY-F zr!g#JUcj)Nc`?IE=Cur~m^U!2Vcx~CmU%D3dgkK{8<<ZqY+}B`u$lQf!&c^p47->= zG3;SsVA#iUgy8_oIfjEQ7a0z-DBor{!g7z{7|RQW<1DWkPO^MuIK}dV;S4Ji!&z2V PhV!ia43{Sd2)qCQo&HxF delta 310 zcmdm?v_ombT~0>-&G$G1S?fa>_!vSNq!}U@G#MfpEE%F0Y#Cx0+!<mSLKxy1A{i1H zk{Qw%N*K}^+88nzx)?GUrZQwPEMUlE*vOF2u#cgL;S57D!!3pqhBpkQ3?CTE7=AO9 zGqN#MGm10RFv>C1GwLujGFmY-Gm9{^GRrZvF)K23Fl#e(GV3vPGh5U%^e|g9^f9|K z^fP-fOk@sXn8X~)FoijuVJdSH!*u2xh8fKH46~Rk8D=xrFwA9cW0=R>$*_QVGQ&dV zX$*^*7ceYgUd*tJc`d_o<_!!hnRhX)V&2QJhWR+dTIN#>>zS`GY+%05u!;F0!*=FR z3_DpE7<RK9Vc5%Zj$t3mMTP?`%C{K~vfN`h%<_Wa2+M1RV=P}8j<ft=ILXSyaEg_c O;S4K3!-dHK0xtj=-BvvS diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/PaintGUI.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/GUI/PaintGUI.class index ddf219680d1967e28e63035b2ef00d9d5300c260..592ac85cd5cd5ffa4ac44a16db9b3f65232a079d 100644 GIT binary patch delta 1661 zcmX>r)*@Yh>ff$?3=9k=43D@Nq#5ei8R|J08aNmlIT)Ha7@9d4S~wV5IT->N+Bg{6 zIT$)P7&<u^x;PlRIT(647<xGv`ZyT+IT$8zFihlNn8d*_nS)^p2g6hjhG`&8)7cqj zfasa*470cxWEtu}oY^2^4v3h`&QL#(i$RHDK8UvfL@Z=ySj5Gk#;_Q~S;Ee+l#4-= zp$_D<W$X;gxfpa9R)Azyf>^6Stkoda8g_=Y91QEY7>pR!g9JB#SgSY~Hi9^tI2bmA z=q(%!TS4?T4u<U@dItx?PR>Y%0ES&4<9Bl~>;chxIT-e_GwkPJIKai=3Nh^<h;;}= z90n0bK*UiHaSTKp2N5UO8BQ`X@Ob9sr4~8oBo-H^7EhL8l9l61&PXf?PA*DK&0}N` z@Np0I)OUu9SWi}A{Jq(V$(50hy*MMk+&$Ejk%3u5Gi-7#vpjP?L-pkO%s$Lv4B?aC zF*h(rFoaJoWD#dhXULe`%_8fW$&kgvkj;?6!;r&}!N|Y|GCLqKGq1!w)KkTfhasQg z6c0l#Lmm%95JNB{13yUKr6{pHGcVn-C^ZqJpn!)Vl_72NM;0mO(+p=O^RY^a=QEt; zVMt*}=3zL;aGr-D3B<a<aB;Fdt3rJ~!zCVuXoeU@24=t1avp|Q5R=8fAT^JNAr8zA zPAp61VTcE@*+Fat$6_9a1Q3_iIVZn3m4_jbA%=(HGQ$-{23EiPqLK^{=PDxuYjA#P zNd_Z>P*!4DVugM&$d&qDZbgZ?sf-K~!5N7~sVSZc;Tf4FsY&^XMJWowmBl5gxjYP! z3{gA`*BGwzFx+6c$-{7q;WiJ$9frF+4EI1{_Zc4WFg#?q&d9(6@;)qhHeY2mWUOao zkSk6taY;=}EX^tL$<NPr%u8`gP0evhP0lY$EJ;maWMI*V(hOr{;44loan8>xNzE$> zNX$!RWDwWz0XbAZvAjedB$1ezms(^EQp#SOS`wUDmCDG#s^RGg5)my<E%C`uPAtjH z&kIV;Ni4}MOAX0qWMCAZyn#)uK8%rpr#Q7FD784VDlsVs<XwcTz=7spkXi)R4RR0I zNUq}4lCaF;%%q%D21SMd25ANc24MyUP((9;KnO!9h++t12nW*<P&$$!3e1mYhyl~F z3^Da!MjTWi9!e)b=|m`<#E=YDmjb0z8PdS~bcPHtoym{|rn8~^94MX3kjKElz{0@D zkk3%Sz{pU@z`)GIz{<eHz`$gqwVi=cYw}+9(=1wB7*scRa^y1B7cnp}EMm}LU|^7E zU||qo&}I;1=wpy%n8_f;u!KRHVLgKk!!Cv(hGPth45t}X7;Z7BGrVBXV))LW&B(-{ z!zjq0%P7U5$EeDn&uGM8z-Y^0$mqpj#2Ct8%$USr!kEio%2>r<#@NbW&Nzv|f^jZ` zCF3dvE5@x1wu}cE?CKfMGT1ZTWN>19%HYiSk->%WFM}%+CxaW4D1#@H5`!0$9)mZN zHG>aBF#`jG7{nh8B@Cq?-!s{OBY=^Ck)e#C9O7FBeFhMpfq_+P3xmuC1_lNu29O`w z7#JBC82rJ;@POH@AY*tK7#J8CDi|t3x+igqfx`o$_By&+u+l1qYLHR}28Jo%U}j+O z(%Q}78Y$$qoxy!8g9pnF22ZUm3?3lcw=sBun1aj-f=m(H7`#Co#%&BfAewm_gD;3? z+s5DrqFJ^v_-|xjh=Mv-je(Paf#DtlFT;HXL52qmG7OIxG#MT<7&1Izuw;13;K=Zd i!IR-Rk`ui^-T`~J229p61Tru%a4|44D1pL?fdK$Gh+yad delta 1173 zcmZpXJ}YK_>ff$?3=9k=4Ewkkq#5$r845TU3ON{xI2ejK7)m%8N;w$HI2l|S$~hP+ zI2bB97^*lJsyP^HI2dX<80t7C3W(HmFtl+nw1X6NurqXm=q`4KZY~B{hI|mG2SoIO zh(30Pel7+jh6y0fL=Z8FonbN;gBrsW5N9eo!!#}iO@@4sOQy3k%-~|sVVDV$nFV6a z2C?RVSaaDK=5a90=VCBoSis2;<jSxR#GK8+un44NF$cpE5WSRxVHt>C&cUz(M6cvv zSOub2gN$Fp!LSxYuj61?&(5%ck%7lEFE6#oIVZ8WIJJ24B*x#9qZp+&_b|CJPJYBJ z%bdipaWWH&53@Ui$K*hk23b!A4@L%|ti-a!3jN~p%)E4cuYkn7)Epj$D2C|C?^tBh zVi;n17~&YBc^Kjuq8S<Z+(SL}0}?ayO58&|RSbC;k{CAeFeES}@-Rd&L^3k)gXCR` z5<zA;7NsVF6eRO7gfWCOGKhlg(N8Qd(Ra!(N=Ys9NvzB-E#YC<%&=v0A*)n<62n#= zhERqO9)@iU+j$s*L987NI~f^-K^ox>bSf<=$<JeCV0F$(O)LUgu#1PmhrySTf!Qy$ zoQJ^=#ANX=NX_G6@CUPl6U$P07y>|Sb`V>^v6zP;5X5D5&dD!M<zWb7@a55C*v+tq zk%84Ozo;aGhhaCvUPcDi;QZ2(3`PbXkhfsoW@KR2&<xw$#b(G@&!EWQ${@|az#zoH zz~Ii{!2klDP}+;Z8^i@U4ov$o_=0JFC>;Q$1EF*fln!PH0jmpz(qRnYV15KcB$$q3 zhz8R!492lwMjTWi9!e)LBr-5CFf%YRBrzm2FfybtFfem6ure?)Ffdt8_Ts$2sJ&T^ zE0?i8m4Sg_5rYN;1A{CB3j;rcHiG~|AA>l<Oa=*tB@B`b>lvgNb}{%f9Al7UIL)BQ zaGgPg;VFYU!xsh(hW`wjjC>4QjN%O1j7khTjQR|^j8+VKjP4Bjj6n<rjPVSHj9Cmu zjO7f*j7<zCjQtFzjI$Wb7?(4cGj3wAV%*1IUC(%m!G`e~gFWLT1_#D>433Py7@U~c z7@V1e7~GiT8Qht)89bOQ7(5x$7#JADAns>KXUG8gn#mHB<QNzk7#T7dvLL=>&<FDw z7+AHoFvx6RU|?Wk0Qr%PfsuiM!3S&%517pgG6oc!j11WfIaqXSpzFSZt{ZH6E||<? SaARO#;9_88Py#uPfdK%4Z_sxD diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/META-INF/comp90015-dsass2-infinitymonkeys-remaster.kotlin_module b/out/production/comp90015-dsass2-infinitymonkeys-remaster/META-INF/comp90015-dsass2-infinitymonkeys-remaster.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..2983af70661ad375cc499ebc4da5a68ca46c532e GIT binary patch literal 16 RcmZQzU|?ooU|@t|egFVe02KfL literal 0 HcmV?d00001 diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/ChatUpdate.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/ChatUpdate.class index ab22187ac7d4f98f5d6a18a2636745ef64b3cae1..67a49f505beee840b3e57a9e85b034dd23bf2d8c 100644 GIT binary patch delta 804 zcmbQkbBibV)W2Q(7#J8#7=pMM1R3-=83Y*g*%=JD7?>IKI2a5;v=Ik`F$aSQh-u2f zV8+E@&S1gCV98*`#bC`~!@*$7!C=SEV9(Crz|P>v&fqjLe6pZ3BLi1neo1CprE^AN z2_u8X#NVnyQJPVV3_SUzB?YA=!6ikRdFhk&8O1HQ(u(qPopUl%^GX;Q*mF~hixbmR z85uY;ivx->%Mwdc85tO(7#VnjOA?c_eG>~p5|eUL*%@3W`!OaYx$-cGFo-fTh-W31 zCF<uS=B4XHjCLx`%t=WtVr1Y82=WYb3~^P^0NJC!!{El?&d9*5X{Er(z{thJ;KAU@ z$iQT!z|P>s!{E)}!_MH#!{Eo@&(074QX4p#lWDWK0J`yv49psuVUx|6V<#VCDw{l+ zS#PosOLP4d1||kp1_p*m*_jNQyBU}xw==K^v2J5v)859wCd9stflUX*;Mm5%wvB<) zie)*2B2*Pv0T+e>tt|{p+ZedFG4M#TY-8YMS;N4<z|0`Yz`!5|wn&13g+Yozi$RXT zgF%s@KAb_7L5hKa!H$8AL7jn_L6Jd;fd%9q25ANv1`vp3P-akKU<8Y)FeouFfmx~y zY7EQ_9t?s|9qJ4W44e#1T7MX1*%>q#WEmJ3SQr=?<QNzkG#RuQm>47&7#N}$n8DhW z;Et^4LG}$F#FsE<Gl8AW1=ga)punIFcBvScuLO6W64ZUjR%+w162-;<e%w|XFeoq> O5^bdp0|NsSgDwE1f`EMh delta 743 zcmcb`GlwVq)W2Q(7#J8#7=pPN1Q|3r83Y)#xEQn<bhsFF8T8m0^tl*V88ktJ0SAL2 z2ZIraY0Sl7!eGkDV8&q1#bCi;$-!X7!C=kKV8hN}%g$iO&R{<=c(R}aBLi1neo1Cp zrE^AN2_u90#P6#7no*1lTxmu5xz0J6sd*)n^%%uD*mF~hixbmRC)YA2L_6{@h%kt< zGdS@uI5W7gGr00FxG}ghGKgm-mL=-vB<7{-2bUCO=A}E8X6B@%7V$86FnBUDFj*-u zGB9%SFnBR|vorXBM19#A{CF7r83NcD0(lsM7<?z&Gi_#J*3b-_oWfi&nVUI!@*QTq zKt=`uB%>>fOHy+g8JP1+OBfkMeZVrA`T7AxnRz9_B}J);xz>yf!dQeE8Q2RzigNNM zbFnnn_c1UtFf%YPcxY{5VA{sOyp4fnHv?<rb_O=>Z4B%}9NQS!bwCWxZ4B(&7`V1E zaBpJZ!KMN%$;+~afq{XEL6U)ife&o17=tE*B!e4+6oV841A_us%!5IiL52YYJn9(~ z8I%|pK@MP0W>8{aVvuEEU|?ZjWRPQEWKdyHWnf~EU|?W~Vqj)qVqjoU!tP8yxa*J{ zzy;PJ&!E7d0JdBV%vXY2uEe0oP!F;k*-ABHt>njTr7D90gBngNQEcR5U}R7S2bl%{ Di5PmS diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/Client.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/Client.class index 36198e4bf93550c1cc6f881fedc4c0b372cd1dbb..b380d66220f652cc9b22291acc8445552a61b404 100644 GIT binary patch literal 3672 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 MK_y`xxE#s{0L#uglK=n! delta 1734 zcmca1b6BGO)W2Q(7#J8#7-n-ah%qFAh-46v0wPjDL>h=l=VH)c$Y5v4<YM4p$O4IE zvoqvyF>pgTx$F#iTnu~=PCh$B0T+WHgj2}QP{hR`!jQ$zP|U?3#!vzxO4%98xELfE z%DGG#Di|t3##M1JRC6=bFx0X$)NwG>vokbsFf_6=G;uR1GBk5Cv@o=CFtl+ov@>+D zGjwh|y_8XazbG|1HM1-=#W%IMI59nSvNp5&<Y!Foo7<UX7!|u18CY@?GxHc3#5AIP zvJ%S@^>Y&Q()EK&iZb)ktu@0YuV&Gkyq-xco;SE8F*(~eu^=QdDJPYkp^TA%Jvl!w zFEzP@k%3u5Gm4RcD>%QjC^^+FGbfdif!jGJGc~V74`e0}gAIc%4}%_qJ`aNdgCP%t z5rZ)ggC>I(4}&&{2xRD<oWm+%8_3YZ!(hT-%E%y?4A!mhoRL@(T9A@hlFGwi#$e9K zAOe+eDM~EQ%u9#KSuj{mKFBIkZ^dBE$iU|w>Iv2voLrQen#ah%3)KX15)VTlgD($5 z978-KgD}W>5HGt{B&QaXWaj7bF!VBXvorMZF!VD_;9<~V&}C%c13APwKd+=HKPM-( zh@D{~55pve$&3tQMX9;@C8_$JU<H$X8968Cuq9|tVVKI!FpY;{I>QV`24QDNIHjg2 zl;kTErxulgOqj{TFpI%=^Dj0rMn;Fpf*b~u!#Psw#TYag7#MgMm_Wh9z`(!+3L!A9 z!=MYM^%(TQv;l)5m^NZC2Gb@CreNBP!5mCmFj#_VD+X&YZNp#-rtKKC7#JA17#JDs z85|fG85|iH81xw!85kKD7+5EJadOo=F)%Q&f%zH?&S2Mo<rrKTTp1V`7#Z9c+|l)E zZDC;A05%?>*$}H{4+c*xnwgO_*MqG#!>Zeh!5fQi79`zZ&6Zd-`!M)IHQO;TF))FA zsinP@fpsI?;anh59R^zlRt7t;5n><#1~#bILBXQQpal*rKL&r0VUr!X#E=5a39O3; z><Ct<E=Gm`>=v`3S<K+hz{=nOHUZOKZK%D0489CZ;7FUszyfxiTfNqH26nJdw01La zL~3nk;M~f<rL~)Z8^q?>%D}6&n}H9+=HJR7ptYMp5X2VR${?(@n?VG`7TwCgh;WP& z0|x^GgEs>UgAW5IgD-<9gCBz;gFk~VLjZ#%Lm-1ILokvf-5Ba234?*bjUfo^%3uZt z1{MZJh7bl$hERquP&hF#Ff>5jE4iCNEK-ZvXgh<rkM=eOiSXqN93Y0&MsTnRFbFe9 zGB7iM5|R`H8v_GFBm*}?6oUXmB7-nP9D@i$0)qrY64(U_49pDN4E3xG;S8<}j0_?S zEDRA0kziva8KM}X85kI17#JAX8JL3E8Dc?Bierd}I_DwOIk{R|TNv1OFi3A@kO47e zgk*Oz$T2Y-V36O+zyuLdfQl$?WnhMgC_zP(w=%HQYi(g**4o0rs<nlIS8EG{z)l7g z7KWJ&yqg$Qh19k&sI#nrd69Vy*l|e=X>dR4F>o_5Fl2!02nJb(YzBRX90o^*JcdYy z0)|9}B8Fs!3WhX>QigPfa)xY%DzLvn$s--^S!D)>TxePY`Id`;`8Pwd6V$^A;KZE> E0O2<dRR910 diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/ClientUpdate.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/ClientUpdate.class index ad564f64509e59856ae964be020e02c9981f6eba..66a59d861a1a2a8d97c3926e948b2857958cdca6 100644 GIT binary patch delta 882 zcmbQsKA+q1)W2Q(7#J8#7<{=HxEZuL8Mqj9xEOR9^tc%G84S1>3>l0-gfRz$2}szK zi@}V+oSngfoxzfw!HS*1dZPYRMw^L8v+Mav3sMqGQbUVVi+nPROBfl%G@^a763Y_x za}x8?^@B@_GV{`{HKQ0A7>gMhSWAmji;5W;gt4e$WMBu$I^|a|GKhnXsL(Gi&&*5L z_j1n9P0Dx5udrrh;0-QGOwRUAEC@+V%1LGC0J%wtoxygp9;32_0D~P510MrFJA*wB zg9C#jJA)GsgENB*JA*9`gDZm@4}&{{9U}v?V@?hag9n2rJA)SwgExcE<U+=FF;S4K zF|3^YjWLulWwH;G{^ZF_3iXT(d_}3b`DLk&IXRvsskz0B4BY9dB_QwnCFZ6wGKgqs zg58edeMSZWkm1N;j0|k4g{6r(#f%K18b~_)ld@8iORP1c7!(;mal^#G!@$eH$iM{h z7ehS*12Y37g8+jd0~3P~0|SE_0}}%i0|Nt>)^-L)E$yugOdA;(7?>D@85kJ&7?>Ft z7z7zu7=#!&8H5=`7#JADAgUQe8N?VsfD3FaBZD{t0|N^KBZCA3BZDM^6x8$}1}3l> z0$N)bn6@!6Z=3AS%v%pKn+t4?1Op#~6xdt^h&s5r0u0g&G7O9i3=9GcvJ5f|Oei+U zF~~!0ILpAqz|O$H-~qFNfyGy68v~n;5c@U;R&77seP%4oW~`#DqAZITRCGmIjjZa~ zB-tRUIkquy&SK!yk!0J(z}mvfxcvWZmNg8ZAObm2iGhQGfkBCZn?Z$vpFxd5ltF_* zn?Z}gib03LfkA`8jllrybS(xJ25kmW1_cHg1~!mW;GXbcP-IYIU}WHCuw_tYP+?$V tP-S3XFpy?o{?8!Cz{bv?#?GM5&Y;20pw7t1z@YepffdD@n&7C=0swgXlV|_{ delta 346 zcmbQwJ(peo)W2Q(7#J8#7>v0X*coIv8Q2(PxftXa<hd9W7!<h}lo*uR8C2LARM{ES z*csF(I!<NOn0P&V@@Ymz1s(=X9tJK3ZgvJO9tLd&9d-s?9tJ%IeRc)|9tJ}Oqsb~v z?UN5P1v8dR7H8HM6U|C2ORUf@F3-$M*Y|SH&rQmA%CDI0!mL!!pvb_+z|O$Lz`?-D zz{tP^GL?aWfr){Ufro*Yfr){Sfq}t|fr){Mfq{WbYdZs@miAT#rj1}V{0s~Xd<@JC z3=I4XEDQn+oD6~t0t^fcVi45~f($|oAixDSm61W1fq{XAfssLkfssKJtcsCuasZ2> vC&(Z!uqH7EJ_ZS}AqrrF1>lAVFo-iqFfcMOFbFV6GDt8mp%^Cxc91jx(WfKO diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/DrawingUpdate.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/client/DrawingUpdate.class index 5e519b95a6d0920b2aae6540612ceb081dda0366..a3b8302dd9e3252b1941eb2af93b54760ea2b35b 100644 GIT binary patch delta 650 zcmZ3%exB3q)W2Q(7#J8#7(BTcco<YT8Mql#xfs+K)VUZm7&N&UxEQoRgf>V_hl@d% zL63_;pTU5g!H}K7h@HWhoxy~i!E~bjG)A+D$13HyQ;HJHGxO3Ni&7IA83cXYLp}9f z5JHn}7*#z58O(VY_!$J)87z1hEE%lW8LW92Y#3~L80;AAc^Di((vA#H><rF43@!|= z><n%^4DJjbj12tfrZqCoujfurEeS}>%qwvZ^<-oa(9i_i2@|nqWZ(hmg7Fy{_|j8L zkX*#bAPm)lBxudZz*P)a22$dal~|UjpIBa^ADod`kZP?N#>l{4lv<F;m^oR7smhZl zJ+;I+Ker%1FEy`(kwIL;Qxl;DE@91}$iU6O!@$JA%fQFL$iM^&1_lNOCI&_ZK?WfP zCI;cj516FuMHm<u_!yWO7#IW?SQrEuI2nW(L>U+u#2A<u7#O%1#2CaGK!6LZpOHa= zfq{XAfssLyfssLqK^kNZ0|Ubp1||j;1_lNTtt|{p+ZdR)F|g=tV_-$_wlT0lIPBXP zI9RqZa2{ab^3&DXR=~ijyN!X3c@5ZUAje2Cuz{`TV-RPMW{_aeWsqbrVvu4mV~_?r qObcQW++h|BG7Pc|j3CPy<QU``m>6^!xET}}6d9ON9IFJjK^XuB*Kkk( delta 382 zcmX@lxq@B))W2Q(7#J8#7)-br*coIw8Q2))xESOa6u1}^8I-sflo?dm8C2OB)Yuu+ z*%>q@x=mx$oOri#as{K30uO^04+9qiH#>ti4}%VaE<1xB4}(5~0Xu^s4}%ed@#M#h z^Cz=0m(_Epr<Mfe=a&Q|=A|++NNQ;MWF?j*R_GU(XXd5rd%>iv859}V7}yz@7&sU> z85kLuK!!6gFfcJNGVn0)GB7dlF)%Q=F)%SOF)%Q2X>Dg<)Y9I{z_byphM$3ffscWi zfq{XafrUYUfs;XyL4bjQL5!guteioRL5KkaxWL9TG6*v;Ft9K%GKerRGKeyWL5&Y$ zU<4Z?ptXg8X&VFcHU^e$46NbIYv7h}fvp#3;A4;gTc7|@4>w<cL7YK?fsuiML4ZM$ PL5hJ%1jQ<8ut72a7d|TF diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IChatController.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IChatController.class index 890f6569a755665302a1d37be8dd61d80793a8f2..53c3ebdbeb067f1865fe93a3e90ce8ef69e59d0b 100644 GIT binary patch delta 99 zcmeyvbe~!H)W2Q(7#J8#7=+mw_}Li**ck*T3i~h$O-u+D6Dm&4O9?2-EK4j&^-V1< zPE1c_WU!p5sXEa{eBzdNMwZDojAk+{j11fiJPeEsYzzzxEDVec><o+yybKHsObmPg DB9Rof delta 53 zcmcc5{D(>S)W2Q(7#J8#7zEiFc-a~F*ctdI3i~h$OiT!#%);2g$UM21(Tt0Mk%60m Jfq{vE2LN+Y3Y-7{ diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IChatUpdate.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IChatUpdate.class index 05b1a7a82a84c88af6d578d3cb2e7e97a8468921..f84138bb8bf132eae71b572e7f8c37323da8ae93 100644 GIT binary patch delta 17 Ycmeyy^qpyfDx=0kHC4u_jo#Xf05;PFF8}}l delta 15 Wcmey)^o?nPDx>;DHPwwi+Kd1#umscq diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IClientController.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IClientController.class index 8ebb942002c9acd24731c041333431529e218a5b..a715a7529d155693afd32a10c6d499fbc792097a 100644 GIT binary patch delta 24 gcmX@Xe2;m83}e{D10oX*WmuhaGE?(5+Vn620Bf=cT>t<8 delta 15 Wcmcb|e1ds`45PzDS%Zzq)r<fuQ3VJ9 diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IClientUpdate.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IClientUpdate.class index 40d1f67006a40017f46a01564f48064d5da9a51b..594d29d42b0c49bf0496f846c0945c7ceaeacf33 100644 GIT binary patch delta 125 zcmbQube&1;)W2Q(7#J8#7=+jvc-a~F*ctfQ83ZPZd1wnVGVqlaq$HN4h8Cw5`D7NC zFfxc~MEhhVmL=-vB<7{-2bUCO=A~O}Moo;Lug}E7$iT|L#=ywH&cMLH!obMD!NSPE T$-spy!obMD&A`CG#J~dp9s(9h delta 65 zcmcc4G@D86)W2Q(7#J8#7zEfExY-$a*co`)8TclOc`))%?3^#l$im3L%D~3J$iU9P Vz`(-5$iTtC$iT_Kz`(@71puF?2yg%Z diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IUpdateController.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/remote/IUpdateController.class deleted file mode 100644 index afcf1a62220c910720cf59d0c49f8d67d01d2167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmX^0Z`VEs1_l!b5q1Uvb_PLq1|dcUp3;Jp#FA9!oXpg`5=I754WF#UvPAuy#JqI< z;F6-uymV{LFh&M0*NWuSf|AVqykd3+VMYe-^wg5j;?yFa%;FM825}8dh_=#_%p85k zqN2n~kc2fO17~n%dR}5lX;CU8gEn?mHW01IHriP;GVnnhhOk5e>NGSvz^)6<FD*(= zb<502Wn>WZ425_pKd+=HKPM-(NDt&CMh1zZ)ZF}%RDBG2Mg{?p3W%ruld@8iOBfmW z!9qp3nfgIsZHx>OXd>_+VPj-qWME=oWMF1sU|?opWME-nWng4rV_;xlVPIrnXJKUE iVBln6LWnSMF)%PNF>tdmGVn0)BCBO!WZ(nK@dE&WDsMRe diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/ChatController.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/ChatController.class index 3d53a767c735c3e1e6236e5ad6325b2e5230a9c2..b56eaad1cdbc2c794f9ab2a79109a88eb63fa3fb 100644 GIT binary patch delta 1338 zcmdlhI8m(r)W2Q(7#J8#7&^EZq#5iv8Kf8-I2jxnoH!Vqxfom+Tsaxs7~HuSJQzH= z8N3+0L4*%GgD)2Y7lR)+gFiz62SXr;4q|5r=3?Myum=$#91Ni#It*k)I7m8zgCP=R zR1_COG(!x?yjXUIICc((cy@*ac80`>71J4$CJQjGXH1@afH7E1s5mt*C7>v?EU_fj zH?_DpF+G)$!E&-1qv~W!MlpSkl6>c!%+$ORMh0FO(=#t6wStj>(UXyZKdmS~7oq?x zI$4lORX~9ug@-|oL7tr<m4_jXA$_tNlZIag4?`wH7CS>W4?_+^E;~aW4?{jf0Xsu7 z4?`hC5f4K#LkS}TcX4V_S!$7fXmM&04?`(K89PHc4?_h*B_jieo}QkIzn?1?4?`7$ z>Eu03GR)NsHIr{MNtxC%)bTLXGi32FG%%PlG6*YVBo-^=q^6Z9lw_nT6y@jV>hUl% zGBmL>H1jaDFtqY8v@x`AmSFzK$fyDGD07r%)MR$nu6jlWfn=~}o%8cbit=-EQi~WF zBz>Tcf_M`lWzEPSjzfx(fhRq+1mp{Fs4y~!YWQR&mL=-vB<7{-2bUCO=A~O}dNMLF zr>B;HWIZ)~vJ&fI3jC9@Qj<%p859|$7^E4P7-Se^85kLuKw-+jz`)AD$e_TW$iT#) z#K6Gd#=ykD#K6G7rL~=bQA>L(1JgzZ1_mYuWd;TYJ_cq61_pix76t(ZP6j~+6$S<d zF^FmgRR%Q%5a0rv%E+M3z#zlG!obL&!NAC%$)E)_{xAaz0~-SagZpGzHraY5NtT@q zoQw<y7`UuhC0VyIaQo?M>oD(R;9+41U;h8rCI)69-fax5ENd7T7?{CskYiv6+seTp z#h}F?!(hN5%V5PI$6(8#z~IWD1a^}N11p0Tg8+jzgAM~Lg8>6CgD!&}*zN9cce*p^ zGZ-5%FoN8|V8~#=z{Ft0z`(%6!1R|vgn^yG_$Pw~$P;ism@t@v{4n`7TMnc0<Op{4 zP>}bv7+4t88Ti0fu`uW|aD%M^1z<GXs%Qp%29Ql~^MxVitDu-~1~=b!vLJ^(qw-`& z4)uEK+F{OM0rCR_1H*l2Jj7{jVPM+AAg;5GLBfm$%FzaKSVdW8Gt@hXvd(6(hKRF? zvTS3JJix%Uje%QRmjx0_Fez3{DV8<N=<(*mz{}vvAjRO%pu!NyV9yZD5XBJ65W^4w zjyF4S(ujixTpWWRB;*(v;utK!aRg$4VvCu9mm!eBiou$Jg+YqJg~5iwnt>G@gX|29 Se;HyJ!6^_PdA8s*YzF}J0^O(p delta 806 zcmbOzwpXzJ)W2Q(7#J8#7>c<VBpA#%8N?aPIT<V%EIAmgxEQP%Y&aQg8SJ<i>=_)m z85|j$K!h_pg9{e}7lSJ|gByc82ZINQ_GD-9;$q-uFar_Z91K1n+81PmA4uAtgCT&O zA&{LRh@Byrogsvgfvq^TsBB{21jf+G@{H>l!zQ0+44%A%Nm)RaA)JRnnn8x0A%ce? zk|ApHbtVnJXdZ?bhFErnI39+0h6HwoL>`7DhGcezFdl{!hEyJgG=_9W25yj%sYUvs z#i>O+3>gfW><n2v4A~6oj0_xldU`JYey&_R3^@!&lYN<Gm~$EOCg(6qDd#g3@GulI z#PTo{F&Hs22rFbH7AxeWrj;m^WTYw-<>%+>ZQjlNk#X{M)(#~GMFw#O2?izxNd_qf zMg}I3Lm3ztSQr=?WEtcbm>A?I^Rr9)D=;uH@G&qmFfi~lurLTPa54xoC^9fGh%qoR zFfed2C^0BAfB+X*KO=(*)C^SyMg}zob&xp>3=D@Dm>Jj@7#Q3pSF+32D@wBLWZ-0E zIKaSV#VX0Vje*-wS6gQ%0}nGp`11d^H!&~^@or;aWm&_(z`)D^a)BHJJJ?PR1}O$D z1{nqe23ZD61~~>B1_cHe29RGsG0)1N#lX*?!Jx^&%3#32!=S~W4R*O3+?8$&It;o- z42&SBFz7MpGB7ddGcYjlFfjdP5Mf|vF!;%!j^YJF1|yIcCL40vPHyGUXH=NHl|wxg z6aZQbEDY)ld|>NX7<3u9!PbESB^qvBG{`yzMuZ*05Ia;*>@bGgk;AAkc^)UV%{O6S JU|?b}1pw(mX>R}k diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/ClientController.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/ClientController.class index fa8d3ef62c0c228de653ec499ca7bf7a1f9fb77c..f8f9cc0ee6a843d9f3771bc2c10ace5c357cb13d 100644 GIT binary patch delta 1970 zcmZ1_`c<m_)W2Q(7#J8#7*=vIC^Cd_GAJ;Fax#Q5gmW=OFhsI5L~${&GDL$!Vz?M$ z8R9@hJcvjDNhESIBrznjGo)}a@G^veh*S=SG!UK6#gM^}$;F_+kOd;LL0WP^X6AzQ z<$;KNE(R$rh5~kmLXcz;H$yQ)35X~KNtSUllrvPYGgPuORIxKuvoq98?3l@2%gDfz zm7kf%$PhMJkV$y5J)<nEb53Sz-ehmabUB`65VIt-ASJORm61WrrzkZyza&-P6QX1V zV;p1DWOk-Yo`Ok5`H3mXiNz(M#i>O;nZ+fH49psuVT=rnrHl-G$@zJCsmUd&DInQm zMh4+%pRB~PME#t^ymbBGlA_GKbZd47e|Cnt$=8|G{nZ$Jco<X|RM{Eoc^DcP8rd0| zco>=)oERCni&KlrQj7FK=I}76F|_b7v@*1@Gqm$CbTD-CFmy3=^Dy)<^ztzDG4!)D zOyFUd$S`TLFS88uWQHk|bC_ilrZP-pXPC~zFoVI4hrt_UkvoG255r85o>>e|JPflL z=I}7gWthgpFpr^=kwF06p*#%p85XcJ)bTJZ1gTuau$YHo3Byu$hGjeq%NbTo-pbrB zECkk6T9TQg?^%*slvt8qG}(itkP$PC6*m85X<@8qOD!x-%qeDM;K+okXJio5(1e5% ziaFMd4D1<+#eS(3C5#L#d0<KerV<>U{z+M>$tBi|3<Bw?C6Jhc$Do9UCTbi)Wm2sf z8AMPb7b?NXz*h>6eNc!);#EuoOYCVzF(@)9FeoxGF(@%8GcYnRfg+HBfq|WYg+Yx$ zoq>r#WAaWm>3U5D1_nL`W(EcZAqEx(VFpeH5e6*=1_m((CI$uuE(UD|9R?8K0_$gF z&}Cp?U}0cn&|_d^&}T3JnZv-q@P>hnfsKKIAx&!w1Jf1;X6<bZEaAHuSR=J{bR}7~ zGq72)LS)z_S+_B8ghM&o7$yg@8`NuUXAovt!@$76%m8wZ5(5VV1A`<34}&y=6oV{- zI)gleDT5+|JA(>C0)rYu3WEmNiFObx;Z96rFk~=dU<5gX!I;4W?13}}QwB4z_tF^5 z87vrB7^E0{7%UmA7+4vs85kHi7#RQ5Gq|%e*r52#mcb6{vsMNsuy%DV?QIMqwlcFB z<e`q2*~TCW^$5tnV&NcfY=rwl3hX*P1~vu*1}+981~CQ`1|<eF1~mo?u<I2d#xiI# zctAo}9qN2G21N#Y1_uTvumjl`82>P+p@zF7gA>$sRZ!O{fL%9vEr$X)Ld6(Z85kIB z8Q2)?8Mqi68Dtoo8RQt;knB}}hnfQ1S}6u+RBPo>t#x5=g<89ffeCDby_U{41`#{3 z<z_6REb|!j>SgCKXhB0rlw}(O*8v9BZ4BZw8APFivfy9?$2c=0&gB@`85kIR7}yy6 z7<d^17_=FJ7|a<$7_1q>7;G6L!7ev}*a>&JJ=En44E79e3`Pu03~UURhTyPcX5eKo z0(*xA9E$7=jDHzy8BzV?&fvko$e=O#3#VSag!VQD$(alsvbM_^I9r$*m;b*cgYLRG z1}26C1|fzd1}%mZ1|5b}27QJE22+Miu<NuKSQuCs3>iEb9KbPa4tJ+H)SXNWrVL*2 z5awoJ{>#9^$f)&;ft8`22~_q$L-z^TBnF05XoziN;M~g~<-=?%gAiE6Agc}I%D_Td zBDjT#aryt-aAnfIIy)I;7#U_VNbBrmkY!{zz`*LKyNy9kdnbcD6GQm&|BoOE7MyC7 z!1*qZfsdhpL5`t_!HA)N!GfWbA&jA%A(5eiA%&q5?o$B<4X{s{7{VC18GIS6z<y4J y`k9X*oWYO5pMen^_@WFfe;EYW83Gu8F{uAx;9_S8{KcSvlHb^a7#J9s7=i(hUtG5U delta 1312 zcmew=wMw-9)W2Q(7#J8#7&^EZq!?T{86+88IT_p-+_@M$7(Ce-yto)x8N5LvK3ojG z41OTOA4CLzBmy}Zf*69?8A7-ico|$kL?{PC7>Ew%Vu)af<YJIyhytmO1{oIv(h>_I z;<y;%84}nT5;@r!lGquN*%?wMuAIr8%E-Wym7kf%$lx&9m(gJITUP$bix}M}3o?Z; zdQDDax-_|&Sv5$WA&rMYmO+l4A)SXIgCUchA&ZA0o57Nifx9@hs4TTeKeRZth=)O* zA%}+{mm!axA)kk#fT56wp@^ZFhoOX_l!u{=p`4wef`_4!p^A|~eDVV}aX%i0YK9s{ z1__0t)bz~alGLKq6oul_<mA-i;<VD7oJt;sT827yhI$@`1_o0e20I3O9)?DcSxpR< zJPgeYEj$dZAO&qa4DAeslP9zEvoLFDhD|nQEo20HXY*Uu$&8beSp@4D8Q4+_OA~X7 z859{L8KfAP7^E3w7#JCtK;B|tU|?flVUTA~U|?cUWME)$V_;%nVqjq4(%R0zsHMG? zfoUTH0|OI-5(5JR9|JQ31A_nq3xgm7CxZ}!G6MsH7(_LL3WF*G2ylT-Wn@reU|?Wj zU}R7?XJBN|V9<mbe}jRQft7)QAwg>k1Jf1;X6<bZEaAHuSR=J{bhk6GS+PLG*(F&f zf8?;OXIaC*z`zW)T#kXAfq_AsfrmkoL4rY=L6t$4!I(jw!IeRYA&x->>=+Y>*>J}s zFlaGoGcbbeW6)vH1v@o?L61S7ftf*q!Gpno!H|K4!H9u@frEkZ4}&W^gE7M442%r* zCJd%fhu1PNfqk#6rM;a&*j8pXgEZ8sGTRtL!Xa#scSOTM0S0li7}z~p3~UTK3|tI) z3}Orh3`z_}V7DqjjDx#X8R}Lx23ZC(26F}`1|tSNQ0y@NVNgN}PX<N?3kFN5tE!-` zQUJSZatW70Jt(3e_L?)WF<3HiF<3LmFxWE4F*qREs{prG0dB7pgB8?XsI_va)><>z zK&@TJzy$W0wU*9y24Op}<z_6REb|z&>SgCKs6j%5U6f@T1J?lt)@=-8GZ_S-g0i6C zVp+qCh*>EHHgLjYWAI?$W$<FqX7FJ!XYggPWC#Ge7!s@2a2H!cUCh8>&0x!*&A`OK z#$XB#GiC-}O$I%%Hz3i<&cOJW!IBZ#A55Uk#K6d)IQcNQUcI>XHU^2A3>>ny%NaOZ zm>HM<za)cj86?exGB7cOGYBz6GH5YGGw3kHFz7RcGng_YfL*7>z{0@7V94OWU=EH^ nbGSRrq3&d2FlBIrhb%V(^IrxQMn<h)46F>Cj0{fT?BxsqO^B@N diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/Server.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/Server.class index 52bd59819c3dfe46ae78bce48a1b2617d0822004..0c1967b8f8157aa219773025b224455fa21cf3ef 100644 GIT binary patch delta 973 zcmeAWI4)3s>ff$?3=9k=3`JZFG7PTl3~pQuObo7^415gk><k`U46F>EAdVM1gEtog z2ZZCp&fv?%zzyN}u`~E{G4L_Cf`|ZihCnU`L53hMhG2#e5E0735XQj}&cP7D%@D~D z#mNxO5W~R`%f%4K5YNuQm@u(={p4dzA_7uA#i>PQsYUuOMTzB^dFhj784DN_C-*Uy zFa}O$W;#6i7L%o%I)erygK$=2S)zVvNoJ0|V^L9JrB7yY2@iuTgWP08W|?|*h9n*a zMFu5C22rSi&KZd%&iQ#IMfo{7sYN^t$_y%u3=&XDsBOsdstjt347^bJV6dZj7%UMs z=OpH(>$_GYrxuiC=I8M+Br|BRGo<h^q%x%OFfgYxWK3SqY@x-@kjcZ4#gNU;ki)}} z%aF&&zz;D?A+uPaC^a#qlAR%+hoOL>aI+4}R7Q6`1{nqh1{MYukWUyG8RQul7?>Co z7+64_0m~>esDNoz1~mo-24)6E26YAv1||kg1_p*A1{MZJP&`gzQ?J+B&A=V0wVi=y zD+BLFurXQ;3=C2XYzzzxq6{nyVhsEY;tbLZ5)A4Lk_^TSQViM*3=BLF0~mA|bQu^J z^uSgzGUzjKG8ixzGBARzsbOGZU;>%4n}IKKI|ILu_BIBA<qRAkT4*EK03L>Veg;7X zW(I_v3Je?!N(?*<>J0o0DhvV)Y78O_8elsW7?>G27+4sL7<3sJ83Y(u7>pTAz{ZF& zm@=3#Fff=iFfgz)F!{4HSb%(J3HR|2uvP|!2tgL_9Sp+ZI~YWKghYLX#Qf@o#I0C% zGq8e!fX#|^Hv<QV#c9O`3l=MOZ5>J0oeUDp4BEPqY!HSdizGXkwTVGeNNO8{G$Q28 z7<d^N7<3uf8T1&q84MWs7z`N%8H^Z28B7@D8B7^88O#`r87vrV7%UlF8LUbe{26Q* z!WnGAUJPR3U|?W~fCei!gD-;>gEa#q10RDIgAIc%0~3QFgFAyAgDnFygD8VDgFS;S w0}F#ZgC&C^g98IAgC>JMgEE670~>=egDQh6gA>>ppp*iN97YCba0I&m0CQ-PDgXcg delta 965 zcmX>u&>>KN>ff$?3=9k=4EbCP(hSb*3@%&@ObpJP4BQN^><n&P46F?9AdUw+gC`dQ z2ZZCr&fv|(z|G(cB7E2xe7P9-82q>x{22m3L?8!45C=mr2SW%uLns%6D1$pULl{Fi zCqo27BnLwj7eh2d3_C+CBLi#c#Fo{Q6Bv_u;}{uOauYN27#YMgq9<Qu6`A~mF@(`~ zvL(~u$@+{Ulm9ST)~hh6GBOBfC6*=XmzHGa=sOk_C06=m7MJia$S}w<GKd$a7L}zI z={x6SrskD6=jW9a<>%z27V$8sFvRmPC@?58GKj*|WF(@fP-0MKWZ;EL27}GvVK75j zn3I?%o38I#k(^pkl9`{!!;rwB%Fd9;!;r*~%)^kvkUIGzvxO@og9OwFm!ib-%)E4j zBiI?zco@<dGT0e1c^I-7vKblpA=W5l7Aq8`CZ<%fGvx3v<TB)K4rZCkXwS_c&A`CG z%)kQj8v`SQ90LOb6N5Yh3&<Y~3=Av`N({<i6^slj45|!F3~CGv3`q<u42%p63>uU5 z+0^Sdg7v5~FffQQure?(h%m4)h%)dqh%rbrh%=}&NHAzHFfi~ybTDW#XfZG_XoJmW zWYA&YWYA^MV_*cETf@M_z{J47AiA4@J90Y%kB{~?2Hxci93Yy1BiH~Q27U%U24)73 zby5s$3=9nQats^{3Jg39sto)LN(=%FDhwhFYG6AR7?>G27+4te8MGJ}83Y(u7z`K; z!N!O(7%>=w6C?uzI|GwHJA*06OJ;B{{s3!bV2BW8@!r885Wa&!&__tfS4h}TNW_X| zHv?;=)^-LqE7si%^&B83rxn|722l`8%!*xGN0N0XgE%vTwyq=_gdxcy$qr_1VvrD$ z+{Pe<2sJYXUT}!8Gw3jIGw3n!G3YZ0G8iy`+$hgr%%I6&!eGo`#$dx>&fv;m!Qjte z#SqS54fbIW14jx2149HfSh*Q|8O#|h7#JD&7`zxP8LSwX7z7#I8LSzs7?>GE8Jrnx v7_1mr7~~l&859_78CV%K8T1*H80;9>7>pTI8SEJx7}${_hmpY%9Jx*ag=v%D diff --git a/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/User.class b/out/production/comp90015-dsass2-infinitymonkeys-remaster/server/User.class index 3b63492ccae132a24d5de57832e8052015689b63..bb1cfcbe52b605032645164945747218b2160ba8 100644 GIT binary patch literal 1273 zcmX^0Z`VEs1_l!bLoNmm1`SRIb_Pulp#>teL4*#7&}C=PV`tE3WZ)<*PA$qy%uQuv z5c0`NEKAhSNz6;v4=yRn%uBasWZ?F6&PXf?El5c$No8aZ@hM8p%`ZvSM-sJWWZ?63 zDM~EQ%u9!<6Njrqk+5cD;PrIQ$xO|In<xfXi7al-$iSXi?3j|9na9Y$7{$oIW|Nth zSz^b?5T=3YN`w(`r&=S#kgP+9qB=`6jFExGIX@+pk%8YQGcVPzG&d==C?qi{2OKQ< z$%#2(iA9+pK2(sUBqOt!k%8BzIJKxOwMaj-IJF2ATIs1JAf_KUKt(h(F&)duz)_r9 z0`(e;Mij_y)<lR;nKd+{7#aA|Q%jJ-mytnCLlfa0gclhZ1VJiMyu!#JiKG}s%9@cu z0Hhu{oEaG;kd!0KSTizk1?QI*C8xS&f<l24<Sji=0^wm0W-#Dk;AG(9Vc=%q;bGuq z;NxN7XAt0F5M&TyWZ*^$5=I6AkQPXq@=wZ2O)g<%VAjwKV^CyZXW(F9U|?ln0vW}? zz`z7D4NUVg@PTQ51_3ZF$RNbPz`)MH$RNxh!obKN%D}+T$-u<G%D})NueF_lQA>L( z1Cy4{Rt9D*NtUe)ELyr-8CbQLw=%G81REg6z`!8Kz|O$HAi%)FAjrVUAjH52HcW&; zl0lR~jzNq;9Gq*wMlwh+NHTzcJlJWBAZx&mV*;~4&SD0$Kn`VLU}TVDkcK)-pMjA9 zq@Go43j@;zxaDkMK`F2$JYY5})DlJp83tLXW;+HZ29OnOTGA*^=K_n$Gq5r!fK3ns z^Vy&#Ffgz&$T0|kEf!>uhnj`#5VkdF4p9LcgYFOo21P8InbCcriB+=_gEAJ)Ea;kb XuxeIeP{pE|6<xC)R?TW)(dcD3M% delta 582 zcmey#xspTk)W2Q(7#J8#7__+<*cp^L8Q2(9K!hrYPy-R_><k+044M=5iYA^EXLOkO z&|tDU<G0D)Op@XP3|c%491NU13|tJ{JPbSxygUqi4E&QDn6&EI7}yyY7+4sXKnfTb z7??n6z%&m7FPP?I;Adc9U}Iop5MU5wU}O+tU|=X^U}9ilU|^8c+RnhJrM;DbNlRxd z1GARyRt6R==B*5@8^KzI85kI(7}yvX7`Pc&7<d>s8F(4^82A{38Tc6_7z7wZ80r}q zv>+xih%$&VfPf^}C5#}`!ERv!vp}w4W?*CxXOMupL7#z<0i=pmYYPL@2Dp77hcYmT zFo-ZPFz`SWK#gW(kYtd8YPMrwVgMOj&!#1f;#@AUup|R3gA~{ZF)*JEY6K`8q#5|Z zHuEvaKn+873F{g(m&k#QL3fEPgB)114FdzRZf10UC}Y(v&!7O(J-MDmOdS-)5I?J7 KRjUYgj}idL?<f!e diff --git a/src/GUI/ChatScreen.form b/src/GUI/ChatScreen.form index 7ff8dff..9d8893e 100644 --- a/src/GUI/ChatScreen.form +++ b/src/GUI/ChatScreen.form @@ -8,7 +8,7 @@ <properties> <maximumSize width="-1" height="-1"/> <minimumSize width="-1" height="-1"/> - <preferredSize width="1200" height="700"/> + <preferredSize width="1200" height="600"/> </properties> <border type="none"/> <children> @@ -185,7 +185,7 @@ <text value="Send Message To:"/> </properties> </component> - <component id="cc35d" class="javax.swing.JComboBox" binding="sentMessageToComboBox"> + <component id="cc35d" class="javax.swing.JComboBox" binding="sendMessageToComboBox"> <constraints> <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/> </constraints> diff --git a/src/GUI/ChatScreen.java b/src/GUI/ChatScreen.java index 0c43cd5..e786ca1 100644 --- a/src/GUI/ChatScreen.java +++ b/src/GUI/ChatScreen.java @@ -15,7 +15,7 @@ public class ChatScreen { private JButton sendButton; private JPanel drawingPanel; private JPanel othersPanel; - private JComboBox sentMessageToComboBox; + private JComboBox sendMessageToComboBox; private JTextArea chatDisplayBox; private JComboBox userSelectComboBox; private JButton kickOutButton; @@ -33,30 +33,38 @@ public class ChatScreen { private JButton quitButton; private JFrame frame; - public Client getClient() { - return client; - } - - public Client client; + private Client client; public ChatScreen(Client client) { this.client = client; - exitThisRoomButton.addActionListener(actionListener); - sendButton.addActionListener(actionListener); yourNameDisplay.setText(client.getUserName()); - drawingPanel = new PaintGUI(client); - } +// sentMessageToComboBox.addItem(client.getUserName()); + quitButton.addActionListener(actionListener); + sendButton.addActionListener(actionListener); + frame = new JFrame("Application"); + frame.setContentPane(panel2); + createUIComponents(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setResizable(false); + frame.setVisible(true); + SwingUtilities.getRootPane(sendButton).setDefaultButton(sendButton); + } + private void createUIComponents() { + drawingPanel = new PaintGUI(client).getGlobal(); + } public JTextArea getChatDisplayBox() { return chatDisplayBox; } - public JComboBox getSentMessageToComboBox() { - return sentMessageToComboBox; + public JComboBox getSendMessageToComboBox() + { + return sendMessageToComboBox; } public JPanel getDrawingPanel() { @@ -75,7 +83,17 @@ public class ChatScreen { try { System.out.println("Send button pressed"); - chatController.broadcastMessage(client.getUserName(), message); + + String toUser = sendMessageToComboBox.getSelectedItem().toString(); + + if( toUser.equals("All") ) + { + chatController.broadcastMessage(client.getUserName(), message); + } + else + { + chatController.sendPrivateMessage(client.getUserName(), toUser, message); + } } catch (RemoteException ex) { @@ -99,20 +117,4 @@ public class ChatScreen { } }; - - public void showGUI() { - frame = new JFrame("Application"); - JFrame.setDefaultLookAndFeelDecorated(true); - frame.setContentPane(panel2); - createUIComponents(); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.pack(); - frame.setResizable(false); - frame.setVisible(true); - } - - private void createUIComponents() { -// PaintGUI paintGUI = new PaintGUI(client); - drawingPanel = new PaintGUI(client).getGlobal(); - } } diff --git a/src/client/ChatUpdate.java b/src/client/ChatUpdate.java index 986f6a7..ea4baf8 100644 --- a/src/client/ChatUpdate.java +++ b/src/client/ChatUpdate.java @@ -17,12 +17,23 @@ public class ChatUpdate extends UnicastRemoteObject implements IChatUpdate, Seri } @Override - public boolean notifyChat(String fromClient, String message) throws RemoteException + public boolean notifyChat(String fromClient, String message, boolean isPrivate) throws RemoteException { - client.getChatScreen().getChatDisplayBox().append(fromClient + ": " + message + "\n"); + String outputString; + + if( isPrivate ) + { + outputString = "PRIVATE (from " + fromClient + "): " + message + "\n"; + } + else + { + outputString = fromClient + ": " + message + "\n"; + } + + client.getChatScreen().getChatDisplayBox().append(outputString); //client.setReceivedMessage(message); - System.out.println(fromClient + ": " + message); + //System.out.println(fromClient + ": " + message); return true; } diff --git a/src/client/Client.java b/src/client/Client.java index ef1939c..b5c34ee 100644 --- a/src/client/Client.java +++ b/src/client/Client.java @@ -19,16 +19,23 @@ public class Client private Registry registryServer; private IChatController chatController; private IClientController clientController; + private IDrawingController drawingController; private ClientUpdate clientUpdate; + private ChatUpdate chatUpdate; private DrawingUpdate drawingUpdate; - private StartScreen startScreen; + private ChatScreen chatScreen; private PaintGUI paintGUI; + private String receivedMessage; + + private String[] connectedUsers; + + public PaintGUI getPaintGUI() { return paintGUI; } @@ -39,6 +46,12 @@ public class Client return chatScreen; } + public void setConnectedUsers(String[] users) + { + this.connectedUsers = users; + } + + public IChatController getChatController() { return chatController; @@ -72,9 +85,9 @@ public class Client this.clientUpdate = new ClientUpdate(this); this.chatUpdate = new ChatUpdate(this); this.drawingUpdate = new DrawingUpdate(this); -// this.startScreen = new StartScreen(this); + this.startScreen = new StartScreen(this); this.chatScreen = new ChatScreen(this); -// this.paintGUI = new PaintGUI(this); + this.paintGUI = new PaintGUI(this); } public static void main(String[] args) @@ -83,7 +96,7 @@ public class Client { Client client = new Client(args[0]); client.connect(); - client.chatScreen.showGUI(); +// client.startScreen.go(); // client.getPaintGUI().showGUI(); } catch (Exception e) @@ -92,6 +105,22 @@ public class Client } } +// public void doSomething() +// { +//// new ChatScreen(); +// +// try +// { +// new ChatScreen(this); +// System.out.println("Sleeping..."); +// TimeUnit.MINUTES.sleep(5); +// } +// catch(Exception e) +// { +// e.printStackTrace(); +// } +// } + public boolean connect() { try @@ -102,7 +131,7 @@ public class Client clientController = (IClientController) registryServer.lookup("ClientController"); drawingController = (IDrawingController) registryServer.lookup("DrawingController"); - if (clientController.join(userName, this.chatUpdate, this.drawingUpdate, this.clientUpdate)) + if (clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate)) { System.out.println("Connected to server"); @@ -116,4 +145,14 @@ public class Client return false; } + + public String getReceivedMessage() + { + return receivedMessage; + } + + public void setReceivedMessage(String receivedMessage) + { + this.receivedMessage = receivedMessage; + } } \ No newline at end of file diff --git a/src/client/ClientUpdate.java b/src/client/ClientUpdate.java index 4faa272..83967bc 100644 --- a/src/client/ClientUpdate.java +++ b/src/client/ClientUpdate.java @@ -2,7 +2,9 @@ package client; import remote.IClientUpdate; +import javax.swing.*; import java.io.Serializable; +import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; @@ -19,7 +21,29 @@ public class ClientUpdate extends UnicastRemoteObject implements IClientUpdate, @Override public boolean notifyClient(String fromClient, String newUsername) throws RemoteException { - client.getChatScreen().getSentMessageToComboBox().addItem(newUsername); + client.getChatScreen().getSendMessageToComboBox().addItem(newUsername); + + return true; + } + + @Override + public boolean updateUserList(String[] users) throws RemoteException + { + //client.setConnectedUsers(users); + + JComboBox userBox = client.getChatScreen().getSendMessageToComboBox(); + + userBox.removeAllItems(); + + userBox.addItem("All"); + + for( String s : users ) + { + if( !s.equals(client.getUserName()) ) + { + userBox.addItem(s); + } + } return true; } diff --git a/src/remote/IChatController.java b/src/remote/IChatController.java index 64e6811..8230587 100644 --- a/src/remote/IChatController.java +++ b/src/remote/IChatController.java @@ -8,4 +8,5 @@ public interface IChatController extends Remote boolean broadcastMessage(String fromClient, String message) throws RemoteException; boolean broadcastMessageUserLogin(String fromClient) throws RemoteException; boolean broadcastMessageUserLogout(String fromClient) throws RemoteException; + boolean sendPrivateMessage(String fromClient, String toClient, String message) throws RemoteException; } diff --git a/src/remote/IChatUpdate.java b/src/remote/IChatUpdate.java index 55b2e62..0c9b54d 100644 --- a/src/remote/IChatUpdate.java +++ b/src/remote/IChatUpdate.java @@ -6,7 +6,7 @@ import java.rmi.RemoteException; public interface IChatUpdate extends Remote, Serializable { - boolean notifyChat(String fromClient, String message) throws RemoteException; + boolean notifyChat(String fromClient, String message, boolean isPrivate) throws RemoteException; boolean notifyUserLogin(String fromClient) throws RemoteException; boolean notifyUserLogout(String fromClient) throws RemoteException; } diff --git a/src/remote/IClientController.java b/src/remote/IClientController.java index 35539cd..bde0a0f 100644 --- a/src/remote/IClientController.java +++ b/src/remote/IClientController.java @@ -5,7 +5,7 @@ import java.rmi.RemoteException; public interface IClientController extends Remote { - boolean join(String username, IChatUpdate clientChat, IDrawingUpdate clientDrawing, IClientUpdate clientUpdate) throws RemoteException; + boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException; void quit(String username) throws RemoteException; diff --git a/src/remote/IClientUpdate.java b/src/remote/IClientUpdate.java index 9eb5bc9..c1337f9 100644 --- a/src/remote/IClientUpdate.java +++ b/src/remote/IClientUpdate.java @@ -7,4 +7,6 @@ import java.rmi.RemoteException; public interface IClientUpdate extends Remote, Serializable { boolean notifyClient(String fromClient, String newUsername) throws RemoteException; + + boolean updateUserList(String[] users) throws RemoteException; } diff --git a/src/server/ChatController.java b/src/server/ChatController.java index 79c344a..8fbff1e 100644 --- a/src/server/ChatController.java +++ b/src/server/ChatController.java @@ -26,7 +26,7 @@ public class ChatController extends UnicastRemoteObject implements IChatControll for( User u : server.users ) { client = u.getIChatUpdate(); - client.notifyChat(fromClient, message); + client.notifyChat(fromClient, message, false); } System.out.print("...DONE\n"); @@ -69,4 +69,22 @@ public class ChatController extends UnicastRemoteObject implements IChatControll return true; } + + @Override + public boolean sendPrivateMessage(String fromClient, String toClient, String message) throws RemoteException + { + int toClientIndex = server.clientController.getUserIndex(toClient); + int fromClientIndex = server.clientController.getUserIndex(fromClient); + + if( toClientIndex >= 0 && fromClientIndex >= 0 ) + { + server.users.get(toClientIndex).getIChatUpdate().notifyChat(fromClient, message, true); + + server.users.get(fromClientIndex).getIChatUpdate().notifyChat(fromClient, message, true); + + return true; + } + + return false; + } } diff --git a/src/server/ClientController.java b/src/server/ClientController.java index 267c0cb..bcfd261 100644 --- a/src/server/ClientController.java +++ b/src/server/ClientController.java @@ -1,11 +1,12 @@ package server; import remote.IChatUpdate; +import remote.IClientController; import remote.IClientUpdate; import remote.IDrawingUpdate; -import remote.IClientController; import java.io.Serializable; +import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; @@ -19,11 +20,11 @@ public class ClientController extends UnicastRemoteObject implements IClientCont } @Override - public boolean join(String username, IChatUpdate clientChat, IDrawingUpdate clientDrawing, IClientUpdate clientUpdate) throws RemoteException + public boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException { server.chatController.broadcastMessageUserLogin(username); - User newUser = new User(username, clientChat, clientDrawing, clientUpdate); + User newUser = new User(username, clientChat, clientUpdate, clientDrawing); server.users.add(newUser); @@ -34,6 +35,8 @@ public class ClientController extends UnicastRemoteObject implements IClientCont System.out.println(username + " registered successfully"); + broadcastUserList(); + return true; } @@ -47,6 +50,8 @@ public class ClientController extends UnicastRemoteObject implements IClientCont server.users.remove(userIndex); server.chatController.broadcastMessageUserLogout(username); + + broadcastUserList(); } } @@ -75,13 +80,16 @@ public class ClientController extends UnicastRemoteObject implements IClientCont if ( adminIndex > 0 && userIndex > 0 && server.users.get(adminIndex).isAdmin() ) { server.users.remove(userIndex); + + broadcastUserList(); + return true; } return false; } - private int getUserIndex(String username) + public int getUserIndex(String username) { int index = -1; @@ -96,4 +104,19 @@ public class ClientController extends UnicastRemoteObject implements IClientCont return index; } + + private void broadcastUserList() throws RemoteException + { + String[] connectedUsers = new String[server.users.size()]; + + for( int i = 0; i<server.users.size(); i++ ) + { + connectedUsers[i] = server.users.get(i).getUserName(); + } + + for( User u : server.users ) + { + u.getIClientUpdate().updateUserList(connectedUsers); + } + } } diff --git a/src/server/User.java b/src/server/User.java index 7211122..543f26e 100644 --- a/src/server/User.java +++ b/src/server/User.java @@ -12,7 +12,7 @@ public class User private IClientUpdate IClientUpdate; private boolean isAdmin; - public User(String username, IChatUpdate IChatUpdate, IDrawingUpdate IDrawingUpdate, IClientUpdate IClientUpdate) + public User(String username, IChatUpdate IChatUpdate, IClientUpdate IClientUpdate, IDrawingUpdate IDrawingUpdate) { this.username = username; this.IChatUpdate = IChatUpdate; -- GitLab