mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-01 19:26:09 -04:00
remove unused protobuf fields
remove TraderSignedWitnessMessage remove tx fee from offer and trade set dispute's disputePayoutTxId when payout observed synchronize access to PersistenceManager.persistNow() fix concurrent modification exception in OfferBookChartView
This commit is contained in:
parent
0372af663a
commit
6f16a5ee92
30 changed files with 63 additions and 294 deletions
|
@ -156,7 +156,6 @@ public class OfferInfo implements Payload {
|
|||
.withVolume(roundedVolume)
|
||||
.withMinVolume(roundedMinVolume)
|
||||
.withMakerFee(HavenoUtils.centinerosToAtomicUnits(offer.getMakerFee().value).longValueExact())
|
||||
.withTxFee(HavenoUtils.centinerosToAtomicUnits(offer.getTxFee().value).longValueExact())
|
||||
.withOfferFeePaymentTxId(offer.getOfferFeePaymentTxId())
|
||||
.withBuyerSecurityDeposit(HavenoUtils.centinerosToAtomicUnits(offer.getBuyerSecurityDeposit().value).longValueExact())
|
||||
.withSellerSecurityDeposit(HavenoUtils.centinerosToAtomicUnits(offer.getSellerSecurityDeposit().value).longValueExact())
|
||||
|
|
|
@ -65,7 +65,6 @@ public class TradeInfo implements Payload {
|
|||
private final String shortId;
|
||||
private final long date;
|
||||
private final String role;
|
||||
private final long txFeeAsLong;
|
||||
private final long takerFeeAsLong;
|
||||
private final String makerDepositTxId;
|
||||
private final String takerDepositTxId;
|
||||
|
@ -100,7 +99,6 @@ public class TradeInfo implements Payload {
|
|||
this.shortId = builder.getShortId();
|
||||
this.date = builder.getDate();
|
||||
this.role = builder.getRole();
|
||||
this.txFeeAsLong = builder.getTxFeeAsLong();
|
||||
this.takerFeeAsLong = builder.getTakerFeeAsLong();
|
||||
this.makerDepositTxId = builder.getMakerDepositTxId();
|
||||
this.takerDepositTxId = builder.getTakerDepositTxId();
|
||||
|
@ -158,7 +156,6 @@ public class TradeInfo implements Payload {
|
|||
.withShortId(trade.getShortId())
|
||||
.withDate(trade.getDate().getTime())
|
||||
.withRole(role == null ? "" : role)
|
||||
.withTxFeeAsLong(trade.getTxFeeAsLong())
|
||||
.withTakerFeeAsLong(trade.getTakerFeeAsLong())
|
||||
.withMakerDepositTxId(trade.getMaker().getDepositTxHash())
|
||||
.withTakerDepositTxId(trade.getTaker().getDepositTxHash())
|
||||
|
@ -202,7 +199,6 @@ public class TradeInfo implements Payload {
|
|||
.setShortId(shortId)
|
||||
.setDate(date)
|
||||
.setRole(role)
|
||||
.setTxFeeAsLong(txFeeAsLong)
|
||||
.setTakerFeeAsLong(takerFeeAsLong)
|
||||
.setMakerDepositTxId(makerDepositTxId == null ? "" : makerDepositTxId)
|
||||
.setTakerDepositTxId(takerDepositTxId == null ? "" : takerDepositTxId)
|
||||
|
@ -240,7 +236,6 @@ public class TradeInfo implements Payload {
|
|||
.withShortId(proto.getShortId())
|
||||
.withDate(proto.getDate())
|
||||
.withRole(proto.getRole())
|
||||
.withTxFeeAsLong(proto.getTxFeeAsLong())
|
||||
.withTakerFeeAsLong(proto.getTakerFeeAsLong())
|
||||
.withMakerDepositTxId(proto.getMakerDepositTxId())
|
||||
.withTakerDepositTxId(proto.getTakerDepositTxId())
|
||||
|
@ -278,7 +273,6 @@ public class TradeInfo implements Payload {
|
|||
", shortId='" + shortId + '\'' + "\n" +
|
||||
", date='" + date + '\'' + "\n" +
|
||||
", role='" + role + '\'' + "\n" +
|
||||
", txFeeAsLong='" + txFeeAsLong + '\'' + "\n" +
|
||||
", takerFeeAsLong='" + takerFeeAsLong + '\'' + "\n" +
|
||||
", makerDepositTxId='" + makerDepositTxId + '\'' + "\n" +
|
||||
", takerDepositTxId='" + takerDepositTxId + '\'' + "\n" +
|
||||
|
|
|
@ -201,7 +201,6 @@ public class CreateOfferService {
|
|||
acceptedBanks,
|
||||
Version.VERSION,
|
||||
xmrWalletService.getWallet().getHeight(),
|
||||
0, // todo: remove txFeeToUse from data model
|
||||
makerFeeAsCoin.value,
|
||||
buyerSecurityDepositAsCoin.value,
|
||||
sellerSecurityDepositAsCoin.value,
|
||||
|
|
|
@ -297,11 +297,6 @@ public class Offer implements NetworkPayload, PersistablePayload {
|
|||
return reserveAmount;
|
||||
}
|
||||
|
||||
// converted payload properties
|
||||
public Coin getTxFee() {
|
||||
return Coin.valueOf(offerPayload.getTxFee());
|
||||
}
|
||||
|
||||
public Coin getMakerFee() {
|
||||
return Coin.valueOf(offerPayload.getMakerFee());
|
||||
}
|
||||
|
|
|
@ -131,7 +131,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
@Nullable
|
||||
private final List<String> acceptedBankIds;
|
||||
private final long blockHeightAtOfferCreation;
|
||||
private final long txFee;
|
||||
private final long makerFee;
|
||||
private final long buyerSecurityDeposit;
|
||||
private final long sellerSecurityDeposit;
|
||||
|
@ -179,7 +178,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
@Nullable List<String> acceptedBankIds,
|
||||
String versionNr,
|
||||
long blockHeightAtOfferCreation,
|
||||
long txFee,
|
||||
long makerFee,
|
||||
long buyerSecurityDeposit,
|
||||
long sellerSecurityDeposit,
|
||||
|
@ -222,7 +220,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
this.bankId = bankId;
|
||||
this.acceptedBankIds = acceptedBankIds;
|
||||
this.blockHeightAtOfferCreation = blockHeightAtOfferCreation;
|
||||
this.txFee = txFee;
|
||||
this.makerFee = makerFee;
|
||||
this.buyerSecurityDeposit = buyerSecurityDeposit;
|
||||
this.sellerSecurityDeposit = sellerSecurityDeposit;
|
||||
|
@ -287,7 +284,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
.setMakerPaymentAccountId(makerPaymentAccountId)
|
||||
.setVersionNr(versionNr)
|
||||
.setBlockHeightAtOfferCreation(blockHeightAtOfferCreation)
|
||||
.setTxFee(txFee)
|
||||
.setMakerFee(makerFee)
|
||||
.setBuyerSecurityDeposit(buyerSecurityDeposit)
|
||||
.setSellerSecurityDeposit(sellerSecurityDeposit)
|
||||
|
@ -343,7 +339,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
acceptedBankIds,
|
||||
proto.getVersionNr(),
|
||||
proto.getBlockHeightAtOfferCreation(),
|
||||
proto.getTxFee(),
|
||||
proto.getMakerFee(),
|
||||
proto.getBuyerSecurityDeposit(),
|
||||
proto.getSellerSecurityDeposit(),
|
||||
|
@ -392,7 +387,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
",\r\n bankId='" + bankId + '\'' +
|
||||
",\r\n acceptedBankIds=" + acceptedBankIds +
|
||||
",\r\n blockHeightAtOfferCreation=" + blockHeightAtOfferCreation +
|
||||
",\r\n txFee=" + txFee +
|
||||
",\r\n makerFee=" + makerFee +
|
||||
",\r\n buyerSecurityDeposit=" + buyerSecurityDeposit +
|
||||
",\r\n sellerSecurityDeposit=" + sellerSecurityDeposit +
|
||||
|
@ -432,7 +426,6 @@ public final class OfferPayload implements ProtectedStoragePayload, ExpirablePay
|
|||
object.add("offerFeePaymentTxId", context.serialize(offerPayload.getOfferFeePaymentTxId()));
|
||||
object.add("versionNr", context.serialize(offerPayload.getVersionNr()));
|
||||
object.add("blockHeightAtOfferCreation", context.serialize(offerPayload.getBlockHeightAtOfferCreation()));
|
||||
object.add("txFee", context.serialize(offerPayload.getTxFee()));
|
||||
object.add("makerFee", context.serialize(offerPayload.getMakerFee()));
|
||||
object.add("buyerSecurityDeposit", context.serialize(offerPayload.getBuyerSecurityDeposit()));
|
||||
object.add("sellerSecurityDeposit", context.serialize(offerPayload.getSellerSecurityDeposit()));
|
||||
|
|
|
@ -1321,7 +1321,6 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe
|
|||
originalOfferPayload.getAcceptedBankIds(),
|
||||
originalOfferPayload.getVersionNr(),
|
||||
originalOfferPayload.getBlockHeightAtOfferCreation(),
|
||||
originalOfferPayload.getTxFee(),
|
||||
originalOfferPayload.getMakerFee(),
|
||||
originalOfferPayload.getBuyerSecurityDeposit(),
|
||||
originalOfferPayload.getSellerSecurityDeposit(),
|
||||
|
|
|
@ -84,7 +84,6 @@ public class ValidateOffer extends Task<PlaceOfferModel> {
|
|||
checkNotNull(offer.getPubKeyRing(), "pubKeyRing is null");
|
||||
checkNotNull(offer.getMinAmount(), "MinAmount is null");
|
||||
checkNotNull(offer.getPrice(), "Price is null");
|
||||
checkNotNull(offer.getTxFee(), "txFee is null");
|
||||
checkNotNull(offer.getMakerFee(), "MakerFee is null");
|
||||
checkNotNull(offer.getVersionNr(), "VersionNr is null");
|
||||
checkArgument(offer.getMaxTradePeriod() > 0,
|
||||
|
|
|
@ -46,7 +46,6 @@ import bisq.core.trade.messages.PaymentReceivedMessage;
|
|||
import bisq.core.trade.messages.RefreshTradeStateRequest;
|
||||
import bisq.core.trade.messages.SignContractRequest;
|
||||
import bisq.core.trade.messages.SignContractResponse;
|
||||
import bisq.core.trade.messages.TraderSignedWitnessMessage;
|
||||
|
||||
import bisq.network.p2p.AckMessage;
|
||||
import bisq.network.p2p.BundleOfEnvelopes;
|
||||
|
@ -158,9 +157,6 @@ public class CoreNetworkProtoResolver extends CoreProtoResolver implements Netwo
|
|||
case PAYMENT_RECEIVED_MESSAGE:
|
||||
return PaymentReceivedMessage.fromProto(proto.getPaymentReceivedMessage(), messageVersion);
|
||||
|
||||
case TRADER_SIGNED_WITNESS_MESSAGE:
|
||||
return TraderSignedWitnessMessage.fromProto(proto.getTraderSignedWitnessMessage(), messageVersion);
|
||||
|
||||
case MEDIATED_PAYOUT_TX_SIGNATURE_MESSAGE:
|
||||
return MediatedPayoutTxSignatureMessage.fromProto(proto.getMediatedPayoutTxSignatureMessage(), messageVersion);
|
||||
case MEDIATED_PAYOUT_TX_PUBLISHED_MESSAGE:
|
||||
|
|
|
@ -325,8 +325,6 @@ public abstract class Trade implements Tradable, Model {
|
|||
@Getter
|
||||
private final Offer offer;
|
||||
@Getter
|
||||
private final long txFeeAsLong;
|
||||
@Getter
|
||||
private final long takerFeeAsLong;
|
||||
|
||||
// Added in 1.5.1
|
||||
|
@ -486,7 +484,6 @@ public abstract class Trade implements Tradable, Model {
|
|||
this.processModel = processModel;
|
||||
this.uid = uid;
|
||||
|
||||
this.txFeeAsLong = txFee.value;
|
||||
this.takerFeeAsLong = takerFee.value;
|
||||
this.takeOfferDate = new Date().getTime();
|
||||
this.tradeListeners = new ArrayList<TradeListener>();
|
||||
|
@ -830,10 +827,10 @@ public abstract class Trade implements Tradable, Model {
|
|||
isBuyerMakerAndSellerTaker,
|
||||
this instanceof MakerTrade ? processModel.getAccountId() : getMaker().getAccountId(), // maker account id
|
||||
this instanceof TakerTrade ? processModel.getAccountId() : getTaker().getAccountId(), // taker account id
|
||||
checkNotNull(this instanceof MakerTrade ? processModel.getPaymentAccountPayload(this).getPaymentMethodId() : getOffer().getOfferPayload().getPaymentMethodId()), // maker payment method id
|
||||
checkNotNull(this instanceof TakerTrade ? processModel.getPaymentAccountPayload(this).getPaymentMethodId() : getTaker().getPaymentMethodId()), // taker payment method id
|
||||
this instanceof MakerTrade ? processModel.getPaymentAccountPayload(this).getHash() : getMaker().getPaymentAccountPayloadHash(), // maker payment account payload hash
|
||||
this instanceof TakerTrade ? processModel.getPaymentAccountPayload(this).getHash() : getTaker().getPaymentAccountPayloadHash(), // maker payment account payload hash
|
||||
checkNotNull(this instanceof MakerTrade ? getMaker().getPaymentAccountPayload().getPaymentMethodId() : getOffer().getOfferPayload().getPaymentMethodId()),
|
||||
checkNotNull(this instanceof TakerTrade ? getTaker().getPaymentAccountPayload().getPaymentMethodId() : getTaker().getPaymentMethodId()),
|
||||
this instanceof MakerTrade ? getMaker().getPaymentAccountPayload().getHash() : getMaker().getPaymentAccountPayloadHash(),
|
||||
this instanceof TakerTrade ? getTaker().getPaymentAccountPayload().getHash() : getTaker().getPaymentAccountPayloadHash(),
|
||||
getMaker().getPubKeyRing(),
|
||||
getTaker().getPubKeyRing(),
|
||||
this instanceof MakerTrade ? xmrWalletService.getAddressEntry(getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString() : getMaker().getPayoutAddressString(), // maker payout address
|
||||
|
@ -1219,6 +1216,7 @@ public abstract class Trade implements Tradable, Model {
|
|||
payoutTxId = payoutTx.getHash();
|
||||
if ("".equals(payoutTxId)) payoutTxId = null; // tx hash is empty until signed
|
||||
payoutTxKey = payoutTx.getKey();
|
||||
for (Dispute dispute : getDisputes()) dispute.setDisputePayoutTxId(payoutTxId);
|
||||
}
|
||||
|
||||
public void setErrorMessage(String errorMessage) {
|
||||
|
@ -1751,7 +1749,6 @@ public abstract class Trade implements Tradable, Model {
|
|||
public Message toProtoMessage() {
|
||||
protobuf.Trade.Builder builder = protobuf.Trade.newBuilder()
|
||||
.setOffer(offer.toProtoMessage())
|
||||
.setTxFeeAsLong(txFeeAsLong)
|
||||
.setTakerFeeAsLong(takerFeeAsLong)
|
||||
.setTakeOfferDate(takeOfferDate)
|
||||
.setProcessModel(processModel.toProtoMessage())
|
||||
|
@ -1821,7 +1818,6 @@ public abstract class Trade implements Tradable, Model {
|
|||
public String toString() {
|
||||
return "Trade{" +
|
||||
"\n offer=" + offer +
|
||||
",\n txFeeAsLong=" + txFeeAsLong +
|
||||
",\n takerFeeAsLong=" + takerFeeAsLong +
|
||||
",\n takeOfferDate=" + takeOfferDate +
|
||||
",\n processModel=" + processModel +
|
||||
|
|
|
@ -596,12 +596,10 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
|
|||
request.getTakerNodeAddress(),
|
||||
request.getArbitratorNodeAddress());
|
||||
|
||||
//System.out.println("TradeManager trade.getTradePeer().setNodeAddress(): " + sender);
|
||||
//trade.getTradePeer().setNodeAddress(sender);
|
||||
// TODO (woodser): what if maker's address changes while offer open, or taker's address changes after multisig deposit available? need to verify and update. see OpenOfferManager.maybeUpdatePersistedOffers()
|
||||
trade.getArbitrator().setPubKeyRing(arbitrator.getPubKeyRing());
|
||||
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
|
||||
initTradeAndProtocol(trade, getTradeProtocol(trade));
|
||||
trade.getSelf().setPaymentAccountId(offer.getOfferPayload().getMakerPaymentAccountId());
|
||||
trade.getSelf().setReserveTxHash(openOffer.getReserveTxHash()); // TODO (woodser): initialize in initTradeAndProtocol?
|
||||
trade.getSelf().setReserveTxHex(openOffer.getReserveTxHex());
|
||||
trade.getSelf().setReserveTxKey(openOffer.getReserveTxKey());
|
||||
|
@ -783,8 +781,8 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
|
|||
trade.getProcessModel().setUseSavingsWallet(useSavingsWallet);
|
||||
trade.getProcessModel().setFundsNeededForTradeAsLong(fundsNeededForTrade.value);
|
||||
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
|
||||
trade.getTaker().setPubKeyRing(model.getPubKeyRing());
|
||||
trade.getTaker().setPaymentAccountId(paymentAccountId);
|
||||
trade.getSelf().setPubKeyRing(model.getPubKeyRing());
|
||||
trade.getSelf().setPaymentAccountId(paymentAccountId);
|
||||
|
||||
TradeProtocol tradeProtocol = TradeProtocolFactory.getNewTradeProtocol(trade);
|
||||
TradeProtocol prev = tradeProtocolByTradeId.put(trade.getUid(), tradeProtocol);
|
||||
|
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.trade.messages;
|
||||
|
||||
import bisq.core.account.sign.SignedWitness;
|
||||
|
||||
import bisq.network.p2p.NodeAddress;
|
||||
|
||||
import bisq.common.app.Version;
|
||||
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Value;
|
||||
|
||||
/**
|
||||
* Not used anymore since v1.4.0
|
||||
*/
|
||||
@Deprecated
|
||||
@SuppressWarnings("ALL")
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Value
|
||||
public class TraderSignedWitnessMessage extends TradeMailboxMessage {
|
||||
private final NodeAddress senderNodeAddress;
|
||||
private final SignedWitness signedWitness;
|
||||
|
||||
public TraderSignedWitnessMessage(String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
SignedWitness signedWitness) {
|
||||
this(Version.getP2PMessageVersion(),
|
||||
uid,
|
||||
tradeId,
|
||||
senderNodeAddress,
|
||||
signedWitness);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PROTO BUFFER
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private TraderSignedWitnessMessage(String messageVersion,
|
||||
String uid,
|
||||
String tradeId,
|
||||
NodeAddress senderNodeAddress,
|
||||
SignedWitness signedWitness) {
|
||||
super(messageVersion, tradeId, uid);
|
||||
this.senderNodeAddress = senderNodeAddress;
|
||||
this.signedWitness = signedWitness;
|
||||
}
|
||||
|
||||
@Override
|
||||
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
|
||||
final protobuf.TraderSignedWitnessMessage.Builder builder = protobuf.TraderSignedWitnessMessage.newBuilder();
|
||||
builder.setUid(uid)
|
||||
.setTradeId(tradeId)
|
||||
.setSenderNodeAddress(senderNodeAddress.toProtoMessage())
|
||||
.setSignedWitness(signedWitness.toProtoSignedWitness());
|
||||
return getNetworkEnvelopeBuilder().setTraderSignedWitnessMessage(builder).build();
|
||||
}
|
||||
|
||||
public static TraderSignedWitnessMessage fromProto(protobuf.TraderSignedWitnessMessage proto, String messageVersion) {
|
||||
return new TraderSignedWitnessMessage(messageVersion,
|
||||
proto.getUid(),
|
||||
proto.getTradeId(),
|
||||
NodeAddress.fromProto(proto.getSenderNodeAddress()),
|
||||
SignedWitness.fromProto(proto.getSignedWitness()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TraderSignedWitnessMessage{" +
|
||||
"\n senderNodeAddress=" + senderNodeAddress +
|
||||
"\n signedWitness=" + signedWitness +
|
||||
"\n} " + super.toString();
|
||||
}
|
||||
|
||||
}
|
|
@ -306,12 +306,8 @@ public class ProcessModel implements Model, PersistablePayload {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
public PaymentAccountPayload getPaymentAccountPayload(Trade trade) {
|
||||
PaymentAccount paymentAccount;
|
||||
if (trade instanceof MakerTrade)
|
||||
paymentAccount = getUser().getPaymentAccount(offer.getMakerPaymentAccountId());
|
||||
else
|
||||
paymentAccount = getUser().getPaymentAccount(trade.getTaker().getPaymentAccountId());
|
||||
public PaymentAccountPayload getPaymentAccountPayload(String paymentAccountId) {
|
||||
PaymentAccount paymentAccount = getUser().getPaymentAccount(paymentAccountId);
|
||||
return paymentAccount != null ? paymentAccount.getPaymentAccountPayload() : null;
|
||||
}
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ public class MaybeSendSignContractRequest extends TradeTask {
|
|||
trade.getSelf().setDepositTxHash(depositTx.getHash());
|
||||
trade.getSelf().setReserveTxKeyImages(reservedKeyImages);
|
||||
trade.getSelf().setPayoutAddressString(trade.getXmrWalletService().getAddressEntry(processModel.getOffer().getId(), XmrAddressEntry.Context.TRADE_PAYOUT).get().getAddressString()); // TODO (woodser): allow custom payout address?
|
||||
trade.getSelf().setPaymentAccountPayload(trade.getProcessModel().getPaymentAccountPayload(trade));
|
||||
trade.getSelf().setPaymentAccountPayload(trade.getProcessModel().getPaymentAccountPayload(trade.getSelf().getPaymentAccountId()));
|
||||
|
||||
// maker signs deposit hash nonce to avoid challenge protocol
|
||||
byte[] sig = null;
|
||||
|
|
|
@ -62,7 +62,6 @@ public class OfferMaker {
|
|||
0L,
|
||||
0L,
|
||||
0L,
|
||||
0L,
|
||||
false,
|
||||
false,
|
||||
0L,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue