Source Code
Latest 25 from a total of 15,001 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Add Rewards | 14173671 | 2 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14173667 | 2 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14165891 | 3 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14165888 | 3 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14158664 | 4 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14158661 | 4 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14151425 | 4 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14151422 | 4 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14144181 | 5 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14144179 | 5 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14136950 | 5 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14136944 | 5 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14129517 | 6 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14129514 | 6 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14122312 | 7 days ago | IN | 0 GLMR | 0.00081816 | ||||
| Settle Tournamen... | 14122312 | 7 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14114736 | 7 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14114733 | 7 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14107065 | 8 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14107062 | 8 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14099851 | 8 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14099848 | 8 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14092276 | 9 days ago | IN | 0 GLMR | 0.00301902 | ||||
| Settle Tournamen... | 14092273 | 9 days ago | IN | 0 GLMR | 0.00585255 | ||||
| Add Rewards | 14084553 | 10 days ago | IN | 0 GLMR | 0.00301902 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PinkDrop
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.2;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**************************************************
* @title PINKDROP - alpha v2
* @author mar1dev
* @notice PINKDROP Contract. Recurring tournament with PINK rewards
**************************************************/
contract PinkDrop is Ownable(msg.sender) {
IERC20 pink;
/// @notice number of blocks for a tournament
uint256 private lockTimeTournament = 7200;
/// @notice tournament ID
uint256 public currentTournament = 416;
/// @notice game ID
uint256 public currentGame = 31822;
/// @notice PVP mode 1 game ID
uint256 public currentPvpMode1Game = 416;
/// @notice PVP mode 2 game ID
uint256 public currentPvpMode2Game = 19;
/// @notice price of a ticket
uint256 private ticketPrice = 10000000000000;
/// @notice burn % per tournament
uint256 private burnPercent = 20;
/// @notice burn addy
address private burnAddy = 0x000000000000000000000000000000000000dEaD;
/// @notice Tournament storage structure
struct Tournament {
/// @notice block when the tournament started
uint256 startBlock;
/// @notice block when the tournament ended
uint256 endBlock;
/// @notice counter for paid tickets used in this tournament
uint256 ticketsUsed;
/// @notice is the tournament over yet
bool isOver;
}
struct Game {
/// @notice player who created the match
address addy;
/// @notice final game score
uint256 score;
/// @notice block when the game started
uint256 startBlock;
/// @notice block when the game ended
uint256 endBlock;
/// @notice is the game over
bool isOver;
}
struct Player {
/// @notice number of paid tickets available
uint256 tickets;
/// @notice number of free tickets available
uint256 NFTtickets;
/// @notice PINK to claim
uint256 rewards;
}
struct Match1 {
/// @notice player who created the match
address[] participants;
/// @notice scores of the players
uint256[] scores;
/// @notice start block
uint256 startBlock;
/// @notice end block
uint256 endBlock;
/// @notice is the match already over
bool isOver;
/// @notice address of the winner
address winner;
}
struct Match2 {
/// @notice player who created the match
address[] participants;
/// @notice scores of the players
uint256[] scores;
/// @notice start block
uint256 startBlock;
/// @notice end block
uint256 endBlock;
/// @notice is the match already over
bool isOver;
/// @notice address of the winner
address winner;
/// @notice address of the 2nd winner
address secondWinner;
}
/// @notice PVP matches for logging
mapping(uint256 => Match1) public matchesMode1;
/// @notice PVP matches for logging
mapping(uint256 => Match2) public matchesMode2;
/// @notice player address -> player stats
mapping(address => Player) public players;
/// @notice game id -> game stats
mapping(uint256 => Game) public games;
/// @notice tournament id -> tournament stats
mapping(uint256 => Tournament) public tournaments;
// Mapping of tournament ID to array of game IDs
mapping(uint256 => uint256[]) public tournamentGames;
/// @notice Operator address -> True
mapping(address => bool) private admins;
/// @notice Non-reentrancy prevention
bool internal locked;
constructor() {
admins[0xdDc9320cc5C141207442D18463b0AE04512ef223] = true;
pink = IERC20(0xfFfFFfFf30478fAFBE935e466da114E14fB3563d);
tournaments[currentTournament] = Tournament(
block.number,
block.number + lockTimeTournament,
0,
false
);
}
// ========================================
// Modifiers
// ========================================
modifier onlyAdmin() {
address sender = msg.sender;
require(admins[sender] == true, "Sender not authorized.");
_;
}
modifier noReentrancy() {
require(!locked, "No re-entrancy allowed");
locked = true;
_;
locked = false;
}
// ========================================
// Events
// ========================================
event GameEntered(
address indexed player,
uint256 indexed gameId,
uint256 mode
);
event RewardsClaimed(address indexed recipient, uint256 amount);
event TicketsPurchased(address indexed buyer, uint256 amount);
event GameSettled(address indexed player, uint256 indexed gameId, uint256 score);
event TournamentSettled(
uint256 indexed tournamentId,
uint256 startBlock,
uint256 endBlock,
uint256 burnedAmount
);
event PvpMatchCreated(
address indexed player,
uint256 mode,
uint256 gameId,
uint256 startedBlock
);
// ========================================
// Public Functions
// ========================================
/**
* @notice Helper function used to determinate PVP winner
* @param array: array of scores to search in
*/
function findMaxIndex(
uint256[] memory array
) public pure returns (uint256) {
require(array.length > 0, "Array must contain at least one element");
uint256 maxIndex = 0;
for (uint256 i = 1; i < array.length; i++) {
if (array[i] > array[maxIndex]) {
maxIndex = i;
}
}
return maxIndex;
}
/**
* @notice Helper function used to determinate 2nd PVP winner
* @param array: array of scores to search in
*/
function findSecondMaxIndex(
uint256[] memory array
) public pure returns (uint256) {
require(array.length >= 2, "Array must contain at least two elements");
uint256 maxIndex = findMaxIndex(array);
uint256 secondMaxIndex = (maxIndex == 0) ? 1 : 0;
for (uint256 i = 0; i < array.length; i++) {
if (i != maxIndex && array[i] > array[secondMaxIndex]) {
secondMaxIndex = i;
}
}
return secondMaxIndex;
}
/**
* @notice Helper function used to get scores for a particular gameId
* @param _gameId: id of the game to check
* @param _mode: type of the game
*/
function getScores(
uint256 _gameId,
uint256 _mode
) internal view returns (uint256[] memory) {
if (_mode == 1) {
uint256[] memory scores = new uint256[](2);
for (uint i = 0; i < 2; i++) {
scores[i] = matchesMode1[_gameId].scores[i];
}
return scores;
} else if (_mode == 2) {
uint256[] memory scores = new uint256[](4);
for (uint i = 0; i < 4; i++) {
scores[i] = matchesMode1[_gameId].scores[i];
}
return scores;
} else {
revert("Invalid mode");
}
}
/**
* @notice Function use to initiate a game
* @param _mode: type of ticket used to play
*/
function enterGame(uint256 _mode) external {
address sender = msg.sender;
if (_mode == 1) {
require(
players[sender].tickets >= 1,
"Not enough tickets loaded in your account"
);
players[sender].tickets -= 1;
tournaments[currentTournament].ticketsUsed++;
} else if (_mode == 2) {
require(
players[sender].NFTtickets >= 1,
"Not enough NFT tickets loaded in your account"
);
players[sender].NFTtickets -= 1;
}
games[currentGame] = Game(sender, 0, block.number, 0, false);
tournamentGames[currentTournament].push(currentGame);
emit GameEntered(sender, currentGame, _mode);
currentGame++;
}
/**
* @notice Function use to enter a PvP game
* @param _mode: type of ticket used to play
* @param _gameID: id of the game to enter
*/
function enterPvpGame(uint256 _mode, uint256 _gameID) external {
address sender = msg.sender;
if (_mode == 1) {
require(
players[sender].tickets >= 2,
"Not enough tickets loaded in your account"
);
require(matchesMode1[_gameID].isOver == false, "Game is now over");
players[sender].tickets -= 2;
} else if (_mode == 2) {
require(
players[sender].tickets >= 4,
"Not enough tickets loaded in your account"
);
require(matchesMode2[_gameID].isOver == false, "Game is now over");
players[sender].tickets -= 4;
}
}
/**
* @notice Allow players to buy tickets to play
* @param _amount: number of tickets to buy
*/
function buyTickets(uint256 _amount) external {
address sender = msg.sender;
address recipient = address(this);
uint256 totalPrice = ticketPrice * _amount;
require(
pink.allowance(sender, address(this)) >= totalPrice &&
pink.transferFrom(sender, recipient, totalPrice),
"Transfer failed or Insufficient allowance"
);
players[sender].tickets += _amount;
emit TicketsPurchased(sender, _amount);
}
/**
* @notice Allow players to claim their rewards
*/
function claimRewards() external payable noReentrancy {
address sender = msg.sender;
uint256 rewards = players[sender].rewards;
require(rewards > 0, "No rewards to claim!");
pink.transfer(sender, rewards);
emit RewardsClaimed(sender, rewards);
players[sender].rewards = 0;
}
/**
* @notice Return the best games for a tournament
* @param _tournamentId: tournament to check games for
*/
function getSortedGames(
uint256 _tournamentId
) external view returns (uint256[] memory, address[] memory) {
uint256[] memory gameIds = tournamentGames[_tournamentId];
uint256[] memory sortedGameIds = new uint256[](gameIds.length);
address[] memory gamePlayers = new address[](gameIds.length);
for (uint256 i = 0; i < gameIds.length; i++) {
sortedGameIds[i] = gameIds[i];
gamePlayers[i] = games[gameIds[i]].addy;
}
for (uint256 i = 0; i < sortedGameIds.length - 1; i++) {
for (uint256 j = 0; j < sortedGameIds.length - i - 1; j++) {
if (
games[sortedGameIds[j]].score <
games[sortedGameIds[j + 1]].score
) {
(sortedGameIds[j], sortedGameIds[j + 1]) = (
sortedGameIds[j + 1],
sortedGameIds[j]
);
(gamePlayers[j], gamePlayers[j + 1]) = (
gamePlayers[j + 1],
gamePlayers[j]
);
}
}
}
return (sortedGameIds, gamePlayers);
}
/**
* @notice Return the number of block before current tournament expires
*/
function blocksLeftInTournament() external view returns (uint256) {
uint256 currentBlock = block.number;
uint256 endBlock = tournaments[currentTournament].endBlock;
if (currentBlock < endBlock) {
return endBlock - currentBlock;
} else {
return 0;
}
}
/**
* @notice Let an user create a PVP match by chosing the mode
* @param _mode: 1 for 1v1, 2 for 1v1v1v1
*/
function createPvpMatch(uint256 _mode) public payable {
address sender = msg.sender;
uint256 currentBlock = block.number;
if (_mode == 1) {
require(
players[sender].tickets >= 2,
"Not enough tickets loaded in your account"
);
players[sender].tickets -= 2;
matchesMode1[currentPvpMode1Game].startBlock = currentBlock;
emit PvpMatchCreated(
sender,
_mode,
currentPvpMode1Game,
currentBlock
);
currentPvpMode1Game++;
} else if (_mode == 2) {
require(
players[sender].tickets >= 4,
"Not enough tickets loaded in your account"
);
players[sender].tickets -= 4;
matchesMode2[currentPvpMode2Game].startBlock = currentBlock;
emit PvpMatchCreated(
sender,
_mode,
currentPvpMode2Game,
currentBlock
);
currentPvpMode2Game++;
}
}
// ========================================
// Back-End Functions
// ========================================
/**
* @notice NFTs holders get rewards with free tickets
* @dev Admin Required
* @param _playerWallet: EOW of user
* @param _amount: amount of tickets to give
* @param _mode: type of tickets to give
*/
function addTickets(
address[] memory _playerWallet,
uint256[] memory _amount,
uint256 _mode
) external onlyAdmin {
if (_mode == 1) {
for (uint256 i = 0; i < _playerWallet.length; i++) {
players[_playerWallet[i]].tickets += _amount[i];
}
} else if (_mode == 2) {
for (uint256 i = 0; i < _playerWallet.length; i++) {
players[_playerWallet[i]].NFTtickets += _amount[i];
}
}
}
/**
* @notice End a game
* @dev Admin Required
* @param _gameId: ID to set terminate
* @param _score: score of the game
*/
function settleGame(uint256 _gameId, uint256 _score) external onlyAdmin {
require(
games[_gameId].score == 0 &&
games[_gameId].endBlock == 0 &&
games[_gameId].isOver == false,
"Game already saved"
);
games[_gameId].score = _score;
games[_gameId].endBlock = block.number;
games[_gameId].isOver = true;
emit GameSettled(games[_gameId].addy, _gameId, _score);
}
/**
* @notice End a PVP match
* @dev Admin Required
* @param _gameId: ID of match to set terminate
* @param _mode: type of the match
*/
function settleMatch(
uint256 _mode,
uint256 _gameId
) public payable onlyAdmin {
uint256 currentBlock = block.number;
if (_mode == 1) {
uint256 maxIndex = findMaxIndex(getScores(_gameId, 1));
address winner = matchesMode1[_gameId].participants[maxIndex];
matchesMode1[_gameId].isOver = true;
matchesMode1[_gameId].endBlock = currentBlock;
matchesMode1[_gameId].winner = winner;
pink.transfer(burnAddy, 8000000000000);
pink.transfer(winner, 32000000000000);
} else if (_mode == 2) {
uint256 maxIndex = findMaxIndex(getScores(_gameId, 2));
uint256 secondMaxIndex = findSecondMaxIndex(getScores(_gameId, 2));
address winner = matchesMode2[_gameId].participants[maxIndex];
address secondWinner = matchesMode2[_gameId].participants[
secondMaxIndex
];
matchesMode2[_gameId].isOver = true;
matchesMode2[_gameId].endBlock = currentBlock;
matchesMode2[_gameId].winner = winner;
matchesMode2[_gameId].secondWinner = secondWinner;
pink.transfer(burnAddy, 16000000000000);
pink.transfer(winner, 104000000000000);
pink.transfer(secondWinner, 40000000000000);
}
}
/**
* @notice Add a score to a match
* @dev Admin Required
* @param _mode: 1 or 2
* @param _gameId: ID of Match to set terminate
* @param _score: score of the game
* @param _player: participant address
*/
function addScoreMatch(
uint256 _mode,
uint256 _gameId,
uint256 _score,
address _player
) external payable onlyAdmin {
if (_mode == 1) {
matchesMode1[_gameId].participants.push(_player);
matchesMode1[_gameId].scores.push(_score);
if (matchesMode1[_gameId].scores.length == 2) {
settleMatch(_mode, _gameId);
}
} else if (_mode == 2) {
matchesMode2[_gameId].participants.push(_player);
matchesMode2[_gameId].scores.push(_score);
if (matchesMode2[_gameId].scores.length == 4) {
settleMatch(_mode, _gameId);
}
}
}
/**
* @notice End the current tournament and start the new one
* @dev Admin Required
*/
function settleTournament() public payable onlyAdmin {
require(
tournaments[currentTournament].endBlock <= block.number,
"Tournament not over"
);
require(
tournaments[currentTournament].isOver == false,
"Tournament not over"
);
tournaments[currentTournament].isOver = true;
uint256 totalTicketsUsed = tournaments[currentTournament].ticketsUsed;
uint256 burnAmount = (totalTicketsUsed * ticketPrice * burnPercent) /
100;
pink.transfer(burnAddy, burnAmount);
emit TournamentSettled(
currentTournament,
block.number,
block.number + lockTimeTournament,
burnAmount
);
tournaments[currentTournament + 1] = Tournament(
block.number,
block.number + lockTimeTournament,
0,
false
);
currentTournament++;
}
/**
* @notice Add rewards for players after a tournament ends
* @dev Admin Required
* @param _players: array of players from last tournament
* @param _pinkToAdd: PINK rewards to add
*/
function addRewards(
address[] memory _players,
uint256[] memory _pinkToAdd
) public payable onlyAdmin {
for (uint256 i = 0; i < _players.length; i++) {
players[_players[i]].rewards += _pinkToAdd[i];
}
}
// ========================================
// Owner Functions
// ========================================
/**
* @notice Used by core team to withdraw rewards
* @dev Owner required.
* @param _token: token address to withdraw
* @param _amount: amount of tokens to withdraw
*/
function adminWithdraw(
address _token,
uint256 _amount
) public payable onlyOwner {
address payable payable_addr = payable(msg.sender);
if (_token == address(0x0)) {
payable_addr.transfer(_amount);
return;
}
IERC20 token = IERC20(_token);
token.transfer(msg.sender, _amount);
}
/**
* @notice Set a new ticket price
* @dev Owner required.
* @param _amount: new amount
*/
function setTicketPrice(uint256 _amount) public payable onlyOwner {
ticketPrice = _amount;
}
/**
* @notice Set a wallet address to admin status.
* Owner required.
* @param _admin: new admin to invite
*/
function setNewAdmin(address _admin) public onlyOwner {
admins[_admin] = true;
}
/**
* @notice Set the regular lock time for NFTs
* @dev Owner required.
* @param _newLock: new lock in block number to set
*/
function setTournamentTime(uint256 _newLock) public onlyOwner {
lockTimeTournament = _newLock;
}
/**
* @notice Set the % for burn
* @dev Owner required.
*/
function setDistribution(
uint256 _newPercent
) public onlyOwner {
burnPercent = _newPercent;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"}],"name":"GameEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"score","type":"uint256"}],"name":"GameSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"mode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startedBlock","type":"uint256"}],"name":"PvpMatchCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TicketsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"name":"TournamentSettled","type":"event"},{"inputs":[{"internalType":"address[]","name":"_players","type":"address[]"},{"internalType":"uint256[]","name":"_pinkToAdd","type":"uint256[]"}],"name":"addRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"uint256","name":"_score","type":"uint256"},{"internalType":"address","name":"_player","type":"address"}],"name":"addScoreMatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_playerWallet","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"addTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adminWithdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"blocksLeftInTournament","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"createPvpMatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPvpMode1Game","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPvpMode2Game","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTournament","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"}],"name":"enterGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"},{"internalType":"uint256","name":"_gameID","type":"uint256"}],"name":"enterPvpGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"array","type":"uint256[]"}],"name":"findMaxIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"array","type":"uint256[]"}],"name":"findSecondMaxIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bool","name":"isOver","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tournamentId","type":"uint256"}],"name":"getSortedGames","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"matchesMode1","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bool","name":"isOver","type":"bool"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"matchesMode2","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bool","name":"isOver","type":"bool"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"address","name":"secondWinner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"players","outputs":[{"internalType":"uint256","name":"tickets","type":"uint256"},{"internalType":"uint256","name":"NFTtickets","type":"uint256"},{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPercent","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setNewAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTicketPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLock","type":"uint256"}],"name":"setTournamentTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"uint256","name":"_score","type":"uint256"}],"name":"settleGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mode","type":"uint256"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"settleMatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"settleTournament","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tournamentGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tournaments","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"ticketsUsed","type":"uint256"},{"internalType":"bool","name":"isOver","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052611c206002556101a06003819055617c4e60045560055560136006556509184e72a0006007556014600855600980546001600160a01b03191661dead1790553480156200004f575f80fd5b5033806200007657604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000818162000169565b5073ddc9320cc5c141207442d18463b0ae04512ef2235f52601060209081527fb7c9d315ef18e31be165e38096632a15b266836c67061475570d7da23e480440805460ff1916600190811790915580546001600160a01b03191673ffffffff30478fafbe935e466da114e14fb3563d17905560408051608081019091524380825260025491928301916200011591620001b8565b81525f60208083018290526040928301829052600380548352600e825291839020845181559084015160018201559183015160028301556060909201519101805460ff1916911515919091179055620001de565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80820180821115620001d857634e487b7160e01b5f52601160045260245ffd5b92915050565b61293980620001ec5f395ff3fe6080604052600436106101e6575f3560e01c806360b663bb116101085780639ff930881161009d578063e2eb41ff1161006d578063e2eb41ff14610643578063e3635f1e14610698578063e85d2289146106ac578063f2fde38b146106d9578063fc751155146106f8575f80fd5b80639ff93088146105ea578063af37182114610609578063d30e14d214610611578063d99887a414610624575f80fd5b806388ab862f116100d857806388ab862f146105735780638c03a9a1146105865780638da5cb5b146105a55780638eec99c8146105cb575f80fd5b806360b663bb14610454578063715018a6146104695780637503e1b71461047d57806384d4a904146104e2575f80fd5b8063372500ab1161017e578063550d03201161014e578063550d0320146103f0578063595a90f2146104035780635a922caa14610416578063600c882714610435575f80fd5b8063372500ab146103a1578063401d4482146103a957806343d6582b146103bc578063441a4fdf146103db575f80fd5b806318bc53bd116101b957806318bc53bd1461032f57806320b4d2a41461034e5780632f3666371461036d5780632f50d6dc1461038c575f80fd5b80630c48ebb8146101ea578063117a5b901461026e578063155b3aeb146102f7578063159816501461031a575b5f80fd5b3480156101f5575f80fd5b5061023a61020436600461242f565b600a6020525f908152604090206002810154600382015460049092015490919060ff81169061010090046001600160a01b031684565b604080519485526020850193909352901515918301919091526001600160a01b031660608201526080015b60405180910390f35b348015610279575f80fd5b506102c361028836600461242f565b600d6020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919060ff1685565b604080516001600160a01b03909616865260208601949094529284019190915260608301521515608082015260a001610265565b348015610302575f80fd5b5061030c60055481565b604051908152602001610265565b61032d61032836600461242f565b610717565b005b34801561033a575f80fd5b5061032d610349366004612590565b610724565b348015610359575f80fd5b5061032d6103683660046125f8565b610891565b348015610378575f80fd5b5061032d61038736600461242f565b610a21565b348015610397575f80fd5b5061030c60035481565b61032d610bff565b61032d6103b7366004612618565b610d8d565b3480156103c7575f80fd5b5061032d6103d636600461242f565b610e47565b3480156103e6575f80fd5b5061030c60065481565b61032d6103fe3660046125f8565b61108f565b61032d610411366004612640565b6114aa565b348015610421575f80fd5b5061030c6104303660046126a0565b611567565b348015610440575f80fd5b5061032d61044f36600461242f565b61162c565b34801561045f575f80fd5b5061030c60045481565b348015610474575f80fd5b5061032d611639565b348015610488575f80fd5b506104c061049736600461242f565b600e6020525f908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610265565b3480156104ed575f80fd5b5061053c6104fc36600461242f565b600b6020525f908152604090206002810154600382015460048301546005909301549192909160ff8216916001600160a01b036101009091048116911685565b604080519586526020860194909452911515928401929092526001600160a01b03918216606084015216608082015260a001610265565b61032d61058136600461242f565b61164c565b348015610591575f80fd5b5061030c6105a03660046126a0565b611817565b3480156105b0575f80fd5b505f546040516001600160a01b039091168152602001610265565b3480156105d6575f80fd5b5061032d6105e53660046126da565b61190b565b3480156105f5575f80fd5b5061032d6106043660046125f8565b611936565b61032d611a63565b61032d61061f3660046126fa565b611cfa565b34801561062f575f80fd5b5061030c61063e3660046125f8565b611e0a565b34801561064e575f80fd5b5061067d61065d3660046126da565b600c6020525f908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b3480156106a3575f80fd5b5061030c611e35565b3480156106b7575f80fd5b506106cb6106c636600461242f565b611e6c565b604051610265929190612736565b3480156106e4575f80fd5b5061032d6106f33660046126da565b612207565b348015610703575f80fd5b5061032d61071236600461242f565b612244565b61071f612251565b600755565b335f8181526010602052604090205460ff1615156001146107605760405162461bcd60e51b8152600401610757906127b8565b60405180910390fd5b816001036107f7575f5b84518110156107f157838181518110610785576107856127e8565b6020026020010151600c5f8784815181106107a2576107a26127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f8282546107d99190612810565b909155508190506107e981612823565b91505061076a565b5061088b565b8160020361088b575f5b84518110156108895783818151811061081c5761081c6127e8565b6020026020010151600c5f878481518110610839576108396127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206001015f8282546108719190612810565b9091555081905061088181612823565b915050610801565b505b50505050565b33600183900361095a576001600160a01b0381165f908152600c6020526040902054600211156108d35760405162461bcd60e51b81526004016107579061283b565b5f828152600a602052604090206004015460ff16156109275760405162461bcd60e51b815260206004820152601060248201526f23b0b6b29034b9903737bb9037bb32b960811b6044820152606401610757565b6001600160a01b0381165f908152600c6020526040812080546002929061094f908490612884565b90915550610a1c9050565b82600203610a1c576001600160a01b0381165f908152600c60205260409020546004111561099a5760405162461bcd60e51b81526004016107579061283b565b5f828152600b602052604090206004015460ff16156109ee5760405162461bcd60e51b815260206004820152601060248201526f23b0b6b29034b9903737bb9037bb32b960811b6044820152606401610757565b6001600160a01b0381165f908152600c60205260408120805460049290610a16908490612884565b90915550505b505050565b600754339030905f90610a35908590612897565b600154604051636eb1769f60e11b81526001600160a01b03868116600483015230602483015292935083929091169063dd62ed3e90604401602060405180830381865afa158015610a88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aac91906128ae565b10158015610b3157506001546040516323b872dd60e01b81526001600160a01b038581166004830152848116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015610b0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3191906128c5565b610b8f5760405162461bcd60e51b815260206004820152602960248201527f5472616e73666572206661696c6564206f7220496e73756666696369656e7420604482015268616c6c6f77616e636560b81b6064820152608401610757565b6001600160a01b0383165f908152600c602052604081208054869290610bb6908490612810565b90915550506040518481526001600160a01b038416907fe11731cb4f1eb3ec3dd09bdc96809bb07365f4c881cda3192b397a4bc0b6da409060200160405180910390a250505050565b60115460ff1615610c4b5760405162461bcd60e51b8152602060048201526016602482015275139bc81c994b595b9d1c985b98de48185b1b1bddd95960521b6044820152606401610757565b6011805460ff19166001179055335f818152600c602052604090206002015480610cae5760405162461bcd60e51b81526020600482015260146024820152734e6f207265776172647320746f20636c61696d2160601b6044820152606401610757565b60015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610cfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2291906128c5565b50816001600160a01b03167ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe82604051610d5e91815260200190565b60405180910390a2506001600160a01b03165f908152600c60205260408120600201556011805460ff19169055565b610d95612251565b336001600160a01b038316610dd7576040516001600160a01b0382169083156108fc029084905f818181858888f1935050505015801561088b573d5f803e3d5ffd5b60405163a9059cbb60e01b81523360048201526024810183905283906001600160a01b0382169063a9059cbb906044016020604051808303815f875af1158015610e23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088991906128c5565b336001829003610edf576001600160a01b0381165f908152600c602052604090205460011115610e895760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0381165f908152600c60205260408120805460019290610eb1908490612884565b90915550506003545f908152600e60205260408120600201805491610ed583612823565b9190505550610f9b565b81600203610f9b576001600160a01b0381165f908152600c602052604090206001908101541015610f685760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f756768204e4654207469636b657473206c6f6164656420696e60448201526c081e5bdd5c881858d8dbdd5b9d609a1b6064820152608401610757565b6001600160a01b0381165f908152600c602052604081206001908101805491929091610f95908490612884565b90915550505b6040805160a0810182526001600160a01b038381168083525f6020808501828152438688019081526060870184815260808801858152600480548752600d86528a872099518a546001600160a01b031916991698909817895592516001808a019190915591516002890155516003808901919091559151968601805460ff191697151597909717909655548252600f815285822084548154968701825590835291819020909401559054925185815290917f9a1a3c45c9a593fe515b398aac3639ed6ac33d78b8c7eeb8f81241e8ecf65ee9910160405180910390a360048054905f61108683612823565b91905055505050565b335f8181526010602052604090205460ff1615156001146110c25760405162461bcd60e51b8152600401610757906127b8565b436001849003611248575f6110db61043085600161227d565b5f858152600a6020526040812080549293509091839081106110ff576110ff6127e8565b5f91825260208083209190910154878352600a9091526040918290206004808201805460039093018890556001600160a01b0393841661010081026001600160a81b031990941693909317600190811790915554600954945163a9059cbb60e01b815294841691850191909152650746a52880006024850152909350169063a9059cbb906044016020604051808303815f875af11580156111a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c691906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b038381166004830152651d1a94a2000060248301529091169063a9059cbb906044016020604051808303815f875af115801561121c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124091906128c5565b50505061088b565b8360020361088b575f61125f61043085600261227d565b90505f6112706105a086600261227d565b5f868152600b602052604081208054929350909184908110611294576112946127e8565b5f918252602080832090910154888352600b9091526040822080546001600160a01b03909216935090849081106112cd576112cd6127e8565b5f91825260208083209190910154898352600b90915260409182902060048082018054600384018b90556001600160a01b03888116610100026001600160a81b0319909216919091176001908117909255600590930180546001600160a01b031916948416948517905554600954945163a9059cbb60e01b815294831691850191909152650e8d4a5100006024850152919350169063a9059cbb906044016020604051808303815f875af1158015611387573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab91906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b038481166004830152655e96630e800060248301529091169063a9059cbb906044016020604051808303815f875af1158015611401573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142591906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b03838116600483015265246139ca800060248301529091169063a9059cbb906044016020604051808303815f875af115801561147b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906128c5565b505050505050505050565b335f8181526010602052604090205460ff1615156001146114dd5760405162461bcd60e51b8152600401610757906127b8565b5f5b835181101561088b578281815181106114fa576114fa6127e8565b6020026020010151600c5f868481518110611517576115176127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206002015f82825461154f9190612810565b9091555081905061155f81612823565b9150506114df565b5f808251116115c85760405162461bcd60e51b815260206004820152602760248201527f4172726179206d75737420636f6e7461696e206174206c65617374206f6e6520604482015266195b195b595b9d60ca1b6064820152608401610757565b5f60015b8351811015611625578382815181106115e7576115e76127e8565b6020026020010151848281518110611601576116016127e8565b60200260200101511115611613578091505b8061161d81612823565b9150506115cc565b5092915050565b611634612251565b600255565b611641612251565b61164a5f6123e0565b565b33436001839003611738576001600160a01b0382165f908152600c60205260409020546002111561168f5760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0382165f908152600c602052604081208054600292906116b7908490612884565b9091555050600580545f908152600a6020908152604091829020600201849055915481518681529283015281018290526001600160a01b038316907f8d9f83849857ceaf892550c3236854ed313894d04f07d3a76725afc7a2235a379060600160405180910390a260058054905f61172e83612823565b9190505550505050565b82600203610a1c576001600160a01b0382165f908152600c6020526040902054600411156117785760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0382165f908152600c602052604081208054600492906117a0908490612884565b9091555050600680545f908152600b6020908152604091829020600201849055915481518681529283015281018290526001600160a01b038316907f8d9f83849857ceaf892550c3236854ed313894d04f07d3a76725afc7a2235a379060600160405180910390a260068054905f61172e83612823565b5f60028251101561187b5760405162461bcd60e51b815260206004820152602860248201527f4172726179206d75737420636f6e7461696e206174206c656173742074776f20604482015267656c656d656e747360c01b6064820152608401610757565b5f61188583611567565b90505f8115611894575f611897565b60015b60ff1690505f5b8451811015611903578281141580156118e857508482815181106118c4576118c46127e8565b60200260200101518582815181106118de576118de6127e8565b6020026020010151115b156118f1578091505b806118fb81612823565b91505061189e565b509392505050565b611913612251565b6001600160a01b03165f908152601060205260409020805460ff19166001179055565b335f8181526010602052604090205460ff1615156001146119695760405162461bcd60e51b8152600401610757906127b8565b5f838152600d602052604090206001015415801561199557505f838152600d6020526040902060030154155b80156119b257505f838152600d602052604090206004015460ff16155b6119f35760405162461bcd60e51b815260206004820152601260248201527111d85b5948185b1c9958591e481cd85d995960721b6044820152606401610757565b5f838152600d6020908152604091829020600180820186905543600383015560048201805460ff1916909117905554915184815285926001600160a01b0316917f3f9816b7851af3e5a818edbae74a83371dae8fd137d3e6353ad90befdb227cc8910160405180910390a3505050565b335f8181526010602052604090205460ff161515600114611a965760405162461bcd60e51b8152600401610757906127b8565b6003545f908152600e6020526040902060010154431015611aef5760405162461bcd60e51b81526020600482015260136024820152722a37bab93730b6b2b73a103737ba1037bb32b960691b6044820152606401610757565b600380545f908152600e60205260409020015460ff1615611b485760405162461bcd60e51b81526020600482015260136024820152722a37bab93730b6b2b73a103737ba1037bb32b960691b6044820152606401610757565b600380545f908152600e60205260408082208301805460ff19166001179055915481529081206002015460085460075491929160649190611b899085612897565b611b939190612897565b611b9d91906128e4565b60015460095460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1591906128c5565b506003547fde4041d130541c757b9ac932998643c84f40122ddc15d1cddb09ab61bad2cf854360025443611c499190612810565b604080519283526020830191909152810184905260600160405180910390a2604051806080016040528043815260200160025443611c879190612810565b81526020015f81526020015f1515815250600e5f6003546001611caa9190612810565b815260208082019290925260409081015f908120845181559284015160018401559083015160028301556060909201516003918201805460ff191691151591909117905580549161172e83612823565b335f8181526010602052604090205460ff161515600114611d2d5760405162461bcd60e51b8152600401610757906127b8565b84600103611d9e575f848152600a60209081526040822080546001808201835582855283852090910180546001600160a01b0319166001600160a01b03881617905590810180549182018155808452918320018590559085905254600203611d9957611d99858561108f565b610889565b84600203610889575f848152600b60209081526040822080546001808201835582855283852090910180546001600160a01b0319166001600160a01b0388161790559081018054918201815580845291832001859055908590525460040361088957610889858561108f565b600f602052815f5260405f208181548110611e23575f80fd5b905f5260205f20015f91509150505481565b6003545f908152600e6020526040812060010154439080821015611e6457611e5d8282612884565b9250505090565b5f9250505090565b6060805f600f5f8581526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611ec957602002820191905f5260205f20905b815481526020019060010190808311611eb5575b505050505090505f815167ffffffffffffffff811115611eeb57611eeb612446565b604051908082528060200260200182016040528015611f14578160200160208202803683370190505b5090505f825167ffffffffffffffff811115611f3257611f32612446565b604051908082528060200260200182016040528015611f5b578160200160208202803683370190505b5090505f5b835181101561201c57838181518110611f7b57611f7b6127e8565b6020026020010151838281518110611f9557611f956127e8565b602002602001018181525050600d5f858381518110611fb657611fb66127e8565b602002602001015181526020019081526020015f205f015f9054906101000a90046001600160a01b0316828281518110611ff257611ff26127e8565b6001600160a01b03909216602092830291909101909101528061201481612823565b915050611f60565b505f5b6001835161202d9190612884565b8110156121fb575f5b60018285516120459190612884565b61204f9190612884565b8110156121e857600d5f85612065846001612810565b81518110612075576120756127e8565b602002602001015181526020019081526020015f2060010154600d5f8684815181106120a3576120a36127e8565b602002602001015181526020019081526020015f206001015410156121d657836120ce826001612810565b815181106120de576120de6127e8565b60200260200101518482815181106120f8576120f86127e8565b6020026020010151858381518110612112576121126127e8565b60200260200101868460016121279190612810565b81518110612137576121376127e8565b60209081029190910101919091525282612152826001612810565b81518110612162576121626127e8565b602002602001015183828151811061217c5761217c6127e8565b6020026020010151848381518110612196576121966127e8565b60200260200101858460016121ab9190612810565b815181106121bb576121bb6127e8565b6001600160a01b039384166020918202929092010152911690525b806121e081612823565b915050612036565b50806121f381612823565b91505061201f565b50909590945092505050565b61220f612251565b6001600160a01b03811661223857604051631e4fbdf760e01b81525f6004820152602401610757565b612241816123e0565b50565b61224c612251565b600855565b5f546001600160a01b0316331461164a5760405163118cdaa760e01b8152336004820152602401610757565b606081600103612314576040805160028082526060820183525f926020830190803683370190505090505f5b600281101561230c575f858152600a602052604090206001018054829081106122d4576122d46127e8565b905f5260205f2001548282815181106122ef576122ef6127e8565b60209081029190910101528061230481612823565b9150506122a9565b5090506123da565b816002036123a35760408051600480825260a082019092525f91602082016080803683370190505090505f5b600481101561230c575f858152600a6020526040902060010180548290811061236b5761236b6127e8565b905f5260205f200154828281518110612386576123866127e8565b60209081029190910101528061239b81612823565b915050612340565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d6f646560a01b6044820152606401610757565b92915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561243f575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561248357612483612446565b604052919050565b5f67ffffffffffffffff8211156124a4576124a4612446565b5060051b60200190565b80356001600160a01b03811681146124c4575f80fd5b919050565b5f82601f8301126124d8575f80fd5b813560206124ed6124e88361248b565b61245a565b82815260059290921b8401810191818101908684111561250b575f80fd5b8286015b8481101561252d57612520816124ae565b835291830191830161250f565b509695505050505050565b5f82601f830112612547575f80fd5b813560206125576124e88361248b565b82815260059290921b84018101918181019086841115612575575f80fd5b8286015b8481101561252d5780358352918301918301612579565b5f805f606084860312156125a2575f80fd5b833567ffffffffffffffff808211156125b9575f80fd5b6125c5878388016124c9565b945060208601359150808211156125da575f80fd5b506125e786828701612538565b925050604084013590509250925092565b5f8060408385031215612609575f80fd5b50508035926020909101359150565b5f8060408385031215612629575f80fd5b612632836124ae565b946020939093013593505050565b5f8060408385031215612651575f80fd5b823567ffffffffffffffff80821115612668575f80fd5b612674868387016124c9565b93506020850135915080821115612689575f80fd5b5061269685828601612538565b9150509250929050565b5f602082840312156126b0575f80fd5b813567ffffffffffffffff8111156126c6575f80fd5b6126d284828501612538565b949350505050565b5f602082840312156126ea575f80fd5b6126f3826124ae565b9392505050565b5f805f806080858703121561270d575f80fd5b84359350602085013592506040850135915061272b606086016124ae565b905092959194509250565b604080825283519082018190525f906020906060840190828701845b8281101561276e57815184529284019290840190600101612752565b505050838103828501528451808252858301918301905f5b818110156127ab5783516001600160a01b031683529284019291840191600101612786565b5090979650505050505050565b60208082526016908201527529b2b73232b9103737ba1030baba3437b934bd32b21760511b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156123da576123da6127fc565b5f60018201612834576128346127fc565b5060010190565b60208082526029908201527f4e6f7420656e6f756768207469636b657473206c6f6164656420696e20796f756040820152681c881858d8dbdd5b9d60ba1b606082015260800190565b818103818111156123da576123da6127fc565b80820281158282048414176123da576123da6127fc565b5f602082840312156128be575f80fd5b5051919050565b5f602082840312156128d5575f80fd5b815180151581146126f3575f80fd5b5f826128fe57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212202f69dd68b47b712afde610d8efbf38847f0739fa9372b85bb63f39bf1fa3415d64736f6c63430008140033
Deployed Bytecode
0x6080604052600436106101e6575f3560e01c806360b663bb116101085780639ff930881161009d578063e2eb41ff1161006d578063e2eb41ff14610643578063e3635f1e14610698578063e85d2289146106ac578063f2fde38b146106d9578063fc751155146106f8575f80fd5b80639ff93088146105ea578063af37182114610609578063d30e14d214610611578063d99887a414610624575f80fd5b806388ab862f116100d857806388ab862f146105735780638c03a9a1146105865780638da5cb5b146105a55780638eec99c8146105cb575f80fd5b806360b663bb14610454578063715018a6146104695780637503e1b71461047d57806384d4a904146104e2575f80fd5b8063372500ab1161017e578063550d03201161014e578063550d0320146103f0578063595a90f2146104035780635a922caa14610416578063600c882714610435575f80fd5b8063372500ab146103a1578063401d4482146103a957806343d6582b146103bc578063441a4fdf146103db575f80fd5b806318bc53bd116101b957806318bc53bd1461032f57806320b4d2a41461034e5780632f3666371461036d5780632f50d6dc1461038c575f80fd5b80630c48ebb8146101ea578063117a5b901461026e578063155b3aeb146102f7578063159816501461031a575b5f80fd5b3480156101f5575f80fd5b5061023a61020436600461242f565b600a6020525f908152604090206002810154600382015460049092015490919060ff81169061010090046001600160a01b031684565b604080519485526020850193909352901515918301919091526001600160a01b031660608201526080015b60405180910390f35b348015610279575f80fd5b506102c361028836600461242f565b600d6020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919060ff1685565b604080516001600160a01b03909616865260208601949094529284019190915260608301521515608082015260a001610265565b348015610302575f80fd5b5061030c60055481565b604051908152602001610265565b61032d61032836600461242f565b610717565b005b34801561033a575f80fd5b5061032d610349366004612590565b610724565b348015610359575f80fd5b5061032d6103683660046125f8565b610891565b348015610378575f80fd5b5061032d61038736600461242f565b610a21565b348015610397575f80fd5b5061030c60035481565b61032d610bff565b61032d6103b7366004612618565b610d8d565b3480156103c7575f80fd5b5061032d6103d636600461242f565b610e47565b3480156103e6575f80fd5b5061030c60065481565b61032d6103fe3660046125f8565b61108f565b61032d610411366004612640565b6114aa565b348015610421575f80fd5b5061030c6104303660046126a0565b611567565b348015610440575f80fd5b5061032d61044f36600461242f565b61162c565b34801561045f575f80fd5b5061030c60045481565b348015610474575f80fd5b5061032d611639565b348015610488575f80fd5b506104c061049736600461242f565b600e6020525f908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610265565b3480156104ed575f80fd5b5061053c6104fc36600461242f565b600b6020525f908152604090206002810154600382015460048301546005909301549192909160ff8216916001600160a01b036101009091048116911685565b604080519586526020860194909452911515928401929092526001600160a01b03918216606084015216608082015260a001610265565b61032d61058136600461242f565b61164c565b348015610591575f80fd5b5061030c6105a03660046126a0565b611817565b3480156105b0575f80fd5b505f546040516001600160a01b039091168152602001610265565b3480156105d6575f80fd5b5061032d6105e53660046126da565b61190b565b3480156105f5575f80fd5b5061032d6106043660046125f8565b611936565b61032d611a63565b61032d61061f3660046126fa565b611cfa565b34801561062f575f80fd5b5061030c61063e3660046125f8565b611e0a565b34801561064e575f80fd5b5061067d61065d3660046126da565b600c6020525f908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610265565b3480156106a3575f80fd5b5061030c611e35565b3480156106b7575f80fd5b506106cb6106c636600461242f565b611e6c565b604051610265929190612736565b3480156106e4575f80fd5b5061032d6106f33660046126da565b612207565b348015610703575f80fd5b5061032d61071236600461242f565b612244565b61071f612251565b600755565b335f8181526010602052604090205460ff1615156001146107605760405162461bcd60e51b8152600401610757906127b8565b60405180910390fd5b816001036107f7575f5b84518110156107f157838181518110610785576107856127e8565b6020026020010151600c5f8784815181106107a2576107a26127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f015f8282546107d99190612810565b909155508190506107e981612823565b91505061076a565b5061088b565b8160020361088b575f5b84518110156108895783818151811061081c5761081c6127e8565b6020026020010151600c5f878481518110610839576108396127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206001015f8282546108719190612810565b9091555081905061088181612823565b915050610801565b505b50505050565b33600183900361095a576001600160a01b0381165f908152600c6020526040902054600211156108d35760405162461bcd60e51b81526004016107579061283b565b5f828152600a602052604090206004015460ff16156109275760405162461bcd60e51b815260206004820152601060248201526f23b0b6b29034b9903737bb9037bb32b960811b6044820152606401610757565b6001600160a01b0381165f908152600c6020526040812080546002929061094f908490612884565b90915550610a1c9050565b82600203610a1c576001600160a01b0381165f908152600c60205260409020546004111561099a5760405162461bcd60e51b81526004016107579061283b565b5f828152600b602052604090206004015460ff16156109ee5760405162461bcd60e51b815260206004820152601060248201526f23b0b6b29034b9903737bb9037bb32b960811b6044820152606401610757565b6001600160a01b0381165f908152600c60205260408120805460049290610a16908490612884565b90915550505b505050565b600754339030905f90610a35908590612897565b600154604051636eb1769f60e11b81526001600160a01b03868116600483015230602483015292935083929091169063dd62ed3e90604401602060405180830381865afa158015610a88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aac91906128ae565b10158015610b3157506001546040516323b872dd60e01b81526001600160a01b038581166004830152848116602483015260448201849052909116906323b872dd906064016020604051808303815f875af1158015610b0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3191906128c5565b610b8f5760405162461bcd60e51b815260206004820152602960248201527f5472616e73666572206661696c6564206f7220496e73756666696369656e7420604482015268616c6c6f77616e636560b81b6064820152608401610757565b6001600160a01b0383165f908152600c602052604081208054869290610bb6908490612810565b90915550506040518481526001600160a01b038416907fe11731cb4f1eb3ec3dd09bdc96809bb07365f4c881cda3192b397a4bc0b6da409060200160405180910390a250505050565b60115460ff1615610c4b5760405162461bcd60e51b8152602060048201526016602482015275139bc81c994b595b9d1c985b98de48185b1b1bddd95960521b6044820152606401610757565b6011805460ff19166001179055335f818152600c602052604090206002015480610cae5760405162461bcd60e51b81526020600482015260146024820152734e6f207265776172647320746f20636c61696d2160601b6044820152606401610757565b60015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610cfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2291906128c5565b50816001600160a01b03167ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe82604051610d5e91815260200190565b60405180910390a2506001600160a01b03165f908152600c60205260408120600201556011805460ff19169055565b610d95612251565b336001600160a01b038316610dd7576040516001600160a01b0382169083156108fc029084905f818181858888f1935050505015801561088b573d5f803e3d5ffd5b60405163a9059cbb60e01b81523360048201526024810183905283906001600160a01b0382169063a9059cbb906044016020604051808303815f875af1158015610e23573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088991906128c5565b336001829003610edf576001600160a01b0381165f908152600c602052604090205460011115610e895760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0381165f908152600c60205260408120805460019290610eb1908490612884565b90915550506003545f908152600e60205260408120600201805491610ed583612823565b9190505550610f9b565b81600203610f9b576001600160a01b0381165f908152600c602052604090206001908101541015610f685760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f756768204e4654207469636b657473206c6f6164656420696e60448201526c081e5bdd5c881858d8dbdd5b9d609a1b6064820152608401610757565b6001600160a01b0381165f908152600c602052604081206001908101805491929091610f95908490612884565b90915550505b6040805160a0810182526001600160a01b038381168083525f6020808501828152438688019081526060870184815260808801858152600480548752600d86528a872099518a546001600160a01b031916991698909817895592516001808a019190915591516002890155516003808901919091559151968601805460ff191697151597909717909655548252600f815285822084548154968701825590835291819020909401559054925185815290917f9a1a3c45c9a593fe515b398aac3639ed6ac33d78b8c7eeb8f81241e8ecf65ee9910160405180910390a360048054905f61108683612823565b91905055505050565b335f8181526010602052604090205460ff1615156001146110c25760405162461bcd60e51b8152600401610757906127b8565b436001849003611248575f6110db61043085600161227d565b5f858152600a6020526040812080549293509091839081106110ff576110ff6127e8565b5f91825260208083209190910154878352600a9091526040918290206004808201805460039093018890556001600160a01b0393841661010081026001600160a81b031990941693909317600190811790915554600954945163a9059cbb60e01b815294841691850191909152650746a52880006024850152909350169063a9059cbb906044016020604051808303815f875af11580156111a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c691906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b038381166004830152651d1a94a2000060248301529091169063a9059cbb906044016020604051808303815f875af115801561121c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124091906128c5565b50505061088b565b8360020361088b575f61125f61043085600261227d565b90505f6112706105a086600261227d565b5f868152600b602052604081208054929350909184908110611294576112946127e8565b5f918252602080832090910154888352600b9091526040822080546001600160a01b03909216935090849081106112cd576112cd6127e8565b5f91825260208083209190910154898352600b90915260409182902060048082018054600384018b90556001600160a01b03888116610100026001600160a81b0319909216919091176001908117909255600590930180546001600160a01b031916948416948517905554600954945163a9059cbb60e01b815294831691850191909152650e8d4a5100006024850152919350169063a9059cbb906044016020604051808303815f875af1158015611387573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ab91906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b038481166004830152655e96630e800060248301529091169063a9059cbb906044016020604051808303815f875af1158015611401573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061142591906128c5565b5060015460405163a9059cbb60e01b81526001600160a01b03838116600483015265246139ca800060248301529091169063a9059cbb906044016020604051808303815f875af115801561147b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f91906128c5565b505050505050505050565b335f8181526010602052604090205460ff1615156001146114dd5760405162461bcd60e51b8152600401610757906127b8565b5f5b835181101561088b578281815181106114fa576114fa6127e8565b6020026020010151600c5f868481518110611517576115176127e8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206002015f82825461154f9190612810565b9091555081905061155f81612823565b9150506114df565b5f808251116115c85760405162461bcd60e51b815260206004820152602760248201527f4172726179206d75737420636f6e7461696e206174206c65617374206f6e6520604482015266195b195b595b9d60ca1b6064820152608401610757565b5f60015b8351811015611625578382815181106115e7576115e76127e8565b6020026020010151848281518110611601576116016127e8565b60200260200101511115611613578091505b8061161d81612823565b9150506115cc565b5092915050565b611634612251565b600255565b611641612251565b61164a5f6123e0565b565b33436001839003611738576001600160a01b0382165f908152600c60205260409020546002111561168f5760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0382165f908152600c602052604081208054600292906116b7908490612884565b9091555050600580545f908152600a6020908152604091829020600201849055915481518681529283015281018290526001600160a01b038316907f8d9f83849857ceaf892550c3236854ed313894d04f07d3a76725afc7a2235a379060600160405180910390a260058054905f61172e83612823565b9190505550505050565b82600203610a1c576001600160a01b0382165f908152600c6020526040902054600411156117785760405162461bcd60e51b81526004016107579061283b565b6001600160a01b0382165f908152600c602052604081208054600492906117a0908490612884565b9091555050600680545f908152600b6020908152604091829020600201849055915481518681529283015281018290526001600160a01b038316907f8d9f83849857ceaf892550c3236854ed313894d04f07d3a76725afc7a2235a379060600160405180910390a260068054905f61172e83612823565b5f60028251101561187b5760405162461bcd60e51b815260206004820152602860248201527f4172726179206d75737420636f6e7461696e206174206c656173742074776f20604482015267656c656d656e747360c01b6064820152608401610757565b5f61188583611567565b90505f8115611894575f611897565b60015b60ff1690505f5b8451811015611903578281141580156118e857508482815181106118c4576118c46127e8565b60200260200101518582815181106118de576118de6127e8565b6020026020010151115b156118f1578091505b806118fb81612823565b91505061189e565b509392505050565b611913612251565b6001600160a01b03165f908152601060205260409020805460ff19166001179055565b335f8181526010602052604090205460ff1615156001146119695760405162461bcd60e51b8152600401610757906127b8565b5f838152600d602052604090206001015415801561199557505f838152600d6020526040902060030154155b80156119b257505f838152600d602052604090206004015460ff16155b6119f35760405162461bcd60e51b815260206004820152601260248201527111d85b5948185b1c9958591e481cd85d995960721b6044820152606401610757565b5f838152600d6020908152604091829020600180820186905543600383015560048201805460ff1916909117905554915184815285926001600160a01b0316917f3f9816b7851af3e5a818edbae74a83371dae8fd137d3e6353ad90befdb227cc8910160405180910390a3505050565b335f8181526010602052604090205460ff161515600114611a965760405162461bcd60e51b8152600401610757906127b8565b6003545f908152600e6020526040902060010154431015611aef5760405162461bcd60e51b81526020600482015260136024820152722a37bab93730b6b2b73a103737ba1037bb32b960691b6044820152606401610757565b600380545f908152600e60205260409020015460ff1615611b485760405162461bcd60e51b81526020600482015260136024820152722a37bab93730b6b2b73a103737ba1037bb32b960691b6044820152606401610757565b600380545f908152600e60205260408082208301805460ff19166001179055915481529081206002015460085460075491929160649190611b899085612897565b611b939190612897565b611b9d91906128e4565b60015460095460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1591906128c5565b506003547fde4041d130541c757b9ac932998643c84f40122ddc15d1cddb09ab61bad2cf854360025443611c499190612810565b604080519283526020830191909152810184905260600160405180910390a2604051806080016040528043815260200160025443611c879190612810565b81526020015f81526020015f1515815250600e5f6003546001611caa9190612810565b815260208082019290925260409081015f908120845181559284015160018401559083015160028301556060909201516003918201805460ff191691151591909117905580549161172e83612823565b335f8181526010602052604090205460ff161515600114611d2d5760405162461bcd60e51b8152600401610757906127b8565b84600103611d9e575f848152600a60209081526040822080546001808201835582855283852090910180546001600160a01b0319166001600160a01b03881617905590810180549182018155808452918320018590559085905254600203611d9957611d99858561108f565b610889565b84600203610889575f848152600b60209081526040822080546001808201835582855283852090910180546001600160a01b0319166001600160a01b0388161790559081018054918201815580845291832001859055908590525460040361088957610889858561108f565b600f602052815f5260405f208181548110611e23575f80fd5b905f5260205f20015f91509150505481565b6003545f908152600e6020526040812060010154439080821015611e6457611e5d8282612884565b9250505090565b5f9250505090565b6060805f600f5f8581526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015611ec957602002820191905f5260205f20905b815481526020019060010190808311611eb5575b505050505090505f815167ffffffffffffffff811115611eeb57611eeb612446565b604051908082528060200260200182016040528015611f14578160200160208202803683370190505b5090505f825167ffffffffffffffff811115611f3257611f32612446565b604051908082528060200260200182016040528015611f5b578160200160208202803683370190505b5090505f5b835181101561201c57838181518110611f7b57611f7b6127e8565b6020026020010151838281518110611f9557611f956127e8565b602002602001018181525050600d5f858381518110611fb657611fb66127e8565b602002602001015181526020019081526020015f205f015f9054906101000a90046001600160a01b0316828281518110611ff257611ff26127e8565b6001600160a01b03909216602092830291909101909101528061201481612823565b915050611f60565b505f5b6001835161202d9190612884565b8110156121fb575f5b60018285516120459190612884565b61204f9190612884565b8110156121e857600d5f85612065846001612810565b81518110612075576120756127e8565b602002602001015181526020019081526020015f2060010154600d5f8684815181106120a3576120a36127e8565b602002602001015181526020019081526020015f206001015410156121d657836120ce826001612810565b815181106120de576120de6127e8565b60200260200101518482815181106120f8576120f86127e8565b6020026020010151858381518110612112576121126127e8565b60200260200101868460016121279190612810565b81518110612137576121376127e8565b60209081029190910101919091525282612152826001612810565b81518110612162576121626127e8565b602002602001015183828151811061217c5761217c6127e8565b6020026020010151848381518110612196576121966127e8565b60200260200101858460016121ab9190612810565b815181106121bb576121bb6127e8565b6001600160a01b039384166020918202929092010152911690525b806121e081612823565b915050612036565b50806121f381612823565b91505061201f565b50909590945092505050565b61220f612251565b6001600160a01b03811661223857604051631e4fbdf760e01b81525f6004820152602401610757565b612241816123e0565b50565b61224c612251565b600855565b5f546001600160a01b0316331461164a5760405163118cdaa760e01b8152336004820152602401610757565b606081600103612314576040805160028082526060820183525f926020830190803683370190505090505f5b600281101561230c575f858152600a602052604090206001018054829081106122d4576122d46127e8565b905f5260205f2001548282815181106122ef576122ef6127e8565b60209081029190910101528061230481612823565b9150506122a9565b5090506123da565b816002036123a35760408051600480825260a082019092525f91602082016080803683370190505090505f5b600481101561230c575f858152600a6020526040902060010180548290811061236b5761236b6127e8565b905f5260205f200154828281518110612386576123866127e8565b60209081029190910101528061239b81612823565b915050612340565b60405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206d6f646560a01b6044820152606401610757565b92915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6020828403121561243f575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561248357612483612446565b604052919050565b5f67ffffffffffffffff8211156124a4576124a4612446565b5060051b60200190565b80356001600160a01b03811681146124c4575f80fd5b919050565b5f82601f8301126124d8575f80fd5b813560206124ed6124e88361248b565b61245a565b82815260059290921b8401810191818101908684111561250b575f80fd5b8286015b8481101561252d57612520816124ae565b835291830191830161250f565b509695505050505050565b5f82601f830112612547575f80fd5b813560206125576124e88361248b565b82815260059290921b84018101918181019086841115612575575f80fd5b8286015b8481101561252d5780358352918301918301612579565b5f805f606084860312156125a2575f80fd5b833567ffffffffffffffff808211156125b9575f80fd5b6125c5878388016124c9565b945060208601359150808211156125da575f80fd5b506125e786828701612538565b925050604084013590509250925092565b5f8060408385031215612609575f80fd5b50508035926020909101359150565b5f8060408385031215612629575f80fd5b612632836124ae565b946020939093013593505050565b5f8060408385031215612651575f80fd5b823567ffffffffffffffff80821115612668575f80fd5b612674868387016124c9565b93506020850135915080821115612689575f80fd5b5061269685828601612538565b9150509250929050565b5f602082840312156126b0575f80fd5b813567ffffffffffffffff8111156126c6575f80fd5b6126d284828501612538565b949350505050565b5f602082840312156126ea575f80fd5b6126f3826124ae565b9392505050565b5f805f806080858703121561270d575f80fd5b84359350602085013592506040850135915061272b606086016124ae565b905092959194509250565b604080825283519082018190525f906020906060840190828701845b8281101561276e57815184529284019290840190600101612752565b505050838103828501528451808252858301918301905f5b818110156127ab5783516001600160a01b031683529284019291840191600101612786565b5090979650505050505050565b60208082526016908201527529b2b73232b9103737ba1030baba3437b934bd32b21760511b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156123da576123da6127fc565b5f60018201612834576128346127fc565b5060010190565b60208082526029908201527f4e6f7420656e6f756768207469636b657473206c6f6164656420696e20796f756040820152681c881858d8dbdd5b9d60ba1b606082015260800190565b818103818111156123da576123da6127fc565b80820281158282048414176123da576123da6127fc565b5f602082840312156128be575f80fd5b5051919050565b5f602082840312156128d5575f80fd5b815180151581146126f3575f80fd5b5f826128fe57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212202f69dd68b47b712afde610d8efbf38847f0739fa9372b85bb63f39bf1fa3415d64736f6c63430008140033
Deployed Bytecode Sourcemap
396:19970:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3101:46;;;;;;;;;;-1:-1:-1;3101:46:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3101:46:3;;;;;;;424:25:4;;;480:2;465:18;;458:34;;;;535:14;;528:22;508:18;;;501:50;;;;-1:-1:-1;;;;;587:32:4;582:2;567:18;;560:60;411:3;396:19;3101:46:3;;;;;;;;3380:37;;;;;;;;;;-1:-1:-1;3380:37:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3380:37:3;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;902:32:4;;;884:51;;966:2;951:18;;944:34;;;;994:18;;;987:34;;;;1052:2;1037:18;;1030:34;1108:14;1101:22;1095:3;1080:19;;1073:51;871:3;856:19;3380:37:3;631:499:4;734:40:3;;;;;;;;;;;;;;;;;;;1281:25:4;;;1269:2;1254:18;734:40:3;1135:177:4;19561:104:3;;;;;;:::i;:::-;;:::i;:::-;;13591:509;;;;;;;;;;-1:-1:-1;13591:509:3;;;;;:::i;:::-;;:::i;8481:704::-;;;;;;;;;;-1:-1:-1;8481:704:3;;;;;:::i;:::-;;:::i;9307:496::-;;;;;;;;;;-1:-1:-1;9307:496:3;;;;;:::i;:::-;;:::i;589:38::-;;;;;;;;;;;;;;;;9877:328;;;:::i;19073:366::-;;;;;;:::i;:::-;;:::i;7513:802::-;;;;;;;;;;-1:-1:-1;7513:802:3;;;;;:::i;:::-;;:::i;816:39::-;;;;;;;;;;;;;;;;14896:1350;;;;;;:::i;:::-;;:::i;18495:255::-;;;;;;:::i;:::-;;:::i;5540:386::-;;;;;;;;;;-1:-1:-1;5540:386:3;;;;;:::i;:::-;;:::i;20053:108::-;;;;;;;;;;-1:-1:-1;20053:108:3;;;;;:::i;:::-;;:::i;658:34::-;;;;;;;;;;;;;;;;2293:101:0;;;;;;;;;;;;;:::i;3474:49:3:-;;;;;;;;;;-1:-1:-1;3474:49:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5793:25:4;;;5849:2;5834:18;;5827:34;;;;5877:18;;;5870:34;5947:14;5940:22;5935:2;5920:18;;5913:50;5780:3;5765:19;3474:49:3;5568:401:4;3194:46:3;;;;;;;;;;-1:-1:-1;3194:46:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3194:46:3;;;;;;;;;;;;;;6227:25:4;;;6283:2;6268:18;;6261:34;;;;6338:14;;6331:22;6311:18;;;6304:50;;;;-1:-1:-1;;;;;6428:15:4;;;6423:2;6408:18;;6401:43;6481:15;6475:3;6460:19;;6453:44;6214:3;6199:19;3194:46:3;5974:529:4;12104:1122:3;;;;;;:::i;:::-;;:::i;6064:505::-;;;;;;;;;;-1:-1:-1;6064:505:3;;;;;:::i;:::-;;:::i;1638:85:0:-;;;;;;;;;;-1:-1:-1;1684:7:0;1710:6;1638:85;;-1:-1:-1;;;;;1710:6:0;;;6654:51:4;;6642:2;6627:18;1638:85:0;6508:203:4;19805:92:3;;;;;;;;;;-1:-1:-1;19805:92:3;;;;;:::i;:::-;;:::i;14258:467::-;;;;;;;;;;-1:-1:-1;14258:467:3;;;;;:::i;:::-;;:::i;17310:965::-;;;:::i;16496:701::-;;;;;;:::i;:::-;;:::i;3583:52::-;;;;;;;;;;-1:-1:-1;3583:52:3;;;;;:::i;:::-;;:::i;3294:41::-;;;;;;;;;;-1:-1:-1;3294:41:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7505:25:4;;;7561:2;7546:18;;7539:34;;;;7589:18;;;7582:34;7493:2;7478:18;3294:41:3;7303:319:4;11651::3;;;;;;;;;;;;;:::i;10340:1213::-;;;;;;;;;;-1:-1:-1;10340:1213:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;20245:119:3:-;;;;;;;;;;-1:-1:-1;20245:119:3;;;;;:::i;:::-;;:::i;19561:104::-;1531:13:0;:11;:13::i;:::-;19637:11:3::1;:21:::0;19561:104::o;13591:509::-;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;;;;;;;;;13747:5:::1;13756:1;13747:10:::0;13743:351:::1;;13778:9;13773:131;13797:13;:20;13793:1;:24;13773:131;;;13879:7;13887:1;13879:10;;;;;;;;:::i;:::-;;;;;;;13842:7;:25;13850:13;13864:1;13850:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;13842:25:3::1;-1:-1:-1::0;;;;;13842:25:3::1;;;;;;;;;;;;:33;;;:47;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;13819:3:3;;-1:-1:-1;13819:3:3::1;::::0;::::1;:::i;:::-;;;;13773:131;;;;13743:351;;;13924:5;13933:1;13924:10:::0;13920:174:::1;;13955:9;13950:134;13974:13;:20;13970:1;:24;13950:134;;;14059:7;14067:1;14059:10;;;;;;;;:::i;:::-;;;;;;;14019:7;:25;14027:13;14041:1;14027:16;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;14019:25:3::1;-1:-1:-1::0;;;;;14019:25:3::1;;;;;;;;;;;;:36;;;:50;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;13996:3:3;;-1:-1:-1;13996:3:3::1;::::0;::::1;:::i;:::-;;;;13950:134;;;;13920:174;4264:122:::0;13591:509;;;:::o;8481:704::-;8571:10;8604:1;8595:10;;;8591:588;;-1:-1:-1;;;;;8646:15:3;;;;;;:7;:15;;;;;:23;8673:1;-1:-1:-1;8646:28:3;8621:128;;;;-1:-1:-1;;;8621:128:3;;;;;;;:::i;:::-;8771:21;;;;:12;:21;;;;;:28;;;;;:37;8763:66;;;;-1:-1:-1;;;8763:66:3;;10307:2:4;8763:66:3;;;10289:21:4;10346:2;10326:18;;;10319:30;-1:-1:-1;;;10365:18:4;;;10358:46;10421:18;;8763:66:3;10105:340:4;8763:66:3;-1:-1:-1;;;;;8843:15:3;;;;;;:7;:15;;;;;:28;;8870:1;;8843:15;:28;;8870:1;;8843:28;:::i;:::-;;;;-1:-1:-1;8591:588:3;;-1:-1:-1;8591:588:3;;8892:5;8901:1;8892:10;8888:291;;-1:-1:-1;;;;;8943:15:3;;;;;;:7;:15;;;;;:23;8970:1;-1:-1:-1;8943:28:3;8918:128;;;;-1:-1:-1;;;8918:128:3;;;;;;;:::i;:::-;9068:21;;;;:12;:21;;;;;:28;;;;;:37;9060:66;;;;-1:-1:-1;;;9060:66:3;;10307:2:4;9060:66:3;;;10289:21:4;10346:2;10326:18;;;10319:30;-1:-1:-1;;;10365:18:4;;;10358:46;10421:18;;9060:66:3;10105:340:4;9060:66:3;-1:-1:-1;;;;;9140:15:3;;;;;;:7;:15;;;;;:28;;9167:1;;9140:15;:28;;9167:1;;9140:28;:::i;:::-;;;;-1:-1:-1;;8888:291:3;8544:641;8481:704;;:::o;9307:496::-;9464:11;;9380:10;;9428:4;;9363:14;;9464:21;;9478:7;;9464:21;:::i;:::-;9517:4;;:37;;-1:-1:-1;;;9517:37:3;;-1:-1:-1;;;;;10986:15:4;;;9517:37:3;;;10968:34:4;9548:4:3;11018:18:4;;;11011:43;9443:42:3;;-1:-1:-1;9443:42:3;;9517:4;;;;:14;;10903:18:4;;9517:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;:119;;;;-1:-1:-1;9588:4:3;;:48;;-1:-1:-1;;;9588:48:3;;-1:-1:-1;;;;;11512:15:4;;;9588:48:3;;;11494:34:4;11564:15;;;11544:18;;;11537:43;11596:18;;;11589:34;;;9588:4:3;;;;:17;;11429:18:4;;9588:48:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9496:207;;;;-1:-1:-1;;;9496:207:3;;12118:2:4;9496:207:3;;;12100:21:4;12157:2;12137:18;;;12130:30;12196:34;12176:18;;;12169:62;-1:-1:-1;;;12247:18:4;;;12240:39;12296:19;;9496:207:3;11916:405:4;9496:207:3;-1:-1:-1;;;;;9714:15:3;;;;;;:7;:15;;;;;:34;;9741:7;;9714:15;:34;;9741:7;;9714:34;:::i;:::-;;;;-1:-1:-1;;9763:33:3;;1281:25:4;;;-1:-1:-1;;;;;9763:33:3;;;;;1269:2:4;1254:18;9763:33:3;;;;;;;9353:450;;;9307:496;:::o;9877:328::-;4435:6;;;;4434:7;4426:42;;;;-1:-1:-1;;;4426:42:3;;12528:2:4;4426:42:3;;;12510:21:4;12567:2;12547:18;;;12540:30;-1:-1:-1;;;12586:18:4;;;12579:52;12648:18;;4426:42:3;12326:346:4;4426:42:3;4478:6;:13;;-1:-1:-1;;4478:13:3;4487:4;4478:13;;;9958:10:::1;4478:6:::0;9996:15;;;:7:::1;:15;::::0;;;;:23:::1;;::::0;10037:11;10029:44:::1;;;::::0;-1:-1:-1;;;10029:44:3;;12879:2:4;10029:44:3::1;::::0;::::1;12861:21:4::0;12918:2;12898:18;;;12891:30;-1:-1:-1;;;12937:18:4;;;12930:50;12997:18;;10029:44:3::1;12677:344:4::0;10029:44:3::1;10084:4;::::0;:30:::1;::::0;-1:-1:-1;;;10084:30:3;;-1:-1:-1;;;;;13218:32:4;;;10084:30:3::1;::::0;::::1;13200:51:4::0;13267:18;;;13260:34;;;10084:4:3;;::::1;::::0;:13:::1;::::0;13173:18:4;;10084:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10144:6;-1:-1:-1::0;;;;;10129:31:3::1;;10152:7;10129:31;;;;1281:25:4::0;;1269:2;1254:18;;1135:177;10129:31:3::1;;;;;;;;-1:-1:-1::0;;;;;;10171:15:3::1;10197:1;10171:15:::0;;;:7:::1;:15;::::0;;;;:23:::1;;:27:::0;4512:6;:14;;-1:-1:-1;;4512:14:3;;;9877:328::o;19073:366::-;1531:13:0;:11;:13::i;:::-;19225:10:3::1;-1:-1:-1::0;;;;;19250:22:3;::::1;19246:103;;19288:30;::::0;-1:-1:-1;;;;;19288:21:3;::::1;::::0;:30;::::1;;;::::0;19310:7;;19288:30:::1;::::0;;;19310:7;19288:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;19246:103;19397:35;::::0;-1:-1:-1;;;19397:35:3;;19412:10:::1;19397:35;::::0;::::1;13200:51:4::0;13267:18;;;13260:34;;;19380:6:3;;-1:-1:-1;;;;;19397:14:3;::::1;::::0;::::1;::::0;13173:18:4;;19397:35:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7513:802::-:0;7583:10;7616:1;7607:10;;;7603:496;;-1:-1:-1;;;;;7658:15:3;;;;;;:7;:15;;;;;:23;7685:1;-1:-1:-1;7658:28:3;7633:128;;;;-1:-1:-1;;;7633:128:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;7775:15:3;;;;;;:7;:15;;;;;:28;;7802:1;;7775:15;:28;;7802:1;;7775:28;:::i;:::-;;;;-1:-1:-1;;7829:17:3;;7817:30;;;;:11;:30;;;;;:42;;:44;;;;;;:::i;:::-;;;;;;7603:496;;;7882:5;7891:1;7882:10;7878:221;;-1:-1:-1;;;;;7933:15:3;;;;;;:7;:15;;;;;7963:1;7933:26;;;;:31;;7908:135;;;;-1:-1:-1;;;7908:135:3;;13507:2:4;7908:135:3;;;13489:21:4;13546:2;13526:18;;;13519:30;13585:34;13565:18;;;13558:62;-1:-1:-1;;;13636:18:4;;;13629:43;13689:19;;7908:135:3;13305:409:4;7908:135:3;-1:-1:-1;;;;;8057:15:3;;;;;;:7;:15;;;;;8087:1;8057:26;;;:31;;8087:1;;8057:26;;:31;;8087:1;;8057:31;:::i;:::-;;;;-1:-1:-1;;7878:221:3;8130:39;;;;;;;;-1:-1:-1;;;;;8130:39:3;;;;;;-1:-1:-1;8130:39:3;;;;;;;8146:12;8130:39;;;;;;;;;;;;;;;;;;8115:11;;;8109:18;;:5;:18;;;;;:60;;;;-1:-1:-1;;;;;;8109:60:3;;;;;;;;;;;-1:-1:-1;8109:60:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8109:60:3;;;;;;;;;;;8195:17;8179:34;;:15;:34;;;;;8219:11;;8179:52;;;;;;;;;;;;;;;;;;8266:11;;8246:39;;1281:25:4;;;8130:39:3;;8246;;1254:18:4;8246:39:3;;;;;;;8295:11;:13;;;:11;:13;;;:::i;:::-;;;;;;7556:759;7513:802;:::o;14896:1350::-;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;15029:12:::1;15064:1;15055:10:::0;;;15051:1189:::1;;15081:16;15100:35;15113:21;15123:7;15132:1;15113:9;:21::i;15100:35::-;15149:14;15166:21:::0;;;:12:::1;:21;::::0;;;;:44;;15081:54;;-1:-1:-1;15149:14:3;;15081:54;;15166:44;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;15224:21;;;:12:::1;:21:::0;;;;;;;;:28:::1;::::0;;::::1;:35:::0;;15273:30:::1;::::0;;::::1;:45:::0;;;-1:-1:-1;;;;;15166:44:3;;::::1;;15332:37:::0;::::1;-1:-1:-1::0;;;;;;15332:37:3;;;;;;;-1:-1:-1;15332:37:3;;;;;;15383:4;15397:8:::1;::::0;15383:38;;-1:-1:-1;;;15383:38:3;;15397:8;;::::1;15383:38:::0;;::::1;13200:51:4::0;;;;15407:13:3::1;13267:18:4::0;;;13260:34;15166:44:3;;-1:-1:-1;15383:4:3::1;::::0;:13:::1;::::0;13173:18:4;;15383:38:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;15435:4:3::1;::::0;:37:::1;::::0;-1:-1:-1;;;15435:37:3;;-1:-1:-1;;;;;13218:32:4;;;15435:37:3::1;::::0;::::1;13200:51:4::0;15457:14:3::1;13267:18:4::0;;;13260:34;15435:4:3;;::::1;::::0;:13:::1;::::0;13173:18:4;;15435:37:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15067:416;;15051:1189;;;15493:5;15502:1;15493:10:::0;15489:751:::1;;15519:16;15538:35;15551:21;15561:7;15570:1;15551:9;:21::i;15538:35::-;15519:54;;15587:22;15612:41;15631:21;15641:7;15650:1;15631:9;:21::i;15612:41::-;15667:14;15684:21:::0;;;:12:::1;:21;::::0;;;;:44;;15587:66;;-1:-1:-1;15667:14:3;;15719:8;;15684:44;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;15765:21;;;:12:::1;:21:::0;;;;;;:80;;-1:-1:-1;;;;;15684:44:3;;::::1;::::0;-1:-1:-1;15765:21:3;15817:14;;15765:80;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;15859:21;;;:12:::1;:21:::0;;;;;;;;:28:::1;::::0;;::::1;:35:::0;;15908:30:::1;::::0;::::1;:45:::0;;;-1:-1:-1;;;;;15967:37:3;;::::1;15765:80;15967:37;-1:-1:-1::0;;;;;;15967:37:3;;;;;;;-1:-1:-1;15967:37:3;;;;;;16018:34:::1;::::0;;::::1;:49:::0;;-1:-1:-1;;;;;;16018:49:3::1;15765:80:::0;;::::1;16018:49:::0;;::::1;::::0;;16081:4;16095:8:::1;::::0;16081:39;;-1:-1:-1;;;16081:39:3;;16095:8;;::::1;16081:39:::0;;::::1;13200:51:4::0;;;;16105:14:3::1;13267:18:4::0;;;13260:34;15765:80:3;;-1:-1:-1;16081:4:3::1;::::0;:13:::1;::::0;13173:18:4;;16081:39:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;16134:4:3::1;::::0;:38:::1;::::0;-1:-1:-1;;;16134:38:3;;-1:-1:-1;;;;;13218:32:4;;;16134:38:3::1;::::0;::::1;13200:51:4::0;16156:15:3::1;13267:18:4::0;;;13260:34;16134:4:3;;::::1;::::0;:13:::1;::::0;13173:18:4;;16134:38:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;16186:4:3::1;::::0;:43:::1;::::0;-1:-1:-1;;;16186:43:3;;-1:-1:-1;;;;;13218:32:4;;;16186:43:3::1;::::0;::::1;13200:51:4::0;16214:14:3::1;13267:18:4::0;;;13260:34;16186:4:3;;::::1;::::0;:13:::1;::::0;13173:18:4;;16186:43:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15505:735;;;;14996:1250;4264:122:::0;14896:1350;;:::o;18495:255::-;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;18633:9:::1;18628:116;18652:8;:15;18648:1;:19;18628:116;;;18720:10;18731:1;18720:13;;;;;;;;:::i;:::-;;;;;;;18688:7;:20;18696:8;18705:1;18696:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;18688:20:3::1;-1:-1:-1::0;;;;;18688:20:3::1;;;;;;;;;;;;:28;;;:45;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;18669:3:3;;-1:-1:-1;18669:3:3::1;::::0;::::1;:::i;:::-;;;;18628:116;;5540:386:::0;5621:7;5663:1;5648:5;:12;:16;5640:68;;;;-1:-1:-1;;;5640:68:3;;15421:2:4;5640:68:3;;;15403:21:4;15460:2;15440:18;;;15433:30;15499:34;15479:18;;;15472:62;-1:-1:-1;;;15550:18:4;;;15543:37;15597:19;;5640:68:3;15219:403:4;5640:68:3;5719:16;5767:1;5750:144;5774:5;:12;5770:1;:16;5750:144;;;5822:5;5828:8;5822:15;;;;;;;;:::i;:::-;;;;;;;5811:5;5817:1;5811:8;;;;;;;;:::i;:::-;;;;;;;:26;5807:77;;;5868:1;5857:12;;5807:77;5788:3;;;;:::i;:::-;;;;5750:144;;;-1:-1:-1;5911:8:3;5540:386;-1:-1:-1;;5540:386:3:o;20053:108::-;1531:13:0;:11;:13::i;:::-;20125:18:3::1;:29:::0;20053:108::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;12104:1122:3:-;12185:10;12228:12;12263:1;12254:10;;;12250:970;;-1:-1:-1;;;;;12305:15:3;;;;;;:7;:15;;;;;:23;12332:1;-1:-1:-1;12305:28:3;12280:128;;;;-1:-1:-1;;;12280:128:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;12422:15:3;;;;;;:7;:15;;;;;:28;;12449:1;;12422:15;:28;;12449:1;;12422:28;:::i;:::-;;;;-1:-1:-1;;12478:19:3;;;12465:33;;;;:12;:33;;;;;;;;;:44;;:59;;;12623:19;;12543:143;;7505:25:4;;;7546:18;;;7539:34;7589:18;;7582:34;;;-1:-1:-1;;;;;12543:143:3;;;;;7493:2:4;7478:18;12543:143:3;;;;;;;12700:19;:21;;;:19;:21;;;:::i;:::-;;;;;;8544:641;8481:704;;:::o;12250:970::-;12742:5;12751:1;12742:10;12738:482;;-1:-1:-1;;;;;12793:15:3;;;;;;:7;:15;;;;;:23;12820:1;-1:-1:-1;12793:28:3;12768:128;;;;-1:-1:-1;;;12768:128:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;12910:15:3;;;;;;:7;:15;;;;;:28;;12937:1;;12910:15;:28;;12937:1;;12910:28;:::i;:::-;;;;-1:-1:-1;;12966:19:3;;;12953:33;;;;:12;:33;;;;;;;;;:44;;:59;;;13111:19;;13031:143;;7505:25:4;;;7546:18;;;7539:34;7589:18;;7582:34;;;-1:-1:-1;;;;;13031:143:3;;;;;7493:2:4;7478:18;13031:143:3;;;;;;;13188:19;:21;;;:19;:21;;;:::i;6064:505::-;6151:7;6194:1;6178:5;:12;:17;;6170:70;;;;-1:-1:-1;;;6170:70:3;;15829:2:4;6170:70:3;;;15811:21:4;15868:2;15848:18;;;15841:30;15907:34;15887:18;;;15880:62;-1:-1:-1;;;15958:18:4;;;15951:38;16006:19;;6170:70:3;15627:404:4;6170:70:3;6251:16;6270:19;6283:5;6270:12;:19::i;:::-;6251:38;-1:-1:-1;6299:22:3;6325:13;;6324:23;;6346:1;6324:23;;;6342:1;6324:23;6299:48;;;;6363:9;6358:173;6382:5;:12;6378:1;:16;6358:173;;;6424:8;6419:1;:13;;:49;;;;;6447:5;6453:14;6447:21;;;;;;;;:::i;:::-;;;;;;;6436:5;6442:1;6436:8;;;;;;;;:::i;:::-;;;;;;;:32;6419:49;6415:106;;;6505:1;6488:18;;6415:106;6396:3;;;;:::i;:::-;;;;6358:173;;;-1:-1:-1;6548:14:3;6064:505;-1:-1:-1;;;6064:505:3:o;19805:92::-;1531:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;19869:14:3::1;;::::0;;;:6:::1;:14;::::0;;;;:21;;-1:-1:-1;;19869:21:3::1;19886:4;19869:21;::::0;;19805:92::o;14258:467::-;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;14361:14:::1;::::0;;;:5:::1;:14;::::0;;;;:20:::1;;::::0;:25;:73;::::1;;;-1:-1:-1::0;14406:14:3::1;::::0;;;:5:::1;:14;::::0;;;;:23:::1;;::::0;:28;14361:73:::1;:123;;;;-1:-1:-1::0;14454:14:3::1;::::0;;;:5:::1;:14;::::0;;;;:21:::1;;::::0;::::1;;:30;14361:123;14340:188;;;::::0;-1:-1:-1;;;14340:188:3;;16238:2:4;14340:188:3::1;::::0;::::1;16220:21:4::0;16277:2;16257:18;;;16250:30;-1:-1:-1;;;16296:18:4;;;16289:48;16354:18;;14340:188:3::1;16036:342:4::0;14340:188:3::1;14539:14;::::0;;;:5:::1;:14;::::0;;;;;;;;:20:::1;::::0;;::::1;:29:::0;;;14604:12:::1;14578:23;::::0;::::1;:38:::0;14626:21:::1;::::0;::::1;:28:::0;;-1:-1:-1;;14626:28:3::1;::::0;;::::1;::::0;;14681:19;14669:49;;1281:25:4;;;14539:14:3;;-1:-1:-1;;;;;14681:19:3::1;::::0;14669:49:::1;::::0;1254:18:4;14669:49:3::1;;;;;;;4264:122:::0;14258:467;;:::o;17310:965::-;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;17406:17:::1;::::0;17394:30:::1;::::0;;;:11:::1;:30;::::0;;;;:39:::1;;::::0;17437:12:::1;-1:-1:-1::0;17394:55:3::1;17373:121;;;::::0;-1:-1:-1;;;17373:121:3;;16585:2:4;17373:121:3::1;::::0;::::1;16567:21:4::0;16624:2;16604:18;;;16597:30;-1:-1:-1;;;16643:18:4;;;16636:49;16702:18;;17373:121:3::1;16383:343:4::0;17373:121:3::1;17537:17;::::0;;17525:30:::1;::::0;;;:11:::1;:30;::::0;;;;:37:::1;::::0;::::1;;:46;17504:112;;;::::0;-1:-1:-1;;;17504:112:3;;16585:2:4;17504:112:3::1;::::0;::::1;16567:21:4::0;16624:2;16604:18;;;16597:30;-1:-1:-1;;;16643:18:4;;;16636:49;16702:18;;17504:112:3::1;16383:343:4::0;17504:112:3::1;17639:17;::::0;;17627:30:::1;::::0;;;:11:::1;:30;::::0;;;;;:37;::::1;:44:::0;;-1:-1:-1;;17627:44:3::1;17667:4;17627:44;::::0;;17721:17;;17709:30;;;;;:42:::1;;::::0;17816:11:::1;::::0;17802::::1;::::0;17709:42;;17627:30;17843:3:::1;::::0;17816:11;17783:30:::1;::::0;17709:42;17783:30:::1;:::i;:::-;:44;;;;:::i;:::-;17782:64;;;;:::i;:::-;17857:4;::::0;17871:8:::1;::::0;17857:35:::1;::::0;-1:-1:-1;;;17857:35:3;;-1:-1:-1;;;;;17871:8:3;;::::1;17857:35;::::0;::::1;13200:51:4::0;13267:18;;;13260:34;;;17761:85:3;;-1:-1:-1;17857:4:3::1;::::0;:13:::1;::::0;13173:18:4;;17857:35:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17939:17;;17908:155;17970:12;18011:18;;17996:12;:33;;;;:::i;:::-;17908:155;::::0;;7505:25:4;;;7561:2;7546:18;;7539:34;;;;7589:18;;7582:34;;;7493:2;7478:18;17908:155:3::1;;;;;;;18111:127;;;;;;;;18135:12;18111:127;;;;18176:18;;18161:12;:33;;;;:::i;:::-;18111:127;;;;18208:1;18111:127;;;;18223:5;18111:127;;;;::::0;18074:11:::1;:34;18086:17;;18106:1;18086:21;;;;:::i;:::-;18074:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;18074:34:3;;;:164;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;18074:164:3::1;::::0;::::1;;::::0;;;::::1;::::0;;18249:19;;;::::1;::::0;::::1;:::i;16496:701::-:0;4291:10;4274:14;4319;;;:6;:14;;;;;;;;:22;;:14;:22;4311:57;;;;-1:-1:-1;;;4311:57:3;;;;;;;:::i;:::-;16663:5:::1;16672:1;16663:10:::0;16659:532:::1;;16689:21;::::0;;;:12:::1;:21;::::0;;;;;;:48;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;16689:48:3::1;-1:-1:-1::0;;;;;16689:48:3;::::1;;::::0;;16751:28;;::::1;:41:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;16810:21;;;;:35;16849:1:::1;16810:40:::0;16806:106:::1;;16870:27;16882:5;16889:7;16870:11;:27::i;:::-;16659:532;;;16932:5;16941:1;16932:10:::0;16928:263:::1;;16958:21;::::0;;;:12:::1;:21;::::0;;;;;;:48;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;16958:48:3::1;-1:-1:-1::0;;;;;16958:48:3;::::1;;::::0;;17020:28;;::::1;:41:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;17079:21;;;;:35;17118:1:::1;17079:40:::0;17075:106:::1;;17139:27;17151:5;17158:7;17139:11;:27::i;3583:52::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11651:319::-;11803:17;;11708:7;11791:30;;;:11;:30;;;;;:39;;;11750:12;;11845:23;;;11841:123;;;11891:23;11902:12;11891:8;:23;:::i;:::-;11884:30;;;;11651:319;:::o;11841:123::-;11952:1;11945:8;;;;11651:319;:::o;10340:1213::-;10424:16;10442;10470:24;10497:15;:30;10513:13;10497:30;;;;;;;;;;;10470:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10537:30;10584:7;:14;10570:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10570:29:3;;10537:62;;10609:28;10654:7;:14;10640:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10640:29:3;;10609:60;;10685:9;10680:152;10704:7;:14;10700:1;:18;10680:152;;;10758:7;10766:1;10758:10;;;;;;;;:::i;:::-;;;;;;;10739:13;10753:1;10739:16;;;;;;;;:::i;:::-;;;;;;:29;;;;;10799:5;:17;10805:7;10813:1;10805:10;;;;;;;;:::i;:::-;;;;;;;10799:17;;;;;;;;;;;:22;;;;;;;;;;-1:-1:-1;;;;;10799:22:3;10782:11;10794:1;10782:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10782:39:3;;;:14;;;;;;;;;;;:39;10720:3;;;;:::i;:::-;;;;10680:152;;;;10847:9;10842:660;10889:1;10866:13;:20;:24;;;;:::i;:::-;10862:1;:28;10842:660;;;10916:9;10911:581;10962:1;10958;10935:13;:20;:24;;;;:::i;:::-;:28;;;;:::i;:::-;10931:1;:32;10911:581;;;11065:5;:27;11071:13;11085:5;:1;11089;11085:5;:::i;:::-;11071:20;;;;;;;;:::i;:::-;;;;;;;11065:27;;;;;;;;;;;:33;;;11013:5;:23;11019:13;11033:1;11019:16;;;;;;;;:::i;:::-;;;;;;;11013:23;;;;;;;;;;;:29;;;:85;10988:490;;;11208:13;11222:5;:1;11226;11222:5;:::i;:::-;11208:20;;;;;;;;:::i;:::-;;;;;;;11254:13;11268:1;11254:16;;;;;;;;:::i;:::-;;;;;;;11140:13;11154:1;11140:16;;;;;;;;:::i;:::-;;;;;;11158:13;11172:1;11176;11172:5;;;;:::i;:::-;11158:20;;;;;;;;:::i;:::-;;;;;;;;;;11139:153;;;;;11379:11;11391:5;:1;11395;11391:5;:::i;:::-;11379:18;;;;;;;;:::i;:::-;;;;;;;11423:11;11435:1;11423:14;;;;;;;;:::i;:::-;;;;;;;11315:11;11327:1;11315:14;;;;;;;;:::i;:::-;;;;;;11331:11;11343:1;11347;11343:5;;;;:::i;:::-;11331:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11314:145:3;;;11331:18;;;;;;;;;11314:145;;;;;10988:490;10965:3;;;;:::i;:::-;;;;10911:581;;;-1:-1:-1;10892:3:3;;;;:::i;:::-;;;;10842:660;;;-1:-1:-1;11519:13:3;;11534:11;;-1:-1:-1;10340:1213:3;-1:-1:-1;;;10340:1213:3:o;2543:215:0:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:0;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:0;;2700:1:::1;2672:31;::::0;::::1;6654:51:4::0;6627:18;;2672:31:0::1;6508:203:4::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;20245:119:3:-;1531:13:0;:11;:13::i;:::-;20332:11:3::1;:25:::0;20245:119::o;1796:162:0:-;1684:7;1710:6;-1:-1:-1;;;;;1710:6:0;735:10:2;1855:23:0;1851:101;;1901:40;;-1:-1:-1;;;1901:40:0;;735:10:2;1901:40:0;;;6654:51:4;6627:18;;1901:40:0;6508:203:4;6750:645:3;6846:16;6878:5;6887:1;6878:10;6874:515;;6930:16;;;6944:1;6930:16;;;;;;;;6904:23;;6930:16;;;;;;;;;;-1:-1:-1;6930:16:3;6904:42;;6965:6;6960:105;6981:1;6977;:5;6960:105;;;7019:21;;;;:12;:21;;;;;:28;;:31;;7048:1;;7019:31;;;;;;:::i;:::-;;;;;;;;;7007:6;7014:1;7007:9;;;;;;;;:::i;:::-;;;;;;;;;;:43;6984:3;;;;:::i;:::-;;;;6960:105;;;-1:-1:-1;7085:6:3;-1:-1:-1;7078:13:3;;6874:515;7112:5;7121:1;7112:10;7108:281;;7164:16;;;7178:1;7164:16;;;;;;;;;7138:23;;7164:16;;;;;;;;;;-1:-1:-1;7164:16:3;7138:42;;7199:6;7194:105;7215:1;7211;:5;7194:105;;;7253:21;;;;:12;:21;;;;;:28;;:31;;7282:1;;7253:31;;;;;;:::i;:::-;;;;;;;;;7241:6;7248:1;7241:9;;;;;;;;:::i;:::-;;;;;;;;;;:43;7218:3;;;;:::i;:::-;;;;7194:105;;7108:281;7356:22;;-1:-1:-1;;;7356:22:3;;17155:2:4;7356:22:3;;;17137:21:4;17194:2;17174:18;;;17167:30;-1:-1:-1;;;17213:18:4;;;17206:42;17265:18;;7356:22:3;16953:336:4;7108:281:3;6750:645;;;;:::o;2912:187:0:-;2985:16;3004:6;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;3052:40;;3004:6;;;;;;;3052:40;;2985:16;3052:40;2975:124;2912:187;:::o;14:180:4:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:4;;14:180;-1:-1:-1;14:180:4:o;1317:127::-;1378:10;1373:3;1369:20;1366:1;1359:31;1409:4;1406:1;1399:15;1433:4;1430:1;1423:15;1449:275;1520:2;1514:9;1585:2;1566:13;;-1:-1:-1;;1562:27:4;1550:40;;1620:18;1605:34;;1641:22;;;1602:62;1599:88;;;1667:18;;:::i;:::-;1703:2;1696:22;1449:275;;-1:-1:-1;1449:275:4:o;1729:183::-;1789:4;1822:18;1814:6;1811:30;1808:56;;;1844:18;;:::i;:::-;-1:-1:-1;1889:1:4;1885:14;1901:4;1881:25;;1729:183::o;1917:173::-;1985:20;;-1:-1:-1;;;;;2034:31:4;;2024:42;;2014:70;;2080:1;2077;2070:12;2014:70;1917:173;;;:::o;2095:668::-;2149:5;2202:3;2195:4;2187:6;2183:17;2179:27;2169:55;;2220:1;2217;2210:12;2169:55;2256:6;2243:20;2282:4;2306:60;2322:43;2362:2;2322:43;:::i;:::-;2306:60;:::i;:::-;2400:15;;;2486:1;2482:10;;;;2470:23;;2466:32;;;2431:12;;;;2510:15;;;2507:35;;;2538:1;2535;2528:12;2507:35;2574:2;2566:6;2562:15;2586:148;2602:6;2597:3;2594:15;2586:148;;;2668:23;2687:3;2668:23;:::i;:::-;2656:36;;2712:12;;;;2619;;2586:148;;;-1:-1:-1;2752:5:4;2095:668;-1:-1:-1;;;;;;2095:668:4:o;2768:662::-;2822:5;2875:3;2868:4;2860:6;2856:17;2852:27;2842:55;;2893:1;2890;2883:12;2842:55;2929:6;2916:20;2955:4;2979:60;2995:43;3035:2;2995:43;:::i;2979:60::-;3073:15;;;3159:1;3155:10;;;;3143:23;;3139:32;;;3104:12;;;;3183:15;;;3180:35;;;3211:1;3208;3201:12;3180:35;3247:2;3239:6;3235:15;3259:142;3275:6;3270:3;3267:15;3259:142;;;3341:17;;3329:30;;3379:12;;;;3292;;3259:142;;3435:663;3562:6;3570;3578;3631:2;3619:9;3610:7;3606:23;3602:32;3599:52;;;3647:1;3644;3637:12;3599:52;3687:9;3674:23;3716:18;3757:2;3749:6;3746:14;3743:34;;;3773:1;3770;3763:12;3743:34;3796:61;3849:7;3840:6;3829:9;3825:22;3796:61;:::i;:::-;3786:71;;3910:2;3899:9;3895:18;3882:32;3866:48;;3939:2;3929:8;3926:16;3923:36;;;3955:1;3952;3945:12;3923:36;;3978:63;4033:7;4022:8;4011:9;4007:24;3978:63;:::i;:::-;3968:73;;;4088:2;4077:9;4073:18;4060:32;4050:42;;3435:663;;;;;:::o;4103:248::-;4171:6;4179;4232:2;4220:9;4211:7;4207:23;4203:32;4200:52;;;4248:1;4245;4238:12;4200:52;-1:-1:-1;;4271:23:4;;;4341:2;4326:18;;;4313:32;;-1:-1:-1;4103:248:4:o;4356:254::-;4424:6;4432;4485:2;4473:9;4464:7;4460:23;4456:32;4453:52;;;4501:1;4498;4491:12;4453:52;4524:29;4543:9;4524:29;:::i;:::-;4514:39;4600:2;4585:18;;;;4572:32;;-1:-1:-1;;;4356:254:4:o;4615:595::-;4733:6;4741;4794:2;4782:9;4773:7;4769:23;4765:32;4762:52;;;4810:1;4807;4800:12;4762:52;4850:9;4837:23;4879:18;4920:2;4912:6;4909:14;4906:34;;;4936:1;4933;4926:12;4906:34;4959:61;5012:7;5003:6;4992:9;4988:22;4959:61;:::i;:::-;4949:71;;5073:2;5062:9;5058:18;5045:32;5029:48;;5102:2;5092:8;5089:16;5086:36;;;5118:1;5115;5108:12;5086:36;;5141:63;5196:7;5185:8;5174:9;5170:24;5141:63;:::i;:::-;5131:73;;;4615:595;;;;;:::o;5215:348::-;5299:6;5352:2;5340:9;5331:7;5327:23;5323:32;5320:52;;;5368:1;5365;5358:12;5320:52;5408:9;5395:23;5441:18;5433:6;5430:30;5427:50;;;5473:1;5470;5463:12;5427:50;5496:61;5549:7;5540:6;5529:9;5525:22;5496:61;:::i;:::-;5486:71;5215:348;-1:-1:-1;;;;5215:348:4:o;6716:186::-;6775:6;6828:2;6816:9;6807:7;6803:23;6799:32;6796:52;;;6844:1;6841;6834:12;6796:52;6867:29;6886:9;6867:29;:::i;:::-;6857:39;6716:186;-1:-1:-1;;;6716:186:4:o;6907:391::-;6993:6;7001;7009;7017;7070:3;7058:9;7049:7;7045:23;7041:33;7038:53;;;7087:1;7084;7077:12;7038:53;7123:9;7110:23;7100:33;;7180:2;7169:9;7165:18;7152:32;7142:42;;7231:2;7220:9;7216:18;7203:32;7193:42;;7254:38;7288:2;7277:9;7273:18;7254:38;:::i;:::-;7244:48;;6907:391;;;;;;;:::o;7627:1178::-;7895:2;7907:21;;;7977:13;;7880:18;;;7999:22;;;7847:4;;8074;;8052:2;8037:18;;;8101:15;;;7847:4;8144:169;8158:6;8155:1;8152:13;8144:169;;;8219:13;;8207:26;;8253:12;;;;8288:15;;;;8180:1;8173:9;8144:169;;;-1:-1:-1;;;8349:19:4;;;8329:18;;;8322:47;8419:13;;8441:21;;;8517:15;;;;8480:12;;;8552:1;8562:215;8578:8;8573:3;8570:17;8562:215;;;8651:15;;-1:-1:-1;;;;;8647:41:4;8633:56;;8750:17;;;;8711:14;;;;8685:1;8597:11;8562:215;;;-1:-1:-1;8794:5:4;;7627:1178;-1:-1:-1;;;;;;;7627:1178:4:o;8810:346::-;9012:2;8994:21;;;9051:2;9031:18;;;9024:30;-1:-1:-1;;;9085:2:4;9070:18;;9063:52;9147:2;9132:18;;8810:346::o;9161:127::-;9222:10;9217:3;9213:20;9210:1;9203:31;9253:4;9250:1;9243:15;9277:4;9274:1;9267:15;9293:127;9354:10;9349:3;9345:20;9342:1;9335:31;9385:4;9382:1;9375:15;9409:4;9406:1;9399:15;9425:125;9490:9;;;9511:10;;;9508:36;;;9524:18;;:::i;9555:135::-;9594:3;9615:17;;;9612:43;;9635:18;;:::i;:::-;-1:-1:-1;9682:1:4;9671:13;;9555:135::o;9695:405::-;9897:2;9879:21;;;9936:2;9916:18;;;9909:30;9975:34;9970:2;9955:18;;9948:62;-1:-1:-1;;;10041:2:4;10026:18;;10019:39;10090:3;10075:19;;9695:405::o;10450:128::-;10517:9;;;10538:11;;;10535:37;;;10552:18;;:::i;10583:168::-;10656:9;;;10687;;10704:15;;;10698:22;;10684:37;10674:71;;10725:18;;:::i;11065:184::-;11135:6;11188:2;11176:9;11167:7;11163:23;11159:32;11156:52;;;11204:1;11201;11194:12;11156:52;-1:-1:-1;11227:16:4;;11065:184;-1:-1:-1;11065:184:4:o;11634:277::-;11701:6;11754:2;11742:9;11733:7;11729:23;11725:32;11722:52;;;11770:1;11767;11760:12;11722:52;11802:9;11796:16;11855:5;11848:13;11841:21;11834:5;11831:32;11821:60;;11877:1;11874;11867:12;16731:217;16771:1;16797;16787:132;;16841:10;16836:3;16832:20;16829:1;16822:31;16876:4;16873:1;16866:15;16904:4;16901:1;16894:15;16787:132;-1:-1:-1;16933:9:4;;16731:217::o
Swarm Source
ipfs://2f69dd68b47b712afde610d8efbf38847f0739fa9372b85bb63f39bf1fa3415d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.