Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,466 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 22442010 | 209 days ago | IN | 0 ETH | 0.00010584 | ||||
| I Can Read | 22432330 | 210 days ago | IN | 0 ETH | 0.00005851 | ||||
| I Can Read | 22432329 | 210 days ago | IN | 0 ETH | 0.00015907 | ||||
| I Can Read | 22425588 | 211 days ago | IN | 0 ETH | 0.00021983 | ||||
| I Can Read | 22425582 | 211 days ago | IN | 0 ETH | 0.00023455 | ||||
| I Can Read | 22425572 | 211 days ago | IN | 0 ETH | 0.00032428 | ||||
| I Can Read | 22425550 | 211 days ago | IN | 0 ETH | 0.00026856 | ||||
| I Can Read | 22425536 | 211 days ago | IN | 0 ETH | 0.00026542 | ||||
| Safe Transfer Fr... | 22425310 | 211 days ago | IN | 0 ETH | 0.00015551 | ||||
| Safe Transfer Fr... | 22379009 | 218 days ago | IN | 0 ETH | 0.0000658 | ||||
| Set Approval For... | 22359985 | 221 days ago | IN | 0 ETH | 0.0000369 | ||||
| I Can Read | 22355656 | 221 days ago | IN | 0 ETH | 0.00001252 | ||||
| I Can Read | 22355656 | 221 days ago | IN | 0 ETH | 0.00003355 | ||||
| Where Is The Egg | 22355656 | 221 days ago | IN | 0.011 ETH | 0.00001282 | ||||
| I Can Read | 22351621 | 222 days ago | IN | 0 ETH | 0.00008194 | ||||
| I Can Read | 22349674 | 222 days ago | IN | 0 ETH | 0.00007626 | ||||
| Safe Transfer Fr... | 22348618 | 222 days ago | IN | 0 ETH | 0.00005393 | ||||
| Set Approval For... | 22348441 | 222 days ago | IN | 0 ETH | 0.00233593 | ||||
| Safe Transfer Fr... | 22348432 | 222 days ago | IN | 0 ETH | 0.00006253 | ||||
| I Can Read | 22348424 | 222 days ago | IN | 0 ETH | 0.00007594 | ||||
| Set Approval For... | 22348410 | 222 days ago | IN | 0 ETH | 0.00003016 | ||||
| Set Approval For... | 22348410 | 222 days ago | IN | 0 ETH | 0.00005107 | ||||
| I Can Read | 22348400 | 222 days ago | IN | 0 ETH | 0.00004744 | ||||
| Set Approval For... | 22348383 | 222 days ago | IN | 0 ETH | 0.00005489 | ||||
| I Can Read | 22348360 | 222 days ago | IN | 0 ETH | 0.00008434 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22442010 | 209 days ago | 12.221 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ZegsEggs
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
/*
:..........:.....................................................................................::.
:...............................................................................................:...
:..................................................................................................:
:...................................................................................................
:...............................................................................................::.:
:..................................................................................................:
:...................................................................................................
:.................................................................................................:.
:..................................................................................................:
:.................................................................................................::
:.................................................................................................::
:...........................................::....................................................::
:.......................................=:=#%%%##%#++=:..........................................:..
:.....................................-*+:.-%#+=:.=#%%#*-.........................................::
:.....................................+=+::+#=:#%=.:#%%%%+:........................................:
:.................................:-==##+#%%#=:=+...=%%%##=........................................:
:..............................-+*%%%%%%%%%%%#-.....=%%%%%#+....................................::::
...........................-*%#+++===-=--+%%%%%*===#%%%%%%%#.....................................:::
........................................:*%%%%%%%%%%%%%%#%%%......................................::
:.......................................=#%%%%%%%%%%%%%%%%%%...................................:::::
:.......................................#%%%#%%#%%%%%%%%%%%#.....................................:::
:................................:-....=*%%%%%%%%%%%%%%%%%%%+..................................:::::
:................................:.....=+%%%%%%%%%%%%%%#%%%%#.....................................::
:.....................................::*%%%%%%%%%%%%%%%%%%%%-...................................:::
:.....................................:.##%%%%%%%%%%%%%%%%%%%#-.................................:.::
:........::.............................##%%%%%%%%%%%%%%##%%%#-..................................:::
:......................................:+%%%%%%%%%%%%%%%#%%%%#-...............................::::::
:.......................................-%%%%%%%%%%%%%%%%##%%%*-.................................:::
:.......................................=%%%%%%%%%%%%%%%%%%%%%#=:...............................:.::
:.......................................=#%%%%%%%%%%%%%%%%%%%%%#-.................................::
.........................................-%%%%%%%%%%%%%%%%%%%%%#-..................................:
.........................................-#%%%%%%%%%%%%%%%%%%%%#=..................................:
..........................................-#%%%%%%%%%%%%%%%%%%%*:.................................::
:..........................................=##%%%%%%%%%%%%%%#%%#=..................................:
:............................................:*#%%###########%%%#=:..............................:..
:..............................................-=+%#%%%#####%##%%%*-.............................:.:
:...........................................::...:%#==+*%**=::+#*##%*-............................::
:................................................-%*.::+%-.....-++**#*#+:.........................::
.................................................=#-...+%=......-+++:+==*+:........................:
.................................................+%:...+%-.......-::+::=.:::........................
.................................................*%....=#-...........=..............................
.................................................##....=#-.......................................:::
................................................:#*....-#-......................................:..:
................................................:%=....-*-.......................................:::
................................................-#:....-*-....................................::.:::
................................................=#.....-*:.........................................:
...............................................:*=.....-+:..........................................
............................................:-*#%#+::-+**+:.........................................
.........................................:-+*+***%+#****#*#==----::.:..............................:
..........................................-:.-=::-.::=::-:.:........................................
....................................................................................................
....................................................................................................
....................................................................................................
....................................................................................................
....................................................................................................
*/
import "https://raw.githubusercontent.com/Vectorized/solady/main/src/auth/Ownable.sol";
import "https://raw.githubusercontent.com/Vectorized/solady/main/src/tokens/ERC721.sol";
//special thanks to @bantg for his ridiculous Legible Math library which inspired this whole thing
abstract contract ERCSevenTwentyOne is ERC721 {}
/*──────────── 16‑bit signed numerator | 16‑bit unsigned denominator ──────────*/
type LM is uint32;
uint32 constant _DEN_MASK = 0xFFFF;
int256 constant _LIM = 32_767;
/*─────────── custom errors ───────────*/
error NotInteger(int256 num, int256 den);
error OutOfRange(int256 value);
error Overflow();
/*─────────── helpers ───────────*/
function _split(LM _f) pure returns (int256 num, int256 den) {
uint32 raw = LM.unwrap(_f);
// high 16 bits → signed numerator
num = int256(int16(uint16(raw >> 16)));
// low 16 bits → unsigned denominator, then widen safely
den = int256(uint256(uint16(raw & _DEN_MASK)));
}
function _gcd(int256 _x, int256 _y) pure returns (int256) {
while (_y != 0) (_x, _y) = (_y, _x % _y);
return _x >= 0 ? _x : -_x;
}
function _encode(int256 _n, int256 _d) pure returns (LM) {
if (_d <= 0 || _d > _LIM || _n < -_LIM || _n > _LIM) revert Overflow();
// pack a 16-bit signed numerator and 16-bit unsigned denominator into 32 bits
// ensure shift occurs on a 32-bit value so bits are not truncated
uint32 numBits = uint32(uint16(int16(_n)));
uint32 denBits = uint32(uint16(uint256(_d)));
uint32 packed = (numBits << 16) | denBits;
return LM.wrap(packed);
}
function _reduce(int256 _n, int256 _d) pure returns (LM) {
int256 _g = _gcd(_n, _d);
return _encode(_n / _g, _d / _g);
}
/*─────────── operator overloads ───────────*/
function _plus(LM _x, LM _y) pure returns (LM) {
(int256 nx, int256 dx) = _split(_x);
(int256 ny, int256 dy) = _split(_y);
return _reduce(nx * dy + ny * dx, dx * dy);
}
function _minus(LM _x, LM _y) pure returns (LM) {
(int256 nx, int256 dx) = _split(_x);
(int256 ny, int256 dy) = _split(_y);
return _reduce(nx * dy - ny * dx, dx * dy);
}
function _times(LM _x, LM _y) pure returns (LM) {
(int256 nx, int256 dx) = _split(_x);
(int256 ny, int256 dy) = _split(_y);
return _reduce(nx * ny, dx * dy);
}
function _over(LM _x, LM _y) pure returns (LM) {
(int256 nx, int256 dx) = _split(_x);
(int256 ny, int256 dy) = _split(_y);
if (ny == 0) revert();
return _reduce(nx * dy, dx * ny);
}
/* Make the symbols work everywhere */
using {_plus as +, _minus as -, _times as *, _over as / } for LM global;
/*─────────── public helpers ───────────*/
library LegibleMath {
struct Fraction {
int256 num;
int256 den;
}
function literally(LM _f) internal pure returns (int256) {
(int256 _n, int256 _d) = _split(_f);
if (_n % _d != 0) revert NotInteger(_n, _d);
int256 val = _n / _d;
if (val < -11 || val > 11) revert OutOfRange(val);
return val;
}
function toFraction(LM _f) internal pure returns (int256 num, int256 den) {
(num, den) = _split(_f);
}
}
using LegibleMath for LM global;
/*─────────── compile‑time packed constants ──────────*/
/* (num << 16) | den */
LM constant a = LM.wrap(0xfffd0050); // -3 / 80
LM constant e = LM.wrap(0x00010001); // 1 / 1
LM constant f = LM.wrap(0x00050009); // 5 / 9
LM constant g = LM.wrap(0x0008001b); // 8 / 27
LM constant h = LM.wrap(0x0003000a); // 3 / 10
LM constant i = LM.wrap(0x00090001); // 9 / 1
LM constant l = LM.wrap(0x000b0001); // 11 / 1
LM constant n = LM.wrap(0x00010001); // 1 / 1
LM constant o = LM.wrap(0x00010001); // 1 / 1
LM constant r = LM.wrap(0x00010001); // 1 / 1
LM constant s = LM.wrap(0x00070001); // 7 / 1
LM constant t = LM.wrap(0x000a0001); // 10 / 1
LM constant u = LM.wrap(0x00240005); // 36 / 5
LM constant v = LM.wrap(0x00010001); // 1 / 1
LM constant w = LM.wrap(0x00010005); // 1 / 5
LM constant x = LM.wrap(0x00020015); // 2 / 21
LM constant z = LM.wrap(0x00000001); // 0 / 1
abstract contract LegibleKeccak {
function keccak(bytes memory input) internal pure returns (uint256) {
return uint256(keccak256(input));
}
}
contract ZegsEggs is ERCSevenTwentyOne, LegibleKeccak, Ownable {
constructor(string memory tokenZeroMetadata) {
_initializeOwner(msg.sender);
_mint(msg.sender, zero);
tokenMetadata[zero] = tokenZeroMetadata;
}
function name() public pure override returns (string memory) { return "Zeg's Eggs"; }
function symbol() public pure override returns (string memory) { return "ZEGG"; }
uint zero = uint((z * e * r * o).literally());
uint one = uint((o * n * e).literally());
uint two = uint((t * w * o).literally());
uint three = uint((t * h * r * e * e).literally());
uint four = uint((f * o * u * r).literally());
uint five = uint((f * i * v * e).literally());
uint six = uint((s * i * x).literally());
uint seven = uint((s * e * v * e * n).literally());
uint eight = uint((e * i * g * h * t).literally());
uint nine = uint((n * i * n * e).literally());
uint ten = uint((t * e * n).literally());
uint eleven = uint((e * l * e * v * e * n).literally());
uint nineteen = two + eight + nine;
uint public sixtynine = eleven * six + three;
uint public fourtwenty = three * four * five * seven;
uint twofiftysix = eight * eight * four;
uint thousand = ten * ten * ten;
uint million = thousand * thousand;
uint public MAP_SIZE = eleven * ten * ten + eleven;
uint public ENTRY_FEE = eleven * million * million * thousand;
uint public HUNT_DURATION_BLOCKS = eleven * ten * ten + eleven;
uint public EGG_COUNT = eleven;
address ZERO_ADDRESS;
enum GamePhase {
PreHunt, // zero
HuntActive, // one
HuntEnded // two
}
struct Player {
address addr;
uint x;
uint y;
}
struct Egg {
uint x;
uint y;
bool claimed;
bool revealed;
address winner;
}
Player[] public players;
mapping(address => uint) public entriesByAddress;
mapping(uint => Egg) public eggs;
mapping(uint => string) internal tokenMetadata;
mapping(uint => mapping(uint => bool)) coordsTaken;
uint public gameStartBlock;
bool public gameStarted;
bool public gameFinalized;
GamePhase public gamePhase = GamePhase.PreHunt;
event PlayerGuessed(address indexed player, uint x, uint y);
event EggRevealed(uint eggIndex, uint eggX, uint eggY);
modifier onlyDuringGame() {
require(gameStarted, "Game not started");
require(block.number <= gameStartBlock + HUNT_DURATION_BLOCKS, "Game ended");
_;
}
modifier onlyAfterGame() {
require(gameStarted, "Game not started");
require(block.number > gameStartBlock + HUNT_DURATION_BLOCKS, "Game still active");
_;
}
function startGame() external onlyOwner {
require(!gameStarted, "Game already started");
gameStartBlock = block.number;
gameStarted = true;
gamePhase = GamePhase.HuntActive;
}
function setZeroAddress(address _zeroAddress) external onlyOwner {
ZERO_ADDRESS = _zeroAddress;
}
function getBlocksUntilGameOver() external view returns (uint) {
if (block.number >= gameStartBlock + HUNT_DURATION_BLOCKS) return zero;
return (gameStartBlock + HUNT_DURATION_BLOCKS) - block.number;
}
function whereIsTheEgg(uint xCoord, uint yCoord) external payable onlyDuringGame {
require(entriesByAddress[msg.sender] < three, "Maximum guesses reached");
require((msg.value == ENTRY_FEE), "Incorrect entry fee");
require(players.length < eleven * ten * ten + eleven, "Max players reached");
require((xCoord <= MAP_SIZE && yCoord <= MAP_SIZE), "Invalid coordinates");
require(!coordsTaken[xCoord][yCoord], "That spot has already been claimed.");
coordsTaken[xCoord][yCoord] = true;
players.push(Player(msg.sender, xCoord, yCoord));
entriesByAddress[msg.sender]++;
emit PlayerGuessed(msg.sender, xCoord, yCoord);
}
function getAllPlayerGuesses()
external
view
returns (address[] memory addrs, uint[] memory xs, uint[] memory ys)
{
uint len = players.length;
addrs = new address[](len);
xs = new uint[](len);
ys = new uint[](len);
for (uint index = zero; index < len; index++) {
Player memory player = players[index];
addrs[index] = player.addr;
xs[index] = player.x;
ys[index] = player.y;
}
}
function revealEgg(uint eggId) external {
require(gameStarted, "Game not started");
require(eggId >= one && eggId <= eleven, "Invalid egg ID");
require(!eggs[eggId].revealed, "Already revealed");
uint revealBase = gameStartBlock + HUNT_DURATION_BLOCKS;
uint xBlock = revealBase + eggId + one; // offset for X
uint yBlock = revealBase + eggId + two; // offset for Y
require(block.number > yBlock, "Too early to reveal");
require(block.number <= yBlock + twofiftysix, "Reveal window expired");
uint eggX = uint(keccak(abi.encodePacked(blockhash(xBlock), "EGG", eggId, address(this)))) % MAP_SIZE;
uint eggY = uint(keccak(abi.encodePacked(blockhash(yBlock), "EGG", eggId, address(this)))) % MAP_SIZE;
eggs[eggId] = Egg({x: eggX, y: eggY, revealed: true, claimed: false, winner: address(ZERO_ADDRESS)});
emit EggRevealed(eggId, eggX, eggY);
if (gamePhase == GamePhase.HuntActive) {
gamePhase = GamePhase.HuntEnded;
}
if (!gameFinalized) {
gameFinalized = true;
}
}
function getEggCoords(uint eggId) external view returns (uint xCoord, uint yCoord) {
Egg memory egg = eggs[eggId];
require(gameFinalized, "Game not finalized");
require(egg.revealed, "Egg not revealed yet");
require(eggId >= one && eggId <= eleven, "Invalid egg ID");
return (egg.x, egg.y);
}
function getWinner(uint eggId) public view returns (address) {
Egg memory egg = eggs[eggId];
require(gameFinalized, "Game not finalized");
require(egg.revealed, "Egg mot revealed yet");
require(eggId >= one && eggId <= eleven, "Invalid egg ID");
uint closestIndex = zero;
uint minDistance = type(uint).max;
for (uint index = zero; index < players.length; index++) {
Player memory player = players[index];
uint dx = player.x > egg.x ? player.x - egg.x : egg.x - player.x;
uint dy = player.y > egg.y ? player.y - egg.y : egg.y - player.y;
uint dist = dx * dx + dy * dy;
if (dist < minDistance) {
minDistance = dist;
closestIndex = index;
}
}
return players[closestIndex].addr;
}
function ownerClaimEgg(uint eggId) public onlyOwner {
Egg memory egg = eggs[eggId];
require(gameFinalized, "Game not finalized");
require(!egg.claimed, "Egg already claimed");
require(egg.revealed, "Egg not yet revealed");
address winner = getWinner(eggId);
egg.winner = winner;
egg.claimed = true;
eggs[eggId] = egg;
_mint(winner, eggId);
}
function ownerClaimAll() external onlyOwner {
for (uint eggId = one; eggId <= eleven; eggId++) {
if (!eggs[eggId].claimed) {
ownerClaimEgg(eggId);
}
}
}
function getGuessCount() external view returns (uint) {
return players.length;
}
function isGameActive() external view returns (bool) {
return gameStarted && block.number <= gameStartBlock + HUNT_DURATION_BLOCKS && !gameFinalized;
}
mapping(address => bool) public canRead;
address[] public readers;
function iCanRead() external {
require(entriesByAddress[msg.sender] > zero, "Only hunters can sign.");
require(!canRead[msg.sender], "Already signed.");
canRead[msg.sender] = true;
readers.push(msg.sender);
}
function getReaders() external view returns (address[] memory) {
return readers;
}
function updateMetadata(uint tokenId, string memory metadata) external onlyOwner {
require(tokenId <= eleven, "Nonexistent token");
tokenMetadata[tokenId] = metadata;
}
function tokenURI(uint tokenId) public view override returns (string memory) {
require(_exists(tokenId), "Nonexistent token");
require(tokenId <= eleven, "Nonexistent token");
return tokenMetadata[tokenId];
}
function withdraw() external onlyOwner {
require(address(this).balance > zero, "No ETH to withdraw");
(bool success,) = payable(owner()).call{value: address(this).balance}("");
require(success, "Withdraw failed");
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple ERC721 implementation with storage hitchhiking.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC721.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol)
///
/// @dev Note:
/// - The ERC721 standard allows for self-approvals.
/// For performance, this implementation WILL NOT revert for such actions.
/// Please add any checks with overrides if desired.
/// - For performance, methods are made payable where permitted by the ERC721 standard.
/// - The `safeTransfer` functions use the identity precompile (0x4)
/// to copy memory internally.
///
/// If you are overriding:
/// - NEVER violate the ERC721 invariant:
/// the balance of an owner MUST always be equal to their number of ownership slots.
/// The transfer functions do not have an underflow guard for user token balances.
/// - Make sure all variables written to storage are properly cleaned
/// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).
/// - Check that the overridden function is actually used in the function you want to
/// change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC721 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CONSTANTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev An account can hold up to 4294967295 tokens.
uint256 internal constant _MAX_ACCOUNT_BALANCE = 0xffffffff;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Only the token owner or an approved account can manage the token.
error NotOwnerNorApproved();
/// @dev The token does not exist.
error TokenDoesNotExist();
/// @dev The token already exists.
error TokenAlreadyExists();
/// @dev Cannot query the balance for the zero address.
error BalanceQueryForZeroAddress();
/// @dev Cannot mint or transfer to the zero address.
error TransferToZeroAddress();
/// @dev The token must be owned by `from`.
error TransferFromIncorrectOwner();
/// @dev The recipient's balance has overflowed.
error AccountBalanceOverflow();
/// @dev Cannot safely transfer to a contract that does not implement
/// the ERC721Receiver interface.
error TransferToNonERC721ReceiverImplementer();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Emitted when token `id` is transferred from `from` to `to`.
event Transfer(address indexed from, address indexed to, uint256 indexed id);
/// @dev Emitted when `owner` enables `account` to manage the `id` token.
event Approval(address indexed owner, address indexed account, uint256 indexed id);
/// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.
event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);
/// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
uint256 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
/// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
uint256 private constant _APPROVAL_EVENT_SIGNATURE =
0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;
/// @dev `keccak256(bytes("ApprovalForAll(address,address,bool)"))`.
uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =
0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership data slot of `id` is given by:
/// ```
/// mstore(0x00, id)
/// mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
/// let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
/// ```
/// Bits Layout:
/// - [0..159] `addr`
/// - [160..255] `extraData`
///
/// The approved address slot is given by: `add(1, ownershipSlot)`.
///
/// See: https://notes.ethereum.org/%40vbuterin/verkle_tree_eip
///
/// The balance slot of `owner` is given by:
/// ```
/// mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
/// mstore(0x00, owner)
/// let balanceSlot := keccak256(0x0c, 0x1c)
/// ```
/// Bits Layout:
/// - [0..31] `balance`
/// - [32..255] `aux`
///
/// The `operator` approval slot of `owner` is given by:
/// ```
/// mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
/// mstore(0x00, owner)
/// let operatorApprovalSlot := keccak256(0x0c, 0x30)
/// ```
uint256 private constant _ERC721_MASTER_SLOT_SEED = 0x7d8825530a5a2e7a << 192;
/// @dev Pre-shifted and pre-masked constant.
uint256 private constant _ERC721_MASTER_SLOT_SEED_MASKED = 0x0a5a2e7a00000000;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC721 METADATA */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the token collection name.
function name() public view virtual returns (string memory);
/// @dev Returns the token collection symbol.
function symbol() public view virtual returns (string memory);
/// @dev Returns the Uniform Resource Identifier (URI) for token `id`.
function tokenURI(uint256 id) public view virtual returns (string memory);
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC721 */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of token `id`.
///
/// Requirements:
/// - Token `id` must exist.
function ownerOf(uint256 id) public view virtual returns (address result) {
result = _ownerOf(id);
/// @solidity memory-safe-assembly
assembly {
if iszero(result) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns the number of tokens owned by `owner`.
///
/// Requirements:
/// - `owner` must not be the zero address.
function balanceOf(address owner) public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
// Revert if the `owner` is the zero address.
if iszero(owner) {
mstore(0x00, 0x8f4eb604) // `BalanceQueryForZeroAddress()`.
revert(0x1c, 0x04)
}
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
result := and(sload(keccak256(0x0c, 0x1c)), _MAX_ACCOUNT_BALANCE)
}
}
/// @dev Returns the account approved to manage token `id`.
///
/// Requirements:
/// - Token `id` must exist.
function getApproved(uint256 id) public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
if iszero(shl(96, sload(ownershipSlot))) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
result := sload(add(1, ownershipSlot))
}
}
/// @dev Sets `account` as the approved account to manage token `id`.
///
/// Requirements:
/// - Token `id` must exist.
/// - The caller must be the owner of the token,
/// or an approved operator for the token owner.
///
/// Emits an {Approval} event.
function approve(address account, uint256 id) public payable virtual {
_approve(msg.sender, account, id);
}
/// @dev Returns whether `operator` is approved to manage the tokens of `owner`.
function isApprovedForAll(address owner, address operator)
public
view
virtual
returns (bool result)
{
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, operator)
mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
mstore(0x00, owner)
result := sload(keccak256(0x0c, 0x30))
}
}
/// @dev Sets whether `operator` is approved to manage the tokens of the caller.
///
/// Emits an {ApprovalForAll} event.
function setApprovalForAll(address operator, bool isApproved) public virtual {
/// @solidity memory-safe-assembly
assembly {
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`msg.sender`, `operator`).
mstore(0x1c, operator)
mstore(0x08, _ERC721_MASTER_SLOT_SEED_MASKED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x30), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
// forgefmt: disable-next-item
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))
}
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function transferFrom(address from, address to, uint256 id) public payable virtual {
_beforeTokenTransfer(from, to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
from := and(bitmaskAddress, from)
to := and(bitmaskAddress, to)
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, caller()))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
let owner := and(bitmaskAddress, ownershipPacked)
// Revert if the token does not exist, or if `from` is not the owner.
if iszero(mul(owner, eq(owner, from))) {
// `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
revert(0x1c, 0x04)
}
// Load, check, and update the token approval.
{
mstore(0x00, from)
let approvedAddress := sload(add(1, ownershipSlot))
// Revert if the caller is not the owner, nor approved.
if iszero(or(eq(caller(), from), eq(caller(), approvedAddress))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Update with the new owner.
sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
// Decrement the balance of `from`.
{
let fromBalanceSlot := keccak256(0x0c, 0x1c)
sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
}
// Increment the balance of `to`.
{
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x1c)
let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
}
_afterTokenTransfer(from, to, id);
}
/// @dev Equivalent to `safeTransferFrom(from, to, id, "")`.
function safeTransferFrom(address from, address to, uint256 id) public payable virtual {
transferFrom(from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function safeTransferFrom(address from, address to, uint256 id, bytes calldata data)
public
payable
virtual
{
transferFrom(from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/// @dev Returns true if this contract implements the interface defined by `interfaceId`.
/// See: https://eips.ethereum.org/EIPS/eip-165
/// This function call must use less than 30000 gas.
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
let s := shr(224, interfaceId)
// ERC165: 0x01ffc9a7, ERC721: 0x80ac58cd, ERC721Metadata: 0x5b5e139f.
result := or(or(eq(s, 0x01ffc9a7), eq(s, 0x80ac58cd)), eq(s, 0x5b5e139f))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL QUERY FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns if token `id` exists.
function _exists(uint256 id) internal view virtual returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := iszero(iszero(shl(96, sload(add(id, add(id, keccak256(0x00, 0x20)))))))
}
}
/// @dev Returns the owner of token `id`.
/// Returns the zero address instead of reverting if the token does not exist.
function _ownerOf(uint256 id) internal view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := shr(96, shl(96, sload(add(id, add(id, keccak256(0x00, 0x20))))))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL DATA HITCHHIKING FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
// For performance, no events are emitted for the hitchhiking setters.
// Please emit your own events if required.
/// @dev Returns the auxiliary data for `owner`.
/// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
/// Auxiliary data can be set for any address, even if it does not have any tokens.
function _getAux(address owner) internal view virtual returns (uint224 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
result := shr(32, sload(keccak256(0x0c, 0x1c)))
}
}
/// @dev Set the auxiliary data for `owner` to `value`.
/// Minting, transferring, burning the tokens of `owner` will not change the auxiliary data.
/// Auxiliary data can be set for any address, even if it does not have any tokens.
function _setAux(address owner, uint224 value) internal virtual {
/// @solidity memory-safe-assembly
assembly {
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
mstore(0x00, owner)
let balanceSlot := keccak256(0x0c, 0x1c)
let packed := sload(balanceSlot)
sstore(balanceSlot, xor(packed, shl(32, xor(value, shr(32, packed)))))
}
}
/// @dev Returns the extra data for token `id`.
/// Minting, transferring, burning a token will not change the extra data.
/// The extra data can be set on a non-existent token.
function _getExtraData(uint256 id) internal view virtual returns (uint96 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := shr(160, sload(add(id, add(id, keccak256(0x00, 0x20)))))
}
}
/// @dev Sets the extra data for token `id` to `value`.
/// Minting, transferring, burning a token will not change the extra data.
/// The extra data can be set on a non-existent token.
function _setExtraData(uint256 id, uint96 value) internal virtual {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let packed := sload(ownershipSlot)
sstore(ownershipSlot, xor(packed, shl(160, xor(value, shr(160, packed)))))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL MINT FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Mints token `id` to `to`.
///
/// Requirements:
///
/// - Token `id` must not exist.
/// - `to` cannot be the zero address.
///
/// Emits a {Transfer} event.
function _mint(address to, uint256 id) internal virtual {
_beforeTokenTransfer(address(0), to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
to := shr(96, shl(96, to))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
// Revert if the token already exists.
if shl(96, ownershipPacked) {
mstore(0x00, 0xc991cbb1) // `TokenAlreadyExists()`.
revert(0x1c, 0x04)
}
// Update with the owner.
sstore(ownershipSlot, or(ownershipPacked, to))
// Increment the balance of the owner.
{
mstore(0x00, to)
let balanceSlot := keccak256(0x0c, 0x1c)
let balanceSlotPacked := add(sload(balanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(balanceSlot, balanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
}
_afterTokenTransfer(address(0), to, id);
}
/// @dev Mints token `id` to `to`, and updates the extra data for token `id` to `value`.
/// Does NOT check if token `id` already exists (assumes `id` is auto-incrementing).
///
/// Requirements:
///
/// - `to` cannot be the zero address.
///
/// Emits a {Transfer} event.
function _mintAndSetExtraDataUnchecked(address to, uint256 id, uint96 value) internal virtual {
_beforeTokenTransfer(address(0), to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
to := shr(96, shl(96, to))
// Update with the owner and extra data.
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
sstore(add(id, add(id, keccak256(0x00, 0x20))), or(shl(160, value), to))
// Increment the balance of the owner.
{
mstore(0x00, to)
let balanceSlot := keccak256(0x0c, 0x1c)
let balanceSlotPacked := add(sload(balanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(balanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(balanceSlot, balanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, 0, to, id)
}
_afterTokenTransfer(address(0), to, id);
}
/// @dev Equivalent to `_safeMint(to, id, "")`.
function _safeMint(address to, uint256 id) internal virtual {
_safeMint(to, id, "");
}
/// @dev Mints token `id` to `to`.
///
/// Requirements:
///
/// - Token `id` must not exist.
/// - `to` cannot be the zero address.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeMint(address to, uint256 id, bytes memory data) internal virtual {
_mint(to, id);
if (_hasCode(to)) _checkOnERC721Received(address(0), to, id, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL BURN FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_burn(address(0), id)`.
function _burn(uint256 id) internal virtual {
_burn(address(0), id);
}
/// @dev Destroys token `id`, using `by`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function _burn(address by, uint256 id) internal virtual {
address owner = ownerOf(id);
_beforeTokenTransfer(owner, address(0), id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
by := shr(96, shl(96, by))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
// Reload the owner in case it is changed in `_beforeTokenTransfer`.
owner := shr(96, shl(96, ownershipPacked))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// Load and check the token approval.
{
mstore(0x00, owner)
let approvedAddress := sload(add(1, ownershipSlot))
// If `by` is not the zero address, do the authorization check.
// Revert if the `by` is not the owner, nor approved.
if iszero(or(iszero(by), or(eq(by, owner), eq(by, approvedAddress)))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Clear the owner.
sstore(ownershipSlot, xor(ownershipPacked, owner))
// Decrement the balance of `owner`.
{
let balanceSlot := keccak256(0x0c, 0x1c)
sstore(balanceSlot, sub(sload(balanceSlot), 1))
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, owner, 0, id)
}
_afterTokenTransfer(owner, address(0), id);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL APPROVAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns whether `account` is the owner of token `id`, or is approved to manage it.
///
/// Requirements:
/// - Token `id` must exist.
function _isApprovedOrOwner(address account, uint256 id)
internal
view
virtual
returns (bool result)
{
/// @solidity memory-safe-assembly
assembly {
result := 1
// Clear the upper 96 bits.
account := shr(96, shl(96, account))
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, account))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let owner := shr(96, shl(96, sload(ownershipSlot)))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// Check if `account` is the `owner`.
if iszero(eq(account, owner)) {
mstore(0x00, owner)
// Check if `account` is approved to manage the token.
if iszero(sload(keccak256(0x0c, 0x30))) {
result := eq(account, sload(add(1, ownershipSlot)))
}
}
}
}
/// @dev Returns the account approved to manage token `id`.
/// Returns the zero address instead of reverting if the token does not exist.
function _getApproved(uint256 id) internal view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, id)
mstore(0x1c, _ERC721_MASTER_SLOT_SEED)
result := sload(add(1, add(id, add(id, keccak256(0x00, 0x20)))))
}
}
/// @dev Equivalent to `_approve(address(0), account, id)`.
function _approve(address account, uint256 id) internal virtual {
_approve(address(0), account, id);
}
/// @dev Sets `account` as the approved account to manage token `id`, using `by`.
///
/// Requirements:
/// - Token `id` must exist.
/// - If `by` is not the zero address, `by` must be the owner
/// or an approved operator for the token owner.
///
/// Emits a {Approval} event.
function _approve(address by, address account, uint256 id) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
account := and(bitmaskAddress, account)
by := and(bitmaskAddress, by)
// Load the owner of the token.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let owner := and(bitmaskAddress, sload(ownershipSlot))
// Revert if the token does not exist.
if iszero(owner) {
mstore(0x00, 0xceea21b6) // `TokenDoesNotExist()`.
revert(0x1c, 0x04)
}
// If `by` is not the zero address, do the authorization check.
// Revert if `by` is not the owner, nor approved.
if iszero(or(iszero(by), eq(by, owner))) {
mstore(0x00, owner)
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Sets `account` as the approved account to manage `id`.
sstore(add(1, ownershipSlot), account)
// Emit the {Approval} event.
log4(codesize(), 0x00, _APPROVAL_EVENT_SIGNATURE, owner, account, id)
}
}
/// @dev Approve or remove the `operator` as an operator for `by`,
/// without authorization checks.
///
/// Emits an {ApprovalForAll} event.
function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
by := shr(96, shl(96, by))
operator := shr(96, shl(96, operator))
// Convert to 0 or 1.
isApproved := iszero(iszero(isApproved))
// Update the `isApproved` for (`by`, `operator`).
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, operator))
mstore(0x00, by)
sstore(keccak256(0x0c, 0x30), isApproved)
// Emit the {ApprovalForAll} event.
mstore(0x00, isApproved)
log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, by, operator)
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL TRANSFER FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Equivalent to `_transfer(address(0), from, to, id)`.
function _transfer(address from, address to, uint256 id) internal virtual {
_transfer(address(0), from, to, id);
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
///
/// Emits a {Transfer} event.
function _transfer(address by, address from, address to, uint256 id) internal virtual {
_beforeTokenTransfer(from, to, id);
/// @solidity memory-safe-assembly
assembly {
// Clear the upper 96 bits.
let bitmaskAddress := shr(96, not(0))
from := and(bitmaskAddress, from)
to := and(bitmaskAddress, to)
by := and(bitmaskAddress, by)
// Load the ownership data.
mstore(0x00, id)
mstore(0x1c, or(_ERC721_MASTER_SLOT_SEED, by))
let ownershipSlot := add(id, add(id, keccak256(0x00, 0x20)))
let ownershipPacked := sload(ownershipSlot)
let owner := and(bitmaskAddress, ownershipPacked)
// Revert if the token does not exist, or if `from` is not the owner.
if iszero(mul(owner, eq(owner, from))) {
// `TokenDoesNotExist()`, `TransferFromIncorrectOwner()`.
mstore(shl(2, iszero(owner)), 0xceea21b6a1148100)
revert(0x1c, 0x04)
}
// Load, check, and update the token approval.
{
mstore(0x00, from)
let approvedAddress := sload(add(1, ownershipSlot))
// If `by` is not the zero address, do the authorization check.
// Revert if the `by` is not the owner, nor approved.
if iszero(or(iszero(by), or(eq(by, from), eq(by, approvedAddress)))) {
if iszero(sload(keccak256(0x0c, 0x30))) {
mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.
revert(0x1c, 0x04)
}
}
// Delete the approved address if any.
if approvedAddress { sstore(add(1, ownershipSlot), 0) }
}
// Update with the new owner.
sstore(ownershipSlot, xor(ownershipPacked, xor(from, to)))
// Decrement the balance of `from`.
{
let fromBalanceSlot := keccak256(0x0c, 0x1c)
sstore(fromBalanceSlot, sub(sload(fromBalanceSlot), 1))
}
// Increment the balance of `to`.
{
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x1c)
let toBalanceSlotPacked := add(sload(toBalanceSlot), 1)
// Revert if `to` is the zero address, or if the account balance overflows.
if iszero(mul(to, and(toBalanceSlotPacked, _MAX_ACCOUNT_BALANCE))) {
// `TransferToZeroAddress()`, `AccountBalanceOverflow()`.
mstore(shl(2, iszero(to)), 0xea553b3401336cea)
revert(0x1c, 0x04)
}
sstore(toBalanceSlot, toBalanceSlotPacked)
}
// Emit the {Transfer} event.
log4(codesize(), 0x00, _TRANSFER_EVENT_SIGNATURE, from, to, id)
}
_afterTokenTransfer(from, to, id);
}
/// @dev Equivalent to `_safeTransfer(from, to, id, "")`.
function _safeTransfer(address from, address to, uint256 id) internal virtual {
_safeTransfer(from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - The caller must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeTransfer(address from, address to, uint256 id, bytes memory data)
internal
virtual
{
_transfer(address(0), from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/// @dev Equivalent to `_safeTransfer(by, from, to, id, "")`.
function _safeTransfer(address by, address from, address to, uint256 id) internal virtual {
_safeTransfer(by, from, to, id, "");
}
/// @dev Transfers token `id` from `from` to `to`.
///
/// Requirements:
///
/// - Token `id` must exist.
/// - `from` must be the owner of the token.
/// - `to` cannot be the zero address.
/// - If `by` is not the zero address,
/// it must be the owner of the token, or be approved to manage the token.
/// - If `to` refers to a smart contract, it must implement
/// {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
///
/// Emits a {Transfer} event.
function _safeTransfer(address by, address from, address to, uint256 id, bytes memory data)
internal
virtual
{
_transfer(by, from, to, id);
if (_hasCode(to)) _checkOnERC721Received(from, to, id, data);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* HOOKS FOR OVERRIDING */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Hook that is called before any token transfers, including minting and burning.
function _beforeTokenTransfer(address from, address to, uint256 id) internal virtual {}
/// @dev Hook that is called after any token transfers, including minting and burning.
function _afterTokenTransfer(address from, address to, uint256 id) internal virtual {}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PRIVATE HELPERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns if `a` has bytecode of non-zero length.
function _hasCode(address a) private view returns (bool result) {
/// @solidity memory-safe-assembly
assembly {
result := extcodesize(a) // Can handle dirty upper bits.
}
}
/// @dev Perform a call to invoke {IERC721Receiver-onERC721Received} on `to`.
/// Reverts if the target does not support the function correctly.
function _checkOnERC721Received(address from, address to, uint256 id, bytes memory data)
private
{
/// @solidity memory-safe-assembly
assembly {
// Prepare the calldata.
let m := mload(0x40)
let onERC721ReceivedSelector := 0x150b7a02
mstore(m, onERC721ReceivedSelector)
mstore(add(m, 0x20), caller()) // The `operator`, which is always `msg.sender`.
mstore(add(m, 0x40), shr(96, shl(96, from)))
mstore(add(m, 0x60), id)
mstore(add(m, 0x80), 0x80)
let n := mload(data)
mstore(add(m, 0xa0), n)
if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xc0), n)) }
// Revert if the call reverts.
if iszero(call(gas(), to, 0, add(m, 0x1c), add(n, 0xa4), m, 0x20)) {
if returndatasize() {
// Bubble up the revert if the call reverts.
returndatacopy(m, 0x00, returndatasize())
revert(m, returndatasize())
}
}
// Load the returndata and compare it.
if iszero(eq(mload(m), shl(224, onERC721ReceivedSelector))) {
mstore(0x00, 0xd1a57ed6) // `TransferToNonERC721ReceiverImplementer()`.
revert(0x1c, 0x04)
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The caller is not authorized to call the function.
error Unauthorized();
/// @dev The `newOwner` cannot be the zero address.
error NewOwnerIsZeroAddress();
/// @dev The `pendingOwner` does not have a valid handover request.
error NoHandoverRequest();
/// @dev Cannot double-initialize.
error AlreadyInitialized();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The ownership is transferred from `oldOwner` to `newOwner`.
/// This event is intentionally kept the same as OpenZeppelin's Ownable to be
/// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
/// despite it not being as lightweight as a single argument event.
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
/// @dev An ownership handover to `pendingOwner` has been requested.
event OwnershipHandoverRequested(address indexed pendingOwner);
/// @dev The ownership handover to `pendingOwner` has been canceled.
event OwnershipHandoverCanceled(address indexed pendingOwner);
/// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
/// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
/// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The owner slot is given by:
/// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
/// It is intentionally chosen to be a high value
/// to avoid collision with lower slots.
/// The choice of manual storage layout is to enable compatibility
/// with both regular and upgradeable contracts.
bytes32 internal constant _OWNER_SLOT =
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;
/// The ownership handover slot of `newOwner` is given by:
/// ```
/// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
/// let handoverSlot := keccak256(0x00, 0x20)
/// ```
/// It stores the expiry timestamp of the two-step ownership handover.
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
function _guardInitializeOwner() internal pure virtual returns (bool guard) {}
/// @dev Initializes the owner directly without authorization guard.
/// This function must be called upon initialization,
/// regardless of whether the contract is upgradeable or not.
/// This is to enable generalization to both regular and upgradeable contracts,
/// and to save gas in case the initial owner is not the caller.
/// For performance reasons, this function will not check if there
/// is an existing owner.
function _initializeOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
if sload(ownerSlot) {
mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
revert(0x1c, 0x04)
}
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
} else {
/// @solidity memory-safe-assembly
assembly {
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Store the new value.
sstore(_OWNER_SLOT, newOwner)
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
}
/// @dev Sets the owner directly without authorization guard.
function _setOwner(address newOwner) internal virtual {
if (_guardInitializeOwner()) {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
}
} else {
/// @solidity memory-safe-assembly
assembly {
let ownerSlot := _OWNER_SLOT
// Clean the upper 96 bits.
newOwner := shr(96, shl(96, newOwner))
// Emit the {OwnershipTransferred} event.
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
// Store the new value.
sstore(ownerSlot, newOwner)
}
}
}
/// @dev Throws if the sender is not the owner.
function _checkOwner() internal view virtual {
/// @solidity memory-safe-assembly
assembly {
// If the caller is not the stored owner, revert.
if iszero(eq(caller(), sload(_OWNER_SLOT))) {
mstore(0x00, 0x82b42900) // `Unauthorized()`.
revert(0x1c, 0x04)
}
}
}
/// @dev Returns how long a two-step ownership handover is valid for in seconds.
/// Override to return a different value if needed.
/// Made internal to conserve bytecode. Wrap it in a public function if needed.
function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
return 48 * 3600;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC UPDATE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Allows the owner to transfer the ownership to `newOwner`.
function transferOwnership(address newOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
/// @dev Allows the owner to renounce their ownership.
function renounceOwnership() public payable virtual onlyOwner {
_setOwner(address(0));
}
/// @dev Request a two-step ownership handover to the caller.
/// The request will automatically expire in 48 hours (172800 seconds) by default.
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + _ownershipHandoverValidFor();
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to `expires`.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
// Emit the {OwnershipHandoverRequested} event.
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
/// @dev Cancels the two-step ownership handover to the caller, if any.
function cancelOwnershipHandover() public payable virtual {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
// Emit the {OwnershipHandoverCanceled} event.
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
/// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
/// Reverts if there is no existing ownership handover requested by `pendingOwner`.
function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
/// @solidity memory-safe-assembly
assembly {
// Compute and set the handover slot to 0.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
// If the handover does not exist, or has expired.
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
revert(0x1c, 0x04)
}
// Set the handover slot to 0.
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* PUBLIC READ FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the owner of the contract.
function owner() public view virtual returns (address result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(_OWNER_SLOT)
}
}
/// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
function ownershipHandoverExpiresAt(address pendingOwner)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
// Compute the handover slot.
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
// Load the handover slot.
result := sload(keccak256(0x0c, 0x20))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MODIFIERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Marks a function as only callable by the owner.
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"tokenZeroMetadata","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccountBalanceOverflow","type":"error"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[{"internalType":"int256","name":"num","type":"int256"},{"internalType":"int256","name":"den","type":"int256"}],"name":"NotInteger","type":"error"},{"inputs":[],"name":"NotOwnerNorApproved","type":"error"},{"inputs":[{"internalType":"int256","name":"value","type":"int256"}],"name":"OutOfRange","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eggIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eggX","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eggY","type":"uint256"}],"name":"EggRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","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":"x","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"y","type":"uint256"}],"name":"PlayerGuessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EGG_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ENTRY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUNT_DURATION_BLOCKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canRead","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eggs","outputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"revealed","type":"bool"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entriesByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fourtwenty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gamePhase","outputs":[{"internalType":"enum ZegsEggs.GamePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPlayerGuesses","outputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"xs","type":"uint256[]"},{"internalType":"uint256[]","name":"ys","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlocksUntilGameOver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eggId","type":"uint256"}],"name":"getEggCoords","outputs":[{"internalType":"uint256","name":"xCoord","type":"uint256"},{"internalType":"uint256","name":"yCoord","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuessCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReaders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"eggId","type":"uint256"}],"name":"getWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iCanRead","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGameActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerClaimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eggId","type":"uint256"}],"name":"ownerClaimEgg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"readers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eggId","type":"uint256"}],"name":"revealEgg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"isApproved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_zeroAddress","type":"address"}],"name":"setZeroAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sixtynine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"xCoord","type":"uint256"},{"internalType":"uint256","name":"yCoord","type":"uint256"}],"name":"whereIsTheEgg","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405261003e61002d61002461001b6001620100016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b5f5561006d61005c61005362010001806104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b6001556100a061008f610086620a0001620100056104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b6002556100eb6100da6100d16100c86100bf620a00016203000a6104e8565b620100016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b60035561012a61011961011061010762050009620100016104e8565b622400056104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b60045561016961015861014f61014662050009620900016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b60055561019c61018b61018262070001620900016104e8565b620200156104e8565b63ffffffff1661054560201b60201c565b6006556101e76101d66101cd6101c46101bb62070001620100016104e8565b620100016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b60075561023261022161021861020f61020662010001620900016104e8565b6208001b6104e8565b6203000a6104e8565b620a00016104e8565b63ffffffff1661054560201b60201c565b60085561027161026061025761024e62010001620900016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b6009556102a461029361028a620a0001620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b600a556102fb6102ea6102e16102d86102cf6102c662010001620b00016104e8565b620100016104e8565b620100016104e8565b620100016104e8565b620100016104e8565b63ffffffff1661054560201b60201c565b600b556009546008546002546103119190610971565b61031b9190610971565b600c55600354600654600b5461033191906109a4565b61033b9190610971565b600d5560075460055460045460035461035491906109a4565b61035e91906109a4565b61036891906109a4565b600e5560045460085460085461037e91906109a4565b61038891906109a4565b600f55600a54600a54600a5461039e91906109a4565b6103a891906109a4565b6010556010546010546103bb91906109a4565b601155600b54600a54600a54600b546103d491906109a4565b6103de91906109a4565b6103e89190610971565b601255601054601154601154600b5461040191906109a4565b61040b91906109a4565b61041591906109a4565b601355600b54600a54600a54600b5461042e91906109a4565b61043891906109a4565b6104429190610971565b601455600b546015555f601d60026101000a81548160ff021916908360028111156104705761046f6109e5565b5b0217905550348015610480575f80fd5b506040516157fe3803806157fe83398181016040528101906104a29190610b5f565b6104b13361063660201b60201c565b6104c2335f5461071260201b60201c565b80601a5f805481526020019081526020015f2090816104e19190610daa565b5050611052565b5f805f6104fa856107ea60201b60201c565b915091505f8061050f866107ea60201b60201c565b9150915061053982856105229190610e82565b828561052e9190610e82565b61081160201b60201c565b94505050505092915050565b5f805f610557846107ea60201b60201c565b915091505f81836105689190610f25565b146105ac5781816040517fda518bea0000000000000000000000000000000000000000000000000000000081526004016105a3929190610f64565b60405180910390fd5b5f81836105b99190610f8b565b90507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff58112806105e95750600b81135b1561062b57806040517f4a6367280000000000000000000000000000000000000000000000000000000081526004016106229190610ff3565b60405180910390fd5b809350505050919050565b61064461085460201b60201c565b156106bc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392780541561067e57630dc149f05f526004601cfd5b8160601b60601c9150811560ff1b82178155815f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a35061070f565b8060601b60601c9050807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392755805f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a35b50565b6107235f838361085860201b60201c565b8160601b60601c9150805f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f208101810180548060601b156107735763c991cbb15f526004601cfd5b8381178255835f52601c600c20600181540163ffffffff811686026107a75767ea553b3401336cea861560021b526004601cfd5b808255505082845f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a450506107e65f838361085d60201b60201c565b5050565b5f805f83905060108163ffffffff16901c60010b925061ffff811661ffff16915050915091565b5f80610823848461086260201b60201c565b905061084b81856108349190610f8b565b82856108409190610f8b565b6108a660201b60201c565b91505092915050565b5f90565b505050565b505050565b5f5b5f8214610885578182846108789190610f25565b8093508194505050610864565b5f83121561089c57826108979061100c565b61089e565b825b905092915050565b5f80821315806108b75750617fff82135b806108cc5750617fff6108c99061100c565b83125b806108d85750617fff83135b1561090f576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8361ffff1690505f8361ffff1690505f8160108463ffffffff16901b17905080935050505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61097b8261093b565b91506109868361093b565b925082820190508082111561099e5761099d610944565b5b92915050565b5f6109ae8261093b565b91506109b98361093b565b92508282026109c78161093b565b915082820484148315176109de576109dd610944565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610a7182610a2b565b810181811067ffffffffffffffff82111715610a9057610a8f610a3b565b5b80604052505050565b5f610aa2610a12565b9050610aae8282610a68565b919050565b5f67ffffffffffffffff821115610acd57610acc610a3b565b5b610ad682610a2b565b9050602081019050919050565b8281835e5f83830152505050565b5f610b03610afe84610ab3565b610a99565b905082815260208101848484011115610b1f57610b1e610a27565b5b610b2a848285610ae3565b509392505050565b5f82601f830112610b4657610b45610a23565b5b8151610b56848260208601610af1565b91505092915050565b5f60208284031215610b7457610b73610a1b565b5b5f82015167ffffffffffffffff811115610b9157610b90610a1f565b5b610b9d84828501610b32565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610bf457607f821691505b602082108103610c0757610c06610bb0565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610c697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610c2e565b610c738683610c2e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f610cae610ca9610ca48461093b565b610c8b565b61093b565b9050919050565b5f819050919050565b610cc783610c94565b610cdb610cd382610cb5565b848454610c3a565b825550505050565b5f90565b610cef610ce3565b610cfa818484610cbe565b505050565b5b81811015610d1d57610d125f82610ce7565b600181019050610d00565b5050565b601f821115610d6257610d3381610c0d565b610d3c84610c1f565b81016020851015610d4b578190505b610d5f610d5785610c1f565b830182610cff565b50505b505050565b5f82821c905092915050565b5f610d825f1984600802610d67565b1980831691505092915050565b5f610d9a8383610d73565b9150826002028217905092915050565b610db382610ba6565b67ffffffffffffffff811115610dcc57610dcb610a3b565b5b610dd68254610bdd565b610de1828285610d21565b5f60209050601f831160018114610e12575f8415610e00578287015190505b610e0a8582610d8f565b865550610e71565b601f198416610e2086610c0d565b5f5b82811015610e4757848901518255600182019150602085019450602081019050610e22565b86831015610e645784890151610e60601f891682610d73565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b5f610e8c82610e79565b9150610e9783610e79565b9250828202610ea581610e79565b91507f800000000000000000000000000000000000000000000000000000000000000084145f84121615610edc57610edb610944565b5b8282058414831517610ef157610ef0610944565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610f2f82610e79565b9150610f3a83610e79565b925082610f4a57610f49610ef8565b5b828207905092915050565b610f5e81610e79565b82525050565b5f604082019050610f775f830185610f55565b610f846020830184610f55565b9392505050565b5f610f9582610e79565b9150610fa083610e79565b925082610fb057610faf610ef8565b5b60015f0383147f800000000000000000000000000000000000000000000000000000000000000083141615610fe857610fe7610944565b5b828205905092915050565b5f6020820190506110065f830184610f55565b92915050565b5f61101682610e79565b91507f8000000000000000000000000000000000000000000000000000000000000000820361104857611047610944565b5b815f039050919050565b61479f8061105f5f395ff3fe6080604052600436106102e7575f3560e01c8063715018a61161018f578063cdad155b116100db578063f04e283e11610094578063f6cb04491161006e578063f6cb044914610a79578063f6d361cc14610a95578063f71d96cb14610abf578063fee81cf414610afd576102ee565b8063f04e283e14610a17578063f298cab414610a33578063f2fde38b14610a5d576102ee565b8063cdad155b1461090b578063d65ab5f214610935578063e763cf821461094b578063e985e9c514610975578063ec5f71df146109b1578063efc9e44d146109ed576102ee565b8063a2abc39111610148578063b88d4fde11610122578063b88d4fde1461084b578063bb654efa14610867578063c0eadcbb146108a7578063c87b56dd146108cf576102ee565b8063a2abc391146107e1578063ae75af6314610809578063b3c5cc9d14610835576102ee565b8063715018a6146107095780638da5cb5b14610713578063957d90781461073d57806395d89b411461076557806397938c2e1461078f578063a22cb465146107b9576102ee565b80633ccfd60b1161024e57806353c8388e116102075780636352211e116101e15780636352211e14610618578063672fec4d146106545780636c6c2b8a1461069057806370a08231146106cd576102ee565b806353c8388e146105bc57806354d1f13d146105e45780635e123ce4146105ee576102ee565b80633ccfd60b146104be5780634129b2c9146104d457806342087d4f1461051057806342842e0e1461054c57806345f5d384146105685780634952e7e214610592576102ee565b80631120edc4116102a05780631120edc41461040457806320f50ed91461041a57806323b872dd1461044457806325692962146104605780633804c73d1461046a5780633951be8714610494576102ee565b806301ffc9a7146102f257806306fdde031461032e578063081812fc14610358578063095ea7b3146103945780630a07babd146103b05780630c0ef2b0146103da576102ee565b366102ee57005b5f80fd5b3480156102fd575f80fd5b5061031860048036038101906103139190612f3b565b610b39565b6040516103259190612f80565b60405180910390f35b348015610339575f80fd5b50610342610b5d565b60405161034f9190613009565b60405180910390f35b348015610363575f80fd5b5061037e6004803603810190610379919061305c565b610b9a565b60405161038b91906130c6565b60405180910390f35b6103ae60048036038101906103a99190613109565b610bed565b005b3480156103bb575f80fd5b506103c4610bfc565b6040516103d19190613156565b60405180910390f35b3480156103e5575f80fd5b506103ee610c02565b6040516103fb9190612f80565b60405180910390f35b34801561040f575f80fd5b50610418610c4b565b005b348015610425575f80fd5b5061042e610ca8565b60405161043b9190612f80565b60405180910390f35b61045e6004803603810190610459919061316f565b610cbb565b005b610468610de5565b005b348015610475575f80fd5b5061047e610e36565b60405161048b9190613156565b60405180910390f35b34801561049f575f80fd5b506104a8610e3c565b6040516104b59190613232565b60405180910390f35b3480156104c9575f80fd5b506104d2610e4f565b005b3480156104df575f80fd5b506104fa60048036038101906104f5919061305c565b610f4c565b60405161050791906130c6565b60405180910390f35b34801561051b575f80fd5b506105366004803603810190610531919061324b565b6112d1565b6040516105439190612f80565b60405180910390f35b6105666004803603810190610561919061316f565b6112ee565b005b348015610573575f80fd5b5061057c611327565b6040516105899190613156565b60405180910390f35b34801561059d575f80fd5b506105a6611368565b6040516105b39190613156565b60405180910390f35b3480156105c7575f80fd5b506105e260048036038101906105dd91906133a2565b61136e565b005b6105ec6113de565b005b3480156105f9575f80fd5b50610602611417565b60405161060f9190612f80565b60405180910390f35b348015610623575f80fd5b5061063e6004803603810190610639919061305c565b611429565b60405161064b91906130c6565b60405180910390f35b34801561065f575f80fd5b5061067a6004803603810190610675919061324b565b61144c565b6040516106879190613156565b60405180910390f35b34801561069b575f80fd5b506106b660048036038101906106b1919061305c565b611461565b6040516106c49291906133fc565b60405180910390f35b3480156106d8575f80fd5b506106f360048036038101906106ee919061324b565b611619565b6040516107009190613156565b60405180910390f35b610711611666565b005b34801561071e575f80fd5b50610727611679565b60405161073491906130c6565b60405180910390f35b348015610748575f80fd5b50610763600480360381019061075e919061305c565b6116a1565b005b348015610770575f80fd5b50610779611ae4565b6040516107869190613009565b60405180910390f35b34801561079a575f80fd5b506107a3611b21565b6040516107b09190613156565b60405180910390f35b3480156107c4575f80fd5b506107df60048036038101906107da919061344d565b611b2d565b005b3480156107ec575f80fd5b506108076004803603810190610802919061305c565b611b80565b005b348015610814575f80fd5b5061081d611e2e565b60405161082c939291906135f9565b60405180910390f35b348015610840575f80fd5b5061084961206f565b005b610865600480360381019061086091906136a0565b612230565b005b348015610872575f80fd5b5061088d6004803603810190610888919061305c565b6122a0565b60405161089e959493929190613724565b60405180910390f35b3480156108b2575f80fd5b506108cd60048036038101906108c8919061324b565b61230b565b005b3480156108da575f80fd5b506108f560048036038101906108f0919061305c565b612356565b6040516109029190613009565b60405180910390f35b348015610916575f80fd5b5061091f612484565b60405161092c9190613156565b60405180910390f35b348015610940575f80fd5b5061094961248a565b005b348015610956575f80fd5b5061095f61252f565b60405161096c9190613156565b60405180910390f35b348015610980575f80fd5b5061099b60048036038101906109969190613775565b612535565b6040516109a89190612f80565b60405180910390f35b3480156109bc575f80fd5b506109d760048036038101906109d2919061305c565b612557565b6040516109e491906130c6565b60405180910390f35b3480156109f8575f80fd5b50610a01612592565b604051610a0e91906137b3565b60405180910390f35b610a316004803603810190610a2c919061324b565b61261d565b005b348015610a3e575f80fd5b50610a4761265b565b604051610a549190613156565b60405180910390f35b610a776004803603810190610a72919061324b565b612661565b005b610a936004803603810190610a8e91906137d3565b61268a565b005b348015610aa0575f80fd5b50610aa9612ab0565b604051610ab69190613156565b60405180910390f35b348015610aca575f80fd5b50610ae56004803603810190610ae0919061305c565b612ab6565b604051610af493929190613811565b60405180910390f35b348015610b08575f80fd5b50610b236004803603810190610b1e919061324b565b612b0a565b604051610b309190613156565b60405180910390f35b5f8160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60606040518060400160405280600a81526020017f5a65672773204567677300000000000000000000000000000000000000000000815250905090565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f2082018201805460601b610be05763ceea21b65f526004601cfd5b8060010154915050919050565b610bf8338383612b23565b5050565b600e5481565b5f601d5f9054906101000a900460ff168015610c2d5750601454601c54610c299190613873565b4311155b8015610c465750601d60019054906101000a900460ff16155b905090565b610c53612bd3565b5f60015490505b600b548111610ca55760195f8281526020019081526020015f206002015f9054906101000a900460ff16610c9257610c9181611b80565b5b8080610c9d906138a6565b915050610c5a565b50565b601d60019054906101000a900460ff1681565b610cc6838383612c0a565b5f1960601c83811693508281169250815f52337f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260205f208201820180548083168681148102610d295767ceea21b6a1148100811560021b526004601cfd5b865f52826001015480331488331417610d54576030600c2054610d5357634b6e7f185f526004601cfd5b5b8015610d61575f84600101555b5085871882188355601c600c206001815403815550855f52601c600c20600181540163ffffffff81168802610da55767ea553b3401336cea881560021b526004601cfd5b80825550508486887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a450505050610de0838383612c0f565b505050565b5f610dee612c14565b67ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a250565b601c5481565b601d60029054906101000a900460ff1681565b610e57612bd3565b5f544711610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190613937565b60405180910390fd5b5f610ea3611679565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec690613982565b5f6040518083038185875af1925050503d805f8114610f00576040519150601f19603f3d011682016040523d82523d5f602084013e610f05565b606091505b5050905080610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f40906139e0565b60405180910390fd5b50565b5f8060195f8481526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff16611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090613a48565b60405180910390fd5b806060015161109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613ab0565b60405180910390fd5b60015483101580156110b15750600b548311155b6110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613b18565b60405180910390fd5b5f805490505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505f805490505b601780549050811015611284575f6017828154811061114157611140613b36565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505090505f855f01518260200151116111e9578160200151865f01516111e49190613b63565b6111fd565b855f015182602001516111fc9190613b63565b5b90505f866020015183604001511161122857826040015187602001516112239190613b63565b61123d565b8660200151836040015161123c9190613b63565b5b90505f818261124c9190613b96565b83846112589190613b96565b6112629190613873565b905085811015611273578095508496505b50505050808060010191505061111f565b506017828154811061129957611298613b36565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350505050919050565b601e602052805f5260405f205f915054906101000a900460ff1681565b6112f9838383610cbb565b61130282612c1e565b156113225761132183838360405180602001604052805f815250612c28565b5b505050565b5f601454601c546113389190613873565b4310611347575f549050611365565b43601454601c546113589190613873565b6113629190613b63565b90505b90565b60155481565b611376612bd3565b600b548211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613c21565b60405180910390fd5b80601a5f8481526020019081526020015f2090816113d99190613e39565b505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2565b601d5f9054906101000a900460ff1681565b5f61143382612cb2565b9050806114475763ceea21b65f526004601cfd5b919050565b6018602052805f5260405f205f915090505481565b5f805f60195f8581526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff1661156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690613a48565b60405180910390fd5b80606001516115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613f52565b60405180910390fd5b60015484101580156115c75750600b548411155b611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613b18565b60405180910390fd5b805f015181602001519250925050915091565b5f8161162c57638f4eb6045f526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52815f5263ffffffff601c600c2054169050919050565b61166e612bd3565b6116775f612cf0565b565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b601d5f9054906101000a900460ff166116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690613fba565b60405180910390fd5b60015481101580156117035750600b548111155b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613b18565b60405180910390fd5b60195f8281526020019081526020015f2060020160019054906101000a900460ff16156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614022565b60405180910390fd5b5f601454601c546117b59190613873565b90505f60015483836117c79190613873565b6117d19190613873565b90505f60025484846117e39190613873565b6117ed9190613873565b9050804311611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061408a565b60405180910390fd5b600f548161183f9190613873565b431115611881576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611878906140f2565b60405180910390fd5b5f6012546118b28440873060405160200161189e939291906141f2565b604051602081830303815290604052612db6565b6118bc9190614266565b90505f6012546118ef844088306040516020016118db939291906141f2565b604051602081830303815290604052612db6565b6118f99190614266565b90506040518060a001604052808381526020018281526020015f1515815260200160011515815260200160165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060195f8881526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555060808201518160020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507fcb557a4b4c6ebb646af1405ae0237761ebfedfb76daa391ffedb6b2925870487868383604051611a3d93929190614296565b60405180910390a160016002811115611a5957611a586131bf565b5b601d60029054906101000a900460ff166002811115611a7b57611a7a6131bf565b5b03611aac576002601d60026101000a81548160ff02191690836002811115611aa657611aa56131bf565b5b02179055505b601d60019054906101000a900460ff16611adc576001601d60016101000a81548160ff0219169083151502179055505b505050505050565b60606040518060400160405280600481526020017f5a45474700000000000000000000000000000000000000000000000000000000815250905090565b5f601780549050905090565b801515905081601c52670a5a2e7a00000000600852335f52806030600c2055805f528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160205fa35050565b611b88612bd3565b5f60195f8381526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff16611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90613a48565b60405180910390fd5b806040015115611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090614315565b60405180910390fd5b8060600151611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061437d565b60405180910390fd5b5f611d2783610f4c565b905080826080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060018260400190151590811515815250508160195f8581526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555060808201518160020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050611e298184612dc8565b505050565b60608060605f60178054905090508067ffffffffffffffff811115611e5657611e5561327e565b5b604051908082528060200260200182016040528015611e845781602001602082028036833780820191505090505b5093508067ffffffffffffffff811115611ea157611ea061327e565b5b604051908082528060200260200182016040528015611ecf5781602001602082028036833780820191505090505b5092508067ffffffffffffffff811115611eec57611eeb61327e565b5b604051908082528060200260200182016040528015611f1a5781602001602082028036833780820191505090505b5091505f805490505b81811015612068575f60178281548110611f4057611f3f613b36565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050805f0151868381518110611fd857611fd7613b36565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806020015185838151811061202a57612029613b36565b5b602002602001018181525050806040015184838151811061204e5761204d613b36565b5b602002602001018181525050508080600101915050611f23565b5050909192565b5f5460185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e6906143e5565b60405180910390fd5b601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061444d565b60405180910390fd5b6001601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550601f33908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61223b858585610cbb565b61224484612c1e565b156122995761229885858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612c28565b5b5050505050565b6019602052805f5260405f205f91509050805f015490806001015490806002015f9054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b612313612bd3565b8060165f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606061236182612e94565b6123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790613c21565b60405180910390fd5b600b548211156123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90613c21565b60405180910390fd5b601a5f8381526020019081526020015f20805461240190613c6c565b80601f016020809104026020016040519081016040528092919081815260200182805461242d90613c6c565b80156124785780601f1061244f57610100808354040283529160200191612478565b820191905f5260205f20905b81548152906001019060200180831161245b57829003601f168201915b50505050509050919050565b60145481565b612492612bd3565b601d5f9054906101000a900460ff16156124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d8906144b5565b60405180910390fd5b43601c819055506001601d5f6101000a81548160ff0219169083151502179055506001601d60026101000a81548160ff02191690836002811115612528576125276131bf565b5b0217905550565b60125481565b5f81601c52670a5a2e7a00000000600852825f526030600c2054905092915050565b601f8181548110612566575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601f80548060200260200160405190810160405280929190818152602001828054801561261357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125ca575b5050505050905090565b612625612bd3565b63389a75e1600c52805f526020600c20805442111561264b57636f5e88185f526004601cfd5b5f81555061265881612cf0565b50565b600d5481565b612669612bd3565b8060601b61267e57637448fbae5f526004601cfd5b61268781612cf0565b50565b601d5f9054906101000a900460ff166126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90613fba565b60405180910390fd5b601454601c546126e89190613873565b43111561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061451d565b60405180910390fd5b60035460185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a290614585565b60405180910390fd5b60135434146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e6906145ed565b60405180910390fd5b600b54600a54600a54600b546128059190613b96565b61280f9190613b96565b6128199190613873565b6017805490501061285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690614655565b60405180910390fd5b601254821115801561287357506012548111155b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a9906146bd565b60405180910390fd5b601b5f8381526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff161561291f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129169061474b565b60405180910390fd5b6001601b5f8481526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550601760405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155505060185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190612a57906138a6565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f6108423ff4d4047f481cf015957f5bf05c82a5a8a104b967528a69558d786c748383604051612aa49291906133fc565b60405180910390a25050565b60135481565b60178181548110612ac5575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b5f63389a75e1600c52815f526020600c20549050919050565b5f1960601c82811692508381169350815f52837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260205f20820182018054821680612b795763ceea21b65f526004601cfd5b808614861517612b9e57805f526030600c2054612b9d57634b6e7f185f526004601cfd5b5b8482600101558385827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f38a4505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314612c08576382b429005f526004601cfd5b565b505050565b505050565b5f6202a300905090565b5f813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015612c6f578060c08401826020870160045afa505b60208360a48301601c86015f8a5af1612c91573d15612c90573d5f843e3d83fd5b5b8160e01b835114612ca95763d1a57ed65f526004601cfd5b50505050505050565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f20820182015460601b60601c9050919050565b612cf8612ed1565b15612d5d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3811560ff1b8217815550612db3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3818155505b50565b5f81805190602001205f1c9050919050565b612dd35f8383612c0a565b8160601b60601c9150805f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f208101810180548060601b15612e235763c991cbb15f526004601cfd5b8381178255835f52601c600c20600181540163ffffffff81168602612e575767ea553b3401336cea861560021b526004601cfd5b808255505082845f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a45050612e905f8383612c0f565b5050565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f20820182015460601b15159050919050565b5f90565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f1a81612ee6565b8114612f24575f80fd5b50565b5f81359050612f3581612f11565b92915050565b5f60208284031215612f5057612f4f612ede565b5b5f612f5d84828501612f27565b91505092915050565b5f8115159050919050565b612f7a81612f66565b82525050565b5f602082019050612f935f830184612f71565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fdb82612f99565b612fe58185612fa3565b9350612ff5818560208601612fb3565b612ffe81612fc1565b840191505092915050565b5f6020820190508181035f8301526130218184612fd1565b905092915050565b5f819050919050565b61303b81613029565b8114613045575f80fd5b50565b5f8135905061305681613032565b92915050565b5f6020828403121561307157613070612ede565b5b5f61307e84828501613048565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6130b082613087565b9050919050565b6130c0816130a6565b82525050565b5f6020820190506130d95f8301846130b7565b92915050565b6130e8816130a6565b81146130f2575f80fd5b50565b5f81359050613103816130df565b92915050565b5f806040838503121561311f5761311e612ede565b5b5f61312c858286016130f5565b925050602061313d85828601613048565b9150509250929050565b61315081613029565b82525050565b5f6020820190506131695f830184613147565b92915050565b5f805f6060848603121561318657613185612ede565b5b5f613193868287016130f5565b93505060206131a4868287016130f5565b92505060406131b586828701613048565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600381106131fd576131fc6131bf565b5b50565b5f81905061320d826131ec565b919050565b5f61321c82613200565b9050919050565b61322c81613212565b82525050565b5f6020820190506132455f830184613223565b92915050565b5f602082840312156132605761325f612ede565b5b5f61326d848285016130f5565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132b482612fc1565b810181811067ffffffffffffffff821117156132d3576132d261327e565b5b80604052505050565b5f6132e5612ed5565b90506132f182826132ab565b919050565b5f67ffffffffffffffff8211156133105761330f61327e565b5b61331982612fc1565b9050602081019050919050565b828183375f83830152505050565b5f613346613341846132f6565b6132dc565b9050828152602081018484840111156133625761336161327a565b5b61336d848285613326565b509392505050565b5f82601f83011261338957613388613276565b5b8135613399848260208601613334565b91505092915050565b5f80604083850312156133b8576133b7612ede565b5b5f6133c585828601613048565b925050602083013567ffffffffffffffff8111156133e6576133e5612ee2565b5b6133f285828601613375565b9150509250929050565b5f60408201905061340f5f830185613147565b61341c6020830184613147565b9392505050565b61342c81612f66565b8114613436575f80fd5b50565b5f8135905061344781613423565b92915050565b5f806040838503121561346357613462612ede565b5b5f613470858286016130f5565b925050602061348185828601613439565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6134bd816130a6565b82525050565b5f6134ce83836134b4565b60208301905092915050565b5f602082019050919050565b5f6134f08261348b565b6134fa8185613495565b9350613505836134a5565b805f5b8381101561353557815161351c88826134c3565b9750613527836134da565b925050600181019050613508565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61357481613029565b82525050565b5f613585838361356b565b60208301905092915050565b5f602082019050919050565b5f6135a782613542565b6135b1818561354c565b93506135bc8361355c565b805f5b838110156135ec5781516135d3888261357a565b97506135de83613591565b9250506001810190506135bf565b5085935050505092915050565b5f6060820190508181035f83015261361181866134e6565b90508181036020830152613625818561359d565b90508181036040830152613639818461359d565b9050949350505050565b5f80fd5b5f80fd5b5f8083601f8401126136605761365f613276565b5b8235905067ffffffffffffffff81111561367d5761367c613643565b5b60208301915083600182028301111561369957613698613647565b5b9250929050565b5f805f805f608086880312156136b9576136b8612ede565b5b5f6136c6888289016130f5565b95505060206136d7888289016130f5565b94505060406136e888828901613048565b935050606086013567ffffffffffffffff81111561370957613708612ee2565b5b6137158882890161364b565b92509250509295509295909350565b5f60a0820190506137375f830188613147565b6137446020830187613147565b6137516040830186612f71565b61375e6060830185612f71565b61376b60808301846130b7565b9695505050505050565b5f806040838503121561378b5761378a612ede565b5b5f613798858286016130f5565b92505060206137a9858286016130f5565b9150509250929050565b5f6020820190508181035f8301526137cb81846134e6565b905092915050565b5f80604083850312156137e9576137e8612ede565b5b5f6137f685828601613048565b925050602061380785828601613048565b9150509250929050565b5f6060820190506138245f8301866130b7565b6138316020830185613147565b61383e6040830184613147565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61387d82613029565b915061388883613029565b92508282019050808211156138a05761389f613846565b5b92915050565b5f6138b082613029565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138e2576138e1613846565b5b600182019050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f613921601283612fa3565b915061392c826138ed565b602082019050919050565b5f6020820190508181035f83015261394e81613915565b9050919050565b5f81905092915050565b50565b5f61396d5f83613955565b91506139788261395f565b5f82019050919050565b5f61398c82613962565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f6139ca600f83612fa3565b91506139d582613996565b602082019050919050565b5f6020820190508181035f8301526139f7816139be565b9050919050565b7f47616d65206e6f742066696e616c697a656400000000000000000000000000005f82015250565b5f613a32601283612fa3565b9150613a3d826139fe565b602082019050919050565b5f6020820190508181035f830152613a5f81613a26565b9050919050565b7f456767206d6f742072657665616c6564207965740000000000000000000000005f82015250565b5f613a9a601483612fa3565b9150613aa582613a66565b602082019050919050565b5f6020820190508181035f830152613ac781613a8e565b9050919050565b7f496e76616c6964206567672049440000000000000000000000000000000000005f82015250565b5f613b02600e83612fa3565b9150613b0d82613ace565b602082019050919050565b5f6020820190508181035f830152613b2f81613af6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613b6d82613029565b9150613b7883613029565b9250828203905081811115613b9057613b8f613846565b5b92915050565b5f613ba082613029565b9150613bab83613029565b9250828202613bb981613029565b91508282048414831517613bd057613bcf613846565b5b5092915050565b7f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000005f82015250565b5f613c0b601183612fa3565b9150613c1682613bd7565b602082019050919050565b5f6020820190508181035f830152613c3881613bff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c8357607f821691505b602082108103613c9657613c95613c3f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613cf87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cbd565b613d028683613cbd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613d3d613d38613d3384613029565b613d1a565b613029565b9050919050565b5f819050919050565b613d5683613d23565b613d6a613d6282613d44565b848454613cc9565b825550505050565b5f90565b613d7e613d72565b613d89818484613d4d565b505050565b5b81811015613dac57613da15f82613d76565b600181019050613d8f565b5050565b601f821115613df157613dc281613c9c565b613dcb84613cae565b81016020851015613dda578190505b613dee613de685613cae565b830182613d8e565b50505b505050565b5f82821c905092915050565b5f613e115f1984600802613df6565b1980831691505092915050565b5f613e298383613e02565b9150826002028217905092915050565b613e4282612f99565b67ffffffffffffffff811115613e5b57613e5a61327e565b5b613e658254613c6c565b613e70828285613db0565b5f60209050601f831160018114613ea1575f8415613e8f578287015190505b613e998582613e1e565b865550613f00565b601f198416613eaf86613c9c565b5f5b82811015613ed657848901518255600182019150602085019450602081019050613eb1565b86831015613ef35784890151613eef601f891682613e02565b8355505b6001600288020188555050505b505050505050565b7f456767206e6f742072657665616c6564207965740000000000000000000000005f82015250565b5f613f3c601483612fa3565b9150613f4782613f08565b602082019050919050565b5f6020820190508181035f830152613f6981613f30565b9050919050565b7f47616d65206e6f742073746172746564000000000000000000000000000000005f82015250565b5f613fa4601083612fa3565b9150613faf82613f70565b602082019050919050565b5f6020820190508181035f830152613fd181613f98565b9050919050565b7f416c72656164792072657665616c6564000000000000000000000000000000005f82015250565b5f61400c601083612fa3565b915061401782613fd8565b602082019050919050565b5f6020820190508181035f83015261403981614000565b9050919050565b7f546f6f206561726c7920746f2072657665616c000000000000000000000000005f82015250565b5f614074601383612fa3565b915061407f82614040565b602082019050919050565b5f6020820190508181035f8301526140a181614068565b9050919050565b7f52657665616c2077696e646f77206578706972656400000000000000000000005f82015250565b5f6140dc601583612fa3565b91506140e7826140a8565b602082019050919050565b5f6020820190508181035f830152614109816140d0565b9050919050565b5f819050919050565b5f819050919050565b61413361412e82614110565b614119565b82525050565b5f81905092915050565b7f45474700000000000000000000000000000000000000000000000000000000005f82015250565b5f614177600383614139565b915061418282614143565b600382019050919050565b5f819050919050565b6141a76141a282613029565b61418d565b82525050565b5f8160601b9050919050565b5f6141c3826141ad565b9050919050565b5f6141d4826141b9565b9050919050565b6141ec6141e7826130a6565b6141ca565b82525050565b5f6141fd8286614122565b60208201915061420c8261416b565b91506142188285614196565b60208201915061422882846141db565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61427082613029565b915061427b83613029565b92508261428b5761428a614239565b5b828206905092915050565b5f6060820190506142a95f830186613147565b6142b66020830185613147565b6142c36040830184613147565b949350505050565b7f45676720616c726561647920636c61696d6564000000000000000000000000005f82015250565b5f6142ff601383612fa3565b915061430a826142cb565b602082019050919050565b5f6020820190508181035f83015261432c816142f3565b9050919050565b7f456767206e6f74207965742072657665616c65640000000000000000000000005f82015250565b5f614367601483612fa3565b915061437282614333565b602082019050919050565b5f6020820190508181035f8301526143948161435b565b9050919050565b7f4f6e6c792068756e746572732063616e207369676e2e000000000000000000005f82015250565b5f6143cf601683612fa3565b91506143da8261439b565b602082019050919050565b5f6020820190508181035f8301526143fc816143c3565b9050919050565b7f416c7265616479207369676e65642e00000000000000000000000000000000005f82015250565b5f614437600f83612fa3565b915061444282614403565b602082019050919050565b5f6020820190508181035f8301526144648161442b565b9050919050565b7f47616d6520616c726561647920737461727465640000000000000000000000005f82015250565b5f61449f601483612fa3565b91506144aa8261446b565b602082019050919050565b5f6020820190508181035f8301526144cc81614493565b9050919050565b7f47616d6520656e646564000000000000000000000000000000000000000000005f82015250565b5f614507600a83612fa3565b9150614512826144d3565b602082019050919050565b5f6020820190508181035f830152614534816144fb565b9050919050565b7f4d6178696d756d206775657373657320726561636865640000000000000000005f82015250565b5f61456f601783612fa3565b915061457a8261453b565b602082019050919050565b5f6020820190508181035f83015261459c81614563565b9050919050565b7f496e636f727265637420656e74727920666565000000000000000000000000005f82015250565b5f6145d7601383612fa3565b91506145e2826145a3565b602082019050919050565b5f6020820190508181035f830152614604816145cb565b9050919050565b7f4d617820706c61796572732072656163686564000000000000000000000000005f82015250565b5f61463f601383612fa3565b915061464a8261460b565b602082019050919050565b5f6020820190508181035f83015261466c81614633565b9050919050565b7f496e76616c696420636f6f7264696e61746573000000000000000000000000005f82015250565b5f6146a7601383612fa3565b91506146b282614673565b602082019050919050565b5f6020820190508181035f8301526146d48161469b565b9050919050565b7f546861742073706f742068617320616c7265616479206265656e20636c61696d5f8201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b5f614735602383612fa3565b9150614740826146db565b604082019050919050565b5f6020820190508181035f83015261476281614729565b905091905056fea264697066735822122048353081f990c78e61268822fbaeac406bac0a823a459d8d32e06a22bfcc1b2364736f6c634300081a00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005d68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f6261666b726569616b6a69683673696a753472627279657663367171776676633733637079716d6b627932766d736d6b6979706c6d616a65636b65000000
Deployed Bytecode
0x6080604052600436106102e7575f3560e01c8063715018a61161018f578063cdad155b116100db578063f04e283e11610094578063f6cb04491161006e578063f6cb044914610a79578063f6d361cc14610a95578063f71d96cb14610abf578063fee81cf414610afd576102ee565b8063f04e283e14610a17578063f298cab414610a33578063f2fde38b14610a5d576102ee565b8063cdad155b1461090b578063d65ab5f214610935578063e763cf821461094b578063e985e9c514610975578063ec5f71df146109b1578063efc9e44d146109ed576102ee565b8063a2abc39111610148578063b88d4fde11610122578063b88d4fde1461084b578063bb654efa14610867578063c0eadcbb146108a7578063c87b56dd146108cf576102ee565b8063a2abc391146107e1578063ae75af6314610809578063b3c5cc9d14610835576102ee565b8063715018a6146107095780638da5cb5b14610713578063957d90781461073d57806395d89b411461076557806397938c2e1461078f578063a22cb465146107b9576102ee565b80633ccfd60b1161024e57806353c8388e116102075780636352211e116101e15780636352211e14610618578063672fec4d146106545780636c6c2b8a1461069057806370a08231146106cd576102ee565b806353c8388e146105bc57806354d1f13d146105e45780635e123ce4146105ee576102ee565b80633ccfd60b146104be5780634129b2c9146104d457806342087d4f1461051057806342842e0e1461054c57806345f5d384146105685780634952e7e214610592576102ee565b80631120edc4116102a05780631120edc41461040457806320f50ed91461041a57806323b872dd1461044457806325692962146104605780633804c73d1461046a5780633951be8714610494576102ee565b806301ffc9a7146102f257806306fdde031461032e578063081812fc14610358578063095ea7b3146103945780630a07babd146103b05780630c0ef2b0146103da576102ee565b366102ee57005b5f80fd5b3480156102fd575f80fd5b5061031860048036038101906103139190612f3b565b610b39565b6040516103259190612f80565b60405180910390f35b348015610339575f80fd5b50610342610b5d565b60405161034f9190613009565b60405180910390f35b348015610363575f80fd5b5061037e6004803603810190610379919061305c565b610b9a565b60405161038b91906130c6565b60405180910390f35b6103ae60048036038101906103a99190613109565b610bed565b005b3480156103bb575f80fd5b506103c4610bfc565b6040516103d19190613156565b60405180910390f35b3480156103e5575f80fd5b506103ee610c02565b6040516103fb9190612f80565b60405180910390f35b34801561040f575f80fd5b50610418610c4b565b005b348015610425575f80fd5b5061042e610ca8565b60405161043b9190612f80565b60405180910390f35b61045e6004803603810190610459919061316f565b610cbb565b005b610468610de5565b005b348015610475575f80fd5b5061047e610e36565b60405161048b9190613156565b60405180910390f35b34801561049f575f80fd5b506104a8610e3c565b6040516104b59190613232565b60405180910390f35b3480156104c9575f80fd5b506104d2610e4f565b005b3480156104df575f80fd5b506104fa60048036038101906104f5919061305c565b610f4c565b60405161050791906130c6565b60405180910390f35b34801561051b575f80fd5b506105366004803603810190610531919061324b565b6112d1565b6040516105439190612f80565b60405180910390f35b6105666004803603810190610561919061316f565b6112ee565b005b348015610573575f80fd5b5061057c611327565b6040516105899190613156565b60405180910390f35b34801561059d575f80fd5b506105a6611368565b6040516105b39190613156565b60405180910390f35b3480156105c7575f80fd5b506105e260048036038101906105dd91906133a2565b61136e565b005b6105ec6113de565b005b3480156105f9575f80fd5b50610602611417565b60405161060f9190612f80565b60405180910390f35b348015610623575f80fd5b5061063e6004803603810190610639919061305c565b611429565b60405161064b91906130c6565b60405180910390f35b34801561065f575f80fd5b5061067a6004803603810190610675919061324b565b61144c565b6040516106879190613156565b60405180910390f35b34801561069b575f80fd5b506106b660048036038101906106b1919061305c565b611461565b6040516106c49291906133fc565b60405180910390f35b3480156106d8575f80fd5b506106f360048036038101906106ee919061324b565b611619565b6040516107009190613156565b60405180910390f35b610711611666565b005b34801561071e575f80fd5b50610727611679565b60405161073491906130c6565b60405180910390f35b348015610748575f80fd5b50610763600480360381019061075e919061305c565b6116a1565b005b348015610770575f80fd5b50610779611ae4565b6040516107869190613009565b60405180910390f35b34801561079a575f80fd5b506107a3611b21565b6040516107b09190613156565b60405180910390f35b3480156107c4575f80fd5b506107df60048036038101906107da919061344d565b611b2d565b005b3480156107ec575f80fd5b506108076004803603810190610802919061305c565b611b80565b005b348015610814575f80fd5b5061081d611e2e565b60405161082c939291906135f9565b60405180910390f35b348015610840575f80fd5b5061084961206f565b005b610865600480360381019061086091906136a0565b612230565b005b348015610872575f80fd5b5061088d6004803603810190610888919061305c565b6122a0565b60405161089e959493929190613724565b60405180910390f35b3480156108b2575f80fd5b506108cd60048036038101906108c8919061324b565b61230b565b005b3480156108da575f80fd5b506108f560048036038101906108f0919061305c565b612356565b6040516109029190613009565b60405180910390f35b348015610916575f80fd5b5061091f612484565b60405161092c9190613156565b60405180910390f35b348015610940575f80fd5b5061094961248a565b005b348015610956575f80fd5b5061095f61252f565b60405161096c9190613156565b60405180910390f35b348015610980575f80fd5b5061099b60048036038101906109969190613775565b612535565b6040516109a89190612f80565b60405180910390f35b3480156109bc575f80fd5b506109d760048036038101906109d2919061305c565b612557565b6040516109e491906130c6565b60405180910390f35b3480156109f8575f80fd5b50610a01612592565b604051610a0e91906137b3565b60405180910390f35b610a316004803603810190610a2c919061324b565b61261d565b005b348015610a3e575f80fd5b50610a4761265b565b604051610a549190613156565b60405180910390f35b610a776004803603810190610a72919061324b565b612661565b005b610a936004803603810190610a8e91906137d3565b61268a565b005b348015610aa0575f80fd5b50610aa9612ab0565b604051610ab69190613156565b60405180910390f35b348015610aca575f80fd5b50610ae56004803603810190610ae0919061305c565b612ab6565b604051610af493929190613811565b60405180910390f35b348015610b08575f80fd5b50610b236004803603810190610b1e919061324b565b612b0a565b604051610b309190613156565b60405180910390f35b5f8160e01c635b5e139f81146380ac58cd82146301ffc9a783141717915050919050565b60606040518060400160405280600a81526020017f5a65672773204567677300000000000000000000000000000000000000000000815250905090565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f2082018201805460601b610be05763ceea21b65f526004601cfd5b8060010154915050919050565b610bf8338383612b23565b5050565b600e5481565b5f601d5f9054906101000a900460ff168015610c2d5750601454601c54610c299190613873565b4311155b8015610c465750601d60019054906101000a900460ff16155b905090565b610c53612bd3565b5f60015490505b600b548111610ca55760195f8281526020019081526020015f206002015f9054906101000a900460ff16610c9257610c9181611b80565b5b8080610c9d906138a6565b915050610c5a565b50565b601d60019054906101000a900460ff1681565b610cc6838383612c0a565b5f1960601c83811693508281169250815f52337f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260205f208201820180548083168681148102610d295767ceea21b6a1148100811560021b526004601cfd5b865f52826001015480331488331417610d54576030600c2054610d5357634b6e7f185f526004601cfd5b5b8015610d61575f84600101555b5085871882188355601c600c206001815403815550855f52601c600c20600181540163ffffffff81168802610da55767ea553b3401336cea881560021b526004601cfd5b80825550508486887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a450505050610de0838383612c0f565b505050565b5f610dee612c14565b67ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a250565b601c5481565b601d60029054906101000a900460ff1681565b610e57612bd3565b5f544711610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190613937565b60405180910390fd5b5f610ea3611679565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec690613982565b5f6040518083038185875af1925050503d805f8114610f00576040519150601f19603f3d011682016040523d82523d5f602084013e610f05565b606091505b5050905080610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f40906139e0565b60405180910390fd5b50565b5f8060195f8481526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff16611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090613a48565b60405180910390fd5b806060015161109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613ab0565b60405180910390fd5b60015483101580156110b15750600b548311155b6110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613b18565b60405180910390fd5b5f805490505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505f805490505b601780549050811015611284575f6017828154811061114157611140613b36565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505090505f855f01518260200151116111e9578160200151865f01516111e49190613b63565b6111fd565b855f015182602001516111fc9190613b63565b5b90505f866020015183604001511161122857826040015187602001516112239190613b63565b61123d565b8660200151836040015161123c9190613b63565b5b90505f818261124c9190613b96565b83846112589190613b96565b6112629190613873565b905085811015611273578095508496505b50505050808060010191505061111f565b506017828154811061129957611298613b36565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350505050919050565b601e602052805f5260405f205f915054906101000a900460ff1681565b6112f9838383610cbb565b61130282612c1e565b156113225761132183838360405180602001604052805f815250612c28565b5b505050565b5f601454601c546113389190613873565b4310611347575f549050611365565b43601454601c546113589190613873565b6113629190613b63565b90505b90565b60155481565b611376612bd3565b600b548211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613c21565b60405180910390fd5b80601a5f8481526020019081526020015f2090816113d99190613e39565b505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2565b601d5f9054906101000a900460ff1681565b5f61143382612cb2565b9050806114475763ceea21b65f526004601cfd5b919050565b6018602052805f5260405f205f915090505481565b5f805f60195f8581526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff1661156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690613a48565b60405180910390fd5b80606001516115b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115aa90613f52565b60405180910390fd5b60015484101580156115c75750600b548411155b611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90613b18565b60405180910390fd5b805f015181602001519250925050915091565b5f8161162c57638f4eb6045f526004601cfd5b7f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c52815f5263ffffffff601c600c2054169050919050565b61166e612bd3565b6116775f612cf0565b565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754905090565b601d5f9054906101000a900460ff166116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690613fba565b60405180910390fd5b60015481101580156117035750600b548111155b611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613b18565b60405180910390fd5b60195f8281526020019081526020015f2060020160019054906101000a900460ff16156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614022565b60405180910390fd5b5f601454601c546117b59190613873565b90505f60015483836117c79190613873565b6117d19190613873565b90505f60025484846117e39190613873565b6117ed9190613873565b9050804311611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061408a565b60405180910390fd5b600f548161183f9190613873565b431115611881576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611878906140f2565b60405180910390fd5b5f6012546118b28440873060405160200161189e939291906141f2565b604051602081830303815290604052612db6565b6118bc9190614266565b90505f6012546118ef844088306040516020016118db939291906141f2565b604051602081830303815290604052612db6565b6118f99190614266565b90506040518060a001604052808381526020018281526020015f1515815260200160011515815260200160165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060195f8881526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555060808201518160020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507fcb557a4b4c6ebb646af1405ae0237761ebfedfb76daa391ffedb6b2925870487868383604051611a3d93929190614296565b60405180910390a160016002811115611a5957611a586131bf565b5b601d60029054906101000a900460ff166002811115611a7b57611a7a6131bf565b5b03611aac576002601d60026101000a81548160ff02191690836002811115611aa657611aa56131bf565b5b02179055505b601d60019054906101000a900460ff16611adc576001601d60016101000a81548160ff0219169083151502179055505b505050505050565b60606040518060400160405280600481526020017f5a45474700000000000000000000000000000000000000000000000000000000815250905090565b5f601780549050905090565b801515905081601c52670a5a2e7a00000000600852335f52806030600c2055805f528160601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160205fa35050565b611b88612bd3565b5f60195f8381526020019081526020015f206040518060a00160405290815f820154815260200160018201548152602001600282015f9054906101000a900460ff161515151581526020016002820160019054906101000a900460ff161515151581526020016002820160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050601d60019054906101000a900460ff16611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90613a48565b60405180910390fd5b806040015115611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090614315565b60405180910390fd5b8060600151611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061437d565b60405180910390fd5b5f611d2783610f4c565b905080826080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060018260400190151590811515815250508160195f8581526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555060808201518160020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050611e298184612dc8565b505050565b60608060605f60178054905090508067ffffffffffffffff811115611e5657611e5561327e565b5b604051908082528060200260200182016040528015611e845781602001602082028036833780820191505090505b5093508067ffffffffffffffff811115611ea157611ea061327e565b5b604051908082528060200260200182016040528015611ecf5781602001602082028036833780820191505090505b5092508067ffffffffffffffff811115611eec57611eeb61327e565b5b604051908082528060200260200182016040528015611f1a5781602001602082028036833780820191505090505b5091505f805490505b81811015612068575f60178281548110611f4057611f3f613b36565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050805f0151868381518110611fd857611fd7613b36565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806020015185838151811061202a57612029613b36565b5b602002602001018181525050806040015184838151811061204e5761204d613b36565b5b602002602001018181525050508080600101915050611f23565b5050909192565b5f5460185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e6906143e5565b60405180910390fd5b601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121709061444d565b60405180910390fd5b6001601e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550601f33908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61223b858585610cbb565b61224484612c1e565b156122995761229885858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612c28565b5b5050505050565b6019602052805f5260405f205f91509050805f015490806001015490806002015f9054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b612313612bd3565b8060165f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606061236182612e94565b6123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790613c21565b60405180910390fd5b600b548211156123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90613c21565b60405180910390fd5b601a5f8381526020019081526020015f20805461240190613c6c565b80601f016020809104026020016040519081016040528092919081815260200182805461242d90613c6c565b80156124785780601f1061244f57610100808354040283529160200191612478565b820191905f5260205f20905b81548152906001019060200180831161245b57829003601f168201915b50505050509050919050565b60145481565b612492612bd3565b601d5f9054906101000a900460ff16156124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d8906144b5565b60405180910390fd5b43601c819055506001601d5f6101000a81548160ff0219169083151502179055506001601d60026101000a81548160ff02191690836002811115612528576125276131bf565b5b0217905550565b60125481565b5f81601c52670a5a2e7a00000000600852825f526030600c2054905092915050565b601f8181548110612566575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601f80548060200260200160405190810160405280929190818152602001828054801561261357602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116125ca575b5050505050905090565b612625612bd3565b63389a75e1600c52805f526020600c20805442111561264b57636f5e88185f526004601cfd5b5f81555061265881612cf0565b50565b600d5481565b612669612bd3565b8060601b61267e57637448fbae5f526004601cfd5b61268781612cf0565b50565b601d5f9054906101000a900460ff166126d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cf90613fba565b60405180910390fd5b601454601c546126e89190613873565b43111561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061451d565b60405180910390fd5b60035460185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a290614585565b60405180910390fd5b60135434146127ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e6906145ed565b60405180910390fd5b600b54600a54600a54600b546128059190613b96565b61280f9190613b96565b6128199190613873565b6017805490501061285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690614655565b60405180910390fd5b601254821115801561287357506012548111155b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a9906146bd565b60405180910390fd5b601b5f8381526020019081526020015f205f8281526020019081526020015f205f9054906101000a900460ff161561291f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129169061474b565b60405180910390fd5b6001601b5f8481526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff021916908315150217905550601760405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155505060185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190612a57906138a6565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f6108423ff4d4047f481cf015957f5bf05c82a5a8a104b967528a69558d786c748383604051612aa49291906133fc565b60405180910390a25050565b60135481565b60178181548110612ac5575f80fd5b905f5260205f2090600302015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b5f63389a75e1600c52815f526020600c20549050919050565b5f1960601c82811692508381169350815f52837f7d8825530a5a2e7a00000000000000000000000000000000000000000000000017601c5260205f20820182018054821680612b795763ceea21b65f526004601cfd5b808614861517612b9e57805f526030600c2054612b9d57634b6e7f185f526004601cfd5b5b8482600101558385827f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f38a4505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314612c08576382b429005f526004601cfd5b565b505050565b505050565b5f6202a300905090565b5f813b9050919050565b60405163150b7a028082523360208301528560601b60601c604083015283606083015260808083015282518060a08401528015612c6f578060c08401826020870160045afa505b60208360a48301601c86015f8a5af1612c91573d15612c90573d5f843e3d83fd5b5b8160e01b835114612ca95763d1a57ed65f526004601cfd5b50505050505050565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f20820182015460601b60601c9050919050565b612cf8612ed1565b15612d5d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3811560ff1b8217815550612db3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278160601b60601c91508181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3818155505b50565b5f81805190602001205f1c9050919050565b612dd35f8383612c0a565b8160601b60601c9150805f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f208101810180548060601b15612e235763c991cbb15f526004601cfd5b8381178255835f52601c600c20600181540163ffffffff81168602612e575767ea553b3401336cea861560021b526004601cfd5b808255505082845f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f38a45050612e905f8383612c0f565b5050565b5f815f527f7d8825530a5a2e7a000000000000000000000000000000000000000000000000601c5260205f20820182015460601b15159050919050565b5f90565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f1a81612ee6565b8114612f24575f80fd5b50565b5f81359050612f3581612f11565b92915050565b5f60208284031215612f5057612f4f612ede565b5b5f612f5d84828501612f27565b91505092915050565b5f8115159050919050565b612f7a81612f66565b82525050565b5f602082019050612f935f830184612f71565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612fdb82612f99565b612fe58185612fa3565b9350612ff5818560208601612fb3565b612ffe81612fc1565b840191505092915050565b5f6020820190508181035f8301526130218184612fd1565b905092915050565b5f819050919050565b61303b81613029565b8114613045575f80fd5b50565b5f8135905061305681613032565b92915050565b5f6020828403121561307157613070612ede565b5b5f61307e84828501613048565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6130b082613087565b9050919050565b6130c0816130a6565b82525050565b5f6020820190506130d95f8301846130b7565b92915050565b6130e8816130a6565b81146130f2575f80fd5b50565b5f81359050613103816130df565b92915050565b5f806040838503121561311f5761311e612ede565b5b5f61312c858286016130f5565b925050602061313d85828601613048565b9150509250929050565b61315081613029565b82525050565b5f6020820190506131695f830184613147565b92915050565b5f805f6060848603121561318657613185612ede565b5b5f613193868287016130f5565b93505060206131a4868287016130f5565b92505060406131b586828701613048565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600381106131fd576131fc6131bf565b5b50565b5f81905061320d826131ec565b919050565b5f61321c82613200565b9050919050565b61322c81613212565b82525050565b5f6020820190506132455f830184613223565b92915050565b5f602082840312156132605761325f612ede565b5b5f61326d848285016130f5565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6132b482612fc1565b810181811067ffffffffffffffff821117156132d3576132d261327e565b5b80604052505050565b5f6132e5612ed5565b90506132f182826132ab565b919050565b5f67ffffffffffffffff8211156133105761330f61327e565b5b61331982612fc1565b9050602081019050919050565b828183375f83830152505050565b5f613346613341846132f6565b6132dc565b9050828152602081018484840111156133625761336161327a565b5b61336d848285613326565b509392505050565b5f82601f83011261338957613388613276565b5b8135613399848260208601613334565b91505092915050565b5f80604083850312156133b8576133b7612ede565b5b5f6133c585828601613048565b925050602083013567ffffffffffffffff8111156133e6576133e5612ee2565b5b6133f285828601613375565b9150509250929050565b5f60408201905061340f5f830185613147565b61341c6020830184613147565b9392505050565b61342c81612f66565b8114613436575f80fd5b50565b5f8135905061344781613423565b92915050565b5f806040838503121561346357613462612ede565b5b5f613470858286016130f5565b925050602061348185828601613439565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6134bd816130a6565b82525050565b5f6134ce83836134b4565b60208301905092915050565b5f602082019050919050565b5f6134f08261348b565b6134fa8185613495565b9350613505836134a5565b805f5b8381101561353557815161351c88826134c3565b9750613527836134da565b925050600181019050613508565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61357481613029565b82525050565b5f613585838361356b565b60208301905092915050565b5f602082019050919050565b5f6135a782613542565b6135b1818561354c565b93506135bc8361355c565b805f5b838110156135ec5781516135d3888261357a565b97506135de83613591565b9250506001810190506135bf565b5085935050505092915050565b5f6060820190508181035f83015261361181866134e6565b90508181036020830152613625818561359d565b90508181036040830152613639818461359d565b9050949350505050565b5f80fd5b5f80fd5b5f8083601f8401126136605761365f613276565b5b8235905067ffffffffffffffff81111561367d5761367c613643565b5b60208301915083600182028301111561369957613698613647565b5b9250929050565b5f805f805f608086880312156136b9576136b8612ede565b5b5f6136c6888289016130f5565b95505060206136d7888289016130f5565b94505060406136e888828901613048565b935050606086013567ffffffffffffffff81111561370957613708612ee2565b5b6137158882890161364b565b92509250509295509295909350565b5f60a0820190506137375f830188613147565b6137446020830187613147565b6137516040830186612f71565b61375e6060830185612f71565b61376b60808301846130b7565b9695505050505050565b5f806040838503121561378b5761378a612ede565b5b5f613798858286016130f5565b92505060206137a9858286016130f5565b9150509250929050565b5f6020820190508181035f8301526137cb81846134e6565b905092915050565b5f80604083850312156137e9576137e8612ede565b5b5f6137f685828601613048565b925050602061380785828601613048565b9150509250929050565b5f6060820190506138245f8301866130b7565b6138316020830185613147565b61383e6040830184613147565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61387d82613029565b915061388883613029565b92508282019050808211156138a05761389f613846565b5b92915050565b5f6138b082613029565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138e2576138e1613846565b5b600182019050919050565b7f4e6f2045544820746f20776974686472617700000000000000000000000000005f82015250565b5f613921601283612fa3565b915061392c826138ed565b602082019050919050565b5f6020820190508181035f83015261394e81613915565b9050919050565b5f81905092915050565b50565b5f61396d5f83613955565b91506139788261395f565b5f82019050919050565b5f61398c82613962565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f6139ca600f83612fa3565b91506139d582613996565b602082019050919050565b5f6020820190508181035f8301526139f7816139be565b9050919050565b7f47616d65206e6f742066696e616c697a656400000000000000000000000000005f82015250565b5f613a32601283612fa3565b9150613a3d826139fe565b602082019050919050565b5f6020820190508181035f830152613a5f81613a26565b9050919050565b7f456767206d6f742072657665616c6564207965740000000000000000000000005f82015250565b5f613a9a601483612fa3565b9150613aa582613a66565b602082019050919050565b5f6020820190508181035f830152613ac781613a8e565b9050919050565b7f496e76616c6964206567672049440000000000000000000000000000000000005f82015250565b5f613b02600e83612fa3565b9150613b0d82613ace565b602082019050919050565b5f6020820190508181035f830152613b2f81613af6565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613b6d82613029565b9150613b7883613029565b9250828203905081811115613b9057613b8f613846565b5b92915050565b5f613ba082613029565b9150613bab83613029565b9250828202613bb981613029565b91508282048414831517613bd057613bcf613846565b5b5092915050565b7f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000005f82015250565b5f613c0b601183612fa3565b9150613c1682613bd7565b602082019050919050565b5f6020820190508181035f830152613c3881613bff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613c8357607f821691505b602082108103613c9657613c95613c3f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613cf87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cbd565b613d028683613cbd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613d3d613d38613d3384613029565b613d1a565b613029565b9050919050565b5f819050919050565b613d5683613d23565b613d6a613d6282613d44565b848454613cc9565b825550505050565b5f90565b613d7e613d72565b613d89818484613d4d565b505050565b5b81811015613dac57613da15f82613d76565b600181019050613d8f565b5050565b601f821115613df157613dc281613c9c565b613dcb84613cae565b81016020851015613dda578190505b613dee613de685613cae565b830182613d8e565b50505b505050565b5f82821c905092915050565b5f613e115f1984600802613df6565b1980831691505092915050565b5f613e298383613e02565b9150826002028217905092915050565b613e4282612f99565b67ffffffffffffffff811115613e5b57613e5a61327e565b5b613e658254613c6c565b613e70828285613db0565b5f60209050601f831160018114613ea1575f8415613e8f578287015190505b613e998582613e1e565b865550613f00565b601f198416613eaf86613c9c565b5f5b82811015613ed657848901518255600182019150602085019450602081019050613eb1565b86831015613ef35784890151613eef601f891682613e02565b8355505b6001600288020188555050505b505050505050565b7f456767206e6f742072657665616c6564207965740000000000000000000000005f82015250565b5f613f3c601483612fa3565b9150613f4782613f08565b602082019050919050565b5f6020820190508181035f830152613f6981613f30565b9050919050565b7f47616d65206e6f742073746172746564000000000000000000000000000000005f82015250565b5f613fa4601083612fa3565b9150613faf82613f70565b602082019050919050565b5f6020820190508181035f830152613fd181613f98565b9050919050565b7f416c72656164792072657665616c6564000000000000000000000000000000005f82015250565b5f61400c601083612fa3565b915061401782613fd8565b602082019050919050565b5f6020820190508181035f83015261403981614000565b9050919050565b7f546f6f206561726c7920746f2072657665616c000000000000000000000000005f82015250565b5f614074601383612fa3565b915061407f82614040565b602082019050919050565b5f6020820190508181035f8301526140a181614068565b9050919050565b7f52657665616c2077696e646f77206578706972656400000000000000000000005f82015250565b5f6140dc601583612fa3565b91506140e7826140a8565b602082019050919050565b5f6020820190508181035f830152614109816140d0565b9050919050565b5f819050919050565b5f819050919050565b61413361412e82614110565b614119565b82525050565b5f81905092915050565b7f45474700000000000000000000000000000000000000000000000000000000005f82015250565b5f614177600383614139565b915061418282614143565b600382019050919050565b5f819050919050565b6141a76141a282613029565b61418d565b82525050565b5f8160601b9050919050565b5f6141c3826141ad565b9050919050565b5f6141d4826141b9565b9050919050565b6141ec6141e7826130a6565b6141ca565b82525050565b5f6141fd8286614122565b60208201915061420c8261416b565b91506142188285614196565b60208201915061422882846141db565b601482019150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61427082613029565b915061427b83613029565b92508261428b5761428a614239565b5b828206905092915050565b5f6060820190506142a95f830186613147565b6142b66020830185613147565b6142c36040830184613147565b949350505050565b7f45676720616c726561647920636c61696d6564000000000000000000000000005f82015250565b5f6142ff601383612fa3565b915061430a826142cb565b602082019050919050565b5f6020820190508181035f83015261432c816142f3565b9050919050565b7f456767206e6f74207965742072657665616c65640000000000000000000000005f82015250565b5f614367601483612fa3565b915061437282614333565b602082019050919050565b5f6020820190508181035f8301526143948161435b565b9050919050565b7f4f6e6c792068756e746572732063616e207369676e2e000000000000000000005f82015250565b5f6143cf601683612fa3565b91506143da8261439b565b602082019050919050565b5f6020820190508181035f8301526143fc816143c3565b9050919050565b7f416c7265616479207369676e65642e00000000000000000000000000000000005f82015250565b5f614437600f83612fa3565b915061444282614403565b602082019050919050565b5f6020820190508181035f8301526144648161442b565b9050919050565b7f47616d6520616c726561647920737461727465640000000000000000000000005f82015250565b5f61449f601483612fa3565b91506144aa8261446b565b602082019050919050565b5f6020820190508181035f8301526144cc81614493565b9050919050565b7f47616d6520656e646564000000000000000000000000000000000000000000005f82015250565b5f614507600a83612fa3565b9150614512826144d3565b602082019050919050565b5f6020820190508181035f830152614534816144fb565b9050919050565b7f4d6178696d756d206775657373657320726561636865640000000000000000005f82015250565b5f61456f601783612fa3565b915061457a8261453b565b602082019050919050565b5f6020820190508181035f83015261459c81614563565b9050919050565b7f496e636f727265637420656e74727920666565000000000000000000000000005f82015250565b5f6145d7601383612fa3565b91506145e2826145a3565b602082019050919050565b5f6020820190508181035f830152614604816145cb565b9050919050565b7f4d617820706c61796572732072656163686564000000000000000000000000005f82015250565b5f61463f601383612fa3565b915061464a8261460b565b602082019050919050565b5f6020820190508181035f83015261466c81614633565b9050919050565b7f496e76616c696420636f6f7264696e61746573000000000000000000000000005f82015250565b5f6146a7601383612fa3565b91506146b282614673565b602082019050919050565b5f6020820190508181035f8301526146d48161469b565b9050919050565b7f546861742073706f742068617320616c7265616479206265656e20636c61696d5f8201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b5f614735602383612fa3565b9150614740826146db565b604082019050919050565b5f6020820190508181035f83015261476281614729565b905091905056fea264697066735822122048353081f990c78e61268822fbaeac406bac0a823a459d8d32e06a22bfcc1b2364736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005d68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f6261666b726569616b6a69683673696a753472627279657663367171776676633733637079716d6b627932766d736d6b6979706c6d616a65636b65000000
-----Decoded View---------------
Arg [0] : tokenZeroMetadata (string): https://gateway.pinata.cloud/ipfs/bafkreiakjih6siju4rbryevc6qqwfvc73cpyqmkby2vmsmkiyplmajecke
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000005d
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f6261666b726569616b6a69683673696a7534726272796576633671717766
Arg [4] : 76633733637079716d6b627932766d736d6b6979706c6d616a65636b65000000
Deployed Bytecode Sourcemap
10284:9165:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14864:380:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10540:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8099:532:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8925:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11443:52:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18100:165;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17772:218;;;;;;;;;;;;;:::i;:::-;;12518:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10748:2886:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9021:617:1;;;:::i;:::-;;12455:26:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12550:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19162:247;;;;;;;;;;;;;:::i;:::-;;16447:880;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18273:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13705:198:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13466:224:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11821:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18715:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9720:456:1;;;:::i;:::-;;12488:23:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6957:332:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12249:48:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16097:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7433:533:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8762:100:1;;;:::i;:::-;;11408:182;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14940:1149:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10631:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17998:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9667:726:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17335:429:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14410:522;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;18352:251;;;;;;;;;;;;;:::i;:::-;;14406:249:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12304:32:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;13347:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18914:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11752:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13123:216;;;;;;;;;;;;;:::i;:::-;;11627:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9135:392:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18319:24:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18611:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10363:708:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11392:44:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8348:349:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13698:704:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11684:61;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12219:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;11693:435:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14864:380:2;14940:11;15047;15042:3;15038:21;15216:10;15213:1;15210:17;15196:10;15193:1;15190:17;15177:10;15174:1;15171:17;15168:40;15165:63;15155:73;;15015:223;14864:380;;;:::o;10540:85:0:-;10586:13;10603:19;;;;;;;;;;;;;;;;;;;10540:85;:::o;8099:532:2:-;8161:14;8266:2;8260:4;8253:16;8295:24;8289:4;8282:38;8386:4;8380;8370:21;8366:2;8362:30;8358:2;8354:39;8430:13;8424:20;8420:2;8416:29;8406:158;;8478:10;8472:4;8465:24;8545:4;8539;8532:18;8406:158;8600:13;8597:1;8593:21;8587:28;8577:38;;8239:386;8099:532;;;:::o;8925:119::-;9004:33;9013:10;9025:7;9034:2;9004:8;:33::i;:::-;8925:119;;:::o;11443:52:0:-;;;;:::o;18100:165::-;18147:4;18171:11;;;;;;;;;;;:68;;;;;18219:20;;18202:14;;:37;;;;:::i;:::-;18186:12;:53;;18171:68;:86;;;;;18244:13;;;;;;;;;;;18243:14;18171:86;18164:93;;18100:165;:::o;17772:218::-;12517:13:1;:11;:13::i;:::-;17832:10:0::1;17845:3;;17832:16;;17827:156;17859:6;;17850:5;:15;17827:156;;17896:4;:11;17901:5;17896:11;;;;;;;;;;;:19;;;;;;;;;;;;17891:81;;17936:20;17950:5;17936:13;:20::i;:::-;17891:81;17867:7;;;;;:::i;:::-;;;;17827:156;;;;17772:218::o:0;12518:25::-;;;;;;;;;;;;;:::o;10748:2886:2:-;10841:34;10862:4;10868:2;10872;10841:20;:34::i;:::-;11025:1;11021:6;11017:2;11013:15;11069:4;11053:14;11049:25;11041:33;;11113:2;11097:14;11093:23;11087:29;;11182:2;11176:4;11169:16;11240:8;11214:24;11211:38;11205:4;11198:52;11316:4;11310;11300:21;11296:2;11292:30;11288:2;11284:39;11365:13;11359:20;11425:15;11409:14;11405:36;11567:4;11560:5;11557:15;11550:5;11546:27;11536:229;;11697:18;11688:5;11681:13;11678:1;11674:21;11667:49;11746:4;11740;11733:18;11536:229;11868:4;11862;11855:18;11926:13;11923:1;11919:21;11913:28;12076:15;12066:8;12063:29;12056:4;12046:8;12043:18;12040:53;12030:288;;12149:4;12143;12133:21;12127:28;12117:183;;12196:10;12190:4;12183:24;12273:4;12267;12260:18;12117:183;12030:288;12393:15;12390:55;;;12441:1;12425:13;12422:1;12418:21;12411:32;12390:55;11837:622;12567:2;12561:4;12557:13;12540:15;12536:35;12521:13;12514:58;12690:4;12684;12674:21;12764:1;12746:15;12740:22;12736:30;12719:15;12712:55;12633:148;12871:2;12865:4;12858:16;12928:4;12922;12912:21;13003:1;12987:13;12981:20;12977:28;13157:20;13136:19;13132:46;13128:2;13124:55;13114:270;;13308:18;13302:2;13295:10;13292:1;13288:18;13281:46;13361:4;13355;13348:18;13114:270;13423:19;13408:13;13401:42;12840:617;;13572:2;13568;13562:4;13535:25;13529:4;13517:10;13512:63;10937:2648;;;;13594:33;13614:4;13620:2;13624;13594:19;:33::i;:::-;10748:2886;;;:::o;9021:617:1:-;9114:15;9150:28;:26;:28::i;:::-;9132:46;;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;12455:26:0:-;;;;:::o;12550:46::-;;;;;;;;;;;;;:::o;19162:247::-;12517:13:1;:11;:13::i;:::-;19244:4:0::1;;19220:21;:28;19212:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;19283:12;19308:7;:5;:7::i;:::-;19300:21;;19329;19300:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19282:73;;;19374:7;19366:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;19201:208;19162:247::o:0;16447:880::-;16499:7;16519:14;16536:4;:11;16541:5;16536:11;;;;;;;;;;;16519:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16566:13;;;;;;;;;;;16558:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;16621:3;:12;;;16613:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;16686:3;;16677:5;:12;;:31;;;;;16702:6;;16693:5;:15;;16677:31;16669:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;16740:17;16760:4;;16740:24;;16775:16;16794:14;16775:33;;16824:10;16837:4;;16824:17;;16819:455;16851:7;:14;;;;16843:5;:22;16819:455;;;16891:20;16914:7;16922:5;16914:14;;;;;;;;:::i;:::-;;;;;;;;;;;;16891:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16943:7;16964:3;:5;;;16953:6;:8;;;:16;:54;;16999:6;:8;;;16991:3;:5;;;:16;;;;:::i;:::-;16953:54;;;16983:3;:5;;;16972:6;:8;;;:16;;;;:::i;:::-;16953:54;16943:64;;17022:7;17043:3;:5;;;17032:6;:8;;;:16;:54;;17078:6;:8;;;17070:3;:5;;;:16;;;;:::i;:::-;17032:54;;;17062:3;:5;;;17051:6;:8;;;:16;;;;:::i;:::-;17032:54;17022:64;;17101:9;17128:2;17123;:7;;;;:::i;:::-;17118:2;17113;:7;;;;:::i;:::-;:17;;;;:::i;:::-;17101:29;;17158:11;17151:4;:18;17147:116;;;17204:4;17190:18;;17242:5;17227:20;;17147:116;16876:398;;;;16867:7;;;;;;;16819:455;;;;17293:7;17301:12;17293:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:26;;;;;;;;;;;;17286:33;;;;;16447:880;;;:::o;18273:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;13705:198:2:-;13802:26;13815:4;13821:2;13825;13802:12;:26::i;:::-;13842:12;13851:2;13842:8;:12::i;:::-;13838:58;;;13856:40;13879:4;13885:2;13889;13856:40;;;;;;;;;;;;:22;:40::i;:::-;13838:58;13705:198;;;:::o;13466:224:0:-;13523:4;13577:20;;13560:14;;:37;;;;:::i;:::-;13544:12;:53;13540:70;;13606:4;;13599:11;;;;13540:70;13670:12;13646:20;;13629:14;;:37;;;;:::i;:::-;13628:54;;;;:::i;:::-;13621:61;;13466:224;;:::o;11821:30::-;;;;:::o;18715:191::-;12517:13:1;:11;:13::i;:::-;18826:6:0::1;;18815:7;:17;;18807:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;18890:8;18865:13;:22;18879:7;18865:22;;;;;;;;;;;:33;;;;;;:::i;:::-;;18715:191:::0;;:::o;9720:456:1:-;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;12488:23:0:-;;;;;;;;;;;;;:::o;6957:332:2:-;7015:14;7050:12;7059:2;7050:8;:12::i;:::-;7041:21;;7148:6;7138:135;;7187:10;7181:4;7174:24;7254:4;7248;7241:18;7138:135;6957:332;;;:::o;12249:48:0:-;;;;;;;;;;;;;;;;;:::o;16097:342::-;16154:11;16167;16191:14;16208:4;:11;16213:5;16208:11;;;;;;;;;;;16191:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16238:13;;;;;;;;;;;16230:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;16293:3;:12;;;16285:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;16358:3;;16349:5;:12;;:31;;;;;16374:6;;16365:5;:15;;16349:31;16341:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;16418:3;:5;;;16425:3;:5;;;16410:21;;;;;16097:342;;;:::o;7433:533:2:-;7496:14;7656:5;7646:143;;7694:10;7688:4;7681:24;7770:4;7764;7757:18;7646:143;7815:24;7809:4;7802:38;7866:5;7860:4;7853:19;7929:20;7921:4;7915;7905:21;7899:28;7895:55;7885:65;;7433:533;;;:::o;8762:100:1:-;12517:13;:11;:13::i;:::-;8834:21:::1;8852:1;8834:9;:21::i;:::-;8762:100::o:0;11408:182::-;11454:14;11562:11;11556:18;11546:28;;11408:182;:::o;14940:1149:0:-;14999:11;;;;;;;;;;;14991:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;15059:3;;15050:5;:12;;:31;;;;;15075:6;;15066:5;:15;;15050:31;15042:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;15120:4;:11;15125:5;15120:11;;;;;;;;;;;:20;;;;;;;;;;;;15119:21;15111:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;15174:15;15209:20;;15192:14;;:37;;;;:::i;:::-;15174:55;;15240:11;15275:3;;15267:5;15254:10;:18;;;;:::i;:::-;:24;;;;:::i;:::-;15240:38;;15305:11;15340:3;;15332:5;15319:10;:18;;;;:::i;:::-;:24;;;;:::i;:::-;15305:38;;15395:6;15380:12;:21;15372:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;15469:11;;15460:6;:20;;;;:::i;:::-;15444:12;:36;;15436:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;15519:9;15612:8;;15536:72;15570:6;15560:17;15586:5;15601:4;15543:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15536:6;:72::i;:::-;15531:89;;;;:::i;:::-;15519:101;;15631:9;15724:8;;15648:72;15682:6;15672:17;15698:5;15713:4;15655:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15648:6;:72::i;:::-;15643:89;;;;:::i;:::-;15631:101;;15759:86;;;;;;;;15767:4;15759:86;;;;15776:4;15759:86;;;;15807:5;15759:86;;;;;;15792:4;15759:86;;;;;;15830:12;;;;;;;;;;;15759:86;;;;;15745:4;:11;15750:5;15745:11;;;;;;;;;;;:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15863:30;15875:5;15882:4;15888;15863:30;;;;;;;;:::i;:::-;;;;;;;;15923:20;15910:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;15906:97;;15972:19;15960:9;;:31;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;15906:97;16020:13;;;;;;;;;;;16015:67;;16066:4;16050:13;;:20;;;;;;;;;;;;;;;;;;16015:67;14980:1109;;;;;14940:1149;:::o;10631:81::-;10679:13;10696;;;;;;;;;;;;;;;;;;;10631:81;:::o;17998:94::-;18046:4;18070:7;:14;;;;18063:21;;17998:94;:::o;9667:726:2:-;9882:10;9875:18;9868:26;9854:40;;9991:8;9985:4;9978:22;10026:31;10020:4;10013:45;10084:8;10078:4;10071:22;10136:10;10129:4;10123;10113:21;10106:41;10221:10;10215:4;10208:24;10366:8;10362:2;10358:17;10354:2;10350:26;10340:8;10305:33;10299:4;10293;10288:89;9667:726;;:::o;17335:429:0:-;12517:13:1;:11;:13::i;:::-;17398:14:0::1;17415:4;:11;17420:5;17415:11;;;;;;;;;;;17398:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;17445:13;;;;;;;;;;;17437:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;17501:3;:11;;;17500:12;17492:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;17555:3;:12;;;17547:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;17605:14;17622:16;17632:5;17622:9;:16::i;:::-;17605:33;;17662:6;17649:3;:10;;:19;;;;;;;;;::::0;::::1;17693:4;17679:3;:11;;:18;;;;;;;;;::::0;::::1;17722:3;17708:4;:11;17713:5;17708:11;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17736:20;17742:6;17750:5;17736;:20::i;:::-;17387:377;;17335:429:::0;:::o;14410:522::-;14491:22;14515:16;14533;14567:8;14578:7;:14;;;;14567:25;;14625:3;14611:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14603:26;;14656:3;14645:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14640:20;;14687:3;14676:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14671:20;;14709:10;14722:4;;14709:17;;14704:221;14736:3;14728:5;:11;14704:221;;;14765:20;14788:7;14796:5;14788:14;;;;;;;;:::i;:::-;;;;;;;;;;;;14765:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14832:6;:11;;;14817:5;14823;14817:12;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;14870:6;:8;;;14858:2;14861:5;14858:9;;;;;;;;:::i;:::-;;;;;;;:20;;;;;14905:6;:8;;;14893:2;14896:5;14893:9;;;;;;;;:::i;:::-;;;;;;;:20;;;;;14750:175;14741:7;;;;;;;14704:221;;;;14556:376;14410:522;;;:::o;18352:251::-;18431:4;;18400:16;:28;18417:10;18400:28;;;;;;;;;;;;;;;;:35;18392:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;18482:7;:19;18490:10;18482:19;;;;;;;;;;;;;;;;;;;;;;;;;18481:20;18473:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;18556:4;18534:7;:19;18542:10;18534:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;18571:7;18584:10;18571:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18352:251::o;14406:249:2:-;14552:26;14565:4;14571:2;14575;14552:12;:26::i;:::-;14592:12;14601:2;14592:8;:12::i;:::-;14588:60;;;14606:42;14629:4;14635:2;14639;14643:4;;14606:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;:42::i;:::-;14588:60;14406:249;;;;;:::o;12304:32:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13347:111::-;12517:13:1;:11;:13::i;:::-;13438:12:0::1;13423;;:27;;;;;;;;;;;;;;;;;;13347:111:::0;:::o;18914:240::-;18976:13;19010:16;19018:7;19010;:16::i;:::-;19002:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;19078:6;;19067:7;:17;;19059:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;19124:13;:22;19138:7;19124:22;;;;;;;;;;;19117:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18914:240;;;:::o;11752:62::-;;;;:::o;13123:216::-;12517:13:1;:11;:13::i;:::-;13183:11:0::1;;;;;;;;;;;13182:12;13174:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;13247:12;13230:14;:29;;;;13284:4;13270:11;;:18;;;;;;;;;;;;;;;;;;13311:20;13299:9;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;13123:216::o:0;11627:50::-;;;;:::o;9135:392:2:-;9255:11;9361:8;9355:4;9348:22;9396:31;9390:4;9383:45;9454:5;9448:4;9441:19;9505:4;9499;9489:21;9483:28;9473:38;;9135:392;;;;:::o;18319:24:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18611:96::-;18656:16;18692:7;18685:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18611:96;:::o;10363:708:1:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;11006:12;10999:23;10515:517;11041:23;11051:12;11041:9;:23::i;:::-;10363:708:::0;:::o;11392:44:0:-;;;;:::o;8348:349:1:-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;:::-;8348:349:::0;:::o;13698:704:0:-;12779:11;;;;;;;;;;;12771:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;12863:20;;12846:14;;:37;;;;:::i;:::-;12830:12;:53;;12822:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;13829:5:::1;;13798:16;:28;13815:10;13798:28;;;;;;;;;;;;;;;;:36;13790:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13895:9;;13882;:22;13873:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;13986:6;;13980:3;;13974;;13965:6;;:12;;;;:::i;:::-;:18;;;;:::i;:::-;:27;;;;:::i;:::-;13948:7;:14;;;;:44;13940:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;14046:8;;14036:6;:18;;:40;;;;;14068:8;;14058:6;:18;;14036:40;14027:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;14121:11;:19;14133:6;14121:19;;;;;;;;;;;:27;14141:6;14121:27;;;;;;;;;;;;;;;;;;;;;14120:28;14112:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;14231:4;14201:11;:19;14213:6;14201:19;;;;;;;;;;;:27;14221:6;14201:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;14248:7;14261:34;;;;;;;;14268:10;14261:34;;;;;;14280:6;14261:34;;;;14288:6;14261:34;;::::0;14248:48:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14307:16;:28;14324:10;14307:28;;;;;;;;;;;;;;;;:30;;;;;;;;;:::i;:::-;;;;;;14367:10;14353:41;;;14379:6;14387;14353:41;;;;;;;:::i;:::-;;;;;;;;13698:704:::0;;:::o;11684:61::-;;;;:::o;12219:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11693:435:1:-;11812:14;11963:19;11957:4;11950:33;12009:12;12003:4;11996:26;12106:4;12100;12090:21;12084:28;12074:38;;11693:435;;;:::o;29039:1485:2:-;29265:1;29261:6;29257:2;29253:15;29312:7;29296:14;29292:28;29281:39;;29359:2;29343:14;29339:23;29333:29;;29432:2;29426:4;29419:16;29490:2;29464:24;29461:32;29455:4;29448:46;29560:4;29554;29544:21;29540:2;29536:30;29532:2;29528:39;29619:13;29613:20;29597:14;29593:41;29708:5;29698:134;;29746:10;29740:4;29733:24;29813:4;29807;29800:18;29698:134;30015:5;30011:2;30008:13;30003:2;29996:10;29993:29;29983:280;;30055:5;30049:4;30042:19;30110:4;30104;30094:21;30088:28;30078:171;;30153:10;30147:4;30140:24;30226:4;30220;30213:18;30078:171;29983:280;30376:7;30360:13;30357:1;30353:21;30346:38;30505:2;30496:7;30489:5;30462:25;30456:4;30444:10;30439:69;29177:1341;;;29039:1485;;;:::o;7292:355:1:-;7504:11;7498:18;7488:8;7485:32;7475:156;;7550:10;7544:4;7537:24;7612:4;7606;7599:18;7475:156;7292:355::o;37640:87:2:-;;;;:::o;37824:86::-;;;;:::o;7878:110:1:-;7947:6;7972:9;7965:16;;7878:110;:::o;38260:212:2:-;38311:11;38422:1;38410:14;38400:24;;38260:212;;;:::o;38631:1370::-;38868:4;38862:11;38918:10;38951:24;38948:1;38941:35;39010:8;39003:4;39000:1;38996:12;38989:30;39118:4;39114:2;39110:13;39106:2;39102:22;39095:4;39092:1;39088:12;39081:44;39159:2;39152:4;39149:1;39145:12;39138:24;39196:4;39189;39186:1;39182:12;39175:26;39229:4;39223:11;39268:1;39261:4;39258:1;39254:12;39247:23;39286:1;39283:71;;;39349:1;39342:4;39339:1;39335:12;39332:1;39325:4;39319;39315:15;39312:1;39305:5;39294:57;39290:62;39283:71;39470:4;39467:1;39460:4;39457:1;39453:12;39446:4;39443:1;39439:12;39436:1;39432:2;39425:5;39420:55;39410:313;;39498:16;39495:214;;;39626:16;39620:4;39617:1;39602:41;39674:16;39671:1;39664:27;39495:214;39410:313;39819:24;39814:3;39810:34;39806:1;39800:8;39797:48;39787:198;;39878:10;39872:4;39865:24;39966:4;39960;39953:18;39787:198;38802:1193;;;38631:1370;;;;:::o;16037:323::-;16098:14;16203:2;16197:4;16190:16;16232:24;16226:4;16219:38;16334:4;16328;16318:21;16314:2;16310:30;16306:2;16302:39;16296:46;16292:2;16288:55;16284:2;16280:64;16270:74;;16037:323;;;:::o;6145:1089:1:-;6213:23;:21;:23::i;:::-;6209:1019;;;6343:11;6443:8;6439:2;6435:17;6431:2;6427:26;6415:38;;6597:8;6585:9;6579:16;6539:38;6536:1;6533;6528:78;6710:8;6703:16;6698:3;6694:26;6684:8;6681:40;6670:9;6663:59;6308:428;6209:1019;;;6857:11;6957:8;6953:2;6949:17;6945:2;6941:26;6929:38;;7111:8;7099:9;7093:16;7053:38;7050:1;7047;7042:78;7195:8;7184:9;7177:27;6822:396;6209:1019;6145:1089;:::o;10158:119:0:-;10217:7;10262:5;10252:16;;;;;;10244:25;;10237:32;;10158:119;;;:::o;19609:1653:2:-;19675:40;19704:1;19708:2;19712;19675:20;:40::i;:::-;19853:2;19849;19845:11;19841:2;19837:20;19831:26;;19923:2;19917:4;19910:16;19952:24;19946:4;19939:38;20043:4;20037;20027:21;20023:2;20019:30;20015:2;20011:39;20092:13;20086:20;20181:15;20177:2;20173:24;20170:146;;;20229:10;20223:4;20216:24;20297:4;20291;20284:18;20170:146;20409:2;20392:15;20389:23;20374:13;20367:46;20508:2;20502:4;20495:16;20563:4;20557;20547:21;20634:1;20620:11;20614:18;20610:26;20786:20;20767:17;20763:44;20759:2;20755:53;20745:268;;20937:18;20931:2;20924:10;20921:1;20917:18;20910:46;20990:4;20984;20977:18;20745:268;21050:17;21037:11;21030:38;20477:605;;21194:2;21190;21187:1;21160:25;21154:4;21142:10;21137:60;19777:1430;;21216:39;21244:1;21248:2;21252;21216:19;:39::i;:::-;19609:1653;;:::o;15576:326::-;15636:11;15738:2;15732:4;15725:16;15767:24;15761:4;15754:38;15875:4;15869;15859:21;15855:2;15851:30;15847:2;15843:39;15837:46;15833:2;15829:55;15822:63;15815:71;15805:81;;15576:326;;;:::o;4348:78:1:-;4412:10;4348:78;:::o;7:75:3:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:118::-;4870:24;4888:5;4870:24;:::i;:::-;4865:3;4858:37;4783:118;;:::o;4907:222::-;5000:4;5038:2;5027:9;5023:18;5015:26;;5051:71;5119:1;5108:9;5104:17;5095:6;5051:71;:::i;:::-;4907:222;;;;:::o;5135:619::-;5212:6;5220;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:119;;;5283:79;;:::i;:::-;5245:119;5403:1;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5374:117;5530:2;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5501:118;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5135:619;;;;;:::o;5760:180::-;5808:77;5805:1;5798:88;5905:4;5902:1;5895:15;5929:4;5926:1;5919:15;5946:118;6032:1;6025:5;6022:12;6012:46;;6038:18;;:::i;:::-;6012:46;5946:118;:::o;6070:137::-;6120:7;6149:5;6138:16;;6155:46;6195:5;6155:46;:::i;:::-;6070:137;;;:::o;6213:::-;6274:9;6307:37;6338:5;6307:37;:::i;:::-;6294:50;;6213:137;;;:::o;6356:153::-;6454:48;6496:5;6454:48;:::i;:::-;6449:3;6442:61;6356:153;;:::o;6515:244::-;6619:4;6657:2;6646:9;6642:18;6634:26;;6670:82;6749:1;6738:9;6734:17;6725:6;6670:82;:::i;:::-;6515:244;;;;:::o;6765:329::-;6824:6;6873:2;6861:9;6852:7;6848:23;6844:32;6841:119;;;6879:79;;:::i;:::-;6841:119;6999:1;7024:53;7069:7;7060:6;7049:9;7045:22;7024:53;:::i;:::-;7014:63;;6970:117;6765:329;;;;:::o;7100:117::-;7209:1;7206;7199:12;7223:117;7332:1;7329;7322:12;7346:180;7394:77;7391:1;7384:88;7491:4;7488:1;7481:15;7515:4;7512:1;7505:15;7532:281;7615:27;7637:4;7615:27;:::i;:::-;7607:6;7603:40;7745:6;7733:10;7730:22;7709:18;7697:10;7694:34;7691:62;7688:88;;;7756:18;;:::i;:::-;7688:88;7796:10;7792:2;7785:22;7575:238;7532:281;;:::o;7819:129::-;7853:6;7880:20;;:::i;:::-;7870:30;;7909:33;7937:4;7929:6;7909:33;:::i;:::-;7819:129;;;:::o;7954:308::-;8016:4;8106:18;8098:6;8095:30;8092:56;;;8128:18;;:::i;:::-;8092:56;8166:29;8188:6;8166:29;:::i;:::-;8158:37;;8250:4;8244;8240:15;8232:23;;7954:308;;;:::o;8268:148::-;8366:6;8361:3;8356;8343:30;8407:1;8398:6;8393:3;8389:16;8382:27;8268:148;;;:::o;8422:425::-;8500:5;8525:66;8541:49;8583:6;8541:49;:::i;:::-;8525:66;:::i;:::-;8516:75;;8614:6;8607:5;8600:21;8652:4;8645:5;8641:16;8690:3;8681:6;8676:3;8672:16;8669:25;8666:112;;;8697:79;;:::i;:::-;8666:112;8787:54;8834:6;8829:3;8824;8787:54;:::i;:::-;8506:341;8422:425;;;;;:::o;8867:340::-;8923:5;8972:3;8965:4;8957:6;8953:17;8949:27;8939:122;;8980:79;;:::i;:::-;8939:122;9097:6;9084:20;9122:79;9197:3;9189:6;9182:4;9174:6;9170:17;9122:79;:::i;:::-;9113:88;;8929:278;8867:340;;;;:::o;9213:654::-;9291:6;9299;9348:2;9336:9;9327:7;9323:23;9319:32;9316:119;;;9354:79;;:::i;:::-;9316:119;9474:1;9499:53;9544:7;9535:6;9524:9;9520:22;9499:53;:::i;:::-;9489:63;;9445:117;9629:2;9618:9;9614:18;9601:32;9660:18;9652:6;9649:30;9646:117;;;9682:79;;:::i;:::-;9646:117;9787:63;9842:7;9833:6;9822:9;9818:22;9787:63;:::i;:::-;9777:73;;9572:288;9213:654;;;;;:::o;9873:332::-;9994:4;10032:2;10021:9;10017:18;10009:26;;10045:71;10113:1;10102:9;10098:17;10089:6;10045:71;:::i;:::-;10126:72;10194:2;10183:9;10179:18;10170:6;10126:72;:::i;:::-;9873:332;;;;;:::o;10211:116::-;10281:21;10296:5;10281:21;:::i;:::-;10274:5;10271:32;10261:60;;10317:1;10314;10307:12;10261:60;10211:116;:::o;10333:133::-;10376:5;10414:6;10401:20;10392:29;;10430:30;10454:5;10430:30;:::i;:::-;10333:133;;;;:::o;10472:468::-;10537:6;10545;10594:2;10582:9;10573:7;10569:23;10565:32;10562:119;;;10600:79;;:::i;:::-;10562:119;10720:1;10745:53;10790:7;10781:6;10770:9;10766:22;10745:53;:::i;:::-;10735:63;;10691:117;10847:2;10873:50;10915:7;10906:6;10895:9;10891:22;10873:50;:::i;:::-;10863:60;;10818:115;10472:468;;;;;:::o;10946:114::-;11013:6;11047:5;11041:12;11031:22;;10946:114;;;:::o;11066:184::-;11165:11;11199:6;11194:3;11187:19;11239:4;11234:3;11230:14;11215:29;;11066:184;;;;:::o;11256:132::-;11323:4;11346:3;11338:11;;11376:4;11371:3;11367:14;11359:22;;11256:132;;;:::o;11394:108::-;11471:24;11489:5;11471:24;:::i;:::-;11466:3;11459:37;11394:108;;:::o;11508:179::-;11577:10;11598:46;11640:3;11632:6;11598:46;:::i;:::-;11676:4;11671:3;11667:14;11653:28;;11508:179;;;;:::o;11693:113::-;11763:4;11795;11790:3;11786:14;11778:22;;11693:113;;;:::o;11842:732::-;11961:3;11990:54;12038:5;11990:54;:::i;:::-;12060:86;12139:6;12134:3;12060:86;:::i;:::-;12053:93;;12170:56;12220:5;12170:56;:::i;:::-;12249:7;12280:1;12265:284;12290:6;12287:1;12284:13;12265:284;;;12366:6;12360:13;12393:63;12452:3;12437:13;12393:63;:::i;:::-;12386:70;;12479:60;12532:6;12479:60;:::i;:::-;12469:70;;12325:224;12312:1;12309;12305:9;12300:14;;12265:284;;;12269:14;12565:3;12558:10;;11966:608;;;11842:732;;;;:::o;12580:114::-;12647:6;12681:5;12675:12;12665:22;;12580:114;;;:::o;12700:184::-;12799:11;12833:6;12828:3;12821:19;12873:4;12868:3;12864:14;12849:29;;12700:184;;;;:::o;12890:132::-;12957:4;12980:3;12972:11;;13010:4;13005:3;13001:14;12993:22;;12890:132;;;:::o;13028:108::-;13105:24;13123:5;13105:24;:::i;:::-;13100:3;13093:37;13028:108;;:::o;13142:179::-;13211:10;13232:46;13274:3;13266:6;13232:46;:::i;:::-;13310:4;13305:3;13301:14;13287:28;;13142:179;;;;:::o;13327:113::-;13397:4;13429;13424:3;13420:14;13412:22;;13327:113;;;:::o;13476:732::-;13595:3;13624:54;13672:5;13624:54;:::i;:::-;13694:86;13773:6;13768:3;13694:86;:::i;:::-;13687:93;;13804:56;13854:5;13804:56;:::i;:::-;13883:7;13914:1;13899:284;13924:6;13921:1;13918:13;13899:284;;;14000:6;13994:13;14027:63;14086:3;14071:13;14027:63;:::i;:::-;14020:70;;14113:60;14166:6;14113:60;:::i;:::-;14103:70;;13959:224;13946:1;13943;13939:9;13934:14;;13899:284;;;13903:14;14199:3;14192:10;;13600:608;;;13476:732;;;;:::o;14214:895::-;14513:4;14551:2;14540:9;14536:18;14528:26;;14600:9;14594:4;14590:20;14586:1;14575:9;14571:17;14564:47;14628:108;14731:4;14722:6;14628:108;:::i;:::-;14620:116;;14783:9;14777:4;14773:20;14768:2;14757:9;14753:18;14746:48;14811:108;14914:4;14905:6;14811:108;:::i;:::-;14803:116;;14966:9;14960:4;14956:20;14951:2;14940:9;14936:18;14929:48;14994:108;15097:4;15088:6;14994:108;:::i;:::-;14986:116;;14214:895;;;;;;:::o;15115:117::-;15224:1;15221;15214:12;15238:117;15347:1;15344;15337:12;15374:552;15431:8;15441:6;15491:3;15484:4;15476:6;15472:17;15468:27;15458:122;;15499:79;;:::i;:::-;15458:122;15612:6;15599:20;15589:30;;15642:18;15634:6;15631:30;15628:117;;;15664:79;;:::i;:::-;15628:117;15778:4;15770:6;15766:17;15754:29;;15832:3;15824:4;15816:6;15812:17;15802:8;15798:32;15795:41;15792:128;;;15839:79;;:::i;:::-;15792:128;15374:552;;;;;:::o;15932:963::-;16029:6;16037;16045;16053;16061;16110:3;16098:9;16089:7;16085:23;16081:33;16078:120;;;16117:79;;:::i;:::-;16078:120;16237:1;16262:53;16307:7;16298:6;16287:9;16283:22;16262:53;:::i;:::-;16252:63;;16208:117;16364:2;16390:53;16435:7;16426:6;16415:9;16411:22;16390:53;:::i;:::-;16380:63;;16335:118;16492:2;16518:53;16563:7;16554:6;16543:9;16539:22;16518:53;:::i;:::-;16508:63;;16463:118;16648:2;16637:9;16633:18;16620:32;16679:18;16671:6;16668:30;16665:117;;;16701:79;;:::i;:::-;16665:117;16814:64;16870:7;16861:6;16850:9;16846:22;16814:64;:::i;:::-;16796:82;;;;16591:297;15932:963;;;;;;;;:::o;16901:640::-;17094:4;17132:3;17121:9;17117:19;17109:27;;17146:71;17214:1;17203:9;17199:17;17190:6;17146:71;:::i;:::-;17227:72;17295:2;17284:9;17280:18;17271:6;17227:72;:::i;:::-;17309:66;17371:2;17360:9;17356:18;17347:6;17309:66;:::i;:::-;17385;17447:2;17436:9;17432:18;17423:6;17385:66;:::i;:::-;17461:73;17529:3;17518:9;17514:19;17505:6;17461:73;:::i;:::-;16901:640;;;;;;;;:::o;17547:474::-;17615:6;17623;17672:2;17660:9;17651:7;17647:23;17643:32;17640:119;;;17678:79;;:::i;:::-;17640:119;17798:1;17823:53;17868:7;17859:6;17848:9;17844:22;17823:53;:::i;:::-;17813:63;;17769:117;17925:2;17951:53;17996:7;17987:6;17976:9;17972:22;17951:53;:::i;:::-;17941:63;;17896:118;17547:474;;;;;:::o;18027:373::-;18170:4;18208:2;18197:9;18193:18;18185:26;;18257:9;18251:4;18247:20;18243:1;18232:9;18228:17;18221:47;18285:108;18388:4;18379:6;18285:108;:::i;:::-;18277:116;;18027:373;;;;:::o;18406:474::-;18474:6;18482;18531:2;18519:9;18510:7;18506:23;18502:32;18499:119;;;18537:79;;:::i;:::-;18499:119;18657:1;18682:53;18727:7;18718:6;18707:9;18703:22;18682:53;:::i;:::-;18672:63;;18628:117;18784:2;18810:53;18855:7;18846:6;18835:9;18831:22;18810:53;:::i;:::-;18800:63;;18755:118;18406:474;;;;;:::o;18886:442::-;19035:4;19073:2;19062:9;19058:18;19050:26;;19086:71;19154:1;19143:9;19139:17;19130:6;19086:71;:::i;:::-;19167:72;19235:2;19224:9;19220:18;19211:6;19167:72;:::i;:::-;19249;19317:2;19306:9;19302:18;19293:6;19249:72;:::i;:::-;18886:442;;;;;;:::o;19334:180::-;19382:77;19379:1;19372:88;19479:4;19476:1;19469:15;19503:4;19500:1;19493:15;19520:191;19560:3;19579:20;19597:1;19579:20;:::i;:::-;19574:25;;19613:20;19631:1;19613:20;:::i;:::-;19608:25;;19656:1;19653;19649:9;19642:16;;19677:3;19674:1;19671:10;19668:36;;;19684:18;;:::i;:::-;19668:36;19520:191;;;;:::o;19717:233::-;19756:3;19779:24;19797:5;19779:24;:::i;:::-;19770:33;;19825:66;19818:5;19815:77;19812:103;;19895:18;;:::i;:::-;19812:103;19942:1;19935:5;19931:13;19924:20;;19717:233;;;:::o;19956:168::-;20096:20;20092:1;20084:6;20080:14;20073:44;19956:168;:::o;20130:366::-;20272:3;20293:67;20357:2;20352:3;20293:67;:::i;:::-;20286:74;;20369:93;20458:3;20369:93;:::i;:::-;20487:2;20482:3;20478:12;20471:19;;20130:366;;;:::o;20502:419::-;20668:4;20706:2;20695:9;20691:18;20683:26;;20755:9;20749:4;20745:20;20741:1;20730:9;20726:17;20719:47;20783:131;20909:4;20783:131;:::i;:::-;20775:139;;20502:419;;;:::o;20927:147::-;21028:11;21065:3;21050:18;;20927:147;;;;:::o;21080:114::-;;:::o;21200:398::-;21359:3;21380:83;21461:1;21456:3;21380:83;:::i;:::-;21373:90;;21472:93;21561:3;21472:93;:::i;:::-;21590:1;21585:3;21581:11;21574:18;;21200:398;;;:::o;21604:379::-;21788:3;21810:147;21953:3;21810:147;:::i;:::-;21803:154;;21974:3;21967:10;;21604:379;;;:::o;21989:165::-;22129:17;22125:1;22117:6;22113:14;22106:41;21989:165;:::o;22160:366::-;22302:3;22323:67;22387:2;22382:3;22323:67;:::i;:::-;22316:74;;22399:93;22488:3;22399:93;:::i;:::-;22517:2;22512:3;22508:12;22501:19;;22160:366;;;:::o;22532:419::-;22698:4;22736:2;22725:9;22721:18;22713:26;;22785:9;22779:4;22775:20;22771:1;22760:9;22756:17;22749:47;22813:131;22939:4;22813:131;:::i;:::-;22805:139;;22532:419;;;:::o;22957:168::-;23097:20;23093:1;23085:6;23081:14;23074:44;22957:168;:::o;23131:366::-;23273:3;23294:67;23358:2;23353:3;23294:67;:::i;:::-;23287:74;;23370:93;23459:3;23370:93;:::i;:::-;23488:2;23483:3;23479:12;23472:19;;23131:366;;;:::o;23503:419::-;23669:4;23707:2;23696:9;23692:18;23684:26;;23756:9;23750:4;23746:20;23742:1;23731:9;23727:17;23720:47;23784:131;23910:4;23784:131;:::i;:::-;23776:139;;23503:419;;;:::o;23928:170::-;24068:22;24064:1;24056:6;24052:14;24045:46;23928:170;:::o;24104:366::-;24246:3;24267:67;24331:2;24326:3;24267:67;:::i;:::-;24260:74;;24343:93;24432:3;24343:93;:::i;:::-;24461:2;24456:3;24452:12;24445:19;;24104:366;;;:::o;24476:419::-;24642:4;24680:2;24669:9;24665:18;24657:26;;24729:9;24723:4;24719:20;24715:1;24704:9;24700:17;24693:47;24757:131;24883:4;24757:131;:::i;:::-;24749:139;;24476:419;;;:::o;24901:164::-;25041:16;25037:1;25029:6;25025:14;25018:40;24901:164;:::o;25071:366::-;25213:3;25234:67;25298:2;25293:3;25234:67;:::i;:::-;25227:74;;25310:93;25399:3;25310:93;:::i;:::-;25428:2;25423:3;25419:12;25412:19;;25071:366;;;:::o;25443:419::-;25609:4;25647:2;25636:9;25632:18;25624:26;;25696:9;25690:4;25686:20;25682:1;25671:9;25667:17;25660:47;25724:131;25850:4;25724:131;:::i;:::-;25716:139;;25443:419;;;:::o;25868:180::-;25916:77;25913:1;25906:88;26013:4;26010:1;26003:15;26037:4;26034:1;26027:15;26054:194;26094:4;26114:20;26132:1;26114:20;:::i;:::-;26109:25;;26148:20;26166:1;26148:20;:::i;:::-;26143:25;;26192:1;26189;26185:9;26177:17;;26216:1;26210:4;26207:11;26204:37;;;26221:18;;:::i;:::-;26204:37;26054:194;;;;:::o;26254:410::-;26294:7;26317:20;26335:1;26317:20;:::i;:::-;26312:25;;26351:20;26369:1;26351:20;:::i;:::-;26346:25;;26406:1;26403;26399:9;26428:30;26446:11;26428:30;:::i;:::-;26417:41;;26607:1;26598:7;26594:15;26591:1;26588:22;26568:1;26561:9;26541:83;26518:139;;26637:18;;:::i;:::-;26518:139;26302:362;26254:410;;;;:::o;26670:167::-;26810:19;26806:1;26798:6;26794:14;26787:43;26670:167;:::o;26843:366::-;26985:3;27006:67;27070:2;27065:3;27006:67;:::i;:::-;26999:74;;27082:93;27171:3;27082:93;:::i;:::-;27200:2;27195:3;27191:12;27184:19;;26843:366;;;:::o;27215:419::-;27381:4;27419:2;27408:9;27404:18;27396:26;;27468:9;27462:4;27458:20;27454:1;27443:9;27439:17;27432:47;27496:131;27622:4;27496:131;:::i;:::-;27488:139;;27215:419;;;:::o;27640:180::-;27688:77;27685:1;27678:88;27785:4;27782:1;27775:15;27809:4;27806:1;27799:15;27826:320;27870:6;27907:1;27901:4;27897:12;27887:22;;27954:1;27948:4;27944:12;27975:18;27965:81;;28031:4;28023:6;28019:17;28009:27;;27965:81;28093:2;28085:6;28082:14;28062:18;28059:38;28056:84;;28112:18;;:::i;:::-;28056:84;27877:269;27826:320;;;:::o;28152:141::-;28201:4;28224:3;28216:11;;28247:3;28244:1;28237:14;28281:4;28278:1;28268:18;28260:26;;28152:141;;;:::o;28299:93::-;28336:6;28383:2;28378;28371:5;28367:14;28363:23;28353:33;;28299:93;;;:::o;28398:107::-;28442:8;28492:5;28486:4;28482:16;28461:37;;28398:107;;;;:::o;28511:393::-;28580:6;28630:1;28618:10;28614:18;28653:97;28683:66;28672:9;28653:97;:::i;:::-;28771:39;28801:8;28790:9;28771:39;:::i;:::-;28759:51;;28843:4;28839:9;28832:5;28828:21;28819:30;;28892:4;28882:8;28878:19;28871:5;28868:30;28858:40;;28587:317;;28511:393;;;;;:::o;28910:60::-;28938:3;28959:5;28952:12;;28910:60;;;:::o;28976:142::-;29026:9;29059:53;29077:34;29086:24;29104:5;29086:24;:::i;:::-;29077:34;:::i;:::-;29059:53;:::i;:::-;29046:66;;28976:142;;;:::o;29124:75::-;29167:3;29188:5;29181:12;;29124:75;;;:::o;29205:269::-;29315:39;29346:7;29315:39;:::i;:::-;29376:91;29425:41;29449:16;29425:41;:::i;:::-;29417:6;29410:4;29404:11;29376:91;:::i;:::-;29370:4;29363:105;29281:193;29205:269;;;:::o;29480:73::-;29525:3;29480:73;:::o;29559:189::-;29636:32;;:::i;:::-;29677:65;29735:6;29727;29721:4;29677:65;:::i;:::-;29612:136;29559:189;;:::o;29754:186::-;29814:120;29831:3;29824:5;29821:14;29814:120;;;29885:39;29922:1;29915:5;29885:39;:::i;:::-;29858:1;29851:5;29847:13;29838:22;;29814:120;;;29754:186;;:::o;29946:543::-;30047:2;30042:3;30039:11;30036:446;;;30081:38;30113:5;30081:38;:::i;:::-;30165:29;30183:10;30165:29;:::i;:::-;30155:8;30151:44;30348:2;30336:10;30333:18;30330:49;;;30369:8;30354:23;;30330:49;30392:80;30448:22;30466:3;30448:22;:::i;:::-;30438:8;30434:37;30421:11;30392:80;:::i;:::-;30051:431;;30036:446;29946:543;;;:::o;30495:117::-;30549:8;30599:5;30593:4;30589:16;30568:37;;30495:117;;;;:::o;30618:169::-;30662:6;30695:51;30743:1;30739:6;30731:5;30728:1;30724:13;30695:51;:::i;:::-;30691:56;30776:4;30770;30766:15;30756:25;;30669:118;30618:169;;;;:::o;30792:295::-;30868:4;31014:29;31039:3;31033:4;31014:29;:::i;:::-;31006:37;;31076:3;31073:1;31069:11;31063:4;31060:21;31052:29;;30792:295;;;;:::o;31092:1395::-;31209:37;31242:3;31209:37;:::i;:::-;31311:18;31303:6;31300:30;31297:56;;;31333:18;;:::i;:::-;31297:56;31377:38;31409:4;31403:11;31377:38;:::i;:::-;31462:67;31522:6;31514;31508:4;31462:67;:::i;:::-;31556:1;31580:4;31567:17;;31612:2;31604:6;31601:14;31629:1;31624:618;;;;32286:1;32303:6;32300:77;;;32352:9;32347:3;32343:19;32337:26;32328:35;;32300:77;32403:67;32463:6;32456:5;32403:67;:::i;:::-;32397:4;32390:81;32259:222;31594:887;;31624:618;31676:4;31672:9;31664:6;31660:22;31710:37;31742:4;31710:37;:::i;:::-;31769:1;31783:208;31797:7;31794:1;31791:14;31783:208;;;31876:9;31871:3;31867:19;31861:26;31853:6;31846:42;31927:1;31919:6;31915:14;31905:24;;31974:2;31963:9;31959:18;31946:31;;31820:4;31817:1;31813:12;31808:17;;31783:208;;;32019:6;32010:7;32007:19;32004:179;;;32077:9;32072:3;32068:19;32062:26;32120:48;32162:4;32154:6;32150:17;32139:9;32120:48;:::i;:::-;32112:6;32105:64;32027:156;32004:179;32229:1;32225;32217:6;32213:14;32209:22;32203:4;32196:36;31631:611;;;31594:887;;31184:1303;;;31092:1395;;:::o;32493:170::-;32633:22;32629:1;32621:6;32617:14;32610:46;32493:170;:::o;32669:366::-;32811:3;32832:67;32896:2;32891:3;32832:67;:::i;:::-;32825:74;;32908:93;32997:3;32908:93;:::i;:::-;33026:2;33021:3;33017:12;33010:19;;32669:366;;;:::o;33041:419::-;33207:4;33245:2;33234:9;33230:18;33222:26;;33294:9;33288:4;33284:20;33280:1;33269:9;33265:17;33258:47;33322:131;33448:4;33322:131;:::i;:::-;33314:139;;33041:419;;;:::o;33466:166::-;33606:18;33602:1;33594:6;33590:14;33583:42;33466:166;:::o;33638:366::-;33780:3;33801:67;33865:2;33860:3;33801:67;:::i;:::-;33794:74;;33877:93;33966:3;33877:93;:::i;:::-;33995:2;33990:3;33986:12;33979:19;;33638:366;;;:::o;34010:419::-;34176:4;34214:2;34203:9;34199:18;34191:26;;34263:9;34257:4;34253:20;34249:1;34238:9;34234:17;34227:47;34291:131;34417:4;34291:131;:::i;:::-;34283:139;;34010:419;;;:::o;34435:166::-;34575:18;34571:1;34563:6;34559:14;34552:42;34435:166;:::o;34607:366::-;34749:3;34770:67;34834:2;34829:3;34770:67;:::i;:::-;34763:74;;34846:93;34935:3;34846:93;:::i;:::-;34964:2;34959:3;34955:12;34948:19;;34607:366;;;:::o;34979:419::-;35145:4;35183:2;35172:9;35168:18;35160:26;;35232:9;35226:4;35222:20;35218:1;35207:9;35203:17;35196:47;35260:131;35386:4;35260:131;:::i;:::-;35252:139;;34979:419;;;:::o;35404:169::-;35544:21;35540:1;35532:6;35528:14;35521:45;35404:169;:::o;35579:366::-;35721:3;35742:67;35806:2;35801:3;35742:67;:::i;:::-;35735:74;;35818:93;35907:3;35818:93;:::i;:::-;35936:2;35931:3;35927:12;35920:19;;35579:366;;;:::o;35951:419::-;36117:4;36155:2;36144:9;36140:18;36132:26;;36204:9;36198:4;36194:20;36190:1;36179:9;36175:17;36168:47;36232:131;36358:4;36232:131;:::i;:::-;36224:139;;35951:419;;;:::o;36376:171::-;36516:23;36512:1;36504:6;36500:14;36493:47;36376:171;:::o;36553:366::-;36695:3;36716:67;36780:2;36775:3;36716:67;:::i;:::-;36709:74;;36792:93;36881:3;36792:93;:::i;:::-;36910:2;36905:3;36901:12;36894:19;;36553:366;;;:::o;36925:419::-;37091:4;37129:2;37118:9;37114:18;37106:26;;37178:9;37172:4;37168:20;37164:1;37153:9;37149:17;37142:47;37206:131;37332:4;37206:131;:::i;:::-;37198:139;;36925:419;;;:::o;37350:77::-;37387:7;37416:5;37405:16;;37350:77;;;:::o;37433:79::-;37472:7;37501:5;37490:16;;37433:79;;;:::o;37518:157::-;37623:45;37643:24;37661:5;37643:24;:::i;:::-;37623:45;:::i;:::-;37618:3;37611:58;37518:157;;:::o;37681:148::-;37783:11;37820:3;37805:18;;37681:148;;;;:::o;37835:153::-;37975:5;37971:1;37963:6;37959:14;37952:29;37835:153;:::o;37994:400::-;38154:3;38175:84;38257:1;38252:3;38175:84;:::i;:::-;38168:91;;38268:93;38357:3;38268:93;:::i;:::-;38386:1;38381:3;38377:11;38370:18;;37994:400;;;:::o;38400:79::-;38439:7;38468:5;38457:16;;38400:79;;;:::o;38485:157::-;38590:45;38610:24;38628:5;38610:24;:::i;:::-;38590:45;:::i;:::-;38585:3;38578:58;38485:157;;:::o;38648:94::-;38681:8;38729:5;38725:2;38721:14;38700:35;;38648:94;;;:::o;38748:::-;38787:7;38816:20;38830:5;38816:20;:::i;:::-;38805:31;;38748:94;;;:::o;38848:100::-;38887:7;38916:26;38936:5;38916:26;:::i;:::-;38905:37;;38848:100;;;:::o;38954:157::-;39059:45;39079:24;39097:5;39079:24;:::i;:::-;39059:45;:::i;:::-;39054:3;39047:58;38954:157;;:::o;39117:804::-;39386:3;39401:75;39472:3;39463:6;39401:75;:::i;:::-;39501:2;39496:3;39492:12;39485:19;;39521:148;39665:3;39521:148;:::i;:::-;39514:155;;39679:75;39750:3;39741:6;39679:75;:::i;:::-;39779:2;39774:3;39770:12;39763:19;;39792:75;39863:3;39854:6;39792:75;:::i;:::-;39892:2;39887:3;39883:12;39876:19;;39912:3;39905:10;;39117:804;;;;;;:::o;39927:180::-;39975:77;39972:1;39965:88;40072:4;40069:1;40062:15;40096:4;40093:1;40086:15;40113:176;40145:1;40162:20;40180:1;40162:20;:::i;:::-;40157:25;;40196:20;40214:1;40196:20;:::i;:::-;40191:25;;40235:1;40225:35;;40240:18;;:::i;:::-;40225:35;40281:1;40278;40274:9;40269:14;;40113:176;;;;:::o;40295:442::-;40444:4;40482:2;40471:9;40467:18;40459:26;;40495:71;40563:1;40552:9;40548:17;40539:6;40495:71;:::i;:::-;40576:72;40644:2;40633:9;40629:18;40620:6;40576:72;:::i;:::-;40658;40726:2;40715:9;40711:18;40702:6;40658:72;:::i;:::-;40295:442;;;;;;:::o;40743:169::-;40883:21;40879:1;40871:6;40867:14;40860:45;40743:169;:::o;40918:366::-;41060:3;41081:67;41145:2;41140:3;41081:67;:::i;:::-;41074:74;;41157:93;41246:3;41157:93;:::i;:::-;41275:2;41270:3;41266:12;41259:19;;40918:366;;;:::o;41290:419::-;41456:4;41494:2;41483:9;41479:18;41471:26;;41543:9;41537:4;41533:20;41529:1;41518:9;41514:17;41507:47;41571:131;41697:4;41571:131;:::i;:::-;41563:139;;41290:419;;;:::o;41715:170::-;41855:22;41851:1;41843:6;41839:14;41832:46;41715:170;:::o;41891:366::-;42033:3;42054:67;42118:2;42113:3;42054:67;:::i;:::-;42047:74;;42130:93;42219:3;42130:93;:::i;:::-;42248:2;42243:3;42239:12;42232:19;;41891:366;;;:::o;42263:419::-;42429:4;42467:2;42456:9;42452:18;42444:26;;42516:9;42510:4;42506:20;42502:1;42491:9;42487:17;42480:47;42544:131;42670:4;42544:131;:::i;:::-;42536:139;;42263:419;;;:::o;42688:172::-;42828:24;42824:1;42816:6;42812:14;42805:48;42688:172;:::o;42866:366::-;43008:3;43029:67;43093:2;43088:3;43029:67;:::i;:::-;43022:74;;43105:93;43194:3;43105:93;:::i;:::-;43223:2;43218:3;43214:12;43207:19;;42866:366;;;:::o;43238:419::-;43404:4;43442:2;43431:9;43427:18;43419:26;;43491:9;43485:4;43481:20;43477:1;43466:9;43462:17;43455:47;43519:131;43645:4;43519:131;:::i;:::-;43511:139;;43238:419;;;:::o;43663:165::-;43803:17;43799:1;43791:6;43787:14;43780:41;43663:165;:::o;43834:366::-;43976:3;43997:67;44061:2;44056:3;43997:67;:::i;:::-;43990:74;;44073:93;44162:3;44073:93;:::i;:::-;44191:2;44186:3;44182:12;44175:19;;43834:366;;;:::o;44206:419::-;44372:4;44410:2;44399:9;44395:18;44387:26;;44459:9;44453:4;44449:20;44445:1;44434:9;44430:17;44423:47;44487:131;44613:4;44487:131;:::i;:::-;44479:139;;44206:419;;;:::o;44631:170::-;44771:22;44767:1;44759:6;44755:14;44748:46;44631:170;:::o;44807:366::-;44949:3;44970:67;45034:2;45029:3;44970:67;:::i;:::-;44963:74;;45046:93;45135:3;45046:93;:::i;:::-;45164:2;45159:3;45155:12;45148:19;;44807:366;;;:::o;45179:419::-;45345:4;45383:2;45372:9;45368:18;45360:26;;45432:9;45426:4;45422:20;45418:1;45407:9;45403:17;45396:47;45460:131;45586:4;45460:131;:::i;:::-;45452:139;;45179:419;;;:::o;45604:160::-;45744:12;45740:1;45732:6;45728:14;45721:36;45604:160;:::o;45770:366::-;45912:3;45933:67;45997:2;45992:3;45933:67;:::i;:::-;45926:74;;46009:93;46098:3;46009:93;:::i;:::-;46127:2;46122:3;46118:12;46111:19;;45770:366;;;:::o;46142:419::-;46308:4;46346:2;46335:9;46331:18;46323:26;;46395:9;46389:4;46385:20;46381:1;46370:9;46366:17;46359:47;46423:131;46549:4;46423:131;:::i;:::-;46415:139;;46142:419;;;:::o;46567:173::-;46707:25;46703:1;46695:6;46691:14;46684:49;46567:173;:::o;46746:366::-;46888:3;46909:67;46973:2;46968:3;46909:67;:::i;:::-;46902:74;;46985:93;47074:3;46985:93;:::i;:::-;47103:2;47098:3;47094:12;47087:19;;46746:366;;;:::o;47118:419::-;47284:4;47322:2;47311:9;47307:18;47299:26;;47371:9;47365:4;47361:20;47357:1;47346:9;47342:17;47335:47;47399:131;47525:4;47399:131;:::i;:::-;47391:139;;47118:419;;;:::o;47543:169::-;47683:21;47679:1;47671:6;47667:14;47660:45;47543:169;:::o;47718:366::-;47860:3;47881:67;47945:2;47940:3;47881:67;:::i;:::-;47874:74;;47957:93;48046:3;47957:93;:::i;:::-;48075:2;48070:3;48066:12;48059:19;;47718:366;;;:::o;48090:419::-;48256:4;48294:2;48283:9;48279:18;48271:26;;48343:9;48337:4;48333:20;48329:1;48318:9;48314:17;48307:47;48371:131;48497:4;48371:131;:::i;:::-;48363:139;;48090:419;;;:::o;48515:169::-;48655:21;48651:1;48643:6;48639:14;48632:45;48515:169;:::o;48690:366::-;48832:3;48853:67;48917:2;48912:3;48853:67;:::i;:::-;48846:74;;48929:93;49018:3;48929:93;:::i;:::-;49047:2;49042:3;49038:12;49031:19;;48690:366;;;:::o;49062:419::-;49228:4;49266:2;49255:9;49251:18;49243:26;;49315:9;49309:4;49305:20;49301:1;49290:9;49286:17;49279:47;49343:131;49469:4;49343:131;:::i;:::-;49335:139;;49062:419;;;:::o;49487:169::-;49627:21;49623:1;49615:6;49611:14;49604:45;49487:169;:::o;49662:366::-;49804:3;49825:67;49889:2;49884:3;49825:67;:::i;:::-;49818:74;;49901:93;49990:3;49901:93;:::i;:::-;50019:2;50014:3;50010:12;50003:19;;49662:366;;;:::o;50034:419::-;50200:4;50238:2;50227:9;50223:18;50215:26;;50287:9;50281:4;50277:20;50273:1;50262:9;50258:17;50251:47;50315:131;50441:4;50315:131;:::i;:::-;50307:139;;50034:419;;;:::o;50459:222::-;50599:34;50595:1;50587:6;50583:14;50576:58;50668:5;50663:2;50655:6;50651:15;50644:30;50459:222;:::o;50687:366::-;50829:3;50850:67;50914:2;50909:3;50850:67;:::i;:::-;50843:74;;50926:93;51015:3;50926:93;:::i;:::-;51044:2;51039:3;51035:12;51028:19;;50687:366;;;:::o;51059:419::-;51225:4;51263:2;51252:9;51248:18;51240:26;;51312:9;51306:4;51302:20;51298:1;51287:9;51283:17;51276:47;51340:131;51466:4;51340:131;:::i;:::-;51332:139;;51059:419;;;:::o
Swarm Source
ipfs://48353081f990c78e61268822fbaeac406bac0a823a459d8d32e06a22bfcc1b23
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.