/*
 * Lethean Blockchain API
 * OpenAPI for Lethean Blockchain
 *
 * The version of the OpenAPI document: 6.0.1
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


package org.openapitools.client.model;

import java.util.Objects;
import java.util.Locale;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openapitools.client.model.MaintainersInfoModel;
import org.openapitools.client.model.PerformanceModel;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Locale;

import invalidPackageName.JSON;

/**
 * InfoModel
 */
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-10-19T15:35:02.750468+01:00[Europe/London]", comments = "Generator version: 7.16.0")
public class InfoModel {
  public static final String SERIALIZED_NAME_HEIGHT = "height";
  @SerializedName(SERIALIZED_NAME_HEIGHT)
  @javax.annotation.Nullable
  private Integer height;

  public static final String SERIALIZED_NAME_TX_COUNT = "tx_count";
  @SerializedName(SERIALIZED_NAME_TX_COUNT)
  @javax.annotation.Nullable
  private Integer txCount;

  public static final String SERIALIZED_NAME_TX_POOL_SIZE = "tx_pool_size";
  @SerializedName(SERIALIZED_NAME_TX_POOL_SIZE)
  @javax.annotation.Nullable
  private Integer txPoolSize;

  public static final String SERIALIZED_NAME_ALT_BLOCKS_COUNT = "alt_blocks_count";
  @SerializedName(SERIALIZED_NAME_ALT_BLOCKS_COUNT)
  @javax.annotation.Nullable
  private Integer altBlocksCount;

  public static final String SERIALIZED_NAME_OUTGOING_CONNECTIONS_COUNT = "outgoing_connections_count";
  @SerializedName(SERIALIZED_NAME_OUTGOING_CONNECTIONS_COUNT)
  @javax.annotation.Nullable
  private Integer outgoingConnectionsCount;

  public static final String SERIALIZED_NAME_INCOMING_CONNECTIONS_COUNT = "incoming_connections_count";
  @SerializedName(SERIALIZED_NAME_INCOMING_CONNECTIONS_COUNT)
  @javax.annotation.Nullable
  private Integer incomingConnectionsCount;

  public static final String SERIALIZED_NAME_SYNCHRONIZED_CONNECTIONS_COUNT = "synchronized_connections_count";
  @SerializedName(SERIALIZED_NAME_SYNCHRONIZED_CONNECTIONS_COUNT)
  @javax.annotation.Nullable
  private Integer synchronizedConnectionsCount;

  public static final String SERIALIZED_NAME_WHITE_PEERLIST_SIZE = "white_peerlist_size";
  @SerializedName(SERIALIZED_NAME_WHITE_PEERLIST_SIZE)
  @javax.annotation.Nullable
  private Integer whitePeerlistSize;

  public static final String SERIALIZED_NAME_GREY_PEERLIST_SIZE = "grey_peerlist_size";
  @SerializedName(SERIALIZED_NAME_GREY_PEERLIST_SIZE)
  @javax.annotation.Nullable
  private Integer greyPeerlistSize;

  public static final String SERIALIZED_NAME_CURRENT_BLOCKS_MEDIAN = "current_blocks_median";
  @SerializedName(SERIALIZED_NAME_CURRENT_BLOCKS_MEDIAN)
  @javax.annotation.Nullable
  private Integer currentBlocksMedian;

  public static final String SERIALIZED_NAME_ALIAS_COUNT = "alias_count";
  @SerializedName(SERIALIZED_NAME_ALIAS_COUNT)
  @javax.annotation.Nullable
  private Integer aliasCount;

  public static final String SERIALIZED_NAME_CURRENT_MAX_ALLOWED_BLOCK_SIZE = "current_max_allowed_block_size";
  @SerializedName(SERIALIZED_NAME_CURRENT_MAX_ALLOWED_BLOCK_SIZE)
  @javax.annotation.Nullable
  private Integer currentMaxAllowedBlockSize;

  public static final String SERIALIZED_NAME_DAEMON_NETWORK_STATE = "daemon_network_state";
  @SerializedName(SERIALIZED_NAME_DAEMON_NETWORK_STATE)
  @javax.annotation.Nullable
  private String daemonNetworkState;

  public static final String SERIALIZED_NAME_SYNCHRONIZATION_START_HEIGHT = "synchronization_start_height";
  @SerializedName(SERIALIZED_NAME_SYNCHRONIZATION_START_HEIGHT)
  @javax.annotation.Nullable
  private Integer synchronizationStartHeight;

  public static final String SERIALIZED_NAME_MAX_NET_SEEN_HEIGHT = "max_net_seen_height";
  @SerializedName(SERIALIZED_NAME_MAX_NET_SEEN_HEIGHT)
  @javax.annotation.Nullable
  private Integer maxNetSeenHeight;

  public static final String SERIALIZED_NAME_MI = "mi";
  @SerializedName(SERIALIZED_NAME_MI)
  @javax.annotation.Nullable
  private MaintainersInfoModel mi;

  public static final String SERIALIZED_NAME_POS_ALLOWED = "pos_allowed";
  @SerializedName(SERIALIZED_NAME_POS_ALLOWED)
  @javax.annotation.Nullable
  private Boolean posAllowed;

  public static final String SERIALIZED_NAME_POS_DIFFICULTY = "pos_difficulty";
  @SerializedName(SERIALIZED_NAME_POS_DIFFICULTY)
  @javax.annotation.Nullable
  private String posDifficulty;

  public static final String SERIALIZED_NAME_POW_DIFFICULTY = "pow_difficulty";
  @SerializedName(SERIALIZED_NAME_POW_DIFFICULTY)
  @javax.annotation.Nullable
  private Integer powDifficulty;

  public static final String SERIALIZED_NAME_DEFAULT_FEE = "default_fee";
  @SerializedName(SERIALIZED_NAME_DEFAULT_FEE)
  @javax.annotation.Nullable
  private Integer defaultFee;

  public static final String SERIALIZED_NAME_MINIMUM_FEE = "minimum_fee";
  @SerializedName(SERIALIZED_NAME_MINIMUM_FEE)
  @javax.annotation.Nullable
  private Integer minimumFee;

  public static final String SERIALIZED_NAME_IS_HARDFORK_ACTIVE = "is_hardfork_active";
  @SerializedName(SERIALIZED_NAME_IS_HARDFORK_ACTIVE)
  @javax.annotation.Nullable
  private List<Boolean> isHardforkActive = new ArrayList<>();

  public static final String SERIALIZED_NAME_NET_TIME_DELTA_MEDIAN = "net_time_delta_median";
  @SerializedName(SERIALIZED_NAME_NET_TIME_DELTA_MEDIAN)
  @javax.annotation.Nullable
  private Long netTimeDeltaMedian;

  public static final String SERIALIZED_NAME_CURRENT_NETWORK_HASHRATE50 = "current_network_hashrate_50";
  @SerializedName(SERIALIZED_NAME_CURRENT_NETWORK_HASHRATE50)
  @javax.annotation.Nullable
  private Integer currentNetworkHashrate50;

  public static final String SERIALIZED_NAME_CURRENT_NETWORK_HASHRATE350 = "current_network_hashrate_350";
  @SerializedName(SERIALIZED_NAME_CURRENT_NETWORK_HASHRATE350)
  @javax.annotation.Nullable
  private Integer currentNetworkHashrate350;

  public static final String SERIALIZED_NAME_SECONDS_FOR10_BLOCKS = "seconds_for_10_blocks";
  @SerializedName(SERIALIZED_NAME_SECONDS_FOR10_BLOCKS)
  @javax.annotation.Nullable
  private Integer secondsFor10Blocks;

  public static final String SERIALIZED_NAME_SECONDS_FOR30_BLOCKS = "seconds_for_30_blocks";
  @SerializedName(SERIALIZED_NAME_SECONDS_FOR30_BLOCKS)
  @javax.annotation.Nullable
  private Integer secondsFor30Blocks;

  public static final String SERIALIZED_NAME_TRANSACTIONS_CNT_PER_DAY = "transactions_cnt_per_day";
  @SerializedName(SERIALIZED_NAME_TRANSACTIONS_CNT_PER_DAY)
  @javax.annotation.Nullable
  private List<Integer> transactionsCntPerDay = new ArrayList<>();

  public static final String SERIALIZED_NAME_TRANSACTIONS_VOLUME_PER_DAY = "transactions_volume_per_day";
  @SerializedName(SERIALIZED_NAME_TRANSACTIONS_VOLUME_PER_DAY)
  @javax.annotation.Nullable
  private List<Integer> transactionsVolumePerDay = new ArrayList<>();

  public static final String SERIALIZED_NAME_LAST_POS_TIMESTAMP = "last_pos_timestamp";
  @SerializedName(SERIALIZED_NAME_LAST_POS_TIMESTAMP)
  @javax.annotation.Nullable
  private Integer lastPosTimestamp;

  public static final String SERIALIZED_NAME_LAST_POW_TIMESTAMP = "last_pow_timestamp";
  @SerializedName(SERIALIZED_NAME_LAST_POW_TIMESTAMP)
  @javax.annotation.Nullable
  private Integer lastPowTimestamp;

  public static final String SERIALIZED_NAME_TOTAL_COINS = "total_coins";
  @SerializedName(SERIALIZED_NAME_TOTAL_COINS)
  @javax.annotation.Nullable
  private String totalCoins;

  public static final String SERIALIZED_NAME_LAST_BLOCK_SIZE = "last_block_size";
  @SerializedName(SERIALIZED_NAME_LAST_BLOCK_SIZE)
  @javax.annotation.Nullable
  private Integer lastBlockSize;

  public static final String SERIALIZED_NAME_TX_COUNT_IN_LAST_BLOCK = "tx_count_in_last_block";
  @SerializedName(SERIALIZED_NAME_TX_COUNT_IN_LAST_BLOCK)
  @javax.annotation.Nullable
  private Integer txCountInLastBlock;

  public static final String SERIALIZED_NAME_POS_SEQUENCE_FACTOR = "pos_sequence_factor";
  @SerializedName(SERIALIZED_NAME_POS_SEQUENCE_FACTOR)
  @javax.annotation.Nullable
  private Double posSequenceFactor;

  public static final String SERIALIZED_NAME_POW_SEQUENCE_FACTOR = "pow_sequence_factor";
  @SerializedName(SERIALIZED_NAME_POW_SEQUENCE_FACTOR)
  @javax.annotation.Nullable
  private Double powSequenceFactor;

  public static final String SERIALIZED_NAME_BLOCK_REWARD = "block_reward";
  @SerializedName(SERIALIZED_NAME_BLOCK_REWARD)
  @javax.annotation.Nullable
  private Integer blockReward;

  public static final String SERIALIZED_NAME_LAST_BLOCK_TOTAL_REWARD = "last_block_total_reward";
  @SerializedName(SERIALIZED_NAME_LAST_BLOCK_TOTAL_REWARD)
  @javax.annotation.Nullable
  private Integer lastBlockTotalReward;

  public static final String SERIALIZED_NAME_POS_DIFF_TOTAL_COINS_RATE = "pos_diff_total_coins_rate";
  @SerializedName(SERIALIZED_NAME_POS_DIFF_TOTAL_COINS_RATE)
  @javax.annotation.Nullable
  private Integer posDiffTotalCoinsRate;

  public static final String SERIALIZED_NAME_LAST_BLOCK_TIMESTAMP = "last_block_timestamp";
  @SerializedName(SERIALIZED_NAME_LAST_BLOCK_TIMESTAMP)
  @javax.annotation.Nullable
  private Integer lastBlockTimestamp;

  public static final String SERIALIZED_NAME_LAST_BLOCK_HASH = "last_block_hash";
  @SerializedName(SERIALIZED_NAME_LAST_BLOCK_HASH)
  @javax.annotation.Nullable
  private String lastBlockHash;

  public static final String SERIALIZED_NAME_POS_BLOCK_TS_SHIFT_VS_ACTUAL = "pos_block_ts_shift_vs_actual";
  @SerializedName(SERIALIZED_NAME_POS_BLOCK_TS_SHIFT_VS_ACTUAL)
  @javax.annotation.Nullable
  private Long posBlockTsShiftVsActual;

  public static final String SERIALIZED_NAME_OUTS_STAT = "outs_stat";
  @SerializedName(SERIALIZED_NAME_OUTS_STAT)
  @javax.annotation.Nullable
  private Map<String, Integer> outsStat = new HashMap<>();

  public static final String SERIALIZED_NAME_PERFORMANCE_DATA = "performance_data";
  @SerializedName(SERIALIZED_NAME_PERFORMANCE_DATA)
  @javax.annotation.Nullable
  private PerformanceModel performanceData;

  public static final String SERIALIZED_NAME_OFFERS_COUNT = "offers_count";
  @SerializedName(SERIALIZED_NAME_OFFERS_COUNT)
  @javax.annotation.Nullable
  private Integer offersCount;

  public static final String SERIALIZED_NAME_EXPIRATION_MEDIAN_TIMESTAMP = "expiration_median_timestamp";
  @SerializedName(SERIALIZED_NAME_EXPIRATION_MEDIAN_TIMESTAMP)
  @javax.annotation.Nullable
  private Integer expirationMedianTimestamp;

  public InfoModel() {
  }

  public InfoModel height(@javax.annotation.Nullable Integer height) {
    this.height = height;
    return this;
  }

  /**
   * Get height
   * @return height
   */
  @javax.annotation.Nullable
  public Integer getHeight() {
    return height;
  }

  public void setHeight(@javax.annotation.Nullable Integer height) {
    this.height = height;
  }


  public InfoModel txCount(@javax.annotation.Nullable Integer txCount) {
    this.txCount = txCount;
    return this;
  }

  /**
   * Get txCount
   * @return txCount
   */
  @javax.annotation.Nullable
  public Integer getTxCount() {
    return txCount;
  }

  public void setTxCount(@javax.annotation.Nullable Integer txCount) {
    this.txCount = txCount;
  }


  public InfoModel txPoolSize(@javax.annotation.Nullable Integer txPoolSize) {
    this.txPoolSize = txPoolSize;
    return this;
  }

  /**
   * Get txPoolSize
   * @return txPoolSize
   */
  @javax.annotation.Nullable
  public Integer getTxPoolSize() {
    return txPoolSize;
  }

  public void setTxPoolSize(@javax.annotation.Nullable Integer txPoolSize) {
    this.txPoolSize = txPoolSize;
  }


  public InfoModel altBlocksCount(@javax.annotation.Nullable Integer altBlocksCount) {
    this.altBlocksCount = altBlocksCount;
    return this;
  }

  /**
   * Get altBlocksCount
   * @return altBlocksCount
   */
  @javax.annotation.Nullable
  public Integer getAltBlocksCount() {
    return altBlocksCount;
  }

  public void setAltBlocksCount(@javax.annotation.Nullable Integer altBlocksCount) {
    this.altBlocksCount = altBlocksCount;
  }


  public InfoModel outgoingConnectionsCount(@javax.annotation.Nullable Integer outgoingConnectionsCount) {
    this.outgoingConnectionsCount = outgoingConnectionsCount;
    return this;
  }

  /**
   * Get outgoingConnectionsCount
   * @return outgoingConnectionsCount
   */
  @javax.annotation.Nullable
  public Integer getOutgoingConnectionsCount() {
    return outgoingConnectionsCount;
  }

  public void setOutgoingConnectionsCount(@javax.annotation.Nullable Integer outgoingConnectionsCount) {
    this.outgoingConnectionsCount = outgoingConnectionsCount;
  }


  public InfoModel incomingConnectionsCount(@javax.annotation.Nullable Integer incomingConnectionsCount) {
    this.incomingConnectionsCount = incomingConnectionsCount;
    return this;
  }

  /**
   * Get incomingConnectionsCount
   * @return incomingConnectionsCount
   */
  @javax.annotation.Nullable
  public Integer getIncomingConnectionsCount() {
    return incomingConnectionsCount;
  }

  public void setIncomingConnectionsCount(@javax.annotation.Nullable Integer incomingConnectionsCount) {
    this.incomingConnectionsCount = incomingConnectionsCount;
  }


  public InfoModel synchronizedConnectionsCount(@javax.annotation.Nullable Integer synchronizedConnectionsCount) {
    this.synchronizedConnectionsCount = synchronizedConnectionsCount;
    return this;
  }

  /**
   * Get synchronizedConnectionsCount
   * @return synchronizedConnectionsCount
   */
  @javax.annotation.Nullable
  public Integer getSynchronizedConnectionsCount() {
    return synchronizedConnectionsCount;
  }

  public void setSynchronizedConnectionsCount(@javax.annotation.Nullable Integer synchronizedConnectionsCount) {
    this.synchronizedConnectionsCount = synchronizedConnectionsCount;
  }


  public InfoModel whitePeerlistSize(@javax.annotation.Nullable Integer whitePeerlistSize) {
    this.whitePeerlistSize = whitePeerlistSize;
    return this;
  }

  /**
   * Get whitePeerlistSize
   * @return whitePeerlistSize
   */
  @javax.annotation.Nullable
  public Integer getWhitePeerlistSize() {
    return whitePeerlistSize;
  }

  public void setWhitePeerlistSize(@javax.annotation.Nullable Integer whitePeerlistSize) {
    this.whitePeerlistSize = whitePeerlistSize;
  }


  public InfoModel greyPeerlistSize(@javax.annotation.Nullable Integer greyPeerlistSize) {
    this.greyPeerlistSize = greyPeerlistSize;
    return this;
  }

  /**
   * Get greyPeerlistSize
   * @return greyPeerlistSize
   */
  @javax.annotation.Nullable
  public Integer getGreyPeerlistSize() {
    return greyPeerlistSize;
  }

  public void setGreyPeerlistSize(@javax.annotation.Nullable Integer greyPeerlistSize) {
    this.greyPeerlistSize = greyPeerlistSize;
  }


  public InfoModel currentBlocksMedian(@javax.annotation.Nullable Integer currentBlocksMedian) {
    this.currentBlocksMedian = currentBlocksMedian;
    return this;
  }

  /**
   * Get currentBlocksMedian
   * @return currentBlocksMedian
   */
  @javax.annotation.Nullable
  public Integer getCurrentBlocksMedian() {
    return currentBlocksMedian;
  }

  public void setCurrentBlocksMedian(@javax.annotation.Nullable Integer currentBlocksMedian) {
    this.currentBlocksMedian = currentBlocksMedian;
  }


  public InfoModel aliasCount(@javax.annotation.Nullable Integer aliasCount) {
    this.aliasCount = aliasCount;
    return this;
  }

  /**
   * Get aliasCount
   * @return aliasCount
   */
  @javax.annotation.Nullable
  public Integer getAliasCount() {
    return aliasCount;
  }

  public void setAliasCount(@javax.annotation.Nullable Integer aliasCount) {
    this.aliasCount = aliasCount;
  }


  public InfoModel currentMaxAllowedBlockSize(@javax.annotation.Nullable Integer currentMaxAllowedBlockSize) {
    this.currentMaxAllowedBlockSize = currentMaxAllowedBlockSize;
    return this;
  }

  /**
   * Get currentMaxAllowedBlockSize
   * @return currentMaxAllowedBlockSize
   */
  @javax.annotation.Nullable
  public Integer getCurrentMaxAllowedBlockSize() {
    return currentMaxAllowedBlockSize;
  }

  public void setCurrentMaxAllowedBlockSize(@javax.annotation.Nullable Integer currentMaxAllowedBlockSize) {
    this.currentMaxAllowedBlockSize = currentMaxAllowedBlockSize;
  }


  public InfoModel daemonNetworkState(@javax.annotation.Nullable String daemonNetworkState) {
    this.daemonNetworkState = daemonNetworkState;
    return this;
  }

  /**
   * Get daemonNetworkState
   * @return daemonNetworkState
   */
  @javax.annotation.Nullable
  public String getDaemonNetworkState() {
    return daemonNetworkState;
  }

  public void setDaemonNetworkState(@javax.annotation.Nullable String daemonNetworkState) {
    this.daemonNetworkState = daemonNetworkState;
  }


  public InfoModel synchronizationStartHeight(@javax.annotation.Nullable Integer synchronizationStartHeight) {
    this.synchronizationStartHeight = synchronizationStartHeight;
    return this;
  }

  /**
   * Get synchronizationStartHeight
   * @return synchronizationStartHeight
   */
  @javax.annotation.Nullable
  public Integer getSynchronizationStartHeight() {
    return synchronizationStartHeight;
  }

  public void setSynchronizationStartHeight(@javax.annotation.Nullable Integer synchronizationStartHeight) {
    this.synchronizationStartHeight = synchronizationStartHeight;
  }


  public InfoModel maxNetSeenHeight(@javax.annotation.Nullable Integer maxNetSeenHeight) {
    this.maxNetSeenHeight = maxNetSeenHeight;
    return this;
  }

  /**
   * Get maxNetSeenHeight
   * @return maxNetSeenHeight
   */
  @javax.annotation.Nullable
  public Integer getMaxNetSeenHeight() {
    return maxNetSeenHeight;
  }

  public void setMaxNetSeenHeight(@javax.annotation.Nullable Integer maxNetSeenHeight) {
    this.maxNetSeenHeight = maxNetSeenHeight;
  }


  public InfoModel mi(@javax.annotation.Nullable MaintainersInfoModel mi) {
    this.mi = mi;
    return this;
  }

  /**
   * Get mi
   * @return mi
   */
  @javax.annotation.Nullable
  public MaintainersInfoModel getMi() {
    return mi;
  }

  public void setMi(@javax.annotation.Nullable MaintainersInfoModel mi) {
    this.mi = mi;
  }


  public InfoModel posAllowed(@javax.annotation.Nullable Boolean posAllowed) {
    this.posAllowed = posAllowed;
    return this;
  }

  /**
   * Get posAllowed
   * @return posAllowed
   */
  @javax.annotation.Nullable
  public Boolean getPosAllowed() {
    return posAllowed;
  }

  public void setPosAllowed(@javax.annotation.Nullable Boolean posAllowed) {
    this.posAllowed = posAllowed;
  }


  public InfoModel posDifficulty(@javax.annotation.Nullable String posDifficulty) {
    this.posDifficulty = posDifficulty;
    return this;
  }

  /**
   * Get posDifficulty
   * @return posDifficulty
   */
  @javax.annotation.Nullable
  public String getPosDifficulty() {
    return posDifficulty;
  }

  public void setPosDifficulty(@javax.annotation.Nullable String posDifficulty) {
    this.posDifficulty = posDifficulty;
  }


  public InfoModel powDifficulty(@javax.annotation.Nullable Integer powDifficulty) {
    this.powDifficulty = powDifficulty;
    return this;
  }

  /**
   * Get powDifficulty
   * @return powDifficulty
   */
  @javax.annotation.Nullable
  public Integer getPowDifficulty() {
    return powDifficulty;
  }

  public void setPowDifficulty(@javax.annotation.Nullable Integer powDifficulty) {
    this.powDifficulty = powDifficulty;
  }


  public InfoModel defaultFee(@javax.annotation.Nullable Integer defaultFee) {
    this.defaultFee = defaultFee;
    return this;
  }

  /**
   * Get defaultFee
   * @return defaultFee
   */
  @javax.annotation.Nullable
  public Integer getDefaultFee() {
    return defaultFee;
  }

  public void setDefaultFee(@javax.annotation.Nullable Integer defaultFee) {
    this.defaultFee = defaultFee;
  }


  public InfoModel minimumFee(@javax.annotation.Nullable Integer minimumFee) {
    this.minimumFee = minimumFee;
    return this;
  }

  /**
   * Get minimumFee
   * @return minimumFee
   */
  @javax.annotation.Nullable
  public Integer getMinimumFee() {
    return minimumFee;
  }

  public void setMinimumFee(@javax.annotation.Nullable Integer minimumFee) {
    this.minimumFee = minimumFee;
  }


  public InfoModel isHardforkActive(@javax.annotation.Nullable List<Boolean> isHardforkActive) {
    this.isHardforkActive = isHardforkActive;
    return this;
  }

  public InfoModel addIsHardforkActiveItem(Boolean isHardforkActiveItem) {
    if (this.isHardforkActive == null) {
      this.isHardforkActive = new ArrayList<>();
    }
    this.isHardforkActive.add(isHardforkActiveItem);
    return this;
  }

  /**
   * Get isHardforkActive
   * @return isHardforkActive
   */
  @javax.annotation.Nullable
  public List<Boolean> getIsHardforkActive() {
    return isHardforkActive;
  }

  public void setIsHardforkActive(@javax.annotation.Nullable List<Boolean> isHardforkActive) {
    this.isHardforkActive = isHardforkActive;
  }


  public InfoModel netTimeDeltaMedian(@javax.annotation.Nullable Long netTimeDeltaMedian) {
    this.netTimeDeltaMedian = netTimeDeltaMedian;
    return this;
  }

  /**
   * Get netTimeDeltaMedian
   * @return netTimeDeltaMedian
   */
  @javax.annotation.Nullable
  public Long getNetTimeDeltaMedian() {
    return netTimeDeltaMedian;
  }

  public void setNetTimeDeltaMedian(@javax.annotation.Nullable Long netTimeDeltaMedian) {
    this.netTimeDeltaMedian = netTimeDeltaMedian;
  }


  public InfoModel currentNetworkHashrate50(@javax.annotation.Nullable Integer currentNetworkHashrate50) {
    this.currentNetworkHashrate50 = currentNetworkHashrate50;
    return this;
  }

  /**
   * Get currentNetworkHashrate50
   * @return currentNetworkHashrate50
   */
  @javax.annotation.Nullable
  public Integer getCurrentNetworkHashrate50() {
    return currentNetworkHashrate50;
  }

  public void setCurrentNetworkHashrate50(@javax.annotation.Nullable Integer currentNetworkHashrate50) {
    this.currentNetworkHashrate50 = currentNetworkHashrate50;
  }


  public InfoModel currentNetworkHashrate350(@javax.annotation.Nullable Integer currentNetworkHashrate350) {
    this.currentNetworkHashrate350 = currentNetworkHashrate350;
    return this;
  }

  /**
   * Get currentNetworkHashrate350
   * @return currentNetworkHashrate350
   */
  @javax.annotation.Nullable
  public Integer getCurrentNetworkHashrate350() {
    return currentNetworkHashrate350;
  }

  public void setCurrentNetworkHashrate350(@javax.annotation.Nullable Integer currentNetworkHashrate350) {
    this.currentNetworkHashrate350 = currentNetworkHashrate350;
  }


  public InfoModel secondsFor10Blocks(@javax.annotation.Nullable Integer secondsFor10Blocks) {
    this.secondsFor10Blocks = secondsFor10Blocks;
    return this;
  }

  /**
   * Get secondsFor10Blocks
   * @return secondsFor10Blocks
   */
  @javax.annotation.Nullable
  public Integer getSecondsFor10Blocks() {
    return secondsFor10Blocks;
  }

  public void setSecondsFor10Blocks(@javax.annotation.Nullable Integer secondsFor10Blocks) {
    this.secondsFor10Blocks = secondsFor10Blocks;
  }


  public InfoModel secondsFor30Blocks(@javax.annotation.Nullable Integer secondsFor30Blocks) {
    this.secondsFor30Blocks = secondsFor30Blocks;
    return this;
  }

  /**
   * Get secondsFor30Blocks
   * @return secondsFor30Blocks
   */
  @javax.annotation.Nullable
  public Integer getSecondsFor30Blocks() {
    return secondsFor30Blocks;
  }

  public void setSecondsFor30Blocks(@javax.annotation.Nullable Integer secondsFor30Blocks) {
    this.secondsFor30Blocks = secondsFor30Blocks;
  }


  public InfoModel transactionsCntPerDay(@javax.annotation.Nullable List<Integer> transactionsCntPerDay) {
    this.transactionsCntPerDay = transactionsCntPerDay;
    return this;
  }

  public InfoModel addTransactionsCntPerDayItem(Integer transactionsCntPerDayItem) {
    if (this.transactionsCntPerDay == null) {
      this.transactionsCntPerDay = new ArrayList<>();
    }
    this.transactionsCntPerDay.add(transactionsCntPerDayItem);
    return this;
  }

  /**
   * Get transactionsCntPerDay
   * @return transactionsCntPerDay
   */
  @javax.annotation.Nullable
  public List<Integer> getTransactionsCntPerDay() {
    return transactionsCntPerDay;
  }

  public void setTransactionsCntPerDay(@javax.annotation.Nullable List<Integer> transactionsCntPerDay) {
    this.transactionsCntPerDay = transactionsCntPerDay;
  }


  public InfoModel transactionsVolumePerDay(@javax.annotation.Nullable List<Integer> transactionsVolumePerDay) {
    this.transactionsVolumePerDay = transactionsVolumePerDay;
    return this;
  }

  public InfoModel addTransactionsVolumePerDayItem(Integer transactionsVolumePerDayItem) {
    if (this.transactionsVolumePerDay == null) {
      this.transactionsVolumePerDay = new ArrayList<>();
    }
    this.transactionsVolumePerDay.add(transactionsVolumePerDayItem);
    return this;
  }

  /**
   * Get transactionsVolumePerDay
   * @return transactionsVolumePerDay
   */
  @javax.annotation.Nullable
  public List<Integer> getTransactionsVolumePerDay() {
    return transactionsVolumePerDay;
  }

  public void setTransactionsVolumePerDay(@javax.annotation.Nullable List<Integer> transactionsVolumePerDay) {
    this.transactionsVolumePerDay = transactionsVolumePerDay;
  }


  public InfoModel lastPosTimestamp(@javax.annotation.Nullable Integer lastPosTimestamp) {
    this.lastPosTimestamp = lastPosTimestamp;
    return this;
  }

  /**
   * Get lastPosTimestamp
   * @return lastPosTimestamp
   */
  @javax.annotation.Nullable
  public Integer getLastPosTimestamp() {
    return lastPosTimestamp;
  }

  public void setLastPosTimestamp(@javax.annotation.Nullable Integer lastPosTimestamp) {
    this.lastPosTimestamp = lastPosTimestamp;
  }


  public InfoModel lastPowTimestamp(@javax.annotation.Nullable Integer lastPowTimestamp) {
    this.lastPowTimestamp = lastPowTimestamp;
    return this;
  }

  /**
   * Get lastPowTimestamp
   * @return lastPowTimestamp
   */
  @javax.annotation.Nullable
  public Integer getLastPowTimestamp() {
    return lastPowTimestamp;
  }

  public void setLastPowTimestamp(@javax.annotation.Nullable Integer lastPowTimestamp) {
    this.lastPowTimestamp = lastPowTimestamp;
  }


  public InfoModel totalCoins(@javax.annotation.Nullable String totalCoins) {
    this.totalCoins = totalCoins;
    return this;
  }

  /**
   * Get totalCoins
   * @return totalCoins
   */
  @javax.annotation.Nullable
  public String getTotalCoins() {
    return totalCoins;
  }

  public void setTotalCoins(@javax.annotation.Nullable String totalCoins) {
    this.totalCoins = totalCoins;
  }


  public InfoModel lastBlockSize(@javax.annotation.Nullable Integer lastBlockSize) {
    this.lastBlockSize = lastBlockSize;
    return this;
  }

  /**
   * Get lastBlockSize
   * @return lastBlockSize
   */
  @javax.annotation.Nullable
  public Integer getLastBlockSize() {
    return lastBlockSize;
  }

  public void setLastBlockSize(@javax.annotation.Nullable Integer lastBlockSize) {
    this.lastBlockSize = lastBlockSize;
  }


  public InfoModel txCountInLastBlock(@javax.annotation.Nullable Integer txCountInLastBlock) {
    this.txCountInLastBlock = txCountInLastBlock;
    return this;
  }

  /**
   * Get txCountInLastBlock
   * @return txCountInLastBlock
   */
  @javax.annotation.Nullable
  public Integer getTxCountInLastBlock() {
    return txCountInLastBlock;
  }

  public void setTxCountInLastBlock(@javax.annotation.Nullable Integer txCountInLastBlock) {
    this.txCountInLastBlock = txCountInLastBlock;
  }


  public InfoModel posSequenceFactor(@javax.annotation.Nullable Double posSequenceFactor) {
    this.posSequenceFactor = posSequenceFactor;
    return this;
  }

  /**
   * Get posSequenceFactor
   * @return posSequenceFactor
   */
  @javax.annotation.Nullable
  public Double getPosSequenceFactor() {
    return posSequenceFactor;
  }

  public void setPosSequenceFactor(@javax.annotation.Nullable Double posSequenceFactor) {
    this.posSequenceFactor = posSequenceFactor;
  }


  public InfoModel powSequenceFactor(@javax.annotation.Nullable Double powSequenceFactor) {
    this.powSequenceFactor = powSequenceFactor;
    return this;
  }

  /**
   * Get powSequenceFactor
   * @return powSequenceFactor
   */
  @javax.annotation.Nullable
  public Double getPowSequenceFactor() {
    return powSequenceFactor;
  }

  public void setPowSequenceFactor(@javax.annotation.Nullable Double powSequenceFactor) {
    this.powSequenceFactor = powSequenceFactor;
  }


  public InfoModel blockReward(@javax.annotation.Nullable Integer blockReward) {
    this.blockReward = blockReward;
    return this;
  }

  /**
   * Get blockReward
   * @return blockReward
   */
  @javax.annotation.Nullable
  public Integer getBlockReward() {
    return blockReward;
  }

  public void setBlockReward(@javax.annotation.Nullable Integer blockReward) {
    this.blockReward = blockReward;
  }


  public InfoModel lastBlockTotalReward(@javax.annotation.Nullable Integer lastBlockTotalReward) {
    this.lastBlockTotalReward = lastBlockTotalReward;
    return this;
  }

  /**
   * Get lastBlockTotalReward
   * @return lastBlockTotalReward
   */
  @javax.annotation.Nullable
  public Integer getLastBlockTotalReward() {
    return lastBlockTotalReward;
  }

  public void setLastBlockTotalReward(@javax.annotation.Nullable Integer lastBlockTotalReward) {
    this.lastBlockTotalReward = lastBlockTotalReward;
  }


  public InfoModel posDiffTotalCoinsRate(@javax.annotation.Nullable Integer posDiffTotalCoinsRate) {
    this.posDiffTotalCoinsRate = posDiffTotalCoinsRate;
    return this;
  }

  /**
   * Get posDiffTotalCoinsRate
   * @return posDiffTotalCoinsRate
   */
  @javax.annotation.Nullable
  public Integer getPosDiffTotalCoinsRate() {
    return posDiffTotalCoinsRate;
  }

  public void setPosDiffTotalCoinsRate(@javax.annotation.Nullable Integer posDiffTotalCoinsRate) {
    this.posDiffTotalCoinsRate = posDiffTotalCoinsRate;
  }


  public InfoModel lastBlockTimestamp(@javax.annotation.Nullable Integer lastBlockTimestamp) {
    this.lastBlockTimestamp = lastBlockTimestamp;
    return this;
  }

  /**
   * Get lastBlockTimestamp
   * @return lastBlockTimestamp
   */
  @javax.annotation.Nullable
  public Integer getLastBlockTimestamp() {
    return lastBlockTimestamp;
  }

  public void setLastBlockTimestamp(@javax.annotation.Nullable Integer lastBlockTimestamp) {
    this.lastBlockTimestamp = lastBlockTimestamp;
  }


  public InfoModel lastBlockHash(@javax.annotation.Nullable String lastBlockHash) {
    this.lastBlockHash = lastBlockHash;
    return this;
  }

  /**
   * Get lastBlockHash
   * @return lastBlockHash
   */
  @javax.annotation.Nullable
  public String getLastBlockHash() {
    return lastBlockHash;
  }

  public void setLastBlockHash(@javax.annotation.Nullable String lastBlockHash) {
    this.lastBlockHash = lastBlockHash;
  }


  public InfoModel posBlockTsShiftVsActual(@javax.annotation.Nullable Long posBlockTsShiftVsActual) {
    this.posBlockTsShiftVsActual = posBlockTsShiftVsActual;
    return this;
  }

  /**
   * Get posBlockTsShiftVsActual
   * @return posBlockTsShiftVsActual
   */
  @javax.annotation.Nullable
  public Long getPosBlockTsShiftVsActual() {
    return posBlockTsShiftVsActual;
  }

  public void setPosBlockTsShiftVsActual(@javax.annotation.Nullable Long posBlockTsShiftVsActual) {
    this.posBlockTsShiftVsActual = posBlockTsShiftVsActual;
  }


  public InfoModel outsStat(@javax.annotation.Nullable Map<String, Integer> outsStat) {
    this.outsStat = outsStat;
    return this;
  }

  public InfoModel putOutsStatItem(String key, Integer outsStatItem) {
    if (this.outsStat == null) {
      this.outsStat = new HashMap<>();
    }
    this.outsStat.put(key, outsStatItem);
    return this;
  }

  /**
   * Get outsStat
   * @return outsStat
   */
  @javax.annotation.Nullable
  public Map<String, Integer> getOutsStat() {
    return outsStat;
  }

  public void setOutsStat(@javax.annotation.Nullable Map<String, Integer> outsStat) {
    this.outsStat = outsStat;
  }


  public InfoModel performanceData(@javax.annotation.Nullable PerformanceModel performanceData) {
    this.performanceData = performanceData;
    return this;
  }

  /**
   * Get performanceData
   * @return performanceData
   */
  @javax.annotation.Nullable
  public PerformanceModel getPerformanceData() {
    return performanceData;
  }

  public void setPerformanceData(@javax.annotation.Nullable PerformanceModel performanceData) {
    this.performanceData = performanceData;
  }


  public InfoModel offersCount(@javax.annotation.Nullable Integer offersCount) {
    this.offersCount = offersCount;
    return this;
  }

  /**
   * Get offersCount
   * @return offersCount
   */
  @javax.annotation.Nullable
  public Integer getOffersCount() {
    return offersCount;
  }

  public void setOffersCount(@javax.annotation.Nullable Integer offersCount) {
    this.offersCount = offersCount;
  }


  public InfoModel expirationMedianTimestamp(@javax.annotation.Nullable Integer expirationMedianTimestamp) {
    this.expirationMedianTimestamp = expirationMedianTimestamp;
    return this;
  }

  /**
   * Get expirationMedianTimestamp
   * @return expirationMedianTimestamp
   */
  @javax.annotation.Nullable
  public Integer getExpirationMedianTimestamp() {
    return expirationMedianTimestamp;
  }

  public void setExpirationMedianTimestamp(@javax.annotation.Nullable Integer expirationMedianTimestamp) {
    this.expirationMedianTimestamp = expirationMedianTimestamp;
  }



  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    InfoModel infoModel = (InfoModel) o;
    return Objects.equals(this.height, infoModel.height) &&
        Objects.equals(this.txCount, infoModel.txCount) &&
        Objects.equals(this.txPoolSize, infoModel.txPoolSize) &&
        Objects.equals(this.altBlocksCount, infoModel.altBlocksCount) &&
        Objects.equals(this.outgoingConnectionsCount, infoModel.outgoingConnectionsCount) &&
        Objects.equals(this.incomingConnectionsCount, infoModel.incomingConnectionsCount) &&
        Objects.equals(this.synchronizedConnectionsCount, infoModel.synchronizedConnectionsCount) &&
        Objects.equals(this.whitePeerlistSize, infoModel.whitePeerlistSize) &&
        Objects.equals(this.greyPeerlistSize, infoModel.greyPeerlistSize) &&
        Objects.equals(this.currentBlocksMedian, infoModel.currentBlocksMedian) &&
        Objects.equals(this.aliasCount, infoModel.aliasCount) &&
        Objects.equals(this.currentMaxAllowedBlockSize, infoModel.currentMaxAllowedBlockSize) &&
        Objects.equals(this.daemonNetworkState, infoModel.daemonNetworkState) &&
        Objects.equals(this.synchronizationStartHeight, infoModel.synchronizationStartHeight) &&
        Objects.equals(this.maxNetSeenHeight, infoModel.maxNetSeenHeight) &&
        Objects.equals(this.mi, infoModel.mi) &&
        Objects.equals(this.posAllowed, infoModel.posAllowed) &&
        Objects.equals(this.posDifficulty, infoModel.posDifficulty) &&
        Objects.equals(this.powDifficulty, infoModel.powDifficulty) &&
        Objects.equals(this.defaultFee, infoModel.defaultFee) &&
        Objects.equals(this.minimumFee, infoModel.minimumFee) &&
        Objects.equals(this.isHardforkActive, infoModel.isHardforkActive) &&
        Objects.equals(this.netTimeDeltaMedian, infoModel.netTimeDeltaMedian) &&
        Objects.equals(this.currentNetworkHashrate50, infoModel.currentNetworkHashrate50) &&
        Objects.equals(this.currentNetworkHashrate350, infoModel.currentNetworkHashrate350) &&
        Objects.equals(this.secondsFor10Blocks, infoModel.secondsFor10Blocks) &&
        Objects.equals(this.secondsFor30Blocks, infoModel.secondsFor30Blocks) &&
        Objects.equals(this.transactionsCntPerDay, infoModel.transactionsCntPerDay) &&
        Objects.equals(this.transactionsVolumePerDay, infoModel.transactionsVolumePerDay) &&
        Objects.equals(this.lastPosTimestamp, infoModel.lastPosTimestamp) &&
        Objects.equals(this.lastPowTimestamp, infoModel.lastPowTimestamp) &&
        Objects.equals(this.totalCoins, infoModel.totalCoins) &&
        Objects.equals(this.lastBlockSize, infoModel.lastBlockSize) &&
        Objects.equals(this.txCountInLastBlock, infoModel.txCountInLastBlock) &&
        Objects.equals(this.posSequenceFactor, infoModel.posSequenceFactor) &&
        Objects.equals(this.powSequenceFactor, infoModel.powSequenceFactor) &&
        Objects.equals(this.blockReward, infoModel.blockReward) &&
        Objects.equals(this.lastBlockTotalReward, infoModel.lastBlockTotalReward) &&
        Objects.equals(this.posDiffTotalCoinsRate, infoModel.posDiffTotalCoinsRate) &&
        Objects.equals(this.lastBlockTimestamp, infoModel.lastBlockTimestamp) &&
        Objects.equals(this.lastBlockHash, infoModel.lastBlockHash) &&
        Objects.equals(this.posBlockTsShiftVsActual, infoModel.posBlockTsShiftVsActual) &&
        Objects.equals(this.outsStat, infoModel.outsStat) &&
        Objects.equals(this.performanceData, infoModel.performanceData) &&
        Objects.equals(this.offersCount, infoModel.offersCount) &&
        Objects.equals(this.expirationMedianTimestamp, infoModel.expirationMedianTimestamp);
  }

  @Override
  public int hashCode() {
    return Objects.hash(height, txCount, txPoolSize, altBlocksCount, outgoingConnectionsCount, incomingConnectionsCount, synchronizedConnectionsCount, whitePeerlistSize, greyPeerlistSize, currentBlocksMedian, aliasCount, currentMaxAllowedBlockSize, daemonNetworkState, synchronizationStartHeight, maxNetSeenHeight, mi, posAllowed, posDifficulty, powDifficulty, defaultFee, minimumFee, isHardforkActive, netTimeDeltaMedian, currentNetworkHashrate50, currentNetworkHashrate350, secondsFor10Blocks, secondsFor30Blocks, transactionsCntPerDay, transactionsVolumePerDay, lastPosTimestamp, lastPowTimestamp, totalCoins, lastBlockSize, txCountInLastBlock, posSequenceFactor, powSequenceFactor, blockReward, lastBlockTotalReward, posDiffTotalCoinsRate, lastBlockTimestamp, lastBlockHash, posBlockTsShiftVsActual, outsStat, performanceData, offersCount, expirationMedianTimestamp);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class InfoModel {\n");
    sb.append("    height: ").append(toIndentedString(height)).append("\n");
    sb.append("    txCount: ").append(toIndentedString(txCount)).append("\n");
    sb.append("    txPoolSize: ").append(toIndentedString(txPoolSize)).append("\n");
    sb.append("    altBlocksCount: ").append(toIndentedString(altBlocksCount)).append("\n");
    sb.append("    outgoingConnectionsCount: ").append(toIndentedString(outgoingConnectionsCount)).append("\n");
    sb.append("    incomingConnectionsCount: ").append(toIndentedString(incomingConnectionsCount)).append("\n");
    sb.append("    synchronizedConnectionsCount: ").append(toIndentedString(synchronizedConnectionsCount)).append("\n");
    sb.append("    whitePeerlistSize: ").append(toIndentedString(whitePeerlistSize)).append("\n");
    sb.append("    greyPeerlistSize: ").append(toIndentedString(greyPeerlistSize)).append("\n");
    sb.append("    currentBlocksMedian: ").append(toIndentedString(currentBlocksMedian)).append("\n");
    sb.append("    aliasCount: ").append(toIndentedString(aliasCount)).append("\n");
    sb.append("    currentMaxAllowedBlockSize: ").append(toIndentedString(currentMaxAllowedBlockSize)).append("\n");
    sb.append("    daemonNetworkState: ").append(toIndentedString(daemonNetworkState)).append("\n");
    sb.append("    synchronizationStartHeight: ").append(toIndentedString(synchronizationStartHeight)).append("\n");
    sb.append("    maxNetSeenHeight: ").append(toIndentedString(maxNetSeenHeight)).append("\n");
    sb.append("    mi: ").append(toIndentedString(mi)).append("\n");
    sb.append("    posAllowed: ").append(toIndentedString(posAllowed)).append("\n");
    sb.append("    posDifficulty: ").append(toIndentedString(posDifficulty)).append("\n");
    sb.append("    powDifficulty: ").append(toIndentedString(powDifficulty)).append("\n");
    sb.append("    defaultFee: ").append(toIndentedString(defaultFee)).append("\n");
    sb.append("    minimumFee: ").append(toIndentedString(minimumFee)).append("\n");
    sb.append("    isHardforkActive: ").append(toIndentedString(isHardforkActive)).append("\n");
    sb.append("    netTimeDeltaMedian: ").append(toIndentedString(netTimeDeltaMedian)).append("\n");
    sb.append("    currentNetworkHashrate50: ").append(toIndentedString(currentNetworkHashrate50)).append("\n");
    sb.append("    currentNetworkHashrate350: ").append(toIndentedString(currentNetworkHashrate350)).append("\n");
    sb.append("    secondsFor10Blocks: ").append(toIndentedString(secondsFor10Blocks)).append("\n");
    sb.append("    secondsFor30Blocks: ").append(toIndentedString(secondsFor30Blocks)).append("\n");
    sb.append("    transactionsCntPerDay: ").append(toIndentedString(transactionsCntPerDay)).append("\n");
    sb.append("    transactionsVolumePerDay: ").append(toIndentedString(transactionsVolumePerDay)).append("\n");
    sb.append("    lastPosTimestamp: ").append(toIndentedString(lastPosTimestamp)).append("\n");
    sb.append("    lastPowTimestamp: ").append(toIndentedString(lastPowTimestamp)).append("\n");
    sb.append("    totalCoins: ").append(toIndentedString(totalCoins)).append("\n");
    sb.append("    lastBlockSize: ").append(toIndentedString(lastBlockSize)).append("\n");
    sb.append("    txCountInLastBlock: ").append(toIndentedString(txCountInLastBlock)).append("\n");
    sb.append("    posSequenceFactor: ").append(toIndentedString(posSequenceFactor)).append("\n");
    sb.append("    powSequenceFactor: ").append(toIndentedString(powSequenceFactor)).append("\n");
    sb.append("    blockReward: ").append(toIndentedString(blockReward)).append("\n");
    sb.append("    lastBlockTotalReward: ").append(toIndentedString(lastBlockTotalReward)).append("\n");
    sb.append("    posDiffTotalCoinsRate: ").append(toIndentedString(posDiffTotalCoinsRate)).append("\n");
    sb.append("    lastBlockTimestamp: ").append(toIndentedString(lastBlockTimestamp)).append("\n");
    sb.append("    lastBlockHash: ").append(toIndentedString(lastBlockHash)).append("\n");
    sb.append("    posBlockTsShiftVsActual: ").append(toIndentedString(posBlockTsShiftVsActual)).append("\n");
    sb.append("    outsStat: ").append(toIndentedString(outsStat)).append("\n");
    sb.append("    performanceData: ").append(toIndentedString(performanceData)).append("\n");
    sb.append("    offersCount: ").append(toIndentedString(offersCount)).append("\n");
    sb.append("    expirationMedianTimestamp: ").append(toIndentedString(expirationMedianTimestamp)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }


  public static HashSet<String> openapiFields;
  public static HashSet<String> openapiRequiredFields;

  static {
    // a set of all properties/fields (JSON key names)
    openapiFields = new HashSet<String>(Arrays.asList("height", "tx_count", "tx_pool_size", "alt_blocks_count", "outgoing_connections_count", "incoming_connections_count", "synchronized_connections_count", "white_peerlist_size", "grey_peerlist_size", "current_blocks_median", "alias_count", "current_max_allowed_block_size", "daemon_network_state", "synchronization_start_height", "max_net_seen_height", "mi", "pos_allowed", "pos_difficulty", "pow_difficulty", "default_fee", "minimum_fee", "is_hardfork_active", "net_time_delta_median", "current_network_hashrate_50", "current_network_hashrate_350", "seconds_for_10_blocks", "seconds_for_30_blocks", "transactions_cnt_per_day", "transactions_volume_per_day", "last_pos_timestamp", "last_pow_timestamp", "total_coins", "last_block_size", "tx_count_in_last_block", "pos_sequence_factor", "pow_sequence_factor", "block_reward", "last_block_total_reward", "pos_diff_total_coins_rate", "last_block_timestamp", "last_block_hash", "pos_block_ts_shift_vs_actual", "outs_stat", "performance_data", "offers_count", "expiration_median_timestamp"));

    // a set of required properties/fields (JSON key names)
    openapiRequiredFields = new HashSet<String>(0);
  }

  /**
   * Validates the JSON Element and throws an exception if issues found
   *
   * @param jsonElement JSON Element
   * @throws IOException if the JSON Element is invalid with respect to InfoModel
   */
  public static void validateJsonElement(JsonElement jsonElement) throws IOException {
      if (jsonElement == null) {
        if (!InfoModel.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null
          throw new IllegalArgumentException(String.format(Locale.ROOT, "The required field(s) %s in InfoModel is not found in the empty JSON string", InfoModel.openapiRequiredFields.toString()));
        }
      }

      Set<Map.Entry<String, JsonElement>> entries = jsonElement.getAsJsonObject().entrySet();
      // check to see if the JSON string contains additional fields
      for (Map.Entry<String, JsonElement> entry : entries) {
        if (!InfoModel.openapiFields.contains(entry.getKey())) {
          throw new IllegalArgumentException(String.format(Locale.ROOT, "The field `%s` in the JSON string is not defined in the `InfoModel` properties. JSON: %s", entry.getKey(), jsonElement.toString()));
        }
      }
        JsonObject jsonObj = jsonElement.getAsJsonObject();
      if ((jsonObj.get("daemon_network_state") != null && !jsonObj.get("daemon_network_state").isJsonNull()) && !jsonObj.get("daemon_network_state").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `daemon_network_state` to be a primitive type in the JSON string but got `%s`", jsonObj.get("daemon_network_state").toString()));
      }
      // validate the optional field `mi`
      if (jsonObj.get("mi") != null && !jsonObj.get("mi").isJsonNull()) {
        MaintainersInfoModel.validateJsonElement(jsonObj.get("mi"));
      }
      if ((jsonObj.get("pos_difficulty") != null && !jsonObj.get("pos_difficulty").isJsonNull()) && !jsonObj.get("pos_difficulty").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `pos_difficulty` to be a primitive type in the JSON string but got `%s`", jsonObj.get("pos_difficulty").toString()));
      }
      // ensure the optional json data is an array if present
      if (jsonObj.get("is_hardfork_active") != null && !jsonObj.get("is_hardfork_active").isJsonNull() && !jsonObj.get("is_hardfork_active").isJsonArray()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `is_hardfork_active` to be an array in the JSON string but got `%s`", jsonObj.get("is_hardfork_active").toString()));
      }
      // ensure the optional json data is an array if present
      if (jsonObj.get("transactions_cnt_per_day") != null && !jsonObj.get("transactions_cnt_per_day").isJsonNull() && !jsonObj.get("transactions_cnt_per_day").isJsonArray()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `transactions_cnt_per_day` to be an array in the JSON string but got `%s`", jsonObj.get("transactions_cnt_per_day").toString()));
      }
      // ensure the optional json data is an array if present
      if (jsonObj.get("transactions_volume_per_day") != null && !jsonObj.get("transactions_volume_per_day").isJsonNull() && !jsonObj.get("transactions_volume_per_day").isJsonArray()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `transactions_volume_per_day` to be an array in the JSON string but got `%s`", jsonObj.get("transactions_volume_per_day").toString()));
      }
      if ((jsonObj.get("total_coins") != null && !jsonObj.get("total_coins").isJsonNull()) && !jsonObj.get("total_coins").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `total_coins` to be a primitive type in the JSON string but got `%s`", jsonObj.get("total_coins").toString()));
      }
      if ((jsonObj.get("last_block_hash") != null && !jsonObj.get("last_block_hash").isJsonNull()) && !jsonObj.get("last_block_hash").isJsonPrimitive()) {
        throw new IllegalArgumentException(String.format(Locale.ROOT, "Expected the field `last_block_hash` to be a primitive type in the JSON string but got `%s`", jsonObj.get("last_block_hash").toString()));
      }
      // validate the optional field `performance_data`
      if (jsonObj.get("performance_data") != null && !jsonObj.get("performance_data").isJsonNull()) {
        PerformanceModel.validateJsonElement(jsonObj.get("performance_data"));
      }
  }

  public static class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @SuppressWarnings("unchecked")
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
       if (!InfoModel.class.isAssignableFrom(type.getRawType())) {
         return null; // this class only serializes 'InfoModel' and its subtypes
       }
       final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
       final TypeAdapter<InfoModel> thisAdapter
                        = gson.getDelegateAdapter(this, TypeToken.get(InfoModel.class));

       return (TypeAdapter<T>) new TypeAdapter<InfoModel>() {
           @Override
           public void write(JsonWriter out, InfoModel value) throws IOException {
             JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject();
             elementAdapter.write(out, obj);
           }

           @Override
           public InfoModel read(JsonReader in) throws IOException {
             JsonElement jsonElement = elementAdapter.read(in);
             validateJsonElement(jsonElement);
             return thisAdapter.fromJsonTree(jsonElement);
           }

       }.nullSafe();
    }
  }

  /**
   * Create an instance of InfoModel given an JSON string
   *
   * @param jsonString JSON string
   * @return An instance of InfoModel
   * @throws IOException if the JSON string is invalid with respect to InfoModel
   */
  public static InfoModel fromJson(String jsonString) throws IOException {
    return JSON.getGson().fromJson(jsonString, InfoModel.class);
  }

  /**
   * Convert an instance of InfoModel to an JSON string
   *
   * @return JSON string
   */
  public String toJson() {
    return JSON.getGson().toJson(this);
  }
}

