From 4fb8aa7349cedd32dc61e7cabdcd5899de7b951f Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 3 May 2018 17:18:29 -0600 Subject: [PATCH 01/17] devtools: Add Notifier button --- .../client/plugins/devtools/DevToolsPanel.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index c33753d4a3..a888df3334 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -26,28 +26,33 @@ package net.runelite.client.plugins.devtools; import java.awt.GridLayout; +import java.awt.TrayIcon; import javax.inject.Inject; +import javax.swing.JButton; import javax.swing.JPanel; import net.runelite.api.Client; +import net.runelite.client.Notifier; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; class DevToolsPanel extends PluginPanel { private final Client client; + private final Notifier notifier; private final DevToolsPlugin plugin; private final WidgetInspector widgetInspector; private final VarInspector varInspector; @Inject - private DevToolsPanel(Client client, DevToolsPlugin plugin, WidgetInspector widgetInspector, VarInspector varInspector) + private DevToolsPanel(Client client, DevToolsPlugin plugin, WidgetInspector widgetInspector, VarInspector varInspector, Notifier notifier) { super(); this.client = client; this.plugin = plugin; this.widgetInspector = widgetInspector; this.varInspector = varInspector; + this.notifier = notifier; setBackground(ColorScheme.DARK_GRAY_COLOR); @@ -121,6 +126,13 @@ class DevToolsPanel extends PluginPanel container.add(plugin.getSoundEffects()); + final JButton notificationBtn = new JButton("Notification"); + notificationBtn.addActionListener(e -> + { + notifier.notify("Wow!", TrayIcon.MessageType.ERROR); + }); + container.add(notificationBtn); + return container; } } From 238471979c2ab18286248c936ee1b66e40f41702 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Mon, 11 Nov 2019 07:59:43 -0500 Subject: [PATCH 02/17] runelite-client: Add custom notification sounds --- runelite-client/pom.xml | 1 + .../java/net/runelite/client/Notifier.java | 79 +++++++++++++++++- .../client/config/RuneLiteConfig.java | 7 +- .../net/runelite/client/notification.txt | 2 + .../net/runelite/client/notification.wav | Bin 0 -> 156282 bytes 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 runelite-client/src/main/resources/net/runelite/client/notification.txt create mode 100644 runelite-client/src/main/resources/net/runelite/client/notification.wav diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 858bb1afcf..1aa07f642e 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -267,6 +267,7 @@ ttf png gif + wav diff --git a/runelite-client/src/main/java/net/runelite/client/Notifier.java b/runelite-client/src/main/java/net/runelite/client/Notifier.java index 20bcf83c97..4ca97ddc6b 100644 --- a/runelite-client/src/main/java/net/runelite/client/Notifier.java +++ b/runelite-client/src/main/java/net/runelite/client/Notifier.java @@ -33,6 +33,9 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.TrayIcon; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -43,6 +46,13 @@ import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.inject.Singleton; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; @@ -61,6 +71,23 @@ import net.runelite.client.util.OSType; @Slf4j public class Notifier { + @Getter + @RequiredArgsConstructor + public enum NativeCustomOff + { + NATIVE("Native"), + CUSTOM("Custom"), + OFF("Off"); + + private final String name; + + @Override + public String toString() + { + return name; + } + } + // Default timeout of notification in milliseconds private static final int DEFAULT_TIMEOUT = 10000; private static final String DOUBLE_QUOTE = "\""; @@ -130,9 +157,13 @@ public class Notifier sendNotification(appName, message, type); } - if (runeLiteConfig.enableNotificationSound()) + switch (runeLiteConfig.notificationSound()) { - Toolkit.getDefaultToolkit().beep(); + case NATIVE: + Toolkit.getDefaultToolkit().beep(); + break; + case CUSTOM: + executorService.submit(this::playCustomSound); } if (runeLiteConfig.enableGameMessageNotification() && client.getGameState() == GameState.LOGGED_IN) @@ -369,4 +400,48 @@ public class Notifier return "normal"; } } + + private void playCustomSound() + { + Clip clip = null; + + // Try to load the user sound from ~/.runelite/notification.wav + File file = new File(RuneLite.RUNELITE_DIR, "notification.wav"); + if (file.exists()) + { + try + { + InputStream fileStream = new BufferedInputStream(new FileInputStream(file)); + try (AudioInputStream sound = AudioSystem.getAudioInputStream(fileStream)) + { + clip = AudioSystem.getClip(); + clip.open(sound); + } + } + catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) + { + clip = null; + log.warn("Unable to play notification sound", e); + } + } + + if (clip == null) + { + // Otherwise load from the classpath + InputStream fileStream = new BufferedInputStream(Notifier.class.getResourceAsStream("notification.wav")); + try (AudioInputStream sound = AudioSystem.getAudioInputStream(fileStream)) + { + clip = AudioSystem.getClip(); + clip.open(sound); + } + catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) + { + log.warn("Unable to play builtin notification sound", e); + + Toolkit.getDefaultToolkit().beep(); + return; + } + } + clip.start(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 2c4cf3597a..287e0468b2 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -26,6 +26,7 @@ package net.runelite.client.config; import java.awt.Dimension; import net.runelite.api.Constants; +import net.runelite.client.Notifier; import net.runelite.client.ui.ContainableFrame; @ConfigGroup("runelite") @@ -155,13 +156,13 @@ public interface RuneLiteConfig extends Config @ConfigItem( keyName = "notificationSound", - name = "Enable sound on notifications", + name = "Notification sound", description = "Enables the playing of a beep sound when notifications are displayed", position = 22 ) - default boolean enableNotificationSound() + default Notifier.NativeCustomOff notificationSound() { - return true; + return Notifier.NativeCustomOff.NATIVE; } @ConfigItem( diff --git a/runelite-client/src/main/resources/net/runelite/client/notification.txt b/runelite-client/src/main/resources/net/runelite/client/notification.txt new file mode 100644 index 0000000000..e3a7245c61 --- /dev/null +++ b/runelite-client/src/main/resources/net/runelite/client/notification.txt @@ -0,0 +1,2 @@ +Notification is cloud from +https://github.com/akx/Notifications \ No newline at end of file diff --git a/runelite-client/src/main/resources/net/runelite/client/notification.wav b/runelite-client/src/main/resources/net/runelite/client/notification.wav new file mode 100644 index 0000000000000000000000000000000000000000..60321281c3e0ce4d4508b16b24501eb1e0787e1c GIT binary patch literal 156282 zcmX7PbyO3M_x6aAocmTWr$3Fl7xQG|P z4*>tq6A^YMp8tQEbN~RH4T}#Ou;=}s_5Z>1zxe;d|4AOe;UO$@m_nFcL0%93k}Uv8X7MqsnM_nd42I~!@s4Jt zB{17xxi1_SKj%1WrBpdWCYxzR8#HF%q22!y0L+_tD=)D(pTz+5dAoAh1{q599TcfX!tkiP`%-r+CjP4XW z>i(#Ct^TXk33qYeKSaya6}iM&Nl*sopDhbcRFvX}!i>8u0zJ;^>T`Ig;- zk5)FN>3WtrnWs#NxkCnd1z)wVR}84?Ha)=p>#kQIjQx;#Lh}%RwA2awzGHY$EAVSG zTgqzL6e%)yR!yBMW>`3hwk{rd>f+pw_PO0P85q{~K18Tl>+G$@50SO?#ZhB**Q2}Z z#-cyh4_vZsjJQ~Z&yLt?O$b}*v_0{luj}a5VHb}d6C-w#)9*|s=$|yv^HP|t6`X9q z7Dq@Lkh`}j7{1a8@|g*e|1j|c8PKbtRF1dRn5wMSB^SOkqURNx9b_V`+&(wkjC}lJ zSD2h>Pfu#MzmX(uAN~HREj|Tp9i6&te)j90@u!@l`kZ`0tw-pK{L zS9n6B<#~aIxr=`FcF{NLO=GS$v`0HOtwqf=*G0Ot>z@to4hz}r4-H%zaq(82)N=ks zHnRMWaZhiat*qR;<_}Za(Ua)rA@d{&Ki{yCJi^L{oFo;Z2!jU7vu#S6ziV&mIhJ6J zhw>rjaXCk=48OM77^YsbdzfNrulU};9+%{8_afw_#(y;ZyznzntJhlM@mFp zk7HQaU`?>!nAp*~QvvQAN|Eg()7IF15u@R>eiK!?8zmjdhZIy7t={RBidcfcTxneN zt1)jC&u%HL@5h4La}p@LiHYPnCXE`IB@A*b2crGFsX{eJ(`PA=)AEi>_-HT3GCg6hf2R0SNY~ZD+3dS~TDM z`~{HI3`XH2>8^6Z_&GiBP^*Pn?<1#$j{9B_t)ByO@U^G@G~&-ZZ%B+ZYLL8C)nFVW z)wCXC-s~Ks-lltLu(LW+s&Da3-4N+i&Ukh}6Vc1dn8xd*Hb*coTH4g<+PH)B-hT&? z0Q!n`i!B@m$h_b@S8$uP#s*GZRGsVxXs@?y>33E;n%pWPo8x}fS<$nGYz96Q*o)#|aysG0*Z|sAA9ST)dvogcYt>T4! z*9DX&We-J|)m+WByDPy5@vIn;YMPr|IB^*BXlz4MbMTYNm7Z+7vmM*+;;oO4-oeYB zC~iy*t8ZA1$Y|h?@@s62o@j!`YP9gj+OUf!RhU^llHHkZ`4`R9Cr=crziT2q3E*wJuR+W}XD z;_fV~!FE5FKP^^19(eoX<&8F{*BcP$fQ_{m*p0%`-|*ZRMC+Z{ppN7iyB^z1*#ilY zext9?SWY^exG@5hBj5a6XrT&fSTrm+RfL(TmHRWTqSd zOhJlq3Cr@QM=mP{^(Sg?b{U#EwA(v)wxoI@@Us5ZjcF&<8~M&$YBY>|)C9d0(fl<= zqOCIaYUjDw_}=f)w8489-;C{_yD()C`iWv3WXFX2K3@R1hI0Vcbvxz;;k-jC5RnCi zUy}JC7Q~pZ3RSVms~j+2t6@Anq5Eja*XU%sg4trNuBBheL+d~Jg0_&HTH8Ng(rxd3 z`fl?znP3G;vbWesm^Cp=95$dO$>=Pm)Tw!;krcNwULpuTM&+jd5Cb&}G!&%6yeH=COt}(;1HXWPgW|He_6W+J6u_`F6 zF)MVe@l*s1KXg&EWik4&Ej#vQ*KBN7UqcLdSo2cRxJBf1A~(E(8h`TUY}YZ$qNFEd zJ;MIX-mD3dze00DbO(J(dQj#G?1GREhOz6d61P01sY&nAa~_vBCU=*bA)CHfDpfRC z%M{4l3g)KU!oIoNhNUUmtfpvKjVDEzBNA!GT?s$+Nr@d={>i?oDxZR|9$!`!3bS=& zE%VhRh{ariYqkFl8Ew&9LPO50#U#J^LRKDqXyYV_%ky%4Puyat8~UQxOX+TBl&*4{ zutid{h*Nu$hgWCg-++upkr0O_m$Q|4mkZpMjZ2&DcClIAn7H2l_pz=cAEUP?j4v*c z?wxa|-#e|(@;F|yeBh1WEOs_IcxE{bOx3$9E~Y#qBMe(oC=!2w)#7=o`eS`v%We*@ zuR@$Nel&2xJg!yJ3Rc5slUbx>i~4olwmfUq=GNyl>jxh%TaLbeX!bI3&?qb6svauw ziYEViin7~>el#uZD6IM06X}WEYhogWwm{p;-TjmJrcI09+~wklwzj zu`z~_*5I(r_nv#`){X&<%+|lgR?R!MIZYqkCmK&5B{%AysA^gX3u(T6zNfV+YO~{W zOjD0^-0lD(?&@eo40LinN`%~S{_2cl_^tVOC$Os}M}xNd+~*H>Y%>G{j4eQd8i{gR zsC$StDVE|*fp)dIZ84ooi~kHXslQA-Mpw)?I&WCHHJIB(m1)}E|Kn+!{{4f^*!`cJtK_}6yHvYaB3YrpUDIh0!M@zzUh zq;vq6`iISCACvKv$LzAn94>COg%3B-4r=L6R*>$HQbDw8=r7Xj? z9XG@uKP}dB;apyu$;Iu?f@n%_Q!HxeY+SjAlzA79e#J9(4Qp2>WY?&Y!}Do zwghSA;`L19n{L}nHi>yYXlgrFi+^;oxdndaUHhF#VE4;Qy!{5TKEp9_gX3m#NyHB^ zMbuYOA+zZ7KNl~Cy<2|}%-W6fd&U>yrXd6w0#%%Ho9Y81ZFAiBxN+P2Beb*AZ!v-s1q@&R{XUHZ#ajGeOY`kI}i-v}Sg{NzE|; zpLt}b**M@_TkENpojPajdIK&54XQ+c9ZilEnoNvqnnuL&%~-~4u+}eTtoTJtb0b6V z9eM;=3QGD?Bqm&pqmoi zHbHGPoB0}Do1?`AR+Ya_T4-fEnht%AH!T0Ssk8WgO8rryzS8XkDb!@b8_4&h8p*zt zLJ{w@XMC`4K6|iS%?--}ou%-KnAxZ%AXTqNVCwbwlTkZ*(tyFTRgcx~rw&KK->rty zkDAwz82nlFgr;btzNQ76DSWM4NlS&FS9?`(YFAF!rM_e5-w#zq&5zZ@T%S4`cam~D zu7_a|OJd)<^kMB%)Id5p;m+W$btnk?hgG;`IDqVYNkGNy*v zf;^^@yK)vuOP8!%Y1`H($Es{LyK-$z8yl^i%Z03L|GqG{`(bBtF2l*7DK%63LQ0t0 z`J{Bk&V)0F|se{N3qctBAKp$CJR??!}Po ze${gw!?24|6NS+qiKN&U)X#CUvvaZjiyhGx>rNLlcQ2iD0t#&s&k=0|^!&F2;?YoBUwOXk0H zvztGajImj}di&`*TJVnpD(~JeVNNDyD!fnFlF?3-kkEV26-fEebLgI)yXBJkW%WiL ze!j8La7Ls`a9Xd~YeKkBVK|KNpbx}&)3vhV+0NSQYM~2BGD}V=U^y{(tAq zfa_sQF{KmUGDb)J6wKX6Fvo1$RI-e)T2AU@y>KMg2q_h2mI;)yl-LGXrz|Mi1X6C; zJRIR#8+PVcrPe>T=r8?jy78N9sQNue_sQ2H4M?hv@@}#o+BB&PN=T5BrY0c7e3F1b zY|8Y$XKKr4)7PHm%iqOVj(;*}xUv-DQa$hZthSD;&q8Rjiti>o2r`txmOLT^@Ix_0j1oIj%IcaN1yO`CRB^?nUbKLG%uNA$Ecl z9e01_ZfqMD8-4lk+yx84z_U~d!4N~aHvwS8{*iNvcN~?}5awRmLOKNfQ;PM*4)Po` zvdCpi{{uDa;Z-@Cy9@)HTZB8-E4>^`(dMt_jLIh_xrN0B=kttp95Yes{^|E{e?CMa zkH24%Kbxo~Ihvp?@;6bIZ{hvM?u(DJ>+zp?mvXXB%mRLiQm+;%Pfb_XjViRx4D9y* z>G7SybZ#=e+j`b)TIvqC_dA zo|9+)b`V(QZ%4Wtnf+(GsohV<-gXGkwp!a4Ra*XTqna~-bo?{PtIbY`-j+61b{o~8 zxij9{s5ih>a4_5#FnTpeoDdo6OHzywr6pdxI{Pj9%c67at@Veoqr2WQ@qCq0QlhQr zZ%DlizX=7M+(TVCwx-nO;j5u|(CUQVDZ33Et& zufG-W;oK@Zt$W@e2I4T3(@*{J)p%I zaI9rpRH5~={LeO!;%bMX_H6fz>AC(5d(B~cPrmV-W9-Sz6Y^w4_z<1v{1H~-#l+>N zOOG~RM>F;pFI@qyTx5x*otKr_4j+IaP6=QX0{$usdo^ePoJ@3)79hh%y0#`BN{wb& z&}SBT;?FIg@zhy{Y-m`XVD*~kkn&AW40Rdhwj1l`)g5R(Db-Q){xhMd{sWBE_{Nk! zlO8Wg`Pe1$FNKGnkgU6ZG9`A??Bme#`LtNp^w*R0cRBw^=kjk&cocUHqiRa~8(Zvq z4*KqQ789^`gcYn*LXrNV1!d5mBCjd z2IWN02q4adlwy;Q53A()p4O~%^UP9kh@1(H3Ipa_~6)4DSC!(?i@&-NKj z*R7HH)2ERQ34F5}c@nVoER=i@eue_vJliT}f9|-n!`WLd>eydR zha+I!2TqgvG)sWdbAvm^&($1F1W-p!a5DME{KBqAo%{L*pVs1ZlV-)Vh(u|%^q~|S zyW=ZrslgV8uSk-4@GnckD*w3<=!YM#Ko(+8H)DGv`OEII;TO|+`LAs=Cf|z5Z?Yw( zMDy5Vd4B?iJxYQHrmK1S%$ogrOnZF0%SL&-Q^=9s^{l%+xOL0EvV(5}CxqV(?@N!4 zJwTdF)~KeD67(ghLl&f&Fh>&>#M6Fh%yR>>a`2(*%CRcVzg|S0%Pwd2{cT(fV~rmgku^n(o3YbI=8yx!bK(~bB6-#I z&T*ZzA1}12lc-h78RI%wTCX9ZtA!|kxz<8ztu$2Zd_kB1?WZ5$+IN>7-7LR#$hZHN z%rf{`$r-(L<;y4uN>L=O*p?sv z$NzwvcXi9<`@gmNEX?AW%&}R^Oe)PK%WwK|j_D*VH)kyLclt28!J zTS4!K{_)Jn-fphcb{R{jK z5^FB*JKQv%;|COfCcj87Qo)6UO<$M$3o)z zl%#uGGsT&8>w;tDy1XU-qV^JgS8U$SQ(1lby`Np0-M|E83)4Pj*O5HG&k>aJQpaGw zM~6}W{thC`u>*iQv;M4>%|3chaR2wwuz~(*p`jyl&Lf~TfpMNa*rc?89Z3}&Mp1%2 zr_U;~nLb+G^Tx)$%Qvl`uCF_J?7Z{54AAha6{reW6;lbGmb!E@0&@RUJRH#6+H>*fwRetlEo8@*Mdr7WQy!X6Ph0Y%RDq$4p zDZ>nU1C2d#1lfP$KP=w~2W6R{cs1bws3zN2SG&uzP^a8EMHg>F(B(J1sryOis!p=< zpq4x$QNvccPE|`dTnTXa8Z*A`gczI8gutkOrCY}DO04yvh3nh$`5YTG4l*jMwn)Vh z9JvDfCI9>o)~~$Y8A$FI%FiET#N)Z|2x>pO#-x5HkBAhm5Al^Q4$fCS9n5O19u(+! zGql^kH5@UqHEK+~I}tp8da9KZHhp&AlZq2mn3)3$%)W;O%^xTpTN2Td;3OGc-MVb$ zckse7lE2pdy2y^V6Ikn5v8-F*513;R1O*QkQXB}1S3Yz6lp4XmPQ%*oz1FuQL)yZw zw{#Nip6a-oFKN5#S8C;}u{2(yAFA=mzf(34hbda|>7#768L;Eac5=TN{*t~#eX-c# zMFB+j2c8?vR(l_7xtj^)BdhU6jD_QWZRVWv*>snmyX3IEyTtUoTZDz5`(wv`i;s2} z6c0O=EDjY^HV-Y;8xGI5T8!N29Upx$dN|HM{cUoJ`5y_e@`4h+9Y&ZH87%h5^NS?dw?i)Z*nNeAfKrtE@e7JKj(=2s z7HF+@*Z-u(X}<+c8!xt&lG{;j6$gy=G0US`ctf_v8_i|4PQ?h7k1&56Sh5!#AUFYk zw*L&$z@bWG=6OK9lvUyB@n-(`{x^p|+E4BzG&*cJRr{}yO24rq{~6A5{$S~^^RJT) ze_0SWe%>ea{&F3!{QYILq~O^|VKMK>w+gwDn7YQ1z2?19_3pND%8>M=;8YhekzP)Y zSxBY5+X!Y*59H>2gh1>@$rno!3b|_tTr9U;vuTfQ7|9!HsUn1NXc6CYm6o14vL)Z? zdj_6)%nN-wpiGf3@Qd=>fCE)te}eisKMl=huLVt9-h?Q6Q*E%;5bq{NH|4_p`0LEg78cI_8pl z<;D4@CDzQ6!e|=f50H%c4JO9srxE({^Tw_J*pJl~M2(sktBw|x-xw9CJwB#^ZyVp} zs3mw0Xb=@AIMbn&5$g8bry0_!_U!IXFUyv{ap9e~^Gc80qxEsrx$U>AZ3jKNk^EOo zMMT1Fu7VypJ(Q_(he5Z!j1UHXgXoZBi;CC$-zZ=A|E+rFn4`LbU!VredrE`r-lH+= zq@l5G!&S32(^DPRV=8s2$thZ6hET2$99#edg`@%-q@jB%pkHgDB9W{+z&OfF0A)ON zceuZ9GrR-1me=%nv9!j4^{xCE<3@2C)wS^ZG~(~()ZXtF!rX7z1pUwU7_;Eq*kV!W z7`u!$Hc)*y{JNmz94mQ>j0 zONEoWKDZV@p=O}KW5ZF=d<$Voartb+RbS|>ZiG0~#9!*U^|V}o;}Xo)?IF_i$OnwB zk2((NXQzDVH>EP_x1yTm`&cc)`?Z>mr+}J(D_3R9K1>;E<&3*-{12m{lZSLyF;iGZ z#>pGV1xxFR3xI_ApNb6cP=Up(Iy_Bt_x2PhL@sIkBnLAfy3E(PJ^u-BIJ;ciO2<~# zQ7lSv({4pPME}B*lV=Jn2)7C{Cz1=_P81gL5!y=k2_2QUrhe32CD}C-$@e=y(%c5l zG7`r{=bXuR=EG*E7Y3K_EkED-ycWe1ws~Hpb0bv_mX730NchqN7DaZGS3fmW_s_uJBHNx9P^}FXAl_ghqWnagaIFhv! zHq-Pisz~o5TuFTnB7>Ed{RG_s_k#1q`UDMxDh__|S_8hVt1A1-1PLWuCBx4<{D%^E6~Z=qh~pl5r7M~F{8L`?aZ&l^6Qbhj%~9U- z* zv@O0luk~!Q-pcQBuLZM#;gg9U9IHgvUKN<1w{bcsP z{YhdGa|&GQK{BjRC7ab;p$aw1%)DwPGc&tCu&jn;7Xk>;OBBl3%FtXA2emq~S-M@Y zbCVZ*=q=jE2a_ohDu+K52PlE0Ml~(upoXi^LURqo16u~_x|0(2h1-H+wx_ug-b+-O z>>Z}O>us(q@13M%bmSr~#Jv^!+4&cG#}0vfX{o6YXiSv9qhlo_q zpkltG0{(}W_YZc`*K0Rf?98>h^wOn^Q=;sF;Xku&JvlRH+777Ijm>0I%`R!WBA?h+ zIy#kAe1Ga%QQnkOkrxqM97~!g5h5p+OHs9|pU}V7n=_l6`B*PHGuY$(8;d{3)K->B zkJhpoP8;Qm8C&qp24@cNwU!CW0D{O0Sy<~ZB#d6kVQJy@?IyGLwR2f*KzwJz< zes4}E->sLQR;?B#m6hKn>Xb$hKNt594~q&&A;kjZ@{&Ocpd3gys`|jNtvfjU}R`jYznvjjJCabZa!}3>)N9O=q`}2fv-_8PV9;pSe6OCjo6ZTtCS2; z(<)TZF?2`1G><_eZQ)p=W1wQOD+c%3BOdqmi0}V$wM_A*S0*<8h&1MwhcxPq>o0h< zBLNDsEtX3&x0H@Fd;v<<$`sXBP8Re*UgndMb3RNE$L=!trMa4WDx620sO7`?1$Hy7 ze2z6a!gxOHLoe+ypuTE*LWVXuPhYKlK+3DsBQ=$Ukh)6vraOvJcvyYs_@_UJ6 zE*aCZnnqRG=Ix{(P{Vf|QqZV6liKe^T^p=Az zb{Fp&2Q3)5_ezw`-v_!O-Xgsw>m#p^4240I*Wk~!1W_jpbJ0)CdoeRMPqCLByRi`0 zEbNdwANG?c2Yu$qWt8!eX9%#Tj>5Lv9mt0B6wQDV}xU*xAgTVPCMgZDOW z^B^C7u=7L)&V`Ge;w1C+F7NN$T)4A#iKQ}M$W)+t&BRT5)9i+8C|Nxz&n=?hKY zr#EURr;k^?AZL_+rwo_s(zqqK8F1-MCcF&6lCM}}Z&Xz*<<#k}ir|lOq}$y#ihIJj z#G%>k*Mx(;Qc6C+XReLkX9Xtwbt_67&htd_pRk3jvD7`t8901jk(yc z`E{Xf!!-Vz+691cmA1Vh6nl##uetFJ^l?>3&}b?DK#r}wX+Jl-*up4de5WsvSkw<= z>6F&~YV!NeBV7>#%Mq+8qoMD+hyQLhoWL1SE#BI!i8hJ?X3Sz$Y)=! zuFRZfNzxxuKU0B|i4?)%4f22;XRXVw%-<>V zTKrzFyHZv;x%RC_eZ#9kpZlj-fBSbw)UH*Z{K1J47oNk(1%5P*B2>g;i{-42f{EMl zGIqSbbZJ2Iz+DtooG^y=C!gy|FH{3-E;yWPr06iA9r_# zg?Wt1-|zs*rn?_X4!agg;GA_tKia<#G_mgFlQKIvG&eBXYt+2IRjEW@H$z@tJt=3j zWG-RGW&>Z&z1i1dnr>*$2rnklAdC>|V^TWh#Fzu6u0MoQ(>YIxYN1o78eHfKwIGI3 zmC3AOMHvfTes6(O7PDMY?!FdYIl9iO-rlsVCvQ362X>a*WcLkv2!{eg%6#DyQ~_J^ zs7MO4OXA4V8>thUE3%mfBnXe7o5D$uAtG5m8~Fs4h61Tz&=74K^bhA7rHb(9_w$>e} zcYWi@=@$VOj*baA5hF+OE6F7&l(;_&To!->L|1b}<7k%ASZK|^tBP(-Ou2+2L#8h0^^r-CG60RQI zNv&oifxb?0wduOid#hzU4sRRCoI6w}5nU~SV2G(`^3Tq86i)oH0f-6Y?nWh<8dCP?& zC}_P)0lOE12;{$vd?zM`%9Sxj-G_6LT*afv4Rtp}s2){8(F6)px8%x4+CG#Wbf}XG zb}j<}T;s)RTm^*Rx!wfcbs6V*=A?5_Y@e_rX2Z|TG*9Q;HafNPSLgVmyIR`(87yW_ zMuC?ZBW*MDPIQ{~AKxtX;qD3QGmZtdjQx_TI^#&&CSIhQk8R8V2Pn*#E@jr^)_S&o z)7K?VUD0Yp&DeTbRTr08>ASO6d1{YSg*|AjSvmBpm*P!p`p5sQwObI}WiP7NPnTef z#7L=3mB=npUqLikBv{YNFL?RZBBBpaisT3ZQ38@|BolHGc^&->k)~n?H_*<4=^B2A z+%@x&6R`d(-E4;k=Q^f|=R4bqbh$JN@Vlz;1-d*tYWq}vetph8nAoncQc$rK6I=ewTPB}Sqn}A~~ z47<;H_cqU~bi7_HYffC@Z^U!3b*r0@8qzkqDs1m-)tv*q>JY%^nj^gZb&vUL8j*rN zEf|q!9hbxddi%jOLr|IG35dKt`43cwiC6fv=z}=A5r}l#ry@@PImip*sYqYhF~mB& z1a6AcRX9-hh3e}ew?FEXw%zLh z*<7@(ShKTwwLEN^yijbwU@d7qnN3x>&1gsW(G#JsXhKrIsqP|X)L32<>bspxDt_%I z4acse_s~x>28m~9-N*1OkAb)aR#(KbL0j^g37)jU-ypV~RZHE4)tDb#s@4HyRPXcT z)hzMdt}_$hZ(J2JYZew0Z$AOL+g&8}Vqij6Z7dsdnz#;w(d*&f^M{C;)hcAe_7<{< zrv=#~tb(kOR7PBZwkiyw1!46nYw{TF*Rl+QQK@ZHBFNJ!Pi)lIN%)mRJuut}%X`B4 z{=rpe(#~HeZ?2Fdne*1}%Zh{byG3Jj{Ctd&?HoW?in*g^HxsKkOuG*6rs8CEsPDyj zspCLHuoFt~0-@V|ymkqh{3aaOChB(N)4rnc{$y!Z$LwoXumpQq#^ zf@V{ZrAvaS)0_K9n}a7veSsVVLgEa3Lbes=h3JO_qm+J=%ISJia zo1*Q&9h+v@zHwvT;a=Tuo{zPme8ROTpiix~;JLbg!j=s`#2T9zp!pVa>5`5!a?oA_ zC~WANLg}~*Vw!Xl`DO-=`op$Hsc_gx>W&t&mRAIkD)OH~pi~KT9Qss#9}Sc(Qn8Sl z)Y1V(7|e+}m|hc#u%z%e*qHFR+dtdicOY$#Il66*I*zSz9TJxv?4K^w*wnG2Egff1 znPM294NlWdwfSfcsvznB<~3y<7Ei%T_fZ1GQmJkH12onB*qPLgt4yt>;kg6mGqxh- z@lp|?akX|>cjH7~`BqvdYVSp>#-Rbem?y8Hm2bZ83lLCuUvQx|TR5jqNetd_DB;#5 zA*IlQkxgh9fMj;RgLw~phJPGIAmgXNC<65cs&eimYHzt0`HDM$a6F8KO9=jhwMu-3 z_{izXy+PcO4#V9CSExIS-_a!se>8Fv0GNN{&9j<4cxtP+n`HkVx6J{tj&;mh$#sZd zJZk@HUe}g2Yh(45kzn?hu406x!E^!CYw8{pcN~yXfH0s`$PH0$f~ZtcpCqT+uqZOn&A0s4s`B3?Ti>R3~2Xr|R zjFzT{qnIowq{3<|{QcG}Ob74}GAyVjcM9Y$T`Xq}E=SCX`QXBYqtwfQ9GzvJaYN*R zsG0B1W6P9H0~_v|g59%a9edA(%l3gRid_-&zHRu7kM(uh35z94fypS@%RrOtt-U>6 zr)p0Aja?yY!6DS+vIR5;i9a*Ef}q)=!){ji*5rcTs@97Bd=2LT{Tf%5WWVb?zH-1C zwBp6~@&I`{?F5rrb%aTHNzvs-lz3;u9Z+n8qSQ#kt_-JfOuiET5Qc2+hbwhtA-lV2 zD9M30=&g}l^sPx#^ec)N3OdU{NH6KbPi)A*M)xx1&+rpvn4*J{HqtL7j=_MUBADZX z9x8A7__c};(fT91DaL@Uqvp=*N3Dui{aSP1{pv_Lv-oZl9w6EB2sf}yu$3NU9Y9Y_0iRY#l($1 zX54ld<=B46BrnhCh!H=bzfa(9H%q9qy;-EI<)_#ie6NIblcQv4BTy!`ktt``R0{o$ zw}O|q1R~G3&!Q^2Na&w^mKd{PA33UztrAwr$~NWp4N37W8dQ|lv_C0j|+uk)O-Z(VbUUj#KT^g}Mvp?8C=U&^MVU*a4 z(IsrZs^{tP`4lIy!Ig6(n_n{Km^@NKyTeukHk zzSG2(HE0@!cUwkK6K!zJaAzAPws#EkYw#H6$(SE{eQFB1LfwU*o2!Fa zFDpY%Z`#TJ*_W0Q0e+V_E_NVtOIlkn5N6Fcg0?!GRyNx`t!dA7(>up`YgD|9HZxk_ z{;w8@S%a9zZSK;iY&@ySHZRDJto5ezE&WK+=8MD@V_s61elkg0J7bzp4NW<&C`GeI zT%PHYGnfT~z2{Ygs~1&xBUcr7y*BjMgSVp=Z|u{VS9uC4ARuEBCX_V#QKWO=x7g>N zbP4IsEU;DEj1;Ejylg987NUg5!z}Q&h+X_CRB+2K+P{qtyVMbjRqL_G3J*NRyd7~u z|8Jv+yhx6P|6r^@y%*r}M>spu_jgjjojmJeAYrVq9#|77FOTHOLkRA7D{gFER^zU} z(nhTE8^kS+81v3^%%++CmXb5;R@u}6>o4RPYk_H9>sex@r5*8sIh2@S5=&e%a3KBG zNt_;151?FDdPDn)(qu$HwdZJ3PuVyz)nzB32q*9W!Hwto?iQ}RI7H7s=OfaE1=mRn z!uKca#9j?sODOg0fJ3|8q?|kQWGJl;^7<`%P}}BAIB)YIGOn48zSH7{RcsShjOb8R z^yn_Y4)^6^4u??azHud_5vffZVR#*36`wR)Nw-FguKC1v6H%Y}bMyC}+h>sB--Q&*oOaj^{py zlfo0e_!=lZyC5V(%@KV#H6k81)(q+%tds2NU6YRMij!++G8LY-+(T|OSD-;H z(b&$G7mCQXJw;GQk77m_zhZB1F(!L(1_d4aiO`x7Q5d91L)MtRGB+3PBt6!zi~H=} z7Cz4#2)rhY;0Xnf?TN~N*a}BnSocy4TWM5%weVeQeQsGVpOI`-O?zpoO=&X+O}kp2 zA&OWTP6=B*opiMfoNPBQoP1~ceCoT=G*LpoWSXpXNI|Mq(WezBm|DnV^B4$fsZ&yG z%~~{e^F9Cg&eXogp$_*mU(U*7LC^UH5t|uL@psc9AWwpeH>0<-gveiA-khV@i zg-7k3h~-vKG^q6?cA{lc(XRCm&be(AH`9I`hwO4t-0sQ4+#EvHujy~Fg;1^FsDpTTg(uQEMo}$7WWDH=F*crraDvR#+}3i{r}O@xlAolkDjSl z>YMdLzhFOxye)6D@&SZqBI?B1IJ1oL?86au?AZ-lQcHj9PKhJezk36fUCFVcSF zwX#b?UT#Q3$nn0&%OZ## zb^}&mj;oR|lc#x=+MwGsZEARr2sA03#F<4AUYh4l7+GAHP_ihS2r~bVFmB44%={m} zdIKEUOm~wC*EC>UR~ei;hHY8sgdeOhh0@`dw7?3W9!ZC(@2TzM?< zbe;+SbP%OL5Guvtvgu) zR+~q}2UeS;6Bg&8uUMt1UWSCydD^U61X*8uh&ZEHG08DhAOxB4Pl%Y^92YXbG45^7 zH!*1jBNUldPL3H9iAM}?lhJx_X+c^dOrRQrrGo=6v5*hf9HEL_KWWykvUoLMRNw;e zGN4cxyyGt3&d~t>T6`$gJ^Mk%npP|)MG}CXoJdnp8u3Ox9N0z2_eLm+be~dk?yOZ- z?zp6q)gGx**j}dW(-EfhwDYdwv2J-xORpVrazI$&!^lnfwTaKtOwt`t7#%C>#ri6c zyu8OFx9PQCzn8TY!zZ{dCX%rH2<*Wwmvfs#nPyB*8}pO?8Zyb_dKUDv+MCSN>LB*G($!@GT7LbS z!t7R^?C5?osEPNR@O8mce5IoD`|cp}rkPax%5RyOd77LX0|FJG#3*P_Eh75IZlO1Z z7O;Q&Wt8}O+myGus45Aa-m3K-;;Iij5GunR@06-KqZJLiyU;$p6$ps|YuJ_HSh?Hd z{!%dFzPKy(s_-(inSX0x|InSIyW71TwRsxQyt*LZv=}7L%Sw_KX552DQN>aE)7rR; zQzNPf!ir|V_)T5NShzvd=no^GQEQWqQB~97vD2n86Eh|$laka8iY`@)KLO@e)zIBLQhW^pxu0_Y=D>Y$}i=E(!oi&TNlMk8+IURu^L+o^zEj zE=?1`JKc=BPdJIaIogKX8yr-Y?e|md?9oz#b{|vY>1t8E)A>^6N#|cBg)T=$r|uB6 zNUta&u0H^JcgR~-eGDKOKY3lums~GcFvH}HpFh}7SdreQZCb4R?>}Ac;RCRBMH-lq z-~n2woIRNzjwU){ZV@DvkB$ecSB=VR7mQfz8IQCW1dMz)k{F#b4jMaSVl-iHk}(-! z{F=ltT%k1Rx6W+o?9YAHe6?7j8oYJ{7s`!Cz1;iXgBDMzOs~L##7)sXp*x^e-dZWz zUYIO>vq+wAbqyNK4uEem*hm)T|1oqHerd2l92Z;c7F!er5k;^&Fi`Av*3@42tQZz)HzyHJdwZ zG|#k0!oIW(YB;qOL0+`+sQR>zDphv4$TyI~WUhB9OSCiMg-Lx=z!SsATz4ke09yHZ`e=SBY$Oy|EX+Q8K)K|OvZJ+-?964`W>Keb$o1VyFGo`9%Yu$n-XJeD|Urd*2!T)d4g8lOw0}oF*1fzh}CTE(;3U zj;no|kGBLh#`oI5zHD-eHC)1=5n!qKWnpz8Tk-R}XQh6!i-Jf8kK{PEnF?WRmz9?n z_*ENbk|2xYJkYzt0-Cq_pTXC<-L*DoVOr0qdGI8%lcr;*G4xu;2Z%yP2-vfuL{Yjk zL-rOKBXyhlRaB0iDR8Fe1CQ%~4|~gq;9E#i%-1#UC($p}_aI66?HpGhv@B4y4cLyTg&_c8>Q8P6eWEW^v zXCMU9Ij17h$)WhNvm6vlmX|cAnuxrj$@Aas?&bpa-)7Sp=HDL}Cv5G_oL#-M=&@k3 z{$K{SvptSD>K;aNLI&i3>plI#jtqZEJ=zP|GOC}_7^PA*laj6hqKd*1T}y~5ni0~V zdsbJWZx{7(@GSbts3Dp;8Hp;K+d%d#&1;)%;IwEvs<4=&`w(-^P?cJ~A^A2TfQ*Fr zkXW2lwBUarHePP|v+OSvsR!yRw%fC+18arqiHkw7tl3OB&*V8o{m6gX%z+y1cfDrX zxr|jUKiZ0B6x9I=qliLW$pI>xorVg^GzwL=I(d%{=65aZnFeRoth$h|8! z_I6`+%5YhWDLr4fVmWntt9I0PA3taT5bTrT*=A4$uF|~3o=`tY8&K}ZeckBH)j8-N)L!cGMg%jY;m$MzXaTiO?Hz@pJWjqOUqa52mZc<#Nl<+RbGv$Z z*6GIVeLWu!f(Mwa>mw)D_$GH2_~$4ykxM({yX#Mfi*_FOKR(*;#&ELJ7x@yY=Y>be zc!`G2KOoOe1I2fp=fJnf8tS~%b1(}UL`$mMNBe2tn$F!J7IJwkOqVvTqbsoxflOLG z(!RvvMg$*3X$G<1(Xis(P;C)BRw9aJ%C$)yN$JXph$$#62vC$#cpift*{vY+2SDi0 z?Q+fY>tMviB@rFMTp-ePY7z+K z+zdG~^N zNhpi>}mxvdV#8YJOe_}Cf@3Dj%p*52Klw~`;6d5JuMpA z465o^TA0$suGg|9)L_XMRHpC*)f~v^I?H*A9(DA+J9g)MU+FqykbS9T^!cp8l+Ofk zK4uuP4C#NpVc#vVyV>>Q$bzE6soD9Suc4hP#NXa0&fES?ro8=7Ua6B^1x5L;w%k>! z;oR-3Y0`gLt8jP+kv6fW%|7R=Q@EtAlerP0P1zMh2(lsI_S_9n3xQ!sfoK%?s#KZc z71>x>nu3xPP5G>7rs_k1yXseY9AR$kTv~|3=h~p1L?n0vh6-5TLv_pp&~K*oPzmGT zk)RP%?V|xLxOZQahD?vMsy*Y6;sotAXthg4;%?V%p;ukscr|Hp?5F524y?N$vMPJu ztWpP>nb${br$0}Kk15UK200cFdSGk%^!qFTb$0)9rx)N^doDMwZGpd~bxY)^wMufK z%~TsaiV#3%CO> z1ZE@jM*Xk&JykuKeI=m0oV>5nw6qWSjJP=@PY4R7@`=KGI0q55;{YUmF95~dDnzTV zIq7{_vs;6g3q3(!rpfDuw%u>oU%ChS*2iu7EFXkvoId z!1kUVyC>d#X;Z)V)bd*Yr#Z`Eo=K7M{$ZbK+5VmRLB{N|W|zRGB-vv(qdoD6*}A|n z*#hE=Yf%>BYF!r7ZM!Wk){!NbL4Kw*)3pX}>RyEy4%~q1jNaD#HMI^u$DGo7v5G~E zvJ?@)hi9}VIUsOb;0c(Xh?vGzNmsQ2kgUo(g(!s<<@X@6s*5C9y;GzYrXVn=h2zQ9 zIl~S?MIZ9%rR|{g=QdvH`>h=79Wj5R7iLcBYE53(ZXac6b`B+}>kTZc?De+EtMp){ z35>gko2xjI_sq9&z& z&9Gybwbm+d5Y}P}cti5%zD@GsS7}iddD&VZL2TcVc}kv>=c3(F*68`8Ixyg&E;9BC zT0Cu|S+Q^%4qR8#`mkfAg+6A$8C>I<<^pG6aIuRT5z;KRKDmGXXr(GeHdR46C3PWb z4Ooj9SPLfv&`IY@(VgQQLMyU8)DPT`G{|J#HIQA;)vsI<(EC0ATeo@oqPD}tCr$NH z74?WAZIz>bvfO5`xRhg$fCzUtna_xEkzJ;;QXZ%W1Tg>L$mKVDS(ubp$&2Ks4n=kO5CCLenw7e1BX-kt#?K}bM zr+$=w%s?x>=~Gr&8Nz~7$6tU6Gc*;xMSkU`H7kXM?Mt9HNA(gIy4flcs9>JJm>%j39Evz|9_|anI4zxt=-bTL1d@J^jOM&PEL;+fGO^*cI`ls-asrB`LOL~4YMdBL34Y?eFWJGP6}t0%@T z&6hLYPQHm&XtkZk(dQmFQ|iy*}P zb1&grk;O1(NSel3KX1qz*JAJ$Or4Us@lAO!f+pjlJT9>&mMwze!U^2nrtmb+yKw{$ zjT~L45cf12>R7}QjSV&8_)1Cg=Hkm=k<98Z$hlh|0%khibWU}@3Y+}q@?u^#u(vR%DDQEO=F9$LqexYpj6?pM{!8lCHVP3$;5Uvr>&B`@CYJTYDa&{7bh) zua4dn4WK!SZZ|E8+$j$i;mpMg*QPZKk>iU6G2bHv3}Qb4%Ra2}48FU|nfUGso5Tmd z1Fg@6J2P>NE$u(88>=ao*G00Qu3ai^S{-g+Uqw;nRt$#)ma~~Ni>^E63oTsVnX_VF z=3gk4%)NvQ%+U?L%z9aS%`Q5*%s%saHoF(NKZ`tBI>&RmZa(6i)Pl~1vc=E~smsgf zT2?1c3vSqj2W}yPQnrh{H+R`^9tS8J%F#{3Xuu}?Cg-S99?vOpUH&reWg-4OhS;m6 zR;g3tg|gJ{+lp!8*MVi4}qIt^?t2}a9o)GSLmsVR_{3hj<(K_ug6z-{p>O3VbT z!uga1S^do4GG;k4Qjx`A@z2#?gi}f9`R{iXb59L^2c*v!9ei9XXWck3U(@0lSx6Dh zogvB9jX#E{4i{=q_hAjCx|J+RUBdQ!lpW`}juQ79?I`b(HXq;eHUYnj?LNLe9Y)@V zs%qnLR8uF>9=N zWvWywV{)UZ&@i*zTrZKtSlCF6qb-_B-z6_SH-XkD-A?aDLe_ey8YqlKZg?8Zck6|5SRVdcy?r&;Q*J(6rjj( zzWCkVK>0M9qgp0e8UDGw3VF3POdr>B-x%6*#hk14vh_&YIXir(5;mwy4>#KF=?Wgy zaT6HNa(yyejtgHtgMG0@!PFlJS&ngFjjDhNNHbA1)J0lJX+}Oq@>t~sf2=wd@Lh9* zb&SYfEJ6|{(okakwP*l!7yXlDi$1K0*L5fZ>U=Kv3}4T-)3}#q2sX`(lDEpRkb0N# zMi}zX;m1z&1pLFr?42s^Unf`67EBxEroVKMM=H9x``?U?(FfU3z z5?$1#`3vY&bF}hZlDx+2)=I>ujwgCiR992??sn_tfdmJe@rO9{oQ8Ya%2UsK+wZ;J z9lLoI@eFu02wS+tNWXEWDt6hwg~(VZ!>^bK>dvC-^}lIW8~;?LY48#?IX_@66ZDqA4jX9)O)t4yUW%a!}#eQRig2p+&{MuFH{E!{L zg305Yq7)vJGP3Yum6uFu!=dtvw#zUpnu9KBz}#qW5@b=jRAbY-tz(a3zv=i@;5W8S zstWs6dBU+3CgWg*I)z~xQ>?12!putSk%nYvC*3W#dQEvRf~t;>hP;d~R)XZCBcSEI z$6@2qywBrOu<^uUc%j)Ua%#pXY?u?d(t}Y~>uQ&i?I4Mak|MaCH&S<{>dlsa)b>qC z)OPj8)OvQ#*S%~oX#7zgMk40>wohiwQvA~j8EQ!({eFMzhdJX_ClK*#GvvQ_7AKRY z*CW$a_Atabz=gtozJ|(AqFT*$GSO5$rN4tDwG*>9U@;qJ2llxrUfG!G9yx7l-}jW(TJX<~Ex@;H8st zyrn_B9PfRFkGS0|cFpZGHiOL0t-jKIzqkmIpU(#=&F~BUnp9=`KCZnXJr*(}J385) zFtXU0Hj-Ws8MQ4H9GlICj+do@CILPL;<5g(#MDChL@!646LvpaB3O8yTj2SH6Tq_bExaygJ$bN^ z9Ngt0L!8Ba;~Xd5q&a%*{$t0Oa9J?p`9qC_-MuTnMt97=pWpr+SH}7jhi8Glb8PGWdbHjC zcWj%H%C)0U9NnfCUEh9MLuWzS#8|JpFPZP&OVCRV^n9lYR zOsTH5jjFEI{RFeh&MAWms0w$84sxoQ{2+LmqV)F^H_4kRq2i^f!lGdr`a&UuCSY=2 zGq+@^7yIv;*h8t7^qt_Y+zp$-_T?ATe9Zlo=;@1l2IG~SCc`wL-~GR3F7$AL%jnyh zU%I@|{L}*zD5b-Ci=60iopJ(~LLGB^PLuVN?B4gp^*#1f9m;f%9ed*PZdw-0yYSj} zW0h%UwjHcbJ7h!r;XF`%#eYZkp4c}LUr-D;K>5-^xcZ%SSFN_W2fFV^-|NrySQs6U zzZ)--){MLBvW+_{HH~LWpBtfy%MFVQzZ(2kIH-5C$P<-O(x=T;5vKXDhNX7cSg3fe zy-_-yh7D|I$NE>FON8Rj(NaG*G1j7%4BmFf2p3Gs(}9-BBIWBTNrJUznOWrid&^L z%Gz$!PT2WXUvccK{N;4NQW|Gh^#_Nl*>Em4j^96 zK7q`xe3!qoVL1p?|Wo5FNU(Nb#bUz!6Zp?4iGA{iKAyv02csHMyY#=8K ztoFupl#Sop+gv!kcAxcRP7c5tea%1J>n?en%C1=18Uq<^kkw*UBT*6+@>|s!O-s@Q{+4wJ^$FMWAuSte9ud)5cv(xviYK`dySl1 zP}vLDdxcrJ%G}pj-E1wpF~VO8#0lV{ijUod(#D(w4$bolLAWcbizZ5Vy5Gx+pK zSip~=mtNNg!*MGEJQ&fzcoXWNGg4#N7y=yq3c5W0UJx_o0k}CUy4AqkpQA0=47;w1 z($MQ)NCO+2RgGKzMJ_wz#9#Y_^smRXq%Drqf5Uih|9K_=`~wjI$196hBwUmvr3gry z;00uMav#YsORvbR)GbI)wjW4+>q(QOjjxLbEX|6tc0LI|;$#z~30naNWKZ!thCJcS z)JX>z8P6OE*|;45oK|+%+!@=2zI-gL6JIwiLmqGRg;Lg+L!Ycih5TOsctUnV$8US% zvIk=8qEj);*5>JsjPbiYQJv-ke>LS}8PH3>Bf&9_V!$-l`j#b65VMX4Hu|0?ngQT> z*Y<+@R^3JJpfWOdX#O{zKZN(Zu#8)LlBs;aE6M6WqvTS)TPgLt^6B0@s##CC?&qH2 z;4cvelvn>eIz{3+n4q58WgDz#J)4GXny&s?+ut)-N##0P1dH%21jz=?o2v28r6Sa3 zZyOM1-dPZ5>g=>;SDX=Z>+U)8Io>%7LVk#4E`PO{Rx~SK6Mb z$TrZG?JL!l-xgaa0rH0x%Cf0)wFGvM0^yba`ez`1z%IMq$WF?l-AmBK^xkVktf?UjJn#! zEu=fLFnZ+EShcQA+$h7sEvVnn{oTlb+sP@2Ydur-AE0rLL{ae@? zt|RRReyzxmiGl11^}%O3WptbOR`lvtPZ%E0lo@3X#~4pB6igT$X(qp$_)Yz4giXQa zr%Z&4+l^2K@&;e>oKco}5eQ`dON}#yBgz9MA3=92NuoOSseE%SIKXpi@6J@;=~c$K z)Esz$eeBn!YoE*!sOvt@c|DkYVD;HmPnHr zQm6%fRmZa#Xn$fw>-|`KXS_N=Ft6x0uvY0hi@~&dIXKi)v6#waXTOpdTwH+}PAD(c zsVyhhfu3{I7LvzpQCslVFs?)s`Kyu}T3U}$>Tczb>ghTo5I69NeReWwCw8f7`Rq3D zv>AXnxB_gaot1dq_EkZ!Ax!;xWr22g@ihb2{QKrB*#)+(giXikEM*saf}HyTk>b&n ztLwQ?Xykz?pK*O$Yv?rrGtR45a|LjPQ@PA!8 zvNo|-v*qj}@(nD%l$oJtVkG&EYVrH`2Zq@AM9B(YM0nbm% zN#KU&6l&?-8q@98$ic>MMzz&?R)n%0``n^x+(`ae4~x7WZ$|EhZ(3fCAF+VLZ@75D zTc_f>$D7)8++g!Bdmi!y%av}l;f)cH_SIQSwcJ%2XnuD`h`>I=kp;}#84`_Ox+X)N zs8GDtx1*L#wt(ZCZs@+R3NZYyILRy~m(!Y(WsfR+@i)wZxSp?99R(ad*iquWyk0C;v?!u*dX`V)=fn$S z#K<}0u7MZUTfH@oz1{P!PZ*P4JM>sTW5z@Prn@0fq!$tRwO`f0c_`ca)7X&P%oGVr zoPTc9wQORdyUD5hX;)a|{ZW*BJA1UKA-4^;4BygTFMs|DL#TYpKny*=lysn$fD}m1 z3Vqc9%702y!7+IPYFUJ5YATu1Y8z?&U_{!aa#xz0Vt)ow&Wi9|nw9%oe4*Gun7uj& zsMtKsB~3YItLhUw7@RQOwpn_&-oCB6?9VRFBnw=fk&t$o6jrGiOVMl^A);>&^Ofo8!?$@C+{r#$r9ni)hfdFizeT7HZpig zr&n`scT&#OK}*(OF@NRr#?n2(m6-xHL7ELwVdiPv~TZk zcfK@?bgvwD_sX1+@ljg5@58%(*V}nV!n5nh&-EUcKNc0YHUtbz%dO5>Go*iB2$?5kTJD>|P z=gC_eAKO+B*-5iJzKxBdKkBc`_0*Bo#Oo^&UJVikUz&2wDJ`cldmR!^JhX4F)4hEj z_eUDN@~2(AFD~8idb?%pv38i{a*un^5g5@#@*dlQ?qaq;$Z}9_tu2Pgaw1O9Nre^3L2lJKdb{oq>ktXcTKhW&` zcS6>?Y=Pesy_M>^c*MdM@Je93#pKLy%Bkz)RfDwhGzY*Rkz|?Y`awcW<2;UabJk9t zb-=QK9miCsgTeq2OQl|NvT0ew#?^{B&X`*ru%=ZPH{5iWVccQ*R}&$qZ9CVcSu1guP$May75d^W1Hb^!Y)R_C4&&_W?}IdOcmJ zau43J#|0h7+FSG0TK*Md8Vbwl=$r(XL5iW7au>9rqV4DiZcgK8`#_80)odH}nI!vz z!9UmtTBvhWYqRscx;m#TI+=G@~snv9~MkBsYezo7H?17%9(@`cv{s`DGEe zW>VoXYOB!I^nP)h4Wi5i%UPA@x>(omNh9U>{2{CQA$#C{7e`uskh1_UpVdj%%-zS> zarPCPZ~Shicf@N@7iA-1iOS(h{_4{b47fNDr3*SfX#m;OHVvEiwcH;0Y$Ms7jTvcw zYIm=J*N(5!#x|?S!Rk(~u2~F0(QqnLOE*5_zGg`VL{%4$mE$IIifiWG2EHw>2S`^5 z?PfLJSykzT&N=j0jjfDM_ASrr($qE`I&L4CkUIY14*11|Yh@LLt9#U8RUl+&RkcxG z^$#mhU9`j7MsJtBmJJVgGREgW2FlNSu*|P{g6^BkjPYJxA9ASvB1shh->J6x^?D}jl6E5}rS$xl6LNxl*Z}4eynBiXfxh$XkNf5ZZy!ayE|IHy5j@te&bJVSXDJ_u2@-(k~gfdL6nj{oi!zl z#Gm2y#aFTQW&w7yvwhdd`2+JBrP&h+)$4;&&7|&NvK0 z5w)(7cd2e#4Ajsg@7i=r{dvnzo#GBTqmC}BWpVFE`+yN6+^=c8d&p9kSM=6*pRvO| zAAjymZ@kb4&-+qz*E0$fSQH&85wI*)buNxg^>m|vYMr(r&R+BB;?UKSP4IZvOqh&jN>;Ry-&(2 zSa-3rW2O~Q4P>OYNe*O<(CSE{d9lv^HP%FlCemcJKi zt$ZU}Rb#2v)bIqsXwfuakcBO>ySeQ!!z)hrr_sc1v0QOz##NZ%2Zd)<3T3YiozYX;hZ6Mal7SqGs|_D2UAyV zo(^zyQKj%uJg%GRQOGdXG3jSRE z70%aqRWG{jquEGTr!Ch2n^X4$&`o2p)3a~O)TiRu&i5DJw2z9oiuaVVG&COnY?4_|^t}F8up0te^ALikl?o_(K8~^}p6e=6u79EO*l*hJZPfHO zOs*PVMBTTLg~{5gD)BkwO8}e}`5K%7$1ogdQ^h%QKGzXAI*-xoW?Bk%^ca^kbfNqz z4>fsI|t#J`1SdJ2Nl|gq28bp7I~~HnH1V&T!-(Z zSA6SvQ34n{TS%UNnm@BKk%vBdng4_LTH&79_YysYr3yKX@Ve*7QIexEmV&a5?p1I+ zH8$hYHGkRj&qkup*TYMGmv}n-3Pfssc|gwI&dLwm3)N3K$7#vgnW4(es|`c+xy+GT zJ=UJ!NxKEkIemq*I>RzFb-Y}C~5Z__h0rCqZ;IZ$Q~ot(y9SnTy+ zXWjBCJkIrl@ICfl6CLrRfVzCDl_NY^>ZvXzT3HTys1H{64X+wqF}tkOW0eQFgb9}0 zwErby?D&IA)iG)>%RXvl%(ii=$MW_-wn-iJrCvMf1){vB141ahtx%hvAt9Lkls^@( z&HgQ;V`nivW+f%#;Y=ldcvvU9wVRoLirin?Me3>1tgj%wt~x z1gHIPND}?CuIPHCRfqQ{#bm*o}CYF zKYA#MX<09{nweEMJ3ai~;09d)iEgWdQtHUcXUn~0K!w+YkFuS)5m{V^1sRPSztgjs z^XZG@e=<}0iG;l_(LCXHVlkj8vTC_TsA;a^Q732Fryh?IjWJp=l=-&g!RF&K;BjJQ zA>VYZzl3RXyW-o98E7^AHY#t>)zo3i);3^C+o_(#baQ13_Ri(I;`dxkD&UbUF5t0> zpns-Dq>mXQ%;OSD2p3@Z%5KAS!CctNTmQQ4Jbb{8q9Wm-Eq!E<5_oUN10dP-ZPi#X zm|u;dW9QJv-N9N9JHDz>8qo5Rl>y?Hi{L<3PCHv;*2(SZ4AJHD={(ck>5)Sz8Ey=} ztfh{yoDr+bW+I))%bn7DZ;d4b&v((~Q@!h#7>#em0$Kw5A*N0pMUQ0q+et)G+0z8#y0sQJa{+wDw-)P-q z&wPU;m*1xK4k}ist#~n9MuHBl+MAA4wGUW~Y>T6Z@NauCr=0ENPOwG&(levQi6Y&% zePWs&10)f?f~Viwm%uH``};r+ToCUD*?eQ2~XO|!Q+U7jL@|5q@G*XyeD zB`TSvloGkx@e97e&=*;DL_BZvowY1-ekc)I$`C~6v_yD+c=U7#u}6G)9x zo;BQp$0Y(B)Vzb85yIiJd8WzqUfS>=I8BgVn6}cEn~~liMDVYw%9SfkF6JrxQH9F8 z+mx20NWPGBw)a`C(Ks{z!NSjC8CG<~BHNp~LH?AMN+~?`l*;4&RQSP!tN!64(!y(7 z$-V`!f#VZ+3c~rH2|j0bAlhS66k~u3y?96@O@{&Yxmwc+MM0> zi=L(%LvzaYtTNQ)zT`316!^f7dQ@e3X=C2Vd=9L8dH4fVi|(cLw>3_3rS=}bWf=^R zli$JeC%#{F&y1VEr-}4mN>!)+P2DG1r5D!PMs$^+iwxC zF#59fM?U4AU z(%Cgfrp_r+aLjHB&}JFLN-;WSenGNED>SZkTPpr&x0m=@&*FPie((5K!S3cLF`jun z^Xu5jH16K26nXONl!K!yQleyx|M&GjOSNe^o*QEdC2SKPek z;Ick=ZBdIbU8tHoFb_ge3xuCF8*)`uCGT++E3Dqm`KLF=FAv(L{if9?bF`HtVe8eB zKU4ryH;O_s-scGtuVwG%6A1fd4upj|8zR2#PmTh^sQ@`*QQAHiUQOHh+XOrA?o0j+)sBs6XYbga!qKZR2jT=I)TDk;F z*!cw>U^jinUG&{!+|k%_4?*h-9+QS&-TDzuIFM?BL#K45wVFVci8EU(>iQ;^X6xJ+ ztqj8sVgqW$%+U3ZJBD zaya~ zLfeqs<&66l+hGHgmnEoaAi|O$!Ls(F+C|n1_0sRfOu=MHET z=8*1TW>Mq%Oz)!89;_YHstB-964y3>@!Utq?hB|Xt#HeppZqMW+1JPUwv%J8vcY;~ zyu4ycsUUIS3qigsINh)1UGlA3y~ICdClY20xDv1DAd_7PIC!OH+GWTvvE+o z;2f!*>N$Xj@gLJ;1${G}4BfD{J=x+Qc9Mqk2yJs03cBj$?f28$#6!=!A8YREVcq1~ zU^t8QM>N1&1>jKi@GhPDI0}%i=>M7Pp(~AXs<@VU~!ttK3 z#H*c~>Eyq{elt|QiAmW07_rB!XzHgpW|yD#vJ{mscb-7;B!B!KMso*N7E~^)!GOd$#rZg zkn+}qmIBGY>DhDf19(ir^$g|Y|I$yTZ=|ybqnSAc`ot?0b9r)&vn9VeK{W%tp`@CL zZ&bwc?*WcI%(NtT*eY5qXCJ0W;jV=RiB{_g$Zc8-t7}q0B>nNi~vWCLSjlU|?B0q{A zt2=Q0kzd@Y7tLAx&0ROFzWTLIWSUreYoMj%DwQ`EL3*1>tG=8PQ__%dI`3Ef z2g1Q0iA-iZS9)mTg*1m$Z2B|&pG;P6F!6rr{rv6Pky5X=8@2y2q*`4^lV}yp&7mKx z!P#1N=mwkc`y&mxB)&cMBXJwlRfQHaUiDym4(%@2IQ=7^KC|W%<+j3Md`_+5kKC9M zbgyd>ExutV(f&=rZ2sB)2w${kyXPgREtiMZEe@{@uUM67@fjJa)M%q5i_`{r#br+( za0>6P ze8#^p)Y5-9kj@|Qa)`^s+_9fGAz4@<#SD7Y9%+rppusT$0n&TNast;kGT0Pn zHMdZM^!Wh_eZ;ZJkC9sOu1%)kPhCS+epzGcd_FocoTwVFpPBIcT3XKUe_x&Wz|_l$ zeCgY%NIWI0F`JT~UpQDkQZdi~Yb@@(+3DZ+r8i|VeB!}M)>6Sfd{==tit~kpop7nL z0qDM#C-|#jt>(Wr8O7=BVshjeZT%+z;YbRRaE%OK^t>2(&zBzg%KvW!TL2@h*Y8P? zv`?jPkNa;oU1u`~9H!CS$;=n+hE{|=gE`9!EAffQO1$Tw@$znm9paf=Yw07kGf4XC z;PsaLuJ6^TmbRkbHCoxCrGx1Od88F7E&(oFu;rCx|Xm8O{ZG{Y=an2?S? z&b7!hEtxCDSHG*%CP}oXP|tNw4cr*}Hv(GZTT|M(aB!J3nx{i#R+LlWirfHHR}G{W zsrAZ2UvJl;#MIio*GAtj6k8j_>((6h#>+T@=qny+vTfMtA&d8c%$5T4Vf|bgo1YK05`Nou27g(4I3|##Itq zXIA6U7T&T>kD$4az=lodW9RN}KH4lgE@yiM6cfyl@B{%AEg+fd3CK2W3)5(Wc?{kB zrb{}e!n@V!PvEW_N9c~%*vT)x(1=XG!Em_WewegRY;d$kf&UZS6;C7kNv9?YZ5ua( z8%DcY{fK4oTd;>rnUtI02cRUo)lnzwU@c>THBBE28F<(ePN8>bH|;hoR>)P>7x))Z z2%R~I^v_vaNhKKu3AptAc&~JazmyE|#L_HW3TG}OBeCdX_T9>eqRWluRbidH&CuR5 zO8hu_Aa*fyx?x*tjm!=|^c1|zCnlXHDXRQi0eHI@fS=0Mp5wy4gFj5;(EG z*R#~dRkeiUyZ-$itM@8!fdy##nvm9C6y@`DC9?E_hud8XVUgELXsmhTocVR z%M+etr6y|T9412wGt0j%}JQDXw(RUn<-r`ebk61u}y&!KqrA_@s0AtV98#dXjLS zaLS2d_w=z!YSzQX8+lTlh|+(=s+zR1pDm6HS~Ljj`Op;G^I27X;6}d0i!MwhrO&RZ~a|)#L!Zz2@%7;3;xNLCY`ah!#~PYVLLzOvU$5Fdk)cg zYq+$rm1bNu*g`F))cnkADC$+ul!B~=r2K435_f@p%HLAy^vD`m zmN6+Z_n1;z{JvkZx_0t>bJ%hQ1+rVxpU-h`s#>sR1txuWe@iKl#|nxPS3`CwW*F|k z3N7yFf$iihN}MX}P2F@|?|KG%yLrO`QoWxB-Sr9y>2fa#X~2C7KI^a=IBqrJ>u7w> zqZ!%h^xz-&`=f%aiKe(8@+NODy$VU>^;F9GcF_&x2Oz~*vU|#agbo&gkyDePB5fKfe4Eg}q3p`Acp^ z)it7Tae9_wu0<9s%Y^VQ{ZqDIs&)R`6oV3IYG{>GdVFIbzOSP(o7wGFNF1FnXU)gd zKiU*)Up|UrEbtbLIElTS7nbYZ3{}0%76exi5JeNDFPO}LEv(}ZuK)UsAlz3gZTI(% zzdU{2-g(iy4?GwA*WJIIh;nHPs&;%F)Mir~*kJn2uNf`m#nLo(`9})2zbY+l!6nF} zAI`20FWCO0tg;j*IXGbf6zZ=(8l|{z+$BlR9o5(le=Gyg9SZNZn&fuXJ|Jq9NfYq- zVuT3dCF1!^m0Wrnq%a}%Y#Af9yCy6hM?&F?CWfPt&0Lj;Ho}^|j{hdoxDa!9_c%M8X9kYudB=0q zW7+pVx5I!U=Wi!6?W<1Qw7MLqYh38Zt^31E1gh)$pJJ>-xJ19@HXqpVaNB>iFmT_%mPXj(N5?n$81Pz2h z@Z#>SrLJ3dw{5p>Tett#x9)6PifeIqCqhE7Bsc^DAt7>J-f#Eo+~1M8GjpFOOtB2RTpQ(tTIFV~o^;!o6@5te?+_KN zi_ayw%vog?N39yZW<1pUMCW1GKFoBZ)1qya_VoH|0e;T*}9$pzrItcchkazh$J3p!0@i4;E`FdaC#; zfz3fW*Xa62_xn$g-N#SU;>G66z9Kezt83zeq6~2nR#v#!LykiU3!aCUKM#7EY!elg zd^h24()SgI;*YLDM0c*+9@@A*)o=BBwEJIcuiFQ%T4|Y`^we-X=D3zJR0pl<_eSdI z8ajQ)md1}YyU2clKhW_Cr{8d0@vh?htW8nIa8qu4@2AYaI*ZdbH&B0>SMXCgh4Npy z*}F5!(nvWvKXHYb{~4F1rufxLQ{q~$f45-ORX zUfv#iZWSRiV698=t94;M|E$};jIy@QcEhTR=Kjkw34^hB)&B^0M>P9)ixb>mOhCJz zgQ{dN)-&RcwkGvebxhz`E|^#UZ8ffuTi73**-bA_09h&+h@Kn_JpV2=M|-2o{G)6Dw!+{LH=8QM?I>3wSIs5Zj zM0Ftce93(|u3&nmB>UlTYQ~FRUfQy*{b?5)L({)j?#ZkyYR{R=Jyw{M=~g!M3sGD0 zv!tcxM=Znr=cWF_REM$c>8f+o>?#G!r(gvo`Z}G}?+o*rnHFd1&9=z?lP=V;Ot0d( zb%9TzQ}{(SWK1aGLwtt$RN}w1?xc3tl}XNiM-v`}`ouD$DW3D;SE39A%MCPJ<7bgKqe>){kZ)6^J`CQuWq-0y*`{`Mn7wQGt$(y~ty(~F z3$)0On|I1y9Q!K+HK3k;pD~$M(qfkJyXHmK=hBsV{}coky~~cM;HD?lZ~PV1ZkRgH z(nt*-a{9F}aXh_L+@2K&BJz)@HWX9!)>Yjg^*4U9OzOIAcca(Rb@y{J@ z2oEeTMxbkxkZ7Wj6hyt7^uYOJqL%mO_)kGi(YBG;@LO>1?tJX|rb4 zfT`cg5dF^O32L+iN01b)Dqa<;F|pcj+u%VrM^>TTo3?G_wz}H}qvh)~Rf-mn0eKH4 zU$f$;5;E5E0@LX|=hKDl*v$HRX7-f|UcN_>QHdgVTh&zN$3{YWS?9@L&p4{T7Wg&4 zzD$2kUnhN&RfqhM$5L-7x~(s&;G2*d7Aa00)egFB7x%9`J-^B+{}4avnaEz$)7Udw zM-$kFbBT0Iy(B+}mV^O!_qebAtD^RWMTY9dSoz;hzNA(0{Ve)k8>UIlOA=w9=~$CY>&e*BL4_Q8}E;kU3?2pK;D8 z9{wxcldF>v&^?nm-$cm0SbexqS~5|3q2N@FSPML7aHl zJT-C97Mt*SnRe_GA5O&m;OoI>A}xIV<62!C5>xF6$s96q#bv|hz`7Z(s!-{&kS3p06h1{uil;`DO^sTrr3 zf-FMY=Df3YsG`d9>T=bh`*pkW{M&e0S#SVI)B~j-taIL>bYi6&CRftaqZZ-b5naBp~sLwR`+A zr-A63p6kPN0&)U5VY=QU(KlVHDlI-28PhlaP|HtI?Njj!e$9lb|y;OrbLvyoAhZHYYo=^Gp7{ z#+SvPt3FkxmHcd|D)^^kF2|D{mvxX=n=v!FE91g~S!O2~&!Vd~<^HW#Tqq>{E;X|% zsaCTuXnN`TqU)1SVDDVeO~JZ|1mUNc9g9EXU!iv-)@T(ZW*Vj^cv&XL+1jT?ZFcJo zE$|il8;9t59*j(OdKueg{WPJ_WJQu4zIAC+s3iqJwFJ+3X3V`7dB&9^%I;=|M(AV&% z`@W7nepNm9LfVJYBX>=Hk6p8{F5v{?zr_3MFA`4?>=U5b;aH{3@yH~Xfd^PY>Nr_ z#54}uIxrmdbL?u|*13*^L}hJa6mD~(iQdcj55~7+eoz7jgWMebXCuK6jKC4{un zaFJq*k1ba*zd5WPRSVj8lwW3*6+IuM z6`&`+ zrG%UW5fcd?)ORh}5#B~wnEed>PW|eC*D1y0vqy_#kDs?SAp~a<8nH`nW%LPLVC*KP zA~tsJQS6>Ec{Ha#G_s9xGW1~U`+&Aurk6#z=dx43=}S{s9pt-NiAIMr_Uinb9)s1+ z&{wu(PR_OGNXJzQHx6wp^M9|YIo*Dwf5YJ^BW>0I!uHlouAiEk}EGI zT*ZBe`iSxU^4nb$ED z!~3F>xrUJkyVFBGnnMFSs{6cml)iOU7Cf^r%Ne%H%}g~GrepCZ)6LYvGxQLfvv87} zTz#j184u5nU*1lj92on6LR&S|0hQ3@Y>G z=Bo?iZKsN2T>e*9;pJQXci>>d#_$vEMlmer^Z42Rvc%V;canb1iW22AWWq*FUCc+V zbxWq0+Moan7oRBGU&}r?Z=*ST9uNfME0AT8Y>8`h*VL70JU=6W zR6H2CP~Xp5+uqtCWSwc!ADXMVFtMs)U_Pb95YGI@<6H^{b@moKGJ08HY}s6R#137& z(>1KD*5^*u*5H!_Vkb1GPr*u=Pvn_BrS*Vhc(rX~pq2i@UT;@6RO6ERVj2bqz{ti*`&wv5oZI?W*U zisQc2q8ay1c^{n0vR>Kj%utvort=MMq#xH-%dAuB%2rb{^4HI!N_r;3s#19u8s|9w zbT)Ob<*aIb!v9#0m~O7xBN-@rkKh%js4;*4jV~(nGI>^5NICd>#v!~o+ufq9(+^ac zg!b2Mi2BvCKWf0r&ytJQQ5UvD<(Z|d%6=5u2^ zup>vB4$bVWEnM`eWTC{Rts1Y3KNFmb)-ENLy;O%H9p_KQm7XSLr2(%hTf+?Ms-kZ; zpO0sDaubC;14)^KSCgb;^$Bl9Rk3H}HzK!SEJJLyvVGHtYu#GRZ0&bZV=PxYatyD! z;k23FB6Mg#?P5l7n$ReWE;t#!v$rVxa+fG?d5fu{KWN&;JD1T)*xn&!_k%W6#zq{k9gexs6rOOfBR#;-4UgE2d=jLo-tYZ4K5W?+V~%a~l0#&_y{?d!Q1M(fZGb8UDTVp2&CLKLU@f&3L-cG;$`k20tZ{^{4PJ=0g1 zozF-m;<K-URPTEvTwsI=DV?S2B^ygMdk8eWR`Vd5ATV!61VcecZLL#y~C+QetA?Z1{Cvk<~ zK>Vet{OCC`GwdGZ2AJXmo>z5ronIK9qXt++nXa^XjW2b4t-9asBn@BVEFDO$9Q>%21-c(~5|Fxksk=qKBrn@;wMVzgPw!9~CniCJABIh=T zrpitINtj{xeVR;%KM8si3)4JO1Z7gE*^Z;~!6j9m;&ErT!{^%4FRhVNU>zJQueRM5A^k3rk3!h#4T z69Jt3cYcl8d%fo}R=V#hJ&>S$e3y+ZN9?BwW$23&z|x>fkW<(RRJI zuDOJGhTvd!MV(FAh?uZ*UWjtBp6qcyIP}!px@Vu?rS`;tf9rz-Usm`AJ}n9iNX<+3 zo5?!oeKe!gJu=^^NT3W=HZf4XzfS()nHqRO=g#ASyZrrCZsjX7})- z#{Zc-$;%cSaLZvdvjAt>`BnEr%M}u*!PBa<_Pzb1>icfSRkgmCD~&@ME7wP2s<+0v z)S4zFHC#?y*K#}2zcVO-$NU-V+cy+xDiDXnPTKgV&t3L#mg_nFLM>S1)gw$p^bGY) zj2@{yGH(Odt-%7%E^6|nbJx&wx7MBp&mA2$KKTvbe5Wge{j5tSeg7=T@tMha>GdV+ zgZryYmP=RW3Wua@GaFRi3i5Cv)_AydjlQsYgXTz+o63J(G9|9JZK0aqEKHly8GF4@ zF|;0tdM9z|%pJPet}G)(YZv)>(=Xa!z3H<4T8Y>D8r?vLn&7YpHCv)uYL~}O*2B2* zrmgYiZ71S(bo^#mg+6U^SUnVfS+7zxz=#ZP znO_q}TkA~jwwoI2aEf4`b@l38;UQ?;;B}$;uD3?np!d7qJG>+E^}MjTbM8~wx~?GS zm{VXb)$VJ)zxA@Bdh@n2w$Z7Y`*>WlSYvOOtIBT9df3SOTe4@8K0^}k7;jd_@K0f1 z_o?Ze=s9P|?#{C4YyY3^-Ih7$@x}~K^@ex;b9Jvm((A5AMAnBz7dF(!s5WC`iEZXF zeVv+7tC{^_`+7eIsSF+RH5iR`zcRhr(OI0bR0rN-+Kc*EKSk}ldW5bW@})tG*au;H#ldtymj@c`{e$$g6?5lvdr^SVTMO?{$_W(JYQG$yd>vC`9JJi z3%A%Lm7KHWR_K`?tn)Wuwdm`r(yP?I^lm}_kH4t+Ir)8|Z~pp>q4L#uf(lk}Osl*9 z6p_G*HDfZmtS!4l4%qhVZueSt_>?#856o&j6S}+cRK!qYWR!C=FDkkjQQAmihdTXY6);%*CNg_-Kh}yTwFHS&T15x2vsHFGdvVev>pC|5>)-pl~MM~ZC|m}O<8!!?Mp#~>yCm17yrT!j?P8Vc0Q#m zsPUCeCTKnw-b&ar=x&

3S0^WsLY^ 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 F{{VCkCc6Lt literal 0 HcmV?d00001 From f9c43ef62670cb5e1a60482d65175c22a1207c80 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Fri, 6 Dec 2019 21:08:41 +0000 Subject: [PATCH 03/17] twitch: add timestamps to messages --- .../java/net/runelite/client/plugins/twitch/TwitchPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java index 65b7247163..74d60056d2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/twitch/TwitchPlugin.java @@ -170,6 +170,7 @@ public class TwitchPlugin extends Plugin implements TwitchListener, ChatboxInput .sender("Twitch") .name(sender) .runeLiteFormattedMessage(chatMessage) + .timestamp((int) (System.currentTimeMillis() / 1000)) .build()); } From f90ad59a3d21c1e1d30b76c5f26de063e8d71219 Mon Sep 17 00:00:00 2001 From: Linda Lapinlampi Date: Fri, 6 Dec 2019 16:08:35 +0000 Subject: [PATCH 04/17] npc highlight: skip noninteractible npcs on minimap --- .../client/plugins/npchighlight/NpcMinimapOverlay.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java index 2e46b11bd7..fd036adb95 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcMinimapOverlay.java @@ -31,6 +31,7 @@ import java.awt.Graphics2D; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.NPC; +import net.runelite.api.NPCComposition; import net.runelite.api.Point; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; @@ -66,6 +67,12 @@ public class NpcMinimapOverlay extends Overlay private void renderNpcOverlay(Graphics2D graphics, NPC actor, String name, Color color) { + NPCComposition npcComposition = actor.getTransformedComposition(); + if (npcComposition == null || !npcComposition.isInteractible()) + { + return; + } + Point minimapLocation = actor.getMinimapLocation(); if (minimapLocation != null) { From 3e19d456735ff185c0dd95bb09ec9e858c22d46f Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 5 Dec 2019 12:01:22 -0500 Subject: [PATCH 05/17] clientloader: don't lazy load client classes Currently if the patched jar is modified on disk after the client starts, the client can classload in from the modified jar instead, which is problematic when running multiple different versions at the same time. --- .../net/runelite/client/rs/ClientLoader.java | 73 ++++++++++++++++--- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index fb04be2ec2..10c9f76bc8 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -30,6 +30,7 @@ import com.google.archivepatcher.applier.FileByFileV1DeltaApplier; import com.google.common.base.Strings; import com.google.common.hash.Hashing; import com.google.common.hash.HashingOutputStream; +import com.google.common.io.ByteStreams; import com.google.common.io.Files; import java.applet.Applet; import java.io.ByteArrayOutputStream; @@ -39,8 +40,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; @@ -51,8 +50,10 @@ import java.security.cert.CertificateFactory; import java.util.Arrays; import java.util.Collection; import java.util.Map; +import java.util.Enumeration; import java.util.function.Supplier; import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.jar.JarInputStream; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; @@ -120,6 +121,7 @@ public class ClientLoader implements Supplier SplashScreen.stage(.05, null, "Waiting for other clients to start"); LOCK_FILE.getParentFile().mkdirs(); + ClassLoader classLoader; try (FileChannel lockfile = FileChannel.open(LOCK_FILE.toPath(), StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE); FileLock flock = lockfile.lock()) @@ -132,14 +134,17 @@ public class ClientLoader implements Supplier SplashScreen.stage(.35, null, "Patching"); applyPatch(); } - } - File jarFile = updateCheckMode == AUTO ? PATCHED_CACHE : VANILLA_CACHE; - URL jar = jarFile.toURI().toURL(); + SplashScreen.stage(.40, null, "Loading client"); + File jarFile = updateCheckMode == AUTO ? PATCHED_CACHE : VANILLA_CACHE; + // create the classloader for the jar while we hold the lock, and eagerly load and link all classes + // in the jar. Otherwise the jar can change on disk and can break future classloads. + classLoader = createJarClassLoader(jarFile); + } SplashScreen.stage(.465, "Starting", "Starting Old School RuneScape"); - Applet rs = loadClient(jar); + Applet rs = loadClient(classLoader); SplashScreen.stage(.5, null, "Starting core classes"); @@ -424,12 +429,62 @@ public class ClientLoader implements Supplier } } - private Applet loadClient(URL url) throws ClassNotFoundException, IllegalAccessException, InstantiationException + private ClassLoader createJarClassLoader(File jar) throws IOException, ClassNotFoundException { - URLClassLoader rsClassLoader = new URLClassLoader(new URL[]{url}, ClientLoader.class.getClassLoader()); + try (JarFile jarFile = new JarFile(jar)) + { + ClassLoader classLoader = new ClassLoader(ClientLoader.class.getClassLoader()) + { + @Override + protected Class findClass(String name) throws ClassNotFoundException + { + String entryName = name.replace('.', '/').concat(".class"); + JarEntry jarEntry = jarFile.getJarEntry(entryName); + if (jarEntry == null) + { + throw new ClassNotFoundException(name); + } + try + { + InputStream inputStream = jarFile.getInputStream(jarEntry); + if (inputStream == null) + { + throw new ClassNotFoundException(name); + } + + byte[] bytes = ByteStreams.toByteArray(inputStream); + return defineClass(name, bytes, 0, bytes.length); + } + catch (IOException e) + { + throw new ClassNotFoundException(null, e); + } + } + }; + + // load all of the classes in this jar; after the jar is closed the classloader + // will no longer be able to look up classes + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) + { + JarEntry jarEntry = entries.nextElement(); + String name = jarEntry.getName(); + if (name.endsWith(".class")) + { + name = name.substring(0, name.length() - 6); + classLoader.loadClass(name); + } + } + + return classLoader; + } + } + + private Applet loadClient(ClassLoader classLoader) throws ClassNotFoundException, IllegalAccessException, InstantiationException + { String initialClass = config.getInitialClass(); - Class clientClass = rsClassLoader.loadClass(initialClass); + Class clientClass = classLoader.loadClass(initialClass); Applet rs = (Applet) clientClass.newInstance(); rs.setStub(new RSAppletStub(config)); From 9ae4e772a4dfaf2e23747151a5f86059c71dfc05 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 6 Dec 2019 16:08:30 -0500 Subject: [PATCH 06/17] http-api: update for boss hiscores This leaves Callisto and Cerberus commented out as they are currently not being returned by the hiscores --- .../http/api/hiscore/HiscoreResult.java | 133 +++++++++++++++++- .../api/hiscore/HiscoreResultBuilder.java | 118 +++++++++++----- .../http/api/hiscore/HiscoreSkill.java | 60 ++++++-- .../service/hiscore/HiscoreServiceTest.java | 45 +++++- 4 files changed, 305 insertions(+), 51 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java index 57f29c2910..3edb616233 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResult.java @@ -65,6 +65,49 @@ public class HiscoreResult private Skill clueScrollElite; private Skill clueScrollMaster; private Skill lastManStanding; + private Skill abyssalSire; + private Skill alchemicalHydra; + private Skill barrowsChests; + private Skill bryophyta; + private Skill callisto; + private Skill cerberus; + private Skill chambersOfXeric; + private Skill chambersOfXericChallengeMode; + private Skill chaosElemental; + private Skill chaosFanatic; + private Skill commanderZilyana; + private Skill corporealBeast; + private Skill crazyArchaeologist; + private Skill dagannothPrime; + private Skill dagannothRex; + private Skill dagannothSupreme; + private Skill derangedArchaeologist; + private Skill generalGraardor; + private Skill giantMole; + private Skill grotesqueGuardians; + private Skill hespori; + private Skill kalphiteQueen; + private Skill kingBlackDragon; + private Skill kraken; + private Skill kreearra; + private Skill krilTsutsaroth; + private Skill mimic; + private Skill obor; + private Skill sarachnis; + private Skill scorpia; + private Skill skotizo; + private Skill gauntlet; + private Skill corruptedGauntlet; + private Skill theatreOfBlood; + private Skill thermonuclearSmokeDevil; + private Skill tzKalZuk; + private Skill tzTokJad; + private Skill venenatis; + private Skill vetion; + private Skill vorkath; + private Skill wintertodt; + private Skill zalcano; + private Skill zulrah; public Skill getSkill(HiscoreSkill skill) { @@ -140,8 +183,94 @@ public class HiscoreResult return getClueScrollMaster(); case LAST_MAN_STANDING: return getLastManStanding(); + case ABYSSAL_SIRE: + return abyssalSire; + case ALCHEMICAL_HYDRA: + return alchemicalHydra; + case BARROWS_CHESTS: + return barrowsChests; + case BRYOPHYTA: + return bryophyta; + case CALLISTO: + return callisto; + case CERBERUS: + return cerberus; + case CHAMBERS_OF_XERIC: + return chambersOfXeric; + case CHAMBERS_OF_XERIC_CHALLENGE_MODE: + return chambersOfXericChallengeMode; + case CHAOS_ELEMENTAL: + return chaosElemental; + case CHAOS_FANATIC: + return chaosFanatic; + case COMMMANDER_ZILYANA: + return commanderZilyana; + case CORPOREAL_BEAST: + return corporealBeast; + case CRAZY_ARCHAEOLOGIST: + return crazyArchaeologist; + case DAGANNOTH_PRIME: + return dagannothPrime; + case DAGANNOTH_REX: + return dagannothRex; + case DAGANNOTH_SUPREME: + return dagannothSupreme; + case DERANGED_ARCHAEOLOGIST: + return derangedArchaeologist; + case GENERAL_GRAARDOR: + return generalGraardor; + case GIANT_MOLE: + return giantMole; + case GROTESQUE_GUARDIANS: + return grotesqueGuardians; + case HESPORI: + return hespori; + case KALPHITE_QUEEN: + return kalphiteQueen; + case KING_BLACK_DRAGON: + return kingBlackDragon; + case KRAKEN: + return kraken; + case KREEARRA: + return kreearra; + case KRIL_TSUTSAROTH: + return krilTsutsaroth; + case MIMIC: + return mimic; + case OBOR: + return obor; + case SARACHNIS: + return sarachnis; + case SCORPIA: + return scorpia; + case SKOTIZO: + return skotizo; + case THE_GAUNTLET: + return gauntlet; + case THE_CORRUPTED_GAUNTLET: + return corruptedGauntlet; + case THEATRE_OF_BLOOD: + return theatreOfBlood; + case THERMONUCLEAR_SMOKE_DEVIL: + return thermonuclearSmokeDevil; + case TZKAL_ZUK: + return tzKalZuk; + case TZTOK_JAD: + return tzTokJad; + case VENENATIS: + return venenatis; + case VETION: + return vetion; + case VORKATH: + return vorkath; + case WINTERTODT: + return wintertodt; + case ZALCANO: + return zalcano; + case ZULRAH: + return zulrah; + default: + throw new IllegalArgumentException("Invalid hiscore skill"); } - - throw new IllegalArgumentException("Invalid hiscore item"); } } diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java index 10394b4919..288d290b97 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java @@ -27,7 +27,7 @@ package net.runelite.http.api.hiscore; import java.util.ArrayList; import java.util.List; -public class HiscoreResultBuilder +class HiscoreResultBuilder { private String player; private final List skills = new ArrayList<>(); @@ -37,7 +37,7 @@ public class HiscoreResultBuilder this.player = player; } - public void setNextSkill(Skill skill) + void setNextSkill(Skill skill) { skills.add(skill); } @@ -51,41 +51,85 @@ public class HiscoreResultBuilder { HiscoreResult hiscoreResult = new HiscoreResult(); hiscoreResult.setPlayer(player); - hiscoreResult.setOverall(skills.get(0)); - hiscoreResult.setAttack(skills.get(1)); - hiscoreResult.setDefence(skills.get(2)); - hiscoreResult.setStrength(skills.get(3)); - hiscoreResult.setHitpoints(skills.get(4)); - hiscoreResult.setRanged(skills.get(5)); - hiscoreResult.setPrayer(skills.get(6)); - hiscoreResult.setMagic(skills.get(7)); - hiscoreResult.setCooking(skills.get(8)); - hiscoreResult.setWoodcutting(skills.get(9)); - hiscoreResult.setFletching(skills.get(10)); - hiscoreResult.setFishing(skills.get(11)); - hiscoreResult.setFiremaking(skills.get(12)); - hiscoreResult.setCrafting(skills.get(13)); - hiscoreResult.setSmithing(skills.get(14)); - hiscoreResult.setMining(skills.get(15)); - hiscoreResult.setHerblore(skills.get(16)); - hiscoreResult.setAgility(skills.get(17)); - hiscoreResult.setThieving(skills.get(18)); - hiscoreResult.setSlayer(skills.get(19)); - hiscoreResult.setFarming(skills.get(20)); - hiscoreResult.setRunecraft(skills.get(21)); - hiscoreResult.setHunter(skills.get(22)); - hiscoreResult.setConstruction(skills.get(23)); - hiscoreResult.setLeaguePoints(skills.get(24)); - hiscoreResult.setBountyHunterHunter(skills.get(25)); - hiscoreResult.setBountyHunterRogue(skills.get(26)); - hiscoreResult.setClueScrollAll(skills.get(27)); - hiscoreResult.setClueScrollBeginner(skills.get(28)); - hiscoreResult.setClueScrollEasy(skills.get(29)); - hiscoreResult.setClueScrollMedium(skills.get(30)); - hiscoreResult.setClueScrollHard(skills.get(31)); - hiscoreResult.setClueScrollElite(skills.get(32)); - hiscoreResult.setClueScrollMaster(skills.get(33)); - hiscoreResult.setLastManStanding(skills.get(34)); + int index = 0; + hiscoreResult.setOverall(skills.get(index++)); + hiscoreResult.setAttack(skills.get(index++)); + hiscoreResult.setDefence(skills.get(index++)); + hiscoreResult.setStrength(skills.get(index++)); + hiscoreResult.setHitpoints(skills.get(index++)); + hiscoreResult.setRanged(skills.get(index++)); + hiscoreResult.setPrayer(skills.get(index++)); + hiscoreResult.setMagic(skills.get(index++)); + hiscoreResult.setCooking(skills.get(index++)); + hiscoreResult.setWoodcutting(skills.get(index++)); + hiscoreResult.setFletching(skills.get(index++)); + hiscoreResult.setFishing(skills.get(index++)); + hiscoreResult.setFiremaking(skills.get(index++)); + hiscoreResult.setCrafting(skills.get(index++)); + hiscoreResult.setSmithing(skills.get(index++)); + hiscoreResult.setMining(skills.get(index++)); + hiscoreResult.setHerblore(skills.get(index++)); + hiscoreResult.setAgility(skills.get(index++)); + hiscoreResult.setThieving(skills.get(index++)); + hiscoreResult.setSlayer(skills.get(index++)); + hiscoreResult.setFarming(skills.get(index++)); + hiscoreResult.setRunecraft(skills.get(index++)); + hiscoreResult.setHunter(skills.get(index++)); + hiscoreResult.setConstruction(skills.get(index++)); + hiscoreResult.setLeaguePoints(skills.get(index++)); + hiscoreResult.setBountyHunterHunter(skills.get(index++)); + hiscoreResult.setBountyHunterRogue(skills.get(index++)); + hiscoreResult.setClueScrollAll(skills.get(index++)); + hiscoreResult.setClueScrollBeginner(skills.get(index++)); + hiscoreResult.setClueScrollEasy(skills.get(index++)); + hiscoreResult.setClueScrollMedium(skills.get(index++)); + hiscoreResult.setClueScrollHard(skills.get(index++)); + hiscoreResult.setClueScrollElite(skills.get(index++)); + hiscoreResult.setClueScrollMaster(skills.get(index++)); + hiscoreResult.setLastManStanding(skills.get(index++)); + hiscoreResult.setAbyssalSire(skills.get(index++)); + hiscoreResult.setAlchemicalHydra(skills.get(index++)); + hiscoreResult.setBarrowsChests(skills.get(index++)); + hiscoreResult.setBryophyta(skills.get(index++)); +// hiscoreResult.setCallisto(skills.get(index++)); +// hiscoreResult.setCerberus(skills.get(index++)); + hiscoreResult.setChambersOfXeric(skills.get(index++)); + hiscoreResult.setChambersOfXericChallengeMode(skills.get(index++)); + hiscoreResult.setChaosElemental(skills.get(index++)); + hiscoreResult.setChaosFanatic(skills.get(index++)); + hiscoreResult.setCommanderZilyana(skills.get(index++)); + hiscoreResult.setCorporealBeast(skills.get(index++)); + hiscoreResult.setCrazyArchaeologist(skills.get(index++)); + hiscoreResult.setDagannothPrime(skills.get(index++)); + hiscoreResult.setDagannothRex(skills.get(index++)); + hiscoreResult.setDagannothSupreme(skills.get(index++)); + hiscoreResult.setDerangedArchaeologist(skills.get(index++)); + hiscoreResult.setGeneralGraardor(skills.get(index++)); + hiscoreResult.setGiantMole(skills.get(index++)); + hiscoreResult.setGrotesqueGuardians(skills.get(index++)); + hiscoreResult.setHespori(skills.get(index++)); + hiscoreResult.setKalphiteQueen(skills.get(index++)); + hiscoreResult.setKingBlackDragon(skills.get(index++)); + hiscoreResult.setKraken(skills.get(index++)); + hiscoreResult.setKreearra(skills.get(index++)); + hiscoreResult.setKrilTsutsaroth(skills.get(index++)); + hiscoreResult.setMimic(skills.get(index++)); + hiscoreResult.setObor(skills.get(index++)); + hiscoreResult.setSarachnis(skills.get(index++)); + hiscoreResult.setScorpia(skills.get(index++)); + hiscoreResult.setSkotizo(skills.get(index++)); + hiscoreResult.setGauntlet(skills.get(index++)); + hiscoreResult.setCorruptedGauntlet(skills.get(index++)); + hiscoreResult.setTheatreOfBlood(skills.get(index++)); + hiscoreResult.setThermonuclearSmokeDevil(skills.get(index++)); + hiscoreResult.setTzKalZuk(skills.get(index++)); + hiscoreResult.setTzTokJad(skills.get(index++)); + hiscoreResult.setVenenatis(skills.get(index++)); + hiscoreResult.setVetion(skills.get(index++)); + hiscoreResult.setVorkath(skills.get(index++)); + hiscoreResult.setWintertodt(skills.get(index++)); + hiscoreResult.setZalcano(skills.get(index++)); + hiscoreResult.setZulrah(skills.get(index++)); return hiscoreResult; } } diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java index f0864a9424..bcbaf96860 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java @@ -24,6 +24,11 @@ */ package net.runelite.http.api.hiscore; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter public enum HiscoreSkill { OVERALL("Overall"), @@ -60,17 +65,50 @@ public enum HiscoreSkill CLUE_SCROLL_HARD("Clue Scrolls (hard)"), CLUE_SCROLL_ELITE("Clue Scrolls (elite)"), CLUE_SCROLL_MASTER("Clue Scrolls (master)"), - LAST_MAN_STANDING("Last Man Standing"); + LAST_MAN_STANDING("Last Man Standing"), + ABYSSAL_SIRE("Abyssal Sire"), + ALCHEMICAL_HYDRA("Alchemical Hydra"), + BARROWS_CHESTS("Barrows Chests"), + BRYOPHYTA("Bryophyta"), + CALLISTO("Callisto"), + CERBERUS("Cerberus"), + CHAMBERS_OF_XERIC("Chambers of Xeric"), + CHAMBERS_OF_XERIC_CHALLENGE_MODE("Chambers of Xeric: Challenge Mode"), + CHAOS_ELEMENTAL("Chaos Elemental"), + CHAOS_FANATIC("Chaos Fanatic"), + COMMMANDER_ZILYANA("Commander Zilyana"), + CORPOREAL_BEAST("Corporeal Beast"), + CRAZY_ARCHAEOLOGIST("Crazy Archaeologist"), + DAGANNOTH_PRIME("Dagannoth Prime"), + DAGANNOTH_REX("Dagannoth Rex"), + DAGANNOTH_SUPREME("Dagannoth Supreme"), + DERANGED_ARCHAEOLOGIST("Deranged Archaeologist"), + GENERAL_GRAARDOR("General Graardor"), + GIANT_MOLE("Giant Mole"), + GROTESQUE_GUARDIANS("Grotesque Guardians"), + HESPORI("Hespori"), + KALPHITE_QUEEN("Kalphite Queen"), + KING_BLACK_DRAGON("King Black Dragon"), + KRAKEN("Kraken"), + KREEARRA("Kree'Arra"), + KRIL_TSUTSAROTH("K'ril Tsutsaroth"), + MIMIC("Mimic"), + OBOR("Obor"), + SARACHNIS("Sarachnis"), + SCORPIA("Scorpia"), + SKOTIZO("Skotizo"), + THE_GAUNTLET("The Gauntlet"), + THE_CORRUPTED_GAUNTLET("The Corrupted Gauntlet"), + THEATRE_OF_BLOOD("Theatre of Blood"), + THERMONUCLEAR_SMOKE_DEVIL("Thermonuclear Smoke Devil"), + TZKAL_ZUK("TzKal-Zuk"), + TZTOK_JAD("TzTok-Jad"), + VENENATIS("Venenatis"), + VETION("Vet'ion"), + VORKATH("Vorkath"), + WINTERTODT("Wintertodt"), + ZALCANO("Zalcano"), + ZULRAH("Zulrah"); private final String name; - - HiscoreSkill(String name) - { - this.name = name; - } - - public String getName() - { - return name; - } } diff --git a/http-service/src/test/java/net/runelite/http/service/hiscore/HiscoreServiceTest.java b/http-service/src/test/java/net/runelite/http/service/hiscore/HiscoreServiceTest.java index 52aa2e3d06..5f96f300b5 100644 --- a/http-service/src/test/java/net/runelite/http/service/hiscore/HiscoreServiceTest.java +++ b/http-service/src/test/java/net/runelite/http/service/hiscore/HiscoreServiceTest.java @@ -70,7 +70,48 @@ public class HiscoreServiceTest + "42,14113\n" + "1,777\n" + "254,92\n" - + "-1,-1\n"; // lms + + "-1,-1\n" // lms + + "24870,37\n" + + "15020,388\n" + + "50463,147\n" + + "-1,-1\n" + + "22744,107\n" + + "-1,-1\n" + + "20150,17\n" + + "29400,18\n" + + "13465,172\n" + + "1889,581\n" + + "42891,11\n" + + "1624,1957\n" + + "1243,2465\n" + + "1548,2020\n" + + "-1,-1\n" + + "16781,327\n" + + "19004,149\n" + + "-1,-1\n" + + "72046,5\n" + + "5158,374\n" + + "20902,279\n" + + "702,6495\n" + + "10170,184\n" + + "8064,202\n" + + "6936,2\n" + + "-1,-1\n" + + "-1,-1\n" + + "19779,22\n" + + "58283,10\n" + + "-1,-1\n" + + "-1,-1\n" + + "-1,-1\n" + + "29347,130\n" + + "723,4\n" + + "1264,38\n" + + "44595,4\n" + + "24820,4\n" + + "12116,782\n" + + "2299,724\n" + + "19301,62\n" + + "1498,5847\n"; private final MockWebServer server = new MockWebServer(); @@ -107,6 +148,8 @@ public class HiscoreServiceTest Assert.assertEquals(254, result.getClueScrollMaster().getRank()); Assert.assertEquals(-1, result.getLastManStanding().getLevel()); Assert.assertEquals(2460, result.getLeaguePoints().getLevel()); + Assert.assertEquals(37, result.getAbyssalSire().getLevel()); + Assert.assertEquals(5847, result.getZulrah().getLevel()); } } From 4578333fe003eece1642949ae73be89c8bb38a9e Mon Sep 17 00:00:00 2001 From: h3half Date: Mon, 9 Dec 2019 18:15:08 -0500 Subject: [PATCH 07/17] slayer plugin: fix detecting Konar's first assignment --- .../client/plugins/slayer/SlayerPlugin.java | 2 +- .../client/plugins/slayer/SlayerPluginTest.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 30afee5691..37d241e386 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -109,7 +109,7 @@ public class SlayerPlugin extends Plugin //NPC messages private static final Pattern NPC_ASSIGN_MESSAGE = Pattern.compile(".*(?:Your new task is to kill|You are to bring balance to)\\s*(?\\d+) (?.+?)(?: (?:in|on|south of) (?:the )?(?.+))?\\."); private static final Pattern NPC_ASSIGN_BOSS_MESSAGE = Pattern.compile("^Excellent. You're now assigned to kill (?:the )?(.*) (\\d+) times.*Your reward point tally is (.*)\\.$"); - private static final Pattern NPC_ASSIGN_FIRST_MESSAGE = Pattern.compile("^We'll start you off hunting (.*), you'll need to kill (\\d*) of them."); + private static final Pattern NPC_ASSIGN_FIRST_MESSAGE = Pattern.compile("^We'll start you off (?:hunting|bringing balance to) (.*), you'll need to kill (\\d*) of them\\.$"); private static final Pattern NPC_CURRENT_MESSAGE = Pattern.compile("^You're still (?:hunting|bringing balance to) (?.+)(?: (?:in|on|south of) (?:the )?(?.+), with|; you have) (?\\d+) to go\\..*"); //Reward UI diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index fcf0cef900..5582217e51 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -73,6 +73,7 @@ public class SlayerPluginTest private static final String TASK_NEW_KONAR_2 = "You are to bring balance to 142 Hellhounds in Witchhaven Dungeon."; private static final String TASK_NEW_KONAR_3 = "You are to bring balance to 135 Trolls south of Mount Quidamortem."; private static final String TASK_NEW_FIRST = "We'll start you off hunting goblins, you'll need to kill 17 of them."; + private static final String TASK_NEW_FIRST_KONAR = "We'll start you off bringing balance to cows, you'll need to kill 44 of them."; private static final String TASK_NEW_NPC_CONTACT = "Excellent, you're doing great. Your new task is to kill
211 Suqahs."; private static final String TASK_NEW_FROM_PARTNER = "You have received a new Slayer assignment from breaklulz: Dust Devils (377)"; private static final String TASK_CHECKSLAYERGEM = "You're assigned to kill Suqahs; only 211 more to go."; @@ -231,6 +232,18 @@ public class SlayerPluginTest assertEquals(17, slayerPlugin.getAmount()); } + @Test + public void testFirstTaskKonar() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_FIRST_KONAR); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("cows", slayerPlugin.getTaskName()); + assertEquals(44, slayerPlugin.getAmount()); + } + @Test public void testNewNpcContactTask() { From e789c7233305ee682b312c1dbb4d70c163923a71 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 11 Dec 2019 12:21:12 -0500 Subject: [PATCH 08/17] hiscore result builder: fix building hiscore result with no boss hiscores THe seasonal hiscore endpoint doesn't include boss hiscores --- .../api/hiscore/HiscoreResultBuilder.java | 90 ++++++++++--------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java index 288d290b97..b9efab4e20 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreResultBuilder.java @@ -87,49 +87,53 @@ class HiscoreResultBuilder hiscoreResult.setClueScrollElite(skills.get(index++)); hiscoreResult.setClueScrollMaster(skills.get(index++)); hiscoreResult.setLastManStanding(skills.get(index++)); - hiscoreResult.setAbyssalSire(skills.get(index++)); - hiscoreResult.setAlchemicalHydra(skills.get(index++)); - hiscoreResult.setBarrowsChests(skills.get(index++)); - hiscoreResult.setBryophyta(skills.get(index++)); -// hiscoreResult.setCallisto(skills.get(index++)); -// hiscoreResult.setCerberus(skills.get(index++)); - hiscoreResult.setChambersOfXeric(skills.get(index++)); - hiscoreResult.setChambersOfXericChallengeMode(skills.get(index++)); - hiscoreResult.setChaosElemental(skills.get(index++)); - hiscoreResult.setChaosFanatic(skills.get(index++)); - hiscoreResult.setCommanderZilyana(skills.get(index++)); - hiscoreResult.setCorporealBeast(skills.get(index++)); - hiscoreResult.setCrazyArchaeologist(skills.get(index++)); - hiscoreResult.setDagannothPrime(skills.get(index++)); - hiscoreResult.setDagannothRex(skills.get(index++)); - hiscoreResult.setDagannothSupreme(skills.get(index++)); - hiscoreResult.setDerangedArchaeologist(skills.get(index++)); - hiscoreResult.setGeneralGraardor(skills.get(index++)); - hiscoreResult.setGiantMole(skills.get(index++)); - hiscoreResult.setGrotesqueGuardians(skills.get(index++)); - hiscoreResult.setHespori(skills.get(index++)); - hiscoreResult.setKalphiteQueen(skills.get(index++)); - hiscoreResult.setKingBlackDragon(skills.get(index++)); - hiscoreResult.setKraken(skills.get(index++)); - hiscoreResult.setKreearra(skills.get(index++)); - hiscoreResult.setKrilTsutsaroth(skills.get(index++)); - hiscoreResult.setMimic(skills.get(index++)); - hiscoreResult.setObor(skills.get(index++)); - hiscoreResult.setSarachnis(skills.get(index++)); - hiscoreResult.setScorpia(skills.get(index++)); - hiscoreResult.setSkotizo(skills.get(index++)); - hiscoreResult.setGauntlet(skills.get(index++)); - hiscoreResult.setCorruptedGauntlet(skills.get(index++)); - hiscoreResult.setTheatreOfBlood(skills.get(index++)); - hiscoreResult.setThermonuclearSmokeDevil(skills.get(index++)); - hiscoreResult.setTzKalZuk(skills.get(index++)); - hiscoreResult.setTzTokJad(skills.get(index++)); - hiscoreResult.setVenenatis(skills.get(index++)); - hiscoreResult.setVetion(skills.get(index++)); - hiscoreResult.setVorkath(skills.get(index++)); - hiscoreResult.setWintertodt(skills.get(index++)); - hiscoreResult.setZalcano(skills.get(index++)); - hiscoreResult.setZulrah(skills.get(index++)); + // seasonal doesn't have boss hiscores + if (index < skills.size()) + { + hiscoreResult.setAbyssalSire(skills.get(index++)); + hiscoreResult.setAlchemicalHydra(skills.get(index++)); + hiscoreResult.setBarrowsChests(skills.get(index++)); + hiscoreResult.setBryophyta(skills.get(index++)); +// hiscoreResult.setCallisto(skills.get(index++)); +// hiscoreResult.setCerberus(skills.get(index++)); + hiscoreResult.setChambersOfXeric(skills.get(index++)); + hiscoreResult.setChambersOfXericChallengeMode(skills.get(index++)); + hiscoreResult.setChaosElemental(skills.get(index++)); + hiscoreResult.setChaosFanatic(skills.get(index++)); + hiscoreResult.setCommanderZilyana(skills.get(index++)); + hiscoreResult.setCorporealBeast(skills.get(index++)); + hiscoreResult.setCrazyArchaeologist(skills.get(index++)); + hiscoreResult.setDagannothPrime(skills.get(index++)); + hiscoreResult.setDagannothRex(skills.get(index++)); + hiscoreResult.setDagannothSupreme(skills.get(index++)); + hiscoreResult.setDerangedArchaeologist(skills.get(index++)); + hiscoreResult.setGeneralGraardor(skills.get(index++)); + hiscoreResult.setGiantMole(skills.get(index++)); + hiscoreResult.setGrotesqueGuardians(skills.get(index++)); + hiscoreResult.setHespori(skills.get(index++)); + hiscoreResult.setKalphiteQueen(skills.get(index++)); + hiscoreResult.setKingBlackDragon(skills.get(index++)); + hiscoreResult.setKraken(skills.get(index++)); + hiscoreResult.setKreearra(skills.get(index++)); + hiscoreResult.setKrilTsutsaroth(skills.get(index++)); + hiscoreResult.setMimic(skills.get(index++)); + hiscoreResult.setObor(skills.get(index++)); + hiscoreResult.setSarachnis(skills.get(index++)); + hiscoreResult.setScorpia(skills.get(index++)); + hiscoreResult.setSkotizo(skills.get(index++)); + hiscoreResult.setGauntlet(skills.get(index++)); + hiscoreResult.setCorruptedGauntlet(skills.get(index++)); + hiscoreResult.setTheatreOfBlood(skills.get(index++)); + hiscoreResult.setThermonuclearSmokeDevil(skills.get(index++)); + hiscoreResult.setTzKalZuk(skills.get(index++)); + hiscoreResult.setTzTokJad(skills.get(index++)); + hiscoreResult.setVenenatis(skills.get(index++)); + hiscoreResult.setVetion(skills.get(index++)); + hiscoreResult.setVorkath(skills.get(index++)); + hiscoreResult.setWintertodt(skills.get(index++)); + hiscoreResult.setZalcano(skills.get(index++)); + hiscoreResult.setZulrah(skills.get(index++)); + } return hiscoreResult; } } From a3ef09b433a40a04a47847dbb193b2480e454fa9 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle <29030969+TheStonedTurtle@users.noreply.github.com> Date: Fri, 13 Dec 2019 07:50:10 -0800 Subject: [PATCH 09/17] clanchat plugin: add option to confirm kicks --- .../main/java/net/runelite/api/ScriptID.java | 9 +++ .../plugins/clanchat/ClanChatConfig.java | 11 ++++ .../plugins/clanchat/ClanChatPlugin.java | 57 +++++++++++++++++-- .../src/main/scripts/ClanSendKick.hash | 1 + .../src/main/scripts/ClanSendKick.rs2asm | 34 +++++++++++ 5 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 runelite-client/src/main/scripts/ClanSendKick.hash create mode 100644 runelite-client/src/main/scripts/ClanSendKick.rs2asm diff --git a/runelite-api/src/main/java/net/runelite/api/ScriptID.java b/runelite-api/src/main/java/net/runelite/api/ScriptID.java index 9d056b34e4..2a4693a2c2 100644 --- a/runelite-api/src/main/java/net/runelite/api/ScriptID.java +++ b/runelite-api/src/main/java/net/runelite/api/ScriptID.java @@ -194,4 +194,13 @@ public final class ScriptID */ @ScriptArguments(integer = 2) public static final int XPDROP_DISABLED = 2091; + + /** + * Attempts to kick the specified player from the Clan Chat + *
    + *
  • String Players in-game name
  • + *
+ */ + @ScriptArguments(string = 1) + public static final int CLAN_SEND_KICK = 215; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java index 393008f7fe..9a99c5654f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatConfig.java @@ -137,4 +137,15 @@ public interface ClanChatConfig extends Config { return false; } + + @ConfigItem( + keyName = "confirmKicks", + name = "Confirm Kicks", + description = "Shows a chat prompt to confirm kicks", + position = 9 + ) + default boolean confirmKicks() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index 00779cb51c..d632ae490a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.clanchat; import com.google.common.base.Strings; import com.google.common.collect.Lists; +import com.google.common.util.concurrent.Runnables; import com.google.inject.Provides; import java.awt.Color; import java.awt.image.BufferedImage; @@ -72,6 +73,7 @@ import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; import net.runelite.client.game.ClanManager; import net.runelite.client.game.SpriteManager; +import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import static net.runelite.client.ui.JagexColors.CHAT_CLAN_NAME_OPAQUE_BACKGROUND; @@ -112,6 +114,9 @@ public class ClanChatPlugin extends Plugin @Inject private ClientThread clientThread; + @Inject + private ChatboxPanelManager chatboxPanelManager; + private List chats = new ArrayList<>(); private List clanMembers = new ArrayList<>(); private ClanChatIndicator clanMemberCounter; @@ -122,6 +127,8 @@ public class ClanChatPlugin extends Plugin private Map activityBuffer = new HashMap<>(); private int clanJoinedTick; + private boolean kickConfirmed = false; + @Provides ClanChatConfig getConfig(ConfigManager configManager) { @@ -504,14 +511,37 @@ public class ClanChatPlugin extends Plugin @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent scriptCallbackEvent) { - if (!scriptCallbackEvent.getEventName().equalsIgnoreCase("clanchatInput")) + switch (scriptCallbackEvent.getEventName()) { - return; - } + case "clanchatInput": + { + final int[] intStack = client.getIntStack(); + final int size = client.getIntStackSize(); + intStack[size - 1] = config.clanTabChat() ? 1 : 0; + break; + } + case "confirmClanKick": + { + if (!config.confirmKicks() || kickConfirmed) + { + break; + } - final int[] intStack = client.getIntStack(); - final int size = client.getIntStackSize(); - intStack[size - 1] = config.clanTabChat() ? 1 : 0; + // Set a flag so the script doesn't instantly kick them + final int[] intStack = client.getIntStack(); + final int size = client.getIntStackSize(); + intStack[size - 1] = 1; + + // Get name of player we are trying to kick + final String[] stringStack = client.getStringStack(); + final int stringSize = client.getStringStackSize(); + final String kickPlayerName = stringStack[stringSize - 1]; + + // Show a chatbox panel confirming the kick + clientThread.invokeLater(() -> confirmKickPlayer(kickPlayerName)); + break; + } + } } int getClanAmount() @@ -623,4 +653,19 @@ public class ClanChatPlugin extends Plugin clanMemberCounter = new ClanChatIndicator(image, this); infoBoxManager.addInfoBox(clanMemberCounter); } + + private void confirmKickPlayer(final String kickPlayerName) + { + chatboxPanelManager.openTextMenuInput("Attempting to kick: " + kickPlayerName) + .option("1. Confirm kick", () -> + clientThread.invoke(() -> + { + kickConfirmed = true; + client.runScript(ScriptID.CLAN_SEND_KICK, kickPlayerName); + kickConfirmed = false; + }) + ) + .option("2. Cancel", Runnables::doNothing) + .build(); + } } diff --git a/runelite-client/src/main/scripts/ClanSendKick.hash b/runelite-client/src/main/scripts/ClanSendKick.hash new file mode 100644 index 0000000000..e1fb1db404 --- /dev/null +++ b/runelite-client/src/main/scripts/ClanSendKick.hash @@ -0,0 +1 @@ +9B3B448D76D57F6D63C9CDA06E58695F6DEBE91F9EDF2D2C4876E064D1067FD6 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/ClanSendKick.rs2asm b/runelite-client/src/main/scripts/ClanSendKick.rs2asm new file mode 100644 index 0000000000..1da495029f --- /dev/null +++ b/runelite-client/src/main/scripts/ClanSendKick.rs2asm @@ -0,0 +1,34 @@ +.id 215 +.int_stack_count 0 +.string_stack_count 1 +.int_var_count 0 +.string_var_count 1 +; callback "confirmClanKick" +; Used by the ClanChat plugin to show a chatbox panel confirming the requested kick +; Also requires the "confirmKicks" option of ClanChatConfig to be enabled + invoke 1942 + iconst 1 + if_icmpeq LABEL4 + jump CONFIRM_KICK ; Jump to our new label instead +LABEL4: + sconst "You can't kick players from your team during Wilderness Wars." + mes + return +LABEL7: + sconst "-Attempting to kick player from friends chat..." + iconst 2 + invoke 96 + sload 0 + clan_kickuser + jump LABEL73 +LABEL73: + return +CONFIRM_KICK: + sload 0 ; Username we are trying to kick + iconst 0 ; Modified if we are confirming the kick inside the plugin + sconst "confirmClanKick" + runelite_callback + pop_string ; Pop username + iconst 0 ; Compare against zero + if_icmpgt LABEL73 ; Early return for chatbox panel confirmation + jump LABEL7 From f8b801f6cdad414a66349b808f45f7eda78dd8b0 Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Tue, 3 Dec 2019 18:57:14 -0500 Subject: [PATCH 10/17] woodcutting: show respawn timers after GameState change --- .../client/plugins/woodcutting/TreeRespawn.java | 6 ++++-- .../client/plugins/woodcutting/WoodcuttingPlugin.java | 10 ++++++++-- .../plugins/woodcutting/WoodcuttingTreesOverlay.java | 11 +++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java index a3022ca8f3..ef05dc67b0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/TreeRespawn.java @@ -28,14 +28,16 @@ package net.runelite.client.plugins.woodcutting; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Getter; -import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; @AllArgsConstructor @Getter class TreeRespawn { private final Tree tree; - private final LocalPoint location; + private final int lenX; + private final int lenY; + private final WorldPoint worldLocation; private final Instant startTime; private final int respawnTime; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java index a8a38d852e..1078381bf4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingPlugin.java @@ -41,6 +41,8 @@ import net.runelite.api.Client; import net.runelite.api.GameObject; import net.runelite.api.MenuAction; import net.runelite.api.Player; +import net.runelite.api.Point; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.GameObjectChanged; @@ -204,8 +206,12 @@ public class WoodcuttingPlugin extends Plugin { if (tree.getRespawnTime() != null && !recentlyLoggedIn) { + Point max = object.getSceneMaxLocation(); + Point min = object.getSceneMinLocation(); + int lenX = max.getX() - min.getX(); + int lenY = max.getY() - min.getY(); log.debug("Adding respawn timer for {} tree at {}", tree, object.getLocalLocation()); - TreeRespawn treeRespawn = new TreeRespawn(tree, object.getLocalLocation(), Instant.now(), (int) tree.getRespawnTime().toMillis()); + TreeRespawn treeRespawn = new TreeRespawn(tree, lenX, lenY, WorldPoint.fromScene(client, min.getX(), min.getY(), client.getPlane()), Instant.now(), (int) tree.getRespawnTime().toMillis()); respawns.add(treeRespawn); } @@ -227,9 +233,9 @@ public class WoodcuttingPlugin extends Plugin { switch (event.getGameState()) { - case LOADING: case HOPPING: respawns.clear(); + case LOADING: treeObjects.clear(); break; case LOGGED_IN: diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java index b070861e08..2d2b9ca16e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingTreesOverlay.java @@ -103,10 +103,17 @@ class WoodcuttingTreesOverlay extends Overlay Instant now = Instant.now(); for (TreeRespawn treeRespawn : respawns) { - LocalPoint loc = treeRespawn.getLocation(); + LocalPoint minLocation = LocalPoint.fromWorld(client, treeRespawn.getWorldLocation()); + if (minLocation == null) + { + continue; + } + LocalPoint centeredLocation = new LocalPoint( + minLocation.getX() + treeRespawn.getLenX() * Perspective.LOCAL_HALF_TILE_SIZE, + minLocation.getY() + treeRespawn.getLenY() * Perspective.LOCAL_HALF_TILE_SIZE); float percent = (now.toEpochMilli() - treeRespawn.getStartTime().toEpochMilli()) / (float) treeRespawn.getRespawnTime(); - Point point = Perspective.localToCanvas(client, loc, client.getPlane()); + Point point = Perspective.localToCanvas(client, centeredLocation, client.getPlane()); if (point == null || percent > 1.0f) { continue; From 40234bba129088c8d3f98a7bfa1cd1f33893d127 Mon Sep 17 00:00:00 2001 From: Aaron Goff Date: Sat, 14 Dec 2019 21:33:34 -0500 Subject: [PATCH 11/17] Change avantoe and avantoe seed item id medium name --- .../client/plugins/itemidentification/ItemIdentification.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java index 5270579246..6e8fc3a409 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java @@ -38,7 +38,7 @@ enum ItemIdentification RANARR_SEED(Type.SEED, "Ranarr", "R", ItemID.RANARR_SEED), TOADFLAX_SEED(Type.SEED, "Toad", "TOA", ItemID.TOADFLAX_SEED), IRIT_SEED(Type.SEED, "Irit", "I", ItemID.IRIT_SEED), - AVANTOE_SEED(Type.SEED, "Avantoe", "A", ItemID.AVANTOE_SEED), + AVANTOE_SEED(Type.SEED, "Avan", "A", ItemID.AVANTOE_SEED), KWUARM_SEED(Type.SEED, "Kwuarm", "K", ItemID.KWUARM_SEED), SNAPDRAGON_SEED(Type.SEED, "Snap", "S", ItemID.SNAPDRAGON_SEED), CADANTINE_SEED(Type.SEED, "Cadan", "C", ItemID.CADANTINE_SEED), @@ -56,7 +56,7 @@ enum ItemIdentification RANARR(Type.HERB, "Ranarr", "R", ItemID.RANARR_WEED, ItemID.GRIMY_RANARR_WEED), TOADFLAX(Type.HERB, "Toad", "TOA", ItemID.TOADFLAX, ItemID.GRIMY_TOADFLAX), IRIT(Type.HERB, "Irit", "I", ItemID.IRIT_LEAF, ItemID.GRIMY_IRIT_LEAF), - AVANTOE(Type.HERB, "Avantoe", "A", ItemID.AVANTOE, ItemID.GRIMY_AVANTOE), + AVANTOE(Type.HERB, "Avan", "A", ItemID.AVANTOE, ItemID.GRIMY_AVANTOE), KWUARM(Type.HERB, "Kwuarm", "K", ItemID.KWUARM, ItemID.GRIMY_KWUARM), SNAPDRAGON(Type.HERB, "Snap", "S", ItemID.SNAPDRAGON, ItemID.GRIMY_SNAPDRAGON), CADANTINE(Type.HERB, "Cadan", "C", ItemID.CADANTINE, ItemID.GRIMY_CADANTINE), From 2e8c7f46e1c3d1cab246b8e4b462cfe2e21e5b6c Mon Sep 17 00:00:00 2001 From: whartd Date: Sun, 15 Dec 2019 21:24:00 -0500 Subject: [PATCH 12/17] menu swapper: add jewellery box --- .../MenuEntrySwapperConfig.java | 10 +++++++ .../MenuEntrySwapperPlugin.java | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java index fcf2cfd5ca..6d14f0188d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java @@ -232,6 +232,16 @@ public interface MenuEntrySwapperConfig extends Config return true; } + @ConfigItem( + keyName = "swapJewelleryBox", + name = "Jewellery Box", + description = "Swap Teleport Menu with previous destination on Jewellery Box" + ) + default boolean swapJewelleryBox() + { + return false; + } + @ConfigItem( keyName = "swapPrivate", name = "Private", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 8a13eee25d..28802618d0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -584,6 +584,35 @@ public class MenuEntrySwapperPlugin extends Plugin swap("spellbook", option, target, index); swap("perks", option, target, index); } + else if (config.swapJewelleryBox() && option.equals("teleport menu")) + { + swap("duel arena", option, target, index); + swap("castle wars", option, target, index); + swap("clan wars", option, target, index); + swap("burthorpe", option, target, index); + swap("barbarian outpost", option, target, index); + swap("corporeal beast", option, target, index); + swap("tears of guthix", option, target, index); + swap("wintertodt camp", option, target, index); + swap("warriors' guild", option, target, index); + swap("champions' guild", option, target, index); + swap("monastery", option, target, index); + swap("ranging guild", option, target, index); + swap("fishing guild", option, target, index); + swap("mining guild", option, target, index); + swap("crafting guild", option, target, index); + swap("cooking guild", option, target, index); + swap("woodcutting guild", option, target, index); + swap("farming guild", option, target, index); + swap("miscellania", option, target, index); + swap("grand exchange", option, target, index); + swap("falador park", option, target, index); + swap("dondakan's rock", option, target, index); + swap("edgeville", option, target, index); + swap("karamja", option, target, index); + swap("draynor village", option, target, index); + swap("al kharid", option, target, index); + } else if (config.swapPrivate() && option.equals("shared")) { swap("private", option, target, index); From 4579abb8555694d1bc0cdca9b586476806051310 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Mon, 16 Dec 2019 17:08:48 +0000 Subject: [PATCH 13/17] Update 187 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96d6ccede9..81c7802dd2 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ true true - 186 + 187 From aa4a631a360c08c4a48f2789436dff2aebf4fd8e Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Mon, 16 Dec 2019 17:31:12 +0000 Subject: [PATCH 14/17] Release 1.5.43 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 901c55da08..1ce52fbe50 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 77446dd24e..a6e5dd8cd5 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index dc876a07d6..69ec45744e 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index f205515ac4..c6092efef5 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 201a0caad5..f819521fcd 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 Web Service diff --git a/pom.xml b/pom.xml index 81c7802dd2..ad9bb02971 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.5.43 diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index bc4761d0e6..896f0b516c 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index fe55362ae6..5f1df41bb2 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index e1bab701fa..24210f77dd 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index dd45150342..1b00f8acfb 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 01084c7971..620aef4a00 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43-SNAPSHOT + 1.5.43 script-assembler-plugin From 510aa63d577bc2b4d8ab638ea241584febc7f7a0 Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Mon, 16 Dec 2019 17:31:17 +0000 Subject: [PATCH 15/17] Bump for 1.5.44-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 1ce52fbe50..670082196a 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index a6e5dd8cd5..4488998eac 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 69ec45744e..beeb60e664 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index c6092efef5..12796de388 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index f819521fcd..f413c98571 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index ad9bb02971..bbfbfa1eac 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT pom RuneLite @@ -59,7 +59,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.5.43 + HEAD diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index 896f0b516c..b2413be1b4 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index 5f1df41bb2..24ed77c947 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 24210f77dd..c3ce772241 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 1b00f8acfb..81ae2f0293 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 620aef4a00..d6ece9fce8 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.43 + 1.5.44-SNAPSHOT script-assembler-plugin From b064c2707995582ab64044c054aef82cdbce983d Mon Sep 17 00:00:00 2001 From: dekvall Date: Tue, 17 Dec 2019 02:54:26 +0100 Subject: [PATCH 16/17] widgetinfo: fix tithe farm score --- .../src/main/java/net/runelite/api/widgets/WidgetInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 3acbdb48cb..1b487ba6dd 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -418,7 +418,7 @@ public enum WidgetInfo FISHING_TRAWLER_TIMER(WidgetID.FISHING_TRAWLER_GROUP_ID, 14), - TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 1), + TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 3), BARROWS_INFO(WidgetID.BARROWS_GROUP_ID, 0), BARROWS_BROTHERS(WidgetID.BARROWS_GROUP_ID, WidgetID.Barrows.BARROWS_BROTHERS), From a8fa05e028bc731e1e2d0db6cea02ce7c7281177 Mon Sep 17 00:00:00 2001 From: ln Date: Tue, 17 Dec 2019 04:29:51 +0200 Subject: [PATCH 17/17] GPU: smooth out fog corners --- .../net/runelite/client/plugins/gpu/vert.glsl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl index bdce8dd2ab..642aa688eb 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/gpu/vert.glsl @@ -29,6 +29,8 @@ #define FOG_SCENE_EDGE_MIN TILE_SIZE #define FOG_SCENE_EDGE_MAX (103 * TILE_SIZE) +#define FOG_CORNER_ROUNDING 1.5 +#define FOG_CORNER_ROUNDING_SQUARED FOG_CORNER_ROUNDING * FOG_CORNER_ROUNDING layout (location = 0) in ivec4 VertexPosition; layout (location = 1) in vec4 uv; @@ -82,7 +84,13 @@ void main() int fogNorth = min(FOG_SCENE_EDGE_MAX, cameraZ + drawDistance - TILE_SIZE); // Calculate distance from the scene edge - float fogDistance = min(min(vertex.x - fogWest, fogEast - vertex.x), min(vertex.z - fogSouth, fogNorth - vertex.z)); + int xDist = min(vertex.x - fogWest, fogEast - vertex.x); + int zDist = min(vertex.z - fogSouth, fogNorth - vertex.z); + float nearestEdgeDistance = min(xDist, zDist); + float secondNearestEdgeDistance = max(xDist, zDist); + float fogDistance = nearestEdgeDistance - FOG_CORNER_ROUNDING * TILE_SIZE * + max(0, (nearestEdgeDistance + FOG_CORNER_ROUNDING_SQUARED) / + (secondNearestEdgeDistance + FOG_CORNER_ROUNDING_SQUARED)); vFogAmount = fogFactorLinear(fogDistance, 0, fogDepth * TILE_SIZE) * useFog; }