From e6e8fc56fc666b38c5327c84ee63c100d4f19550 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 17 Mar 2016 17:58:37 +0100 Subject: [PATCH] Show Identicon for offerers or trading peers onion address and indicate repeated trades, Display additional info for Altcoins at buy/sell buttons --- gui/src/main/java/io/bitsquare/gui/images.css | 62 +++++++++++- .../main/offer/offerbook/OfferBookView.java | 91 ++++++++++++++---- .../offer/offerbook/OfferBookViewModel.java | 13 +++ .../closedtrades/ClosedTradesView.fxml | 1 + .../closedtrades/ClosedTradesView.java | 33 ++++++- .../pendingtrades/PendingTradesView.fxml | 1 + .../pendingtrades/PendingTradesView.java | 37 ++++++- .../pendingtrades/PendingTradesViewModel.java | 13 +++ .../java/io/bitsquare/gui/util/ImageUtil.java | 77 ++++++++++++++- .../resources/images/avatars/avatar_1.png | Bin 0 -> 1166 bytes .../resources/images/avatars/avatar_10.png | Bin 0 -> 1035 bytes .../resources/images/avatars/avatar_10@2x.png | Bin 0 -> 2236 bytes .../resources/images/avatars/avatar_11.png | Bin 0 -> 1342 bytes .../resources/images/avatars/avatar_11@2x.png | Bin 0 -> 3063 bytes .../resources/images/avatars/avatar_12.png | Bin 0 -> 1243 bytes .../resources/images/avatars/avatar_12@2x.png | Bin 0 -> 2793 bytes .../resources/images/avatars/avatar_13.png | Bin 0 -> 1056 bytes .../resources/images/avatars/avatar_13@2x.png | Bin 0 -> 2325 bytes .../resources/images/avatars/avatar_14.png | Bin 0 -> 1311 bytes .../resources/images/avatars/avatar_14@2x.png | Bin 0 -> 2900 bytes .../resources/images/avatars/avatar_15.png | Bin 0 -> 1133 bytes .../resources/images/avatars/avatar_15@2x.png | Bin 0 -> 2513 bytes .../resources/images/avatars/avatar_1@2x.png | Bin 0 -> 2584 bytes .../resources/images/avatars/avatar_2.png | Bin 0 -> 1040 bytes .../resources/images/avatars/avatar_2@2x.png | Bin 0 -> 2202 bytes .../resources/images/avatars/avatar_3.png | Bin 0 -> 1026 bytes .../resources/images/avatars/avatar_3@2x.png | Bin 0 -> 2238 bytes .../resources/images/avatars/avatar_4.png | Bin 0 -> 1093 bytes .../resources/images/avatars/avatar_4@2x.png | Bin 0 -> 2391 bytes .../resources/images/avatars/avatar_5.png | Bin 0 -> 1068 bytes .../resources/images/avatars/avatar_5@2x.png | Bin 0 -> 2491 bytes .../resources/images/avatars/avatar_6.png | Bin 0 -> 1203 bytes .../resources/images/avatars/avatar_6@2x.png | Bin 0 -> 2753 bytes .../resources/images/avatars/avatar_7.png | Bin 0 -> 1132 bytes .../resources/images/avatars/avatar_7@2x.png | Bin 0 -> 2581 bytes .../resources/images/avatars/avatar_8.png | Bin 0 -> 1059 bytes .../resources/images/avatars/avatar_8@2x.png | Bin 0 -> 2166 bytes .../resources/images/avatars/avatar_9.png | Bin 0 -> 1069 bytes .../resources/images/avatars/avatar_9@2x.png | Bin 0 -> 2505 bytes 39 files changed, 303 insertions(+), 25 deletions(-) create mode 100644 gui/src/main/resources/images/avatars/avatar_1.png create mode 100644 gui/src/main/resources/images/avatars/avatar_10.png create mode 100644 gui/src/main/resources/images/avatars/avatar_10@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_11.png create mode 100644 gui/src/main/resources/images/avatars/avatar_11@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_12.png create mode 100644 gui/src/main/resources/images/avatars/avatar_12@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_13.png create mode 100644 gui/src/main/resources/images/avatars/avatar_13@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_14.png create mode 100644 gui/src/main/resources/images/avatars/avatar_14@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_15.png create mode 100644 gui/src/main/resources/images/avatars/avatar_15@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_1@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_2.png create mode 100644 gui/src/main/resources/images/avatars/avatar_2@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_3.png create mode 100644 gui/src/main/resources/images/avatars/avatar_3@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_4.png create mode 100644 gui/src/main/resources/images/avatars/avatar_4@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_5.png create mode 100644 gui/src/main/resources/images/avatars/avatar_5@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_6.png create mode 100644 gui/src/main/resources/images/avatars/avatar_6@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_7.png create mode 100644 gui/src/main/resources/images/avatars/avatar_7@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_8.png create mode 100644 gui/src/main/resources/images/avatars/avatar_8@2x.png create mode 100644 gui/src/main/resources/images/avatars/avatar_9.png create mode 100644 gui/src/main/resources/images/avatars/avatar_9@2x.png diff --git a/gui/src/main/java/io/bitsquare/gui/images.css b/gui/src/main/java/io/bitsquare/gui/images.css index 396135b11a..acd9aa0d46 100644 --- a/gui/src/main/java/io/bitsquare/gui/images.css +++ b/gui/src/main/java/io/bitsquare/gui/images.css @@ -34,7 +34,6 @@ -fx-image: url("../../../images/buy_white.png"); } - #image-sell { -fx-image: url("../../../images/sell.png"); } @@ -213,3 +212,64 @@ -fx-image: url("../../../images/link.png"); } +#avatar_1 { + -fx-image: url("../../../images/avatars/avatar_1.png"); +} + +#avatar_2 { + -fx-image: url("../../../images/avatars/avatar_2.png"); +} + +#avatar_3 { + -fx-image: url("../../../images/avatars/avatar_3.png"); +} + +#avatar_4 { + -fx-image: url("../../../images/avatars/avatar_4.png"); +} + +#avatar_5 { + -fx-image: url("../../../images/avatars/avatar_5.png"); +} + +#avatar_6 { + -fx-image: url("../../../images/avatars/avatar_6.png"); +} + +#avatar_7 { + -fx-image: url("../../../images/avatars/avatar_7.png"); +} + +#avatar_8 { + -fx-image: url("../../../images/avatars/avatar_8.png"); +} + +#avatar_9 { + -fx-image: url("../../../images/avatars/avatar_9.png"); +} + +#avatar_10 { + -fx-image: url("../../../images/avatars/avatar_10.png"); +} + +#avatar_11 { + -fx-image: url("../../../images/avatars/avatar_11.png"); +} + +#avatar_12 { + -fx-image: url("../../../images/avatars/avatar_12.png"); +} + +#avatar_13 { + -fx-image: url("../../../images/avatars/avatar_13.png"); +} + +#avatar_14 { + -fx-image: url("../../../images/avatars/avatar_14.png"); +} + +#avatar_15 { + -fx-image: url("../../../images/avatars/avatar_15.png"); +} + + diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java index 8eb607867b..96623177e4 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java @@ -32,6 +32,7 @@ import io.bitsquare.gui.main.funds.withdrawal.WithdrawalView; import io.bitsquare.gui.main.offer.OfferView; import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.windows.OfferDetailsWindow; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.gui.util.Layout; import io.bitsquare.locale.BSResources; import io.bitsquare.locale.CryptoCurrency; @@ -43,6 +44,7 @@ import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.VPos; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.image.ImageView; import javafx.scene.layout.GridPane; @@ -153,6 +155,7 @@ public class OfferBookView extends ActivatableViewAndModel model.onSetPaymentMethod(paymentMethodComboBox.getSelectionModel().getSelectedItem())); createOfferButton.setOnAction(e -> onCreateOffer()); - priceColumn.textProperty().bind(createStringBinding( - () -> !model.showAllTradeCurrenciesProperty.get() ? - "Price in " + model.tradeCurrencyCode.get() + "/BTC" : - "Price", - model.tradeCurrencyCode, - model.showAllTradeCurrenciesProperty)); - volumeColumn.textProperty().bind(createStringBinding( - () -> !model.showAllTradeCurrenciesProperty.get() ? - "Amount in " + model.tradeCurrencyCode.get() + " (Min.)" : - "Amount (Min.)", + () -> { + setDirectionTitles(); + String tradeCurrencyCode = model.tradeCurrencyCode.get(); + boolean showAllTradeCurrencies = model.showAllTradeCurrenciesProperty.get(); + priceColumn.setText(!showAllTradeCurrencies ? + "Price in " + tradeCurrencyCode + "/BTC" : + "Price"); + return !showAllTradeCurrencies ? + "Amount in " + tradeCurrencyCode + " (Min.)" : + "Amount (Min.)"; + }, model.tradeCurrencyCode, model.showAllTradeCurrenciesProperty)); @@ -212,6 +216,7 @@ public class OfferBookView extends ActivatableViewAndModel getAvatarColumn() { + TableColumn column = new TableColumn("") { + { + setMinWidth(32); + setMaxWidth(32); + setSortable(true); + } + }; + column.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); + column.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + @Override + public void updateItem(final OfferBookListItem newItem, boolean empty) { + super.updateItem(newItem, empty); + + if (newItem != null && !empty) { + String hostName = newItem.getOffer().getOwnerNodeAddress().hostName; + int numPastTrades = model.getNumPastTrades(newItem.getOffer()); + boolean hasTraded = numPastTrades > 0; + String tooltipText = hasTraded ? "Offerers onion address: " + hostName + "\n" + + "You have already traded " + numPastTrades + " times with that offerer." : "Offerers onion address: " + hostName; + Node identIcon = ImageUtil.getIdentIcon(hostName, tooltipText, hasTraded); + if (identIcon != null) + setGraphic(identIcon); + } else { + setGraphic(null); + } + } + }; + } + }); + return column; + } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java index e04bade28d..0b94c7b1a6 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java @@ -33,6 +33,8 @@ import io.bitsquare.locale.*; import io.bitsquare.p2p.NodeAddress; import io.bitsquare.p2p.P2PService; import io.bitsquare.payment.*; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.closed.ClosedTradableManager; import io.bitsquare.trade.offer.Offer; import io.bitsquare.trade.offer.OpenOfferManager; import io.bitsquare.user.Preferences; @@ -69,6 +71,7 @@ class OfferBookViewModel extends ActivatableViewModel { private final Preferences preferences; private final P2PService p2PService; private final PriceFeed priceFeed; + private ClosedTradableManager closedTradableManager; private Navigation navigation; final BSFormatter formatter; @@ -101,6 +104,7 @@ class OfferBookViewModel extends ActivatableViewModel { @Inject public OfferBookViewModel(User user, OpenOfferManager openOfferManager, OfferBook offerBook, Preferences preferences, P2PService p2PService, PriceFeed priceFeed, + ClosedTradableManager closedTradableManager, Navigation navigation, BSFormatter formatter) { super(); @@ -110,6 +114,7 @@ class OfferBookViewModel extends ActivatableViewModel { this.preferences = preferences; this.p2PService = p2PService; this.priceFeed = priceFeed; + this.closedTradableManager = closedTradableManager; this.navigation = navigation; this.formatter = formatter; @@ -435,4 +440,12 @@ class OfferBookViewModel extends ActivatableViewModel { private boolean isEditEntry(String id) { return id.equals(EDIT_FLAG); } + + public int getNumPastTrades(Offer offer) { + return closedTradableManager.getClosedTrades().stream() + .filter(e -> e instanceof Trade && ((Trade) e).getTradingPeerNodeAddress() != null && + ((Trade) e).getTradingPeerNodeAddress().hostName.equals(offer.getOffererNodeAddress().hostName)) + .collect(Collectors.toSet()) + .size(); + } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.fxml b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.fxml index 54b6368eb3..80f4352538 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.fxml +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.fxml @@ -35,6 +35,7 @@ + diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java index e69dfcc45c..69b1f7f66b 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java @@ -23,11 +23,13 @@ import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.main.overlays.windows.OfferDetailsWindow; import io.bitsquare.gui.main.overlays.windows.TradeDetailsWindow; import io.bitsquare.gui.util.BSFormatter; +import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.trade.Tradable; import io.bitsquare.trade.Trade; import io.bitsquare.trade.offer.OpenOffer; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.util.Callback; @@ -41,7 +43,7 @@ public class ClosedTradesView extends ActivatableViewAndModel table; @FXML TableColumn priceColumn, amountColumn, volumeColumn, - directionColumn, dateColumn, tradeIdColumn, stateColumn; + directionColumn, dateColumn, tradeIdColumn, stateColumn, avatarColumn; private final BSFormatter formatter; private final OfferDetailsWindow offerDetailsWindow; private final TradeDetailsWindow tradeDetailsWindow; @@ -63,6 +65,7 @@ public class ClosedTradesView extends ActivatableViewAndModel setAvatarColumnCellFactory() { + avatarColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); + avatarColumn.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + @Override + public void updateItem(final ClosedTradableListItem newItem, boolean empty) { + super.updateItem(newItem, empty); + + if (newItem != null && !empty && newItem.getTradable() instanceof Trade) { + + String hostName = ((Trade) newItem.getTradable()).getTradingPeerNodeAddress().hostName; + Node identIcon = ImageUtil.getIdentIcon(hostName, "Trading peers onion address: " + hostName, true); + if (identIcon != null) + setGraphic(identIcon); + } else { + setGraphic(null); + } + } + }; + } + }); + return avatarColumn; + } private void setAmountColumnCellFactory() { amountColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.fxml b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.fxml index eb36e40ed5..21b3927083 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.fxml +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.fxml @@ -52,6 +52,7 @@ + diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java index 4e37790bc6..73e6a41453 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java @@ -25,9 +25,11 @@ import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.main.overlays.popups.Popup; import io.bitsquare.gui.main.overlays.windows.TradeDetailsWindow; import io.bitsquare.gui.util.BSFormatter; +import io.bitsquare.gui.util.ImageUtil; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.TextFieldTableCell; @@ -56,7 +58,7 @@ public class PendingTradesView extends ActivatableViewAndModel priceColumn, tradeVolumeColumn; @FXML - TableColumn roleColumn, paymentMethodColumn, idColumn, dateColumn; + TableColumn avatarColumn, roleColumn, paymentMethodColumn, idColumn, dateColumn; @FXML TableColumn tradeAmountColumn; @@ -88,6 +90,7 @@ public class PendingTradesView extends ActivatableViewAndModel setAvatarColumnCellFactory() { + avatarColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); + avatarColumn.setCellFactory( + new Callback, TableCell>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + @Override + public void updateItem(final PendingTradesListItem newItem, boolean empty) { + super.updateItem(newItem, empty); + + if (newItem != null && !empty && newItem.getTrade().getTradingPeerNodeAddress() != null) { + String hostName = newItem.getTrade().getTradingPeerNodeAddress().hostName; + int numPastTrades = model.getNumPastTrades(newItem.getTrade()); + boolean hasTraded = numPastTrades > 0; + String tooltipText = hasTraded ? "Trading peers onion address: " + hostName + "\n" + + "You have already traded " + numPastTrades + " times with that peer." : "Trading peers onion address: " + hostName; + Node identIcon = ImageUtil.getIdentIcon(hostName, tooltipText, hasTraded); + if (identIcon != null) + setGraphic(identIcon); + } else { + setGraphic(null); + } + } + }; + } + }); + return avatarColumn; + } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java index 3b45bc3d64..ca9dfa1c10 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesViewModel.java @@ -30,6 +30,7 @@ import io.bitsquare.p2p.P2PService; import io.bitsquare.payment.PaymentMethod; import io.bitsquare.trade.Contract; import io.bitsquare.trade.Trade; +import io.bitsquare.trade.closed.ClosedTradableManager; import io.bitsquare.trade.offer.Offer; import io.bitsquare.user.User; import javafx.beans.property.*; @@ -38,6 +39,8 @@ import org.bitcoinj.core.BlockChainListener; import org.fxmisc.easybind.EasyBind; import org.fxmisc.easybind.Subscription; +import java.util.stream.Collectors; + import static io.bitsquare.gui.main.portfolio.pendingtrades.PendingTradesViewModel.SellerState.*; public class PendingTradesViewModel extends ActivatableWithDataModel implements ViewModel { @@ -70,6 +73,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel buyerState = new SimpleObjectProperty<>(); @@ -88,6 +92,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel e instanceof Trade && ((Trade) e).getTradingPeerNodeAddress() != null && + ((Trade) e).getTradingPeerNodeAddress().hostName.equals(trade.getTradingPeerNodeAddress().hostName)) + .collect(Collectors.toSet()) + .size(); + } /////////////////////////////////////////////////////////////////////////////////////////// // States diff --git a/gui/src/main/java/io/bitsquare/gui/util/ImageUtil.java b/gui/src/main/java/io/bitsquare/gui/util/ImageUtil.java index 1469fbdfbd..4a12735831 100644 --- a/gui/src/main/java/io/bitsquare/gui/util/ImageUtil.java +++ b/gui/src/main/java/io/bitsquare/gui/util/ImageUtil.java @@ -19,11 +19,21 @@ package io.bitsquare.gui.util; import com.sun.javafx.tk.quantum.QuantumToolkit; import io.bitsquare.locale.Country; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.UUID; + public class ImageUtil { private static final Logger log = LoggerFactory.getLogger(ImageUtil.class); @@ -55,6 +65,71 @@ public class ImageUtil { } public static boolean isRetina() { - return ((QuantumToolkit) QuantumToolkit.getToolkit()).getMaxRenderScale() > 1.9f; + float maxRenderScale = ((QuantumToolkit) QuantumToolkit.getToolkit()).getMaxRenderScale(); + boolean isRetina = maxRenderScale > 1.9f; + log.info("isRetina=" + isRetina + " / maxRenderScale=" + maxRenderScale); + return isRetina; + } + + public static Node getIdentIcon(String hostName, String tooltipText, boolean hasTraded) { + if (!hostName.isEmpty()) { + // for testing locally we use a random hostname to get dif. colors + if (hostName.startsWith("localhost")) + hostName = UUID.randomUUID().toString().replace("-", "").substring(0, 16); + + int maxIndices = 15; + try { + MessageDigest md = MessageDigest.getInstance("SHA1"); + byte[] bytes = md.digest(hostName.getBytes()); + int intValue = Math.abs(((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) + | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF)); + + int index = (intValue % maxIndices) + 1; + + int red = intValue % 256; + int green = (intValue >> 8) % 64; // we use green for marking repeated trades, so avoid it in main bg color + int blue = (intValue >> 16) % 256; + + ImageView iconView = new ImageView(); + iconView.setId("avatar_" + index); + iconView.setScaleX(intValue % 2 == 0 ? 1d : -1d); + double size = 26; + Group iconGroup = new Group(); + + Color color = Color.rgb(red, green, blue); + color = color.deriveColor(1, 0.6, 1, 1); // reduce saturation + + if (hasTraded) { + Canvas outerBg = new Canvas(size, size); + GraphicsContext gc = outerBg.getGraphicsContext2D(); + gc.setFill(Color.rgb(0, 170, 51)); // green + gc.fillOval(0, 0, size, size); + outerBg.setLayoutY(1); + + Canvas innerBg = new Canvas(size, size); + GraphicsContext gc2 = innerBg.getGraphicsContext2D(); + gc2.setFill(color); + gc2.fillOval(2, 2, size - 4, size - 4); + innerBg.setLayoutY(1); + iconGroup.getChildren().addAll(outerBg, innerBg, iconView); + } else { + Canvas bg = new Canvas(size, size); + GraphicsContext gc = bg.getGraphicsContext2D(); + gc.setFill(color); + gc.fillOval(0, 0, size, size); + bg.setLayoutY(1); + iconGroup.getChildren().addAll(bg, iconView); + } + + Tooltip.install(iconGroup, new Tooltip(tooltipText)); + return iconGroup; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + log.error(e.toString()); + return null; + } + } else { + return null; + } } } diff --git a/gui/src/main/resources/images/avatars/avatar_1.png b/gui/src/main/resources/images/avatars/avatar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..32fa7c4bcadfbbe3d5abc6c0d1ea21c56506dc17 GIT binary patch literal 1166 zcmV;91abR`P)NY*lr zjgA1yLpc2vjPkgtnD(lII7-HybYEu5?$M<7fz;zwvaOy`Z0&5z!H@nw(Avew1@C}T zUy!T)fV*Z@72o&!uBRm=R1cXZXii&;Z3-uQN`dYFZvg(s^X%6Y)K9cON{_#L zUqG%^fVO=3xU5cf6IHeIWgOCMB!(S>e!fS+bwdRNGKzy;Mq%g`Fj4c6=UULr7@}=m z5V}cVu3v&D17~Ee3>+42cCTXc9!@={Le8Uzbv^^F@d4C#?4x)zUpx-mAf=i>+$*)x zmwp$7XHzB)%vdK{_Z)*>-v(GEXwf*#<{e7el@aCG!Q{>0WvR%%%vQNmZWUT2j>e9s z2x!NeARKF*M+c$C2WMdwh64AI$Mj1KZj#d2t*9PG!*;andJ$X?uLImc5sffL+{uQm z0*nWvP72Y-8BP=Jq^ua4A36fAnFLb38|0sU^Q`ky=ou-rfIzCK1niUKWLAc@K!%%q z&DVHPM|pV;^AqQK^0!Bjn;HrRRAk#xl8L0n<7aZW2CN;gOn3 zWfL={BW^aA!RtD|W#uLzjCu+}QuM|`UE=wL^K*}=jtJ2gu#Y&V=a-K54gB@V z+~P{Z>RZio{SonR@6e0U7hbvIB44l$aluZ}#-2bx%cZKAoLxNNcm0K-c~r}epC7WSZPl&LNi&xT^&Xgb}e}bU90|E69C-vLutXUs1Fn%+K&%RHRQv33Is5I;E@L5KuWT{xuc`C{4h|B8hTiOLbX~YO ziI2ZYBAqS6G=wj0PNj_o0_uM3;li)O*LtVtmL3lod}l}(_@RFq{iA7gC7O^~s$e3O zhophH4&o2NGqm~w0lBW{Q6GItx4pEUW(?0pP1!|--}cMUTtsl@h7FOWz3Y_pZ=@0* gWMZR^{ab(m0Q+~tW*||ADF6Tf07*qoM6N<$g7Wk^_W%F@ literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_10.png b/gui/src/main/resources/images/avatars/avatar_10.png new file mode 100644 index 0000000000000000000000000000000000000000..7318cbac98c4045b48ac4d5a4ca1952ac71b0f44 GIT binary patch literal 1035 zcmV+m1oZofP)HR+Ay}ahtSChgLVXvk1)=mo5kVi+2VX=*MGNhVi1^?`i6H(w3)UAON=1dd zn1_%yZEZ-)ZkwN-*_pY2p1VooG~I;RKJ>C@=iHfl?|063zk6nwF$NE#Ie18ocf0x1 zuRHIHN9sFp+#0lwAygA#Fn(Of`L|Me?OO(%&yRk2!W0AAngFLxf1gF^A14g7!x&<0 z04khOrlMTWz+tYvdO|i%86)0hV8eih-Co9m->m;YKx6fj>pr89mlJ`@&7aSDJbhg% z2}J;!)~;2KeH8{{XSInR4CwLtD>=3twBl&IK6v1Cy*i33%?tQ__6!EgLwI)o+kF+k z{HS4KfkNsX2<}Rrxm{rilVRnEM?Us#e;(5}f5d^I{J3vLL)7o@QY17am`EzUGDnz1uaS?mdCG3HW|3mgAt?^D5)~E)0pVmUN;5gYm@+bs!;}%2Gj?rIM zsMX5goP7+*o~9I^Sr-K}h(%>G7S*qn%;-=jXr}@m_i%7$L7=&t9MO_MyVXE-pdWkc zmF3~>@`UU1De%gmmAH_YnOjItMJv~J^L7Kq_2C752>cQb7TzN|3La-@lb@y<({t@= zvmu9{+#Lzm58;;jsPLA|?B#zC$t;<1T_^I(9?f&$I;^)BpDm{JJF2z(hROES-2BRg zYqz~2Q>sEzRhYfn7)g`llIQz>GsihcQx4k+J(eI73Xyz5aIYzmxptRJ0msyAhUx1! zpp~}NAqae*lsQ7&}8}lEfN&E)OMQB~$=OpLVesKS(EVrYj z_p>z4$p5eqb!ieEW?g7topO_QjBP>_Dey>P>Zp_qc4yRp_M~%IHvf8Jj}#UI1$(~R z`^9FVq=bFTZj#Y5-Tk2l)tS#}!ZC8bCyVkKk-}iVNH%0-gPJ6Jj-Gr`Ty?AMFIxH~ z%43v3U!Y~j>E3?IWZPP$xkENXc99nUg+iFws`UORzyQ}GhqVJ!(3AiG002ovPDHLk FV1m_D^pXGo literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_10@2x.png b/gui/src/main/resources/images/avatars/avatar_10@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..14f07e3438b45bc6910747771857ca8794b02fef GIT binary patch literal 2236 zcmV;t2t)UYP)SRR1}sVJxj6(~|@g(@KgLV$q&08v4BNEH!Jfhwd1ig=W& zyo9J4q(&$zG)dF2N%rCF*88-_9?$DuzB~3-dDvdt8M_E|qLUfV>)!94?|kRnyThcE z^#8Q6R{*^N=zkQ@qkqh_`ASK?Fp04QC8Dn<$Gu2ZcNV|V7_P?jU6hW$?Ut%@_F&Qe z>sCqjaVF>&xMa6_>!Hc^`l_@5X-QN^e{NhIDPS5uDK~h^i`bvV*erZ@g~M-he}iJRN*9)G&fD4+wii9T20=_ z!UiOH6Jui`DeeGluz#hGV>ONru1AP#VF1#6-;emB@fb(K2IQHujS`T-V%hiUiCp8j z=qw|WSt@;S#fm?}8!&9^mXHDYtdSSk1Q%jwD1<|ZMVWb9F0zJNmdTz|u3;0B*(5xN zu6tbqi5XReki6_^Y1xsibvAPp7@J10!)OANx;`FOz`SIfx9|1hkP%%OU z&Ld6E`;VXpBRKqax1I0>S@YKL z0hh(kKsM=m2;4TH#9+&G^AiNYec0dBjk-Cm_Dj-YPbHYu$5o%!!c)Yseh2&Sc1$+O zN>cJ~WE0`cSUW6zWb;ZyqoX+gw~oEzMIQ3}*s~;}aPqpvE;CeBh^x>&WLEV6Nj&P4 zrYT^&CIUh67xhYYnOX8FKfgvZd6QD96pf9hC^w{0D#=LG zwclY_KY_b{Tp#Xh!MKz!l;a15WOFX^@={@$7FSkP=|eu;98V5l(x|D)8fDa+g0mio z!eu!SZIPjKa={1F@@XpX(tl=68cfG%*H(vOtnwRAXwybw_y(pKb@#CvHC+?W#Gf(U z_^E1njq)=W$OWZjoo>3J1pos2^?T(s0Eai|dQB%vP~DT~IV~22M8}0w%#&xWqB=r_ zj1&~ta2>^BKXJDx}12GS=HY9&-3~{uHad<5aO0! zB&T?Zd;rp;8KPL4s#bZ&%*6{I!gOH|=h^^;xarpm1&XxQbDcX~r#fj{=B+}=p|#aj zs%#si+;9fLZV)%(h>1vzdZ1LHu&|@Jy7cpGb^y1_c?jOqc-yaV{SVl$zFdHI!Y%hZ zcJ(ePtwC1jpyI!7MCj?~EPB(vO_Uu>)bbbNM|hH^&KBt8sRc?T66*}vjH@3YWsJ>W zfPRGIA0REvlJt8EsFo)v?R)N*@$;~(OEbG{nMti8rPB#2mMZl7zq~+0nJ8t_QF0)~ zYbBdXWrvc6W00P&^^W3r0+Tx?GW9?^* zwv7p^ zmOB58fT_%!3Y~K3$N+Vf`V{prX_K6~{3arzgs2CJm8H7X_n;{6ejz1-XT$dpwoEs@ z@jQ>lwoC+~P%bS86zp(AYGCPJ0GjD)ITQd23-bZ>RQ~B=b3pV;=#*njeg;wSejHxx zw17qaLS^oD17-@3--*ohgW?SCMgx0c>Z^}7M{RuuDz2y~HcET2uj9#Eu~#2# zlzUli7eJo}YK_T<@q4k=%_lSct1qVJMrm0I*OOnA1Ra64UH|Azv?tH6Qw~00RJ3>BWZ=c!)Rv0000< KMNUMnLSTYt?o7}C literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_11.png b/gui/src/main/resources/images/avatars/avatar_11.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3a75b441c1e6afc8636770ca4a87b34e97f1b5 GIT binary patch literal 1342 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 FV1fd^QnvsA literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_12@2x.png b/gui/src/main/resources/images/avatars/avatar_12@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5e20937a308e23c11379031f7c5f13b0360147 GIT binary patch literal 2793 zcmV$l= z9*Ig@Ou->GNk|+!PMpM!?e*Kc_C9B4rr(`)jDzjO;B_paT={5bXYbs5zkAO4&N+82 zS(b&*QP@7Q1KKu&*APA8(#!LLipdGx(K&z8);@|%X9W)Ev> z0nrb}C4-LUV@s-czqpl-E-9+xf@7uAI?YqTEt@uD(Youf@#b6b_m^KpW9@%8&seZx zTW;a3y$1V?-M*3?Ks_zT#(eH@x>395Z;$DTSWt6&&pU=`nn+NaZnqov+n1$+n_r?gbh=W4<#V|`1D~}Dm=K_@=Hp`k z($Lk?xK>Xlf~rHa0i=>iXmoVH-w%H<7y0@5C@d^OQOQh{FIrPax|1uDXWPpgkPoTrvkcLu5%fxUn68&U3qdmr};@PFh$?;+Cys~6; zFoMq-k0u0YR@oJ!U!>ohHub23ySrrRQZPbtVIu3{kiKFjH90gh=4FE+YAl%nr}=@L z0`{R9Cc^ZkE)s`OFG;rDk!M*<#;h?-U8&1+2R8cC>~P0kXf99MM9Z0O?)SONPHflj&v%8w1s`TVPP!Enua`b zdNkW|A(q4WN<1FLsl~jO>^;G^&FYnGU-R@2H3=u05TMAoRk4MXod2qB=xfR_@RMQlp--9I{f0vaap=QZl9pko zMjnp`%U68?bITWHg0HR*$EUDb@U-M{zLlFi4O9B;J|s;f3EWrn;rM}`yX=sR`Ac%b z?>Sv+J{X@mPMyS`|L}VpsI8$wbgo;sfb=U=jMu*M?Mr@tQUCsM> zZzR6)!w;&Ldc8g@EWgYKbmg)YcFmJa#If@qJ8-PNj-XPMG-^Jm#)cbis&)r_+s@MY zIl57mkNqs0Cim)#+u`&3;PZLyMdn|gH=LRnj3K7YRx*N`xgmh?&U7;A5aTME23f== zk)(?LqRb#LLzp17&TKqR^?#LiSv8#FIfg<2wbj<%jZ`X4kdneF$D;=CY=pt?eIz zAyq-kEF&FD;6&pY9BybqduKm7y8DsT(?gaa;aAxLq|%v%Xqv8vzE`6-(zKYN%TWQ^u@3r}6M`{P{$=APyYK)DJ?He`gZlaRNBn*oOKO?dS~; zlJqRw0vwtQC+D>6cckq3(8$t7Or)}O5X>sfroXSBg&DJEPMGRGjSZFa3EJ2li>nX2 zd;!MWbEh!qKZaqQf#&&>#k63@u6J>u?xdaiiOk(WzsZ=G0A+pZ^Pfo_G-jw+vCT-d z{~bJqw$3naUboQlyPb&jbi?6x+m)+LCiEpi-I^!Iid%~H%ITaw%cDmf- z(paHNYPNnDo$OICSB*7X&|SR0m9PrjP6s;rqKr+lUFT3GPzgjK!`a^LP|(vI&OKOj z;3cX;=eym4cPPx^@E2YWPsh(G`ILK2%Y27dLAm!)3NoQXMr&6D|M{pDj?41kEVvvB z=^jq*9Zf4f7{}Z196~BBvUW+FOtQSiDuR847QCPG2JZ!(c`t^B#8L0PG_NN(>5TDg zU1dGTGLO7(2F0 zlDy^9?3N$~A(J9fNKXr2C8(#e=0mZ;$i_r0wq>$Ebxa~W{FpOeoyFgWl-bjS2Ja8(YA%$X@?_8zN`VFLk6ZD58%(9h9GSxs3X$_hI7BqT=4bmX~;q~ zv*ES83hInpL@XTy@-XF#yx*Vg)MtRm9%npS$@}Lhy;BIJjq((MtfYFLp}D1|GM8&& z^nSoJtreW`A#o@qYR@cy5Wh_Sn`3^DV=t%EJU*1PUbJkxg|@wwrT6oU=F8}3H}cu_ zlqEyS>x8O%%14wvH0<3p>3VURFy)8!7ii*~xRwj5?T?$N>Z=I3a;VAVdlh5)t9Zg(LrfQzVeMkRT8sp(G06MdT0>Cu1u? zD2_=yW6#*LFTGarx=j!U526v`M5{|(-S74L>b?5j*Uf|w_%9CjKhVDp^!|yH+Y>U& zP;}MQpLe>wX#}_7)9_gIx%WvbmuqLna^Rki7v4CvYdqy|EJlM6@41%!D$Ub>u(crA z5ytS2tSAiz);CCBAi-F;a7jq-3Wzh{yJntXjJGE=s+xtD;=Wi>Ay-> zk|gvR&Et)7&j!eb&*x^g38H>G?NT;G_#9c41XzDS?_Tkee zv!Il8$`T7h`<#cApt2$`#SP9UK*q@4scNN~IQrZqvXABg+uOBfP!!meGL{$b zD6U|K`vLXcqw2l2M;zN_(*NM?8A9@zE4fdK)x8vWac9S#Zp5HnrW{19;ZGMsMB85 z*H*x-O$etAyJMkUx8S)xJj%w1$EunAx$h$bQS9r+aOOOxY#y6=2*=MnjokPH#Im4` zG$gYry!_TN%sh37^pImPpZ}aC21}8ZVPD*E;@RZ+CoJ>ykymD9Xyj`7ziCjwi;2k` zCJv5byi`QPs(oS3UIHGUjs}!1-%aLf>nGGsQ*tX!s3S=T&n7Y|VW$e;1#=lVm2kMz zMY^{BrnrYM$!JBR_f}=pZ#Jf_w#6E=H;CS9pn&l0HVyg=3ChmY(YSIG)>aFiu21=z zKJ-ueD2S{|x`yWb5?TvOU_&WL0|Sr@15z@L?v2~1U$_dUg@p;URf(?Nv6v}WHsU1L z2tIn1k1xYn+eG~E!?Zl2_oV_Fmq`(bbxa9WL#NHtq5~z8HZ@32D0nP6U z;o7E`%UaqrSA2XpvCG3#hyR3M%52C*F7jiHE+ls?>l2kpPhbLC_0PTVgv+ zSML_WkFWanA91IwX9~ zj$J^zfOY}x0@?-ie|0F84En_nPj30l#E;D&DKbLwSc`3#PaCVbqfBD8-q(OZ;*x}m zL((JzBwZYCzoaOxW7%kKe;h4eIS$)2*Png7v-80NDtj=*xa!hzj@VNj0s03A|CM7}$F@09;@zzTJ$dH8|WL6ngAvBc6Go zgNh)538@4~fvU>H>&TmBsc4eTgon)NxZpM?5H?KH@j%%GsQ>a!be$gpVTWOuZK0Z) zU;xFNn;*MzwVzyyq2sIjv9GlOC^)|Fc>+&q*zRppnQ%7&UQ7bw#93()PK2|#+%t;B zR2EFrk3Dpx?RVly4?HPkQu9YeH5YCqx%9q*;VUmdxSK%TKJNW{iq?Wn&oE3l#Ihyv zOqpSED%qYI8*dII%Vn3Ak4QAbHi4K=t%^vxKVIp%rGxZRj^fNF8YCf?$xs}Hf&rAC zOErkzN6h9x|2(*vqbJ=5ac4AEGBKD)k+E&BucA!1FOyn$I1oTq!HhFfLepf73@_vN zZ(e~(0q#X}1=evWx1T$G6+Qn-de0Q`Wm|SAHJRKO2q5YxqpYYr(Jx%NIDtgpI3NQ2 zUXPH1;lUYPI6q7-%ss0MKop}=GBHpc2p}Sn&KfNd?yu=GdfrXIrrL5(t|tal9qWFl zABy59gN?5kBJt`%Ab@05UB)J!B?{`~*gP)2KLCX9!Aewkd%K4)l$iDk@+LkfCe7Uc z#Ya+s0E$-cNxRP08Y4h`@V9H29-Z5s>ro9_m|VnrXRp!($t5kl3t}Sax-T?M1_CHv zzjw-Yosy1ILOy5Uty5hdwLyuJTW^+#?l?I6n{H&%IdV6tv?WI<7M)ZzZ7dK#p{m#? ztW4n%ZZkPLkF%#Pz!e;?Ts(=mA#XkR+lv?;n1No#nl8CqRbB0{tZBhmsH(Q6Pu9x2 zl^~>jAB`f>J4jZN{2H?v3Y&5kT{)?jPIcw9B@Pl3TQ8ZLH?teQH9~sJ|S6ad} zlbtWN{sCB^;pyCZ$;<_RGel#n+#EB#yRkf7x##@>Y>=s-6`4^3S#p z1^+%htl_C|w4-rs0`GT^Am8$(U+W4>SWAn+t;-!~Arh>rsGFNe#piEg4^e+kESd4G z3*Os0L}H<_I$8PY7+|J`9qFxW8~xOaF9cwr%iY4Qj@0+}zRt<_^9!qRGE^Yrq|ut2 z6zfgdPS5*}uU~UYB8Ax{xI}cd?CMYGn;~%aYG4bEb|?&KY~&Ta?d}OscAf~jWzgRms3R?IyEwkes0OoC|G^51$!0m^=MX7^AlcRHzvI1S(up z1XJ`;vZAw^$Ly(hVa^g2(mtcRLPM1b_RcB;q~Ex%O4${im#}F@ErUaaa^|&jSn2Ag z;AWn+SV$ua>VES_mJwE*e)Z4D4<*UfwDQ@Pa}^aV)>mX!w_(46)SOoCg<`fj70tOb z=aKG7Aok>8gbwWW5`jsXESnfdUSvcXD}`>mUt vcV}`W;vX)0N&Zexe47a2efTRf)S0_oy00000NkvXXu0mjfy+cvf literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_14.png b/gui/src/main/resources/images/avatars/avatar_14.png new file mode 100644 index 0000000000000000000000000000000000000000..4d971e0340a5cc228d6644486c35af83fa7d5168 GIT binary patch literal 1311 zcmV+)1>pLLP)@%qa&qrI=bp3n-fOSDnGgbxV{kmCAwOtwdV2c) z1;)rE32%4aKP{Cc}NI8e6apsXjC#C2A0#a4@66f|RHwJeL%?Ic@N_b&Rn`ba>S9KVAoLzzu>X=i%&xWt1n4FV|2;jScD6O*J*nCrX**L`@Ps@S3u z!GdwP*ZSU(YihxQA#k4#DNq3@atTZn3b1FAT_W1_JPSuo!Eyc-h&@QK1^dqftJFf_ zER&$JB5jP;C6XT3=tC+0;Rx8AedRFhyn9IV96BPP=#lH#qh|8xkk6WEgO#Uc>&_m5 zNW_<-!{vUYmG-z?6{9V?3>2#M2Gn=*FyV0IvYFe}=`+TPsl}j2TBpXRvcn^{l7LF#BJgrKx-%6C=gtkII#PEXx&|Kbm8NGPVfMi_ zEJ6xHZ=kjIcNDZ% z??B`QRAEqYRj|0dgFo}!({<^w{=|tN54fj#&hy5F3$W$29f^tsPi57LI)5^i&x;f* zoim)gcOdFOFda#$^x3Zjwb{2Knz<&rtRdLa@-DXQNTM=Wg+NW{MK^C;%@k&CN{;;f z__VW62sZLi>8&!OZfJD&@W5EMyD@5S=CFg5a#VpB8e&ld0yNZPWe{nEa=ok_;s=xnMGZk$kWRbU|HE~3MCKa( zVs^ir9emS!o3OLZeoex*_Az|>QxD<;PhwST1hKG=N}mjybd*e+xc1vTdN2Qij?f5R zXf9j?f!gs|&p@29Pf5tfEr-2N!ri(m=G3fSn5K%5Mp2l>Dx}J+^t2r&@|KjK*DtAq zeN8-Ny@#$m5;S*G1!yvCww|tCOP4I8qTWEJ7fc7glJ6I2|2X|u^uqYB4*Q1y0{~)A V1Z1Y|0rUU>002ovPDHLkV1j|He)|9b literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_14@2x.png b/gui/src/main/resources/images/avatars/avatar_14@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f000def1cc2cf51dcb4abb91b962356350aa52 GIT binary patch literal 2900 zcmV-a3#;^rP)F8)@v`(!~t)pXSbZU#!(N?F^Rvpn&A643E>mU!w z@Du}zKrjSE0}JH+*lc$9zVGe1cauO~n1yU~9PiATz4z|D|NnpgIp;f%U1r-hzD@^+ zui5bppl<+;^C67(!S3$vlm};wAs&w}wJht}P$;y~@At3&$^cST_3Vpx_07R15U?zO z*pmQdaUAyqF=>@7%S(Jd-#)t6{FMOI+0}K{?@iMLr)hvr;`6~4LpwQO)g{Hht^?**rhucNS?wQ51;b21qSUFfOQomYoBR=W2a& zqLx>bN-iVwXh(C?{;ply!R^`#zPXV=JJWx094vi#?briiXW32G`#s}G1OhHe5L%j+ ziw8cuM{hh)XeQ!NyuN%jXTo3XoZRQUUhftriU2=4Kxr|#(V-^N6hukfQT;pVaNRGM zoN%>ZlW#Fu&h&M(ue8118z70#llmT}H{>tPhrT!faL!%_g(G#Z@y9+}VM`v+;s<~4 zI2#Aq{JG7zS)`qt=}zRU7l#~kLbYU2h_Ka z!Qw2OkftMI2Q`AoX8pyXEWwy1<4anmKNE;>&IT{ffPcGpa zK3irvnxVjI+sP~;DM-??!+wJm*Y`})Y?pG9XCcc9)r{zSW3C}y9C}amKx%KjPVoD| zGPA+?eIxbQm+U@nVJ9yk|a*Zk@Cim6ojFVl5QJ~SW~mmQ$GnBl^2faJp@Kg zg0juiPckRfp+GD8X)M|tF_8QeoNF@4;FLy)!BgiQ5=U!tO`q-_!f?*JT+^l}Ci%M` zr6jJ`+_*E$jtzwG&gFbsr|&t>FbhZ8a_(=nXZ}fG=8(Cou30(u8hZZm2Zr3!4I3Ah zho;|g%R&lNqoCZ8+{+_k?JKJ*w^Sd(nb}g`@t@=N*aN!Z&U=Ss->PP?x-D-_GZmFc zP&zkuqH&z}gkT?&hYjJ z+;k_WtxE0yX_0dgML~FG#RcJY>uO+Wdg?KVwBx+DZv7riEiDQ|;yWzMqzc#?AZY+l?CzX_U)NyF-)3*#$q*C!2PhjiD_aEwtCRSawWG?Qy=esTtBcZyTAdlbc zRH+nHd1!Qx<2eWpXnJ?`3-4mxh7S?S^xqT+_|}fJmS;AG#~#oRXM09$p7{K}0t?*7 zvaIL-;HE2(laqlBoAyFgH7uB4jvKyrDK^se)*YWfk_0UI_H0s|jaSxG!z1zgdDE&g zO-mVR?w9v=k3FEDUKTogehKckw#9yJ7>3){a-t~tJSoRQVL>jMTDtlhJkFd%&#rKs zeIG62`Lm7v(yp#FRIIUB@4|U7ULv;Tdr7U2+3aUchVP4_P&S~#pzzhw8lmTho$3%3 zcCXs(bk=R^I&7++Y@18wf=-f~4pLZt&nkC=GjR%ywVSZ_qhnAN-JMhrBub)%Rx0uy zqi0?p${oWuDS69&oHr1)Xbh9+o0mM8SX>UymLXU%c(MzSKl6(8B&P@J!!Dp~eIGoH zYY^_4iq9fNI9|IGO-J{kyX{o3PkCM-JG%1=2ehmgp{RE`%JFCCA-`k>E?Tq#1tkR# zy7!=1I0!X!Arhf$Fsoug8cJ|E<^oc68MdNfVqr1#g83+!y9kyNLC3KJ*z(#R(b?Sk zOT{oMXt%4xVa!aUGTqd)_cMaQ2lEKToaMJ+a(M-GTZ2EC3o90eG`xS)uNqG^Y^~jQm>AIOf>YGC$EM$yIw1Ru zwBKT04;R0BvfsXWQii_B!|Mf%*~}(@oIe}4|LhK2z2Z8wwsjyse*z{>o8oqcBrA4z z)+GCGjVvpsc7!8}_&yc7uM?#b)Tj$^Q@7?mB^Ky(?PCSAeGuTj7It)s_21QAJ4ySFm-An0^#8YmXxaf`d>elS6 zkN=Cn=BE`k@f3?l6CQ}LlK;4q+l!ZW7B0PKs5*3ajHW{mKeL9=gfC( z2$Lw?P7feSK0GrRS^qaf?a98pOhL93$BX~{)Xm8tp68DkUI8u5F}$(40mUH;i^}5A zOmP9PHNNSM?pl@>K%Cw-ml-`}CK(-R2tTQcV$Y!#tXgvbaoM2yLUaqZln$qV;1|)< z+=C}q??YQe!L17-2>FREY%*`HaZWJ$-h#A{g236Crj^96P}yBMS;oCrM)232HtNGY zxOM3?Tvm~fKxVIrIGQsDmD6q?nzr8vD zWyL^SRK;;JuiAzP_SAQxvpaz~g&J<08%1fZ+7G5Lx263Eqy-RV2kPLw&zZa^q~rd@ z9XQ(V!3PZq%K0ML@{!=SeEn2n`w0-|#4I}rC_!nH(^bt07??L%$0Z9D%*a#RVs;Ri zzV)R?Lp;ZxqsY)gwazNKEbPzC$ow1wDxaWYX14~?{%fIdyDp;FT-cXUT6S{L$sJFL_3G*QH^|*yCF^YXGLq9UE%!-M!ygFTrF4BA$(1CtoDydg z?>jkLJsIo{+Jkp!x3<%G37qFK7XMRl60~X}jcQsH1tT_`;zY`|0uiw4cWL?g?xD0_hiLSn)LA&PHCUN9k1&j?d`q2_a497PUe=yUNzytFZuPJdwRa}`~IEpT*f)a-4FqH zN&bICj^z`*&5+PEQPiEX?7*(>?FdJL82fJgp~;`GcKteesV5YT^_zyigsdnL|4THv zX~JYU8gFmh*|x12(S~|>e5LsfBaNG2WHOa~@AkhjH9p>2TIQRv*5{?Rws?+I-7Fwy zAf@DDPdxW{*MZmeqv_Emcw9~(lLZtNm`_7=yHRsbMQ~!|>rOBRUC-rV%Oh3O7rf!* z9gjsG+#n-Ib7^JiLPpRHlzQB_GCJJAtXwXTv~6uKPE@t7ypS6TgCse9Rjd7gwz8Gh zd}LECD$0igiKz()0<)i^{Rf}UKShyYdU`JGcFPv)%G!nrS$3g!Z%0rTH75ttY!g+7 zgNxqPthwxT3s&hZWR%8~i+pu0kc$F`&nw(8R8!0UXZOGgM)D4rnK_~9>V!e8$70BcqP@j=fJr88{>d zp6TsGTSpv;dDoliZ0MXvQoxxAE;=nbJ z0j!6f2gt(v1XaSMdj@U$S`cjAjrGw0t{Y!$T=(szmnDVzp+lUewS9!6gx_uD$lTXl zMR9w@x-sss<~Wp90&a#yh!tMsZl~d$(olAd6A3G{qk>$ZVJAC&exkTXobM*Z7nYDq z46Zas^$&FL`D~%l5rH+oOg0h@5}q$gM5=4~3c2Gn!{y=^GU*1Gono*S{>NL}YxA3d zpQNA9{w2u_dGnUtkCOqaknNd*V9f3WFqk9+>Htna32D>>B?uZC+7!{ER&8mUE-6VWMQtOc{NM*sC0a$KX$mq5 zThb)7Pza_J7Xr31slj-~Gh@#_Z@E414P^;qGLD~dgt*r6Y|r<;@1AqM^PM|poO9es zL%mJ99IaBf0ww<`#)tlw@_?DhJbZ}|E$Fut0n%d{H^V}_F0bwNpypUsj;E;=P_H!<> zvf3xUg6f(ol$N&Br037#$>r>&7T=3gD*Nr?pV@NkdrqC<#}b+$#Z5yj>U!- z(3*9NKNEuFwV2}G`))%)jCMFB)i$*99+9zdX*DJkr_D`s242&K;PIpY6_w`QOpgMy zpFiJY_51utaoC3jh`dx;Re_kVEi0net^_G-HBD^acQj*VNIu1NJZQ66>eeF_`9 z#n5vKF`z;5Bu1G|9;C#nl3oW$Lw7LkJtdmGJl}aCrt;emavkdAgdLLZ7az}Q7NULc z*c{Q-hD0I3848AR;LW`_dF(Vox~?NY7P}RNCHYwV_#)&N=f`DIoDblSrEQg&GuA0P z>C(jB7-wcb)Y8;+t8NIXQeaX}nx~$LVrsuXh*vkgjx#5l^}-89Q4HjwBvQfDkdf`e zkAA%Y#T7-w{ZaUW*268H%m9`!A$*HpA+_65e_c zSgi4o(~=jfNs$8o_H3vGNYs>gXy`%B;vFYb$*dACrDWibmu-j&qSV@SvBBYVOp;|8 z{UnX_ToTAKvPPlLj1blz}LS^NeMcwU``~iOmR;oWb!|6BHdhQ~o&6(JHSjVITxKxTd#S}yNL5WNDo3QqTtE~l+O zTA*3QNG!L3-p;-uc8M=ysSJ%v($Q5a!74bA zX>nt8N+Il`3%LV$tfhoGMW5#DmjF$+p{Yp5>=CK^dBaCY` z$$n9x->h!T0KwxHqivzOqS=Iam?b}cO4C%Ce9(vj_5~8u=meMvMS=4ilRMTM3E;L5 z%3qTUD|3w`9*x6gDj?4IhytRKW-cI(oRN(`(JTI+Xx(Ze%D09?Z6Bb?@1x1r(({wU3}i3;uA%jwrstmyXZs-2LfdGexnxgV z5s`f+0l7qlcq@hX{gkvz>Gk`!Q*G;CqP}ey=OyH|C7iKE^!gsMf}}SGXo`n1-y2uj ztY@VAA>-JNYzyt|7X2GNVx&@v8T}s<^wY^QvRtwh{VZJf0*oUseu^GXlbt8V37HwM b{}W&U%Tnc!I5RQN00000NkvXXu0mjflU>Og literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_1@2x.png b/gui/src/main/resources/images/avatars/avatar_1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..43e3b59d42b9f4f5dc581fa21f40ef90123c1dee GIT binary patch literal 2584 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 KMNUMnLSTXmi}H` z+cI5Y~=dfZJ<6*3N zAL9`$KEH=xOl?s1^V`?nsS1!Dqi`(H9)NlPjP;iIy^Bb$!ng~3KZ)^8h~aUJ$K%ux zk7=Llp^?J?@*L*9Rjf~eeu-y3#WOoEDIggbQh5SXH-P?*rEBUqzXQ9xi}8+221vlp z%Msjf5x~5TWo;37FtNv;ff{3F;qML0h)pNCxIFJ^d;b3O;epl$`p&{bnrxuwKnq z&O@cOy#l&jUhN?Yh+*iocGF7Qymc*g^mc?l6g+BaZ>HnJW5g5steSo_uYi2gF1A7@ zS8G++wF`!oX8P9j(%>x{sB76`YzX@Sz%Uz`)VbtpI(GCV8DPbQPr1JKrHqgsD+1z7 zlmhgfkxlr59H&5wyBE>cT?5p&?%L4t@`a1mc6PU`WJjLo(~|DCXBgLBtR{b&W&bs_{a()jSC=w&W%RP_N_9?B; zFQ9VyNyvv&nT)_ya{{)vH)3)6Z_P+P<`uF|)GD{Gu&t7%X&Pc_U$2T9e}Tn32;|-M zHv;GdEw#YrX8Q8nSXBkkbKPQOev~kd^EDWHHUb#jbj2&dlpAF!z8kBPKTk+DsFnrH zP2iBAFPk&yG_opQc4tftD`t zsCyw%Lc{e!@YzT)fMmHJvjtUvc`g8?vzFNG=t$$C!{ow`W?`ov;o1>u3v&O`GK586UYq*TWF20M$~f))o{buEWxU`dyU-=_@-y$EK31 zWFQw6f-`Y~oU_Ld6tZK(QspJ4%>q>(4}5|=dr~FQe+bth>3KoGo-oex5nmlcbp$(u@Y+K_!4PO$aymj_YRV ze=KxAWm*Q45o+vt=$tahR~VVAJT0-@$Q@5hf$BT=4Sx`I?xRLLgNZGq01riaFu^K0KS9ApOnhyup_FuPya zT;p>qfSj+<;nNH0;F)GzKV)&d*~Wx8g!AsNHB#tRg4xc6P%mg2F8s{^Bd78vy)n{G z?Ma6gTQ;>NU24=lvXFGu?<#70DslRZa!8)zj!vVtNhfkin#A7;E=uv8g799#>FUhA zu>k^*dk}PgQwmHmC?(%hiphNPd`MS0MYVBNH4>Cg0Oidz`e)ae73(zlJFHgkklu=^ zw=Gs+=%^+y88Zw9635*31hqFc()u5?Q{JEL#D2SmSC=p~_*7qcTNC^GgCH=PTG{zqx1@7W1LaWs+Wy|FKAgyhITA#CofvB zARVWM67_PSOl~~qkc%>iM=R8laRM^x1_YD)dfK6}tWB1oQ3M@X@tK?quGUBE>OH{B zmNutp%hJ}UCU-PWANnJ*$VSl1L^Zq{oQZUf=hLL^2FbOK&q;{k9>Lf{v6eo_1LNT6 zKFQct{P|HWKBUa;^V8?xLp32%uOR+_^KQVouht^ST4U)!z#CLmHZ-Ps2l;A18P&IU zN3iej1!w&@=hyXIC+fLAsGJWlY(FZP>oDI1Kl=%^xEk}T>e%ZTssI0B>^;DB90J4~B^32M*T>t<807*qoM6N<$f~zYtbpQYW literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_3.png b/gui/src/main/resources/images/avatars/avatar_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7049db346f063cdbe33e3a2bfaa3c2cfc9bfb09b GIT binary patch literal 1026 zcmV+d1pWJoP)3NRA>=Va?wK(4+;_LMWIloXcMS3 zu}UmyOk&$KyWQ;e?fd`c=kL8nTf_$Y4m~*V+c!J&oA>Sa%{RYUK}5I{P2vu<{~wTX ztBIAVPe6u+;^I$`p*z^SeD;8J>}_$rxQaNcsL)S-=I78jBlPt(;^Udy2NI-_8ilCZ zb7}sF^qdzVrBH#ZQzfKG(w^bZ*Es2i%+lG#t#AruD7*2F)mVCoSqS*dA`B#=@UOIo zN#d9=^#DgUpinB1@9fC0E=-V_1A0pkPd*K?{~$0h2skzn_(^Jww0ePJnQf1Xjb$j$ zt|_}!#)EqyCtl&f5)#S8@Cayb7C1KxS~w4acuWvJ%EU-2N&}jsRtGA5fbRjWn*xfb znBB|!fkH3m#1<)$jZtY=0n#N?Oc#ZyvQ#(r1&Cvy+hsY65L>n)9^KxdNB3=dR&H(Y z+!&MPOk6TdR*_ZPz%Ok372;z*=rk9tC-9 z0L3DhCfu_#@V@=pQ-(Pwct{u-UAJZOU0y9gwNX#pRb7#uJLa{PVDwa=3T$s>!Yq|r zdgpyB*OqNQ+yVNs013|l1(BI=Ts+V}@%%&Pwko37<#K1S3?}mT??L{}w+Dkz9=`g) z@wbS=PG1)3NE!WnWRFS-9xZ?VC4HDt-?kE$M$=rj_7p+-Z2SX&Uhb*gTgRg z^_Q-I+IC`N=+H?kIwh4o^3ySY@iHikpA%BNp9v^Aio#UV|D%b{sdHQf^1Lq!vAYf( zbRl{Rh#GCQznf(vsKki_nase_Sd0c?8fYH>5fp2bpBRJD*Uv=w##p$5#uq0MuC*a^ zW};*v6Ht8jJ%(Dn$i`!CTBA923iixA3J(k;Y9trG&^^ z2rjqauQaY-70gsx=6_RX(@CfEA#X~HdwdsQGzBzO8voL`Y~a&uKtl3jIt&u;@$+$J wG0q#Yk7ueI=Dx&nhI=PB{xdk60sSe!03&X5UZN}Oi2wiq07*qoM6N<$g8N0~5C8xG literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_3@2x.png b/gui/src/main/resources/images/avatars/avatar_3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a4e251180a4997c8630712a4aea53263b0553e GIT binary patch literal 2238 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 JPDHLkV1k!^bV&dJ literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_5.png b/gui/src/main/resources/images/avatars/avatar_5.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0d0e18a5d99c88caec1b42a54d75a374a21d41 GIT binary patch literal 1068 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 FV1lU2oJjxx literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_6.png b/gui/src/main/resources/images/avatars/avatar_6.png new file mode 100644 index 0000000000000000000000000000000000000000..b5afc8f7840d86f0373963e3ef2d619da328767d GIT binary patch literal 1203 zcmV;k1WfyhP)CdB<#|&YedTb zKb$-D>gFhqX}Xns(WzCB3*kNn!PE4$NU~p&74@6e?&E)P;cl4nO#i^`iMC3{b-lB< za@iAR)Pxm_qA-_-s;gj(Ju0~KO0ATCU5%x_^*j;2B1vov=B{_rN+nOU-?I-sV#x%4 z|M@)Tre^(8A%sx#*Djw)KXCLsm^6uP%%yBrNnRbh+)YN4iGgQdejY}13~)#u%DT6| z54q`CR2G*giec)?MC(Fk>S--%g(tF|HLabxbEK=I?SPT6fJ%Ki69I)Rw6|+NanOJy z)Jz>0ejU13(OcSd z8@{+4VeIK#LIcTFR;0MAlrfD846bfo? zE(2yA0yA2CKf;ky5R!$-$?Lv^F-1|{r1vmkfNgP>HW6{oA10h5l9&8z-Y^W(UB$%2 zb?Q1g5!@9RfotukR?C=~o<=+#hb#xpxW#dtv$k!&yCV@T{+#Q&Ju6xH?^G&dA4fMiNsHW&Jcbh4Em6c5UxtUYGCO-Ay*muCuY%Myhh7lkv{Z+_~R9-}&x2cUCB+ z=#$h8`h>OHfNlf24QOf2Z04eUKm787-wPo~DM{ozlw7ls3_BucM@Q~Zfp5mT*M4bs z^z=>@1Yun15~(b186idgBB2h5AowVN(r*0Bo9{3FAdl{!d8ClelkXJk(_CB}49W^0}RG7lYHD zv%?{BU7rl2?qDOh=n1TayGyyrui(BvT?hLA2q=ZI{~pKf0$~~8pIdS$8jH}-L-*4= zufIjU&!FmutdM5v?7RDaSD2gG9ZK~aP`I`+F*^3WCO93}ct? zt0$x>Y192%sc&!{#oH4UhIa&eq)?!ZLz^}A{(bPDl$*@y_^I_40}{d@cXoP6xXvSq zp8gjD-&;OFfoV1VE>KU~VVfR&WG7`dtRwO;5I^8A%13UFL;agJQ17}`bpGRWG=5=> z^0RqOLl5x<1*B4;M043J6(+|%Yem`t$X&)5YV7?%1pEU7Tly(8*iV!%H0}d*WGW8a za~BP4yR!@!{i;A|!7Je2Kks{m@>Am*g%yH61j`3VHAE!t1znOoeZBBT6BJ<(C8x@> zYwFE%2b!ibU3B*2^Q(m^6N2Q-vSkW9hxH7TdzWQfl*WR&>(?4{zz)eBTMrah8X2cMWZ;m+w&EmYzTN(TQ()zDQEIhiLBnjR6PsqA0|| znZlrx05%JoDWAVKGeqHDvf^p#TC+MEPp3zVGnc{88{^2bdzKDp!?wPZ6 z6sIpxqAOD#=yk!YDqg|S10ZRGUPU4|%d2V4WuTznfz)n}?ikFpiJ4qVqUBi+>A}pyZB{&jqYqiPI?&;oI&oH_NW>sJ z-9h>6)L2r?E@P%3j7D<)zL5Sb{)m&4Ef2ijBBrS95vErDEY;7dl?JVxf>OeK$A`zn zBGR9x012ah#~9XsJ-_s7;5&~QW{9Y6&L?U_O;F3j zEn%;)IY4%Ff%03gBPTJQ-@=|*f`k5!|6exj@Cs~_a11pv!AC*9FrW36ae9&C@X*H| zl7`QHEodzPWX>~Lxl>#-2*+id`<_~ycYcn0-_(;+YZ7L`%!U1&8Hs6e|jJ!83CKv{?# zSGfUdClh&NrmY2lj-EoAW1BQL=V(wSW-bzz)Y+NV;6gHw?`_m^0lA*sla3eHBqPp~ z3oi6}>q{K=mH1lVqbdp_s4N_s%3GK`lg6%0)97S?$qG?8Vp6f-Q6dqd%=#7pvTzkD zY<*-JbIw>OL0|)eCbEjIOcbfVKSQxtjAn{CvI^ce;#MJJNON~t$!|A$MS0N70G>c*;H@fnOSZB2 z9h2Z)4pJGzv`TJrXwuFd6kcJHd^e9IJC3Zz1_)Q1v}0t15;UuN!n1zLw1t-t!kk2$ z6dP@It=Qf+2W+WSvQC^hG2puHE8&nmETftCgGk>OId?-ULvH>GxpU(H?voYmL`4xn zc!gGbcHf)PNcgyAneQDra^%73>1o?S;EN^fpf1`&Jd+a>6Er(J`%E^QeQIuQE)|VN z+ji{OA(R_*2a$dIK1HmZdv8CaYJmkmro<&i5>ZBiOTwk7HG=@B}5^yo{tf3jFC z{-M3S{ks4atSBI~osQ#t$M^kR@Q^K0exE;op7Qy!;stgW868{5^d~EswyG3=$k99ANcd(tM3o+FqZ4;%jc1ik!n3lzR^ye(N;6b@Q%QGWoC4m&LA#cyr@BOKP=Y_ zs^&%Zr{S#wu&1ieYRxtlRzOhe3-HPd^D}CGcy%D`rP0w*tnfMgwn1S4uDR;Ey#uCN zAfg&D-^+BXH!(H+M?vFXVB;(hVNnEV`F3bJ_f_FSMO&A3>FHy7uSEaC4dkoYtd=fLhBF@C=!Y2 z&phjX<&}tnAZRZ^**r51aPg~jW8hU0X=`h{X~F{0Sltpp=%|Zbf3xc#x5NU$vpzL7 zr3cMka*a+MPb>!2rJn&aaP|)0r-kGuX#plR))GK)cMK0RZ{8#s%GcT zoxAGQTljfSs8zC^xD|Pi$K!-FhK7fS%e$S3FALcwgJrQmnxy3&vDp;WYMR|DKsGI+ z9XfP~PM$njd6QD6)cE)~?ccv&Q?B0Y$rYg-X!27Wp4GK~GxZaw#mdEWJ9X-mJ|`=0 zCKzBf-k5r~;GJQNV_&O0bR3=W!p14dp=QLPv$InVm;;}^!mUs!Xt7|=q*AG70p;-A zy*O@%J>TkFj?xAqF}MKJx?b1V`K!0>AP9_;%t&bYtHEM2McfnQVqrD8pp!JPoX zFK_OH@egwBY6ijC!13e9_4>pa!8|a`$78TJ(8p`I=YvY$D_h{rYoisfy`bN|5UsDw z@ZA{vAYx@5=+=qY;g?4jVZ0&vVFk#4V3%pBzlo`|{|PVvPprYAec^%a00000NkvXX Hu0mjfE^j>< literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_7.png b/gui/src/main/resources/images/avatars/avatar_7.png new file mode 100644 index 0000000000000000000000000000000000000000..42c15441c084d257d45c2602c1c8acb5e0b3d238 GIT binary patch literal 1132 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 literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_8.png b/gui/src/main/resources/images/avatars/avatar_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8d49bcb0a8e9c0de6818910819d1cf4627a62bf6 GIT binary patch literal 1059 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 literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_9.png b/gui/src/main/resources/images/avatars/avatar_9.png new file mode 100644 index 0000000000000000000000000000000000000000..398f4ffb1a3181ce99a0f2ebf256a2ebc00a8843 GIT binary patch literal 1069 zcmV+|1k(G7P){oT!bKJ)F0u)@5ERrO;6@Np$ijsY5!@*5W+4hXN>D+fW6+q4 zuNX4XW)#Qn>7nP*>DTRBb*ud9P6#8$f!m8LEcp6ytLmOQ=R4n5%ou~)F*t71`2PX9 z|1~l9+G&6>IIR|VyLH%fJ5TVQw--SmVDwBPJ8;oaI?1{Df-^SHz`}jGSKo*R1g&Y- z1?zU7W3}oTX4w<42{hbHYSN9zprwZZtV(l_QC#Rtx}Y!!12)cU)tAF{oD&fP?JHy- zx));C0CcAZqs(?~*ee08wh>u6;|lQR^;1mxStCTq1XK#e#}9@;y6J&$NuYPFieR;U zkh^S*wq1?PC^q*CoTb`*#&JRbD`ny25o8}d0C*BS<|1=q5~+z1Kn4jIHbN0yI^Jpu zrex0MMfW7q58jQ;p>d$?-2?{7=wwr&X*SLGWMvU_Bm51PMcPD-F3GZ%|90Hp+2IMAdIL$ZnqnT8XbFH zdO=0i*XZGf7bW9p{8UEu*X2)ne&9o%NP;Kg(SiI-9R3ytS;${$j_yC!D%WRh(S{Ba zE_#2}y7TYNzKMw=r&L1vQuLtWEPBCKcU(l<{|>{cW7xj)f$zC4zo;73&mEDbZlIt8 ze3qOTe0HVuHO}YWp)(YbOCColDkIG$BsxguV%Rp8*_*nnbV79+klj_-!b}cs8!bLu zJl;#sq-CrPDHN3GqmGzy$W43)GwrvT#t*_tKNH_Ngjl)+E~rSgKbCj*ygy!gYF4n+ zNn60o^dX%we#uu$pJ=nX&syE)hHU|ASjlOwwwCpo3G&eP;uR*XoD*1WS%%b>n* z@%rT(EhiunZF>az=|QV5?M`B;b%nap611tmu;NWU8NCJR+K_eg!rBb}Tsa5C3&hBU zq8ypPHq|Tw?c;LgT>=SxTJY7vaAfI7s9b0YVsn1}H15|Ph6|6-U6=tJfo`vY3%{R1 zr7;V!US5K3+B+fx(Fiv=oN7rm@MZZW{8pdFQ2r=d-XhA&XVLC0-vD9%*b|WvUZ)RB z=n&^DWi_s>T_Pzjg|D@(PdGOL?1eW)G2IU%+GIYa-0vaB9i{&VT!)R)x2;L*3hLPS nk>>3j00000NkvXXu0mjf^f>tW literal 0 HcmV?d00001 diff --git a/gui/src/main/resources/images/avatars/avatar_9@2x.png b/gui/src/main/resources/images/avatars/avatar_9@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0720cb96469d8db5cf13b57f8595426f5e33e6 GIT binary patch literal 2505 zcmV;)2{!hLP)Jt4gV=N>!>hN>fx7 zH9|^oOGFxyA_74`6(CSBFB^Nkws*bW$9+z}xp(cg@dF#kt%Mls)7i+5-5b?ir&Z5i^{{_jTzW6#j-$4W$h6SmjkuOCPYu-zQuuk?2N{}Q1|gOOKD#honO z`y29ljl2)+8rZG}HCfXhZE0*bPhSO7xsREI%66J}P^7*}w}au=5a(4>$jOfVC4S}7 zEAYG;aAjgt#shL(=#5E;5p(iuf^G9W{)byp({p|R9~`P$e}5yta`6QM$EO404^Q|J zso!|7e@)=0O587c5KnmA#i)e>NF*8pOEp2sWS(Ke!)<<~W&q=sOe8n0L3C{!;#*dM zMKlP@8GC(nxE_1Tafw4J778GzJ`q@LU7Qt1o|-8#GR=hRBDHNjl8-z99#ghL9vScI$hHE;_tt1En^K_~w;x2l6N!I1N#@WmBT^5_gA63PMrIG%&OLX)#UBNXl;7 z@zB&@ss#fO2nkG0)%vvVFNm=Qh0<7=iDYhNgp_>)NACTaDin?)OG&dr#iG%Y>UAi0tcTY$ zzn{6zL_pME>Nc(dk4J-)x-Jsu5W9N` zU^%l44M|uc2rpmq2|+%FVt+E!lrv>hRW*1E7ax!Klq~{RORbiwBT%u~MQ0QcrKto} zsmDw7wEu+4a+<0@r>4i7=6~qbC$Ek!-WQ*VIBhA^u|_$oA*o+Vp&;ds2*HPijFaHu z08*)dRq`f}$J2Im>t5zm(@TjNz+CB;QjN)U3)ucWRw*qOR)mUz1x8LSwXb+ZD2k{? zgjG^-wv_j_)((BxMg!rcqIMXr82BS zNmBO_f_H)pqZSG&M7z$6>$0R87B&A|r295A(~7#;0_{89Anj&TM}~&JcTS+(okntA z<8Dv59&U2X8BlTAM5!foDRi)pB9NcOnaj6@*2*`+^r!sf=Xx@pVP z;{2Iz;oWqAZh+;Yk%~oq(=-Lv{hzT)TOWJeZD`t6IC1{^>85Gu`P%_xFXhguUwM2x zOEvC?UD;lYw=mD;1S~3Bx$};~lLc%$d3VLC9eKO<(Nb^rP_R#8leJDnN9MrsuFJ2! z{XJ!M#{+y(>ppHNP+fA6Lk@CdG;2_tkW$Xj4Cq$9#BIx$Qkk_R3 z+~JtQOt?-NZoWvbDLyDIJ`Y@r!YtQVCqqeISY+rzRY$yv;>a!*iOF{A|Hmx=&&H>m|>;ICeNGLZGe)QkWn}0gp zxBC|arYHQ9)2d96&iu0Qx{exJ=?CQ8RN!6_q@x5xvkydglaCcaP1LgxkF?a@x8$4O zN<>?aP%qwo!>aU#PfnReW{|?^{SFD0T~s~`r+kbLVix)1nP9|z3O5!~{p_NT>xw>(iUM;h0zLnrGohu0(08#_V)G-4f`?}*;TtP%yOkIxVMlP=XtaF`FuDGtIZ4OM{*$Zht2G-}79fo>S9E{m3Rz z1AbJjd>>&p==Uj_^&mn@4bsCO;^N?b|2gAgNsNNpZ~y`Ia$8gdC_QT7P}fT^?JO-a zS|J4HH&PibE7uJvgVac(%6dG8vX#c63%{Z$yI>Qy?ve3M`=n`G0@5a)GcaTdXYsGI zKS7DK8I-y)rc$UY_jCu!jy$-{Yh{*PNY{wKfy$g1rZ TTBmwU00000NkvXXu0mjfpwGAf literal 0 HcmV?d00001