ETH Price: $3,804.20 (+6.46%)

Token

ERC-20: ShatteredEon (Pirates Migrated)
 

Overview

Max Total Supply

0 Pirates Migrated

Holders

252

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
gcl.eth
Balance
0 Pirates Migrated
0x0c9687139460eed026cfe31704e5ebc149d2449a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Pirates

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 2000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : Pirates.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/Pausable.sol";
import "./ERC721.sol";
import "./interfaces/IPirates.sol";
import "./interfaces/ITPirates.sol";
import "./interfaces/IHPirates.sol";
import "./interfaces/IOrbitalBlockade.sol";
import "./interfaces/IRandomizer.sol";
import "./interfaces/IEON.sol";

contract Pirates is IPirates, ERC721, Pausable {
    struct LastWrite {
        uint64 time;
        uint64 blockNum;
    }

    event PirateNamed(uint256 indexed tokenId, string newName);
    event PirateMinted(uint256 indexed tokenId);
    event PirateStolen(uint256 indexed tokenId);

    // tally of the number of pirates that have been minted
    uint16 public override piratesMinted;

    // an arbatrary counter to dish out IDs
    uint16 public override minted;
    //
    uint256 public migrated;

    // toggle naming
    bool public namingActive;

    // number of max pirates that can exist with the total minted to keep a 10:1 ratio

    uint256 public constant MAX_PIRATES = 6000;

    // cost to name
    uint256 public constant costToName = 2000 ether; //2000 EON

    // mapping from tokenId to a struct containing the colonist token's traits
    mapping(uint256 => Pirate) public tokenTraitsPirate;

    // mapping from tokenId to a stuct containing the honors pirates
    mapping(uint256 => HPirates) public tokenTraitsHonors;
    mapping(uint256 => bool) public isHonors;

    // mapping from hashed(tokenTrait) to the tokenId it's associated with
    // used to ensure there are no duplicates
    mapping(uint256 => uint256) public existingCombinations;

    // Mapping from token ID to name
    mapping(uint256 => string) private _tokenName;

    mapping(uint256 => bool) private _hasName;

    // Mapping if certain name string has already been reserved
    mapping(string => bool) private _nameReserved;

    // Tracks the last block and timestamp that a caller has written to state.
    // Disallow some access to functions if they occur while a change is being written.
    mapping(address => LastWrite) private lastWriteAddress;
    mapping(uint256 => LastWrite) private lastWriteToken;

    // list of probabilities for each trait type
    uint8[][9] public rarities;
    uint8[][9] public aliases;

    // reference to the orbital for transfers without approval
    IOrbitalBlockade public orbital;

    // reference to Traits
    ITPirates public traits;

    // reference to honors traits
    IHPirates public honorTraits;

    //reference to Randomizer
    IRandomizer public randomizer;

    //referenve to EON
    IEON public EON;

    //reference to the original pirates contract
    IPirates public originalPirates;

    address public auth;

    // address => used in allowing system communication between contracts
    mapping(address => bool) private admins;

    // Imperial Guild Treasury
    address private imperialGuildTreasury;

    /**
     * instantiates contract and rarity tables
     */
    constructor() ERC721("ShatteredEon", "Pirates Migrated") {
        minted = 151;
        piratesMinted = 151;
        _pause();
        
        auth = msg.sender;
        admins[msg.sender] = true;

        //PIRATES
        //sky
        rarities[0] = [200, 200, 200, 200, 200, 255];
        aliases[0] = [1, 2, 0, 4, 3, 5];
        //cockpit
        rarities[1] = [255];
        aliases[1] = [0];
        //base
        rarities[2] = [
            255,
            255,
            255,
            255,
            200,
            200,
            200,
            200,
            40,
            40,
            40,
            40,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255
        ];
        aliases[2] = [
            16,
            17,
            18,
            19,
            7,
            6,
            5,
            4,
            3,
            2,
            1,
            0,
            16,
            17,
            18,
            19,
            0,
            1,
            2,
            3
        ];
        //engine
        rarities[3] = [
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            100,
            100,
            100,
            100,
            255,
            255,
            255,
            255,
            40,
            40,
            40,
            40
        ];
        aliases[3] = [
            8,
            9,
            10,
            11,
            12,
            13,
            14,
            15,
            15,
            14,
            13,
            12,
            7,
            6,
            5,
            4,
            8,
            9,
            10,
            11
        ];
        //nose
        rarities[4] = [
            255,
            255,
            255,
            255,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            120,
            120,
            120,
            120,
            40,
            40,
            40,
            40
        ];
        aliases[4] = [
            0,
            1,
            2,
            3,
            15,
            14,
            13,
            12,
            11,
            10,
            9,
            8,
            3,
            2,
            1,
            0,
            12,
            13,
            14,
            15
        ];
        //wing
        rarities[5] = [
            120,
            120,
            120,
            120,
            40,
            40,
            40,
            40,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            255,
            255,
            255,
            255
        ];
        aliases[5] = [
            19,
            18,
            17,
            16,
            3,
            2,
            1,
            0,
            0,
            1,
            2,
            3,
            19,
            18,
            17,
            16,
            15,
            14,
            13,
            12
        ];
        //weapon1
        rarities[6] = [255, 150, 220, 220, 120, 30];
        aliases[6] = [0, 0, 0, 0, 0, 0];
        //weapon2
        rarities[7] = [255, 150, 30, 100, 20, 200];
        aliases[7] = [0, 0, 0, 0, 0, 0];
        //rank
        rarities[8] = [12, 160, 73, 255];
        aliases[8] = [2, 3, 3, 3];
    }

    modifier requireContractsSet() {
        require(
            address(traits) != address(0) &&
                address(orbital) != address(0) &&
                address(randomizer) != address(0)
        );
        _;
    }

      modifier blockIfChangingAddress() {
        require(admins[msg.sender] || lastWriteAddress[tx.origin].blockNum < block.number, "Your trying the cheat");
        _;
    }

     modifier blockIfChangingToken(uint256 tokenId) {
        require(admins[msg.sender] || lastWriteToken[tokenId].blockNum < block.number, "Your trying the cheat");
        _;
    }


    modifier onlyOwner() {
        require(msg.sender == auth);
        _;
    }

    function setContracts(
        address _traits,
        address _honorTraits,
        address _orbital,
        address _rand,
        address _eon,
        address _originalPirates
    ) external onlyOwner {
        traits = ITPirates(_traits);
        honorTraits = IHPirates(_honorTraits);
        orbital = IOrbitalBlockade(_orbital);
        randomizer = IRandomizer(_rand);
        EON = IEON(_eon);
        originalPirates = IPirates(_originalPirates);
    }

    /*///////////////////////////////////////////////////////////////
                    EXTERNAL
    //////////////////////////////////////////////////////////////*/

    function _mintPirate(address recipient, uint256 seed)
        external
        override
        whenNotPaused
    {
        require(admins[msg.sender], "Only Admins");
        require(piratesMinted + 1 <= MAX_PIRATES, "Pirate forces are full");
        minted++;
        piratesMinted++;
        generatePirate(minted, seed);
        if (tx.origin != recipient && recipient != address(orbital)) {
            // Stolen!
            emit PirateStolen(minted);
        }
        _mint(recipient, minted);
    }

    function _mintHonors(address recipient, uint8 id)
        external
        whenNotPaused
        onlyOwner
    {
        require(minted + 1 <= MAX_PIRATES, "All Pirates Minted");
        minted++;
        piratesMinted++;
        generateHonors(minted, id);
        _mint(recipient, minted);
    }

    /**
     * Burn a token - any game logic should be handled before this function.
     */
    function burn(uint256 tokenId) external override whenNotPaused {
        require(admins[msg.sender]);
        require(ownerOf[tokenId] == tx.origin, "not owner");
        _burn(tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IPirates) {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");
        // allow admin contracts to send without approval
        if (!admins[msg.sender]) {
            require(
                msg.sender == from ||
                    msg.sender == getApproved[id] ||
                    isApprovedForAll[from][msg.sender],
                "NOT_AUTHORIZED"
            );
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function generatePirate(uint256 tokenId, uint256 seed)
        internal
        returns (Pirate memory p)
    {
        p = selectPiTraits(seed);
        if (existingCombinations[structToHashPi(p)] == 0) {
            tokenTraitsPirate[tokenId] = p;
            existingCombinations[structToHashPi(p)] = tokenId;
            emit PirateMinted(tokenId);
            return p;
        }
        return generatePirate(tokenId, randomizer.random(seed));
    }

    function generateHonors(uint256 tokenId, uint8 id)
        internal
        returns (HPirates memory r)
    {
        r.Legendary = id;
        tokenTraitsHonors[minted] = r;
        isHonors[minted] = true;
        emit PirateMinted(tokenId);
        return r;
    }

    /**
     * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup
     * ensuring O(1) instead of O(n) reduces mint cost by more than 50%
     * probability & alias tables are generated off-chain beforehand
     * @param seed portion of the 256 bit seed to remove trait correlation
     * @param traitType the trait type to select a trait for
     * @return the ID of the randomly selected trait
     */
    function selectTrait(uint16 seed, uint8 traitType)
        internal
        view
        returns (uint8)
    {
        uint8 trait = uint8(seed) % uint8(rarities[traitType].length);
        // If a selected random trait probability is selected (biased coin) return that trait
        if (seed >> 8 < rarities[traitType][trait]) return trait;
        return aliases[traitType][trait];
    }

    function selectPiTraits(uint256 seed)
        internal
        view
        returns (Pirate memory p)
    {
        p.isPirate = true;
        seed >>= 16;
        p.sky = selectTrait(uint16(seed & 0xFFFF), 0);
        seed >>= 16;
        p.cockpit = selectTrait(uint16(seed & 0xFFFF), 1);
        seed >>= 16;
        p.base = selectTrait(uint16(seed & 0xFFFF), 2);
        seed >>= 16;
        p.engine = selectTrait(uint16(seed & 0xFFFF), 3);
        seed >>= 16;
        p.nose = selectTrait(uint16(seed & 0xFFFF), 4);
        seed >>= 16;
        p.wing = selectTrait(uint16(seed & 0xFFFF), 5);
        seed >>= 16;
        p.weapon1 = selectTrait(uint16(seed & 0xFFFF), 6);
        seed >>= 16;
        p.weapon2 = selectTrait(uint16(seed & 0xFFFF), 7);
        seed >>= 16;
        p.rank = selectTrait(uint16(seed & 0xFFFF), 8);
    }

    function structToHashPi(Pirate memory q) internal pure returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        q.sky,
                        q.cockpit,
                        q.base,
                        q.engine,
                        q.nose,
                        q.wing,
                        q.weapon1,
                        q.weapon2,
                        q.rank
                    )
                )
            );
    }

        
    function updateOriginAccess(uint16[] memory tokenIds) external override {
        require(admins[_msgSender()], "Only admins can call this");
        uint64 blockNum = uint64(block.number);
        uint64 time = uint64(block.timestamp);
        lastWriteAddress[tx.origin] = LastWrite(time, blockNum);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            lastWriteToken[tokenIds[i]] = LastWrite(time, blockNum);
        }
    }

    function tokenNameByIndex(uint256 index)
        public
        view
        returns (string memory)
    {
        return _tokenName[index];
    }

    function isNameReserved(string memory nameString)
        public
        view
        returns (bool)
    {
        return _nameReserved[toLower(nameString)];
    }

    function hasBeenNamed(uint256 tokenId) public view returns (bool) {
        return _hasName[tokenId];
    }

    function namePirate(uint256 tokenId, string memory newName) public {
        require(namingActive == true, "naming not yet availanle");
        require(ownerOf[tokenId] == msg.sender, "Not your pirate to name");
        require(hasBeenNamed(tokenId) == false, "Pirate already named");
        require(validateName(newName) == true, "Not a valid name");
        require(isNameReserved(newName) == false, "Name already reserved");

        //   IERC20(_eonAddress).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);

        toggleReserveName(newName, true);
        toggleHasName(tokenId, true);
        _tokenName[tokenId] = newName;
        EON.burn(msg.sender, costToName);
        emit PirateNamed(tokenId, newName);
    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[toLower(str)] = isReserve;
    }

    function toggleHasName(uint256 tokenId, bool hasName) internal {
        _hasName[tokenId] = hasName;
    }

    /**
     * @dev Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
     */
    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 1) return false;
        if (b.length > 25) return false; // Cannot be longer than 25 characters
        if (b[0] == 0x20) return false; // Leading space
        if (b[b.length - 1] == 0x20) return false; // Trailing space

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];

            if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            ) return false;

            lastChar = char;
        }

        return true;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

      /**
   * creates identical tokens in the new contract
   * and burns any original tokens
   * @param tokenIds the ids of the tokens to migrate
   */
  function migrate(uint16[] calldata tokenIds) external whenNotPaused {
    for (uint16 i = 0; i < tokenIds.length; i++) {
      require(originalPirates.isOwner(tokenIds[i]) == msg.sender, "THIEF!");
       tokenTraitsPirate[tokenIds[i]] = originalPirates.getTokenTraitsPirate(tokenIds[i]);
      originalPirates.burn(tokenIds[i]);
      _mint(address(orbital), tokenIds[i]);
      migrated++;
    }
    orbital.addPiratesToCrew(msg.sender, tokenIds); 

  }

    /**
     * enables owner to pause / unpause minting
     */
    function setPaused(bool _paused) external requireContractsSet onlyOwner {
        if (_paused) _pause();
        else _unpause();
    }

    function getBalance(address tokenOwner)
        public
        view
        returns (uint256)
        
    {
        //Prevent chencking balance in the same block it's being modified..
        require(
            admins[msg.sender] ||
                lastWriteAddress[tokenOwner].blockNum < block.number,
            "no checking balance in the same block it's being modified"
        );
        return balanceOf[tokenOwner];
    }

      function getTokenWriteBlock(uint256 tokenId) external view override returns(uint64) {
        require(
            admins[msg.sender], 
            "Only admins can call this"
            );
        return lastWriteToken[tokenId].blockNum;
    }

    /**
     * enables an address to mint / burn
     * @param addr the address to enable
     */
    function addAdmin(address addr) external onlyOwner {
        admins[addr] = true;
    }

    /**
     * disables an address from minting / burning
     * @param addr the address to disbale
     */
    function removeAdmin(address addr) external onlyOwner {
        admins[addr] = false;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        auth = newOwner;
    }

    function toggleNameing(bool _namingActive) external onlyOwner {
        namingActive = _namingActive;
    }

    function setImperialGuildTreasury(address _imperialTreasury)
        external
        onlyOwner
    {
        imperialGuildTreasury = _imperialTreasury;
    }

    /** Traits */

    function getTokenTraitsPirate(uint256 tokenId)
        external
        view
        override
        blockIfChangingAddress blockIfChangingToken (tokenId) 
        returns (Pirate memory)
    {
        return tokenTraitsPirate[tokenId];
    }

    function getTokenTraitsHonors(uint256 tokenId) 
        external
        view
        override
        returns (HPirates memory)
    {
        return tokenTraitsHonors[tokenId];
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        blockIfChangingAddress blockIfChangingToken (tokenId) 
        returns (string memory)
    {
        if (isHonors[tokenId]) {
            return honorTraits.tokenURI(tokenId);
        }
        return traits.tokenURI(tokenId);
    }

    function isOwner(uint256 tokenId) blockIfChangingToken(tokenId) public view returns (address) {
        address addr = ownerOf[tokenId];
        return addr;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IPirates) blockIfChangingToken(id) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public override(ERC721, IPirates) blockIfChangingToken(id) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    // For OpenSeas
    function owner() public view virtual returns (address) {
        return auth;
    }
    }

File 2 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 3 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 4 of 10 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) internal balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(
            msg.sender == owner || isApprovedForAll[owner][msg.sender],
            "NOT_AUTHORIZED"
        );

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from ||
                msg.sender == getApproved[id] ||
                isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 10 : IEON.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IEON {
    function mint(address to, uint256 amount) external;

    function burn(address from, uint256 amount) external;

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

File 6 of 10 : IHPirates.sol
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface IHPirates {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 7 of 10 : IOrbitalBlockade.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IOrbitalBlockade {
    function addPiratesToCrew(address account, uint16[] calldata tokenIds)
        external;
    
    function claimPiratesFromCrew(address account, uint16[] calldata tokenIds, bool unstake)
        external;

    function payPirateTax(uint256 amount) external;

    function randomPirateOwner(uint256 seed) external view returns (address);
}

File 8 of 10 : IPirates.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IPirates {
    // struct to store each Colonist's traits
    struct Pirate {
        bool isPirate;
        uint8 sky;
        uint8 cockpit;
        uint8 base;
        uint8 engine;
        uint8 nose;
        uint8 wing;
        uint8 weapon1;
        uint8 weapon2;
        uint8 rank;
    }

    struct HPirates {
        uint8 Legendary;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external;

    function minted() external returns (uint16);

    function piratesMinted() external returns (uint16);

    function isOwner(uint256 tokenId)
        external
        view
        returns (address);

    function _mintPirate(address recipient, uint256 seed) external;

    function burn(uint256 tokenId) external;

    function getTokenTraitsPirate(uint256 tokenId)
        external
        view
        returns (Pirate memory);

    function getTokenTraitsHonors(uint256 tokenId)
        external
        view
        returns (HPirates memory);

    function tokenNameByIndex(uint256 index)
        external
        view
        returns (string memory);
    
    function isHonors(uint256 tokenId)
        external
        view
        returns (bool);

    function updateOriginAccess(uint16[] memory tokenIds) external;

    function getTokenWriteBlock(uint256 tokenId) 
    external 
    view  
    returns(uint64);

    function hasBeenNamed(uint256 tokenId) external view returns (bool);

    function namePirate(uint256 tokenId, string memory newName) external;
}

File 9 of 10 : IRandomizer.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IRandomizer {
    function random(uint256) external returns (uint256);
}

File 10 of 10 : ITPirates.sol
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface ITPirates {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "inliner": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "yul": true,
      "yulDetails": {
        "optimizerSteps": "dhfoDgvulfnTUtnIf",
        "stackAllocation": true
      }
    },
    "runs": 2000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"PirateMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"PirateNamed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"PirateStolen","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"EON","outputs":[{"internalType":"contract IEON","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PIRATES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint8","name":"id","type":"uint8"}],"name":"_mintHonors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"_mintPirate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costToName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsHonors","outputs":[{"components":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"internalType":"struct IPirates.HPirates","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsPirate","outputs":[{"components":[{"internalType":"bool","name":"isPirate","type":"bool"},{"internalType":"uint8","name":"sky","type":"uint8"},{"internalType":"uint8","name":"cockpit","type":"uint8"},{"internalType":"uint8","name":"base","type":"uint8"},{"internalType":"uint8","name":"engine","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"wing","type":"uint8"},{"internalType":"uint8","name":"weapon1","type":"uint8"},{"internalType":"uint8","name":"weapon2","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"}],"internalType":"struct IPirates.Pirate","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenWriteBlock","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasBeenNamed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honorTraits","outputs":[{"internalType":"contract IHPirates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isHonors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"namePirate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"namingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orbital","outputs":[{"internalType":"contract IOrbitalBlockade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalPirates","outputs":[{"internalType":"contract IPirates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piratesMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_honorTraits","type":"address"},{"internalType":"address","name":"_orbital","type":"address"},{"internalType":"address","name":"_rand","type":"address"},{"internalType":"address","name":"_eon","type":"address"},{"internalType":"address","name":"_originalPirates","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_imperialTreasury","type":"address"}],"name":"setImperialGuildTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"_namingActive","type":"bool"}],"name":"toggleNameing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsHonors","outputs":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsPirate","outputs":[{"internalType":"bool","name":"isPirate","type":"bool"},{"internalType":"uint8","name":"sky","type":"uint8"},{"internalType":"uint8","name":"cockpit","type":"uint8"},{"internalType":"uint8","name":"base","type":"uint8"},{"internalType":"uint8","name":"engine","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"wing","type":"uint8"},{"internalType":"uint8","name":"weapon1","type":"uint8"},{"internalType":"uint8","name":"weapon2","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITPirates","name":"","type":"address"}],"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"updateOriginAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600c81526b29b430ba3a32b932b222b7b760a11b60208083019182528351808501909452601084526f141a5c985d195cc8135a59dc985d195960821b9084015281519192916200006e9160009162000954565b5080516200008490600190602084019062000954565b50506006805464ffffffffff1916639700970017905550620000a5620008d6565b602a80546001600160a01b031916339081179091556000908152602b6020908152604091829020805460ff19166001179055815160c08101835260c880825291810182905291820181905260608201819052608082015260ff60a082015262000113906012906006620009e3565b506040805160c08101825260018152600260208201526000918101919091526004606082015260036080820152600560a08201526200015790601b906006620009e3565b50604080516020810190915260ff815262000177906013906001620009e3565b506040805160208101909152600081526200019790601c906001620009e3565b50604080516102808101825260ff808252602082018190529181018290526060810182905260c86080820181905260a0820181905260c0820181905260e08201526028610100820181905261012082018190526101408201819052610160820152609661018082018190526101a082018190526101c082018190526101e0820152610200810182905261022081018290526102408101829052610260810191909152620002489060149081620009e3565b5060408051610280810182526010808252601160208301819052601293830184905260136060840181905260076080850152600660a0850152600560c0850152600460e0850152600361010085018190526002610120860181905260016101408701819052600061016088018190526101808801969096526101a08701949094526101c08601969096526101e0850191909152610200840192909252610220830152610240820183905261026082015290601b906200030c929101906014620009e3565b506040805161028081018252609680825260208201819052918101829052606081019190915260ff6080820181905260a0820181905260c0820181905260e08201819052606461010083018190526101208301819052610140830181905261016083015261018082018190526101a082018190526101c082018190526101e08201526028610200820181905261022082018190526102408201819052610260820152620003be906015906014620009e3565b5060408051610280810182526008808252600960208301819052600a938301849052600b60608401819052600c60808501819052600d60a08601819052600e60c08701819052600f60e08801819052610100880152610120870152610140860152610160850152600761018085015260066101a085015260056101c085015260046101e08501526102008401929092526102208301526102408201929092526102608101919091526200047690601e906014620009e3565b50604080516102808101825260ff808252602082018190529181018290526060810182905260966080820181905260a0820181905260c0820181905260e0820152610100810182905261012081018290526101408101829052610160810191909152607861018082018190526101a082018190526101c082018190526101e0820152602861020082018190526102208201819052610240820181905261026082015262000528906016906014620009e3565b50604080516102808101825260008082526001602083018190526002938301849052600360608401819052600f60808501819052600e60a08601819052600d60c08701819052600c60e08801819052600b610100890152600a610120890152600961014089015260086101608901526101808801949094526101a08701979097526101c08601939093526101e0850193909352610200840152610220830193909352610240820192909252610260810191909152620005ec90601f906014620009e3565b506040805161028081018252607880825260208201819052918101829052606081019190915260286080820181905260a0820181905260c0820181905260e0820152609661010082018190526101208201819052610140820181905261016082015260ff61018082018190526101a082018190526101c082018190526101e082018190526102008201819052610220820181905261024082018190526102608201526200069e906017906014620009e3565b5060408051610280810182526013808252601260208084018290526011948401859052601060608501819052600360808601819052600260a08701819052600160c08801819052600060e089018190526101008901526101208801526101408701526101608601526101808501939093526101a08401919091526101c08301939093526101e0820152600f610200820152600e610220820152600d610240820152600c6102608201526200075591906014620009e3565b506040805160c08101825260ff81526096602082015260dc918101829052606081019190915260786080820152601e60a082015262000799906018906006620009e3565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152620007dc906021906006620009e3565b506040805160c08101825260ff815260966020820152601e91810191909152606460608201526014608082015260c860a082015262000820906019906006620009e3565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915262000863906022906006620009e3565b5060408051608081018252600c815260a0602082015260499181019190915260ff60608201526200089990601a906004620009e3565b5060408051608081018252600281526003602082018190529181018290526060810191909152620008cf906023906004620009e3565b5062000b4c565b60065460ff1615620009055760405162461bcd60e51b8152600401620008fc9062000a9d565b60405180910390fd5b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200093b3390565b6040516200094a919062000af5565b60405180910390a1565b828054620009629062000b1b565b90600052602060002090601f016020900481019282620009865760008555620009d1565b82601f10620009a157805160ff1916838001178555620009d1565b82800160010185558215620009d1579182015b82811115620009d1578251825591602001919060010190620009b4565b50620009df92915062000a86565b5090565b82805482825590600052602060002090601f01602090048101928215620009d15791602002820160005b8382111562000a4d57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000a0d565b801562000a7c5782816101000a81549060ff021916905560010160208160000104928301926001030262000a4d565b5050620009df9291505b5b80821115620009df576000815560010162000a87565b6020808252810162000acc81601081526f14185d5cd8589b194e881c185d5cd95960821b602082015260400190565b92915050565b60006001600160a01b03821662000acc565b62000aef8162000ad2565b82525050565b6020810162000acc828462000ae4565b634e487b7160e01b600052602260045260246000fd5b60028104600182168062000b3057607f821691505b6020821081141562000b465762000b4662000b05565b50919050565b6145488062000b5c6000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370480275116101d3578063b88d4fde11610104578063e985e9c5116100a2578063eed4b34c1161007c578063eed4b34c146108e4578063f10fb584146108f7578063f2fde38b1461090a578063f8b2cb4f1461091d57600080fd5b8063e985e9c51461088d578063ebd17368146108bb578063edca3f17146108db57600080fd5b8063ddcbd86b116100de578063ddcbd86b146107a3578063de9375f214610844578063e1fc334f14610857578063e60738691461086a57600080fd5b8063b88d4fde1461075a578063c87b56dd1461076d578063d41d416d1461078057600080fd5b806395d89b4111610171578063a1b8f3741161014b578063a1b8f374146106cd578063a22cb465146106ed578063b07ba6a714610700578063b6a719531461074757600080fd5b806395d89b411461069f5780639e1bd408146106a75780639ffdb65a146106ba57600080fd5b806383c79d43116101ad57806383c79d43146106485780638da5cb5b146106585780638f58e7a8146106695780639416b4231461068c57600080fd5b8063704802751461060f57806370c124cc1461062257806375ab9b761461063557600080fd5b80632463a55a116102ad57806342966c681161024b5780635c975abb116102255780635c975abb146105b55780636352211e146105c05780636ca865ba146105e95780636d522418146105fc57600080fd5b806342966c681461058057806347486c75146105935780634f02c420146105a057600080fd5b806335ca838b1161028757806335ca838b14610534578063368383911461054757806339c7639c1461055a57806342842e0e1461056d57600080fd5b80632463a55a146104eb5780632c678c64146104fe57806333df4b2c1461051457600080fd5b806315b56d101161031a5780631785f53c116102f45780631785f53c1461049257806318d21284146104a55780631a2fbc7c146104c557806323b872dd146104d857600080fd5b806315b56d101461044c578063165272311461045f57806316c38b3c1461047f57600080fd5b806306fdde031161035657806306fdde03146103db578063081812fc146103f0578063095ea7b3146104265780631509f2941461043957600080fd5b806301ffc9a71461037d57806302815835146103a6578063046b07aa146103bb575b600080fd5b61039061038b3660046130e3565b610930565b60405161039d9190613116565b60405180910390f35b6103b96103b4366004613137565b610a15565b005b6006546103ce90610100900461ffff1681565b60405161039d9190613162565b6103e3610a3f565b60405161039d91906131ce565b6104196103fe3660046131f0565b6004602052600090815260409020546001600160a01b031681565b60405161039d919061322b565b6103b961043436600461324d565b610acd565b6103b961044736600461328a565b610ba4565b61039061045a36600461339e565b610bea565b602454610472906001600160a01b031681565b60405161039d919061341b565b6103b961048d366004613137565b610c1d565b6103b96104a036600461328a565b610c90565b6104b86104b33660046131f0565b610cc8565b60405161039d91906134f2565b6103b96104d3366004613501565b610e8e565b6103b96104e636600461354f565b611069565b6103b96104f936600461359f565b6111f2565b61050760075481565b60405161039d919061362f565b61052761052236600461363d565b611285565b60405161039d919061365f565b6103b9610542366004613723565b6112cb565b61052761055536600461363d565b611437565b6104196105683660046131f0565b611447565b6103b961057b36600461354f565b6114bf565b6103b961058e3660046131f0565b611605565b6008546103909060ff1681565b6006546103ce906301000000900461ffff1681565b60065460ff16610390565b6104196105ce3660046131f0565b6003602052600090815260409020546001600160a01b031681565b602854610472906001600160a01b031681565b6103e361060a3660046131f0565b611683565b6103b961061d36600461328a565b611725565b6103b961063036600461324d565b611760565b602654610472906001600160a01b031681565b610507686c6b935b8bbd40000081565b602a546001600160a01b0316610419565b6103906106773660046131f0565b6000908152600e602052604090205460ff1690565b6103e361069a36600461339e565b6118fb565b6103e3611a8e565b6103b96106b53660046137b0565b611a9b565b6103906106c836600461339e565b611f15565b6105076106db3660046131f0565b600c6020526000908152604090205481565b6103b96106fb3660046137f8565b6121cc565b61073a61070e3660046131f0565b6040805160208082018352600091829052928152600a835281902081519283019091525460ff16815290565b60405161039d9190613837565b6103b9610755366004613859565b61223b565b6103b961076836600461388c565b612356565b6103e361077b3660046131f0565b6124a5565b61052761078e3660046131f0565b600a6020526000908152604090205460ff1681565b61082e6107b13660046131f0565b60096020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691600160401b820481169169010000000000000000009004168a565b60405161039d9a9998979695949392919061390b565b602a54610419906001600160a01b031681565b602554610472906001600160a01b031681565b6103906108783660046131f0565b600b6020526000908152604090205460ff1681565b61039061089b3660046139a0565b600560209081526000928352604080842090915290825290205460ff1681565b6108ce6108c93660046131f0565b61269e565b60405161039d91906139e3565b61050761177081565b602954610472906001600160a01b031681565b602754610472906001600160a01b031681565b6103b961091836600461328a565b6126f1565b61050761092b36600461328a565b612737565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109c357507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a0f57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602a546001600160a01b03163314610a2c57600080fd5b6008805460ff1916911515919091179055565b60008054610a4c90613a07565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613a07565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610b1657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b3b5760405162461bcd60e51b8152600401610b3290613a62565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602a546001600160a01b03163314610bbb57600080fd5b602c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600f610bf7836118fb565b604051610c049190613a94565b9081526040519081900360200190205460ff1692915050565b6025546001600160a01b031615801590610c4157506024546001600160a01b031615155b8015610c5757506027546001600160a01b031615155b610c6057600080fd5b602a546001600160a01b03163314610c7757600080fd5b8015610c8857610c856127b6565b50565b610c85612825565b602a546001600160a01b03163314610ca757600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19169055565b604080516101408101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301829052338252602b9052919091205460ff1680610d5357503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b610d6f5760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680610dae575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b610dca5760405162461bcd60e51b8152600401610b3290613ad0565b600083815260096020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152600160401b8104841692820192909252690100000000000000000090910490911661012082015291505b50919050565b60085460ff161515600114610eb55760405162461bcd60e51b8152600401610b3290613b12565b6000828152600360205260409020546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610b3290613b54565b6000828152600e602052604090205460ff1615610f1a5760405162461bcd60e51b8152600401610b3290613b96565b610f2381611f15565b1515600114610f445760405162461bcd60e51b8152600401610b3290613bd8565b610f4d81610bea565b15610f6a5760405162461bcd60e51b8152600401610b3290613c1a565b610f75816001612878565b6000828152600e60209081526040808320805460ff19166001179055600d82529091208251610fa692840190613010565b506028546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690639dc29fac90610ffb903390686c6b935b8bbd40000090600401613c2a565b600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b50505050817ff82afa02631c3ed951c54b199dcaaa44d042ba6804e1e1dc55d4f3998b5c6e768260405161105d91906131ce565b60405180910390a25050565b6000818152600360205260409020546001600160a01b038481169116146110a25760405162461bcd60e51b8152600401610b3290613c77565b6001600160a01b0382166110c85760405162461bcd60e51b8152600401610b3290613cb9565b336000908152602b602052604090205460ff1661115657336001600160a01b038416148061110c57506000818152600460205260409020546001600160a01b031633145b8061113a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b6111565760405162461bcd60e51b8152600401610b3290613a62565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602a546001600160a01b0316331461120957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0398891617909155602680548216968816969096179095556024805486169487169490941790935560278054851692861692909217909155602880548416918516919091179055602980549092169216919091179055565b6012826009811061129557600080fd5b0181815481106112a457600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b336000908152602b602052604090205460ff166112fa5760405162461bcd60e51b8152600401610b3290613cfb565b60408051808201825267ffffffffffffffff42818116835243828116602080860191825232600090815260109091529586209451855491518516600160401b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921694169390931792909217909255915b83518110156114315760405180604001604052808367ffffffffffffffff1681526020018467ffffffffffffffff16815250601160008684815181106113b5576113b5613d0b565b60209081029190910181015161ffff1682528181019290925260400160002082518154939092015167ffffffffffffffff908116600160401b027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169216919091179190911790558061142981613d37565b91505061136d565b50505050565b601b826009811061129557600080fd5b336000908152602b6020526040812054829060ff1680611486575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6114a25760405162461bcd60e51b8152600401610b3290613ad0565b50506000908152600360205260409020546001600160a01b031690565b336000908152602b6020526040902054819060ff16806114fe575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61151a5760405162461bcd60e51b8152600401610b3290613ad0565b611525848484611069565b6001600160a01b0383163b15806115e957506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a029061158290339089908890600401613d52565b6020604051808303816000875af11580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6114315760405162461bcd60e51b8152600401610b3290613df2565b60065460ff16156116285760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff1661164457600080fd5b6000818152600360205260409020546001600160a01b0316321461167a5760405162461bcd60e51b8152600401610b3290613e76565b610c85816128b5565b6000818152600d602052604090208054606091906116a090613a07565b80601f01602080910402602001604051908101604052809291908181526020018280546116cc90613a07565b80156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050919050565b602a546001600160a01b0316331461173c57600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19166001179055565b60065460ff16156117835760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff166117b25760405162461bcd60e51b8152600401610b3290613eb8565b600654611770906117cd90610100900461ffff166001613ec8565b61ffff1611156117ef5760405162461bcd60e51b8152600401610b3290613f23565b600680546301000000900461ffff1690600361180a83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161183e83613f33565b91906101000a81548161ffff021916908361ffff16021790555050611877600660039054906101000a900461ffff1661ffff1682612972565b50326001600160a01b0383161480159061189f57506024546001600160a01b03838116911614155b156118de57600654604051630100000090910461ffff16907fc5ba9b981116d2c5dee43379fd5b23fb0248800776ae0f450bdd57f81e898a4490600090a25b6006546118f79083906301000000900461ffff16612c10565b5050565b606060008290506000815167ffffffffffffffff81111561191e5761191e6132ab565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b50905060005b8251811015611a8657604183828151811061196b5761196b613d0b565b016020015160f81c1080159061199b5750605a83828151811061199057611990613d0b565b016020015160f81c11155b15611a15578281815181106119b2576119b2613d0b565b602001015160f81c60f81b60f81c60206119cc9190613f4e565b60f81b8282815181106119e1576119e1613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a74565b828181518110611a2757611a27613d0b565b602001015160f81c60f81b828281518110611a4457611a44613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80611a7e81613d37565b91505061194e565b509392505050565b60018054610a4c90613a07565b60065460ff1615611abe5760405162461bcd60e51b8152600401610b3290613e34565b60005b61ffff8116821115611e915760295433906001600160a01b03166339c7639c858561ffff8616818110611af657611af6613d0b565b9050602002016020810190611b0b9190613f6f565b6040518263ffffffff1660e01b8152600401611b279190613fa9565b602060405180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613fc2565b6001600160a01b031614611b8e5760405162461bcd60e51b8152600401610b3290614015565b6029546001600160a01b03166318d21284848461ffff8516818110611bb557611bb5613d0b565b9050602002016020810190611bca9190613f6f565b6040518263ffffffff1660e01b8152600401611be69190613fa9565b61014060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190614118565b6009600085858561ffff16818110611c4257611c42613d0b565b9050602002016020810190611c579190613f6f565b61ffff908116825260208083019390935260409182016000208451815494860151938601516060870151608088015160a089015160c08a015160e08b0151610100808d0151610120909d015161ffff19909c1697151561ff0019169790971760ff9a8b169097029690961763ffff0000191662010000958a169590950263ff0000001916949094176301000000938916939093029290921765ffff0000000019166401000000009188169190910265ff000000000019161765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9584169590950269ff00000000000000000019169490941769010000000000000000009290931691909102919091179091556029546001600160a01b0316906342966c6890859085908516818110611dc157611dc1613d0b565b9050602002016020810190611dd69190613f6f565b6040518263ffffffff1660e01b8152600401611df29190613fa9565b600060405180830381600087803b158015611e0c57600080fd5b505af1158015611e20573d6000803e3d6000fd5b5050602454611e6992506001600160a01b03169050848461ffff8516818110611e4b57611e4b613d0b565b9050602002016020810190611e609190613f6f565b61ffff16612c10565b60078054906000611e7983613d37565b91905055508080611e8990613f33565b915050611ac1565b506024546040517fa36410330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a364103390611edf903390869086906004016141a3565b600060405180830381600087803b158015611ef957600080fd5b505af1158015611f0d573d6000803e3d6000fd5b505050505050565b600080829050600181511015611f2e5750600092915050565b601981511115611f415750600092915050565b80600081518110611f5457611f54613d0b565b6020910101516001600160f81b031916600160fd1b1415611f785750600092915050565b8060018251611f8791906141c4565b81518110611f9757611f97613d0b565b6020910101516001600160f81b031916600160fd1b1415611fbb5750600092915050565b600081600081518110611fd057611fd0613d0b565b01602001516001600160f81b031916905060005b82518110156121c157600083828151811061200157612001613d0b565b01602001516001600160f81b0319169050600160fd1b811480156120325750600160fd1b6001600160f81b03198416145b156120435750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906120a757507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561211557507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061211357507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561218257507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061218057507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561219c5750600160fd1b6001600160f81b0319821614155b156121ad5750600095945050505050565b9150806121b981613d37565b915050611fe4565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061222f908590613116565b60405180910390a35050565b60065460ff161561225e5760405162461bcd60e51b8152600401610b3290613e34565b602a546001600160a01b0316331461227557600080fd5b60065461177090612292906301000000900461ffff166001613ec8565b61ffff1611156122b45760405162461bcd60e51b8152600401610b329061420d565b600680546301000000900461ffff169060036122cf83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161230383613f33565b91906101000a81548161ffff021916908361ffff1602179055505061233c600660039054906101000a900461ffff1661ffff1682612ce3565b506006546118f79083906301000000900461ffff16612c10565b336000908152602b6020526040902054829060ff1680612395575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6123b15760405162461bcd60e51b8152600401610b3290613ad0565b6123bc858585611069565b6001600160a01b0384163b158061248257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a029061241b9033908a908990899060040161421d565b6020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e9190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61249e5760405162461bcd60e51b8152600401610b3290613df2565b5050505050565b336000908152602b602052604090205460609060ff16806124e657503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b6125025760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680612541575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61255d5760405162461bcd60e51b8152600401610b3290613ad0565b6000838152600b602052604090205460ff1615612609576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd906125bd90869060040161362f565b600060405180830381865afa1580156125da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261260291908101906142b9565b9150610e88565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd9061265290869060040161362f565b600060405180830381865afa15801561266f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261269791908101906142b9565b9392505050565b336000908152602b602052604081205460ff166126cd5760405162461bcd60e51b8152600401610b3290613cfb565b50600090815260116020526040902054600160401b900467ffffffffffffffff1690565b602a546001600160a01b0316331461270857600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336000908152602b602052604081205460ff168061277e57506001600160a01b03821660009081526010602052604090205443600160401b90910467ffffffffffffffff16105b61279a5760405162461bcd60e51b8152600401610b32906142f4565b506001600160a01b031660009081526002602052604090205490565b60065460ff16156127d95760405162461bcd60e51b8152600401610b3290613e34565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861280e3390565b60405161281b919061322b565b60405180910390a1565b60065460ff166128475760405162461bcd60e51b8152600401610b3290614387565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361280e565b80600f612884846118fb565b6040516128919190613a94565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000818152600360205260409020546001600160a01b0316806128ea5760405162461bcd60e51b8152600401610b32906143c9565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526129cc82612d6d565b9050600c60006129db83612ed4565b81526020019081526020016000205460001415612b795760008381526009602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e015161ffff19909c1698151561ff0019169890981760ff9a8b169091021763ffff0000191662010000968a169690960263ff0000001916959095176301000000948916949094029390931765ffff0000000019166401000000009288169290920265ff000000000019169190911765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9184169190910269ff000000000000000000191617690100000000000000000092909316919091029190911790558390600c90612b3584612ed4565b815260200190815260200160002081905550827fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb975860405160405180910390a2610a0f565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526126979185916001600160a01b039091169063b863bd3790612bc890879060040161362f565b6020604051808303816000875af1158015612be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0b91906143e4565b612972565b6001600160a01b038216612c365760405162461bcd60e51b8152600401610b3290613cb9565b6000818152600360205260409020546001600160a01b031615612c6b5760405162461bcd60e51b8152600401610b3290614437565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526006805461ffff63010000009182900481166000908152600a865287812087518154961660ff19968716179055925491909104168152600b909252838220805490911660011790559151909184917fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb97589190a292915050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c9190612dd59061ffff841690612f34565b60ff16602082015260109190911c90612df361ffff83166001612f34565b60ff16604082015260109190911c90612e1161ffff83166002612f34565b60ff16606082015260109190911c90612e2f61ffff83166003612f34565b60ff16608082015260109190911c90612e4d61ffff83166004612f34565b60ff1660a082015260109190911c90612e6b61ffff83166005612f34565b60ff1660c082015260109190911c90612e8961ffff83166006612f34565b60ff1660e082015260109190911c90612ea761ffff83166007612f34565b60ff1661010082015260109190911c90612ec661ffff83166008612f34565b60ff16610120820152919050565b6020808201516040808401516060850151608086015160a087015160c088015160e08901516101008a01516101208b0151975160009a612f169a99910161445f565b60408051601f19818403018152919052805160209091012092915050565b60008060128360ff1660098110612f4d57612f4d613d0b565b0154612f5990856144f7565b905060128360ff1660098110612f7157612f71613d0b565b018160ff1681548110612f8657612f86613d0b565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612fbc579050610a0f565b601b8360ff1660098110612fd257612fd2613d0b565b018160ff1681548110612fe757612fe7613d0b565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805461301c90613a07565b90600052602060002090601f01602090048101928261303e5760008555613084565b82601f1061305757805160ff1916838001178555613084565b82800160010185558215613084579182015b82811115613084578251825591602001919060010190613069565b50613090929150613094565b5090565b5b808211156130905760008155600101613095565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610c8557600080fd5b8035610a0f816130a9565b6000602082840312156130f8576130f8600080fd5b600061310484846130d8565b949350505050565b8015155b82525050565b60208101610a0f828461310c565b8015156130cd565b8035610a0f81613124565b60006020828403121561314c5761314c600080fd5b6000613104848461312c565b61ffff8116613110565b60208101610a0f8284613158565b60005b8381101561318b578181015183820152602001613173565b838111156114315750506000910152565b60006131a6825190565b8084526020840193506131bd818560208601613170565b601f01601f19169290920192915050565b60208082528101612697818461319c565b806130cd565b8035610a0f816131df565b60006020828403121561320557613205600080fd5b600061310484846131e5565b60006001600160a01b038216610a0f565b61311081613211565b60208101610a0f8284613222565b6130cd81613211565b8035610a0f81613239565b6000806040838503121561326357613263600080fd5b600061326f8585613242565b9250506020613280858286016131e5565b9150509250929050565b60006020828403121561329f5761329f600080fd5b60006131048484613242565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156132e7576132e76132ab565b6040525050565b60006132f960405190565b905061330582826132c1565b919050565b600067ffffffffffffffff821115613324576133246132ab565b601f19601f83011660200192915050565b82818337506000910152565b600061335461334f8461330a565b6132ee565b90508281526020810184848401111561336f5761336f600080fd5b611a86848285613335565b600082601f83011261338e5761338e600080fd5b8135613104848260208601613341565b6000602082840312156133b3576133b3600080fd5b813567ffffffffffffffff8111156133cd576133cd600080fd5b6131048482850161337a565b6000610a0f6001600160a01b0383166133f0565b90565b6001600160a01b031690565b6000610a0f826133d9565b6000610a0f826133fc565b61311081613407565b60208101610a0f8284613412565b60ff8116613110565b805161343e838261310c565b5060208101516134516020840182613429565b5060408101516134646040840182613429565b5060608101516134776060840182613429565b50608081015161348a6080840182613429565b5060a081015161349d60a0840182613429565b5060c08101516134b060c0840182613429565b5060e08101516134c360e0840182613429565b506101008101516134d8610100840182613429565b506101208101516134ed610120840182613429565b505050565b6101408101610a0f8284613432565b6000806040838503121561351757613517600080fd5b600061352385856131e5565b925050602083013567ffffffffffffffff81111561354357613543600080fd5b6132808582860161337a565b60008060006060848603121561356757613567600080fd5b60006135738686613242565b935050602061358486828701613242565b9250506040613595868287016131e5565b9150509250925092565b60008060008060008060c087890312156135bb576135bb600080fd5b60006135c78989613242565b96505060206135d889828a01613242565b95505060406135e989828a01613242565b94505060606135fa89828a01613242565b935050608061360b89828a01613242565b92505060a061361c89828a01613242565b9150509295509295509295565b80613110565b60208101610a0f8284613629565b6000806040838503121561365357613653600080fd5b600061326f85856131e5565b60208101610a0f8284613429565b600067ffffffffffffffff821115613687576136876132ab565b5060209081020190565b61ffff81166130cd565b8035610a0f81613691565b60006136b461334f8461366d565b838152905060208082019084028301858111156136d3576136d3600080fd5b835b818110156136f5576136e7878261369b565b8352602092830192016136d5565b5050509392505050565b600082601f83011261371357613713600080fd5b81356131048482602086016136a6565b60006020828403121561373857613738600080fd5b813567ffffffffffffffff81111561375257613752600080fd5b613104848285016136ff565b60008083601f84011261377357613773600080fd5b50813567ffffffffffffffff81111561378e5761378e600080fd5b6020830191508360208202830111156137a9576137a9600080fd5b9250929050565b600080602083850312156137c6576137c6600080fd5b823567ffffffffffffffff8111156137e0576137e0600080fd5b6137ec8582860161375e565b92509250509250929050565b6000806040838503121561380e5761380e600080fd5b600061381a8585613242565b92505060206132808582860161312c565b80516134ed8382613429565b60208101610a0f828461382b565b60ff81166130cd565b8035610a0f81613845565b6000806040838503121561386f5761386f600080fd5b600061387b8585613242565b92505060206132808582860161384e565b600080600080608085870312156138a5576138a5600080fd5b60006138b18787613242565b94505060206138c287828801613242565b93505060406138d3878288016131e5565b925050606085013567ffffffffffffffff8111156138f3576138f3600080fd5b6138ff8782880161337a565b91505092959194509250565b610140810161391a828d61310c565b613927602083018c613429565b613934604083018b613429565b613941606083018a613429565b61394e6080830189613429565b61395b60a0830188613429565b61396860c0830187613429565b61397560e0830186613429565b613983610100830185613429565b613991610120830184613429565b9b9a5050505050505050505050565b600080604083850312156139b6576139b6600080fd5b60006139c28585613242565b925050602061328085828601613242565b67ffffffffffffffff8116613110565b60208101610a0f82846139d3565b634e487b7160e01b600052602260045260246000fd5b600281046001821680613a1b57607f821691505b60208210811415610e8857610e886139f1565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610a0f81613a2e565b6000613a7c825190565b613a8a818560208601613170565b9290920192915050565b610a0f8183613a72565b60158152602081017f596f757220747279696e6720746865206368656174000000000000000000000081529050613a5c565b60208082528101610a0f81613a9e565b60188152602081017f6e616d696e67206e6f742079657420617661696c616e6c65000000000000000081529050613a5c565b60208082528101610a0f81613ae0565b60178152602081017f4e6f7420796f75722070697261746520746f206e616d6500000000000000000081529050613a5c565b60208082528101610a0f81613b22565b60148152602081017f50697261746520616c7265616479206e616d656400000000000000000000000081529050613a5c565b60208082528101610a0f81613b64565b60108152602081017f4e6f7420612076616c6964206e616d650000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613ba6565b60158152602081017f4e616d6520616c7265616479207265736572766564000000000000000000000081529050613a5c565b60208082528101610a0f81613be8565b60408101613c388285613222565b6126976020830184613629565b600a8152602081017f57524f4e475f46524f4d0000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c45565b60118152602081017f494e56414c49445f524543495049454e5400000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c87565b60198152602081017f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000081529050613a5c565b60208082528101610a0f81613cc9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d4b57613d4b613d21565b5060010190565b60808101613d608286613222565b613d6d6020830185613222565b613d7a6040830184613629565b818103606083015260008152602081015b95945050505050565b8051610a0f816130a9565b600060208284031215613db457613db4600080fd5b60006131048484613d94565b60108152602081017f554e534146455f524543495049454e540000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613dc0565b60108152602081017f5061757361626c653a207061757365640000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e02565b60098152602081017f6e6f74206f776e6572000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e44565b600b8152602081017f4f6e6c792041646d696e7300000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e86565b61ffff8116905061ffff8216915060008261ffff03821115613eec57613eec613d21565b500190565b60168152602081017f50697261746520666f72636573206172652066756c6c0000000000000000000081529050613a5c565b60208082528101610a0f81613ef1565b61ffff81169050600061ffff821415613d4b57613d4b613d21565b60ff8116905060ff8216915060008260ff03821115613eec57613eec613d21565b600060208284031215613f8457613f84600080fd5b6000613104848461369b565b6000610a0f6133ed61ffff841681565b61311081613f90565b60208101610a0f8284613fa0565b8051610a0f81613239565b600060208284031215613fd757613fd7600080fd5b60006131048484613fb7565b60068152602081017f544849454621000000000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613fe3565b8051610a0f81613124565b8051610a0f81613845565b6000610140828403121561405157614051600080fd5b61405c6101406132ee565b9050600061406a8484614025565b90820152602061407c84848301614030565b90820152604061408e84848301614030565b9082015260606140a084848301614030565b9082015260806140b284848301614030565b9082015260a06140c484848301614030565b9082015260c06140d684848301614030565b9082015260e06140e884848301614030565b908201526101006140fb84848301614030565b9082015261012061410e84848301614030565b9082015292915050565b6000610140828403121561412e5761412e600080fd5b6000613104848461403b565b6141448282613158565b5060200190565b506000610a0f602083018361369b565b8183526020830192506000818060005b858110156141985761417d828461414b565b614187888261413a565b97505060208201915060010161416b565b509495945050505050565b604081016141b18286613222565b8181036020830152613d8b81848661415b565b6000828210156141d6576141d6613d21565b500390565b60128152602081017f416c6c2050697261746573204d696e746564000000000000000000000000000081529050613a5c565b60208082528101610a0f816141db565b6080810161422b8287613222565b6142386020830186613222565b6142456040830185613629565b8181036060830152614257818461319c565b9695505050505050565b600061426f61334f8461330a565b90508281526020810184848401111561428a5761428a600080fd5b611a86848285613170565b600082601f8301126142a9576142a9600080fd5b8151613104848260208601614261565b6000602082840312156142ce576142ce600080fd5b815167ffffffffffffffff8111156142e8576142e8600080fd5b61310484828501614295565b60208082528101610a0f81603981527f6e6f20636865636b696e672062616c616e636520696e207468652073616d652060208201527f626c6f636b2069742773206265696e67206d6f64696669656400000000000000604082015260600190565b60148152602081017f5061757361626c653a206e6f742070617573656400000000000000000000000081529050613a5c565b60208082528101610a0f81614355565b600a8152602081017f4e4f545f4d494e5445440000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614397565b8051610a0f816131df565b6000602082840312156143f9576143f9600080fd5b600061310484846143d9565b600e8152602081017f414c52454144595f4d494e54454400000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614405565b6000610a0f8260f81b90565b61311060ff8216614447565b614469818b614453565b600101614476818a614453565b6001016144838189614453565b6001016144908188614453565b60010161449d8187614453565b6001016144aa8186614453565b6001016144b78185614453565b6001016144c48184614453565b6001016144d18183614453565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff918216911660008261450d5761450d6144e1565b50069056fea2646970667358221220631276743fb4245f2baf966a5c6faa318730a8d6955b5a3d77b0cfc2d9599af064736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103785760003560e01c806370480275116101d3578063b88d4fde11610104578063e985e9c5116100a2578063eed4b34c1161007c578063eed4b34c146108e4578063f10fb584146108f7578063f2fde38b1461090a578063f8b2cb4f1461091d57600080fd5b8063e985e9c51461088d578063ebd17368146108bb578063edca3f17146108db57600080fd5b8063ddcbd86b116100de578063ddcbd86b146107a3578063de9375f214610844578063e1fc334f14610857578063e60738691461086a57600080fd5b8063b88d4fde1461075a578063c87b56dd1461076d578063d41d416d1461078057600080fd5b806395d89b4111610171578063a1b8f3741161014b578063a1b8f374146106cd578063a22cb465146106ed578063b07ba6a714610700578063b6a719531461074757600080fd5b806395d89b411461069f5780639e1bd408146106a75780639ffdb65a146106ba57600080fd5b806383c79d43116101ad57806383c79d43146106485780638da5cb5b146106585780638f58e7a8146106695780639416b4231461068c57600080fd5b8063704802751461060f57806370c124cc1461062257806375ab9b761461063557600080fd5b80632463a55a116102ad57806342966c681161024b5780635c975abb116102255780635c975abb146105b55780636352211e146105c05780636ca865ba146105e95780636d522418146105fc57600080fd5b806342966c681461058057806347486c75146105935780634f02c420146105a057600080fd5b806335ca838b1161028757806335ca838b14610534578063368383911461054757806339c7639c1461055a57806342842e0e1461056d57600080fd5b80632463a55a146104eb5780632c678c64146104fe57806333df4b2c1461051457600080fd5b806315b56d101161031a5780631785f53c116102f45780631785f53c1461049257806318d21284146104a55780631a2fbc7c146104c557806323b872dd146104d857600080fd5b806315b56d101461044c578063165272311461045f57806316c38b3c1461047f57600080fd5b806306fdde031161035657806306fdde03146103db578063081812fc146103f0578063095ea7b3146104265780631509f2941461043957600080fd5b806301ffc9a71461037d57806302815835146103a6578063046b07aa146103bb575b600080fd5b61039061038b3660046130e3565b610930565b60405161039d9190613116565b60405180910390f35b6103b96103b4366004613137565b610a15565b005b6006546103ce90610100900461ffff1681565b60405161039d9190613162565b6103e3610a3f565b60405161039d91906131ce565b6104196103fe3660046131f0565b6004602052600090815260409020546001600160a01b031681565b60405161039d919061322b565b6103b961043436600461324d565b610acd565b6103b961044736600461328a565b610ba4565b61039061045a36600461339e565b610bea565b602454610472906001600160a01b031681565b60405161039d919061341b565b6103b961048d366004613137565b610c1d565b6103b96104a036600461328a565b610c90565b6104b86104b33660046131f0565b610cc8565b60405161039d91906134f2565b6103b96104d3366004613501565b610e8e565b6103b96104e636600461354f565b611069565b6103b96104f936600461359f565b6111f2565b61050760075481565b60405161039d919061362f565b61052761052236600461363d565b611285565b60405161039d919061365f565b6103b9610542366004613723565b6112cb565b61052761055536600461363d565b611437565b6104196105683660046131f0565b611447565b6103b961057b36600461354f565b6114bf565b6103b961058e3660046131f0565b611605565b6008546103909060ff1681565b6006546103ce906301000000900461ffff1681565b60065460ff16610390565b6104196105ce3660046131f0565b6003602052600090815260409020546001600160a01b031681565b602854610472906001600160a01b031681565b6103e361060a3660046131f0565b611683565b6103b961061d36600461328a565b611725565b6103b961063036600461324d565b611760565b602654610472906001600160a01b031681565b610507686c6b935b8bbd40000081565b602a546001600160a01b0316610419565b6103906106773660046131f0565b6000908152600e602052604090205460ff1690565b6103e361069a36600461339e565b6118fb565b6103e3611a8e565b6103b96106b53660046137b0565b611a9b565b6103906106c836600461339e565b611f15565b6105076106db3660046131f0565b600c6020526000908152604090205481565b6103b96106fb3660046137f8565b6121cc565b61073a61070e3660046131f0565b6040805160208082018352600091829052928152600a835281902081519283019091525460ff16815290565b60405161039d9190613837565b6103b9610755366004613859565b61223b565b6103b961076836600461388c565b612356565b6103e361077b3660046131f0565b6124a5565b61052761078e3660046131f0565b600a6020526000908152604090205460ff1681565b61082e6107b13660046131f0565b60096020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691600160401b820481169169010000000000000000009004168a565b60405161039d9a9998979695949392919061390b565b602a54610419906001600160a01b031681565b602554610472906001600160a01b031681565b6103906108783660046131f0565b600b6020526000908152604090205460ff1681565b61039061089b3660046139a0565b600560209081526000928352604080842090915290825290205460ff1681565b6108ce6108c93660046131f0565b61269e565b60405161039d91906139e3565b61050761177081565b602954610472906001600160a01b031681565b602754610472906001600160a01b031681565b6103b961091836600461328a565b6126f1565b61050761092b36600461328a565b612737565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109c357507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a0f57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602a546001600160a01b03163314610a2c57600080fd5b6008805460ff1916911515919091179055565b60008054610a4c90613a07565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613a07565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610b1657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b3b5760405162461bcd60e51b8152600401610b3290613a62565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602a546001600160a01b03163314610bbb57600080fd5b602c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600f610bf7836118fb565b604051610c049190613a94565b9081526040519081900360200190205460ff1692915050565b6025546001600160a01b031615801590610c4157506024546001600160a01b031615155b8015610c5757506027546001600160a01b031615155b610c6057600080fd5b602a546001600160a01b03163314610c7757600080fd5b8015610c8857610c856127b6565b50565b610c85612825565b602a546001600160a01b03163314610ca757600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19169055565b604080516101408101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301829052338252602b9052919091205460ff1680610d5357503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b610d6f5760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680610dae575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b610dca5760405162461bcd60e51b8152600401610b3290613ad0565b600083815260096020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152600160401b8104841692820192909252690100000000000000000090910490911661012082015291505b50919050565b60085460ff161515600114610eb55760405162461bcd60e51b8152600401610b3290613b12565b6000828152600360205260409020546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610b3290613b54565b6000828152600e602052604090205460ff1615610f1a5760405162461bcd60e51b8152600401610b3290613b96565b610f2381611f15565b1515600114610f445760405162461bcd60e51b8152600401610b3290613bd8565b610f4d81610bea565b15610f6a5760405162461bcd60e51b8152600401610b3290613c1a565b610f75816001612878565b6000828152600e60209081526040808320805460ff19166001179055600d82529091208251610fa692840190613010565b506028546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690639dc29fac90610ffb903390686c6b935b8bbd40000090600401613c2a565b600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b50505050817ff82afa02631c3ed951c54b199dcaaa44d042ba6804e1e1dc55d4f3998b5c6e768260405161105d91906131ce565b60405180910390a25050565b6000818152600360205260409020546001600160a01b038481169116146110a25760405162461bcd60e51b8152600401610b3290613c77565b6001600160a01b0382166110c85760405162461bcd60e51b8152600401610b3290613cb9565b336000908152602b602052604090205460ff1661115657336001600160a01b038416148061110c57506000818152600460205260409020546001600160a01b031633145b8061113a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b6111565760405162461bcd60e51b8152600401610b3290613a62565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602a546001600160a01b0316331461120957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0398891617909155602680548216968816969096179095556024805486169487169490941790935560278054851692861692909217909155602880548416918516919091179055602980549092169216919091179055565b6012826009811061129557600080fd5b0181815481106112a457600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b336000908152602b602052604090205460ff166112fa5760405162461bcd60e51b8152600401610b3290613cfb565b60408051808201825267ffffffffffffffff42818116835243828116602080860191825232600090815260109091529586209451855491518516600160401b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921694169390931792909217909255915b83518110156114315760405180604001604052808367ffffffffffffffff1681526020018467ffffffffffffffff16815250601160008684815181106113b5576113b5613d0b565b60209081029190910181015161ffff1682528181019290925260400160002082518154939092015167ffffffffffffffff908116600160401b027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169216919091179190911790558061142981613d37565b91505061136d565b50505050565b601b826009811061129557600080fd5b336000908152602b6020526040812054829060ff1680611486575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6114a25760405162461bcd60e51b8152600401610b3290613ad0565b50506000908152600360205260409020546001600160a01b031690565b336000908152602b6020526040902054819060ff16806114fe575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61151a5760405162461bcd60e51b8152600401610b3290613ad0565b611525848484611069565b6001600160a01b0383163b15806115e957506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a029061158290339089908890600401613d52565b6020604051808303816000875af11580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6114315760405162461bcd60e51b8152600401610b3290613df2565b60065460ff16156116285760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff1661164457600080fd5b6000818152600360205260409020546001600160a01b0316321461167a5760405162461bcd60e51b8152600401610b3290613e76565b610c85816128b5565b6000818152600d602052604090208054606091906116a090613a07565b80601f01602080910402602001604051908101604052809291908181526020018280546116cc90613a07565b80156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050919050565b602a546001600160a01b0316331461173c57600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19166001179055565b60065460ff16156117835760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff166117b25760405162461bcd60e51b8152600401610b3290613eb8565b600654611770906117cd90610100900461ffff166001613ec8565b61ffff1611156117ef5760405162461bcd60e51b8152600401610b3290613f23565b600680546301000000900461ffff1690600361180a83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161183e83613f33565b91906101000a81548161ffff021916908361ffff16021790555050611877600660039054906101000a900461ffff1661ffff1682612972565b50326001600160a01b0383161480159061189f57506024546001600160a01b03838116911614155b156118de57600654604051630100000090910461ffff16907fc5ba9b981116d2c5dee43379fd5b23fb0248800776ae0f450bdd57f81e898a4490600090a25b6006546118f79083906301000000900461ffff16612c10565b5050565b606060008290506000815167ffffffffffffffff81111561191e5761191e6132ab565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b50905060005b8251811015611a8657604183828151811061196b5761196b613d0b565b016020015160f81c1080159061199b5750605a83828151811061199057611990613d0b565b016020015160f81c11155b15611a15578281815181106119b2576119b2613d0b565b602001015160f81c60f81b60f81c60206119cc9190613f4e565b60f81b8282815181106119e1576119e1613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a74565b828181518110611a2757611a27613d0b565b602001015160f81c60f81b828281518110611a4457611a44613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80611a7e81613d37565b91505061194e565b509392505050565b60018054610a4c90613a07565b60065460ff1615611abe5760405162461bcd60e51b8152600401610b3290613e34565b60005b61ffff8116821115611e915760295433906001600160a01b03166339c7639c858561ffff8616818110611af657611af6613d0b565b9050602002016020810190611b0b9190613f6f565b6040518263ffffffff1660e01b8152600401611b279190613fa9565b602060405180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613fc2565b6001600160a01b031614611b8e5760405162461bcd60e51b8152600401610b3290614015565b6029546001600160a01b03166318d21284848461ffff8516818110611bb557611bb5613d0b565b9050602002016020810190611bca9190613f6f565b6040518263ffffffff1660e01b8152600401611be69190613fa9565b61014060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190614118565b6009600085858561ffff16818110611c4257611c42613d0b565b9050602002016020810190611c579190613f6f565b61ffff908116825260208083019390935260409182016000208451815494860151938601516060870151608088015160a089015160c08a015160e08b0151610100808d0151610120909d015161ffff19909c1697151561ff0019169790971760ff9a8b169097029690961763ffff0000191662010000958a169590950263ff0000001916949094176301000000938916939093029290921765ffff0000000019166401000000009188169190910265ff000000000019161765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9584169590950269ff00000000000000000019169490941769010000000000000000009290931691909102919091179091556029546001600160a01b0316906342966c6890859085908516818110611dc157611dc1613d0b565b9050602002016020810190611dd69190613f6f565b6040518263ffffffff1660e01b8152600401611df29190613fa9565b600060405180830381600087803b158015611e0c57600080fd5b505af1158015611e20573d6000803e3d6000fd5b5050602454611e6992506001600160a01b03169050848461ffff8516818110611e4b57611e4b613d0b565b9050602002016020810190611e609190613f6f565b61ffff16612c10565b60078054906000611e7983613d37565b91905055508080611e8990613f33565b915050611ac1565b506024546040517fa36410330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a364103390611edf903390869086906004016141a3565b600060405180830381600087803b158015611ef957600080fd5b505af1158015611f0d573d6000803e3d6000fd5b505050505050565b600080829050600181511015611f2e5750600092915050565b601981511115611f415750600092915050565b80600081518110611f5457611f54613d0b565b6020910101516001600160f81b031916600160fd1b1415611f785750600092915050565b8060018251611f8791906141c4565b81518110611f9757611f97613d0b565b6020910101516001600160f81b031916600160fd1b1415611fbb5750600092915050565b600081600081518110611fd057611fd0613d0b565b01602001516001600160f81b031916905060005b82518110156121c157600083828151811061200157612001613d0b565b01602001516001600160f81b0319169050600160fd1b811480156120325750600160fd1b6001600160f81b03198416145b156120435750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906120a757507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561211557507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061211357507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561218257507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061218057507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561219c5750600160fd1b6001600160f81b0319821614155b156121ad5750600095945050505050565b9150806121b981613d37565b915050611fe4565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061222f908590613116565b60405180910390a35050565b60065460ff161561225e5760405162461bcd60e51b8152600401610b3290613e34565b602a546001600160a01b0316331461227557600080fd5b60065461177090612292906301000000900461ffff166001613ec8565b61ffff1611156122b45760405162461bcd60e51b8152600401610b329061420d565b600680546301000000900461ffff169060036122cf83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161230383613f33565b91906101000a81548161ffff021916908361ffff1602179055505061233c600660039054906101000a900461ffff1661ffff1682612ce3565b506006546118f79083906301000000900461ffff16612c10565b336000908152602b6020526040902054829060ff1680612395575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6123b15760405162461bcd60e51b8152600401610b3290613ad0565b6123bc858585611069565b6001600160a01b0384163b158061248257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a029061241b9033908a908990899060040161421d565b6020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e9190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61249e5760405162461bcd60e51b8152600401610b3290613df2565b5050505050565b336000908152602b602052604090205460609060ff16806124e657503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b6125025760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680612541575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61255d5760405162461bcd60e51b8152600401610b3290613ad0565b6000838152600b602052604090205460ff1615612609576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd906125bd90869060040161362f565b600060405180830381865afa1580156125da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261260291908101906142b9565b9150610e88565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd9061265290869060040161362f565b600060405180830381865afa15801561266f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261269791908101906142b9565b9392505050565b336000908152602b602052604081205460ff166126cd5760405162461bcd60e51b8152600401610b3290613cfb565b50600090815260116020526040902054600160401b900467ffffffffffffffff1690565b602a546001600160a01b0316331461270857600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336000908152602b602052604081205460ff168061277e57506001600160a01b03821660009081526010602052604090205443600160401b90910467ffffffffffffffff16105b61279a5760405162461bcd60e51b8152600401610b32906142f4565b506001600160a01b031660009081526002602052604090205490565b60065460ff16156127d95760405162461bcd60e51b8152600401610b3290613e34565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861280e3390565b60405161281b919061322b565b60405180910390a1565b60065460ff166128475760405162461bcd60e51b8152600401610b3290614387565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361280e565b80600f612884846118fb565b6040516128919190613a94565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000818152600360205260409020546001600160a01b0316806128ea5760405162461bcd60e51b8152600401610b32906143c9565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526129cc82612d6d565b9050600c60006129db83612ed4565b81526020019081526020016000205460001415612b795760008381526009602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e015161ffff19909c1698151561ff0019169890981760ff9a8b169091021763ffff0000191662010000968a169690960263ff0000001916959095176301000000948916949094029390931765ffff0000000019166401000000009288169290920265ff000000000019169190911765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9184169190910269ff000000000000000000191617690100000000000000000092909316919091029190911790558390600c90612b3584612ed4565b815260200190815260200160002081905550827fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb975860405160405180910390a2610a0f565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526126979185916001600160a01b039091169063b863bd3790612bc890879060040161362f565b6020604051808303816000875af1158015612be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0b91906143e4565b612972565b6001600160a01b038216612c365760405162461bcd60e51b8152600401610b3290613cb9565b6000818152600360205260409020546001600160a01b031615612c6b5760405162461bcd60e51b8152600401610b3290614437565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526006805461ffff63010000009182900481166000908152600a865287812087518154961660ff19968716179055925491909104168152600b909252838220805490911660011790559151909184917fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb97589190a292915050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c9190612dd59061ffff841690612f34565b60ff16602082015260109190911c90612df361ffff83166001612f34565b60ff16604082015260109190911c90612e1161ffff83166002612f34565b60ff16606082015260109190911c90612e2f61ffff83166003612f34565b60ff16608082015260109190911c90612e4d61ffff83166004612f34565b60ff1660a082015260109190911c90612e6b61ffff83166005612f34565b60ff1660c082015260109190911c90612e8961ffff83166006612f34565b60ff1660e082015260109190911c90612ea761ffff83166007612f34565b60ff1661010082015260109190911c90612ec661ffff83166008612f34565b60ff16610120820152919050565b6020808201516040808401516060850151608086015160a087015160c088015160e08901516101008a01516101208b0151975160009a612f169a99910161445f565b60408051601f19818403018152919052805160209091012092915050565b60008060128360ff1660098110612f4d57612f4d613d0b565b0154612f5990856144f7565b905060128360ff1660098110612f7157612f71613d0b565b018160ff1681548110612f8657612f86613d0b565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612fbc579050610a0f565b601b8360ff1660098110612fd257612fd2613d0b565b018160ff1681548110612fe757612fe7613d0b565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805461301c90613a07565b90600052602060002090601f01602090048101928261303e5760008555613084565b82601f1061305757805160ff1916838001178555613084565b82800160010185558215613084579182015b82811115613084578251825591602001919060010190613069565b50613090929150613094565b5090565b5b808211156130905760008155600101613095565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610c8557600080fd5b8035610a0f816130a9565b6000602082840312156130f8576130f8600080fd5b600061310484846130d8565b949350505050565b8015155b82525050565b60208101610a0f828461310c565b8015156130cd565b8035610a0f81613124565b60006020828403121561314c5761314c600080fd5b6000613104848461312c565b61ffff8116613110565b60208101610a0f8284613158565b60005b8381101561318b578181015183820152602001613173565b838111156114315750506000910152565b60006131a6825190565b8084526020840193506131bd818560208601613170565b601f01601f19169290920192915050565b60208082528101612697818461319c565b806130cd565b8035610a0f816131df565b60006020828403121561320557613205600080fd5b600061310484846131e5565b60006001600160a01b038216610a0f565b61311081613211565b60208101610a0f8284613222565b6130cd81613211565b8035610a0f81613239565b6000806040838503121561326357613263600080fd5b600061326f8585613242565b9250506020613280858286016131e5565b9150509250929050565b60006020828403121561329f5761329f600080fd5b60006131048484613242565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156132e7576132e76132ab565b6040525050565b60006132f960405190565b905061330582826132c1565b919050565b600067ffffffffffffffff821115613324576133246132ab565b601f19601f83011660200192915050565b82818337506000910152565b600061335461334f8461330a565b6132ee565b90508281526020810184848401111561336f5761336f600080fd5b611a86848285613335565b600082601f83011261338e5761338e600080fd5b8135613104848260208601613341565b6000602082840312156133b3576133b3600080fd5b813567ffffffffffffffff8111156133cd576133cd600080fd5b6131048482850161337a565b6000610a0f6001600160a01b0383166133f0565b90565b6001600160a01b031690565b6000610a0f826133d9565b6000610a0f826133fc565b61311081613407565b60208101610a0f8284613412565b60ff8116613110565b805161343e838261310c565b5060208101516134516020840182613429565b5060408101516134646040840182613429565b5060608101516134776060840182613429565b50608081015161348a6080840182613429565b5060a081015161349d60a0840182613429565b5060c08101516134b060c0840182613429565b5060e08101516134c360e0840182613429565b506101008101516134d8610100840182613429565b506101208101516134ed610120840182613429565b505050565b6101408101610a0f8284613432565b6000806040838503121561351757613517600080fd5b600061352385856131e5565b925050602083013567ffffffffffffffff81111561354357613543600080fd5b6132808582860161337a565b60008060006060848603121561356757613567600080fd5b60006135738686613242565b935050602061358486828701613242565b9250506040613595868287016131e5565b9150509250925092565b60008060008060008060c087890312156135bb576135bb600080fd5b60006135c78989613242565b96505060206135d889828a01613242565b95505060406135e989828a01613242565b94505060606135fa89828a01613242565b935050608061360b89828a01613242565b92505060a061361c89828a01613242565b9150509295509295509295565b80613110565b60208101610a0f8284613629565b6000806040838503121561365357613653600080fd5b600061326f85856131e5565b60208101610a0f8284613429565b600067ffffffffffffffff821115613687576136876132ab565b5060209081020190565b61ffff81166130cd565b8035610a0f81613691565b60006136b461334f8461366d565b838152905060208082019084028301858111156136d3576136d3600080fd5b835b818110156136f5576136e7878261369b565b8352602092830192016136d5565b5050509392505050565b600082601f83011261371357613713600080fd5b81356131048482602086016136a6565b60006020828403121561373857613738600080fd5b813567ffffffffffffffff81111561375257613752600080fd5b613104848285016136ff565b60008083601f84011261377357613773600080fd5b50813567ffffffffffffffff81111561378e5761378e600080fd5b6020830191508360208202830111156137a9576137a9600080fd5b9250929050565b600080602083850312156137c6576137c6600080fd5b823567ffffffffffffffff8111156137e0576137e0600080fd5b6137ec8582860161375e565b92509250509250929050565b6000806040838503121561380e5761380e600080fd5b600061381a8585613242565b92505060206132808582860161312c565b80516134ed8382613429565b60208101610a0f828461382b565b60ff81166130cd565b8035610a0f81613845565b6000806040838503121561386f5761386f600080fd5b600061387b8585613242565b92505060206132808582860161384e565b600080600080608085870312156138a5576138a5600080fd5b60006138b18787613242565b94505060206138c287828801613242565b93505060406138d3878288016131e5565b925050606085013567ffffffffffffffff8111156138f3576138f3600080fd5b6138ff8782880161337a565b91505092959194509250565b610140810161391a828d61310c565b613927602083018c613429565b613934604083018b613429565b613941606083018a613429565b61394e6080830189613429565b61395b60a0830188613429565b61396860c0830187613429565b61397560e0830186613429565b613983610100830185613429565b613991610120830184613429565b9b9a5050505050505050505050565b600080604083850312156139b6576139b6600080fd5b60006139c28585613242565b925050602061328085828601613242565b67ffffffffffffffff8116613110565b60208101610a0f82846139d3565b634e487b7160e01b600052602260045260246000fd5b600281046001821680613a1b57607f821691505b60208210811415610e8857610e886139f1565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610a0f81613a2e565b6000613a7c825190565b613a8a818560208601613170565b9290920192915050565b610a0f8183613a72565b60158152602081017f596f757220747279696e6720746865206368656174000000000000000000000081529050613a5c565b60208082528101610a0f81613a9e565b60188152602081017f6e616d696e67206e6f742079657420617661696c616e6c65000000000000000081529050613a5c565b60208082528101610a0f81613ae0565b60178152602081017f4e6f7420796f75722070697261746520746f206e616d6500000000000000000081529050613a5c565b60208082528101610a0f81613b22565b60148152602081017f50697261746520616c7265616479206e616d656400000000000000000000000081529050613a5c565b60208082528101610a0f81613b64565b60108152602081017f4e6f7420612076616c6964206e616d650000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613ba6565b60158152602081017f4e616d6520616c7265616479207265736572766564000000000000000000000081529050613a5c565b60208082528101610a0f81613be8565b60408101613c388285613222565b6126976020830184613629565b600a8152602081017f57524f4e475f46524f4d0000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c45565b60118152602081017f494e56414c49445f524543495049454e5400000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c87565b60198152602081017f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000081529050613a5c565b60208082528101610a0f81613cc9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d4b57613d4b613d21565b5060010190565b60808101613d608286613222565b613d6d6020830185613222565b613d7a6040830184613629565b818103606083015260008152602081015b95945050505050565b8051610a0f816130a9565b600060208284031215613db457613db4600080fd5b60006131048484613d94565b60108152602081017f554e534146455f524543495049454e540000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613dc0565b60108152602081017f5061757361626c653a207061757365640000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e02565b60098152602081017f6e6f74206f776e6572000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e44565b600b8152602081017f4f6e6c792041646d696e7300000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e86565b61ffff8116905061ffff8216915060008261ffff03821115613eec57613eec613d21565b500190565b60168152602081017f50697261746520666f72636573206172652066756c6c0000000000000000000081529050613a5c565b60208082528101610a0f81613ef1565b61ffff81169050600061ffff821415613d4b57613d4b613d21565b60ff8116905060ff8216915060008260ff03821115613eec57613eec613d21565b600060208284031215613f8457613f84600080fd5b6000613104848461369b565b6000610a0f6133ed61ffff841681565b61311081613f90565b60208101610a0f8284613fa0565b8051610a0f81613239565b600060208284031215613fd757613fd7600080fd5b60006131048484613fb7565b60068152602081017f544849454621000000000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613fe3565b8051610a0f81613124565b8051610a0f81613845565b6000610140828403121561405157614051600080fd5b61405c6101406132ee565b9050600061406a8484614025565b90820152602061407c84848301614030565b90820152604061408e84848301614030565b9082015260606140a084848301614030565b9082015260806140b284848301614030565b9082015260a06140c484848301614030565b9082015260c06140d684848301614030565b9082015260e06140e884848301614030565b908201526101006140fb84848301614030565b9082015261012061410e84848301614030565b9082015292915050565b6000610140828403121561412e5761412e600080fd5b6000613104848461403b565b6141448282613158565b5060200190565b506000610a0f602083018361369b565b8183526020830192506000818060005b858110156141985761417d828461414b565b614187888261413a565b97505060208201915060010161416b565b509495945050505050565b604081016141b18286613222565b8181036020830152613d8b81848661415b565b6000828210156141d6576141d6613d21565b500390565b60128152602081017f416c6c2050697261746573204d696e746564000000000000000000000000000081529050613a5c565b60208082528101610a0f816141db565b6080810161422b8287613222565b6142386020830186613222565b6142456040830185613629565b8181036060830152614257818461319c565b9695505050505050565b600061426f61334f8461330a565b90508281526020810184848401111561428a5761428a600080fd5b611a86848285613170565b600082601f8301126142a9576142a9600080fd5b8151613104848260208601614261565b6000602082840312156142ce576142ce600080fd5b815167ffffffffffffffff8111156142e8576142e8600080fd5b61310484828501614295565b60208082528101610a0f81603981527f6e6f20636865636b696e672062616c616e636520696e207468652073616d652060208201527f626c6f636b2069742773206265696e67206d6f64696669656400000000000000604082015260600190565b60148152602081017f5061757361626c653a206e6f742070617573656400000000000000000000000081529050613a5c565b60208082528101610a0f81614355565b600a8152602081017f4e4f545f4d494e5445440000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614397565b8051610a0f816131df565b6000602082840312156143f9576143f9600080fd5b600061310484846143d9565b600e8152602081017f414c52454144595f4d494e54454400000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614405565b6000610a0f8260f81b90565b61311060ff8216614447565b614469818b614453565b600101614476818a614453565b6001016144838189614453565b6001016144908188614453565b60010161449d8187614453565b6001016144aa8186614453565b6001016144b78185614453565b6001016144c48184614453565b6001016144d18183614453565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff918216911660008261450d5761450d6144e1565b50069056fea2646970667358221220631276743fb4245f2baf966a5c6faa318730a8d6955b5a3d77b0cfc2d9599af064736f6c634300080b0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.