ETH Price: $2,475.84 (-8.21%)

Token

Drakons (DRKNS)
 

Overview

Max Total Supply

6,237 DRKNS

Holders

677

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 DRKNS
0x583d2a5621366BD20877908357DC0924DEB1Da91
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Drakons is a strategy game where you get to collect and play elemental dragon non-fungible tokens or NFTs called DRAKONS in the Ethereum Blockchain and Polygon Network (Matic) sidechain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DragonCore

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-05
*/

// File: contracts/Ownable.sol

pragma solidity ^0.5.10;

contract Ownable {
    address public owner;


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }


    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }


    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        if (newOwner != address(0)) {
            owner = newOwner;
        }
    }

}

// File: contracts/Pausable.sol

pragma solidity ^0.5.10;


contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;


    /**
     * @dev modifier to allow actions only when the contract IS paused
     */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
     * @dev modifier to allow actions only when the contract IS NOT paused
     */
    modifier whenPaused {
        require(paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyOwner whenNotPaused returns (bool) {
        paused = true;
        emit Pause();
        return true;
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyOwner whenPaused returns (bool) {
        paused = false;
        emit Unpause();
        return true;
    }
}

// File: contracts/DragonAccessControl.sol

pragma solidity ^0.5.10;



contract DragonAccessControl {
    /// @dev Emited when contract is upgraded - See README.md for updgrade plan
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address payable public ceoAddress;
    address payable public cioAddress;
    address payable public cmoAddress;
    address payable public cooAddress;
    address payable public cfoAddress;

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    /// @dev Access modifier for CIO-only functionality
    modifier onlyCIO() {
        require(msg.sender == cioAddress);
        _;
    }

    /// @dev Access modifier for CMO-only functionality
    modifier onlyCMO() {
        require(msg.sender == cmoAddress);
        _;
    }

    /// @dev Access modifier for COO-only functionality
    modifier onlyCOO() {
        require(msg.sender == cooAddress);
        _;
    }

    /// @dev Access modifier for CFO-only functionality
    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    modifier onlyCLevel() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cioAddress ||
            msg.sender == cmoAddress ||
            msg.sender == cooAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param _newCEO The address of the new CEO
    function setCEO(address payable _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CIO. Only available to the current CEO.
    /// @param _newCIO The address of the new CIO
    function setCIO(address payable _newCIO) external onlyCEO {
        require(_newCIO != address(0));

        cioAddress = _newCIO;
    }

    /// @dev Assigns a new address to act as the CMO. Only available to the current CEO.
    /// @param _newCMO The address of the new CMO
    function setCMO(address payable _newCMO) external onlyCEO {
        require(_newCMO != address(0));

        cmoAddress = _newCMO;
    }

    /// @dev Assigns a new address to act as the COO. Only available to the current CEO.
    /// @param _newCOO The address of the new COO
    function setCOO(address payable _newCOO) external onlyCEO {
        require(_newCOO != address(0));

        cooAddress = _newCOO;
    }

    /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.
    /// @param _newCFO The address of the new CFO
    function setCFO(address payable _newCFO) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCLevel whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CIO or CMO accounts are
    ///  compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}

// File: contracts/DragonERC721.sol

pragma solidity ^0.5.10;


/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f
interface ERC721Metadata /* is IERC721Base */ {
  /// @notice A descriptive name for a collection of NFTs in this contract
  function name() external pure returns (string memory _name);

  /// @notice An abbreviated name for NFTs in this contract
  function symbol() external pure returns (string memory _symbol);

  /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
  /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
  ///  3986. The URI may point to a JSON file that conforms to the "ERC721
  ///  Metadata JSON Schema".
  function tokenURI(uint256 _tokenId) external view returns (string memory);
}

/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface ERC721Enumerable /* is ERC721 */ {
    /// @notice Count NFTs tracked by this contract
    /// @return A count of valid NFTs tracked by this contract, where each one of
    ///  them has an assigned and queryable owner not equal to the zero address
    function totalSupply() external view returns (uint256);

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256);

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

//contract DragonERC721 is IERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable {
contract DragonERC721 is ERC165, ERC721, ERC721Metadata, ERC721TokenReceiver, ERC721Enumerable {

    mapping (bytes4 => bool) internal supportedInterfaces;

    string public tokenURIPrefix = "https://www.drakons.io/server/api/dragon/metadata/";
    string public tokenURISuffix = "";

    function name() external pure returns (string memory) {
      return "Drakons";
    }

    function symbol() external pure returns (string memory) {
      return "DRKNS";
    }

    function supportsInterface(bytes4 interfaceID) external view returns (bool) {
        return supportedInterfaces[interfaceID];
    }

    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4){
        return bytes4(keccak256("onERC721Received(address,uint256,bytes)"));
    }

}

// File: contracts/ClockAuctionBase.sol

pragma solidity ^0.5.10;


contract ClockAuctionBase {

    // Represents an auction on an NFT
    struct Auction {
        // Current owner of NFT
        address payable seller;
        // Price (in wei) at beginning of auction
        uint128 startingPrice;
        // Price (in wei) at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        // NOTE: 0 if this auction has been concluded
        uint64 startedAt;
    }

    // Reference to contract tracking NFT ownership
    DragonERC721 public nonFungibleContract;

    // Cut owner takes on each auction, measured in basis points (1/100 of a percent).
    // Values 0-10,000 map to 0%-100%
    uint256 public ownerCut;

    address payable public ceoAddress;
    address payable public cfoAddress;

    modifier onlyCEOCFO() {
        require(
            msg.sender == ceoAddress ||
            msg.sender == cfoAddress
        );
        _;
    }

    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    // Map from token ID to their corresponding auction.
    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address buyer, address seller);
    event AuctionCancelled(uint256 tokenId);


    function setCEO(address payable _newCEO) external onlyCEO {
        require(_newCEO != address(0));

        ceoAddress = _newCEO;
    }

    function setCFO(address payable _newCFO) external onlyCEO {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// Throws if the escrow fails.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _owner, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(_owner, address(this), _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// Returns true if the transfer succeeds.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _receiver, uint256 _tokenId) internal {
        // it will throw if transfer fails
        //nonFungibleContract.transfer(_receiver, _tokenId);
        nonFungibleContract.transferFrom(address(this), _receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions. Also fires the
    ///  AuctionCreated event.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(uint256 _tokenId, Auction memory _auction) internal {
        // Require that all auctions have a duration of
        // at least one minute. (Keeps our math from getting hairy!)
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        //cpt added emit
        emit AuctionCreated(
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    /// Does NOT transfer ownership of token.
    function _bid(uint256 _tokenId, uint256 _bidAmount)
    internal
    returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenIdToAuction[_tokenId];

        // Explicitly check that this auction is currently live.
        // (Because of how Ethereum mappings work, we can't just count
        // on the lookup above failing. An invalid _tokenId will just
        // return an auction object that is all zeros.)
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        // Grab a reference to the seller before the auction struct
        // gets deleted.
        address payable seller = auction.seller;

        // The bid is good! Remove the auction before sending the fees
        // to the sender so we can't have a reentrancy attack.
        _removeAuction(_tokenId);

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
            // Calculate the auctioneer's cut.
            // (NOTE: _computeCut() is guaranteed to return a
            // value <= price, so this subtraction can't go negative.)
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;

            // NOTE: Doing a transfer() in the middle of a complex
            // method like this is generally discouraged because of
            // reentrancy attacks and DoS attacks if the seller is
            // a contract with an invalid fallback function. We explicitly
            // guard against reentrancy attacks by removing the auction
            // before calling transfer(), and the only thing the seller
            // can DoS is the sale of their own asset! (And if it's an
            // accident, they can call cancelAuction(). )
            seller.transfer(sellerProceeds);
        }

        // Calculate any excess funds included with the bid. If the excess
        // is anything worth worrying about, transfer it back to bidder.
        // NOTE: We checked above that the bid amount is greater than or
        // equal to the price so this cannot underflow.
        uint256 bidExcess = _bidAmount - price;

        // Return the funds. Similar to the previous transfer, this is
        // not susceptible to a re-entry attack because the auction is
        // removed before any transfers occur.
        msg.sender.transfer(bidExcess);

        // Tell the world!
        emit AuctionSuccessful(_tokenId, price, msg.sender, seller);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction storage _auction) internal view returns (bool) {
        return (_auction.startedAt > 0);
    }

    /// @dev Returns current price of an NFT on auction. Broken into two
    ///  functions (this one, that computes the duration from the auction
    ///  structure, and the other that does the price computation) so we
    ///  can easily test that the price computation works correctly.
    function _currentPrice(Auction storage _auction)
    internal
    view
    returns (uint256)
    {
        uint256 secondsPassed = 0;

        // A bit of insurance against negative values (or wraparound).
        // Probably not necessary (since Ethereum guarnatees that the
        // now variable doesn't ever go backwards).
        if (now > _auction.startedAt) {
            secondsPassed = now - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction. Factored out
    ///  from _currentPrice so we can run extensive unit tests.
    ///  When testing, make this function public and turn on
    ///  `Current price computation` test suite.
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
    internal
    pure
    returns (uint256)
    {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our public functions carefully cap the maximum values for
        //  time (at 64-bits) and currency (at 128-bits). _duration is
        //  also known to be non-zero (see the require() statement in
        //  _addAuction())
        if (_secondsPassed >= _duration) {
            // We've reached the end of the dynamic pricing portion
            // of the auction, just return the end price.
            return _endingPrice;
        } else {
            // Starting price can be higher than ending price (and often is!), so
            // this delta can be negative.
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);

            // This multiplication can't overflow, _secondsPassed will easily fit within
            // 64-bits, and totalPriceChange will easily fit within 128-bits, their product
            // will always fit within 256-bits.
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);

            // currentPriceChange can be negative, but if so, will have a magnitude
            // less that _startingPrice. Thus, this result will always end up positive.
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;

            return uint256(currentPrice);
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(uint256 _price) internal view returns (uint256) {
        // NOTE: We don't use SafeMath (or similar) in this function because
        //  all of our entry functions carefully cap the maximum values for
        //  currency (at 128-bits), and ownerCut <= 10000 (see the require()
        //  statement in the ClockAuction constructor). The result of this
        //  function is always guaranteed to be <= _price.
        return _price * ownerCut / 10000;
    }
}

// File: contracts/ClockAuction.sol

pragma solidity ^0.5.10;



contract ClockAuction is Pausable, ClockAuctionBase {

    /// @dev The ERC-165 interface signature for ERC-721.
    ///  Ref: https://github.com/ethereum/EIPs/issues/165
    ///  Ref: https://github.com/ethereum/EIPs/issues/721
    //bytes4 constant InterfaceSignature_ERC721 = bytes4(0x5b5e139f);
    bytes4 constant InterfaceSignature_ERC721 = bytes4(0x80ac58cd);

    /// @dev Constructor creates a reference to the NFT ownership contract
    ///  and verifies the owner cut is in the valid range.
    /// @param _nftAddress - address of a deployed contract implementing
    ///  the Nonfungible Interface.
    /// @param _cut - percent cut the owner takes on each auction, must be
    ///  between 0-10,000.
    constructor (address _nftAddress, uint256 _cut) public {
        require(_cut <= 10000);
        ownerCut = _cut;

        ceoAddress = msg.sender;
        cfoAddress = msg.sender;

        DragonERC721 candidateContract = DragonERC721(_nftAddress);
        //require(candidateContract.supportsInterface(InterfaceSignature_ERC721));
        nonFungibleContract = candidateContract;
    }


    /// @dev Remove all Ether from the contract, which is the owner's cuts
    ///  as well as any Ether sent directly to the contract address.
    ///  Always transfers to the NFT contract, but can be called either by
    ///  the owner or the NFT contract.
    function withdrawBalance() external {
        address payable nftAddress = address(uint160(address(nonFungibleContract)));

        require(
            msg.sender == owner ||
            msg.sender == nftAddress
        );
        // We are using this boolean method to make sure that even if one fails it will still work
        //bool res = nftAddress.send(address(this).balance);
        nftAddress.transfer(address(this).balance);
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    whenNotPaused
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(_owns(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough Ether is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(uint256 _tokenId)
    external
    payable
    whenNotPaused
    {
        // _bid will throw if the bid or funds transfer fails
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(uint256 _tokenId)
    external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        address seller = auction.seller;
        require(msg.sender == seller || msg.sender == address(nonFungibleContract));
        _cancelAuction(_tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(uint256 _tokenId)
    whenPaused
    onlyOwner
    external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        _cancelAuction(_tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(uint256 _tokenId)
    external
    view
    returns
    (
        address payable seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt
    ) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (
        auction.seller,
        auction.startingPrice,
        auction.endingPrice,
        auction.duration,
        auction.startedAt
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(uint256 _tokenId)
    external
    view
    returns (uint256)
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }
}

// File: contracts/SaleClockAuction.sol

pragma solidity ^0.5.10;


contract SaleClockAuction is ClockAuction {

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right auction in our setSaleAuctionAddress() call.
    bool public isSaleClockAuction = true;

    // Delegate constructor
    constructor(address _nftAddr, uint256 _cut) public
    ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);

        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId)
    external
    payable
    {
        // _bid verifies token ID size
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    function setOwnerCut(uint256 val) external onlyCEOCFO {
        ownerCut = val;
    }
}

// File: contracts/SiringClockAuction.sol

pragma solidity ^0.5.10;


contract SiringClockAuction is ClockAuction {

    // @dev Sanity check that allows us to ensure that we are pointing to the
    //  right auction in our setSiringAuctionAddress() call.
    bool public isSiringClockAuction = true;

    // Delegate constructor
    constructor(address _nftAddr, uint256 _cut) public
    ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction. Since this function is wrapped,
    /// require sender to be DragonCore contract.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address payable _seller
    )
    external
    {
        // Sanity check that no inputs overflow how many bits we've allocated
        // to store them in the auction struct.
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract));
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now)
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Places a bid for siring. Requires the sender
    /// is the DragonCore contract because all bid methods
    /// should be wrapped. Also returns the Dragon to the
    /// seller rather than the winner.
    function bid(uint256 _tokenId)
    external
    payable
    {
        require(msg.sender == address(nonFungibleContract));
        address seller = tokenIdToAuction[_tokenId].seller;
        // _bid checks that token ID is valid and will throw if bid fails
        _bid(_tokenId, msg.value);
        // We transfer the dragon back to the seller, the winner will get
        // the offspring
        _transfer(seller, _tokenId);
    }

    function setOwnerCut(uint256 val) external onlyCEOCFO {
        ownerCut = val;
    }

}

// File: contracts/DragonBase.sol

pragma solidity ^0.5.10;





contract DragonBase is DragonAccessControl, DragonERC721 {

    event Birth(address owner, uint256 dragonId, uint256 matronId, uint256 sireId, uint256 dna, uint32 generation, uint64 runeLevel);
    event DragonAssetsUpdated(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence);
    event DragonAssetRequest(uint256 _dragonId);
    //event Transfer(address from, address to, uint256 tokenId, uint32 generation);

    struct Dragon {
        // The Dragon's genetic code is packed into these 256-bits.
        uint256 dna;
        uint64 birthTime;
        uint64 breedTime;
        uint32 matronId;
        uint32 sireId;
        uint32 siringWithId;
        uint32 generation;
    }

    struct DragonAssets {
        uint64 runeLevel;
        uint64 agility;
        uint64 strength;
        uint64 intelligence;
    }

    Dragon[] dragons;
    mapping (uint256 => address) public dragonIndexToOwner;
    mapping (address => uint256) ownershipTokenCount;
    mapping (uint256 => address) public dragonIndexToApproved;
    mapping (uint256 => address) public sireAllowedToAddress;
    mapping (uint256 => DragonAssets) public dragonAssets;

    mapping (address => mapping (address => bool)) internal authorised;

    uint256 public updateAssetFee = 8 finney;

    SaleClockAuction public saleAuction;
    SiringClockAuction public siringAuction;

    modifier isValidToken(uint256 _tokenId) {
        require(dragonIndexToOwner[_tokenId] != address(0));
        _;
    }

    /// @dev Assigns ownership of a specific Dragon to an address.
    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        // Since the number of dragons is capped to 2^32 we can't overflow this
        // Declaration: mapping (address => uint256) ownershipTokenCount;
        ownershipTokenCount[_to]++;
        // transfer ownership
        // Declaration: mapping (uint256 => address) public dragonIndexToOwner;
        dragonIndexToOwner[_tokenId] = _to;
        // When creating new dragons _from is 0x0, but we can't account that address.
        if (_from != address(0)) {
            ownershipTokenCount[_from]--;
            // once the dragon is transferred also clear sire allowances
            delete sireAllowedToAddress[_tokenId];
            // clear any previously approved ownership exchange
            delete dragonIndexToApproved[_tokenId];
        }

        //Dragon storage dragon = dragons[_tokenId];

        // Emit the transfer event.
        emit Transfer(_from, _to, _tokenId);
    }

    /// @dev An internal method that creates a new dragon and stores it. This
    ///  method doesn't do any checking and should only be called when the
    ///  input data is known to be valid. Will generate both a Birth event
    ///  and a Transfer event.
    /// @param _matronId The dragon ID of the matron of this dragon (zero for firstGen)
    /// @param _sireId The dragon ID of the sire of this dragon (zero for firstGen)
    /// @param _generation The generation number of this dragon, must be computed by caller.
    /// @param _dna The dragon's genetic code.
    /// @param _agility The dragon's agility
    /// @param _strength The dragon's strength
    /// @param _intelligence The dragon's intelligence
    /// @param _runelevel The dragon's rune level
    /// @param _owner The inital owner of this dragon, must be non-zero (except for the mythical beast, ID 0)
    function _createDragon(
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        uint256 _dna,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint64 _runelevel,
        address _owner
    )
    internal
    returns (uint)
    {
        require(_matronId == uint256(uint32(_matronId)));
        require(_sireId == uint256(uint32(_sireId)));
        require(_generation == uint256(uint32(_generation)));

        Dragon memory _dragon = Dragon({
            dna: _dna,
            birthTime: uint64(now),
            breedTime: 0,
            matronId: uint32(_matronId),
            sireId: uint32(_sireId),
            siringWithId: 0,
            generation: uint32(_generation)
            });

        DragonAssets memory _dragonAssets = DragonAssets({
            runeLevel: _runelevel,
            agility: _agility,
            strength: _strength,
            intelligence: _intelligence
            });

        uint256 newDragonId = dragons.push(_dragon) - 1;

        dragonAssets[newDragonId] = _dragonAssets;

        // It's probably never going to happen, 4 billion dragons is A LOT, but
        // let's just be 100% sure we never let this happen.
        require(newDragonId == uint256(uint32(newDragonId)));

        // emit the birth event
        emit Birth(
            _owner,
            newDragonId,
            uint256(_dragon.matronId),
            uint256(_dragon.sireId),
            _dragon.dna,
            _dragon.generation,
            _runelevel
        );

        // This will assign ownership, and also emit the Transfer event as
        // per ERC721 draft
        _transfer(address(0), _owner, newDragonId);

        return newDragonId;
    }

    function setUpdateAssetFee(uint256 newFee) external onlyCLevel {
        updateAssetFee = newFee;
    }


    function updateDragonAsset(uint256 _dragonId, uint64 _rune, uint64 _agility, uint64 _strength, uint64 _intelligence)
    external
    whenNotPaused
    onlyCOO
    {

        DragonAssets storage currentDragonAsset = dragonAssets[_dragonId];

        require(_rune > currentDragonAsset.runeLevel);
        require(_agility >= currentDragonAsset.agility);
        require(_strength >= currentDragonAsset.strength);
        require(_intelligence >= currentDragonAsset.intelligence);

        DragonAssets memory _dragonAsset = DragonAssets({
            runeLevel: _rune,
            agility: _agility,
            strength: _strength,
            intelligence: _intelligence
            });

        dragonAssets[_dragonId] = _dragonAsset;
        msg.sender.transfer(updateAssetFee);
        emit DragonAssetsUpdated(_dragonId, _rune, _agility, _strength, _intelligence);

    }

    function requestAssetUpdate(uint256 _dragonId, uint256 _rune)
    external
    payable
    whenNotPaused
    {
        require(msg.value >= updateAssetFee);

        DragonAssets storage currentDragonAsset = dragonAssets[_dragonId];
        require(_rune > currentDragonAsset.runeLevel);

        emit DragonAssetRequest(_dragonId);

        //assetManagement.requestAssetUpdate.value(msg.value)(_dragonId);
    }

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool)
    {
        return authorised[_owner][_operator];
    }

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external
    {
        emit ApprovalForAll(msg.sender,_operator, _approved);
        authorised[msg.sender][_operator] = _approved;
    }

    function tokenURI(uint256 _tokenId) external view isValidToken(_tokenId) returns (string memory)
    {
        uint maxlength = 78;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        uint _tmpTokenId = _tokenId;
        uint _offset = 48;

        bytes memory _uriBase;
        _uriBase = bytes(tokenURIPrefix);

        while (_tmpTokenId != 0) {
            uint remainder = _tmpTokenId % 10;
            _tmpTokenId = _tmpTokenId / 10;
            reversed[i++] = byte(uint8(_offset + remainder));
        }

        bytes memory s = new bytes(_uriBase.length + i);
        uint j;

        //add the base to the final array
        for (j = 0; j < _uriBase.length; j++) {
            s[j] = _uriBase[j];
        }
        //add the tokenId to the final array
        for (j = 0; j < i; j++) {
            s[j + _uriBase.length] = reversed[i - 1 - j];
        }
        //turn it into a string and return it
        return string(s);
    }
}

// File: contracts/DragonOwnership.sol

pragma solidity ^0.5.10;


/// @title The facet of the BlockDragons core contract that manages ownership, ERC-721 (draft) compliant.
/// @author Zynappse Corporation (https://www.zynapse.com)
/// @dev Ref: https://github.com/ethereum/EIPs/issues/721
///  @dev Refer to the Dragon contract documentation for details in contract interactions.
contract DragonOwnership is DragonBase {

    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant name = "Drakons";
    string public constant symbol = "DRKNS";

    //bytes4 constant InterfaceSignature_ERC165 = bytes4(keccak256('supportsInterface(bytes4)'));

    //bytes4 constant InterfaceSignature_ERC721 =
    //bytes4(keccak256('name()')) ^
    //bytes4(keccak256('symbol()')) ^
    //bytes4(keccak256('totalSupply()')) ^
    //bytes4(keccak256('balanceOf(address)')) ^
    //bytes4(keccak256('ownerOf(uint256)')) ^
    //bytes4(keccak256('approve(address,uint256)')) ^
    //bytes4(keccak256('transfer(address,uint256)')) ^
    //bytes4(keccak256('transferFrom(address,address,uint256)')) ^
    //bytes4(keccak256('tokensOfOwner(address)')) ^
    //bytes4(keccak256('tokenMetadata(uint256,string)'));

    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    ///  Returns true for any standardized interfaces implemented by this contract. We implement
    ///  ERC-165 (obviously!) and ERC-721.
    //function supportsInterface(bytes4 _interfaceID) external view returns (bool)
    //{
    //    return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));
    //}

    function setTokenURIAffixes(string calldata _prefix, string calldata _suffix) external onlyCEO {
        tokenURIPrefix = _prefix;
        tokenURISuffix = _suffix;
    }

    /// @dev Checks if a given address is the current owner of a particular Dragon.
    /// @param _claimant the address we are validating against.
    /// @param _tokenId dragon id, only valid when > 0
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return dragonIndexToOwner[_tokenId] == _claimant;
    }

    /// @dev Checks if a given address currently has transferApproval for a particular Dragon.
    /// @param _claimant the address we are confirming dragon is approved for.
    /// @param _tokenId dragon id, only valid when > 0
    function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return dragonIndexToApproved[_tokenId] == _claimant;
    }

    /// @dev Marks an address as being approved for transferFrom(), overwriting any previous
    ///  approval. Setting _approved to address(0) clears all transfer approval.
    ///  NOTE: _approve() does NOT send the Approval event. This is intentional because
    ///  _approve() and transferFrom() are used together for putting Dragons on auction, and
    ///  there is no value in spamming the log with Approval events in that case.
    function _approve(uint256 _tokenId, address _approved) internal {
        dragonIndexToApproved[_tokenId] = _approved;
    }

    /// @notice Returns the number of Dragons owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function balanceOf(address _owner) public view returns (uint256 count) {
        return ownershipTokenCount[_owner];
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) public payable
    {
        require(_to != address(0));
        require(_to != address(this));
        require(_to != address(saleAuction));
        require(_to != address(siringAuction));

        // Check for approval and valid ownership
        //require(_approvedFor(msg.sender, _tokenId));
        //require(_owns(_from, _tokenId));
        address owner = ownerOf(_tokenId);
        require(owner == _from);
        require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]);

        // Reassign ownership, clearing pending approvals and emitting Transfer event.
        _transfer(_from, _to, _tokenId);

        uint32 size;
        assembly {
            size := extcodesize(_to)
        }

        if(size > 0) {
            ERC721TokenReceiver receiver = ERC721TokenReceiver(_to);
            require(receiver.onERC721Received(msg.sender,_from,_tokenId,data) == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")));
        }
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable
    {
        safeTransferFrom(_from, _to, _tokenId, "");
    }

    /// @notice Transfers a Dragon to another address. If transferring to a smart
    ///  contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or
    ///  BlockDragonz specifically) or your Dragon may be lost forever. Seriously.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the Dragon to transfer.
    function transfer(
        address _to,
        uint256 _tokenId
    )
    external
    whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any dragons (except very briefly
        // after a firstGen dragon is created and before it goes on auction).
        require(_to != address(this));
        // Disallow transfers to the auction contracts to prevent accidental
        // misuse. Auction contracts should only take ownership of dragons
        // through the allow + transferFrom flow.
        require(_to != address(saleAuction));
        require(_to != address(siringAuction));

        // You can only send your own dragon.
        require(_owns(msg.sender, _tokenId));

        // Reassign ownership, clear pending approvals, emit Transfer event.
        _transfer(msg.sender, _to, _tokenId);
    }

    /// @notice Returns the address currently assigned ownership of a given Dragon.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId) public view isValidToken(_tokenId) returns (address)
    {
        return dragonIndexToOwner[_tokenId];
    }

    /// @notice Grant another address the right to transfer a specific Dragon via
    ///  transferFrom(). This is the preferred flow for transfering NFTs to contracts.
    /// @param _approved The address to be granted transfer approval. Pass address(0) to
    ///  clear all approvals.
    /// @param _tokenId The ID of the Dragon that can be transferred if this call succeeds.
    /// @dev Required for ERC-721 compliance.
    //function approve( address _to, uint256 _tokenId) external whenNotPaused {
    function approve(address _approved, uint256 _tokenId) external payable whenNotPaused {
        // Only an owner can grant transfer approval.
        //require(_owns(msg.sender, _tokenId) || authorised[owner][msg.sender]);
        address owner = dragonIndexToOwner[_tokenId];
        require(owner == msg.sender || authorised[owner][msg.sender]);

        // Register the approval (replacing any previous approval).
        _approve(_tokenId, _approved);

        // Emit approval event.
        //emit Approval(msg.sender, _approved, _tokenId);
        emit Approval(owner, _approved, _tokenId);
    }

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view isValidToken(_tokenId) returns (address)
    {
        return dragonIndexToApproved[_tokenId];
    }


    /// @notice Transfer a Dragon owned by another address, for which the calling address
    ///  has previously been granted transfer approval by the owner.
    /// @param _from The address that owns the Dragon to be transfered.
    /// @param _to The address that should take ownership of the Dragon. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the Dragon to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable whenNotPaused
    {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        // The contract should never own any dragons (except very briefly
        // after a firstGen dragon is created and before it goes on auction).
        require(_to != address(this));
        // Check for approval and valid ownership
        //require(_approvedFor(msg.sender, _tokenId));
        //require(_owns(_from, _tokenId));
        address owner = ownerOf(_tokenId);
        require(owner == _from);
        require (owner == msg.sender || dragonIndexToApproved[_tokenId] == msg.sender || authorised[owner][msg.sender]);

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        _transfer(_from, _to, _tokenId);
    }

    /// @notice Returns the total number of Dragons currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint) {
        return dragons.length - 1;
    }

    /// @notice Returns a list of all Dragon IDs assigned to an address.
    /// @param _owner The owner whose Dragons we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
    ///  expensive (it walks the entire Dragon array looking for dragons belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalDragons = totalSupply();
            uint256 resultIndex = 0;

            // We count on the fact that all dragons have IDs starting at 1 and increasing
            // sequentially up to the totalDragon count.
            uint256 dragonId;

            for (dragonId = 1; dragonId <= totalDragons; dragonId++) {
                if (dragonIndexToOwner[dragonId] == _owner) {
                    result[resultIndex] = dragonId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

    /// @notice Enumerate valid NFTs
    /// @dev Throws if `_index` >= `totalSupply()`.
    /// @param _index A counter less than `totalSupply()`
    /// @return The token identifier for the `_index`th NFT,
    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256)
    {
        return _index;
    }

    /// @notice Enumerate NFTs assigned to an owner
    /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
    ///  `_owner` is the zero address, representing invalid NFTs.
    /// @param _owner An address where we are interested in NFTs owned by them
    /// @param _index A counter less than `balanceOf(_owner)`
    /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
    ///   (sort order not specified)
    //function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 dragonId)
    {
        uint256 count = 0;
        for (uint256 i = 1; i <= totalSupply(); ++i) {
            if (dragonIndexToOwner[i] == _owner) {
                if (count == _index) {
                    return i;
                } else {
                    count++;
                }
            }
        }
        revert();
    }
}

// File: contracts/DragonBreeding.sol

pragma solidity ^0.5.10;


/// @title DragonCore that manages Dragon siring, gestation, and birth.
/// @author Zynappse Corporation (https://www.zynapse.com)
/// @dev See the DragonCore contract documentation to understand how the various contract facets are arranged.
contract DragonBreeding is DragonOwnership {

    /// @dev The Pregnant event is fired when two dragons successfully breed and the pregnancy timer begins for the matron.
    event Pregnant(address owner, uint256 matronId, uint256 sireId);

    /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards
    ///  the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by
    ///  the CIO role as the gas price changes.
    uint256 public autoBirthFee = 2 finney;

    // Keeps track of number of pregnant dragons.
    uint256 public pregnantDragons;

    uint32 public BREEDING_LIMIT = 3;
    mapping(uint256 => uint64) breeding;

    /// @dev The address of the sibling contract that is used to implement the sooper-sekret genetic combination algorithm.
    //GeneScienceInterface public geneScience;

    /// @dev Update the address of the genetic contract, can only be called by the CEO.
    /// @param _address An address of a GeneScience contract instance to be used from this point forward.
    //function setGeneScienceAddress(address _address) external onlyCEO {
    //    GeneScienceInterface candidateContract = GeneScienceInterface(_address);

    // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
    //    require(candidateContract.isGeneScience());

    // Set the new contract address
    //    geneScience = candidateContract;
    //}

    /// @dev Checks that a given Dragon is able to breed. Requires that the
    ///  current cooldown is finished (for sires) and also checks that there is
    ///  no pending pregnancy.
    function _isReadyToBreed(Dragon storage _dragon) internal view returns (bool) {
        // In addition to checking the cooldownEndBlock, we also need to check to see if
        // the dragon has a pending birth; there can be some period of time between the end
        // of the pregnacy timer and the birth event.
        return (_dragon.siringWithId == 0);
    }

    /// @dev Check if a sire has authorized breeding with this matron. True if both sire
    ///  and matron have the same owner, or if the sire has given siring permission to
    ///  the matron's owner (via approveSiring()).
    function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {
        address matronOwner = dragonIndexToOwner[_matronId];
        address sireOwner = dragonIndexToOwner[_sireId];

        // Siring is okay if they have same owner, or if the matron's owner was given
        // permission to breed with this sire.
        return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);
    }



    /// @notice Grants approval to another user to sire with one of your Dragons.
    /// @param _addr The address that will be able to sire with your Dragon. Set to
    ///  address(0) to clear all siring approvals for this Dragon.
    /// @param _sireId A Dragon that you own that _addr will now be able to sire with.
    function approveSiring(address _addr, uint256 _sireId)
    external
    whenNotPaused
    {
        require(_owns(msg.sender, _sireId));
        sireAllowedToAddress[_sireId] = _addr;
    }

    /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only
    ///  be called by the CMO address. (This fee is used to offset the gas cost incurred
    ///  by the autobirth daemon).
    function setAutoBirthFee(uint256 val) external onlyCLevel {
        autoBirthFee = val;
    }

    /// @dev Checks to see if a given Dragon is pregnant and (if so) if the gestation period has passed.
    function _isReadyToGiveBirth(Dragon storage _matron) private view returns (bool) {
        return (_matron.siringWithId != 0);
    }

    /// @notice Checks that a given dragon is able to breed (i.e. it is not pregnant or
    ///  in the middle of a siring cooldown).
    /// @param _dragonId reference the id of the dragon, any user can inquire about it
    function isReadyToBreed(uint256 _dragonId)
    public
    view
    returns (bool)
    {
        require(_dragonId > 0);
        Dragon storage dragon = dragons[_dragonId];
        return _isReadyToBreed(dragon);
    }

    /// @dev Checks whether a dragon is currently pregnant.
    /// @param _dragonId reference the id of the dragon, any user can inquire about it
    function isPregnant(uint256 _dragonId)
    public
    view
    returns (bool)
    {
        require(_dragonId > 0);
        // A dragon is pregnant if and only if this field is set
        return dragons[_dragonId].siringWithId != 0;
    }

    /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT
    /// check ownership permissions (that is up to the caller).
    /// @param _matron A reference to the Dragon struct of the potential matron.
    /// @param _matronId The matron's ID.
    /// @param _sire A reference to the Dragon struct of the potential sire.
    /// @param _sireId The sire's ID
    function _isValidMatingPair(
        Dragon storage _matron,
        uint256 _matronId,
        Dragon storage _sire,
        uint256 _sireId
    )
    private
    view
    returns(bool)
    {
        if(breeding[_matronId] >= BREEDING_LIMIT) {
            return false;
        }

        uint256 sireElement = _sire.dna / 1e34;
        uint256 matronElement = _matron.dna / 1e34;

        if (sireElement != matronElement) {
          return false;
        }

        // A Dragon can't breed with itself!
        if (_matronId == _sireId) {
            return false;
        }

        // Dragons can't breed with their parents.
        if (_matron.matronId == _sireId || _matron.sireId == _sireId) {
            return false;
        }

        if (_sire.matronId == _matronId || _sire.sireId == _matronId) {
            return false;
        }

        // We can short circuit the sibling check (below) if either dragon is first generation (has a matron ID of zero).
        if (_sire.matronId == 0 || _matron.matronId == 0) {
            return true;
        }

        // Dragons can't breed with full or half siblings.
        if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {
            return false;
        }
        if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {
            return false;
        }

        // Everything seems cool! Let's get DTF.
        return true;
    }

    /// @dev Internal check to see if a given sire and matron are a valid mating pair for
    ///  breeding via auction (i.e. skips ownership and siring approval checks).
    function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)
    internal
    view
    returns (bool)
    {
        Dragon storage matron = dragons[_matronId];
        Dragon storage sire = dragons[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId);
    }

    /// @notice Checks to see if two dragons can breed together, including checks for
    ///  ownership and siring approvals. Does NOT check that both dragons are ready for
    ///  breeding (i.e. breedWith could still fail until the cooldowns are finished).
    ///  TODO: Shouldn't this check pregnancy and cooldowns?!?
    /// @param _matronId The ID of the proposed matron.
    /// @param _sireId The ID of the proposed sire.
    function canBreedWith(uint256 _matronId, uint256 _sireId)
    external
    view
    returns(bool)
    {
        require(_matronId > 0);
        require(_sireId > 0);
        Dragon storage matron = dragons[_matronId];
        Dragon storage sire = dragons[_sireId];
        return _isValidMatingPair(matron, _matronId, sire, _sireId) &&
        _isSiringPermitted(_sireId, _matronId);
    }

    /// @dev Internal utility function to initiate breeding, assumes that all breeding
    ///  requirements have been checked.
    function _breedWith(uint256 _matronId, uint256 _sireId) internal {
        // Grab a reference to the Dragons from storage.
        // Dragon storage sire = dragons[_sireId];
        Dragon storage matron = dragons[_matronId];

        // Mark the matron as pregnant, keeping track of who the sire is.
        matron.siringWithId = uint32(_sireId);

        // Trigger the cooldown for both parents.
        // _triggerCooldown(sire);
        // _triggerCooldown(matron);

        // Clear siring permission for both parents. This may not be strictly necessary but it's likely to avoid confusion!
        delete sireAllowedToAddress[_matronId];
        delete sireAllowedToAddress[_sireId];

        // Every time a dragon gets pregnant, counter is incremented.
        pregnantDragons++;

        // Emit the pregnancy event.
        emit Pregnant(dragonIndexToOwner[_matronId], _matronId, _sireId);
    }

    /// @notice Breed a Dragon you own (as matron) with a sire that you own, or for which you
    ///  have previously been given Siring approval. Will either make your dragon pregnant, or will
    ///  fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()
    /// @param _matronId The ID of the Dragon acting as matron (will end up pregnant if successful)
    /// @param _sireId The ID of the Dragon acting as sire (will begin its siring cooldown if successful)
    function breedWithAuto(uint256 _matronId, uint256 _sireId)
    external
    payable
    whenNotPaused
    {
        // Checks for payment.
        require(msg.value >= autoBirthFee);

        // Caller must own the matron.
        require(_owns(msg.sender, _matronId));

        // Neither sire nor matron are allowed to be on auction during a normal
        // breeding operation, but we don't need to check that explicitly.
        // For matron: The caller of this function can't be the owner of the matron
        //   because the owner of a Dragon on auction is the auction house, and the
        //   auction house will never call breedWith().
        // For sire: Similarly, a sire on auction will be owned by the auction house
        //   and the act of transferring ownership will have cleared any oustanding
        //   siring approval.
        // Thus we don't need to spend gas explicitly checking to see if either dragon
        // is on auction.

        // Check that matron and sire are both owned by caller, or that the sire
        // has given siring permission to caller (i.e. matron's owner).
        // Will fail for _sireId = 0
        require(_isSiringPermitted(_sireId, _matronId));

        // Grab a reference to the potential matron
        Dragon storage matron = dragons[_matronId];

        // Make sure matron isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(matron));

        // Grab a reference to the potential sire
        Dragon storage sire = dragons[_sireId];

        // Make sure sire isn't pregnant, or in the middle of a siring cooldown
        require(_isReadyToBreed(sire));

        // Update the breedTime
        matron.breedTime = uint64(now);

        // Test that these dragons are a valid mating pair.
        require(_isValidMatingPair(
                matron,
                _matronId,
                sire,
                _sireId
            ));


        // All checks passed, dragon gets pregnant!
        _breedWith(_matronId, _sireId);
    }

    /// @notice Have a pregnant Dragon give birth!
    /// @param _matronId A Dragon ready to give birth.
    /// @param _dna Dragon's DNA
    /// @param _agility Dragon's agility initial value
    /// @param _strength Dragon's Strenght initial value
    /// @param _intelligence Dragon's Intelligence initial value
    /// @param _runelevel Dragon's Rune Level initial value
    /// @return The Dragon ID of the new dragon.
    /// @dev Looks at a given Dragon and, if pregnant and if the gestation period has passed,
    ///  combines the genes of the two parents to create a new dragon. The new Dragon is assigned
    ///  to the current owner of the matron. Upon successful completion, both the matron and the
    ///  new dragon will be ready to breed again. Note that anyone can call this function (if they
    ///  are willing to pay the gas!), but the new dragon always goes to the mother's owner.
    function giveBirth(uint256 _matronId, uint256 _dna, uint64 _agility, uint64 _strength, uint64 _intelligence, uint64 _runelevel)
    external
    whenNotPaused
    onlyCOO
    returns(uint256)
    {
        // Grab a reference to the matron in storage.
        Dragon storage matron = dragons[_matronId];

        // Check that the dragon is a valid dragon.
        require(matron.birthTime != 0);

        // Check that the matron is pregnant, and that its time has come!
        require(_isReadyToGiveBirth(matron));

        // Grab a reference to the sire in storage.
        uint256 sireId = matron.siringWithId;
        Dragon storage sire = dragons[sireId];

        // Determine the higher generation number of the two parents
        uint32 parentGen = matron.generation;
        if (sire.generation > matron.generation) {
            parentGen = sire.generation;
        }

        // Call the sooper-sekret gene mixing operation.
        uint256 matronId = _matronId;
        uint64 agility = _agility;
        uint64 strength = _strength;
        uint64 intelligence = _intelligence;
        uint64 runelevel = _runelevel;

        uint256 childDNA = _dna;

        // Make the new dragon!
        address owner = dragonIndexToOwner[matronId];
        //uint256 dragonId = _createDragon(_matronId, matron.siringWithId, parentGen + 1, childDNA, _agility, _strength, _intelligence, _runelevel, owner);
        uint256 dragonId = _createDragon(matronId, sireId, parentGen + 1, childDNA, agility, strength, intelligence, runelevel, owner);

        //increment the breeding for the matron
        breeding[matronId]++;

        // Clear the reference to sire from the matron (REQUIRED! Having siringWithId
        // set is what marks a matron as being pregnant.)
        delete matron.siringWithId;

        // Every time a dragon gives birth counter is decremented.
        pregnantDragons--;

        // Send the balance fee to the person who made birth happen.
        //msg.sender.send(autoBirthFee);
        msg.sender.transfer(autoBirthFee);

        // return the new dragon's ID
        return dragonId;
    }

    function getPregnantDragons() external view returns(uint256[] memory pregnantDragonsList) {

        if (pregnantDragons == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](pregnantDragons);
            uint256 totalDragons = totalSupply();
            uint256 resultIndex = 0;

             uint256 dragonId;

            for (dragonId = 1; dragonId <= totalDragons; dragonId++) {
                if (isPregnant(dragonId)) {
                    result[resultIndex] = dragonId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

    function setBreedingLimit(uint32 _value) external onlyCLevel {
        BREEDING_LIMIT = _value;
    }
}

// File: contracts/DragonAuction.sol

pragma solidity ^0.5.10;


/// @title Handles creating auctions for sale and siring of dragons.
/// @author Zynappse Corporation (https://www.zynapse.com)
///  This wrapper of ReverseAuction exists only so that users can create
///  auctions with only one transaction.
contract DragonAuction is DragonBreeding {

    // @notice The auction contract variables are defined in DragonBase to allow
    //  us to refer to them in DragonOwnership to prevent accidental transfers.
    // `saleAuction` refers to the auction for gen0 and p2p sale of dragons.
    // `siringAuction` refers to the auction for siring rights of dragons.

    /// @dev Sets the reference to the sale auction.
    /// @param _address - Address of sale contract.
    function setSaleAuctionAddress(address _address) external onlyCEO {
        SaleClockAuction candidateContract = SaleClockAuction(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
    }

    /// @dev Sets the reference to the siring auction.
    /// @param _address - Address of siring contract.
    function setSiringAuctionAddress(address _address) external onlyCEO {
        SiringClockAuction candidateContract = SiringClockAuction(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isSiringClockAuction());

        // Set the new contract address
        siringAuction = candidateContract;
    }

    /// @dev Put a dragon up for auction.
    ///  Does some ownership trickery to create auctions in one tx.
    function createSaleAuction(
        uint256 _dragonId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        // Auction contract checks input sizes
        // If dragon is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _dragonId));
        // Ensure the dragon is not pregnant to prevent the auction
        // contract accidentally receiving ownership of the child.
        // NOTE: the dragon IS allowed to be in a cooldown.
        require(!isPregnant(_dragonId));
        _approve(_dragonId, address(saleAuction));
        // Sale auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the dragon.
        saleAuction.createAuction(
            _dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    /// @dev Put a dragon up for auction to be sire.
    ///  Performs checks to ensure the dragon can be sired, then
    ///  delegates to reverse auction.
    function createSiringAuction(
        uint256 _dragonId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        // Auction contract checks input sizes
        // If dragon is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _dragonId));
        require(isReadyToBreed(_dragonId));
        _approve(_dragonId, address(siringAuction));
        // Siring auction throws if inputs are invalid and clears
        // transfer and sire approval after escrowing the dragon.
        siringAuction.createAuction(
            _dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }


    /// @dev Completes a siring auction by bidding.
    ///  Immediately breeds the winning matron with the sire on auction.
    /// @param _sireId - ID of the sire on auction.
    /// @param _matronId - ID of the matron owned by the bidder.
    function bidOnSiringAuction(
        uint256 _sireId,
        uint256 _matronId
    )
    external
    payable
    whenNotPaused
    {
        // Auction contract checks input sizes
        require(_owns(msg.sender, _matronId));
        require(isReadyToBreed(_matronId));
        require(_canBreedWithViaAuction(_matronId, _sireId));

        // Define the current price of the auction.
        uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);
        require(msg.value >= currentPrice + autoBirthFee);

        // Siring auction will throw if the bid fails.
        siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);
        _breedWith(uint32(_matronId), uint32(_sireId));
    }

    /// @dev Transfers the balance of the sale auction contract
    /// to the DragonCore contract. We use two-step withdrawal to
    /// prevent two transfer calls in the auction bid function.
    function withdrawAuctionBalances() external onlyCLevel {
        saleAuction.withdrawBalance();
        siringAuction.withdrawBalance();
    }

    /// @dev Shows the balance of the auction contracts.
    function getAuctionBalances() external view onlyCLevel returns (uint256, uint256) {
        return (
            address(saleAuction).balance,
            address(siringAuction).balance
        );
    }
}

// File: contracts/DragonMinting.sol

pragma solidity ^0.5.10;


/// @title all functions related to creating dragons
contract DragonMinting is DragonAuction {

    /// @dev we can create promo dragons, up to a limit. Only callable by CMO
    /// @param _dna the encoded genes of the dragons to be created, any value is accepted
    /// @param _owner the future owner of the created dragons. Default to contract CMO
    function createPromoDragon(
        uint256 _dna,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint64 _runelevel,
        address _owner)
        external onlyCLevel {

        address dragonOwner = _owner;
        if (dragonOwner == address(0)) {
            dragonOwner = cmoAddress;
        }

        _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, _runelevel, dragonOwner);
    }

    /// @dev Creates a new gen0 dragon with the given dna and
    ///  creates an auction for it.
    function createGen0Auction(
        uint256 _dna,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint64 _agility,
        uint64 _strength,
        uint64 _intelligence,
        uint256 _duration )
        external onlyCLevel {

        //require(gen0CreatedCount < GEN0_CREATION_LIMIT);


        uint256 dragonId = _createDragon(0, 0, 0, _dna, _agility, _strength, _intelligence, 0, address(this));
        _approve(dragonId, address(saleAuction));

        saleAuction.createAuction(
            dragonId,
            _startingPrice,
            _endingPrice,
            _duration,
            address(uint160(address(this)))
        );

        //gen0CreatedCount++;
    }
}

// File: contracts/DragonCore.sol

pragma solidity ^0.5.10;


contract DragonCore is DragonMinting {

    // Set in case the core contract is broken and an upgrade is required
    address public newContractAddress;

    /// @notice Creates the main BlockDragonz smart contract instance.
    constructor () public {
        // Starts paused.
        paused = true;

        // the creator of the contract is the initial CEO
        ceoAddress = msg.sender;

        // the creator of the contract is also the initial CMO
        cmoAddress = msg.sender;

        // the creator of the contract is also the initial CIO
        cioAddress = msg.sender;

        // the creator of the contract is also the initial CFO
        cfoAddress = msg.sender;

        // the creator of the contract is also the initial COO
        cooAddress = msg.sender;

        // ERC-165 Base
        supportedInterfaces[0x01ffc9a7] = true;

        // ERC-721 Base
        supportedInterfaces[0x80ac58cd] = true;

        // ERC-721 Metadata
        supportedInterfaces[0x5b5e139f] = true;

        // ERC-721 Enumerable
        supportedInterfaces[0x780e9d63] = true;

        //ERC-721 Receiver
        supportedInterfaces[0x150b7a02] = true;

        // start with the mythical dragon 0 - so we don't have generation-0 parent issues
        _createDragon(0, 0, 0, uint256(-1), 0,0,0,0,  address(0));
    }

    function setNewAddress(address _newAddress) external onlyCEO whenPaused {
        newContractAddress = _newAddress;
        emit ContractUpgrade(_newAddress);
    }

    /// @notice No tipping!
    /// @dev Reject all Ether from being sent here, unless it's from one of the
    ///  two auction contracts. (Hopefully, we can prevent user accidents.)
    function() external payable {
        require(
            msg.sender == address(saleAuction) ||
            msg.sender == address(siringAuction)
        );
    }
    /// @notice Returns all the relevant information about a specific dragon.
    /// @param _id The ID of the dragon of interest.
    function getDragon(uint256 _id)
    external
    view
    returns (
        uint256 dna,
        uint256 birthTime,
        uint256 breedTime,
        uint256 matronId,
        uint256 sireId,
        uint256 siringWithId,
        uint256 generation,
        uint256 runeLevel,
        uint256 agility,
        uint256 strength,
        uint256 intelligence
    ) {
        Dragon storage dragon = dragons[_id];
        DragonAssets storage dragonAsset = dragonAssets[_id];

        dna = dragon.dna;
        birthTime = uint256(dragon.birthTime);
        breedTime = uint256(dragon.breedTime);
        matronId = uint256(dragon.matronId);
        sireId = uint256(dragon.sireId);
        siringWithId = uint256(dragon.siringWithId);
        generation = uint256(dragon.generation);
        runeLevel = dragonAsset.runeLevel;
        agility = dragonAsset.agility;
        strength = dragonAsset.strength;
        intelligence = dragonAsset.intelligence;
    }

    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive CALL.
    function unpause() public onlyCEO whenPaused {
        require(address(saleAuction) != address(0));
        require(address(siringAuction) != address(0));
        require(newContractAddress == address(0));

        // Actually unpause the contract.
        super.unpause();
    }

    // @dev Allows the CIO to capture the balance available to the contract.
    function withdrawBalance() external onlyCLevel {
        uint256 balance = address(this).balance;
        // Subtract all the currently pregnant dragons we have, plus 1 of margin.
        uint256 subtractFees = (pregnantDragons + 1) * autoBirthFee;

        if (balance > subtractFees) {
            //cioAddress.send(balance - subtractFees);
            cfoAddress.transfer(balance - subtractFees);
        }
    }

    /// @dev Shows the contract's current balance.
    function getBalance() external view onlyCLevel returns (uint256) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFee","type":"uint256"}],"name":"setUpdateAssetFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pregnantDragons","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonAssets","outputs":[{"name":"runeLevel","type":"uint64"},{"name":"agility","type":"uint64"},{"name":"strength","type":"uint64"},{"name":"intelligence","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSiringAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_from","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint64"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"}],"name":"updateDragonAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isPregnant","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"siringAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_duration","type":"uint256"}],"name":"createGen0Auction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPregnantDragons","outputs":[{"name":"pregnantDragonsList","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"dragonId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCIO","type":"address"}],"name":"setCIO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"sireAllowedToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"canBreedWith","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSiringAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"setAutoBirthFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_sireId","type":"uint256"}],"name":"approveSiring","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cioAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"setNewAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dragonIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"},{"name":"_owner","type":"address"}],"name":"createPromoDragon","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BREEDING_LIMIT","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint32"}],"name":"setBreedingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"autoBirthFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_dna","type":"uint256"},{"name":"_agility","type":"uint64"},{"name":"_strength","type":"uint64"},{"name":"_intelligence","type":"uint64"},{"name":"_runelevel","type":"uint64"}],"name":"giveBirth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_dragonId","type":"uint256"}],"name":"isReadyToBreed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURISuffix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getDragon","outputs":[{"name":"dna","type":"uint256"},{"name":"birthTime","type":"uint256"},{"name":"breedTime","type":"uint256"},{"name":"matronId","type":"uint256"},{"name":"sireId","type":"uint256"},{"name":"siringWithId","type":"uint256"},{"name":"generation","type":"uint256"},{"name":"runeLevel","type":"uint256"},{"name":"agility","type":"uint256"},{"name":"strength","type":"uint256"},{"name":"intelligence","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionBalances","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateAssetFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sireId","type":"uint256"},{"name":"_matronId","type":"uint256"}],"name":"bidOnSiringAuction","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_matronId","type":"uint256"},{"name":"_sireId","type":"uint256"}],"name":"breedWithAuto","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_dragonId","type":"uint256"},{"name":"_rune","type":"uint256"}],"name":"requestAssetUpdate","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"string"},{"name":"_suffix","type":"string"}],"name":"setTokenURIAffixes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"}],"name":"Pregnant","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"dragonId","type":"uint256"},{"indexed":false,"name":"matronId","type":"uint256"},{"indexed":false,"name":"sireId","type":"uint256"},{"indexed":false,"name":"dna","type":"uint256"},{"indexed":false,"name":"generation","type":"uint32"},{"indexed":false,"name":"runeLevel","type":"uint64"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"},{"indexed":false,"name":"_rune","type":"uint64"},{"indexed":false,"name":"_agility","type":"uint64"},{"indexed":false,"name":"_strength","type":"uint64"},{"indexed":false,"name":"_intelligence","type":"uint64"}],"name":"DragonAssetsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_dragonId","type":"uint256"}],"name":"DragonAssetRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

6004805460ff60a01b1916905560e060405260326080818152906200471c60a0398051620000369160069160209091019062000687565b50604080516020810191829052600090819052620000579160079162000687565b50661c6bf526340000600f5566071afd498d00006012556014805463ffffffff191660031790553480156200008b57600080fd5b5060048054600080546001600160a01b0319908116339081178355600280548316821790556001805483168217815560ff60a01b199094167401000000000000000000000000000000000000000017821681179094556003805490911690931790925560056020527fc01909ce2b517f8cd3a46ae0cfde9179f9b675cf633d3d84c8226585cc73c156805460ff1990811683179091557f072ad3113145b5af48d301e3b9fc3bd1c97c3f26a14f5d44904b71469875631e80548216831790557f3b767bd59d7164fff7ec5b80ca1165d9d6e12ee8656896fac4159b0760bfd9f780548216831790557f32dafcc0428d2ef4307d6da1e032ab9698665546cb7ff0633ca92092b13651e180548216831790557f150b7a020000000000000000000000000000000000000000000000000000000083527f12c5c367f8ba71e59ab2ab375660f9954a1433014a379b64972328607af9c30080549091169091179055620001ff908080600019818080808062000206565b506200078f565b60008963ffffffff168a146200021b57600080fd5b8863ffffffff1689146200022e57600080fd5b8763ffffffff1688146200024157600080fd5b6200024b6200070c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c08201526200029f62000748565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff168114620004fb57600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16200059d600086836001600160e01b03620005ad16565b9c9b505050505050505050505050565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b031916909117905583161562000641576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006ca57805160ff1916838001178555620006fa565b82800160010185558215620006fa579182015b82811115620006fa578251825591602001919060010190620006dd565b50620007089291506200076f565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6200078c91905b8082111562000708576000815560010162000776565b90565b613f7d806200079f6000396000f3fe6080604052600436106104105760003560e01c80635d64aa681161021e578063a9059cbb11610123578063e0bb933b116100ab578063e985e9c51161007a578063e985e9c51461119a578063ed60ade6146111d5578063f7d8c883146111f8578063faa0ae531461121b578063faf421251461123e57610410565b8063e0bb933b146110c2578063e6be9b5614611142578063e6cbe35114611170578063e8de704d1461118557610410565b8063c0ac9983116100f2578063c0ac998314610fed578063c87b56dd14611002578063d1741a8c1461102c578063d3e6f49f14611083578063dbbc853b146110ad57610410565b8063a9059cbb14610ec6578063b047fb5014610eff578063b0c35c0514610f14578063b88d4fde14610f2957610410565b806378c234e0116101a65780638c267b97116101755780638c267b9714610e1c57806391876e5714610e3157806392695a8814610e4657806395d89b4114610e76578063a22cb46514610e8b57610410565b806378c234e014610d435780638368071c14610da65780638456cb5914610dd45780638462151c14610de957610410565b80636af04a57116101ed5780636af04a5714610c6b5780636fbde40d14610c8057806370a0823114610cb35780637158798814610ce657806371f7aaca14610d1957610410565b80635d64aa6814610bed5780635fd8c71014610c175780636059c38414610c2c5780636352211e14610c4157610410565b806323b872dd1161032457806342842e0e116102ac5780634b85fd551161027b5780634b85fd5514610b185780634dfff04f14610b425780634e0a337914610b7b5780634f6ccce714610bae5780635c975abb14610bd857610410565b806342842e0e14610a4c57806346116e6f14610a8257806346d22c7014610aac5780634ad8c93814610adc57610410565b80632e1699d7116102f35780632e1699d71461092a5780632f745c591461098f5780633d7d3f5a146109c85780633f4ba83a14610a04578063416da14514610a1957610410565b806323b872dd1461083357806327d7874c146108695780632a896ece1461089c5780632ba73c15146108f757610410565b8063100b2783116103a757806315437dfb1161037657806315437dfb1461075b57806318160ddd146107ac5780631940a936146107c15780632072863b146107eb57806321717ebf1461081e57610410565b8063100b2783146105fd57806312065fe01461065b57806314001f4c14610670578063150b7a02146106a357610410565b806306fdde03116103e357806306fdde0314610508578063081812fc14610592578063095ea7b3146105bc5780630a0f8168146105e857610410565b806301ffc9a71461043e5780630304b213146104865780630519ce79146104b057806305ea0668146104e1575b6010546001600160a01b031633148061043357506011546001600160a01b031633145b61043c57600080fd5b005b34801561044a57600080fd5b506104726004803603602081101561046157600080fd5b50356001600160e01b031916611309565b604080519115158252519081900360200190f35b34801561049257600080fd5b5061043c600480360360208110156104a957600080fd5b503561132c565b3480156104bc57600080fd5b506104c561139c565b604080516001600160a01b039092168252519081900360200190f35b3480156104ed57600080fd5b506104f66113ab565b60408051918252519081900360200190f35b34801561051457600080fd5b5061051d6113b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055757818101518382015260200161053f565b50505050905090810190601f1680156105845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059e57600080fd5b506104c5600480360360208110156105b557600080fd5b50356113d4565b61043c600480360360408110156105d257600080fd5b506001600160a01b038135169060200135611414565b3480156105f457600080fd5b506104c56114cd565b34801561060957600080fd5b506106276004803603602081101561062057600080fd5b50356114dc565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b34801561066757600080fd5b506104f6611516565b34801561067c57600080fd5b5061043c6004803603602081101561069357600080fd5b50356001600160a01b0316611589565b3480156106af57600080fd5b5061073e600480360360808110156106c657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460018302840111600160201b8311171561073357600080fd5b509092509050611636565b604080516001600160e01b03199092168252519081900360200190f35b34801561076757600080fd5b5061043c600480360360a081101561077e57600080fd5b508035906001600160401b03602082013581169160408101358216916060820135811691608001351661165b565b3480156107b857600080fd5b506104f6611862565b3480156107cd57600080fd5b50610472600480360360208110156107e457600080fd5b503561186c565b3480156107f757600080fd5b5061043c6004803603602081101561080e57600080fd5b50356001600160a01b03166118b0565b34801561082a57600080fd5b506104c56118fc565b61043c6004803603606081101561084957600080fd5b506001600160a01b0381358116916020810135909116906040013561190b565b34801561087557600080fd5b5061043c6004803603602081101561088c57600080fd5b50356001600160a01b03166119eb565b3480156108a857600080fd5b5061043c600480360360e08110156108bf57600080fd5b508035906020810135906040810135906001600160401b036060820135811691608081013582169160a0820135169060c00135611a37565b34801561090357600080fd5b5061043c6004803603602081101561091a57600080fd5b50356001600160a01b0316611b5c565b34801561093657600080fd5b5061093f611ba8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561097b578181015183820152602001610963565b505050509050019250505060405180910390f35b34801561099b57600080fd5b506104f6600480360360408110156109b257600080fd5b506001600160a01b038135169060200135611c54565b3480156109d457600080fd5b5061043c600480360360808110156109eb57600080fd5b5080359060208101359060408101359060600135611cb6565b348015610a1057600080fd5b5061043c611d90565b348015610a2557600080fd5b5061043c60048036036020811015610a3c57600080fd5b50356001600160a01b0316611e07565b61043c60048036036060811015610a6257600080fd5b506001600160a01b03813581169160208101359091169060400135611e53565b348015610a8e57600080fd5b506104c560048036036020811015610aa557600080fd5b5035611e73565b348015610ab857600080fd5b5061047260048036036040811015610acf57600080fd5b5080359060200135611e8e565b348015610ae857600080fd5b5061043c60048036036080811015610aff57600080fd5b5080359060208101359060408101359060600135611f0d565b348015610b2457600080fd5b5061043c60048036036020811015610b3b57600080fd5b5035611fc8565b348015610b4e57600080fd5b5061043c60048036036040811015610b6557600080fd5b506001600160a01b038135169060200135612038565b348015610b8757600080fd5b5061043c60048036036020811015610b9e57600080fd5b50356001600160a01b0316612090565b348015610bba57600080fd5b506104f660048036036020811015610bd157600080fd5b5035611586565b348015610be457600080fd5b506104726120dc565b348015610bf957600080fd5b506104c560048036036020811015610c1057600080fd5b50356120ec565b348015610c2357600080fd5b5061043c612107565b348015610c3857600080fd5b506104c56121c8565b348015610c4d57600080fd5b506104c560048036036020811015610c6457600080fd5b50356121d7565b348015610c7757600080fd5b506104c5612217565b348015610c8c57600080fd5b5061043c60048036036020811015610ca357600080fd5b50356001600160a01b0316612226565b348015610cbf57600080fd5b506104f660048036036020811015610cd657600080fd5b50356001600160a01b03166122d3565b348015610cf257600080fd5b5061043c60048036036020811015610d0957600080fd5b50356001600160a01b03166122ee565b348015610d2557600080fd5b506104c560048036036020811015610d3c57600080fd5b503561236f565b348015610d4f57600080fd5b5061043c600480360360c0811015610d6657600080fd5b5080359060208101356001600160401b03908116916040810135821691606082013581169160808101359091169060a001356001600160a01b031661238a565b348015610db257600080fd5b50610dbb612425565b6040805163ffffffff9092168252519081900360200190f35b348015610de057600080fd5b5061043c612431565b348015610df557600080fd5b5061093f60048036036020811015610e0c57600080fd5b50356001600160a01b03166124c8565b348015610e2857600080fd5b506104c561258f565b348015610e3d57600080fd5b5061043c61259e565b348015610e5257600080fd5b5061043c60048036036020811015610e6957600080fd5b503563ffffffff166126d5565b348015610e8257600080fd5b5061051d61275c565b348015610e9757600080fd5b5061043c60048036036040811015610eae57600080fd5b506001600160a01b038135169060200135151561277d565b348015610ed257600080fd5b5061043c60048036036040811015610ee957600080fd5b506001600160a01b0381351690602001356127f7565b348015610f0b57600080fd5b506104c561288b565b348015610f2057600080fd5b506104f661289a565b61043c60048036036080811015610f3f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610f7957600080fd5b820183602082011115610f8b57600080fd5b803590602001918460018302840111600160201b83111715610fac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128a0945050505050565b348015610ff957600080fd5b5061051d612add565b34801561100e57600080fd5b5061051d6004803603602081101561102557600080fd5b5035612b6b565b34801561103857600080fd5b506104f6600480360360c081101561104f57600080fd5b508035906020810135906001600160401b0360408201358116916060810135821691608082013581169160a0013516612d75565b34801561108f57600080fd5b50610472600480360360208110156110a657600080fd5b5035612f5e565b3480156110b957600080fd5b5061051d612f9b565b3480156110ce57600080fd5b506110ec600480360360208110156110e557600080fd5b5035612ff6565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561114e57600080fd5b5061115761319a565b6040805192835260208301919091528051918290030190f35b34801561117c57600080fd5b506104c5613223565b34801561119157600080fd5b506104f6613232565b3480156111a657600080fd5b50610472600480360360408110156111bd57600080fd5b506001600160a01b0381358116916020013516613238565b61043c600480360360408110156111eb57600080fd5b5080359060200135613266565b61043c6004803603604081101561120e57600080fd5b50803590602001356133c3565b61043c6004803603604081101561123157600080fd5b50803590602001356134b7565b34801561124a57600080fd5b5061043c6004803603604081101561126157600080fd5b810190602081018135600160201b81111561127b57600080fd5b82018360208201111561128d57600080fd5b803590602001918460018302840111600160201b831117156112ae57600080fd5b919390929091602081019035600160201b8111156112cb57600080fd5b8201836020820111156112dd57600080fd5b803590602001918460018302840111600160201b831117156112fe57600080fd5b509092509050613539565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b6000546001600160a01b031633148061134f57506001546001600160a01b031633145b8061136457506002546001600160a01b031633145b8061137957506003546001600160a01b031633145b8061138e57506004546001600160a01b031633145b61139757600080fd5b600f55565b6004546001600160a01b031681565b60135481565b604051806040016040528060078152602001664472616b6f6e7360c81b81525081565b60008181526009602052604081205482906001600160a01b03166113f757600080fd5b50506000908152600b60205260409020546001600160a01b031690565b600454600160a01b900460ff161561142b57600080fd5b6000818152600960205260409020546001600160a01b03163381148061147457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61147d57600080fd5b6114878284613570565b81836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000546001600160a01b031681565b600d602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b600080546001600160a01b031633148061153a57506001546001600160a01b031633145b8061154f57506002546001600160a01b031633145b8061156457506003546001600160a01b031633145b8061157957506004546001600160a01b031633145b61158257600080fd5b5030315b90565b6000546001600160a01b031633146115a057600080fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d602081101561160857600080fd5b505161161357600080fd5b601180546001600160a01b0319166001600160a01b039290921691909117905550565b60006040518080613f2260279139604051908190036027019020979650505050505050565b600454600160a01b900460ff161561167257600080fd5b6003546001600160a01b0316331461168957600080fd5b6000858152600d6020526040902080546001600160401b03908116908616116116b157600080fd5b80546001600160401b03600160401b909104811690851610156116d357600080fd5b80546001600160401b03600160801b909104811690841610156116f557600080fd5b80546001600160401b03600160c01b9091048116908316101561171757600080fd5b61171f613df7565b50604080516080810182526001600160401b03878116825286811660208084019182528783168486019081528784166060860190815260008d8152600d9093528683208651815495519351925167ffffffffffffffff199096169087161767ffffffffffffffff60401b1916600160401b938716939093029290921767ffffffffffffffff60801b1916600160801b91861691909102176001600160c01b0316600160c01b9390941692909202929092179055600f549251919233926108fc82150292818181858888f193505050501580156117ff573d6000803e3d6000fd5b50604080518881526001600160401b0380891660208301528088168284015280871660608301528516608082015290517f98677f77088375bf66a28fd8e22fe9e5bcdf31183e2f80c9cd9b92170df1b11e9181900360a00190a150505050505050565b6008546000190190565b600080821161187a57600080fd5b6008828154811061188757fe5b6000918252602090912060029091020160010154600160c01b900463ffffffff16151592915050565b6000546001600160a01b031633146118c757600080fd5b6001600160a01b0381166118da57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b600454600160a01b900460ff161561192257600080fd5b6001600160a01b03821661193557600080fd5b6001600160a01b03821630141561194b57600080fd5b6000611956826121d7565b9050836001600160a01b0316816001600160a01b03161461197657600080fd5b6001600160a01b0381163314806119a357506000828152600b60205260409020546001600160a01b031633145b806119d157506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b6119da57600080fd5b6119e584848461359e565b50505050565b6000546001600160a01b03163314611a0257600080fd5b6001600160a01b038116611a1557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a5a57506001546001600160a01b031633145b80611a6f57506002546001600160a01b031633145b80611a8457506003546001600160a01b031633145b80611a9957506004546001600160a01b031633145b611aa257600080fd5b6000611ab860008060008b898989600030613677565b601054909150611ad29082906001600160a01b0316613570565b601054604080516313f5f20560e11b815260048101849052602481018a9052604481018990526064810185905230608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b7357600080fd5b6001600160a01b038116611b8657600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b606060135460001415611bca5750604080516000815260208101909152611586565b6060601354604051908082528060200260200182016040528015611bf8578160200160208202803883390190505b5090506000611c05611862565b9050600060015b828111611c4857611c1c8161186c565b15611c405780848381518110611c2e57fe5b60209081029190910101526001909101905b600101611c0c565b83945050505050611586565b60008060015b611c62611862565b8111611caa576000818152600960205260409020546001600160a01b0386811691161415611ca25783821415611c9b579150611cb09050565b6001909101905b600101611c5a565b50600080fd5b92915050565b600454600160a01b900460ff1615611ccd57600080fd5b611cd73385613a0b565b611ce057600080fd5b611ce98461186c565b15611cf357600080fd5b601054611d0a9085906001600160a01b0316613570565b601054604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b03163314611da757600080fd5b600454600160a01b900460ff16611dbd57600080fd5b6010546001600160a01b0316611dd257600080fd5b6011546001600160a01b0316611de757600080fd5b6016546001600160a01b031615611dfd57600080fd5b611e05613a2b565b565b6000546001600160a01b03163314611e1e57600080fd5b6001600160a01b038116611e3157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611e6e838383604051806020016040528060008152506128a0565b505050565b600c602052600090815260409020546001600160a01b031681565b6000808311611e9c57600080fd5b60008211611ea957600080fd5b600060088481548110611eb857fe5b90600052602060002090600202019050600060088481548110611ed757fe5b90600052602060002090600202019050611ef382868387613a67565b8015611f045750611f048486613c59565b95945050505050565b600454600160a01b900460ff1615611f2457600080fd5b611f2e3385613a0b565b611f3757600080fd5b611f4084612f5e565b611f4957600080fd5b601154611f609085906001600160a01b0316613570565b601154604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b6000546001600160a01b0316331480611feb57506001546001600160a01b031633145b8061200057506002546001600160a01b031633145b8061201557506003546001600160a01b031633145b8061202a57506004546001600160a01b031633145b61203357600080fd5b601255565b600454600160a01b900460ff161561204f57600080fd5b6120593382613a0b565b61206257600080fd5b6000908152600c6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120a757600080fd5b6001600160a01b0381166120ba57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600454600160a01b900460ff1681565b6009602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061212a57506001546001600160a01b031633145b8061213f57506002546001600160a01b031633145b8061215457506003546001600160a01b031633145b8061216957506004546001600160a01b031633145b61217257600080fd5b601254601354303191600190910102808211156121c4576004546040516001600160a01b039091169082840380156108fc02916000818181858888f19350505050158015611e6e573d6000803e3d6000fd5b5050565b6001546001600160a01b031681565b60008181526009602052604081205482906001600160a01b03166121fa57600080fd5b50506000908152600960205260409020546001600160a01b031690565b6016546001600160a01b031681565b6000546001600160a01b0316331461223d57600080fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b15801561227b57600080fd5b505afa15801561228f573d6000803e3d6000fd5b505050506040513d60208110156122a557600080fd5b50516122b057600080fd5b601080546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b0316331461230557600080fd5b600454600160a01b900460ff1661231b57600080fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600b602052600090815260409020546001600160a01b031681565b6000546001600160a01b03163314806123ad57506001546001600160a01b031633145b806123c257506002546001600160a01b031633145b806123d757506003546001600160a01b031633145b806123ec57506004546001600160a01b031633145b6123f557600080fd5b806001600160a01b03811661241257506002546001600160a01b03165b611d8660008060008a8a8a8a8a89613677565b60145463ffffffff1681565b6000546001600160a01b031633148061245457506001546001600160a01b031633145b8061246957506002546001600160a01b031633145b8061247e57506003546001600160a01b031633145b8061249357506004546001600160a01b031633145b61249c57600080fd5b600454600160a01b900460ff16156124b357600080fd5b6004805460ff60a01b1916600160a01b179055565b606060006124d5836122d3565b9050806124f2575050604080516000815260208101909152611327565b60608160405190808252806020026020018201604052801561251e578160200160208202803883390190505b509050600061252b611862565b9050600060015b828111612582576000818152600960205260409020546001600160a01b038881169116141561257a578084838151811061256857fe5b60209081029190910101526001909101905b600101612532565b8395505050505050611327565b6002546001600160a01b031681565b6000546001600160a01b03163314806125c157506001546001600160a01b031633145b806125d657506002546001600160a01b031633145b806125eb57506003546001600160a01b031633145b8061260057506004546001600160a01b031633145b61260957600080fd5b601060009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561265957600080fd5b505af115801561266d573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156126c157600080fd5b505af11580156119e5573d6000803e3d6000fd5b6000546001600160a01b03163314806126f857506001546001600160a01b031633145b8061270d57506002546001600160a01b031633145b8061272257506003546001600160a01b031633145b8061273757506004546001600160a01b031633145b61274057600080fd5b6014805463ffffffff191663ffffffff92909216919091179055565b6040518060400160405280600581526020016444524b4e5360d81b81525081565b60408051821515815290516001600160a01b0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a3336000908152600e602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b600454600160a01b900460ff161561280e57600080fd5b6001600160a01b03821661282157600080fd5b6001600160a01b03821630141561283757600080fd5b6010546001600160a01b038381169116141561285257600080fd5b6011546001600160a01b038381169116141561286d57600080fd5b6128773382613a0b565b61288057600080fd5b6121c433838361359e565b6003546001600160a01b031681565b60125481565b6001600160a01b0383166128b357600080fd5b6001600160a01b0383163014156128c957600080fd5b6010546001600160a01b03848116911614156128e457600080fd5b6011546001600160a01b03848116911614156128ff57600080fd5b600061290a836121d7565b9050846001600160a01b0316816001600160a01b03161461292a57600080fd5b6001600160a01b03811633148061295757506000838152600b60205260409020546001600160a01b031633145b8061298557506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61298e57600080fd5b61299985858561359e565b833b63ffffffff811615612ad557604051859080602f613ef3823960405190819003602f018120630a85bd0160e11b825233600483018181526001600160a01b038c81166024860152604485018b90526080606486019081528a5160848701528a516001600160e01b031990951696509087169463150b7a02948e938d938d939192909160a40190602085019080838360005b83811015612a44578181015183820152602001612a2c565b50505050905090810190601f168015612a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505050506040513d6020811015612abd57600080fd5b50516001600160e01b03191614612ad357600080fd5b505b505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b820191906000526020600020905b815481529060010190602001808311612b4657829003601f168201915b505050505081565b60008181526009602052604090205460609082906001600160a01b0316612b9157600080fd5b60408051604e80825260808201909252606090826020820181803883390190505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529394506000938993603093606093830182828015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b505050505090505b8215612c905784516001850194600a80860495069184830160f81b9188918110612c7357fe5b60200101906001600160f81b031916908160001a90535050612c4d565b6060848251016040519080825280601f01601f191660200182016040528015612cc0576020820181803883390190505b50905060005b8251811015612d1157828181518110612cdb57fe5b602001015160f81c60f81b828281518110612cf257fe5b60200101906001600160f81b031916908160001a905350600101612cc6565b5060005b85811015612d67578681600188030381518110612d2e57fe5b602001015160f81c60f81b828451830181518110612d4857fe5b60200101906001600160f81b031916908160001a905350600101612d15565b509998505050505050505050565b600454600090600160a01b900460ff1615612d8f57600080fd5b6003546001600160a01b03163314612da657600080fd5b600060088881548110612db557fe5b6000918252602090912060029091020160018101549091506001600160401b0316612ddf57600080fd5b612de881613cae565b612df157600080fd5b600181015460088054600160c01b90920463ffffffff16916000919083908110612e1757fe5b6000918252602090912060018086015460029093029091019081015490925063ffffffff600160e01b9283900481169290910416811015612e6657506001810154600160e01b900463ffffffff165b60008b905060008a905060008a905060008a905060008a905060008f905060006009600088815260200190815260200160002060009054906101000a90046001600160a01b031690506000612ecb888c8b60010163ffffffff16868b8b8b8b8a613677565b600089815260156020526040808220805467ffffffffffffffff19811660016001600160401b039283168101909216179091558f01805463ffffffff60c01b1916905560138054600019019055601254905192935033926108fc82150292818181858888f19350505050158015612f46573d6000803e3d6000fd5b509b5050505050505050505050509695505050505050565b6000808211612f6c57600080fd5b600060088381548110612f7b57fe5b90600052602060002090600202019050612f9481613cc4565b9392505050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b60008060008060008060008060008060008060088d8154811061301557fe5b906000526020600020906002020190506000600d60008f8152602001908152602001600020905081600001549c508160010160009054906101000a90046001600160401b03166001600160401b03169b508160010160089054906101000a90046001600160401b03166001600160401b03169a508160010160109054906101000a900463ffffffff1663ffffffff1699508160010160149054906101000a900463ffffffff1663ffffffff1698508160010160189054906101000a900463ffffffff1663ffffffff16975081600101601c9054906101000a900463ffffffff1663ffffffff1696508060000160009054906101000a90046001600160401b03166001600160401b031695508060000160089054906101000a90046001600160401b03166001600160401b031694508060000160109054906101000a90046001600160401b03166001600160401b031693508060000160189054906101000a90046001600160401b03166001600160401b03169250505091939597999b90929496989a50565b6000805481906001600160a01b03163314806131c057506001546001600160a01b031633145b806131d557506002546001600160a01b031633145b806131ea57506003546001600160a01b031633145b806131ff57506004546001600160a01b031633145b61320857600080fd5b50506010546011546001600160a01b03918216319116319091565b6010546001600160a01b031681565b600f5481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff161561327d57600080fd5b6132873382613a0b565b61329057600080fd5b61329981612f5e565b6132a257600080fd5b6132ac8183613cd9565b6132b557600080fd5b601154604080516362ae87ab60e11b81526004810185905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d602081101561332b57600080fd5b5051601254909150810134101561334157600080fd5b6011546012546040805163454a2ab360e01b81526004810187905290516001600160a01b039093169263454a2ab39234039160248082019260009290919082900301818588803b15801561339457600080fd5b505af11580156133a8573d6000803e3d6000fd5b5050505050611e6e8263ffffffff168463ffffffff16613d24565b600454600160a01b900460ff16156133da57600080fd5b6012543410156133e957600080fd5b6133f33383613a0b565b6133fc57600080fd5b6134068183613c59565b61340f57600080fd5b60006008838154811061341e57fe5b9060005260206000209060020201905061343781613cc4565b61344057600080fd5b60006008838154811061344f57fe5b9060005260206000209060020201905061346881613cc4565b61347157600080fd5b60018201805467ffffffffffffffff60401b1916600160401b426001600160401b0316021790556134a482858386613a67565b6134ad57600080fd5b6119e58484613d24565b600454600160a01b900460ff16156134ce57600080fd5b600f543410156134dd57600080fd5b6000828152600d6020526040902080546001600160401b0316821161350157600080fd5b6040805184815290517f191e0543c66edcea968f62447117864399037ec1d189931eee2ddcbd5d45489d9181900360200190a1505050565b6000546001600160a01b0316331461355057600080fd5b61355c60068585613e1e565b5061356960078383613e1e565b5050505050565b6000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b0319169091179055831615613631576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008963ffffffff168a1461368b57600080fd5b8863ffffffff16891461369d57600080fd5b8763ffffffff1688146136af57600080fd5b6136b7613e9c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c0820152613709613df7565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff16811461396457600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16139fb6000868361359e565b9c9b505050505050505050505050565b6000908152600960205260409020546001600160a01b0391821691161490565b6000546001600160a01b03163314613a4257600080fd5b600454600160a01b900460ff16613a5857600080fd5b6004805460ff60a01b19169055565b601454600084815260156020526040812054909163ffffffff166001600160401b0390911610613a9957506000613c51565b825485546e01ed09bead87c0378d8e640000000091829004919004808214613ac657600092505050613c51565b83861415613ad957600092505050613c51565b6001870154600160801b900463ffffffff16841480613b0857506001870154600160a01b900463ffffffff1684145b15613b1857600092505050613c51565b6001850154600160801b900463ffffffff16861480613b4757506001850154600160a01b900463ffffffff1686145b15613b5757600092505050613c51565b6001850154600160801b900463ffffffff161580613b8457506001870154600160801b900463ffffffff16155b15613b9457600192505050613c51565b60018781015490860154600160801b9182900463ffffffff90811692909104161480613bdf575060018088015490860154600160801b900463ffffffff908116600160a01b90920416145b15613bef57600092505050613c51565b60018088015490860154600160a01b900463ffffffff908116600160801b909204161480613c3a575060018781015490860154600160a01b9182900463ffffffff9081169290910416145b15613c4a57600092505050613c51565b6001925050505b949350505050565b60008181526009602052604080822054848352908220546001600160a01b03918216911680821480611f0457506000858152600c60205260409020546001600160a01b03908116908316149250505092915050565b60010154600160c01b900463ffffffff16151590565b60010154600160c01b900463ffffffff161590565b60008060088481548110613ce957fe5b90600052602060002090600202019050600060088481548110613d0857fe5b90600052602060002090600202019050611f0482868387613a67565b600060088381548110613d3357fe5b600091825260208083206001600290930201828101805463ffffffff8816600160c01b0263ffffffff60c01b19909116179055868452600c8252604080852080546001600160a01b0319908116909155878652818620805490911690556013805490940190935586845260098252928290205482516001600160a01b0391909116815290810186905280820185905290519192507f6b4808987a5cecdf67d54ca5dc20664fafca80ef7195097800c12549245ab20d919081900360600190a1505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e5f5782800160ff19823516178555613e8c565b82800160010185558215613e8c579182015b82811115613e8c578235825591602001919060010190613e71565b50613e98929150613ed8565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b61158691905b80821115613e985760008155600101613ede56fe6f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c6279746573296f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a265627a7a72305820a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b3864736f6c634300050a003268747470733a2f2f7777772e6472616b6f6e732e696f2f7365727665722f6170692f647261676f6e2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106104105760003560e01c80635d64aa681161021e578063a9059cbb11610123578063e0bb933b116100ab578063e985e9c51161007a578063e985e9c51461119a578063ed60ade6146111d5578063f7d8c883146111f8578063faa0ae531461121b578063faf421251461123e57610410565b8063e0bb933b146110c2578063e6be9b5614611142578063e6cbe35114611170578063e8de704d1461118557610410565b8063c0ac9983116100f2578063c0ac998314610fed578063c87b56dd14611002578063d1741a8c1461102c578063d3e6f49f14611083578063dbbc853b146110ad57610410565b8063a9059cbb14610ec6578063b047fb5014610eff578063b0c35c0514610f14578063b88d4fde14610f2957610410565b806378c234e0116101a65780638c267b97116101755780638c267b9714610e1c57806391876e5714610e3157806392695a8814610e4657806395d89b4114610e76578063a22cb46514610e8b57610410565b806378c234e014610d435780638368071c14610da65780638456cb5914610dd45780638462151c14610de957610410565b80636af04a57116101ed5780636af04a5714610c6b5780636fbde40d14610c8057806370a0823114610cb35780637158798814610ce657806371f7aaca14610d1957610410565b80635d64aa6814610bed5780635fd8c71014610c175780636059c38414610c2c5780636352211e14610c4157610410565b806323b872dd1161032457806342842e0e116102ac5780634b85fd551161027b5780634b85fd5514610b185780634dfff04f14610b425780634e0a337914610b7b5780634f6ccce714610bae5780635c975abb14610bd857610410565b806342842e0e14610a4c57806346116e6f14610a8257806346d22c7014610aac5780634ad8c93814610adc57610410565b80632e1699d7116102f35780632e1699d71461092a5780632f745c591461098f5780633d7d3f5a146109c85780633f4ba83a14610a04578063416da14514610a1957610410565b806323b872dd1461083357806327d7874c146108695780632a896ece1461089c5780632ba73c15146108f757610410565b8063100b2783116103a757806315437dfb1161037657806315437dfb1461075b57806318160ddd146107ac5780631940a936146107c15780632072863b146107eb57806321717ebf1461081e57610410565b8063100b2783146105fd57806312065fe01461065b57806314001f4c14610670578063150b7a02146106a357610410565b806306fdde03116103e357806306fdde0314610508578063081812fc14610592578063095ea7b3146105bc5780630a0f8168146105e857610410565b806301ffc9a71461043e5780630304b213146104865780630519ce79146104b057806305ea0668146104e1575b6010546001600160a01b031633148061043357506011546001600160a01b031633145b61043c57600080fd5b005b34801561044a57600080fd5b506104726004803603602081101561046157600080fd5b50356001600160e01b031916611309565b604080519115158252519081900360200190f35b34801561049257600080fd5b5061043c600480360360208110156104a957600080fd5b503561132c565b3480156104bc57600080fd5b506104c561139c565b604080516001600160a01b039092168252519081900360200190f35b3480156104ed57600080fd5b506104f66113ab565b60408051918252519081900360200190f35b34801561051457600080fd5b5061051d6113b1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561055757818101518382015260200161053f565b50505050905090810190601f1680156105845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561059e57600080fd5b506104c5600480360360208110156105b557600080fd5b50356113d4565b61043c600480360360408110156105d257600080fd5b506001600160a01b038135169060200135611414565b3480156105f457600080fd5b506104c56114cd565b34801561060957600080fd5b506106276004803603602081101561062057600080fd5b50356114dc565b604080516001600160401b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b34801561066757600080fd5b506104f6611516565b34801561067c57600080fd5b5061043c6004803603602081101561069357600080fd5b50356001600160a01b0316611589565b3480156106af57600080fd5b5061073e600480360360808110156106c657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460018302840111600160201b8311171561073357600080fd5b509092509050611636565b604080516001600160e01b03199092168252519081900360200190f35b34801561076757600080fd5b5061043c600480360360a081101561077e57600080fd5b508035906001600160401b03602082013581169160408101358216916060820135811691608001351661165b565b3480156107b857600080fd5b506104f6611862565b3480156107cd57600080fd5b50610472600480360360208110156107e457600080fd5b503561186c565b3480156107f757600080fd5b5061043c6004803603602081101561080e57600080fd5b50356001600160a01b03166118b0565b34801561082a57600080fd5b506104c56118fc565b61043c6004803603606081101561084957600080fd5b506001600160a01b0381358116916020810135909116906040013561190b565b34801561087557600080fd5b5061043c6004803603602081101561088c57600080fd5b50356001600160a01b03166119eb565b3480156108a857600080fd5b5061043c600480360360e08110156108bf57600080fd5b508035906020810135906040810135906001600160401b036060820135811691608081013582169160a0820135169060c00135611a37565b34801561090357600080fd5b5061043c6004803603602081101561091a57600080fd5b50356001600160a01b0316611b5c565b34801561093657600080fd5b5061093f611ba8565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561097b578181015183820152602001610963565b505050509050019250505060405180910390f35b34801561099b57600080fd5b506104f6600480360360408110156109b257600080fd5b506001600160a01b038135169060200135611c54565b3480156109d457600080fd5b5061043c600480360360808110156109eb57600080fd5b5080359060208101359060408101359060600135611cb6565b348015610a1057600080fd5b5061043c611d90565b348015610a2557600080fd5b5061043c60048036036020811015610a3c57600080fd5b50356001600160a01b0316611e07565b61043c60048036036060811015610a6257600080fd5b506001600160a01b03813581169160208101359091169060400135611e53565b348015610a8e57600080fd5b506104c560048036036020811015610aa557600080fd5b5035611e73565b348015610ab857600080fd5b5061047260048036036040811015610acf57600080fd5b5080359060200135611e8e565b348015610ae857600080fd5b5061043c60048036036080811015610aff57600080fd5b5080359060208101359060408101359060600135611f0d565b348015610b2457600080fd5b5061043c60048036036020811015610b3b57600080fd5b5035611fc8565b348015610b4e57600080fd5b5061043c60048036036040811015610b6557600080fd5b506001600160a01b038135169060200135612038565b348015610b8757600080fd5b5061043c60048036036020811015610b9e57600080fd5b50356001600160a01b0316612090565b348015610bba57600080fd5b506104f660048036036020811015610bd157600080fd5b5035611586565b348015610be457600080fd5b506104726120dc565b348015610bf957600080fd5b506104c560048036036020811015610c1057600080fd5b50356120ec565b348015610c2357600080fd5b5061043c612107565b348015610c3857600080fd5b506104c56121c8565b348015610c4d57600080fd5b506104c560048036036020811015610c6457600080fd5b50356121d7565b348015610c7757600080fd5b506104c5612217565b348015610c8c57600080fd5b5061043c60048036036020811015610ca357600080fd5b50356001600160a01b0316612226565b348015610cbf57600080fd5b506104f660048036036020811015610cd657600080fd5b50356001600160a01b03166122d3565b348015610cf257600080fd5b5061043c60048036036020811015610d0957600080fd5b50356001600160a01b03166122ee565b348015610d2557600080fd5b506104c560048036036020811015610d3c57600080fd5b503561236f565b348015610d4f57600080fd5b5061043c600480360360c0811015610d6657600080fd5b5080359060208101356001600160401b03908116916040810135821691606082013581169160808101359091169060a001356001600160a01b031661238a565b348015610db257600080fd5b50610dbb612425565b6040805163ffffffff9092168252519081900360200190f35b348015610de057600080fd5b5061043c612431565b348015610df557600080fd5b5061093f60048036036020811015610e0c57600080fd5b50356001600160a01b03166124c8565b348015610e2857600080fd5b506104c561258f565b348015610e3d57600080fd5b5061043c61259e565b348015610e5257600080fd5b5061043c60048036036020811015610e6957600080fd5b503563ffffffff166126d5565b348015610e8257600080fd5b5061051d61275c565b348015610e9757600080fd5b5061043c60048036036040811015610eae57600080fd5b506001600160a01b038135169060200135151561277d565b348015610ed257600080fd5b5061043c60048036036040811015610ee957600080fd5b506001600160a01b0381351690602001356127f7565b348015610f0b57600080fd5b506104c561288b565b348015610f2057600080fd5b506104f661289a565b61043c60048036036080811015610f3f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610f7957600080fd5b820183602082011115610f8b57600080fd5b803590602001918460018302840111600160201b83111715610fac57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128a0945050505050565b348015610ff957600080fd5b5061051d612add565b34801561100e57600080fd5b5061051d6004803603602081101561102557600080fd5b5035612b6b565b34801561103857600080fd5b506104f6600480360360c081101561104f57600080fd5b508035906020810135906001600160401b0360408201358116916060810135821691608082013581169160a0013516612d75565b34801561108f57600080fd5b50610472600480360360208110156110a657600080fd5b5035612f5e565b3480156110b957600080fd5b5061051d612f9b565b3480156110ce57600080fd5b506110ec600480360360208110156110e557600080fd5b5035612ff6565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561114e57600080fd5b5061115761319a565b6040805192835260208301919091528051918290030190f35b34801561117c57600080fd5b506104c5613223565b34801561119157600080fd5b506104f6613232565b3480156111a657600080fd5b50610472600480360360408110156111bd57600080fd5b506001600160a01b0381358116916020013516613238565b61043c600480360360408110156111eb57600080fd5b5080359060200135613266565b61043c6004803603604081101561120e57600080fd5b50803590602001356133c3565b61043c6004803603604081101561123157600080fd5b50803590602001356134b7565b34801561124a57600080fd5b5061043c6004803603604081101561126157600080fd5b810190602081018135600160201b81111561127b57600080fd5b82018360208201111561128d57600080fd5b803590602001918460018302840111600160201b831117156112ae57600080fd5b919390929091602081019035600160201b8111156112cb57600080fd5b8201836020820111156112dd57600080fd5b803590602001918460018302840111600160201b831117156112fe57600080fd5b509092509050613539565b6001600160e01b0319811660009081526005602052604090205460ff165b919050565b6000546001600160a01b031633148061134f57506001546001600160a01b031633145b8061136457506002546001600160a01b031633145b8061137957506003546001600160a01b031633145b8061138e57506004546001600160a01b031633145b61139757600080fd5b600f55565b6004546001600160a01b031681565b60135481565b604051806040016040528060078152602001664472616b6f6e7360c81b81525081565b60008181526009602052604081205482906001600160a01b03166113f757600080fd5b50506000908152600b60205260409020546001600160a01b031690565b600454600160a01b900460ff161561142b57600080fd5b6000818152600960205260409020546001600160a01b03163381148061147457506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61147d57600080fd5b6114878284613570565b81836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000546001600160a01b031681565b600d602052600090815260409020546001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b600080546001600160a01b031633148061153a57506001546001600160a01b031633145b8061154f57506002546001600160a01b031633145b8061156457506003546001600160a01b031633145b8061157957506004546001600160a01b031633145b61158257600080fd5b5030315b90565b6000546001600160a01b031633146115a057600080fd5b6000819050806001600160a01b03166376190f8f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115de57600080fd5b505afa1580156115f2573d6000803e3d6000fd5b505050506040513d602081101561160857600080fd5b505161161357600080fd5b601180546001600160a01b0319166001600160a01b039290921691909117905550565b60006040518080613f2260279139604051908190036027019020979650505050505050565b600454600160a01b900460ff161561167257600080fd5b6003546001600160a01b0316331461168957600080fd5b6000858152600d6020526040902080546001600160401b03908116908616116116b157600080fd5b80546001600160401b03600160401b909104811690851610156116d357600080fd5b80546001600160401b03600160801b909104811690841610156116f557600080fd5b80546001600160401b03600160c01b9091048116908316101561171757600080fd5b61171f613df7565b50604080516080810182526001600160401b03878116825286811660208084019182528783168486019081528784166060860190815260008d8152600d9093528683208651815495519351925167ffffffffffffffff199096169087161767ffffffffffffffff60401b1916600160401b938716939093029290921767ffffffffffffffff60801b1916600160801b91861691909102176001600160c01b0316600160c01b9390941692909202929092179055600f549251919233926108fc82150292818181858888f193505050501580156117ff573d6000803e3d6000fd5b50604080518881526001600160401b0380891660208301528088168284015280871660608301528516608082015290517f98677f77088375bf66a28fd8e22fe9e5bcdf31183e2f80c9cd9b92170df1b11e9181900360a00190a150505050505050565b6008546000190190565b600080821161187a57600080fd5b6008828154811061188757fe5b6000918252602090912060029091020160010154600160c01b900463ffffffff16151592915050565b6000546001600160a01b031633146118c757600080fd5b6001600160a01b0381166118da57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b031681565b600454600160a01b900460ff161561192257600080fd5b6001600160a01b03821661193557600080fd5b6001600160a01b03821630141561194b57600080fd5b6000611956826121d7565b9050836001600160a01b0316816001600160a01b03161461197657600080fd5b6001600160a01b0381163314806119a357506000828152600b60205260409020546001600160a01b031633145b806119d157506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b6119da57600080fd5b6119e584848461359e565b50505050565b6000546001600160a01b03163314611a0257600080fd5b6001600160a01b038116611a1557600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611a5a57506001546001600160a01b031633145b80611a6f57506002546001600160a01b031633145b80611a8457506003546001600160a01b031633145b80611a9957506004546001600160a01b031633145b611aa257600080fd5b6000611ab860008060008b898989600030613677565b601054909150611ad29082906001600160a01b0316613570565b601054604080516313f5f20560e11b815260048101849052602481018a9052604481018990526064810185905230608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b7357600080fd5b6001600160a01b038116611b8657600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b606060135460001415611bca5750604080516000815260208101909152611586565b6060601354604051908082528060200260200182016040528015611bf8578160200160208202803883390190505b5090506000611c05611862565b9050600060015b828111611c4857611c1c8161186c565b15611c405780848381518110611c2e57fe5b60209081029190910101526001909101905b600101611c0c565b83945050505050611586565b60008060015b611c62611862565b8111611caa576000818152600960205260409020546001600160a01b0386811691161415611ca25783821415611c9b579150611cb09050565b6001909101905b600101611c5a565b50600080fd5b92915050565b600454600160a01b900460ff1615611ccd57600080fd5b611cd73385613a0b565b611ce057600080fd5b611ce98461186c565b15611cf357600080fd5b601054611d0a9085906001600160a01b0316613570565b601054604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b505af1158015611d86573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b03163314611da757600080fd5b600454600160a01b900460ff16611dbd57600080fd5b6010546001600160a01b0316611dd257600080fd5b6011546001600160a01b0316611de757600080fd5b6016546001600160a01b031615611dfd57600080fd5b611e05613a2b565b565b6000546001600160a01b03163314611e1e57600080fd5b6001600160a01b038116611e3157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611e6e838383604051806020016040528060008152506128a0565b505050565b600c602052600090815260409020546001600160a01b031681565b6000808311611e9c57600080fd5b60008211611ea957600080fd5b600060088481548110611eb857fe5b90600052602060002090600202019050600060088481548110611ed757fe5b90600052602060002090600202019050611ef382868387613a67565b8015611f045750611f048486613c59565b95945050505050565b600454600160a01b900460ff1615611f2457600080fd5b611f2e3385613a0b565b611f3757600080fd5b611f4084612f5e565b611f4957600080fd5b601154611f609085906001600160a01b0316613570565b601154604080516313f5f20560e11b81526004810187905260248101869052604481018590526064810184905233608482015290516001600160a01b03909216916327ebe40a9160a48082019260009290919082900301818387803b158015611d7257600080fd5b6000546001600160a01b0316331480611feb57506001546001600160a01b031633145b8061200057506002546001600160a01b031633145b8061201557506003546001600160a01b031633145b8061202a57506004546001600160a01b031633145b61203357600080fd5b601255565b600454600160a01b900460ff161561204f57600080fd5b6120593382613a0b565b61206257600080fd5b6000908152600c6020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120a757600080fd5b6001600160a01b0381166120ba57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600454600160a01b900460ff1681565b6009602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061212a57506001546001600160a01b031633145b8061213f57506002546001600160a01b031633145b8061215457506003546001600160a01b031633145b8061216957506004546001600160a01b031633145b61217257600080fd5b601254601354303191600190910102808211156121c4576004546040516001600160a01b039091169082840380156108fc02916000818181858888f19350505050158015611e6e573d6000803e3d6000fd5b5050565b6001546001600160a01b031681565b60008181526009602052604081205482906001600160a01b03166121fa57600080fd5b50506000908152600960205260409020546001600160a01b031690565b6016546001600160a01b031681565b6000546001600160a01b0316331461223d57600080fd5b6000819050806001600160a01b03166385b861886040518163ffffffff1660e01b815260040160206040518083038186803b15801561227b57600080fd5b505afa15801561228f573d6000803e3d6000fd5b505050506040513d60208110156122a557600080fd5b50516122b057600080fd5b601080546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03166000908152600a602052604090205490565b6000546001600160a01b0316331461230557600080fd5b600454600160a01b900460ff1661231b57600080fd5b601680546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa4461993059181900360200190a150565b600b602052600090815260409020546001600160a01b031681565b6000546001600160a01b03163314806123ad57506001546001600160a01b031633145b806123c257506002546001600160a01b031633145b806123d757506003546001600160a01b031633145b806123ec57506004546001600160a01b031633145b6123f557600080fd5b806001600160a01b03811661241257506002546001600160a01b03165b611d8660008060008a8a8a8a8a89613677565b60145463ffffffff1681565b6000546001600160a01b031633148061245457506001546001600160a01b031633145b8061246957506002546001600160a01b031633145b8061247e57506003546001600160a01b031633145b8061249357506004546001600160a01b031633145b61249c57600080fd5b600454600160a01b900460ff16156124b357600080fd5b6004805460ff60a01b1916600160a01b179055565b606060006124d5836122d3565b9050806124f2575050604080516000815260208101909152611327565b60608160405190808252806020026020018201604052801561251e578160200160208202803883390190505b509050600061252b611862565b9050600060015b828111612582576000818152600960205260409020546001600160a01b038881169116141561257a578084838151811061256857fe5b60209081029190910101526001909101905b600101612532565b8395505050505050611327565b6002546001600160a01b031681565b6000546001600160a01b03163314806125c157506001546001600160a01b031633145b806125d657506002546001600160a01b031633145b806125eb57506003546001600160a01b031633145b8061260057506004546001600160a01b031633145b61260957600080fd5b601060009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561265957600080fd5b505af115801561266d573d6000803e3d6000fd5b50505050601160009054906101000a90046001600160a01b03166001600160a01b0316635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156126c157600080fd5b505af11580156119e5573d6000803e3d6000fd5b6000546001600160a01b03163314806126f857506001546001600160a01b031633145b8061270d57506002546001600160a01b031633145b8061272257506003546001600160a01b031633145b8061273757506004546001600160a01b031633145b61274057600080fd5b6014805463ffffffff191663ffffffff92909216919091179055565b6040518060400160405280600581526020016444524b4e5360d81b81525081565b60408051821515815290516001600160a01b0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a3336000908152600e602090815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b600454600160a01b900460ff161561280e57600080fd5b6001600160a01b03821661282157600080fd5b6001600160a01b03821630141561283757600080fd5b6010546001600160a01b038381169116141561285257600080fd5b6011546001600160a01b038381169116141561286d57600080fd5b6128773382613a0b565b61288057600080fd5b6121c433838361359e565b6003546001600160a01b031681565b60125481565b6001600160a01b0383166128b357600080fd5b6001600160a01b0383163014156128c957600080fd5b6010546001600160a01b03848116911614156128e457600080fd5b6011546001600160a01b03848116911614156128ff57600080fd5b600061290a836121d7565b9050846001600160a01b0316816001600160a01b03161461292a57600080fd5b6001600160a01b03811633148061295757506000838152600b60205260409020546001600160a01b031633145b8061298557506001600160a01b0381166000908152600e6020908152604080832033845290915290205460ff165b61298e57600080fd5b61299985858561359e565b833b63ffffffff811615612ad557604051859080602f613ef3823960405190819003602f018120630a85bd0160e11b825233600483018181526001600160a01b038c81166024860152604485018b90526080606486019081528a5160848701528a516001600160e01b031990951696509087169463150b7a02948e938d938d939192909160a40190602085019080838360005b83811015612a44578181015183820152602001612a2c565b50505050905090810190601f168015612a715780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612a9357600080fd5b505af1158015612aa7573d6000803e3d6000fd5b505050506040513d6020811015612abd57600080fd5b50516001600160e01b03191614612ad357600080fd5b505b505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b820191906000526020600020905b815481529060010190602001808311612b4657829003601f168201915b505050505081565b60008181526009602052604090205460609082906001600160a01b0316612b9157600080fd5b60408051604e80825260808201909252606090826020820181803883390190505060068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529394506000938993603093606093830182828015612c455780601f10612c1a57610100808354040283529160200191612c45565b820191906000526020600020905b815481529060010190602001808311612c2857829003601f168201915b505050505090505b8215612c905784516001850194600a80860495069184830160f81b9188918110612c7357fe5b60200101906001600160f81b031916908160001a90535050612c4d565b6060848251016040519080825280601f01601f191660200182016040528015612cc0576020820181803883390190505b50905060005b8251811015612d1157828181518110612cdb57fe5b602001015160f81c60f81b828281518110612cf257fe5b60200101906001600160f81b031916908160001a905350600101612cc6565b5060005b85811015612d67578681600188030381518110612d2e57fe5b602001015160f81c60f81b828451830181518110612d4857fe5b60200101906001600160f81b031916908160001a905350600101612d15565b509998505050505050505050565b600454600090600160a01b900460ff1615612d8f57600080fd5b6003546001600160a01b03163314612da657600080fd5b600060088881548110612db557fe5b6000918252602090912060029091020160018101549091506001600160401b0316612ddf57600080fd5b612de881613cae565b612df157600080fd5b600181015460088054600160c01b90920463ffffffff16916000919083908110612e1757fe5b6000918252602090912060018086015460029093029091019081015490925063ffffffff600160e01b9283900481169290910416811015612e6657506001810154600160e01b900463ffffffff165b60008b905060008a905060008a905060008a905060008a905060008f905060006009600088815260200190815260200160002060009054906101000a90046001600160a01b031690506000612ecb888c8b60010163ffffffff16868b8b8b8b8a613677565b600089815260156020526040808220805467ffffffffffffffff19811660016001600160401b039283168101909216179091558f01805463ffffffff60c01b1916905560138054600019019055601254905192935033926108fc82150292818181858888f19350505050158015612f46573d6000803e3d6000fd5b509b5050505050505050505050509695505050505050565b6000808211612f6c57600080fd5b600060088381548110612f7b57fe5b90600052602060002090600202019050612f9481613cc4565b9392505050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015612b635780601f10612b3857610100808354040283529160200191612b63565b60008060008060008060008060008060008060088d8154811061301557fe5b906000526020600020906002020190506000600d60008f8152602001908152602001600020905081600001549c508160010160009054906101000a90046001600160401b03166001600160401b03169b508160010160089054906101000a90046001600160401b03166001600160401b03169a508160010160109054906101000a900463ffffffff1663ffffffff1699508160010160149054906101000a900463ffffffff1663ffffffff1698508160010160189054906101000a900463ffffffff1663ffffffff16975081600101601c9054906101000a900463ffffffff1663ffffffff1696508060000160009054906101000a90046001600160401b03166001600160401b031695508060000160089054906101000a90046001600160401b03166001600160401b031694508060000160109054906101000a90046001600160401b03166001600160401b031693508060000160189054906101000a90046001600160401b03166001600160401b03169250505091939597999b90929496989a50565b6000805481906001600160a01b03163314806131c057506001546001600160a01b031633145b806131d557506002546001600160a01b031633145b806131ea57506003546001600160a01b031633145b806131ff57506004546001600160a01b031633145b61320857600080fd5b50506010546011546001600160a01b03918216319116319091565b6010546001600160a01b031681565b600f5481565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b600454600160a01b900460ff161561327d57600080fd5b6132873382613a0b565b61329057600080fd5b61329981612f5e565b6132a257600080fd5b6132ac8183613cd9565b6132b557600080fd5b601154604080516362ae87ab60e11b81526004810185905290516000926001600160a01b03169163c55d0f56916024808301926020929190829003018186803b15801561330157600080fd5b505afa158015613315573d6000803e3d6000fd5b505050506040513d602081101561332b57600080fd5b5051601254909150810134101561334157600080fd5b6011546012546040805163454a2ab360e01b81526004810187905290516001600160a01b039093169263454a2ab39234039160248082019260009290919082900301818588803b15801561339457600080fd5b505af11580156133a8573d6000803e3d6000fd5b5050505050611e6e8263ffffffff168463ffffffff16613d24565b600454600160a01b900460ff16156133da57600080fd5b6012543410156133e957600080fd5b6133f33383613a0b565b6133fc57600080fd5b6134068183613c59565b61340f57600080fd5b60006008838154811061341e57fe5b9060005260206000209060020201905061343781613cc4565b61344057600080fd5b60006008838154811061344f57fe5b9060005260206000209060020201905061346881613cc4565b61347157600080fd5b60018201805467ffffffffffffffff60401b1916600160401b426001600160401b0316021790556134a482858386613a67565b6134ad57600080fd5b6119e58484613d24565b600454600160a01b900460ff16156134ce57600080fd5b600f543410156134dd57600080fd5b6000828152600d6020526040902080546001600160401b0316821161350157600080fd5b6040805184815290517f191e0543c66edcea968f62447117864399037ec1d189931eee2ddcbd5d45489d9181900360200190a1505050565b6000546001600160a01b0316331461355057600080fd5b61355c60068585613e1e565b5061356960078383613e1e565b5050505050565b6000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038083166000818152600a60209081526040808320805460010190558583526009909152902080546001600160a01b0319169091179055831615613631576001600160a01b0383166000908152600a602090815260408083208054600019019055838352600c825280832080546001600160a01b0319908116909155600b909252909120805490911690555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008963ffffffff168a1461368b57600080fd5b8863ffffffff16891461369d57600080fd5b8763ffffffff1688146136af57600080fd5b6136b7613e9c565b506040805160e0810182528881526001600160401b0342166020820152600091810182905263ffffffff808d1660608301528b8116608083015260a082019290925290891660c0820152613709613df7565b6040518060800160405280866001600160401b03168152602001896001600160401b03168152602001886001600160401b03168152602001876001600160401b0316815250905060006001600884908060018154018082558091505090600182039060005260206000209060020201600090919290919091506000820151816000015560208201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010160086101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548163ffffffff021916908363ffffffff160217905550505003905081600d600083815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160106101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160186101000a8154816001600160401b0302191690836001600160401b031602179055509050508063ffffffff16811461396457600080fd5b606080840151608080860151865160c080890151604080516001600160a01b038e168152602081018a905263ffffffff9788168183015294871697850197909752938301919091529190921660a08301526001600160401b0389169082015290517fdf8d8992e7e860a8605ceb50aa640d5209227db91bcd9ec915a1d4c56d68a5b99181900360e00190a16139fb6000868361359e565b9c9b505050505050505050505050565b6000908152600960205260409020546001600160a01b0391821691161490565b6000546001600160a01b03163314613a4257600080fd5b600454600160a01b900460ff16613a5857600080fd5b6004805460ff60a01b19169055565b601454600084815260156020526040812054909163ffffffff166001600160401b0390911610613a9957506000613c51565b825485546e01ed09bead87c0378d8e640000000091829004919004808214613ac657600092505050613c51565b83861415613ad957600092505050613c51565b6001870154600160801b900463ffffffff16841480613b0857506001870154600160a01b900463ffffffff1684145b15613b1857600092505050613c51565b6001850154600160801b900463ffffffff16861480613b4757506001850154600160a01b900463ffffffff1686145b15613b5757600092505050613c51565b6001850154600160801b900463ffffffff161580613b8457506001870154600160801b900463ffffffff16155b15613b9457600192505050613c51565b60018781015490860154600160801b9182900463ffffffff90811692909104161480613bdf575060018088015490860154600160801b900463ffffffff908116600160a01b90920416145b15613bef57600092505050613c51565b60018088015490860154600160a01b900463ffffffff908116600160801b909204161480613c3a575060018781015490860154600160a01b9182900463ffffffff9081169290910416145b15613c4a57600092505050613c51565b6001925050505b949350505050565b60008181526009602052604080822054848352908220546001600160a01b03918216911680821480611f0457506000858152600c60205260409020546001600160a01b03908116908316149250505092915050565b60010154600160c01b900463ffffffff16151590565b60010154600160c01b900463ffffffff161590565b60008060088481548110613ce957fe5b90600052602060002090600202019050600060088481548110613d0857fe5b90600052602060002090600202019050611f0482868387613a67565b600060088381548110613d3357fe5b600091825260208083206001600290930201828101805463ffffffff8816600160c01b0263ffffffff60c01b19909116179055868452600c8252604080852080546001600160a01b0319908116909155878652818620805490911690556013805490940190935586845260098252928290205482516001600160a01b0391909116815290810186905280820185905290519192507f6b4808987a5cecdf67d54ca5dc20664fafca80ef7195097800c12549245ab20d919081900360600190a1505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e5f5782800160ff19823516178555613e8c565b82800160010185558215613e8c579182015b82811115613e8c578235825591602001919060010190613e71565b50613e98929150613ed8565b5090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b61158691905b80821115613e985760008155600101613ede56fe6f6e455243373231526563656976656428616464726573732c616464726573732c75696e743235362c6279746573296f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a265627a7a72305820a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b3864736f6c634300050a0032

Deployed Bytecode Sourcemap

83928:4367:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85746:11;;-1:-1:-1;;;;;85746:11:0;85724:10;:34;;:87;;-1:-1:-1;85797:13:0;;-1:-1:-1;;;;;85797:13:0;85775:10;:36;85724:87;85702:120;;;;;;83928:4367;16132:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16132:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16132:134:0;-1:-1:-1;;;;;;16132:134:0;;:::i;:::-;;;;;;;;;;;;;;;;;;43311:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43311:105:0;;:::i;2308:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2308:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;2308:33:0;;;;;;;;;;;;;;61510:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61510:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;47364:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47364:39:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;47364:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56022:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56022:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56022:156:0;;:::i;55131:614::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;55131:614:0;;;;;;;;:::i;2148:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2148:33:0;;;:::i;39123:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39123:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39123:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;39123:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88180:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88180:112:0;;;:::i;77889:485::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77889:485:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77889:485:0;-1:-1:-1;;;;;77889:485:0;;:::i;16274:210::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16274:210:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;16274:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;16274:210:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16274:210:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;16274:210:0;;-1:-1:-1;16274:210:0;-1:-1:-1;16274:210:0;:::i;:::-;;;;-1:-1:-1;;;;;;16274:210:0;;;;;;;;;;;;;;43426:902;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43426:902:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43426:902:0;;;-1:-1:-1;;;;;43426:902:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57768:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57768:94:0;;;:::i;65449:247::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65449:247:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65449:247:0;;:::i;4227:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4227:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4227:140:0;-1:-1:-1;;;;;4227:140:0;;:::i;39351:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39351:39:0;;;:::i;56660:976::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;56660:976:0;;;;;;;;;;;;;;;;;:::i;3649:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3649:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3649:140:0;-1:-1:-1;;;;;3649:140:0;;:::i;83129:725::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83129:725:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;83129:725:0;;;;;;;;;;;;;-1:-1:-1;;;;;83129:725:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;4516:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4516:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4516:140:0;-1:-1:-1;;;;;4516:140:0;;:::i;75715:670::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;75715:670:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75715:670:0;;;;;;;;;;;;;;;;;60164:442;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60164:442:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;60164:442:0;;;;;;;;:::i;78494:1023::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78494:1023:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;78494:1023:0;;;;;;;;;;;;;;;;;:::i;87324:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87324:286:0;;;:::i;3938:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3938:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3938:140:0;-1:-1:-1;;;;;3938:140:0;;:::i;52756:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52756:155:0;;;;;;;;;;;;;;;;;:::i;39060:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39060:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39060:56:0;;:::i;68523:401::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68523:401:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;68523:401:0;;;;;;;:::i;79685:836::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79685:836:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;79685:836:0;;;;;;;;;;;;;;;;;:::i;64492:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64492:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64492:95:0;;:::i;64074:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64074:195:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64074:195:0;;;;;;;;:::i;4805:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4805:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4805:140:0;-1:-1:-1;;;;;4805:140:0;;:::i;59503:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59503:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59503:107:0;;:::i;2451:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2451:26:0;;;:::i;38880:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38880:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38880:54:0;;:::i;87696:424::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;87696:424:0;;;:::i;2188:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2188:33:0;;;:::i;54463:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54463:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54463:147:0;;:::i;84049:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84049:33:0;;;:::i;77295:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77295:475:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77295:475:0;-1:-1:-1;;;;;77295:475:0;;:::i;50270:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50270:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50270:124:0;-1:-1:-1;;;;;50270:124:0;;:::i;85301:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85301:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85301:167:0;-1:-1:-1;;;;;85301:167:0;;:::i;38996:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38996:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38996:57:0;;:::i;82561:460::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;82561:460:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;82561:460:0;;;;;;;-1:-1:-1;;;;;82561:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;82561:460:0;;:::i;61549:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61549:32:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5406:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5406:83:0;;;:::i;58331:915::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58331:915:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58331:915:0;-1:-1:-1;;;;;58331:915:0;;:::i;2228:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2228:33:0;;;:::i;81705:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81705:145:0;;;:::i;76393:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76393:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76393:103:0;;;;:::i;47410:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47410:39:0;;;:::i;45622:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45622:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45622:203:0;;;;;;;;;;:::i;53299:1024::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53299:1024:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53299:1024:0;;;;;;;;:::i;2268:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2268:33:0;;;:::i;61412:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61412:38:0;;;:::i;51259:1130::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;51259:1130:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51259:1130:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51259:1130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51259:1130:0;;-1:-1:-1;51259:1130:0;;-1:-1:-1;;;;;51259:1130:0:i;15810:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15810:83:0;;;:::i;45833:1004::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45833:1004:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45833:1004:0;;:::i;73527:2180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73527:2180:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;73527:2180:0;;;;;;;;-1:-1:-1;;;;;73527:2180:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;65067:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65067:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65067:225:0;;:::i;15900:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15900:33:0;;;:::i;85969:990::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;85969:990:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85969:990:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81916:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81916:207:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39309:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39309:35:0;;;:::i;39260:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39260:40:0;;;:::i;45069:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45069:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45069:150:0;;;;;;;;;;:::i;80777:723::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;80777:723:0;;;;;;;:::i;70505:2095::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;70505:2095:0;;;;;;;:::i;44336:426::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44336:426:0;;;;;;;:::i;48580:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48580:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48580:173:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48580:173:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48580:173:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48580:173:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;48580:173:0;;-1:-1:-1;48580:173:0;-1:-1:-1;48580:173:0;:::i;16132:134::-;-1:-1:-1;;;;;;16226:32:0;;16202:4;16226:32;;;:19;:32;;;;;;;;16132:134;;;;:::o;43311:105::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;43385:14;:23;43311:105::o;2308:33::-;;;-1:-1:-1;;;;;2308:33:0;;:::o;61510:30::-;;;;:::o;47364:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47364:39:0;;;;:::o;56022:156::-;56107:7;39458:28;;;:18;:28;;;;;;56088:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;56139:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;56139:31:0;;56022:156::o;55131:614::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;55364:13;55380:28;;;:18;:28;;;;;;-1:-1:-1;;;;;55380:28:0;55436:10;55427:19;;;:52;;-1:-1:-1;;;;;;55450:17:0;;;;;;:10;:17;;;;;;;;55468:10;55450:29;;;;;;;;;;55427:52;55419:61;;;;;;55562:29;55571:8;55581:9;55562:8;:29::i;:::-;55728:8;55717:9;-1:-1:-1;;;;;55701:36:0;55710:5;-1:-1:-1;;;;;55701:36:0;;;;;;;;;;;5093:1;55131:614;;:::o;2148:33::-;;;-1:-1:-1;;;;;2148:33:0;;:::o;39123:53::-;;;;;;;;;;;;-1:-1:-1;;;;;39123:53:0;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;;-1:-1:-1;;;39123:53:0;;;;:::o;88180:112::-;88236:7;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;88271:4:0;88263:21;3491:1;88180:112;:::o;77889:485::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77968:36;78026:8;77968:67;;78238:17;-1:-1:-1;;;;;78238:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78238:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78238:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78238:40:0;78230:49;;;;;;78333:13;:33;;-1:-1:-1;;;;;;78333:33:0;-1:-1:-1;;;;;78333:33:0;;;;;;;;;;-1:-1:-1;77889:485:0:o;16274:210::-;16391:6;16423:52;;;;;;;;;;;;;;;;;;;16274:210;-1:-1:-1;;;;;;;16274:210:0:o;43426:902::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;43607:39;43649:23;;;:12;:23;;;;;43701:28;;-1:-1:-1;;;;;43701:28:0;;;43693:36;;;;43685:45;;;;;;43761:26;;-1:-1:-1;;;;;;;;43761:26:0;;;;;43749:38;;;;;43741:47;;;;;;43820:27;;-1:-1:-1;;;;;;;;43820:27:0;;;;;43807:40;;;;;43799:49;;;;;;43884:31;;-1:-1:-1;;;;;;;;43884:31:0;;;;;43867:48;;;;;43859:57;;;;;;43929:32;;:::i;:::-;-1:-1:-1;43964:168:0;;;;;;;;-1:-1:-1;;;;;43964:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44145:23:0;;;:12;:23;;;;;;:38;;;;;;;;;;-1:-1:-1;;44145:38:0;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;-1:-1:-1;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;-1:-1:-1;;;;;44145:38:0;-1:-1:-1;;;44145:38:0;;;;;;;;;;;;;;44214:14;;44194:35;;43964:168;;44194:10;;:35;;;;;;-1:-1:-1;44194:35:0;44214:14;44194:10;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;44245:73:0;;;;;;-1:-1:-1;;;;;44245:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3061:1;;43426:902;;;;;:::o;57768:94::-;57836:7;:14;-1:-1:-1;;57836:18:0;57768:94;:::o;65449:247::-;65524:4;65566:1;65554:9;:13;65546:22;;;;;;65652:7;65660:9;65652:18;;;;;;;;;;;;;;;;;;;;;:31;;;-1:-1:-1;;;65652:31:0;;;;:36;;;65449:247;-1:-1:-1;;65449:247:0:o;4227:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4304:21:0;;4296:30;;;;;;4339:10;:20;;-1:-1:-1;;;;;;4339:20:0;-1:-1:-1;;;;;4339:20:0;;;;;;;;;;4227:140::o;39351:39::-;;;-1:-1:-1;;;;;39351:39:0;;:::o;56660:976::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;56854:17:0;;56846:26;;;;;;-1:-1:-1;;;;;57123:20:0;;57138:4;57123:20;;57115:29;;;;;;57306:13;57322:17;57330:8;57322:7;:17::i;:::-;57306:33;;57367:5;-1:-1:-1;;;;;57358:14:0;:5;-1:-1:-1;;;;;57358:14:0;;57350:23;;;;;;-1:-1:-1;;;;;57393:19:0;;57402:10;57393:19;;:68;;-1:-1:-1;57416:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;57416:31:0;57451:10;57416:45;57393:68;:101;;;-1:-1:-1;;;;;;57465:17:0;;;;;;:10;:17;;;;;;;;57483:10;57465:29;;;;;;;;;;57393:101;57384:111;;;;;;57597:31;57607:5;57614:3;57619:8;57597:9;:31::i;:::-;5093:1;56660:976;;;:::o;3649:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;3726:21:0;;3718:30;;;;;;3761:10;:20;;-1:-1:-1;;;;;;3761:20:0;-1:-1:-1;;;;;3761:20:0;;;;;;;;;;3649:140::o;83129:725::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;83463:16;83482:82;83496:1;83499;83502;83505:4;83511:8;83521:9;83532:13;83547:1;83558:4;83482:13;:82::i;:::-;83602:11;;83463:101;;-1:-1:-1;83575:40:0;;83463:101;;-1:-1:-1;;;;;83602:11:0;83575:8;:40::i;:::-;83628:11;;:185;;;-1:-1:-1;;;83628:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;83795:4;83628:185;;;;;;-1:-1:-1;;;;;83628:11:0;;;;:25;;:185;;;;;:11;;:185;;;;;;;;:11;;:185;;;5:2:-1;;;;30:1;27;20:12;5:2;83628:185:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83628:185:0;;;;3491:1;83129:725;;;;;;;:::o;4516:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4593:21:0;;4585:30;;;;;;4628:10;:20;;-1:-1:-1;;;;;;4628:20:0;-1:-1:-1;;;;;4628:20:0;;;;;;;;;;4516:140::o;75715:670::-;75767:36;75822:15;;75841:1;75822:20;75818:560;;;-1:-1:-1;75866:16:0;;;75880:1;75866:16;;;;;;;;75859:23;;75818:560;75915:23;75955:15;;75941:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;75941:30:0;;75915:56;;75986:20;76009:13;:11;:13::i;:::-;75986:36;-1:-1:-1;76037:19:0;76127:1;76111:226;76142:12;76130:8;:24;76111:226;;76191:20;76202:8;76191:10;:20::i;:::-;76187:135;;;76258:8;76236:6;76243:11;76236:19;;;;;;;;;;;;;;;;;:30;76289:13;;;;;76187:135;76156:10;;76111:226;;;76360:6;76353:13;;;;;;;;60164:442;60248:16;;60327:1;60310:270;60335:13;:11;:13::i;:::-;60330:1;:18;60310:270;;60374:21;;;;:18;:21;;;;;;-1:-1:-1;;;;;60374:31:0;;;:21;;:31;60370:199;;;60439:6;60430:5;:15;60426:128;;;60477:1;-1:-1:-1;60470:8:0;;-1:-1:-1;60470:8:0;60426:128;60527:7;;;;;60426:128;60350:3;;60310:270;;;;60590:8;;;60164:442;;;;;:::o;78494:1023::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;78880:28;78886:10;78898:9;78880:5;:28::i;:::-;78872:37;;;;;;79127:21;79138:9;79127:10;:21::i;:::-;79126:22;79118:31;;;;;;79188:11;;79160:41;;79169:9;;-1:-1:-1;;;;;79188:11:0;79160:8;:41::i;:::-;79344:11;;:165;;;-1:-1:-1;;;79344:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;79488:10;79344:165;;;;;;-1:-1:-1;;;;;79344:11:0;;;;:25;;:165;;;;;:11;;:165;;;;;;;;:11;;:165;;;5:2:-1;;;;30:1;27;20:12;5:2;79344:165:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79344:165:0;;;;78494:1023;;;;:::o;87324:286::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;87396:11;;-1:-1:-1;;;;;87396:11:0;87380:43;;;;;;87450:13;;-1:-1:-1;;;;;87450:13:0;87434:45;;;;;;87498:18;;-1:-1:-1;;;;;87498:18:0;:32;87490:41;;;;;;87587:15;:13;:15::i;:::-;87324:286::o;3938:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4015:21:0;;4007:30;;;;;;4050:10;:20;;-1:-1:-1;;;;;;4050:20:0;-1:-1:-1;;;;;4050:20:0;;;;;;;;;;3938:140::o;52756:155::-;52861:42;52878:5;52885:3;52890:8;52861:42;;;;;;;;;;;;:16;:42::i;:::-;52756:155;;;:::o;39060:56::-;;;;;;;;;;;;-1:-1:-1;;;;;39060:56:0;;:::o;68523:401::-;68618:4;68660:1;68648:9;:13;68640:22;;;;;;68691:1;68681:7;:11;68673:20;;;;;;68704:21;68728:7;68736:9;68728:18;;;;;;;;;;;;;;;;;;68704:42;;68757:19;68779:7;68787;68779:16;;;;;;;;;;;;;;;;;;68757:38;;68813:52;68832:6;68840:9;68851:4;68857:7;68813:18;:52::i;:::-;:103;;;;;68878:38;68897:7;68906:9;68878:18;:38::i;:::-;68806:110;68523:401;-1:-1:-1;;;;;68523:401:0:o;79685:836::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80073:28;80079:10;80091:9;80073:5;:28::i;:::-;80065:37;;;;;;80121:25;80136:9;80121:14;:25::i;:::-;80113:34;;;;;;80186:13;;80158:43;;80167:9;;-1:-1:-1;;;;;80186:13:0;80158:8;:43::i;:::-;80346:13;;:167;;;-1:-1:-1;;;80346:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;80492:10;80346:167;;;;;;-1:-1:-1;;;;;80346:13:0;;;;:27;;:167;;;;;:13;;:167;;;;;;;;:13;;:167;;;5:2:-1;;;;30:1;27;20:12;64492:95:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;64561:12;:18;64492:95::o;64074:195::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;64186:26;64192:10;64204:7;64186:5;:26::i;:::-;64178:35;;;;;;64224:29;;;;:20;:29;;;;;:37;;-1:-1:-1;;;;;;64224:37:0;-1:-1:-1;;;;;64224:37:0;;;;;;;;;;64074:195::o;4805:140::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;-1:-1:-1;;;;;4882:21:0;;4874:30;;;;;;4917:10;:20;;-1:-1:-1;;;;;;4917:20:0;-1:-1:-1;;;;;4917:20:0;;;;;;;;;;4805:140::o;2451:26::-;;;-1:-1:-1;;;2451:26:0;;;;;:::o;38880:54::-;;;;;;;;;;;;-1:-1:-1;;;;;38880:54:0;;:::o;87696:424::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;87934:12;;87911:15;;87780:4;87772:21;;87929:1;87911:19;;;87910:36;87963:22;;;87959:154;;;88058:10;;:43;;-1:-1:-1;;;;;88058:10:0;;;;88078:22;;;88058:43;;;;;:10;:43;:10;:43;88078:22;88058:10;:43;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;87959:154:0;3491:1;;87696:424::o;2188:33::-;;;-1:-1:-1;;;;;2188:33:0;;:::o;54463:147::-;54542:7;39458:28;;;:18;:28;;;;;;54523:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;-1:-1:-1;;54574:28:0;;;;:18;:28;;;;;;-1:-1:-1;;;;;54574:28:0;;54463:147::o;84049:33::-;;;-1:-1:-1;;;;;84049:33:0;;:::o;77295:475::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;77372:34;77426:8;77372:63;;77638:17;-1:-1:-1;;;;;77638:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77638:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;77638:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77638:38:0;77630:47;;;;;;77731:11;:31;;-1:-1:-1;;;;;;77731:31:0;-1:-1:-1;;;;;77731:31:0;;;;;;;;;;-1:-1:-1;77295:475:0:o;50270:124::-;-1:-1:-1;;;;;50359:27:0;50326:13;50359:27;;;:19;:27;;;;;;;50270:124::o;85301:167::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;85384:18;:32;;-1:-1:-1;;;;;85384:32:0;;-1:-1:-1;;;;;;85384:32:0;;;;;;;;85432:28;;;;;;;;;;;;;;;;85301:167;:::o;38996:57::-;;;;;;;;;;;;-1:-1:-1;;;;;38996:57:0;;:::o;82561:460::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;82813:6;-1:-1:-1;;;;;82834:25:0;;82830:82;;-1:-1:-1;82890:10:0;;-1:-1:-1;;;;;82890:10:0;82830:82;82924:89;82938:1;82941;82944;82947:4;82953:8;82963:9;82974:13;82989:10;83001:11;82924:13;:89::i;61549:32::-;;;;;;:::o;5406:83::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;5468:6;:13;;-1:-1:-1;;;;5468:13:0;-1:-1:-1;;;5468:13:0;;;5406:83::o;58331:915::-;58392:28;58433:18;58454:17;58464:6;58454:9;:17::i;:::-;58433:38;-1:-1:-1;58488:15:0;58484:755;;-1:-1:-1;;58565:16:0;;;58579:1;58565:16;;;;;;;;58558:23;;58484:755;58614:23;58654:10;58640:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;58640:25:0;;58614:51;;58680:20;58703:13;:11;:13::i;:::-;58680:36;-1:-1:-1;58731:19:0;58970:1;58954:244;58985:12;58973:8;:24;58954:244;;59034:28;;;;:18;:28;;;;;;-1:-1:-1;;;;;59034:38:0;;;:28;;:38;59030:153;;;59119:8;59097:6;59104:11;59097:19;;;;;;;;;;;;;;;;;:30;59150:13;;;;;59030:153;58999:10;;58954:244;;;59221:6;59214:13;;;;;;;;;2228:33;;;-1:-1:-1;;;;;2228:33:0;;:::o;81705:145::-;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;81771:11;;;;;;;;;-1:-1:-1;;;;;81771:11:0;-1:-1:-1;;;;;81771:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81771:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81771:29:0;;;;81811:13;;;;;;;;;-1:-1:-1;;;;;81811:13:0;-1:-1:-1;;;;;81811:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81811:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;76393:103:0;3295:10;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;76465:14;:23;;-1:-1:-1;;76465:23:0;;;;;;;;;;;;76393:103::o;47410:39::-;;;;;;;;;;;;;;-1:-1:-1;;;47410:39:0;;;;:::o;45622:203::-;45714:47;;;;;;;;;;-1:-1:-1;;;;;45714:47:0;;;45729:10;;45714:47;;;;;;;;;45783:10;45772:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;45772:33:0;;;;;;;;;;;;;:45;;-1:-1:-1;;45772:45:0;;;;;;;;;;45622:203::o;53299:1024::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;-1:-1:-1;;;;;53501:17:0;;53493:26;;;;;;-1:-1:-1;;;;;53770:20:0;;53785:4;53770:20;;53762:29;;;;;;54030:11;;-1:-1:-1;;;;;54015:27:0;;;54030:11;;54015:27;;54007:36;;;;;;54077:13;;-1:-1:-1;;;;;54062:29:0;;;54077:13;;54062:29;;54054:38;;;;;;54160:27;54166:10;54178:8;54160:5;:27::i;:::-;54152:36;;;;;;54279;54289:10;54301:3;54306:8;54279:9;:36::i;2268:33::-;;;-1:-1:-1;;;;;2268:33:0;;:::o;61412:38::-;;;;:::o;51259:1130::-;-1:-1:-1;;;;;51389:17:0;;51381:26;;;;;;-1:-1:-1;;;;;51426:20:0;;51441:4;51426:20;;51418:29;;;;;;51481:11;;-1:-1:-1;;;;;51466:27:0;;;51481:11;;51466:27;;51458:36;;;;;;51528:13;;-1:-1:-1;;;;;51513:29:0;;;51528:13;;51513:29;;51505:38;;;;;;51707:13;51723:17;51731:8;51723:7;:17::i;:::-;51707:33;;51768:5;-1:-1:-1;;;;;51759:14:0;:5;-1:-1:-1;;;;;51759:14:0;;51751:23;;;;;;-1:-1:-1;;;;;51794:19:0;;51803:10;51794:19;;:68;;-1:-1:-1;51817:31:0;;;;:21;:31;;;;;;-1:-1:-1;;;;;51817:31:0;51852:10;51817:45;51794:68;:101;;;-1:-1:-1;;;;;;51866:17:0;;;;;;:10;:17;;;;;;;;51884:10;51866:29;;;;;;;;;;51794:101;51785:111;;;;;;51997:31;52007:5;52014:3;52019:8;51997:9;:31::i;:::-;52095:16;;52137:8;;;;52134:248;;52308:60;;52213:3;;52308:60;;;;;;;;;;;;;;;-1:-1:-1;;;52240:57:0;;52266:10;52240:57;;;;;;-1:-1:-1;;;;;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52240:129:0;;;;-1:-1:-1;52240:25:0;;;;;;52277:5;;52283:8;;52292:4;;52240:57;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52240:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52240:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52240:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52240:57:0;-1:-1:-1;;;;;;52240:129:0;;52232:138;;;;;;52134:248;;51259:1130;;;;;;:::o;15810:83::-;;;;;;;;;;;;;;;-1:-1:-1;;15810:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45833:1004::-;39498:1;39458:28;;;:18;:28;;;;;;45915:13;;45896:8;;-1:-1:-1;;;;;39458:28:0;39450:51;;;;;;46000:20;;;45963:2;46000:20;;;;;;;;;45976:21;;45963:2;46000:20;;;21:6:-1;;104:10;46000:20:0;87:34:-1;135:17;;-1:-1;;46169:14:0;46152:32;;;;;;;;-1:-1:-1;;46152:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45976:44;;-1:-1:-1;46031:6:0;;46071:8;;46105:2;;46120:21;;46152:32;;46169:14;46152:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46197:193;46204:16;;46197:193;;46330:13;;46339:3;;;;46268:2;46299:16;;;;46254;;46357:19;;;46346:32;;;46330:8;;:13;;;;;;;;;:48;-1:-1:-1;;;;;46330:48:0;;;;;;;;;46197:193;;;;46402:14;46447:1;46429:8;:15;:19;46419:30;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46419:30:0;87:34:-1;135:17;;-1:-1;46419:30:0;-1:-1:-1;46402:47:0;-1:-1:-1;46460:6:0;46522:83;46538:8;:15;46534:1;:19;46522:83;;;46582:8;46591:1;46582:11;;;;;;;;;;;;;;;;46575:1;46577;46575:4;;;;;;;;;;;:18;-1:-1:-1;;;;;46575:18:0;;;;;;;;-1:-1:-1;46555:3:0;;46522:83;;;-1:-1:-1;46670:1:0;46661:95;46677:1;46673;:5;46661:95;;;46725:8;46742:1;46738;46734;:5;:9;46725:19;;;;;;;;;;;;;;;;46700:1;46706:8;:15;46702:1;:19;46700:22;;;;;;;;;;;:44;-1:-1:-1;;;;;46700:44:0;;;;;;;;-1:-1:-1;46680:3:0;;46661:95;;;-1:-1:-1;46827:1:0;45833:1004;-1:-1:-1;;;;;;;;;45833:1004:0:o;73527:2180::-;5075:6;;73714:7;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;3039:10;;-1:-1:-1;;;;;3039:10:0;3025;:24;3017:33;;;;;;73794:21;73818:7;73826:9;73818:18;;;;;;;;;;;;;;;;;;;;;73910:16;;;;73818:18;;-1:-1:-1;;;;;;73910:16:0;73902:30;;;;;;74028:27;74048:6;74028:19;:27::i;:::-;74020:36;;;;;;74139:19;;;;74191:7;:15;;-1:-1:-1;;;74139:19:0;;;;;;74122:14;;74191:7;74139:19;;74191:15;;;;;;;;;;;;;;74308:17;;;;;74191:15;;;;;;;74340;;;;74191;;-1:-1:-1;74308:17:0;-1:-1:-1;;;74308:17:0;;;;;;;74340:15;;;;:35;-1:-1:-1;74336:95:0;;;-1:-1:-1;74404:15:0;;;;-1:-1:-1;;;74404:15:0;;;;74336:95;74501:16;74520:9;74501:28;;74540:14;74557:8;74540:25;;74576:15;74594:9;74576:27;;74614:19;74636:13;74614:35;;74660:16;74679:10;74660:29;;74702:16;74721:4;74702:23;;74771:13;74787:18;:28;74806:8;74787:28;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74787:28:0;74771:44;;74983:16;75002:107;75016:8;75026:6;75034:9;75046:1;75034:13;75002:107;;75049:8;75059:7;75068:8;75078:12;75092:9;75103:5;75002:13;:107::i;:::-;75171:18;;;;:8;:18;;;;;;:20;;-1:-1:-1;;75171:20:0;;;-1:-1:-1;;;;;75171:20:0;;;;;;;;;;;;75357:19;;75350:26;;-1:-1:-1;;;;75350:26:0;;;75457:15;:17;;-1:-1:-1;;75457:17:0;;;75619:12;;75599:33;;74983:126;;-1:-1:-1;75599:10:0;;:33;;;;;;75171:18;75599:33;75619:12;75599:10;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;75691:8:0;-1:-1:-1;;;;;;;;;;;;73527:2180:0;;;;;;;;:::o;65067:225::-;65146:4;65188:1;65176:9;:13;65168:22;;;;;;65201:21;65225:7;65233:9;65225:18;;;;;;;;;;;;;;;;;;65201:42;;65261:23;65277:6;65261:15;:23::i;:::-;65254:30;65067:225;-1:-1:-1;;;65067:225:0:o;15900:33::-;;;;;;;;;;;;;;;-1:-1:-1;;15900:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85969:990;86049:11;86071:17;86099;86127:16;86154:14;86179:20;86210:18;86239:17;86267:15;86293:16;86320:20;86359:21;86383:7;86391:3;86383:12;;;;;;;;;;;;;;;;;;86359:36;;86406:32;86441:12;:17;86454:3;86441:17;;;;;;;;;;;86406:52;;86477:6;:10;;;86471:16;;86518:6;:16;;;;;;;;;;-1:-1:-1;;;;;86518:16:0;-1:-1:-1;;;;;86510:25:0;86498:37;;86566:6;:16;;;;;;;;;;-1:-1:-1;;;;;86566:16:0;-1:-1:-1;;;;;86558:25:0;86546:37;;86613:6;:15;;;;;;;;;;;;86605:24;;86594:35;;86657:6;:13;;;;;;;;;;;;86649:22;;86640:31;;86705:6;:19;;;;;;;;;;;;86697:28;;86682:43;;86757:6;:17;;;;;;;;;;;;86749:26;;86736:39;;86798:11;:21;;;;;;;;;;-1:-1:-1;;;;;86798:21:0;-1:-1:-1;;;;;86786:33:0;;;86840:11;:19;;;;;;;;;;-1:-1:-1;;;;;86840:19:0;-1:-1:-1;;;;;86830:29:0;;;86881:11;:20;;;;;;;;;;-1:-1:-1;;;;;86881:20:0;-1:-1:-1;;;;;86870:31:0;;;86927:11;:24;;;;;;;;;;-1:-1:-1;;;;;86927:24:0;-1:-1:-1;;;;;86912:39:0;;;85969:990;;;;;;;;;;;;;;;:::o;81916:207::-;81980:7;3295:10;;81980:7;;-1:-1:-1;;;;;3295:10:0;3281;:24;;:65;;-1:-1:-1;3336:10:0;;-1:-1:-1;;;;;3336:10:0;3322;:24;3281:65;:106;;;-1:-1:-1;3377:10:0;;-1:-1:-1;;;;;3377:10:0;3363;:24;3281:106;:147;;;-1:-1:-1;3418:10:0;;-1:-1:-1;;;;;3418:10:0;3404;:24;3281:147;:188;;;-1:-1:-1;3459:10:0;;-1:-1:-1;;;;;3459:10:0;3445;:24;3281:188;3259:221;;;;;;-1:-1:-1;;82039:11:0;;82082:13;;-1:-1:-1;;;;;82039:11:0;;;82031:28;;82082:13;82074:30;81916:207;;:::o;39309:35::-;;;-1:-1:-1;;;;;39309:35:0;;:::o;39260:40::-;;;;:::o;45069:150::-;-1:-1:-1;;;;;45182:18:0;;;45153:4;45182:18;;;:10;:18;;;;;;;;:29;;;;;;;;;;;;;;;45069:150::o;80777:723::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;80984:28;80990:10;81002:9;80984:5;:28::i;:::-;80976:37;;;;;;81032:25;81047:9;81032:14;:25::i;:::-;81024:34;;;;;;81077:43;81101:9;81112:7;81077:23;:43::i;:::-;81069:52;;;;;;81210:13;;:38;;;-1:-1:-1;;;81210:38:0;;;;;;;;;;81187:20;;-1:-1:-1;;;;;81210:13:0;;:29;;:38;;;;;;;;;;;;;;:13;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;81210:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81210:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;81210:38:0;81295:12;;81210:38;;-1:-1:-1;81280:27:0;;81267:9;:40;;81259:49;;;;;;81377:13;;81413:12;;81377:58;;;-1:-1:-1;;;81377:58:0;;;;;;;;;;-1:-1:-1;;;;;81377:13:0;;;;:17;;81401:9;:24;;81377:58;;;;;:13;;:58;;;;;;;;81401:24;81377:13;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;81377:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81377:58:0;;;;;81446:46;81464:9;81446:46;;81483:7;81446:46;;:10;:46::i;70505:2095::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;70679:12;;70666:9;:25;;70658:34;;;;;;70753:28;70759:10;70771:9;70753:5;:28::i;:::-;70745:37;;;;;;71699:38;71718:7;71727:9;71699:18;:38::i;:::-;71691:47;;;;;;71804:21;71828:7;71836:9;71828:18;;;;;;;;;;;;;;;;;;71804:42;;71950:23;71966:6;71950:15;:23::i;:::-;71942:32;;;;;;72038:19;72060:7;72068;72060:16;;;;;;;;;;;;;;;;;;72038:38;;72178:21;72194:4;72178:15;:21::i;:::-;72170:30;;;;;;72246:16;;;:30;;-1:-1:-1;;;;72246:30:0;-1:-1:-1;;;72272:3:0;-1:-1:-1;;;;;72246:30:0;;;;;72358:135;72246:16;72420:9;72448:4;72471:7;72358:18;:135::i;:::-;72350:144;;;;;;72562:30;72573:9;72584:7;72562:10;:30::i;44336:426::-;5075:6;;-1:-1:-1;;;5075:6:0;;;;5074:7;5066:16;;;;;;44481:14;;44468:9;:27;;44460:36;;;;;;44509:39;44551:23;;;:12;:23;;;;;44601:28;;-1:-1:-1;;;;;44601:28:0;44593:36;;44585:45;;;;;;44648:29;;;;;;;;;;;;;;;;;5093:1;44336:426;;:::o;48580:173::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;48686:24;:14;48703:7;;48686:24;:::i;:::-;-1:-1:-1;48721:24:0;:14;48738:7;;48721:24;:::i;:::-;;48580:173;;;;:::o;49963:126::-;50038:31;;;;:21;:31;;;;;;:43;;-1:-1:-1;;;;;;50038:43:0;-1:-1:-1;;;;;50038:43:0;;;;;;;;;49963:126::o;39597:994::-;-1:-1:-1;;;;;39838:24:0;;;;;;;:19;:24;;;;;;;;:26;;;;;;39987:28;;;:18;:28;;;;;:34;;-1:-1:-1;;;;;;39987:34:0;;;;;;40123:19;;;40119:324;;-1:-1:-1;;;;;40159:26:0;;;;;;:19;:26;;;;;;;;:28;;-1:-1:-1;;40159:28:0;;;40283:30;;;:20;:30;;;;;40276:37;;-1:-1:-1;;;;;;40276:37:0;;;;;;40400:21;:31;;;;;;40393:38;;;;;;;40119:324;40574:8;40569:3;-1:-1:-1;;;;;40553:30:0;40562:5;-1:-1:-1;;;;;40553:30:0;;;;;;;;;;;39597:994;;;:::o;41490:1813::-;41792:4;41850:9;41835:26;;41822:9;:39;41814:48;;;;;;41907:7;41892:24;;41881:7;:35;41873:44;;;;;;41966:11;41951:28;;41936:11;:43;41928:52;;;;;;41993:21;;:::i;:::-;-1:-1:-1;42017:267:0;;;;;;;;;;;-1:-1:-1;;;;;42081:3:0;42017:267;;;;;-1:-1:-1;42017:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42297:33;;:::i;:::-;42333:173;;;;;;;;42372:10;-1:-1:-1;;;;;42333:173:0;;;;;42406:8;-1:-1:-1;;;;;42333:173:0;;;;;42439:9;-1:-1:-1;;;;;42333:173:0;;;;;42477:13;-1:-1:-1;;;;;42333:173:0;;;;42297:209;;42519:19;42565:1;42541:7;42554;42541:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42541:21:0;;;;;-1:-1:-1;;;;;42541:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;42519:47;;42607:13;42579:12;:25;42592:11;42579:25;;;;;;;;;;;:41;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42579:41:0;;;;;-1:-1:-1;;;;;42579:41:0;;;;;;;;;42814:11;42799:28;;42784:11;:43;42776:52;;;;;;42954:16;;;;;42994:14;;;;;43024:11;;43050:18;;;;;42879:225;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;42946:25;;;;42879:225;;;;42986:23;;;42879:225;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42879:225:0;;;;;;;;;;;;;;;;;43222:42;43240:1;43244:6;43252:11;43222:9;:42::i;:::-;43284:11;41490:1813;-1:-1:-1;;;;;;;;;;;;41490:1813:0:o;48967:148::-;49042:4;49066:28;;;:18;:28;;;;;;-1:-1:-1;;;;;49066:41:0;;;:28;;:41;;48967:148::o;5784:129::-;2595:10;;-1:-1:-1;;;;;2595:10:0;2581;:24;2573:33;;;;;;5222:6;;-1:-1:-1;;;5222:6:0;;;;5214:15;;;;;;5891:6;:14;;-1:-1:-1;;;;5891:14:0;;;5784:129::o;66107:1492::-;66344:14;;66296:4;66321:19;;;:8;:19;;;;;;66296:4;;66344:14;;-1:-1:-1;;;;;66321:19:0;;;:37;66318:81;;-1:-1:-1;66382:5:0;66375:12;;66318:81;66433:9;;66484:11;;66445:4;66433:16;;;;;66484:18;;66519:28;;;66515:71;;66569:5;66562:12;;;;;;66515:71;66661:7;66648:9;:20;66644:65;;;66692:5;66685:12;;;;;;66644:65;66777:16;;;;-1:-1:-1;;;66777:16:0;;;;:27;;;:56;;-1:-1:-1;66808:14:0;;;;-1:-1:-1;;;66808:14:0;;;;:25;;66777:56;66773:101;;;66857:5;66850:12;;;;;;66773:101;66890:14;;;;-1:-1:-1;;;66890:14:0;;;;:27;;;:56;;-1:-1:-1;66921:12:0;;;;-1:-1:-1;;;66921:12:0;;;;:25;;66890:56;66886:101;;;66970:5;66963:12;;;;;;66886:101;67126:14;;;;-1:-1:-1;;;67126:14:0;;;;:19;;:44;;-1:-1:-1;67149:16:0;;;;-1:-1:-1;;;67149:16:0;;;;:21;67126:44;67122:88;;;67194:4;67187:11;;;;;;67122:88;67304:16;;;;;67286:14;;;;-1:-1:-1;;;67304:16:0;;;;;;;;67286:14;;;;;:34;;:70;;-1:-1:-1;67342:14:0;;;;;67324;;;;-1:-1:-1;;;67324:14:0;;67342;67324;;;-1:-1:-1;;;67342:14:0;;;;67324:32;67286:70;67282:115;;;67380:5;67373:12;;;;;;67282:115;67427:16;;;;;67411:12;;;;-1:-1:-1;;;67411:12:0;;67427:16;67411:12;;;-1:-1:-1;;;67427:16:0;;;;67411:32;;:66;;-1:-1:-1;67463:14:0;;;;;67447:12;;;;-1:-1:-1;;;67463:14:0;;;;;;;;67447:12;;;;;:30;67411:66;67407:111;;;67501:5;67494:12;;;;;;67407:111;67587:4;67580:11;;;;66107:1492;;;;;;;:::o;63288:450::-;63375:4;63414:29;;;:18;:29;;;;;;;63474:27;;;;;;;-1:-1:-1;;;;;63414:29:0;;;;63474:27;63657:24;;;;:72;;-1:-1:-1;63685:29:0;;;;:20;:29;;;;;;-1:-1:-1;;;;;63685:29:0;;;:44;;;;63649:81;;;;63288:450;;;;:::o;64701:134::-;64801:20;;;-1:-1:-1;;;64801:20:0;;;;:25;;;64701:134::o;62681:369::-;63016:20;;;-1:-1:-1;;;63016:20:0;;;;:25;;62681:369::o;67780:298::-;67887:4;67909:21;67933:7;67941:9;67933:18;;;;;;;;;;;;;;;;;;67909:42;;67962:19;67984:7;67992;67984:16;;;;;;;;;;;;;;;;;;67962:38;;68018:52;68037:6;68045:9;68056:4;68062:7;68018:18;:52::i;69062:927::-;69248:21;69272:7;69280:9;69272:18;;;;;;;;;;;;;;;;69378:19;69272:18;;;;;69378:19;;;:37;;;;;-1:-1:-1;;;69378:37:0;-1:-1:-1;;;;69378:37:0;;;;;;69687:31;;;:20;:31;;;;;;69680:38;;-1:-1:-1;;;;;;69680:38:0;;;;;;69736:29;;;;;;69729:36;;;;;;;69849:15;:17;;;;;;;;69931:29;;;:18;:29;;;;;;;69922:59;;-1:-1:-1;;;;;69931:29:0;;;;69922:59;;;;;;;;;;;;;;;;69272:18;;-1:-1:-1;69922:59:0;;;;;;;;;;69062:927;;;:::o;83928:4367::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83928:4367:0;;;-1:-1:-1;83928:4367:0;:::i;:::-;;;:::o;:::-;;;;;;;;;-1:-1:-1;83928:4367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://a2519486d7e80a0b5f8dc4d89b1b059c0dc278b9f2a407309cb4f51303a42b38
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.