From 141d5ef24a189142395862547c3245e516fdea47 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 22 Dec 2023 17:41:23 +0100 Subject: [PATCH] c --- .idea/artifacts/Informator_jar.xml | 2 +- .idea/misc.xml | 3 +- .../xyz/soukup/informator/Informator.java | 7 +- .../informator/handlers/AnimationHandler.java | 6 +- .../informator/handlers/ConfigHandler.java | 7 ++ .../handlers/PlaceholderHandler.java | 46 +++++++++++ .../informator/handlers/TabHandler.java | 78 ++++++++++++++++++ .../informator/handlers/clockHandler.java | 8 +- .../informator/handlers/tabHandler.java | 5 -- src/main/resources/animations.yml | 4 +- src/main/resources/config.yml | 1 + src/main/resources/modules/tab.yml | 67 +++++++++------ target/classes/modules/tab.yml | 65 +++++++++++---- .../xyz/soukup/informator/Informator.class | Bin 2891 -> 3190 bytes .../handlers/AnimationHandler.class | Bin 3526 -> 3365 bytes .../informator/handlers/ConfigHandler.class | Bin 2228 -> 2351 bytes .../handlers/PlaceholderHandler.class | Bin 0 -> 1859 bytes .../informator/handlers/TabHandler.class | Bin 0 -> 4723 bytes .../informator/handlers/clockHandler$1.class | Bin 1419 -> 971 bytes .../informator/handlers/clockHandler.class | Bin 858 -> 819 bytes 20 files changed, 241 insertions(+), 58 deletions(-) create mode 100644 src/main/java/xyz/soukup/informator/handlers/PlaceholderHandler.java create mode 100644 src/main/java/xyz/soukup/informator/handlers/TabHandler.java delete mode 100644 src/main/java/xyz/soukup/informator/handlers/tabHandler.java create mode 100644 target/classes/xyz/soukup/informator/handlers/PlaceholderHandler.class create mode 100644 target/classes/xyz/soukup/informator/handlers/TabHandler.class diff --git a/.idea/artifacts/Informator_jar.xml b/.idea/artifacts/Informator_jar.xml index 0eb4301..8faa225 100644 --- a/.idea/artifacts/Informator_jar.xml +++ b/.idea/artifacts/Informator_jar.xml @@ -1,6 +1,6 @@ - $USER_HOME$/Plocha/betaserver/plugins/ + $USER_HOME$/Plocha/beta server/plugins diff --git a/.idea/misc.xml b/.idea/misc.xml index 28403f3..2454f64 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,8 +12,9 @@ + - + \ No newline at end of file diff --git a/src/main/java/xyz/soukup/informator/Informator.java b/src/main/java/xyz/soukup/informator/Informator.java index 0f62e78..6987593 100644 --- a/src/main/java/xyz/soukup/informator/Informator.java +++ b/src/main/java/xyz/soukup/informator/Informator.java @@ -4,6 +4,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; import xyz.soukup.informator.handlers.AnimationHandler; import xyz.soukup.informator.handlers.ConfigHandler; +import xyz.soukup.informator.handlers.TabHandler; import xyz.soukup.informator.handlers.clockHandler; import java.io.IOException; @@ -46,13 +47,17 @@ public final class Informator extends JavaPlugin { throw new RuntimeException(e); } AnimationHandler.loadAnimations(); - clockHandler.centralClock + if (ConfigHandler.config.getBoolean("modules-enabled.tab")){ + TabHandler.loadTabs(); + } + clockHandler clockHandler = new clockHandler(); logger.info(""); logger.info("\u001B[33m==========================================================="); logger.info(""); logger.info("\u001B[34m Informator loaded!"); logger.info(""); logger.info("\u001B[33m==========================================================="); + TabHandler.loadTabs(); } public static Informator getPlugin(){ return instance; diff --git a/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java b/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java index bc490eb..79ab64c 100644 --- a/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java +++ b/src/main/java/xyz/soukup/informator/handlers/AnimationHandler.java @@ -19,7 +19,6 @@ public class AnimationHandler { private static final HashMap tpsCounter = new HashMap(); private static final HashMap animationSpeed = new HashMap(); private static final HashMap currentFrame = new HashMap(); - private static Integer cycles = 0; public static void loadAnimations(){ animations.addAll(aconfig.getKeys(false)); @@ -47,15 +46,14 @@ public class AnimationHandler { } - cycles++; } public static String getCurrentFrame(String name){ if (animations.contains(name)) - return animationFrames.get(name).get(currentFrame.get(name))+ " " + currentFrame.get(name); + return animationFrames.get(name).get(currentFrame.get(name)); else - return null; + return "&cinvalid animation"; } } diff --git a/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java b/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java index 1db3d1d..0449276 100644 --- a/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java +++ b/src/main/java/xyz/soukup/informator/handlers/ConfigHandler.java @@ -16,6 +16,9 @@ public class ConfigHandler { static Informator plugin = Informator.getPlugin(); static Logger logger = plugin.getLogger(); public static YamlConfiguration animationConfig = new YamlConfiguration(); + public static YamlConfiguration config = new YamlConfiguration(); + + public static YamlConfiguration tabConfig = new YamlConfiguration(); public static void loadConfigs() throws IOException, InvalidConfigurationException { List configsToLoad = new ArrayList<>(); configsToLoad.add("config.yml"); @@ -29,6 +32,10 @@ public class ConfigHandler { } animationConfig.load(new File(plugin.getDataFolder(), "animations.yml")); + tabConfig.load(new File(plugin.getDataFolder(), "modules/tab.yml")); + config.load(new File(plugin.getDataFolder(), "config.yml")); + + } diff --git a/src/main/java/xyz/soukup/informator/handlers/PlaceholderHandler.java b/src/main/java/xyz/soukup/informator/handlers/PlaceholderHandler.java new file mode 100644 index 0000000..3e958fa --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/PlaceholderHandler.java @@ -0,0 +1,46 @@ +package xyz.soukup.informator.handlers; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PlaceholderHandler { + public static String substituteAll(String text, Player player){ + String result = substitudeAnimation(text); + result = substitudeColor(result); + return result; + } + public static String substitudeAnimation(String text){ + // Define the regular expression pattern for placeholders + Pattern pattern = Pattern.compile("%%animation:(.*?)%%"); + + // Create a matcher with the input string + Matcher matcher = pattern.matcher(text); + + // StringBuffer to hold the result + StringBuffer result = new StringBuffer(); + + // Find and replace placeholders + while (matcher.find()) { + // Get the animation name + String animationName = matcher.group(1); + + // Look up the corresponding value from the map + String replacement = AnimationHandler.getCurrentFrame(animationName); + + // Append the replacement to the result + matcher.appendReplacement(result, replacement); + } + + // Append the remainder of the input string after the last match + matcher.appendTail(result); + + // Convert the result to a String + return result.toString(); + } + public static String substitudeColor(String text){ + return ChatColor.translateAlternateColorCodes('&', text); + } +} diff --git a/src/main/java/xyz/soukup/informator/handlers/TabHandler.java b/src/main/java/xyz/soukup/informator/handlers/TabHandler.java new file mode 100644 index 0000000..d794c7d --- /dev/null +++ b/src/main/java/xyz/soukup/informator/handlers/TabHandler.java @@ -0,0 +1,78 @@ +package xyz.soukup.informator.handlers; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.util.*; +import java.util.stream.Collectors; + +public class TabHandler { + private static HashMap> tabData = new HashMap<>(); + public static HashMap playerTab = new HashMap<>(); + private static final YamlConfiguration tabConfig = ConfigHandler.tabConfig; + + public static void loadTabs(){ + List tabSources = new ArrayList<>(); + tabSources.add("tabs.required"); + tabSources.add("tabs.world.worlds"); + tabSources.add("tabs.group.groups"); + tabSources.add("tabs.player.players"); + for(String targetKey: tabSources){ + ConfigurationSection targetSection = tabConfig.getConfigurationSection(targetKey); + + if (targetSection != null) { + Set keys = targetSection.getKeys(false); + for (String key : keys) { + List tabDataList = new ArrayList<>(); + tabDataList.add(tabConfig.getInt(targetKey + "." + key + ".priority")); + List header = tabConfig.getStringList(targetKey + "." + key + ".header"); + List footer = tabConfig.getStringList(targetKey + "." + key + ".footer"); + String headerString = String.join("\n&r", header); + String footerString = String.join("\n&r", footer); + tabDataList.add(headerString); + tabDataList.add(footerString); + tabData.put(targetKey + "." + key, tabDataList); + + + + } + } + } + + } + public static void chooseTab(Player player){ + String choosenTab = "tabs.required.default"; + int choosenPriority = tabConfig.getInt("tabs.required.default.priority"); + if (tabData.containsKey("tabs.player.players." + player.getDisplayName())){ + player.sendMessage("ss"+choosenPriority); + + if ((int)tabData.get("tabs.player.players." + player.getDisplayName()).get(0) > choosenPriority){ + player.sendMessage("SSSSSSSS"); + choosenTab = "tabs.player.players." + player.getDisplayName(); + choosenPriority = (int)tabData.get("tabs.player.players." + player.getDisplayName()).get(0); + } + } + if (tabData.containsKey("tabs.world.worlds." + player.getWorld().getName())){ + if ((int)tabData.get("tabs.world.worlds." + player.getWorld().getName()).get(0) > choosenPriority){ + choosenTab = "tab.world.worlds." + player.getWorld().getName(); + } + + } + playerTab.put(player, choosenTab); + + } + public static void refreshTabs(){ + for (Player player : Bukkit.getOnlinePlayers()){ + if (!playerTab.containsKey(player)){ + chooseTab(player); + } + player.setPlayerListHeader(PlaceholderHandler.substituteAll((String) tabData.get(playerTab.get(player)).get(1), player)); + player.setPlayerListFooter(PlaceholderHandler.substituteAll((String) tabData.get(playerTab.get(player)).get(2), player)); + + + } + } + +} diff --git a/src/main/java/xyz/soukup/informator/handlers/clockHandler.java b/src/main/java/xyz/soukup/informator/handlers/clockHandler.java index 423fe64..edf4478 100644 --- a/src/main/java/xyz/soukup/informator/handlers/clockHandler.java +++ b/src/main/java/xyz/soukup/informator/handlers/clockHandler.java @@ -11,16 +11,16 @@ import java.util.Objects; public class clockHandler { public static Informator plugin = Informator.getPlugin(); - static int cycles = 0; public static BukkitTask centralClock = new BukkitRunnable() { @Override public void run() { - cycles++; AnimationHandler.refreshAnimations(); - for (Player player: Bukkit.getOnlinePlayers()) { - player.sendMessage(ChatColor.translateAlternateColorCodes('&', Objects.requireNonNull(AnimationHandler.getCurrentFrame("exampleTitle")))); + + if (ConfigHandler.config.getBoolean("modules-enabled.tab")){ + TabHandler.refreshTabs(); } + } }.runTaskTimer(plugin, 0, 1L); diff --git a/src/main/java/xyz/soukup/informator/handlers/tabHandler.java b/src/main/java/xyz/soukup/informator/handlers/tabHandler.java deleted file mode 100644 index 415cf4b..0000000 --- a/src/main/java/xyz/soukup/informator/handlers/tabHandler.java +++ /dev/null @@ -1,5 +0,0 @@ -package xyz.soukup.informator.handlers; - -public class tabHandler { - -} diff --git a/src/main/resources/animations.yml b/src/main/resources/animations.yml index a3f54a3..ff6d034 100644 --- a/src/main/resources/animations.yml +++ b/src/main/resources/animations.yml @@ -6,7 +6,7 @@ exampleTitle: #Speed is in minecraft ticks #20 ticks = 1 second so speed 20 = 1 frame per second - speed: 2 + speed: 4 #Also hate making animations manually? #You can use animation creation tool (ACT) built in web configurator! # https://informator.soukup.xyz/configurator/act @@ -21,5 +21,5 @@ exampleTitle: - "&b&fINFORMA&b&3T&b&fOR" - "&b&fINFORMAT&b&3O&b&fR" - "&b&fINFORMATO&b&3R" - - "&cKONEC" + diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ccadb33..204c4f6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -9,6 +9,7 @@ modules-enabled: bossbar: true #Configuration for plugin's web interface + web-interface: #online configurator enabled. We recommend to disable it after setting up the plugin enabled: true diff --git a/src/main/resources/modules/tab.yml b/src/main/resources/modules/tab.yml index a99dda0..df8e228 100644 --- a/src/main/resources/modules/tab.yml +++ b/src/main/resources/modules/tab.yml @@ -5,23 +5,24 @@ #/___/_/ /_/_/ \____/_/ /_/ /_/ /_/\__,_/\__/\____/_/ # -settings: +enabled: true tabs: - default: - priority: 0 - header: - - "" - - "{animation.exampleTitle}" - - "" - - "{animation.exampleLine}" - - "" - footer: - - "" - - "{animation.exampleLine}" - - "" - - "Change this in modules/tab.yml" - - "" + required: + default: + priority: 0 + header: + - "" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" + - "" + footer: + - "" + - "%%animation:exampleLine%%" + - "" + - "Change this in modules/tab.yml" + - "" world: enabled: false priority: 1 @@ -30,34 +31,50 @@ tabs: enabled: true header: - "World specified tab" - - "{animation.exampleTitle}" + - "%%animation:exampleTitle%%" - "" - - "{animation.exampleLine}" + - "%%animation:exampleLine%%" - "" footer: - "" - - "{animation.exampleLine}" + - "%%animation:exampleLine%%" - "" - "Change this in modules/tab.yml" - "" #tab that will show only to players with certain group group: - - player: enabled: false priority: 3 - players: - examplePlayer: + groups: + exampleGroup: enabled: true header: - "World specified tab" - - "{animation.exampleTitle}" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" + - "" + footer: + - "" + - "%%animation:exampleLine%%" + - "" + - "Change this in modules/tab.yml" + - "" + player: + enabled: false + players: + Kuba1428: + priority: 3 + enabled: true + header: + - "Player specified tab" + - "%%animation:exampleTitle%%" - "" - - "{animation.exampleLine}" + - "%%animation:exampleLine%%" - "" footer: - "" - - "{animation.exampleLine}" + - "%%animation:exampleLine%%" - "" - "Change this in modules/tab.yml" - "" diff --git a/target/classes/modules/tab.yml b/target/classes/modules/tab.yml index 80a9543..df8e228 100644 --- a/target/classes/modules/tab.yml +++ b/target/classes/modules/tab.yml @@ -5,15 +5,24 @@ #/___/_/ /_/_/ \____/_/ /_/ /_/ /_/\__,_/\__/\____/_/ # -settings: +enabled: true tabs: - default: - priority: 0 - header: - - "INFORMATOR" - footer: + required: + default: + priority: 0 + header: + - "" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" + - "" + footer: + - "" + - "%%animation:exampleLine%%" + - "" - "Change this in modules/tab.yml" + - "" world: enabled: false priority: 1 @@ -21,27 +30,53 @@ tabs: exampleWorld: enabled: true header: - - "INFORMATOR" + - "World specified tab" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" - "" - - "This tab will show up to players" - - "in world exampleWorld" footer: + - "" + - "%%animation:exampleLine%%" + - "" - "Change this in modules/tab.yml" + - "" #tab that will show only to players with certain group group: - - player: enabled: false priority: 3 + groups: + exampleGroup: + enabled: true + header: + - "World specified tab" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" + - "" + footer: + - "" + - "%%animation:exampleLine%%" + - "" + - "Change this in modules/tab.yml" + - "" + player: + enabled: false players: - examplePlayer: + Kuba1428: + priority: 3 enabled: true header: - - "INFORMATOR" + - "Player specified tab" + - "%%animation:exampleTitle%%" + - "" + - "%%animation:exampleLine%%" - "" - - "This tab will show up to user" - - "with nickname examplePlayer" footer: + - "" + - "%%animation:exampleLine%%" + - "" - "Change this in modules/tab.yml" + - "" diff --git a/target/classes/xyz/soukup/informator/Informator.class b/target/classes/xyz/soukup/informator/Informator.class index cee02b9734d7df64e9be79bd6d7aeeef66ffa5be..89d6e20803144ac431b38cd8fbc403d72e3cd337 100644 GIT binary patch delta 1570 zcmaJ>S!^3s6g|(&%y^iP#95oob+#sU9A|HxeW45Bl+cv4X`nEUCuW+7CpdOk3Uz@( zXn~LFeZdbuNJvOXT_h(W6(FQa2qaJ>`h~>u&+pP!*2A~J;%5cCb!ll3sf&b=it`Y|Iq@EsTaJID0cp$+eLRRnq6kh0Pxcq)c znM}?H6%?X~!IRL^Q${AC^D&`cwsyPIwr3c*SVf<@8vgzh~4mh z1qTq}cZ87w83Py;F{EG^BYa3aT4~|O6pUkpK}wt3i6uP58(j^Q^bkMn8YO*%uetnH zR`??d9<{(S9n1+WwxXvs36uO2mo?jC{3q8C>Bo7EyRAsZG>(gSLct6KMx%^LK7LcI zru#U_r`+YFPw@qJg!GgA19vTTJBQQOO+C$j7ON>+SQ3#`U}BjH-B?1-9-8(NCa-!RoUISBMTAC}rB8LQUKzQniOb(ep*P-vL*i+9nXC?yD13@{W- zr`7qzNp+cG4Nb&bG!^%=5-QTz(rUrV`FE@@i%uezgWd)8XYrjZ7uobMNS>utm^85u z?!Y?ORWclSnWVK16yOz-$~FM!>~MzcZm^>lPWplQ0@opWr41B(0V#*#XwX}hLq*V= zt+kcUmVR3{*s{r%`)t{oX9x4_JpU#_v+D?ZJ96j>Pq7)R3%41zP9}(~dp# zw5!lhUzt(bIfPn7QHNvj;UxCrH2idt^>`HxSVJQ|L=)v~#ue;CE=wtHpcP+Ik*^S> z(jjW1gW71vExP+3i66h93%{Zpf1nq)(TBgWpE+@Wc@SZR=x1dZVAU98br`bg5TI6X z!GrTul9l3c;{bB6E|T1 delta 1360 zcmZWoUu;ul6#sqqw!L4kcQ9JEZtMP)4cyw|g^fS9jBPLn4m&_Lfq|l3cP*Eec67G` z0c{A0h9|Rp?>?EB__RUNO=pz&WYjDnk@#lf15d^WUo@H^p8JhyBM8 z?(a?CHCDd;`|~dW>_J7x4h;FBVpzi=ozBCq7~yzH$0&|)9OZbKV~pb%$15Buj&Y9T z8cyh_#}LO!_k7h2I;CR*ldk$2$7zl;9A{nA6vsJ^^Bk}1cmo$SycyQ;mWH&B2&Q#p zFyn`Xw>h#JE-qZ(wVA;;U>9s>kU{O~JuMRa{c~2qDW&rx`C=x=5J?qFS#!Fa%h`@O zm$_)ol=D`}JS+{9>ABnihPnwSoym=-XD8Fsd5gN!U~9O<;Llpl$$U9$7Z|#GdQ)Oi zYh0Ms#h5={XP_5R1J9#}q4ViQi-9C^2J*Pf;0>Se-*cH#87QDAZnHkI!Un~k^d*&~ zxT+*n28hp;5%ENc5DtkC)sPrfJ3q$V)R%)p)Egj1pb2A#%s#+sh99g87Ov*{2&dc)$1FHBvUQeXAC9mgd8l^Yf8CR*$u zqEWOvQ$ilXG-8r5(o8yOT<}Jh!IlUph?De5qk)}-jdcgSAj7HBMz9j3KEC-LXQREj6Cun)Iy_x7AqwE4YI8Pf$0$ipW%a8QZ>ELDyY$kH-Sf zzIglp5-iaK*YE&8paW|a2|8&=?odCX4FFqc0|EL)gJ{H7w4wpq2=yRD18ySDG!xfb zFpMyc&}|BBIE8kcrF0k2i5v9C-lB*P(1nlDjZd*1i?rb?<^F=Qd`-Lkh8DC&6(68t z(mQtIA*KEayYMs7;Su`q3;OXJmHGpF@fiDHOlQ=-GGcLtiC4Y!`ccCnjPTVEA&afnD a0~>sjgmlUH3=xNGh{*mW;z4p%F!&ExEc!73 diff --git a/target/classes/xyz/soukup/informator/handlers/AnimationHandler.class b/target/classes/xyz/soukup/informator/handlers/AnimationHandler.class index 48f9e336334b6f2d2a250c966418d86df0c6ba92..1c18fdfa754e54a82e4e29b5411e9e21c4402859 100644 GIT binary patch literal 3365 zcmb7HX;Tze6g>|{2Zja|cf^RO$fhG|;xcH0BnINRL<~gCVl&eW4NcG3(}QAS_L#-Q zY{tZFn#5@KGEjvQt5SZ>PqM6-^SXPQ#z0Z|GX37|yPkXA?Kgk_^XFdxw&3>&3Q!nE zNWmP;6__`m4y#c^HB-?8y#rdp7MRXhhdv)z>lMAW<}%V=>YT+Y^wXk5?QG3mZcK{@6L zgw;ga?9)>M&GEFAiuUFP2X#B@3Uij@Hrl5fTJ(rIWVAWDo;Vgk1r~&{P{ATBW}5%g zp21U^y;mDyjumx1^?@`yH9J;{oCA z2PtAD9VUY=3I@%i*b%`YbcS(Q!BgnU=j>!bBQ2$oZsB3o$Y}@qB=I_eNqHL1d3;*I z5t&uQ&ScxtIoet>*`o@ckzys0vnAccN`rIXN4^+le`2{Z#5U9y7%3I@Sr zSxDdnYJ;eGT?k^}i6o4sf;2Mnq?&e@gv>c)MA$+$3|m1C!+C@q(zv!fD|5BuIo04| z-89jrA%-&;PAV9Y;X+yclqM&|3kqJuX~yU9vsK-szbQS>XYW|QEUSD)YD{UVr&EO2 zc!Fyay2;+_0kn(p2Hp(gjDol1^lh4Dvb*!vAM2A-!hI3JJ9syYvkKnB`vTR|d+YE& z83M&@%0VMXcE~eXAD_*_;pPVlKEy|aIpbN@%x))B`$WNceCh^usVGpDpN~!lr;>~F z?K8qQ$-P#~Qb*(fiQs~qZEYx|w@y7}s&>vIKh^|DFZEgi&GwGyu9(2yfSNZ-rqK*2 z&FD*d+YwNl&0BC1#H4YkEuCcI<#FBA_UDFrHS4h2Yfw@VPbXBPOSN>l_kL8vp~989eB%fonjqf8=Gb`#&PIDDAY>#2~*jUhw&r)@Nzi{-Bd`@~15@itan$ z`LQ^i`;f^G8&6kD!tky-k9m(Xcjv_pY(!z1fpTLp=baOv}6(nZE1Xc-L z#2GHu3EW0wd=%>&seB8~M{Zzq<2bfdY~#;3c8p`!ICj&x{eFeLd4+v9@uaKM-B{?a zdjjicJ;xO)ZKQX{apKy&6SBHO$m(iY1vnAsVHuhT*gjstj-v{vv4Y3?0oJ(^Kd?2I zsU@p#!Z5B-B5;+G5)|B(H@BKQI7>&@d^m~_a^Se~pYqQK%kO4&-ONnCjYH!Y3LW$7 zaHO()zPyR!7jZ;t2J7^#B#O>v=>$&j*d;HadK5i$-7}5rYbcj5@}92U)9(jkHOpVa zd(~R9rxsmUhZCsdcxxmG8`<(rJ{VOT@snUIMCh)(%h%kMle+N^O70MYV*H4o2$y8o z06~`oiV_vVaH@cGSk3es-1M23yOLN;;H3gdlIs<(UZ;uMtuj8r)D&!GC${^ENb>&7 zu8@C@u4v*Z`X%2De(NMPf%Z|nK8DhpczX=zMsaQ&ACG}7xj_1TK8Eluv~hKD4D0<> vx4&xlS3MFj;n1gsaey*LDrZvj`0rpo2~)v)@&ateLhPhO;8*Gt;J1GPj=q2) literal 3526 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 G&ixH2W76;d diff --git a/target/classes/xyz/soukup/informator/handlers/PlaceholderHandler.class b/target/classes/xyz/soukup/informator/handlers/PlaceholderHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..b8e941ae17bb931a5207d108c04b9d2e2fc06212 GIT binary patch literal 1859 zcmah~+g95~6y4*Sh!NqM5K^}g8WYVp1B zzo4(}3t_cu^#l6cKj?p?JtN8B6~W5OXfEgMeeU}E?H_*uc!2NHh#{^ap(BYD!^CUz zC)2P^r)|7wyyi{Gka}b}mfT>7=khPp7{N6SX&s}`8P<+Zem459cjWa9%Q zI;PXIx#$~vw%Ozz*KTp~G`M4!?t6{Cw4~SK+m1yFmg_Jq<*FCdbtx>TUCu|Z6#sP{ z~O)bK8#W6n4->q^tjXH1ILDtYJpN&!-otv z-;Km$@9>a|G%|>%v4A@o7Il1#yO;P90x={GEvMxt?FXf^q~jiP49T`|y&l7j+_Ou= zTfnl0qK*|6VdFjNJv_TRy-lNBX@+^<%-(S@d?%#Ce2=tJFR`*Q&rI=5r!wj zF$&TiI9rb9KD76es413poyz%BhIGJkU|KfA{VU<4&WF4z%Af1_0uLERq#M}8Fq4aF zP~OXUq~S{)8`vZnSG0|WcXVV)gYqr?s$|GWVLE-=lziJ(bw(TirQ)`DpW$Ava;2|+ zBZl2TDODO&_f^Z`yI!}!#evyS)jCymo2LEJ6qY)NmkHUi2!6f#o+L(lw9GIz=q+V5 z1#&AI$Z~baT}q}UPgK93a51RwcdVEEm@+;Ub(Urfl>{j=+`bx=qy+DKHermNxA-pA z7{jO-t|_fI=;yhBYp7zvRwoamZ-X9WxD~N6EDoZsOS5@YGkal_({OrJv-J+90Uq;_#;SJdDw25JxR`m>A!(&?YKmZkd<=;KQ4&7|g zexJT^B~dtoRx6%itXBMu&H=`C|811WbfhunV=V;o_!>`1PGLX8b3#c%!#8vnBTky@ zA^txkog%5tsfja6+j8L)w`zYP^Zgrqv|BvI{4dB96Q{_Q5_5?&?+c3Z?e^0cneOnZPOl<1^f-yq3Fn)OvO zEkSo9sL?K|ObT5{;URYMf(+KNPH21N!VH$lnQw`6pCrc-d#i^3w1x!@nR)V%ejcHR fYb35BtxYUZ3`-Zm3ldNqN`MwJGSo>ShJ*hB?^e~G literal 0 HcmV?d00001 diff --git a/target/classes/xyz/soukup/informator/handlers/TabHandler.class b/target/classes/xyz/soukup/informator/handlers/TabHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..2d1a3b7bb9dd295441bdf53bbf764adad87c5d9a GIT binary patch literal 4723 zcmb7HX_ypO6+N%JnX2xoVQJP517UNV1-d~3CeuI|hQLf12Erf+ajWUBnJK2}>Qq$& zgG%~FpfPS3ao-}wEiS+O{QRk(X2J8Ss%NTafiL}|`qg{)-goZ3 z=ic|~@^gitgIHts5$wvn$#17<3irC~Pa2+SN;m0C2a z=ko&dn|mg1oNYO*Vy?g(&)jj#F67hR(@`*5FSmohzDPtA~ zEc>WLn;FuJ`GR3Pnf-cymp>MW)7eg|IA9J6tn0Dt!AyU7c-V9^Id8H|M@_4k888b* z=8%50;L8Tn*#t6Jt6-gm7h%0X=6UK1EF3i48k2qG3pW(#45!m~Gutvfz^RNd4;!#i z!HYHAj9UcOObc%+ZKjCeb{QiMGuV7MoajEorR^+I3O13fda;Kf=x2A4OspxPYRtP6xC8qX^l8|Sm#}KaK~c#VG*}19F}+YW z_6*31=nf*~(Ke7E;DeM(4;i`_g$xd9IE*_PJnrr9Eqzln3STmmrH8{mc@!w z@k-WEqKUz6g07(-Io8k-%Or`mhOKoD>2@Dmic!oN*-)?WYO=pzkY3}i1>VcbGBgZ; z<)N@tw(G9W4iPH)F5Ma0t(RB|CXOf=)={ZWZt2Twm~0@c}jlFP`C(#f#>B8a{*%Q<&He%45f` z!cbtnS^9kn4=DJEh6iQjXHOI$>1aWQTE)lw1Is_af@3T#`T21TpOE~F`)S>;_b2cv zJgnf;8a{*5R12Bi=5=>&MZ0^71+!@Qxg|FiRSz7GwVhU>;P+yp{G4ocpQjUEflOFW z5W^QWd4IR-HZENKq6>l!9yTbRPH;*5f`8qVQsJbSKlW)Wr17_wv&9Xq=k zoN~WIewJOMqfnSo?Lh%w1H$BLmoyyJa9+}Iu4A}LF!%%SZbSn@KKkCfQ@<^uht%HsyOT8FPnBQmU=zIw7EV;6Jxe z3znYe3>E8Lzt{SQ!t4-!?*QPLUa5+%RoK8$EW5C;QP45 zw>W-KRgT<;7*`4ZB9uet5#QCCOjMvnaIiI*tPbW?2MdBh1&aiF+A3%iI3;FrutE@T z)9$lqUOkF*@0v^a_nK%0H$~7MOT{W^7igc6n&E5UNjdUW+UtUy+m)0;^^4d{9JkWS z*5r0RQgw2)gO5>kjiToQ_WB^El|4|EeQCQot zkF$4TF;1e9*MTKCgQa)^H{xk56ES{FH84sGu~IC@DzOdC;x@F3E?SUD9Ux!sAy*#9 z5BVke1TSKjIZ~;+6F=f8P77P`WBddO+S!1ga#YWq9>>o(s^h-@z|ZjuqV2_h@JsxP z4BUaM_%&A}{AlgKZ)gRyEI)f^1bh8HDB`zwVw1eW6xr}f(8Xk zu3|0f{Goy-1sfFb6K@H)=~IaK3&8)ldt9EcBrW+ZE)!Rj|F6p5i)uEK zHdEPJ0dGasoQ|BrgRMcblCR-x<0xLoJXP?92(GDl?_+2nZQmxV?~YNtv+-f+@CxF11X1It8yqfw8e z8+kzl(tOLX4XkB%Sw{}6$8l!-ZgS>+Y-G#01^;9LuRvC8#jTN literal 0 HcmV?d00001 diff --git a/target/classes/xyz/soukup/informator/handlers/clockHandler$1.class b/target/classes/xyz/soukup/informator/handlers/clockHandler$1.class index 0b85198693508acf83797aaad8830fd1cd516f78..5bcde2d17f7fb510a4db2aaa245a986ea40543a1 100644 GIT binary patch literal 971 zcmb7C+invv5It@}w%u+UlD6ETg%(KKCRQchf{`WD5K$MzY|8K3d|`TOfPfJbQhSVF-=F~B917N~CL+;> zkA&(ImE})WL`bC7iz&iTF>+v}9nCy;1#4LMP!4bz6^6q(lx?jB(Qw9B3bQlAQRjl1 zDVUlpHy=c?;bqaK{z0K1cOi(VIzL%}Yp_^{~Uxm=hev zIvnTWdq)h#w(ir%mOGJ>uhL0R8lrMvUG3;l#HYeU?wo_gWE5GdLT8~YE$SDOlKi!9 zBEs>BILqn$u1-xTpVOaEH(Y#L)0K&y^-K|JsZ1v_8R@=)b#YyJUmu1?=HIofsa>f?pGvyH`Dj_Z>mC z`U9I^Q98#B$5eo0s-l?L0yeQuJyoH8`p;U;Ss!NiS%rdXv|U0S`?MBuK(;~Cr$pPd G()b6DN&eOV literal 1419 zcmb7E+foxj5Iqwj8f=a2|7MbmQoD9Ko?P25~%%Aq;1b z!$<}vFdDs1S~!)$=_u@^aRy@+&Zcn==QBv*f`y9~E-`dYc*--^89H(!3k=DEUl9yl zMNf%xxU?wrL%t}<(_8diE*H4=BD>{Gnwl3d*wac0U64Eo1es28W%Y#<_+dRkwOQKD}A?qw`mQIjT5#G6;WB1d{t}L2V;KnR?o|HyKlZs=~}DNyn|J zFfHrPjTATe7knv&8|5bPvw!k4q`ZwH`+nKHUOa8JYCI^56%(KIM|9FvY-HEh#}dsf zJ|!$#-9@wtq1JTzrZiuob2XG}l4_H3yv4KKMOAKcY^I}d`McW3PE#%`M1%?0Q~KUoZWH#WaQ2R%Uk zEfUGc?~rJqqk-fawlNe(*U-uE5<@hx7(O9YI@vwcyS;&Q1DQ{-8`!aioe8}D@g)N8 zKm&_hvN8leOt9Cm2R8{kBGX6wBi{h_#g*h+wDwahgTyyvEgblYQA&4^TnQY) TVH%Tk&4SVZX{w-$Mj-VQPVRBT diff --git a/target/classes/xyz/soukup/informator/handlers/clockHandler.class b/target/classes/xyz/soukup/informator/handlers/clockHandler.class index e36e5d903b06b2c1e3933390baf48a8e948dff9e..c90babebf711cc8e5a933ab2183564d4cf2936de 100644 GIT binary patch delta 362 zcmX|+xlRI66o$V$zzlP}I0$awhWkPyCTiu<7z-MWjfv%8h=Je~LTvR744EfU5;2-s zS@{S)jPcwlJjMT?tvcx_doYT5 zscOPXII}fGJtyM@K|2ORCBZ}>mP=A)S^i%>lFUZw?F?@~?t|jhkck&^zJ6tLK-oGf etYd++U`{py$xHG{Ajhpp&ta7{VJ*s{u*4rI`zw(E delta 406 zcmX|7%SyvQ6g@XFlV+Sgd_}FTwpz6hGzhv=H&Udl;zn>Ku>@%;S(qZY@*6__z(3G{ z6$L-Qy$F7cc&CE1xaZz;&zyT_Qt>U?A3v|}0QS+6kSIx%vFgCVnhq5kRS8Se7S=Vh zVWVbalb||b7~Gr;{U{2e_-i*y5WTzJFo+1$Ngn7RD-Qc%e{@VR>y7i|lj5SnEaq%% zDQu&zppaF_Ay3#zaz-m(+f!(usZhWSp`|&OP#E~PzBly4Yp;7X2znzzgB$`Dx$+o^(Q1xCkCXNSM=>E4T+Y>>0E<}SDud