ETH Price: $3,422.80 (-0.51%)
Gas: 2 Gwei

Token

CryptoBrawlers (BRAWLER)
 

Overview

Max Total Supply

600 BRAWLER

Holders

94

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
duckingwhimsical.eth
Balance
2 BRAWLER
0xC1c0e9750fAB87ac871eA40D005063F3750fe143
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoBrawlers is the collectible fighting dApp. Don't just collect beautiful hand drawn NFT characters, but fight with them!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoBrawlers

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-06
*/

// File: contracts/lib/RandomNumber.sol

pragma solidity 0.8.2;

library RandomNumber {
    function randomNum(uint256 seed) internal returns (uint256) {
        uint256 _number =
            (uint256(
                keccak256(abi.encodePacked(blockhash(block.number - 1), seed))
            ) % 100);
        if (_number <= 0) {
            _number = 1;
        }

        return _number;
    }

    function rand1To10(uint256 seed) internal returns (uint256) {
        uint256 _number =
            (uint256(
                keccak256(abi.encodePacked(blockhash(block.number - 1), seed))
            ) % 10);
        if (_number <= 0) {
            _number = 10;
        }

        return _number;
    }

    function randDecimal(uint256 seed) internal returns (uint256) {
        return (rand1To10(seed) / 10);
    }

    function randomNumberToMax(uint256 seed, uint256 max)
        internal
        returns (uint256)
    {
        return (uint256(
            keccak256(abi.encodePacked(blockhash(block.number - 1), seed))
        ) % max);
    }

    function randomNumber1ToMax(uint256 seed, uint256 max)
        internal
        returns (uint256)
    {
        uint256 _number =
            (uint256(
                keccak256(abi.encodePacked(blockhash(block.number - 1), seed))
            ) % max);
        if (_number <= 0) {
            _number = max;
        }

        return _number;
    }
}

// File: contracts/base/Ownable.sol

pragma solidity 0.8.2;

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

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

    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner != address(0)) {
            owner = newOwner;
        }
    }
}

// File: contracts/fighter/FighterConfig.sol

pragma solidity 0.8.2;


contract FighterConfig is Ownable {
    uint256 public currentFighterCost = 50000000000000000 wei;

    string public constant LEGENDARY = "legendary";
    string public constant EPIC = "epic";
    string public constant RARE = "rare";
    string public constant UNCOMMON = "uncommon";
    string public constant COMMON = "common";

    // actually 1 higher than real life because of the issue with a 0 index fighter
    uint256 public maxFighters = 6561;
    uint256 public maxLegendaryFighters = 1;
    uint256 public maxEpicFighters = 5;
    uint256 public maxRareFighters = 25;
    uint256 public maxUncommonFighters = 125;
    uint256 public maxCommonFighters = 500;
    uint256 public maxFightersPerChar = 656;
    string public tokenMetadataEndpoint =
        "https://cryptobrawle.rs/api/getFighterInfo/";
    bool public isTrainingEnabled = false;

    uint256 public trainingFactor = 3;
    uint256 public trainingCost = 5000000000000000 wei; // cost of training in wei

    function setTrainingFactor(uint256 newFactor) external onlyOwner {
        trainingFactor = newFactor;
    }

    function setNewTrainingCost(uint256 newCost) external onlyOwner {
        trainingCost = newCost;
    }

    function enableTraining() external onlyOwner {
        isTrainingEnabled = true;
    }
}

// File: contracts/fighter/FighterBase.sol

pragma solidity 0.8.2;


contract FighterBase is FighterConfig {
    /*** EVENTS ***/
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Creation(
        address owner,
        uint256 fighterId,
        uint256 maxHealth,
        uint256 speed,
        uint256 strength,
        string rarity,
        string name,
        string imageHash,
        uint256 mintNum
    );
    event AttributeIncrease(
        address owner,
        uint256 fighterId,
        string attribute,
        uint256 increaseValue
    );
    event Healed(address owner, uint256 fighterId, uint256 maxHealth);

    struct Fighter {
        uint256 maxHealth;
        uint256 health;
        uint256 speed;
        uint256 strength;
        string name;
        string rarity;
        string image;
        uint256 mintNum;
    }

    /*** STORAGE ***/

    Fighter[] fighters;
    mapping(uint256 => address) public fighterIdToOwner; // lookup for owner of a specific fighter
    mapping(uint256 => address) public fighterIdToApproved; // Shows appoved address for sending of fighters, Needed for ERC721
    mapping(address => address[]) public ownerToOperators;
    mapping(address => uint256) internal ownedFightersCount;

    string[] public availableFighterNames;
    mapping(string => uint256) public indexOfAvailableFighterName;

    mapping(string => uint256) public rarityToSkillBuff;
    mapping(string => uint256) public fighterNameToMintedCount;
    mapping(string => mapping(string => string))
        public fighterNameToRarityImageHashes;
    mapping(string => mapping(string => uint256))
        public fighterNameToRarityCounts;

    function getMintedCountForFighterRarity(
        string memory _fighterName,
        string memory _fighterRarity
    ) external view returns (uint256 mintedCount) {
        return fighterNameToRarityCounts[_fighterName][_fighterRarity];
    }

    function addFighterCharacter(
        string memory newName,
        string memory legendaryImageHash,
        string memory epicImageHash,
        string memory rareImageHash,
        string memory uncommonImageHash,
        string memory commonImageHash
    ) external onlyOwner {
        indexOfAvailableFighterName[newName] = availableFighterNames.length;
        availableFighterNames.push(newName);
        fighterNameToMintedCount[newName] = 0;

        fighterNameToRarityImageHashes[newName][LEGENDARY] = legendaryImageHash;
        fighterNameToRarityImageHashes[newName][EPIC] = epicImageHash;
        fighterNameToRarityImageHashes[newName][RARE] = rareImageHash;
        fighterNameToRarityImageHashes[newName][UNCOMMON] = uncommonImageHash;
        fighterNameToRarityImageHashes[newName][COMMON] = commonImageHash;

        fighterNameToRarityCounts[newName][LEGENDARY] = 0;
        fighterNameToRarityCounts[newName][EPIC] = 0;
        fighterNameToRarityCounts[newName][RARE] = 0;
        fighterNameToRarityCounts[newName][UNCOMMON] = 0;
        fighterNameToRarityCounts[newName][COMMON] = 0;
    }

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

    function _transfer(
        address _from,
        address _to,
        uint256 _fighterId
    ) internal {
        fighterIdToOwner[_fighterId] = _to;
        ownedFightersCount[_to]++;

        // Check that it isn't a newly created fighter before messing with ownership values
        if (_from != address(0)) {
            // Remove any existing approvals for the token
            fighterIdToApproved[_fighterId] = address(0);
            ownedFightersCount[_from]--;
        }
        // Emit the transfer event.
        emit Transfer(_from, _to, _fighterId);
    }

    function _createFighter(
        uint256 _maxHealth,
        uint256 _speed,
        uint256 _strength,
        address _owner,
        string memory _rarity,
        string memory _name,
        uint256 _mintNum
    ) internal returns (uint256) {
        string memory _fighterImage =
            fighterNameToRarityImageHashes[_name][_rarity];
        Fighter memory _fighter =
            Fighter({
                maxHealth: _maxHealth,
                health: _maxHealth, // Fighters are always created with maximum health
                speed: _speed,
                strength: _strength,
                name: _name,
                rarity: _rarity,
                image: _fighterImage,
                mintNum: _mintNum
            });

        uint256 newFighterId = fighters.length;
        fighters.push(_fighter);

        emit Creation(
            _owner,
            newFighterId,
            _maxHealth,
            _speed,
            _strength,
            _rarity,
            _name,
            _fighterImage,
            _mintNum
        );

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

        return newFighterId;
    }

    function _updateFighterInStorage(
        Fighter memory _updatedFighter,
        uint256 _fighterId
    ) internal {
        fighters[_fighterId] = _updatedFighter;
    }

    function _trainSpeed(
        uint256 _fighterId,
        uint256 _attributeIncrease,
        address _owner
    ) internal {
        Fighter memory _fighter = fighters[_fighterId];
        _fighter.speed += _attributeIncrease;
        _updateFighterInStorage(_fighter, _fighterId);

        emit AttributeIncrease(_owner, _fighterId, "speed", _attributeIncrease);
    }

    function _trainStrength(
        uint256 _fighterId,
        uint256 _attributeIncrease,
        address _owner
    ) internal {
        Fighter memory _fighter = fighters[_fighterId];
        _fighter.strength += _attributeIncrease;
        _updateFighterInStorage(_fighter, _fighterId);

        emit AttributeIncrease(
            _owner,
            _fighterId,
            "strength",
            _attributeIncrease
        );
    }
}

// File: contracts/marketplace/MarketplaceConfig.sol

pragma solidity 0.8.2;



contract MarketplaceConfig is Ownable, FighterBase {
    uint256 public marketplaceCut = 5;
    struct Combatant {
        uint256 fighterId;
        Fighter fighter;
        uint256 damageModifier;
    }

    struct Sale {
        uint256 fighterId;
        uint256 price;
    }

    mapping(uint256 => Sale) public fighterIdToSale; // Storing of figher Ids against their sale Struct
    mapping(uint256 => uint256) public fighterIdToBrawl; // Map of fighter Ids to their max health

    event PurchaseSuccess(
        address buyer,
        uint256 price,
        uint256 fighterId,
        address seller
    );
    event FightComplete(
        address winner,
        uint256 winnerId,
        address loser,
        uint256 loserId
    );

    event MarketplaceRemoval(address owner, uint256 fighterId);
    event ArenaRemoval(address owner, uint256 fighterId);

    event MarketplaceAdd(address owner, uint256 fighterId, uint256 price);
    event ArenaAdd(address owner, uint256 fighterId);

    function setNewMarketplaceCut(uint256 _newCut) external onlyOwner {
        marketplaceCut = _newCut;
    }

    function withdrawBalance() external onlyOwner {
        payable(owner).transfer(address(this).balance);
    }

    function withdrawBalanceToAddress(address _recipient) external onlyOwner {
        payable(_recipient).transfer(address(this).balance);
    }

    function killContract() external onlyOwner {
        selfdestruct(payable(owner));
    }

    function _calculateCut(uint256 _totalPrice) internal returns (uint256) {
        return ((_totalPrice / 100) * marketplaceCut);
    }

    function _fighterIsForSale(uint256 _fighterId) internal returns (bool) {
        return (fighterIdToSale[_fighterId].price > 0);
    }

    function _fighterIsForBrawl(uint256 _fighterId) internal returns (bool) {
        return (fighterIdToBrawl[_fighterId] > 0);
    }

    function _removeFighterFromSale(uint256 _fighterId) internal {
        delete fighterIdToSale[_fighterId];
    }

    function _removeFighterFromArena(uint256 _fighterId) internal {
        delete fighterIdToBrawl[_fighterId];
    }
}

// File: contracts/marketplace/Marketplace.sol

pragma solidity 0.8.2;



contract Marketplace is MarketplaceConfig {
    function getPriceForFighter(uint256 _fighterId) external returns (uint256) {
        return fighterIdToSale[_fighterId].price;
    }

    function removeFighterFromSale(uint256 _fighterId) external {
        require(_owns(msg.sender, _fighterId));
        // Just double check we can actually remove a fighter before we go any further
        require(_fighterIsForSale(_fighterId));

        _removeFighterFromSale(_fighterId);
        emit MarketplaceRemoval(msg.sender, _fighterId);
    }

    function removeFighterFromArena(uint256 _fighterId) external {
        require(_owns(msg.sender, _fighterId));
        // Just double check we can actually remove a fighter before we go any further
        require(_fighterIsForBrawl(_fighterId));

        _removeFighterFromArena(_fighterId);
        emit ArenaRemoval(msg.sender, _fighterId);
    }

    function makeFighterAvailableForSale(uint256 _fighterId, uint256 _price)
        external
    {
        require(_owns(msg.sender, _fighterId));
        // Fighters can't be both for sale and open for brawling
        require(!_fighterIsForBrawl(_fighterId));
        require(_price > 0);

        // Double check there is not an existing third party transfer approval
        require(fighterIdToApproved[_fighterId] == address(0));

        fighterIdToSale[_fighterId] = Sale({
            fighterId: _fighterId,
            price: _price
        });
        emit MarketplaceAdd(msg.sender, _fighterId, _price);
    }

    function makeFighterAvailableForBrawl(uint256 _fighterId) external {
        require(_owns(msg.sender, _fighterId));
        // Fighters can't be both for sale and open for brawling
        require(!_fighterIsForSale(_fighterId));
        // We don't want fighters being added twice
        require(!_fighterIsForBrawl(_fighterId));

        // Double check there is not an existing third party transfer approval
        require(fighterIdToApproved[_fighterId] == address(0));

        fighterIdToBrawl[_fighterId] = _fighterId;
        emit ArenaAdd(msg.sender, _fighterId);
    }

    function buyFighter(uint256 _fighterId) external payable {
        address _seller = fighterIdToOwner[_fighterId];
        _makePurchase(_fighterId, msg.value);
        _transfer(_seller, msg.sender, _fighterId);

        emit PurchaseSuccess(msg.sender, msg.value, _fighterId, _seller);
    }

    function _strike(
        uint256 _attackerId,
        uint256 _defenderId,
        uint256 _attackerStrength,
        uint256 _defenderStrength,
        uint256 _seed
    ) internal returns (bool) {
        uint256 _attackerAttackRoll =
            RandomNumber.randomNumber1ToMax(_seed, 20) + _attackerStrength;
        uint256 _defenderDefenseRoll =
            RandomNumber.randomNumber1ToMax(_seed * 3, 20) + _defenderStrength;

        if (_attackerAttackRoll >= _defenderDefenseRoll) {
            return true;
        }

        return false;
    }

    function _performFight(
        uint256 _attackerId,
        uint256 _defenderId,
        Fighter memory _attacker,
        Fighter memory _defender,
        uint256 _seed
    ) internal returns (uint256 winnerId, uint256 loserId) {
        uint256 _generatedSeed =
            RandomNumber.randomNumber1ToMax(_seed, 99999999);
        uint256 _totalSpeed = _attacker.speed + _defender.speed;
        uint256 _attackerSpeedRoll =
            RandomNumber.randomNumber1ToMax(_seed, 20) + _attacker.speed;
        uint256 _defenderSpeedRoll =
            RandomNumber.randomNumber1ToMax(_generatedSeed, 20) +
                _defender.speed;

        bool _attackerIsStrikingFirst =
            _attackerSpeedRoll >= _defenderSpeedRoll;

        if (_attackerIsStrikingFirst) {
            if (
                _strike(
                    _attackerId,
                    _defenderId,
                    _attacker.strength,
                    _defender.strength,
                    _seed * 2
                )
            ) {
                return (_attackerId, _defenderId);
            }
        } else {
            if (
                _strike(
                    _defenderId,
                    _attackerId,
                    _defender.strength,
                    _attacker.strength,
                    _generatedSeed * 2
                )
            ) {
                return (_defenderId, _attackerId);
            }
        }

        if (_attackerIsStrikingFirst) {
            if (
                _strike(
                    _defenderId,
                    _attackerId,
                    _defender.strength,
                    _attacker.strength,
                    _generatedSeed * 3
                )
            ) {
                return (_defenderId, _attackerId);
            }
        } else {
            if (
                _strike(
                    _attackerId,
                    _defenderId,
                    _attacker.strength,
                    _defender.strength,
                    _seed * 3
                )
            ) {
                return (_attackerId, _defenderId);
            }
        }

        uint256 _defenderEndCheck =
            _defender.speed +
                _defender.strength +
                RandomNumber.randomNumber1ToMax(_generatedSeed, 20);
        uint256 _attackerEndCheck =
            _attacker.speed +
                _attacker.strength +
                RandomNumber.randomNumber1ToMax(_seed, 20);

        if (_defenderEndCheck >= _attackerEndCheck) {
            return (_defenderId, _attackerId);
        }
        return (_attackerId, _defenderId);
    }

    function fight(
        uint256 _attackerId,
        uint256 _defenderId,
        uint256 _seed
    ) external {
        Fighter memory _attacker = fighters[_attackerId];
        Fighter memory _defender = fighters[_defenderId];
        // fighter actually in the arena is always the defender
        require(_fighterIsForBrawl(_defenderId));
        // Make sure the challenger is actually sending the transaction
        require(_owns(msg.sender, _attackerId));
        // Also make sure that the challenger is not attacking his own fighter
        require(!_owns(msg.sender, _defenderId));
        // Ensure that a 'stronger' fighter is not attacking a 'weaker' fighter
        require(
            (_attacker.speed + _attacker.strength) <=
                (_defender.speed + _defender.strength)
        );

        (uint256 _winnerId, uint256 _loserId) =
            _performFight(
                _attackerId,
                _defenderId,
                _attacker,
                _defender,
                _seed
            );

        if (_fighterIsForBrawl(_winnerId)) {
            _removeFighterFromArena(_winnerId);
        } else {
            _removeFighterFromArena(_loserId);
        }
        address _winnerAddress = fighterIdToOwner[_winnerId];
        address _loserAddress = fighterIdToOwner[_loserId];

        _transfer(_loserAddress, _winnerAddress, _loserId);
        emit FightComplete(_winnerAddress, _winnerId, _loserAddress, _loserId);
    }

    function _makePurchase(uint256 _fighterId, uint256 _price) internal {
        require(!_owns(msg.sender, _fighterId));
        require(_fighterIsForSale(_fighterId));
        require(_price >= fighterIdToSale[_fighterId].price);

        address sellerAddress = fighterIdToOwner[_fighterId];
        _removeFighterFromSale(_fighterId);

        uint256 saleCut = _calculateCut(_price);
        uint256 totalSale = _price - saleCut;
        payable(sellerAddress).transfer(totalSale);
    }
}

// File: contracts/lib/Integers.sol

pragma solidity 0.8.2;

library Integers {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

// File: contracts/base/ERC721.sol

pragma solidity 0.8.2;

abstract contract ERC721 {
    // Required methods
    function totalSupply() public view virtual returns (uint256 total) {}

    function balanceOf(address _owner)
        public
        view
        virtual
        returns (uint256 balance)
    {}

    function ownerOf(uint256 _tokenId)
        external
        view
        virtual
        returns (address owner)
    {}

    function approve(address _to, uint256 _tokenId) external virtual {}

    function transfer(address _to, uint256 _tokenId) external virtual {}

    function tokenURI(uint256 _tokenId)
        external
        view
        virtual
        returns (string memory _tokenURI)
    {}

    function baseURI() external view virtual returns (string memory _baseURI) {}

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external virtual {}

    function getApproved(uint256 _tokenId)
        external
        virtual
        returns (address _approvedAddress)
    {}

    function setApprovalForAll(address _to, bool approved) external virtual {}

    function isApprovedForAll(address _owner, address _operator)
        external
        virtual
        returns (bool isApproved)
    {}

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external virtual {}

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes calldata _data
    ) external virtual {}

    // Events
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function _isContract(address _addr)
        internal
        view
        returns (bool isContract)
    {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID)
        external
        view
        virtual
        returns (bool)
    {}

    /// @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.
    /// @notice 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 virtual returns (bytes4) {}
}

// File: contracts/base/Priced.sol

pragma solidity 0.8.2;

contract Priced {
    modifier costs(uint256 price) {
        if (msg.value >= price) {
            _;
        }
    }
}

// File: contracts/base/Pausable.sol

pragma solidity 0.8.2;


contract Pausable is Ownable {
    bool public isPaused = false;

    modifier whenNotPaused() {
        require(!isPaused);
        _;
    }

    function pause() external onlyOwner {
        isPaused = true;
    }

    function unPause() external onlyOwner {
        isPaused = false;
    }
}

// File: contracts/base/IERC721Receiver.sol

pragma solidity ^0.8.2;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: contracts/fighter/FighterTraining.sol

pragma solidity 0.8.2;


contract FighterTraining is FighterBase {
    function _train(
        uint256 _fighterId,
        string memory _attribute,
        uint256 _attributeIncrease
    ) internal {
        if (
            keccak256(abi.encodePacked(_attribute)) ==
            keccak256(abi.encodePacked("strength"))
        ) {
            _trainStrength(_fighterId, _attributeIncrease, msg.sender);
        } else if (
            keccak256(abi.encodePacked(_attribute)) ==
            keccak256(abi.encodePacked("speed"))
        ) {
            _trainSpeed(_fighterId, _attributeIncrease, msg.sender);
        }
    }
}

// File: contracts/fighter/FighterOwnership.sol

pragma solidity 0.8.2;











contract FighterOwnership is
    FighterConfig,
    FighterBase,
    FighterTraining,
    ERC721,
    Priced,
    Pausable,
    MarketplaceConfig
{
    using Integers for uint256;
    /// @notice Name and symbol of the non fungible token, as defined in ERC721.
    string public constant name = "CryptoBrawlers";
    string public constant symbol = "BRAWLER";
    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

    bytes4 constant InterfaceSignature_ERC165 =
        bytes4(keccak256("supportsInterface(bytes4)"));
    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /// @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
        override
        returns (bool)
    {
        return ((_interfaceID == InterfaceSignature_ERC165) ||
            (_interfaceID == _INTERFACE_ID_ERC721) ||
            (_interfaceID == _INTERFACE_ID_ERC721_METADATA));
    }

    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes calldata _data
    ) external pure override returns (bytes4) {
        revert();
    }

    // Internal utility functions: These functions all assume that their input arguments
    // are valid. We leave it to public methods to sanitize their inputs and follow
    // the required logic.

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

        bool _senderIsOperator = false;
        address _owner = fighterIdToOwner[_tokenId];
        address[] memory _validOperators = ownerToOperators[_owner];

        uint256 _operatorIndex;
        for (
            _operatorIndex = 0;
            _operatorIndex < _validOperators.length;
            _operatorIndex++
        ) {
            if (_validOperators[_operatorIndex] == _claimant) {
                _senderIsOperator = true;
                break;
            }
        }

        return _senderIsOperator;
    }

    /// @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.
    function _approve(uint256 _tokenId, address _approved) internal {
        fighterIdToApproved[_tokenId] = _approved;
    }

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

    /// @notice Transfers a Fighter to another address. If transferring to a smart
    /// contract be VERY CAREFUL to ensure that it is aware of ERC-721.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _tokenId The ID of the fighter to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _tokenId) external override {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
        // You can only send your own fighter.
        require(_owns(msg.sender, _tokenId));
        // If transferring we can't keep a fighter in the arena...
        if (_fighterIsForBrawl(_tokenId)) {
            _removeFighterFromArena(_tokenId);
            emit ArenaRemoval(msg.sender, _tokenId);
        }

        // ...nor can they be in our marketplace.
        if (_fighterIsForSale(_tokenId)) {
            _removeFighterFromSale(_tokenId);
            emit MarketplaceRemoval(msg.sender, _tokenId);
        }

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

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

        // If selling on an external marketplace we can't keep a fighter in the arena...
        if (_fighterIsForBrawl(_tokenId)) {
            _removeFighterFromArena(_tokenId);
            emit ArenaRemoval(msg.sender, _tokenId);
        }

        // ...nor can they be in our marketplace.
        if (_fighterIsForSale(_tokenId)) {
            _removeFighterFromSale(_tokenId);
            emit MarketplaceRemoval(msg.sender, _tokenId);
        }
        // Register the approval (replacing any previous approval).
        _approve(_tokenId, _to);

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

    /// @notice Transfer a fighter 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 fighter to be transfered.
    /// @param _to The address that should take ownership of the fighter. Can be any address,
    ///  including the caller.
    /// @param _tokenId The ID of the fighter to be transferred.
    /// @dev Required for ERC-721 compliance.
    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external override {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, _tokenId));
        require(_owns(_from, _tokenId));

        // This should never be the case, but might as well check
        if (_fighterIsForBrawl(_tokenId)) {
            _removeFighterFromArena(_tokenId);
            emit ArenaRemoval(msg.sender, _tokenId);
        }

        // ...nor can they be in our marketplace.
        if (_fighterIsForSale(_tokenId)) {
            _removeFighterFromSale(_tokenId);
            emit MarketplaceRemoval(msg.sender, _tokenId);
        }

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        _transfer(_from, _to, _tokenId);
        // Remove an existing external approval to move the fighter.
        _approve(_tokenId, address(0));
    }

    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal {
        // This should never be the case, but might as well check
        if (_fighterIsForBrawl(_tokenId)) {
            _removeFighterFromArena(_tokenId);
            emit ArenaRemoval(msg.sender, _tokenId);
        }

        // ...nor can they be in our marketplace.
        if (_fighterIsForSale(_tokenId)) {
            _removeFighterFromSale(_tokenId);
            emit MarketplaceRemoval(msg.sender, _tokenId);
        }

        // Reassign ownership (also clears pending approvals and emits Transfer event).
        _transfer(_from, _to, _tokenId);
        // Remove an existing external approval to move the fighter.
        _approve(_tokenId, address(0));
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external override {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, _tokenId));
        require(_owns(_from, _tokenId));

        _safeTransferFrom(_from, _to, _tokenId);

        if (_isContract(_to)) {
            bytes4 retval =
                IERC721Receiver(_to).onERC721Received(_from, _to, _tokenId, "");
            require(ERC721_RECEIVED == retval);
        }
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes calldata _data
    ) external override {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
        // Check for approval and valid ownership
        require(_approvedFor(msg.sender, _tokenId));
        require(_owns(_from, _tokenId));

        _safeTransferFrom(_from, _to, _tokenId);

        if (_isContract(_to)) {
            bytes4 retval =
                IERC721Receiver(_to).onERC721Received(
                    _from,
                    _to,
                    _tokenId,
                    _data
                );
            require(ERC721_RECEIVED == retval);
        }
    }

    function getApproved(uint256 _tokenId)
        external
        view
        override
        returns (address _approvedAddress)
    {
        return fighterIdToApproved[_tokenId];
    }

    function setApprovalForAll(address _to, bool _approved) external override {
        address[] memory _operatorsForSender = ownerToOperators[msg.sender];
        if (_approved) {
            ownerToOperators[msg.sender].push(_to);
        }

        if (!_approved) {
            if (ownerToOperators[msg.sender].length == 0) {
                emit ApprovalForAll(msg.sender, _to, false);
                return;
            }

            uint256 _operatorIndex;
            for (
                _operatorIndex = 0;
                _operatorIndex < _operatorsForSender.length;
                _operatorIndex++
            ) {
                if (ownerToOperators[msg.sender][_operatorIndex] == _to) {
                    ownerToOperators[msg.sender][
                        _operatorIndex
                    ] = ownerToOperators[msg.sender][
                        ownerToOperators[msg.sender].length - 1
                    ];
                    ownerToOperators[msg.sender].pop();
                    break;
                }
            }
        }

        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        override
        returns (bool isApproved)
    {
        address[] memory _operatorsForSender = ownerToOperators[_owner];

        if (_operatorsForSender.length == 0) {
            return false;
        }
        bool _isApproved = true;
        uint256 _operatorIndex;
        for (
            _operatorIndex = 0;
            _operatorIndex < _operatorsForSender.length;
            _operatorIndex++
        ) {
            if (_operatorsForSender[_operatorIndex] != _operator) {
                _isApproved = false;
                break;
            }
        }

        return _isApproved;
    }

    /// @notice Returns the total number of fighters currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view override returns (uint256) {
        return fighters.length - 1; // -1 because of the phantom 0 index fighter that doesn't play nicely
    }

    /// @notice Returns the address currently assigned ownership of a given fighter.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _tokenId)
        external
        view
        override
        returns (address owner)
    {
        owner = fighterIdToOwner[_tokenId];
        require(owner != address(0));

        return owner;
    }

    function tokenURI(uint256 _tokenId)
        external
        view
        override
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(tokenMetadataEndpoint, _tokenId.toString())
            );
    }

    function baseURI() external view override returns (string memory) {
        return tokenMetadataEndpoint;
    }

    modifier currentFighterPrice() {
        require(msg.value >= currentFighterCost);
        _;
    }

    function trainFighter(
        uint256 _fighterId,
        string memory _attribute,
        uint256 _seed
    ) external payable costs(trainingCost) returns (uint256 _increaseValue) {
        require(isTrainingEnabled);
        require(_owns(msg.sender, _fighterId));
        uint256 _attributeIncrease =
            (RandomNumber.rand1To10(_seed) / trainingFactor);
        if (_attributeIncrease == 0) {
            _attributeIncrease = 1;
        }

        _train(_fighterId, _attribute, _attributeIncrease);
        return _attributeIncrease;
    }

    function _getFighterRarity(uint256 _seed, string memory _fighterName)
        internal
        returns (string memory)
    {
        uint256 _rarityRoll =
            RandomNumber.randomNumber1ToMax(_seed, maxFightersPerChar);
        uint256 _minEpicRoll =
            maxFightersPerChar - (maxEpicFighters + maxLegendaryFighters);
        uint256 _minRareRoll =
            maxFightersPerChar -
                (maxRareFighters + maxEpicFighters + maxLegendaryFighters);
        uint256 _minUncommonRoll =
            maxFightersPerChar -
                (maxUncommonFighters +
                    maxRareFighters +
                    maxEpicFighters +
                    maxLegendaryFighters);

        if (
            fighterNameToRarityCounts[_fighterName][LEGENDARY] <
            maxLegendaryFighters &&
            _rarityRoll == maxFightersPerChar
        ) {
            return LEGENDARY;
        }
        if (
            fighterNameToRarityCounts[_fighterName][EPIC] < maxEpicFighters &&
            _rarityRoll >= _minEpicRoll
        ) {
            return EPIC;
        }
        if (
            fighterNameToRarityCounts[_fighterName][RARE] < maxRareFighters &&
            _rarityRoll >= _minRareRoll
        ) {
            return RARE;
        }
        if (
            fighterNameToRarityCounts[_fighterName][UNCOMMON] <
            maxUncommonFighters &&
            _rarityRoll >= _minUncommonRoll
        ) {
            return UNCOMMON;
        }
        if (
            fighterNameToRarityCounts[_fighterName][COMMON] <
            maxCommonFighters &&
            _rarityRoll >= 1
        ) {
            return COMMON;
        }

        string[] memory _leftoverRarities;
        if (
            fighterNameToRarityCounts[_fighterName][LEGENDARY] <
            maxLegendaryFighters
        ) {
            _leftoverRarities[_leftoverRarities.length] = LEGENDARY;
        }
        if (fighterNameToRarityCounts[_fighterName][EPIC] < maxEpicFighters) {
            _leftoverRarities[_leftoverRarities.length] = EPIC;
        }
        if (fighterNameToRarityCounts[_fighterName][RARE] < maxRareFighters) {
            _leftoverRarities[_leftoverRarities.length] = RARE;
        }
        if (
            fighterNameToRarityCounts[_fighterName][UNCOMMON] <
            maxUncommonFighters
        ) {
            _leftoverRarities[_leftoverRarities.length] = UNCOMMON;
        }
        if (
            fighterNameToRarityCounts[_fighterName][COMMON] < maxCommonFighters
        ) {
            _leftoverRarities[_leftoverRarities.length] = COMMON;
        }

        if (_leftoverRarities.length == 1) {
            return _leftoverRarities[0];
        }

        uint256 _leftoverRoll =
            RandomNumber.randomNumberToMax(_seed, _leftoverRarities.length);
        return _leftoverRarities[_leftoverRoll];
    }

    function _getFighterName(uint256 _seed)
        internal
        returns (string memory _fighterName)
    {
        uint256 _nameIndex =
            RandomNumber.randomNumberToMax(_seed, availableFighterNames.length); // Use the whole array length because the random max number does not include the top end
        return availableFighterNames[_nameIndex];
    }

    function _removeNameFromAvailableNamesArray(string memory _fighterName)
        internal
    {
        uint256 _nameIndex = indexOfAvailableFighterName[_fighterName];
        require(
            keccak256(abi.encodePacked(availableFighterNames[_nameIndex])) ==
                keccak256(abi.encodePacked(_fighterName))
        ); // double check something wiggly hasn't happened

        if (availableFighterNames.length > 1) {
            availableFighterNames[_nameIndex] = availableFighterNames[
                availableFighterNames.length - 1
            ];
        }
        availableFighterNames.pop();
    }

    function searchForFighter(uint256 _seed)
        external
        payable
        currentFighterPrice
        whenNotPaused()
        returns (uint256 newFighterId)
    {
        require(fighters.length < maxFighters);
        string memory _fighterName = _getFighterName(_seed);
        string memory _fighterRarity = _getFighterRarity(_seed, _fighterName);
        uint256 _speed =
            RandomNumber.rand1To10(_seed) + rarityToSkillBuff[_fighterRarity];
        uint256 _strength =
            RandomNumber.rand1To10(_speed + _seed) +
                rarityToSkillBuff[_fighterRarity];

        fighterNameToMintedCount[_fighterName] += 1;
        fighterNameToRarityCounts[_fighterName][_fighterRarity] += 1;

        uint256 _fighterId =
            _createFighter(
                10,
                _speed,
                _strength,
                msg.sender,
                _fighterRarity,
                _fighterName,
                fighterNameToRarityCounts[_fighterName][_fighterRarity]
            );

        if (fighterNameToMintedCount[_fighterName] >= maxFightersPerChar) {
            _removeNameFromAvailableNamesArray(_fighterName);
        }

        uint256 _fighterCost = _getFighterCost();
        if (_fighterCost > currentFighterCost) {
            currentFighterCost = _fighterCost;
        }

        return _fighterId;
    }

    function _getFighterCost() internal returns (uint256 _cost) {
        uint256 currentTotalFighters = fighters.length - 1;

        if (currentTotalFighters < 500) {
            return 50000000000000000 wei;
        }
        if (currentTotalFighters >= 500 && currentTotalFighters < 1000) {
            return 100000000000000000 wei;
        }
        if (currentTotalFighters >= 1000 && currentTotalFighters < 1500) {
            return 150000000000000000 wei;
        }
        if (currentTotalFighters >= 1500 && currentTotalFighters < 2000) {
            return 200000000000000000 wei;
        }
        if (currentTotalFighters >= 2000 && currentTotalFighters < 2500) {
            return 250000000000000000 wei;
        }
        if (currentTotalFighters >= 2500 && currentTotalFighters < 3000) {
            return 300000000000000000 wei;
        }
        if (currentTotalFighters >= 3000 && currentTotalFighters < 3500) {
            return 350000000000000000 wei;
        }
        if (currentTotalFighters >= 3500 && currentTotalFighters < 4000) {
            return 400000000000000000 wei;
        }
        if (currentTotalFighters >= 4000 && currentTotalFighters < 4500) {
            return 450000000000000000 wei;
        }
        if (currentTotalFighters >= 4500 && currentTotalFighters < 5000) {
            return 500000000000000000 wei;
        }
        if (currentTotalFighters >= 5000 && currentTotalFighters < 5500) {
            return 550000000000000000 wei;
        }
        if (currentTotalFighters >= 5500 && currentTotalFighters < 6000) {
            return 600000000000000000 wei;
        }
        if (currentTotalFighters >= 6000) {
            return 650000000000000000 wei;
        }
        return 650000000000000000 wei;
    }
}

// File: contracts/CryptoBrawlers.sol

pragma solidity 0.8.2;



contract CryptoBrawlers is Marketplace, FighterOwnership {
    constructor() {
        rarityToSkillBuff[LEGENDARY] = 10;
        rarityToSkillBuff[EPIC] = 5;
        rarityToSkillBuff[RARE] = 3;
        rarityToSkillBuff[UNCOMMON] = 1;
        rarityToSkillBuff[COMMON] = 0;

        fighters.push(); // phantom 0 index element in the fighters array to begin
    }

    function getInfoForFighter(uint256 _fighterId)
        external
        returns (
            uint256 health,
            uint256 speed,
            uint256 strength,
            string memory fighterName,
            string memory image,
            string memory rarity,
            uint256 mintNum
        )
    {
        Fighter memory _fighter = fighters[_fighterId];
        return (
            _fighter.health,
            _fighter.speed,
            _fighter.strength,
            _fighter.name,
            _fighter.image,
            _fighter.rarity,
            _fighter.mintNum
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"}],"name":"ArenaAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"}],"name":"ArenaRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"},{"indexed":false,"internalType":"string","name":"attribute","type":"string"},{"indexed":false,"internalType":"uint256","name":"increaseValue","type":"uint256"}],"name":"AttributeIncrease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxHealth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"speed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strength","type":"uint256"},{"indexed":false,"internalType":"string","name":"rarity","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"imageHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"mintNum","type":"uint256"}],"name":"Creation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winnerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"loser","type":"address"},{"indexed":false,"internalType":"uint256","name":"loserId","type":"uint256"}],"name":"FightComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxHealth","type":"uint256"}],"name":"Healed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MarketplaceAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"}],"name":"MarketplaceRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fighterId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"}],"name":"PurchaseSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COMMON","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPIC","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RARE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNCOMMON","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"legendaryImageHash","type":"string"},{"internalType":"string","name":"epicImageHash","type":"string"},{"internalType":"string","name":"rareImageHash","type":"string"},{"internalType":"string","name":"uncommonImageHash","type":"string"},{"internalType":"string","name":"commonImageHash","type":"string"}],"name":"addFighterCharacter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"availableFighterNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"buyFighter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentFighterCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTraining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_attackerId","type":"uint256"},{"internalType":"uint256","name":"_defenderId","type":"uint256"},{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"fight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fighterIdToApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fighterIdToBrawl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fighterIdToOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fighterIdToSale","outputs":[{"internalType":"uint256","name":"fighterId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"fighterNameToMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"fighterNameToRarityCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"fighterNameToRarityImageHashes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"_approvedAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"getInfoForFighter","outputs":[{"internalType":"uint256","name":"health","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"strength","type":"uint256"},{"internalType":"string","name":"fighterName","type":"string"},{"internalType":"string","name":"image","type":"string"},{"internalType":"string","name":"rarity","type":"string"},{"internalType":"uint256","name":"mintNum","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_fighterName","type":"string"},{"internalType":"string","name":"_fighterRarity","type":"string"}],"name":"getMintedCountForFighterRarity","outputs":[{"internalType":"uint256","name":"mintedCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"getPriceForFighter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"indexOfAvailableFighterName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTrainingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"killContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"makeFighterAvailableForBrawl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"makeFighterAvailableForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketplaceCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCommonFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxEpicFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFightersPerChar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLegendaryFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRareFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxUncommonFighters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerToOperators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"rarityToSkillBuff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"removeFighterFromArena","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"}],"name":"removeFighterFromSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"searchForFighter","outputs":[{"internalType":"uint256","name":"newFighterId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCut","type":"uint256"}],"name":"setNewMarketplaceCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"setNewTrainingCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"setTrainingFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMetadataEndpoint","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fighterId","type":"uint256"},{"internalType":"string","name":"_attribute","type":"string"},{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"trainFighter","outputs":[{"internalType":"uint256","name":"_increaseValue","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"trainingCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trainingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawBalanceToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66b1a2bc2ec5000060019081556119a16002556003556005600481905560199055607d6006556101f460075561029060085560e0604052602b6080818152906200569d60a03980516200005b916009916020909101906200020a565b50600a805460ff199081169091556003600b556611c37937e08000600c5560188054909116905560056019553480156200009457600080fd5b50600080546001600160a01b0319163317905560408051808201825260098152686c6567656e6461727960b81b60208201529051600a91601491620000da9190620002b0565b90815260200160405180910390208190555060056014604051806040016040528060048152602001636570696360e01b8152506040516200011c9190620002b0565b90815260200160405180910390208190555060036014604051806040016040528060048152602001637261726560e01b8152506040516200015e9190620002b0565b90815260200160405180910390208190555060016014604051806040016040528060088152602001673ab731b7b6b6b7b760c11b815250604051620001a49190620002b0565b908152602001604051809103902081905550600060146040518060400160405280600681526020016531b7b6b6b7b760d11b815250604051620001e89190620002b0565b90815260405190819003602001902055600d8054600101815560005262000329565b8280546200021890620002ec565b90600052602060002090601f0160209004810192826200023c576000855562000287565b82601f106200025757805160ff191683800117855562000287565b8280016001018555821562000287579182015b82811115620002875782518255916020019190600101906200026a565b506200029592915062000299565b5090565b5b808211156200029557600081556001016200029a565b60008251815b81811015620002d25760208186018101518583015201620002b6565b81811115620002e15782828501525b509190910192915050565b6002810460018216806200030157607f821691505b602082108114156200032357634e487b7160e01b600052602260045260246000fd5b50919050565b61536480620003396000396000f3fe6080604052600436106104055760003560e01c80638456cb5911610213578063b187bd2611610123578063e59aa0a0116100ab578063f4245b671161007a578063f4245b6714610d61578063f669ddaf14610d77578063f6a6771614610d97578063f7b188a514610daa578063feb8888a14610dbf57610405565b8063e59aa0a014610ceb578063e88f4f1f14610d01578063e985e9c514610d21578063f2fde38b14610d4157610405565b8063be9cbb35116100f2578063be9cbb3514610c2f578063c87b56dd14610c4f578063cbb5bbbf14610c6f578063e0b8fd8614610c82578063e140d1e114610cb657610405565b8063b187bd2614610bbf578063b64ce34a14610bd9578063b6e5706414610bef578063b88d4fde14610c0f57610405565b8063a0766d0b116101a6578063a5557ce011610175578063a5557ce014610b00578063a707c73c14610b20578063a9059cbb14610b69578063ad2dccfe14610b89578063ae02c6d914610b9f57610405565b8063a0766d0b14610a43578063a22cb46514610a7b578063a2df64df14610a9b578063a4177f3414610ac857610405565b8063920b4a2d116101e2578063920b4a2d146109c157806395d89b41146109e15780639800bf2b14610a145780639aa8a9cc14610a2957610405565b80638456cb59146109465780638467db1c1461095b578063887bc4741461098b5780638da5cb5b146109a157610405565b806344e59ee9116103195780635fd8c710116102a15780636c3c71e7116102705780636c3c71e7146108aa578063701a19fd146108ca57806370a08231146108e057806373a512c814610900578063816171c01461091657610405565b80635fd8c710146108405780636352211e14610855578063641e3aae146108755780636c0360eb1461089557610405565b80634b193933116102e85780634b1939331461078b5780634c67899b146107c15780634fb2891f146107f457806354c3bfa11461080a5780635f7182781461082a57610405565b806344e59ee9146106cb57806346e6a86c14610701578063495ac3a81461073357806349ae2eba1461075357610405565b80631c02708d1161039c5780632de3ba581161036b5780632de3ba581461060357806335a2e803146106235780633f40d288146106785780634194718b1461068b57806342842e0e146106ab57610405565b80631c02708d146105885780631dc4b6a41461059d57806323b872dd146105b3578063241860aa146105d357610405565b8063095ea7b3116103d8578063095ea7b3146104f8578063150b7a021461051a57806318160ddd146105535780631ba210111461056857610405565b806301ffc9a71461040a578063056c9c711461043f57806306fdde0314610463578063081812fc146104aa575b600080fd5b34801561041657600080fd5b5061042a610425366004614ccc565b610dd4565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b5061045560045481565b604051908152602001610436565b34801561046f57600080fd5b5061049d6040518060400160405280600e81526020016d43727970746f427261776c65727360901b81525081565b6040516104369190615114565b3480156104b657600080fd5b506104e06104c5366004614e86565b6000908152600f60205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610436565b34801561050457600080fd5b50610518610513366004614ca3565b610e28565b005b34801561052657600080fd5b5061053a610535366004614bd3565b610f20565b6040516001600160e01b03199091168152602001610436565b34801561055f57600080fd5b50610455610f27565b34801561057457600080fd5b50610518610583366004614b4c565b610f3f565b34801561059457600080fd5b50610518610f8f565b3480156105a957600080fd5b5061045560055481565b3480156105bf57600080fd5b506105186105ce366004614b98565b610fb4565b3480156105df57600080fd5b506104556105ee366004614e86565b6000908152601a602052604090206001015490565b34801561060f57600080fd5b5061049d61061e366004614d37565b6110bd565b34801561062f57600080fd5b5061045561063e366004614d37565b8151602081840181018051601782529282019482019490942091909352815180830184018051928152908401929093019190912091525481565b610455610686366004614e9e565b61117f565b34801561069757600080fd5b5061049d6106a6366004614e86565b6111e6565b3480156106b757600080fd5b506105186106c6366004614b98565b611211565b3480156106d757600080fd5b506104e06106e6366004614e86565b600f602052600090815260409020546001600160a01b031681565b34801561070d57600080fd5b5061049d6040518060400160405280600681526020016531b7b6b6b7b760d11b81525081565b34801561073f57600080fd5b5061051861074e366004614e86565b611336565b34801561075f57600080fd5b5061045561076e366004614d04565b805160208183018101805160148252928201919093012091525481565b34801561079757600080fd5b506104e06107a6366004614e86565b600e602052600090815260409020546001600160a01b031681565b3480156107cd57600080fd5b506107e16107dc366004614e86565b611352565b6040516104369796959493929190615127565b34801561080057600080fd5b5061045560085481565b34801561081657600080fd5b50610518610825366004614e86565b6115bd565b34801561083657600080fd5b5061045560015481565b34801561084c57600080fd5b5061051861162b565b34801561086157600080fd5b506104e0610870366004614e86565b61167f565b34801561088157600080fd5b50610518610890366004614e86565b6116a1565b3480156108a157600080fd5b5061049d6116ff565b3480156108b657600080fd5b506104556108c5366004614d37565b611791565b3480156108d657600080fd5b50610455600c5481565b3480156108ec57600080fd5b506104556108fb366004614b4c565b6117d7565b34801561090c57600080fd5b5061045560075481565b34801561092257600080fd5b5061049d604051806040016040528060048152602001637261726560e01b81525081565b34801561095257600080fd5b50610518611808565b34801561096757600080fd5b5061049d604051806040016040528060048152602001636570696360e01b81525081565b34801561099757600080fd5b5061045560025481565b3480156109ad57600080fd5b506000546104e0906001600160a01b031681565b3480156109cd57600080fd5b506105186109dc366004614e86565b61182e565b3480156109ed57600080fd5b5061049d60405180604001604052806007815260200166212920aba622a960c91b81525081565b348015610a2057600080fd5b5061051861184a565b348015610a3557600080fd5b50600a5461042a9060ff1681565b348015610a4f57600080fd5b50610455610a5e366004614d04565b805160208183018101805160158252928201919093012091525481565b348015610a8757600080fd5b50610518610a96366004614c69565b611870565b348015610aa757600080fd5b50610455610ab6366004614e86565b601b6020526000908152604090205481565b348015610ad457600080fd5b50610455610ae3366004614d04565b805160208183018101805160138252928201919093012091525481565b348015610b0c57600080fd5b50610518610b1b366004614e86565b611b33565b348015610b2c57600080fd5b50610b54610b3b366004614e86565b601a602052600090815260409020805460019091015482565b60408051928352602083019190915201610436565b348015610b7557600080fd5b50610518610b84366004614ca3565b611b4f565b348015610b9557600080fd5b5061045560195481565b348015610bab57600080fd5b506104e0610bba366004614ca3565b611c35565b348015610bcb57600080fd5b5060185461042a9060ff1681565b348015610be557600080fd5b50610455600b5481565b348015610bfb57600080fd5b50610518610c0a366004614eec565b611c6d565b348015610c1b57600080fd5b50610518610c2a366004614bd3565b611d39565b348015610c3b57600080fd5b50610518610c4a366004614d98565b611e51565b348015610c5b57600080fd5b5061049d610c6a366004614e86565b6122f7565b610518610c7d366004614e86565b61232b565b348015610c8e57600080fd5b5061049d604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525081565b348015610cc257600080fd5b5061049d604051806040016040528060098152602001686c6567656e6461727960b81b81525081565b348015610cf757600080fd5b5061045560065481565b348015610d0d57600080fd5b50610518610d1c366004614e86565b6123a4565b348015610d2d57600080fd5b5061042a610d3c366004614b66565b612456565b348015610d4d57600080fd5b50610518610d5c366004614b4c565b61254a565b348015610d6d57600080fd5b5061045560035481565b348015610d8357600080fd5b50610518610d92366004614f0d565b612590565b610455610da5366004614e86565b612b30565b348015610db657600080fd5b50610518612d1f565b348015610dcb57600080fd5b5061049d612d42565b60006001600160e01b031982166301ffc9a760e01b1480610e0557506001600160e01b031982166380ac58cd60e01b145b80610e2057506001600160e01b03198216635b5e139f60e01b145b90505b919050565b610e323382612d4f565b610e3b57600080fd5b6000818152601b602052604090205415610e86576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a602052604090206001015415610eda576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b610ee48183612d6f565b60405181906001600160a01b0384169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a45050565b6000806000fd5b600d54600090610f39906001906151d2565b90505b90565b6000546001600160a01b03163314610f5657600080fd5b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610f8b573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610fa657600080fd5b6000546001600160a01b0316ff5b6001600160a01b038216610fc757600080fd5b6001600160a01b038216301415610fdd57600080fd5b610fe73382612d9d565b610ff057600080fd5b610ffa8382612d4f565b61100357600080fd5b6000818152601b60205260409020541561104e576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a6020526040902060010154156110a2576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b6110ad838383612eb6565b6110b8816000612d6f565b505050565b81516020818401810180516016825292820194820194909420919093528151808301840180519281529084019290930191909120915280546110fe9061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461112a9061522c565b80156111775780601f1061114c57610100808354040283529160200191611177565b820191906000526020600020905b81548152906001019060200180831161115a57829003601f168201915b505050505081565b6000600c548034106111de57600a5460ff1661119a57600080fd5b6111a43386612d4f565b6111ad57600080fd5b6000600b546111bb85612f96565b6111c5919061519f565b9050806111d0575060015b6111db868683612fef565b91505b509392505050565b601281815481106111f657600080fd5b9060005260206000200160009150905080546110fe9061522c565b6001600160a01b03821661122457600080fd5b6001600160a01b03821630141561123a57600080fd5b6112443382612d9d565b61124d57600080fd5b6112578382612d4f565b61126057600080fd5b61126b838383611003565b63ffffffff823b16156110b857604051630a85bd0160e11b81526001600160a01b03848116600483015283166024820181905260448201839052608060648301526000608483018190529163150b7a029060a401602060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190614ce8565b905063785cf2dd60e11b6001600160e01b031982161461133057600080fd5b50505050565b6000546001600160a01b0316331461134d57600080fd5b600b55565b60008060006060806060600080600d898154811061138057634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546113d29061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546113fe9061522c565b801561144b5780601f106114205761010080835404028352916020019161144b565b820191906000526020600020905b81548152906001019060200180831161142e57829003601f168201915b505050505081526020016005820180546114649061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546114909061522c565b80156114dd5780601f106114b2576101008083540402835291602001916114dd565b820191906000526020600020905b8154815290600101906020018083116114c057829003601f168201915b505050505081526020016006820180546114f69061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546115229061522c565b801561156f5780601f106115445761010080835404028352916020019161156f565b820191906000526020600020905b81548152906001019060200180831161155257829003601f168201915b50505091835250506007919091015460209182015281015160408201516060830151608084015160c085015160a086015160e090960151949f939e50919c509a509850919650945092505050565b6115c73382612d4f565b6115d057600080fd5b6000818152601a60205260409020600101546115eb57600080fd5b6000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f83398151915291015b60405180910390a150565b6000546001600160a01b0316331461164257600080fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561167c573d6000803e3d6000fd5b50565b6000818152600e60205260409020546001600160a01b031680610e2357600080fd5b6116ab3382612d4f565b6116b457600080fd5b6000818152601b60205260409020546116cc57600080fd5b6000818152601b602052604081205560408051338152602081018390526000805160206152ef8339815191529101611620565b60606009805461170e9061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461173a9061522c565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b60006017836040516117a39190614ffc565b9081526020016040518091039020826040516117bf9190614ffc565b90815260200160405180910390205490505b92915050565b60006001600160a01b0382166117ec57600080fd5b506001600160a01b031660009081526011602052604090205490565b6000546001600160a01b0316331461181f57600080fd5b6018805460ff19166001179055565b6000546001600160a01b0316331461184557600080fd5b601955565b6000546001600160a01b0316331461186157600080fd5b600a805460ff19166001179055565b336000908152601060209081526040808320805482518185028101850190935280835291929091908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b505050505090508115611917573360009081526010602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b81611aec573360009081526010602052604090205461197757604051600081526001600160a01b0384169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a350610f8b565b60005b8151811015611aea5733600090815260106020526040902080546001600160a01b0386169190839081106119be57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611ad85733600090815260106020526040902080546119f6906001906151d2565b81548110611a1457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101543383526010909152604090912080546001600160a01b039092169183908110611a5b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255338152601090915260409020805480611ab157634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055611aea565b80611ae281615267565b91505061197a565b505b60405182151581526001600160a01b0384169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a3505050565b6000546001600160a01b03163314611b4a57600080fd5b600c55565b6001600160a01b038216611b6257600080fd5b6001600160a01b038216301415611b7857600080fd5b611b823382612d4f565b611b8b57600080fd5b6000818152601b602052604090205415611bd6576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a602052604090206001015415611c2a576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b610f8b338383612eb6565b60106020528160005260406000208181548110611c5157600080fd5b6000918252602090912001546001600160a01b03169150829050565b611c773383612d4f565b611c8057600080fd5b6000828152601b602052604090205415611c9957600080fd5b60008111611ca657600080fd5b6000828152600f60205260409020546001600160a01b031615611cc857600080fd5b60408051808201825283815260208082018481526000868152601a8352849020925183555160019092019190915581513381529081018490529081018290527f9eaf5a44f033adc048686ca80e281b74f25fb52e998dd7f8e6812721383ae88a906060015b60405180910390a15050565b6001600160a01b038416611d4c57600080fd5b6001600160a01b038416301415611d6257600080fd5b611d6c3384612d9d565b611d7557600080fd5b611d7f8584612d4f565b611d8857600080fd5b611d93858585611003565b63ffffffff843b1615611e4a57604051630a85bd0160e11b81526000906001600160a01b0386169063150b7a0290611dd79089908990899089908990600401615049565b602060405180830381600087803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e299190614ce8565b905063785cf2dd60e11b6001600160e01b0319821614611e4857600080fd5b505b5050505050565b6000546001600160a01b03163314611e6857600080fd5b601254604051601390611e7c908990614ffc565b9081526040516020918190038201902091909155601280546001810182556000919091528751611ed3927fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490920191890190614962565b506000601587604051611ee69190614ffc565b90815260200160405180910390208190555084601687604051611f099190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b815250604051611f469190614ffc565b90815260200160405180910390209080519060200190611f67929190614962565b5083601687604051611f799190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b815250604051611fb19190614ffc565b90815260200160405180910390209080519060200190611fd2929190614962565b5082601687604051611fe49190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b81525060405161201c9190614ffc565b9081526020016040518091039020908051906020019061203d929190614962565b508160168760405161204f9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525060405161208b9190614ffc565b908152602001604051809103902090805190602001906120ac929190614962565b50806016876040516120be9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516120f89190614ffc565b90815260200160405180910390209080519060200190612119929190614962565b50600060178760405161212c9190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516121699190614ffc565b908152602001604051809103902081905550600060178760405161218d9190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516121c59190614ffc565b90815260200160405180910390208190555060006017876040516121e99190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b8152506040516122219190614ffc565b90815260200160405180910390208190555060006017876040516122459190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b8152506040516122819190614ffc565b90815260200160405180910390208190555060006017876040516122a59190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516122df9190614ffc565b90815260405190819003602001902055505050505050565b60606009612304836130bb565b604051602001612315929190615024565b6040516020818303038152906040529050919050565b6000818152600e60205260409020546001600160a01b031661234d82346131de565b612358813384612eb6565b604080513381523460208201529081018390526001600160a01b03821660608201527f4750c394c3222df02b322dd8f4ee23c0025975134406b18d35ab7c9c1bb41ac290608001611d2d565b6123ae3382612d4f565b6123b757600080fd5b6000818152601a6020526040902060010154156123d357600080fd5b6000818152601b6020526040902054156123ec57600080fd5b6000818152600f60205260409020546001600160a01b03161561240e57600080fd5b6000818152601b602090815260409182902083905581513381529081018390527ffd493e9e8a025ff7f65e924f394f7f1c3804e6114587e73b05e393385823ae5f9101611620565b6001600160a01b0382166000908152601060209081526040808320805482518185028101850190935280835284938301828280156124bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161249f575b505050505090508051600014156124d85760009150506117d1565b600160005b825181101561254157846001600160a01b031683828151811061251057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161461252f5760009150612541565b8061253981615267565b9150506124dd565b50949350505050565b6000546001600160a01b0316331461256157600080fd5b6001600160a01b0381161561167c57600080546001600160a01b0383166001600160a01b031990911617905550565b6000600d84815481106125b357634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546126059061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546126319061522c565b801561267e5780601f106126535761010080835404028352916020019161267e565b820191906000526020600020905b81548152906001019060200180831161266157829003601f168201915b505050505081526020016005820180546126979061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546126c39061522c565b80156127105780601f106126e557610100808354040283529160200191612710565b820191906000526020600020905b8154815290600101906020018083116126f357829003601f168201915b505050505081526020016006820180546127299061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546127559061522c565b80156127a25780601f10612777576101008083540402835291602001916127a2565b820191906000526020600020905b81548152906001019060200180831161278557829003601f168201915b5050505050815260200160078201548152505090506000600d84815481106127da57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805461282c9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546128589061522c565b80156128a55780601f1061287a576101008083540402835291602001916128a5565b820191906000526020600020905b81548152906001019060200180831161288857829003601f168201915b505050505081526020016005820180546128be9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546128ea9061522c565b80156129375780601f1061290c57610100808354040283529160200191612937565b820191906000526020600020905b81548152906001019060200180831161291a57829003601f168201915b505050505081526020016006820180546129509061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461297c9061522c565b80156129c95780601f1061299e576101008083540402835291602001916129c9565b820191906000526020600020905b8154815290600101906020018083116129ac57829003601f168201915b5050505050815260200160078201548152505090506129f6846000908152601b6020526040902054151590565b6129ff57600080fd5b612a093386612d4f565b612a1257600080fd5b612a1c3385612d4f565b15612a2657600080fd5b80606001518160400151612a3a9190615187565b82606001518360400151612a4e9190615187565b1115612a5957600080fd5b600080612a6987878686896132b0565b6000828152601b6020526040902054919350915015612a96576000828152601b6020526040812055612aa6565b6000818152601b60205260408120555b6000828152600e6020526040808220548383529120546001600160a01b039182169116612ad4818385612eb6565b604080516001600160a01b038481168252602082018790528316818301526060810185905290517f9f1a1317687ea47cb9c1b3557de984438f809b57116fab0ce49edc97ebea5d4d9181900360800190a1505050505050505050565b6000600154341015612b4157600080fd5b60185460ff1615612b5157600080fd5b600254600d5410612b6157600080fd5b6000612b6c83613487565b90506000612b7a8483613558565b90506000601482604051612b8e9190614ffc565b908152602001604051809103902054612ba686612f96565b612bb09190615187565b90506000601483604051612bc49190614ffc565b90815260405190819003602001902054612be6612be18885615187565b612f96565b612bf09190615187565b90506001601585604051612c049190614ffc565b90815260200160405180910390206000828254612c219190615187565b925050819055506001601785604051612c3a9190614ffc565b908152602001604051809103902084604051612c569190614ffc565b90815260200160405180910390206000828254612c739190615187565b925050819055506000612cc6600a848433888a60178c604051612c969190614ffc565b90815260200160405180910390208b604051612cb29190614ffc565b908152602001604051809103902054613c75565b9050600854601586604051612cdb9190614ffc565b90815260200160405180910390205410612cf857612cf885613e9b565b6000612d02614008565b9050600154811115612d145760018190555b509695505050505050565b6000546001600160a01b03163314612d3657600080fd5b6018805460ff19169055565b600980546110fe9061522c565b6000908152600e60205260409020546001600160a01b0391821691161490565b6000918252600f602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000818152600f60205260408120546001600160a01b0384811691161415612dc7575060016117d1565b6000828152600e60209081526040808320546001600160a01b0316808452601083528184208054835181860281018601909452808452919385939290830182828015612e3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612e1e575b5050505050905060005b8151811015612eab57866001600160a01b0316828281518110612e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612e995760019350612eab565b80612ea381615267565b915050612e46565b509195945050505050565b6000818152600e6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260119091528120805491612ef883615267565b90915550506001600160a01b03831615612f50576000818152600f6020908152604080832080546001600160a01b03191690556001600160a01b038616835260119091528120805491612f4a83615215565b91905055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600a612fa66001436151d2565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c612fdc9190615282565b905060008111610e205750600a92915050565b604051670e6e8e4cadccee8d60c31b6020820152602801604051602081830303815290604052805190602001208260405160200161302d9190614ffc565b60405160208183030381529060405280519060200120141561305957613054838233614224565b6110b8565b604051641cdc19595960da1b602082015260250160405160208183030381529060405280519060200120826040516020016130949190614ffc565b6040516020818303038152906040528051906020012014156110b8576110b88382336144de565b6060816130e057506040805180820190915260018152600360fc1b6020820152610e23565b8160005b811561310a57806130f481615267565b91506131039050600a8361519f565b91506130e4565b60008167ffffffffffffffff81111561313357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561315d576020820181803683370190505b5090505b84156131d6576131726001836151d2565b915061317f600a86615282565b61318a906030615187565b60f81b8183815181106131ad57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506131cf600a8661519f565b9450613161565b949350505050565b6131e83383612d4f565b156131f257600080fd5b6000828152601a602052604090206001015461320d57600080fd5b6000828152601a602052604090206001015481101561322b57600080fd5b6000828152600e60205260409020546001600160a01b031661325e836000908152601a6020526040812081815560010155565b60006132698361478b565b9050600061327782856151d2565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611e48573d6000803e3d6000fd5b60008060006132c3846305f5e0ff6147a6565b90506000856040015187604001516132db9190615187565b9050600087604001516132ef8760146147a6565b6132f99190615187565b90506000876040015161330d8560146147a6565b6133179190615187565b905080821080159061335e576133448c8c8c606001518c606001518c600261333f91906151b3565b6147ff565b15613359578b8b96509650505050505061347d565b61338f565b61337a8b8d8b606001518d6060015189600261333f91906151b3565b1561338f578a8c96509650505050505061347d565b80156133cb576133b18b8d8b606001518d6060015189600361333f91906151b3565b156133c6578a8c96509650505050505061347d565b6133fc565b6133e78c8c8c606001518c606001518c600361333f91906151b3565b156133fc578b8b96509650505050505061347d565b60006134098660146147a6565b8a606001518b6040015161341d9190615187565b6134279190615187565b905060006134368a60146147a6565b8c606001518d6040015161344a9190615187565b6134549190615187565b905080821061346f578c8e985098505050505050505061347d565b8d8d98509850505050505050505b9550959350505050565b6060600061349a83601280549050614860565b9050601281815481106134bd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546134d29061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546134fe9061522c565b801561354b5780601f106135205761010080835404028352916020019161354b565b820191906000526020600020905b81548152906001019060200180831161352e57829003601f168201915b5050505050915050919050565b60606000613568846008546147a6565b9050600060035460045461357c9190615187565b60085461358991906151d2565b905060006003546004546005546135a09190615187565b6135aa9190615187565b6008546135b791906151d2565b905060006003546004546005546006546135d19190615187565b6135db9190615187565b6135e59190615187565b6008546135f291906151d2565b90506003546017876040516136079190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516136449190614ffc565b908152602001604051809103902054108015613661575060085484145b1561369357604051806040016040528060098152602001686c6567656e6461727960b81b8152509450505050506117d1565b6004546017876040516136a69190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516136de9190614ffc565b9081526020016040518091039020541080156136fa5750828410155b1561372757604051806040016040528060048152602001636570696360e01b8152509450505050506117d1565b60055460178760405161373a9190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b8152506040516137729190614ffc565b90815260200160405180910390205410801561378e5750818410155b156137bb57604051806040016040528060048152602001637261726560e01b8152509450505050506117d1565b6006546017876040516137ce9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525060405161380a9190614ffc565b9081526020016040518091039020541080156138265750808410155b1561385757604051806040016040528060088152602001673ab731b7b6b6b7b760c11b8152509450505050506117d1565b60075460178760405161386a9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516138a49190614ffc565b9081526020016040518091039020541080156138c1575060018410155b156138f0576040518060400160405280600681526020016531b7b6b6b7b760d11b8152509450505050506117d1565b60606003546017886040516139059190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516139429190614ffc565b9081526020016040518091039020541015613991576040805180820190915260098152686c6567656e6461727960b81b602082015281518290634e487b7160e01b600052603260045260246000fd5b6004546017886040516139a49190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516139dc9190614ffc565b9081526020016040518091039020541015613a26576040805180820190915260048152636570696360e01b602082015281518290634e487b7160e01b600052603260045260246000fd5b600554601788604051613a399190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b815250604051613a719190614ffc565b9081526020016040518091039020541015613abb576040805180820190915260048152637261726560e01b602082015281518290634e487b7160e01b600052603260045260246000fd5b600654601788604051613ace9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b815250604051613b0a9190614ffc565b9081526020016040518091039020541015613b58576040805180820190915260088152673ab731b7b6b6b7b760c11b602082015281518290634e487b7160e01b600052603260045260246000fd5b600754601788604051613b6b9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b815250604051613ba59190614ffc565b9081526020016040518091039020541015613bf15760408051808201909152600681526531b7b6b6b7b760d11b602082015281518290634e487b7160e01b600052603260045260246000fd5b805160011415613c305780600081518110613c1c57634e487b7160e01b600052603260045260246000fd5b6020026020010151955050505050506117d1565b6000613c3d898351614860565b9050818181518110613c5f57634e487b7160e01b600052603260045260246000fd5b6020026020010151965050505050505092915050565b600080601684604051613c889190614ffc565b908152602001604051809103902085604051613ca49190614ffc565b90815260200160405180910390208054613cbd9061522c565b80601f0160208091040260200160405190810160405280929190818152602001828054613ce99061522c565b8015613d365780601f10613d0b57610100808354040283529160200191613d36565b820191906000526020600020905b815481529060010190602001808311613d1957829003601f168201915b5050505050905060006040518061010001604052808b81526020018b81526020018a81526020018981526020018681526020018781526020018381526020018581525090506000600d805490509050600d829080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613df5929190614962565b5060a08201518051613e11916005840191602090910190614962565b5060c08201518051613e2d916006840191602090910190614962565b5060e0820151816007015550507ff6de0c619e17669578268579274658de00a1e8c754cf1dae91acb855cd54cade88828d8d8d8c8c8a8d604051613e799998979695949392919061509a565b60405180910390a1613e8d60008983612eb6565b9a9950505050505050505050565b6000601382604051613ead9190614ffc565b908152602001604051809103902054905081604051602001613ecf9190614ffc565b6040516020818303038152906040528051906020012060128281548110613f0657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001613f209190615018565b6040516020818303038152906040528051906020012014613f4057600080fd5b60125460011015613fc75760128054613f5b906001906151d2565b81548110613f7957634e487b7160e01b600052603260045260246000fd5b9060005260206000200160128281548110613fa457634e487b7160e01b600052603260045260246000fd5b90600052602060002001908054613fba9061522c565b613fc59291906149e6565b505b6012805480613fe657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160006140029190614a61565b90555050565b600d54600090819061401c906001906151d2565b90506101f48110156140385766b1a2bc2ec50000915050610f3c565b6101f4811015801561404b57506103e881105b156140615767016345785d8a0000915050610f3c565b6103e8811015801561407457506105dc81105b1561408a57670214e8348c4f0000915050610f3c565b6105dc811015801561409d57506107d081105b156140b3576702c68af0bb140000915050610f3c565b6107d081101580156140c657506109c481105b156140dc576703782dace9d90000915050610f3c565b6109c481101580156140ef5750610bb881105b1561410557670429d069189e0000915050610f3c565b610bb881101580156141185750610dac81105b1561412e576704db732547630000915050610f3c565b610dac81101580156141415750610fa081105b156141575767058d15e176280000915050610f3c565b610fa0811015801561416a575061119481105b156141805767063eb89da4ed0000915050610f3c565b6111948110158015614193575061138881105b156141a9576706f05b59d3b20000915050610f3c565b61138881101580156141bc575061157c81105b156141d2576707a1fe1602770000915050610f3c565b61157c81101580156141e5575061177081105b156141fb57670853a0d2313c0000915050610f3c565b611770811061421557670905438e60010000915050610f3c565b670905438e6001000091505090565b6000600d848154811061424757634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546142999061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546142c59061522c565b80156143125780601f106142e757610100808354040283529160200191614312565b820191906000526020600020905b8154815290600101906020018083116142f557829003601f168201915b5050505050815260200160058201805461432b9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546143579061522c565b80156143a45780601f10614379576101008083540402835291602001916143a4565b820191906000526020600020905b81548152906001019060200180831161438757829003601f168201915b505050505081526020016006820180546143bd9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546143e99061522c565b80156144365780601f1061440b57610100808354040283529160200191614436565b820191906000526020600020905b81548152906001019060200180831161441957829003601f168201915b505050505081526020016007820154815250509050828160600181815161445d9190615187565b90525061446a81856148a4565b604080516001600160a01b0384168152602081018690526080918101829052600891810191909152670e6e8e4cadccee8d60c31b60a0820152606081018490527fca04611e80f005feb5aafd7553030c696e4de100604c325926807c6cbda6a7c39060c0015b60405180910390a150505050565b6000600d848154811061450157634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546145539061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461457f9061522c565b80156145cc5780601f106145a1576101008083540402835291602001916145cc565b820191906000526020600020905b8154815290600101906020018083116145af57829003601f168201915b505050505081526020016005820180546145e59061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546146119061522c565b801561465e5780601f106146335761010080835404028352916020019161465e565b820191906000526020600020905b81548152906001019060200180831161464157829003601f168201915b505050505081526020016006820180546146779061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546146a39061522c565b80156146f05780601f106146c5576101008083540402835291602001916146f0565b820191906000526020600020905b8154815290600101906020018083116146d357829003601f168201915b50505050508152602001600782015481525050905082816040018181516147179190615187565b90525061472481856148a4565b604080516001600160a01b0384168152602081018690526080918101829052600591810191909152641cdc19595960da1b60a0820152606081018490527fca04611e80f005feb5aafd7553030c696e4de100604c325926807c6cbda6a7c39060c0016144d0565b60195460009061479c60648461519f565b610e2091906151b3565b600080826147b56001436151d2565b604080519140602083015281018690526060016040516020818303038152906040528051906020012060001c6147eb9190615282565b9050600081116147f85750815b9392505050565b6000808461480e8460146147a6565b6148189190615187565b905060008461483261482b8660036151b3565b60146147a6565b61483c9190615187565b905080821061485057600192505050614857565b6000925050505b95945050505050565b60008161486e6001436151d2565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c6147f89190615282565b81600d82815481106148c657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190614918929190614962565b5060a08201518051614934916005840191602090910190614962565b5060c08201518051614950916006840191602090910190614962565b5060e082015181600701559050505050565b82805461496e9061522c565b90600052602060002090601f01602090048101928261499057600085556149d6565b82601f106149a957805160ff19168380011785556149d6565b828001600101855582156149d6579182015b828111156149d65782518255916020019190600101906149bb565b506149e2929150614a99565b5090565b8280546149f29061522c565b90600052602060002090601f016020900481019282614a1457600085556149d6565b82601f10614a2557805485556149d6565b828001600101855582156149d657600052602060002091601f016020900482015b828111156149d6578254825591600101919060010190614a46565b508054614a6d9061522c565b6000825580601f10614a7f575061167c565b601f01602090049060005260206000209081019061167c91905b5b808211156149e25760008155600101614a9a565b80356001600160a01b0381168114610e2357600080fd5b600082601f830112614ad5578081fd5b813567ffffffffffffffff80821115614af057614af06152c2565b604051601f8301601f19908116603f01168101908282118183101715614b1857614b186152c2565b81604052838152866020858801011115614b30578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215614b5d578081fd5b6147f882614aae565b60008060408385031215614b78578081fd5b614b8183614aae565b9150614b8f60208401614aae565b90509250929050565b600080600060608486031215614bac578081fd5b614bb584614aae565b9250614bc360208501614aae565b9150604084013590509250925092565b600080600080600060808688031215614bea578081fd5b614bf386614aae565b9450614c0160208701614aae565b935060408601359250606086013567ffffffffffffffff80821115614c24578283fd5b818801915088601f830112614c37578283fd5b813581811115614c45578384fd5b896020828501011115614c56578384fd5b9699959850939650602001949392505050565b60008060408385031215614c7b578182fd5b614c8483614aae565b915060208301358015158114614c98578182fd5b809150509250929050565b60008060408385031215614cb5578182fd5b614cbe83614aae565b946020939093013593505050565b600060208284031215614cdd578081fd5b81356147f8816152d8565b600060208284031215614cf9578081fd5b81516147f8816152d8565b600060208284031215614d15578081fd5b813567ffffffffffffffff811115614d2b578182fd5b6131d684828501614ac5565b60008060408385031215614d49578182fd5b823567ffffffffffffffff80821115614d60578384fd5b614d6c86838701614ac5565b93506020850135915080821115614d81578283fd5b50614d8e85828601614ac5565b9150509250929050565b60008060008060008060c08789031215614db0578081fd5b863567ffffffffffffffff80821115614dc7578283fd5b614dd38a838b01614ac5565b97506020890135915080821115614de8578283fd5b614df48a838b01614ac5565b96506040890135915080821115614e09578283fd5b614e158a838b01614ac5565b95506060890135915080821115614e2a578283fd5b614e368a838b01614ac5565b94506080890135915080821115614e4b578283fd5b614e578a838b01614ac5565b935060a0890135915080821115614e6c578283fd5b50614e7989828a01614ac5565b9150509295509295509295565b600060208284031215614e97578081fd5b5035919050565b600080600060608486031215614eb2578283fd5b83359250602084013567ffffffffffffffff811115614ecf578283fd5b614edb86828701614ac5565b925050604084013590509250925092565b60008060408385031215614efe578182fd5b50508035926020909101359150565b600080600060608486031215614f21578081fd5b505081359360208301359350604090920135919050565b60008151808452614f508160208601602086016151e9565b601f01601f19169290920160200192915050565b805460009060028104600180831680614f7e57607f831692505b6020808410821415614f9e57634e487b7160e01b86526022600452602486fd5b818015614fb25760018114614fc357614ff0565b60ff19861689528489019650614ff0565b60008881526020902060005b86811015614fe85781548b820152908501908301614fcf565b505084890196505b50505050505092915050565b6000825161500e8184602087016151e9565b9190910192915050565b60006147f88284614f64565b60006150308285614f64565b83516150408183602088016151e9565b01949350505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a084013781830160a090810191909152601f909201601f19160101949350505050565b600061012060018060a01b038c1683528a60208401528960408401528860608401528760808401528060a08401526150d481840188614f38565b905082810360c08401526150e88187614f38565b905082810360e08401526150fc8186614f38565b915050826101008301529a9950505050505050505050565b6000602082526147f86020830184614f38565b600088825287602083015286604083015260e0606083015261514c60e0830187614f38565b828103608084015261515e8187614f38565b905082810360a08401526151728186614f38565b9150508260c083015298975050505050505050565b6000821982111561519a5761519a615296565b500190565b6000826151ae576151ae6152ac565b500490565b60008160001904831182151516156151cd576151cd615296565b500290565b6000828210156151e4576151e4615296565b500390565b60005b838110156152045781810151838201526020016151ec565b838111156113305750506000910152565b60008161522457615224615296565b506000190190565b60028104600182168061524057607f821691505b6020821081141561526157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561527b5761527b615296565b5060010190565b600082615291576152916152ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461167c57600080fdfeb3fefaad4d5eb17c447489e1529238e4f44c82b4f99284ca82969e1bfbb8e8c53e808687755674bf6703cb65acce9b7da494797511c241a38e74134813273be2a26469706673582212206e89ee0f8d041e1bbc388a14a16b87316463cd4d1cba57214e40420abe5f58b664736f6c6343000802003368747470733a2f2f63727970746f627261776c652e72732f6170692f67657446696768746572496e666f2f

Deployed Bytecode

0x6080604052600436106104055760003560e01c80638456cb5911610213578063b187bd2611610123578063e59aa0a0116100ab578063f4245b671161007a578063f4245b6714610d61578063f669ddaf14610d77578063f6a6771614610d97578063f7b188a514610daa578063feb8888a14610dbf57610405565b8063e59aa0a014610ceb578063e88f4f1f14610d01578063e985e9c514610d21578063f2fde38b14610d4157610405565b8063be9cbb35116100f2578063be9cbb3514610c2f578063c87b56dd14610c4f578063cbb5bbbf14610c6f578063e0b8fd8614610c82578063e140d1e114610cb657610405565b8063b187bd2614610bbf578063b64ce34a14610bd9578063b6e5706414610bef578063b88d4fde14610c0f57610405565b8063a0766d0b116101a6578063a5557ce011610175578063a5557ce014610b00578063a707c73c14610b20578063a9059cbb14610b69578063ad2dccfe14610b89578063ae02c6d914610b9f57610405565b8063a0766d0b14610a43578063a22cb46514610a7b578063a2df64df14610a9b578063a4177f3414610ac857610405565b8063920b4a2d116101e2578063920b4a2d146109c157806395d89b41146109e15780639800bf2b14610a145780639aa8a9cc14610a2957610405565b80638456cb59146109465780638467db1c1461095b578063887bc4741461098b5780638da5cb5b146109a157610405565b806344e59ee9116103195780635fd8c710116102a15780636c3c71e7116102705780636c3c71e7146108aa578063701a19fd146108ca57806370a08231146108e057806373a512c814610900578063816171c01461091657610405565b80635fd8c710146108405780636352211e14610855578063641e3aae146108755780636c0360eb1461089557610405565b80634b193933116102e85780634b1939331461078b5780634c67899b146107c15780634fb2891f146107f457806354c3bfa11461080a5780635f7182781461082a57610405565b806344e59ee9146106cb57806346e6a86c14610701578063495ac3a81461073357806349ae2eba1461075357610405565b80631c02708d1161039c5780632de3ba581161036b5780632de3ba581461060357806335a2e803146106235780633f40d288146106785780634194718b1461068b57806342842e0e146106ab57610405565b80631c02708d146105885780631dc4b6a41461059d57806323b872dd146105b3578063241860aa146105d357610405565b8063095ea7b3116103d8578063095ea7b3146104f8578063150b7a021461051a57806318160ddd146105535780631ba210111461056857610405565b806301ffc9a71461040a578063056c9c711461043f57806306fdde0314610463578063081812fc146104aa575b600080fd5b34801561041657600080fd5b5061042a610425366004614ccc565b610dd4565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b5061045560045481565b604051908152602001610436565b34801561046f57600080fd5b5061049d6040518060400160405280600e81526020016d43727970746f427261776c65727360901b81525081565b6040516104369190615114565b3480156104b657600080fd5b506104e06104c5366004614e86565b6000908152600f60205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610436565b34801561050457600080fd5b50610518610513366004614ca3565b610e28565b005b34801561052657600080fd5b5061053a610535366004614bd3565b610f20565b6040516001600160e01b03199091168152602001610436565b34801561055f57600080fd5b50610455610f27565b34801561057457600080fd5b50610518610583366004614b4c565b610f3f565b34801561059457600080fd5b50610518610f8f565b3480156105a957600080fd5b5061045560055481565b3480156105bf57600080fd5b506105186105ce366004614b98565b610fb4565b3480156105df57600080fd5b506104556105ee366004614e86565b6000908152601a602052604090206001015490565b34801561060f57600080fd5b5061049d61061e366004614d37565b6110bd565b34801561062f57600080fd5b5061045561063e366004614d37565b8151602081840181018051601782529282019482019490942091909352815180830184018051928152908401929093019190912091525481565b610455610686366004614e9e565b61117f565b34801561069757600080fd5b5061049d6106a6366004614e86565b6111e6565b3480156106b757600080fd5b506105186106c6366004614b98565b611211565b3480156106d757600080fd5b506104e06106e6366004614e86565b600f602052600090815260409020546001600160a01b031681565b34801561070d57600080fd5b5061049d6040518060400160405280600681526020016531b7b6b6b7b760d11b81525081565b34801561073f57600080fd5b5061051861074e366004614e86565b611336565b34801561075f57600080fd5b5061045561076e366004614d04565b805160208183018101805160148252928201919093012091525481565b34801561079757600080fd5b506104e06107a6366004614e86565b600e602052600090815260409020546001600160a01b031681565b3480156107cd57600080fd5b506107e16107dc366004614e86565b611352565b6040516104369796959493929190615127565b34801561080057600080fd5b5061045560085481565b34801561081657600080fd5b50610518610825366004614e86565b6115bd565b34801561083657600080fd5b5061045560015481565b34801561084c57600080fd5b5061051861162b565b34801561086157600080fd5b506104e0610870366004614e86565b61167f565b34801561088157600080fd5b50610518610890366004614e86565b6116a1565b3480156108a157600080fd5b5061049d6116ff565b3480156108b657600080fd5b506104556108c5366004614d37565b611791565b3480156108d657600080fd5b50610455600c5481565b3480156108ec57600080fd5b506104556108fb366004614b4c565b6117d7565b34801561090c57600080fd5b5061045560075481565b34801561092257600080fd5b5061049d604051806040016040528060048152602001637261726560e01b81525081565b34801561095257600080fd5b50610518611808565b34801561096757600080fd5b5061049d604051806040016040528060048152602001636570696360e01b81525081565b34801561099757600080fd5b5061045560025481565b3480156109ad57600080fd5b506000546104e0906001600160a01b031681565b3480156109cd57600080fd5b506105186109dc366004614e86565b61182e565b3480156109ed57600080fd5b5061049d60405180604001604052806007815260200166212920aba622a960c91b81525081565b348015610a2057600080fd5b5061051861184a565b348015610a3557600080fd5b50600a5461042a9060ff1681565b348015610a4f57600080fd5b50610455610a5e366004614d04565b805160208183018101805160158252928201919093012091525481565b348015610a8757600080fd5b50610518610a96366004614c69565b611870565b348015610aa757600080fd5b50610455610ab6366004614e86565b601b6020526000908152604090205481565b348015610ad457600080fd5b50610455610ae3366004614d04565b805160208183018101805160138252928201919093012091525481565b348015610b0c57600080fd5b50610518610b1b366004614e86565b611b33565b348015610b2c57600080fd5b50610b54610b3b366004614e86565b601a602052600090815260409020805460019091015482565b60408051928352602083019190915201610436565b348015610b7557600080fd5b50610518610b84366004614ca3565b611b4f565b348015610b9557600080fd5b5061045560195481565b348015610bab57600080fd5b506104e0610bba366004614ca3565b611c35565b348015610bcb57600080fd5b5060185461042a9060ff1681565b348015610be557600080fd5b50610455600b5481565b348015610bfb57600080fd5b50610518610c0a366004614eec565b611c6d565b348015610c1b57600080fd5b50610518610c2a366004614bd3565b611d39565b348015610c3b57600080fd5b50610518610c4a366004614d98565b611e51565b348015610c5b57600080fd5b5061049d610c6a366004614e86565b6122f7565b610518610c7d366004614e86565b61232b565b348015610c8e57600080fd5b5061049d604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525081565b348015610cc257600080fd5b5061049d604051806040016040528060098152602001686c6567656e6461727960b81b81525081565b348015610cf757600080fd5b5061045560065481565b348015610d0d57600080fd5b50610518610d1c366004614e86565b6123a4565b348015610d2d57600080fd5b5061042a610d3c366004614b66565b612456565b348015610d4d57600080fd5b50610518610d5c366004614b4c565b61254a565b348015610d6d57600080fd5b5061045560035481565b348015610d8357600080fd5b50610518610d92366004614f0d565b612590565b610455610da5366004614e86565b612b30565b348015610db657600080fd5b50610518612d1f565b348015610dcb57600080fd5b5061049d612d42565b60006001600160e01b031982166301ffc9a760e01b1480610e0557506001600160e01b031982166380ac58cd60e01b145b80610e2057506001600160e01b03198216635b5e139f60e01b145b90505b919050565b610e323382612d4f565b610e3b57600080fd5b6000818152601b602052604090205415610e86576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a602052604090206001015415610eda576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b610ee48183612d6f565b60405181906001600160a01b0384169033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a45050565b6000806000fd5b600d54600090610f39906001906151d2565b90505b90565b6000546001600160a01b03163314610f5657600080fd5b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610f8b573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610fa657600080fd5b6000546001600160a01b0316ff5b6001600160a01b038216610fc757600080fd5b6001600160a01b038216301415610fdd57600080fd5b610fe73382612d9d565b610ff057600080fd5b610ffa8382612d4f565b61100357600080fd5b6000818152601b60205260409020541561104e576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a6020526040902060010154156110a2576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b6110ad838383612eb6565b6110b8816000612d6f565b505050565b81516020818401810180516016825292820194820194909420919093528151808301840180519281529084019290930191909120915280546110fe9061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461112a9061522c565b80156111775780601f1061114c57610100808354040283529160200191611177565b820191906000526020600020905b81548152906001019060200180831161115a57829003601f168201915b505050505081565b6000600c548034106111de57600a5460ff1661119a57600080fd5b6111a43386612d4f565b6111ad57600080fd5b6000600b546111bb85612f96565b6111c5919061519f565b9050806111d0575060015b6111db868683612fef565b91505b509392505050565b601281815481106111f657600080fd5b9060005260206000200160009150905080546110fe9061522c565b6001600160a01b03821661122457600080fd5b6001600160a01b03821630141561123a57600080fd5b6112443382612d9d565b61124d57600080fd5b6112578382612d4f565b61126057600080fd5b61126b838383611003565b63ffffffff823b16156110b857604051630a85bd0160e11b81526001600160a01b03848116600483015283166024820181905260448201839052608060648301526000608483018190529163150b7a029060a401602060405180830381600087803b1580156112d957600080fd5b505af11580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190614ce8565b905063785cf2dd60e11b6001600160e01b031982161461133057600080fd5b50505050565b6000546001600160a01b0316331461134d57600080fd5b600b55565b60008060006060806060600080600d898154811061138057634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546113d29061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546113fe9061522c565b801561144b5780601f106114205761010080835404028352916020019161144b565b820191906000526020600020905b81548152906001019060200180831161142e57829003601f168201915b505050505081526020016005820180546114649061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546114909061522c565b80156114dd5780601f106114b2576101008083540402835291602001916114dd565b820191906000526020600020905b8154815290600101906020018083116114c057829003601f168201915b505050505081526020016006820180546114f69061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546115229061522c565b801561156f5780601f106115445761010080835404028352916020019161156f565b820191906000526020600020905b81548152906001019060200180831161155257829003601f168201915b50505091835250506007919091015460209182015281015160408201516060830151608084015160c085015160a086015160e090960151949f939e50919c509a509850919650945092505050565b6115c73382612d4f565b6115d057600080fd5b6000818152601a60205260409020600101546115eb57600080fd5b6000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f83398151915291015b60405180910390a150565b6000546001600160a01b0316331461164257600080fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561167c573d6000803e3d6000fd5b50565b6000818152600e60205260409020546001600160a01b031680610e2357600080fd5b6116ab3382612d4f565b6116b457600080fd5b6000818152601b60205260409020546116cc57600080fd5b6000818152601b602052604081205560408051338152602081018390526000805160206152ef8339815191529101611620565b60606009805461170e9061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461173a9061522c565b80156117875780601f1061175c57610100808354040283529160200191611787565b820191906000526020600020905b81548152906001019060200180831161176a57829003601f168201915b5050505050905090565b60006017836040516117a39190614ffc565b9081526020016040518091039020826040516117bf9190614ffc565b90815260200160405180910390205490505b92915050565b60006001600160a01b0382166117ec57600080fd5b506001600160a01b031660009081526011602052604090205490565b6000546001600160a01b0316331461181f57600080fd5b6018805460ff19166001179055565b6000546001600160a01b0316331461184557600080fd5b601955565b6000546001600160a01b0316331461186157600080fd5b600a805460ff19166001179055565b336000908152601060209081526040808320805482518185028101850190935280835291929091908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b505050505090508115611917573360009081526010602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0385161790555b81611aec573360009081526010602052604090205461197757604051600081526001600160a01b0384169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a350610f8b565b60005b8151811015611aea5733600090815260106020526040902080546001600160a01b0386169190839081106119be57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415611ad85733600090815260106020526040902080546119f6906001906151d2565b81548110611a1457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101543383526010909152604090912080546001600160a01b039092169183908110611a5b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255338152601090915260409020805480611ab157634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055611aea565b80611ae281615267565b91505061197a565b505b60405182151581526001600160a01b0384169033907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319060200160405180910390a3505050565b6000546001600160a01b03163314611b4a57600080fd5b600c55565b6001600160a01b038216611b6257600080fd5b6001600160a01b038216301415611b7857600080fd5b611b823382612d4f565b611b8b57600080fd5b6000818152601b602052604090205415611bd6576000818152601b602052604081205560408051338152602081018390526000805160206152ef833981519152910160405180910390a15b6000818152601a602052604090206001015415611c2a576000818152601a6020526040812081815560010155604080513381526020810183905260008051602061530f833981519152910160405180910390a15b610f8b338383612eb6565b60106020528160005260406000208181548110611c5157600080fd5b6000918252602090912001546001600160a01b03169150829050565b611c773383612d4f565b611c8057600080fd5b6000828152601b602052604090205415611c9957600080fd5b60008111611ca657600080fd5b6000828152600f60205260409020546001600160a01b031615611cc857600080fd5b60408051808201825283815260208082018481526000868152601a8352849020925183555160019092019190915581513381529081018490529081018290527f9eaf5a44f033adc048686ca80e281b74f25fb52e998dd7f8e6812721383ae88a906060015b60405180910390a15050565b6001600160a01b038416611d4c57600080fd5b6001600160a01b038416301415611d6257600080fd5b611d6c3384612d9d565b611d7557600080fd5b611d7f8584612d4f565b611d8857600080fd5b611d93858585611003565b63ffffffff843b1615611e4a57604051630a85bd0160e11b81526000906001600160a01b0386169063150b7a0290611dd79089908990899089908990600401615049565b602060405180830381600087803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e299190614ce8565b905063785cf2dd60e11b6001600160e01b0319821614611e4857600080fd5b505b5050505050565b6000546001600160a01b03163314611e6857600080fd5b601254604051601390611e7c908990614ffc565b9081526040516020918190038201902091909155601280546001810182556000919091528751611ed3927fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344490920191890190614962565b506000601587604051611ee69190614ffc565b90815260200160405180910390208190555084601687604051611f099190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b815250604051611f469190614ffc565b90815260200160405180910390209080519060200190611f67929190614962565b5083601687604051611f799190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b815250604051611fb19190614ffc565b90815260200160405180910390209080519060200190611fd2929190614962565b5082601687604051611fe49190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b81525060405161201c9190614ffc565b9081526020016040518091039020908051906020019061203d929190614962565b508160168760405161204f9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525060405161208b9190614ffc565b908152602001604051809103902090805190602001906120ac929190614962565b50806016876040516120be9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516120f89190614ffc565b90815260200160405180910390209080519060200190612119929190614962565b50600060178760405161212c9190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516121699190614ffc565b908152602001604051809103902081905550600060178760405161218d9190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516121c59190614ffc565b90815260200160405180910390208190555060006017876040516121e99190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b8152506040516122219190614ffc565b90815260200160405180910390208190555060006017876040516122459190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b8152506040516122819190614ffc565b90815260200160405180910390208190555060006017876040516122a59190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516122df9190614ffc565b90815260405190819003602001902055505050505050565b60606009612304836130bb565b604051602001612315929190615024565b6040516020818303038152906040529050919050565b6000818152600e60205260409020546001600160a01b031661234d82346131de565b612358813384612eb6565b604080513381523460208201529081018390526001600160a01b03821660608201527f4750c394c3222df02b322dd8f4ee23c0025975134406b18d35ab7c9c1bb41ac290608001611d2d565b6123ae3382612d4f565b6123b757600080fd5b6000818152601a6020526040902060010154156123d357600080fd5b6000818152601b6020526040902054156123ec57600080fd5b6000818152600f60205260409020546001600160a01b03161561240e57600080fd5b6000818152601b602090815260409182902083905581513381529081018390527ffd493e9e8a025ff7f65e924f394f7f1c3804e6114587e73b05e393385823ae5f9101611620565b6001600160a01b0382166000908152601060209081526040808320805482518185028101850190935280835284938301828280156124bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161249f575b505050505090508051600014156124d85760009150506117d1565b600160005b825181101561254157846001600160a01b031683828151811061251057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161461252f5760009150612541565b8061253981615267565b9150506124dd565b50949350505050565b6000546001600160a01b0316331461256157600080fd5b6001600160a01b0381161561167c57600080546001600160a01b0383166001600160a01b031990911617905550565b6000600d84815481106125b357634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546126059061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546126319061522c565b801561267e5780601f106126535761010080835404028352916020019161267e565b820191906000526020600020905b81548152906001019060200180831161266157829003601f168201915b505050505081526020016005820180546126979061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546126c39061522c565b80156127105780601f106126e557610100808354040283529160200191612710565b820191906000526020600020905b8154815290600101906020018083116126f357829003601f168201915b505050505081526020016006820180546127299061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546127559061522c565b80156127a25780601f10612777576101008083540402835291602001916127a2565b820191906000526020600020905b81548152906001019060200180831161278557829003601f168201915b5050505050815260200160078201548152505090506000600d84815481106127da57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201604051806101000160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201805461282c9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546128589061522c565b80156128a55780601f1061287a576101008083540402835291602001916128a5565b820191906000526020600020905b81548152906001019060200180831161288857829003601f168201915b505050505081526020016005820180546128be9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546128ea9061522c565b80156129375780601f1061290c57610100808354040283529160200191612937565b820191906000526020600020905b81548152906001019060200180831161291a57829003601f168201915b505050505081526020016006820180546129509061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461297c9061522c565b80156129c95780601f1061299e576101008083540402835291602001916129c9565b820191906000526020600020905b8154815290600101906020018083116129ac57829003601f168201915b5050505050815260200160078201548152505090506129f6846000908152601b6020526040902054151590565b6129ff57600080fd5b612a093386612d4f565b612a1257600080fd5b612a1c3385612d4f565b15612a2657600080fd5b80606001518160400151612a3a9190615187565b82606001518360400151612a4e9190615187565b1115612a5957600080fd5b600080612a6987878686896132b0565b6000828152601b6020526040902054919350915015612a96576000828152601b6020526040812055612aa6565b6000818152601b60205260408120555b6000828152600e6020526040808220548383529120546001600160a01b039182169116612ad4818385612eb6565b604080516001600160a01b038481168252602082018790528316818301526060810185905290517f9f1a1317687ea47cb9c1b3557de984438f809b57116fab0ce49edc97ebea5d4d9181900360800190a1505050505050505050565b6000600154341015612b4157600080fd5b60185460ff1615612b5157600080fd5b600254600d5410612b6157600080fd5b6000612b6c83613487565b90506000612b7a8483613558565b90506000601482604051612b8e9190614ffc565b908152602001604051809103902054612ba686612f96565b612bb09190615187565b90506000601483604051612bc49190614ffc565b90815260405190819003602001902054612be6612be18885615187565b612f96565b612bf09190615187565b90506001601585604051612c049190614ffc565b90815260200160405180910390206000828254612c219190615187565b925050819055506001601785604051612c3a9190614ffc565b908152602001604051809103902084604051612c569190614ffc565b90815260200160405180910390206000828254612c739190615187565b925050819055506000612cc6600a848433888a60178c604051612c969190614ffc565b90815260200160405180910390208b604051612cb29190614ffc565b908152602001604051809103902054613c75565b9050600854601586604051612cdb9190614ffc565b90815260200160405180910390205410612cf857612cf885613e9b565b6000612d02614008565b9050600154811115612d145760018190555b509695505050505050565b6000546001600160a01b03163314612d3657600080fd5b6018805460ff19169055565b600980546110fe9061522c565b6000908152600e60205260409020546001600160a01b0391821691161490565b6000918252600f602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000818152600f60205260408120546001600160a01b0384811691161415612dc7575060016117d1565b6000828152600e60209081526040808320546001600160a01b0316808452601083528184208054835181860281018601909452808452919385939290830182828015612e3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612e1e575b5050505050905060005b8151811015612eab57866001600160a01b0316828281518110612e7957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03161415612e995760019350612eab565b80612ea381615267565b915050612e46565b509195945050505050565b6000818152600e6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260119091528120805491612ef883615267565b90915550506001600160a01b03831615612f50576000818152600f6020908152604080832080546001600160a01b03191690556001600160a01b038616835260119091528120805491612f4a83615215565b91905055505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600a612fa66001436151d2565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c612fdc9190615282565b905060008111610e205750600a92915050565b604051670e6e8e4cadccee8d60c31b6020820152602801604051602081830303815290604052805190602001208260405160200161302d9190614ffc565b60405160208183030381529060405280519060200120141561305957613054838233614224565b6110b8565b604051641cdc19595960da1b602082015260250160405160208183030381529060405280519060200120826040516020016130949190614ffc565b6040516020818303038152906040528051906020012014156110b8576110b88382336144de565b6060816130e057506040805180820190915260018152600360fc1b6020820152610e23565b8160005b811561310a57806130f481615267565b91506131039050600a8361519f565b91506130e4565b60008167ffffffffffffffff81111561313357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561315d576020820181803683370190505b5090505b84156131d6576131726001836151d2565b915061317f600a86615282565b61318a906030615187565b60f81b8183815181106131ad57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506131cf600a8661519f565b9450613161565b949350505050565b6131e83383612d4f565b156131f257600080fd5b6000828152601a602052604090206001015461320d57600080fd5b6000828152601a602052604090206001015481101561322b57600080fd5b6000828152600e60205260409020546001600160a01b031661325e836000908152601a6020526040812081815560010155565b60006132698361478b565b9050600061327782856151d2565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f19350505050158015611e48573d6000803e3d6000fd5b60008060006132c3846305f5e0ff6147a6565b90506000856040015187604001516132db9190615187565b9050600087604001516132ef8760146147a6565b6132f99190615187565b90506000876040015161330d8560146147a6565b6133179190615187565b905080821080159061335e576133448c8c8c606001518c606001518c600261333f91906151b3565b6147ff565b15613359578b8b96509650505050505061347d565b61338f565b61337a8b8d8b606001518d6060015189600261333f91906151b3565b1561338f578a8c96509650505050505061347d565b80156133cb576133b18b8d8b606001518d6060015189600361333f91906151b3565b156133c6578a8c96509650505050505061347d565b6133fc565b6133e78c8c8c606001518c606001518c600361333f91906151b3565b156133fc578b8b96509650505050505061347d565b60006134098660146147a6565b8a606001518b6040015161341d9190615187565b6134279190615187565b905060006134368a60146147a6565b8c606001518d6040015161344a9190615187565b6134549190615187565b905080821061346f578c8e985098505050505050505061347d565b8d8d98509850505050505050505b9550959350505050565b6060600061349a83601280549050614860565b9050601281815481106134bd57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546134d29061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546134fe9061522c565b801561354b5780601f106135205761010080835404028352916020019161354b565b820191906000526020600020905b81548152906001019060200180831161352e57829003601f168201915b5050505050915050919050565b60606000613568846008546147a6565b9050600060035460045461357c9190615187565b60085461358991906151d2565b905060006003546004546005546135a09190615187565b6135aa9190615187565b6008546135b791906151d2565b905060006003546004546005546006546135d19190615187565b6135db9190615187565b6135e59190615187565b6008546135f291906151d2565b90506003546017876040516136079190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516136449190614ffc565b908152602001604051809103902054108015613661575060085484145b1561369357604051806040016040528060098152602001686c6567656e6461727960b81b8152509450505050506117d1565b6004546017876040516136a69190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516136de9190614ffc565b9081526020016040518091039020541080156136fa5750828410155b1561372757604051806040016040528060048152602001636570696360e01b8152509450505050506117d1565b60055460178760405161373a9190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b8152506040516137729190614ffc565b90815260200160405180910390205410801561378e5750818410155b156137bb57604051806040016040528060048152602001637261726560e01b8152509450505050506117d1565b6006546017876040516137ce9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b81525060405161380a9190614ffc565b9081526020016040518091039020541080156138265750808410155b1561385757604051806040016040528060088152602001673ab731b7b6b6b7b760c11b8152509450505050506117d1565b60075460178760405161386a9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b8152506040516138a49190614ffc565b9081526020016040518091039020541080156138c1575060018410155b156138f0576040518060400160405280600681526020016531b7b6b6b7b760d11b8152509450505050506117d1565b60606003546017886040516139059190614ffc565b9081526020016040518091039020604051806040016040528060098152602001686c6567656e6461727960b81b8152506040516139429190614ffc565b9081526020016040518091039020541015613991576040805180820190915260098152686c6567656e6461727960b81b602082015281518290634e487b7160e01b600052603260045260246000fd5b6004546017886040516139a49190614ffc565b9081526020016040518091039020604051806040016040528060048152602001636570696360e01b8152506040516139dc9190614ffc565b9081526020016040518091039020541015613a26576040805180820190915260048152636570696360e01b602082015281518290634e487b7160e01b600052603260045260246000fd5b600554601788604051613a399190614ffc565b9081526020016040518091039020604051806040016040528060048152602001637261726560e01b815250604051613a719190614ffc565b9081526020016040518091039020541015613abb576040805180820190915260048152637261726560e01b602082015281518290634e487b7160e01b600052603260045260246000fd5b600654601788604051613ace9190614ffc565b9081526020016040518091039020604051806040016040528060088152602001673ab731b7b6b6b7b760c11b815250604051613b0a9190614ffc565b9081526020016040518091039020541015613b58576040805180820190915260088152673ab731b7b6b6b7b760c11b602082015281518290634e487b7160e01b600052603260045260246000fd5b600754601788604051613b6b9190614ffc565b90815260200160405180910390206040518060400160405280600681526020016531b7b6b6b7b760d11b815250604051613ba59190614ffc565b9081526020016040518091039020541015613bf15760408051808201909152600681526531b7b6b6b7b760d11b602082015281518290634e487b7160e01b600052603260045260246000fd5b805160011415613c305780600081518110613c1c57634e487b7160e01b600052603260045260246000fd5b6020026020010151955050505050506117d1565b6000613c3d898351614860565b9050818181518110613c5f57634e487b7160e01b600052603260045260246000fd5b6020026020010151965050505050505092915050565b600080601684604051613c889190614ffc565b908152602001604051809103902085604051613ca49190614ffc565b90815260200160405180910390208054613cbd9061522c565b80601f0160208091040260200160405190810160405280929190818152602001828054613ce99061522c565b8015613d365780601f10613d0b57610100808354040283529160200191613d36565b820191906000526020600020905b815481529060010190602001808311613d1957829003601f168201915b5050505050905060006040518061010001604052808b81526020018b81526020018a81526020018981526020018681526020018781526020018381526020018581525090506000600d805490509050600d829080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190613df5929190614962565b5060a08201518051613e11916005840191602090910190614962565b5060c08201518051613e2d916006840191602090910190614962565b5060e0820151816007015550507ff6de0c619e17669578268579274658de00a1e8c754cf1dae91acb855cd54cade88828d8d8d8c8c8a8d604051613e799998979695949392919061509a565b60405180910390a1613e8d60008983612eb6565b9a9950505050505050505050565b6000601382604051613ead9190614ffc565b908152602001604051809103902054905081604051602001613ecf9190614ffc565b6040516020818303038152906040528051906020012060128281548110613f0657634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001613f209190615018565b6040516020818303038152906040528051906020012014613f4057600080fd5b60125460011015613fc75760128054613f5b906001906151d2565b81548110613f7957634e487b7160e01b600052603260045260246000fd5b9060005260206000200160128281548110613fa457634e487b7160e01b600052603260045260246000fd5b90600052602060002001908054613fba9061522c565b613fc59291906149e6565b505b6012805480613fe657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160006140029190614a61565b90555050565b600d54600090819061401c906001906151d2565b90506101f48110156140385766b1a2bc2ec50000915050610f3c565b6101f4811015801561404b57506103e881105b156140615767016345785d8a0000915050610f3c565b6103e8811015801561407457506105dc81105b1561408a57670214e8348c4f0000915050610f3c565b6105dc811015801561409d57506107d081105b156140b3576702c68af0bb140000915050610f3c565b6107d081101580156140c657506109c481105b156140dc576703782dace9d90000915050610f3c565b6109c481101580156140ef5750610bb881105b1561410557670429d069189e0000915050610f3c565b610bb881101580156141185750610dac81105b1561412e576704db732547630000915050610f3c565b610dac81101580156141415750610fa081105b156141575767058d15e176280000915050610f3c565b610fa0811015801561416a575061119481105b156141805767063eb89da4ed0000915050610f3c565b6111948110158015614193575061138881105b156141a9576706f05b59d3b20000915050610f3c565b61138881101580156141bc575061157c81105b156141d2576707a1fe1602770000915050610f3c565b61157c81101580156141e5575061177081105b156141fb57670853a0d2313c0000915050610f3c565b611770811061421557670905438e60010000915050610f3c565b670905438e6001000091505090565b6000600d848154811061424757634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546142999061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546142c59061522c565b80156143125780601f106142e757610100808354040283529160200191614312565b820191906000526020600020905b8154815290600101906020018083116142f557829003601f168201915b5050505050815260200160058201805461432b9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546143579061522c565b80156143a45780601f10614379576101008083540402835291602001916143a4565b820191906000526020600020905b81548152906001019060200180831161438757829003601f168201915b505050505081526020016006820180546143bd9061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546143e99061522c565b80156144365780601f1061440b57610100808354040283529160200191614436565b820191906000526020600020905b81548152906001019060200180831161441957829003601f168201915b505050505081526020016007820154815250509050828160600181815161445d9190615187565b90525061446a81856148a4565b604080516001600160a01b0384168152602081018690526080918101829052600891810191909152670e6e8e4cadccee8d60c31b60a0820152606081018490527fca04611e80f005feb5aafd7553030c696e4de100604c325926807c6cbda6a7c39060c0015b60405180910390a150505050565b6000600d848154811061450157634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160405180610100016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546145539061522c565b80601f016020809104026020016040519081016040528092919081815260200182805461457f9061522c565b80156145cc5780601f106145a1576101008083540402835291602001916145cc565b820191906000526020600020905b8154815290600101906020018083116145af57829003601f168201915b505050505081526020016005820180546145e59061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546146119061522c565b801561465e5780601f106146335761010080835404028352916020019161465e565b820191906000526020600020905b81548152906001019060200180831161464157829003601f168201915b505050505081526020016006820180546146779061522c565b80601f01602080910402602001604051908101604052809291908181526020018280546146a39061522c565b80156146f05780601f106146c5576101008083540402835291602001916146f0565b820191906000526020600020905b8154815290600101906020018083116146d357829003601f168201915b50505050508152602001600782015481525050905082816040018181516147179190615187565b90525061472481856148a4565b604080516001600160a01b0384168152602081018690526080918101829052600591810191909152641cdc19595960da1b60a0820152606081018490527fca04611e80f005feb5aafd7553030c696e4de100604c325926807c6cbda6a7c39060c0016144d0565b60195460009061479c60648461519f565b610e2091906151b3565b600080826147b56001436151d2565b604080519140602083015281018690526060016040516020818303038152906040528051906020012060001c6147eb9190615282565b9050600081116147f85750815b9392505050565b6000808461480e8460146147a6565b6148189190615187565b905060008461483261482b8660036151b3565b60146147a6565b61483c9190615187565b905080821061485057600192505050614857565b6000925050505b95945050505050565b60008161486e6001436151d2565b604080519140602083015281018590526060016040516020818303038152906040528051906020012060001c6147f89190615282565b81600d82815481106148c657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004019080519060200190614918929190614962565b5060a08201518051614934916005840191602090910190614962565b5060c08201518051614950916006840191602090910190614962565b5060e082015181600701559050505050565b82805461496e9061522c565b90600052602060002090601f01602090048101928261499057600085556149d6565b82601f106149a957805160ff19168380011785556149d6565b828001600101855582156149d6579182015b828111156149d65782518255916020019190600101906149bb565b506149e2929150614a99565b5090565b8280546149f29061522c565b90600052602060002090601f016020900481019282614a1457600085556149d6565b82601f10614a2557805485556149d6565b828001600101855582156149d657600052602060002091601f016020900482015b828111156149d6578254825591600101919060010190614a46565b508054614a6d9061522c565b6000825580601f10614a7f575061167c565b601f01602090049060005260206000209081019061167c91905b5b808211156149e25760008155600101614a9a565b80356001600160a01b0381168114610e2357600080fd5b600082601f830112614ad5578081fd5b813567ffffffffffffffff80821115614af057614af06152c2565b604051601f8301601f19908116603f01168101908282118183101715614b1857614b186152c2565b81604052838152866020858801011115614b30578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215614b5d578081fd5b6147f882614aae565b60008060408385031215614b78578081fd5b614b8183614aae565b9150614b8f60208401614aae565b90509250929050565b600080600060608486031215614bac578081fd5b614bb584614aae565b9250614bc360208501614aae565b9150604084013590509250925092565b600080600080600060808688031215614bea578081fd5b614bf386614aae565b9450614c0160208701614aae565b935060408601359250606086013567ffffffffffffffff80821115614c24578283fd5b818801915088601f830112614c37578283fd5b813581811115614c45578384fd5b896020828501011115614c56578384fd5b9699959850939650602001949392505050565b60008060408385031215614c7b578182fd5b614c8483614aae565b915060208301358015158114614c98578182fd5b809150509250929050565b60008060408385031215614cb5578182fd5b614cbe83614aae565b946020939093013593505050565b600060208284031215614cdd578081fd5b81356147f8816152d8565b600060208284031215614cf9578081fd5b81516147f8816152d8565b600060208284031215614d15578081fd5b813567ffffffffffffffff811115614d2b578182fd5b6131d684828501614ac5565b60008060408385031215614d49578182fd5b823567ffffffffffffffff80821115614d60578384fd5b614d6c86838701614ac5565b93506020850135915080821115614d81578283fd5b50614d8e85828601614ac5565b9150509250929050565b60008060008060008060c08789031215614db0578081fd5b863567ffffffffffffffff80821115614dc7578283fd5b614dd38a838b01614ac5565b97506020890135915080821115614de8578283fd5b614df48a838b01614ac5565b96506040890135915080821115614e09578283fd5b614e158a838b01614ac5565b95506060890135915080821115614e2a578283fd5b614e368a838b01614ac5565b94506080890135915080821115614e4b578283fd5b614e578a838b01614ac5565b935060a0890135915080821115614e6c578283fd5b50614e7989828a01614ac5565b9150509295509295509295565b600060208284031215614e97578081fd5b5035919050565b600080600060608486031215614eb2578283fd5b83359250602084013567ffffffffffffffff811115614ecf578283fd5b614edb86828701614ac5565b925050604084013590509250925092565b60008060408385031215614efe578182fd5b50508035926020909101359150565b600080600060608486031215614f21578081fd5b505081359360208301359350604090920135919050565b60008151808452614f508160208601602086016151e9565b601f01601f19169290920160200192915050565b805460009060028104600180831680614f7e57607f831692505b6020808410821415614f9e57634e487b7160e01b86526022600452602486fd5b818015614fb25760018114614fc357614ff0565b60ff19861689528489019650614ff0565b60008881526020902060005b86811015614fe85781548b820152908501908301614fcf565b505084890196505b50505050505092915050565b6000825161500e8184602087016151e9565b9190910192915050565b60006147f88284614f64565b60006150308285614f64565b83516150408183602088016151e9565b01949350505050565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a084013781830160a090810191909152601f909201601f19160101949350505050565b600061012060018060a01b038c1683528a60208401528960408401528860608401528760808401528060a08401526150d481840188614f38565b905082810360c08401526150e88187614f38565b905082810360e08401526150fc8186614f38565b915050826101008301529a9950505050505050505050565b6000602082526147f86020830184614f38565b600088825287602083015286604083015260e0606083015261514c60e0830187614f38565b828103608084015261515e8187614f38565b905082810360a08401526151728186614f38565b9150508260c083015298975050505050505050565b6000821982111561519a5761519a615296565b500190565b6000826151ae576151ae6152ac565b500490565b60008160001904831182151516156151cd576151cd615296565b500290565b6000828210156151e4576151e4615296565b500390565b60005b838110156152045781810151838201526020016151ec565b838111156113305750506000910152565b60008161522457615224615296565b506000190190565b60028104600182168061524057607f821691505b6020821081141561526157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561527b5761527b615296565b5060010190565b600082615291576152916152ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461167c57600080fdfeb3fefaad4d5eb17c447489e1529238e4f44c82b4f99284ca82969e1bfbb8e8c53e808687755674bf6703cb65acce9b7da494797511c241a38e74134813273be2a26469706673582212206e89ee0f8d041e1bbc388a14a16b87316463cd4d1cba57214e40420abe5f58b664736f6c63430008020033

Deployed Bytecode Sourcemap

48727:1014:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28336:317;;;;;;;;;;-1:-1:-1;28336:317:0;;;;;:::i;:::-;;:::i;:::-;;;15610:14:1;;15603:22;15585:41;;15573:2;15558:18;28336:317:0;;;;;;;;2486:34;;;;;;;;;;;;;;;;;;;16215:25:1;;;16203:2;16188:18;2486:34:0;16170:76:1;26544:46:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26544:46:0;;;;;;;;;;;;:::i;37602:193::-;;;;;;;;;;-1:-1:-1;37602:193:0;;;;;:::i;:::-;37709:24;37758:29;;;:19;:29;;;;;;-1:-1:-1;;;;;37758:29:0;;37602:193;;;;-1:-1:-1;;;;;10450:32:1;;;10432:51;;10420:2;10405:18;37602:193:0;10387:102:1;32598:830:0;;;;;;;;;;-1:-1:-1;32598:830:0;;;;;:::i;:::-;;:::i;:::-;;28661:210;;;;;;;;;;-1:-1:-1;28661:210:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;15799:33:1;;;15781:52;;15769:2;15754:18;28661:210:0;15736:103:1;39820:177:0;;;;;;;;;;;;;:::i;11201:143::-;;;;;;;;;;-1:-1:-1;11201:143:0;;;;;:::i;:::-;;:::i;11352:90::-;;;;;;;;;;;;;:::i;2527:35::-;;;;;;;;;;;;;;;;33912:1187;;;;;;;;;;-1:-1:-1;33912:1187:0;;;;;:::i;:::-;;:::i;12251:134::-;;;;;;;;;;-1:-1:-1;12251:134:0;;;;;:::i;:::-;12317:7;12344:27;;;:15;:27;;;;;:33;;;;12251:134;4917:91;;;;;;;;;;-1:-1:-1;4917:91:0;;;;;:::i;:::-;;:::i;5015:87::-;;;;;;;;;;-1:-1:-1;5015:87:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40888:569;;;;;;:::i;:::-;;:::i;4680:37::-;;;;;;;;;;-1:-1:-1;4680:37:0;;;;;:::i;:::-;;:::i;35923:763::-;;;;;;;;;;-1:-1:-1;35923:763:0;;;;;:::i;:::-;;:::i;4427:54::-;;;;;;;;;;-1:-1:-1;4427:54:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;4427:54:0;;;2266:40;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2266:40:0;;;;;2978:110;;;;;;;;;;-1:-1:-1;2978:110:0;;;;;:::i;:::-;;:::i;4794:51::-;;;;;;;;;;-1:-1:-1;4794:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4327;;;;;;;;;;-1:-1:-1;4327:51:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;4327:51:0;;;49109:629;;;;;;;;;;-1:-1:-1;49109:629:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;2661:39::-;;;;;;;;;;;;;;;;12393:359;;;;;;;;;;-1:-1:-1;12393:359:0;;;;;:::i;:::-;;:::i;2010:57::-;;;;;;;;;;;;;;;;11082:111;;;;;;;;;;;;;:::i;40138:240::-;;;;;;;;;;-1:-1:-1;40138:240:0;;;;;:::i;:::-;;:::i;12760:356::-;;;;;;;;;;-1:-1:-1;12760:356:0;;;;;:::i;:::-;;:::i;40657:113::-;;;;;;;;;;;;;:::i;5111:248::-;;;;;;;;;;-1:-1:-1;5111:248:0;;;;;:::i;:::-;;:::i;2892:50::-;;;;;;;;;;;;;;;;30636:213;;;;;;;;;;-1:-1:-1;30636:213:0;;;;;:::i;:::-;;:::i;2616:38::-;;;;;;;;;;;;;;;;2172:36;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2172:36:0;;;;;24374:70;;;;;;;;;;;;;:::i;2129:36::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2129:36:0;;;;;2400:33;;;;;;;;;;;;;;;;1557:20;;;;;;;;;;-1:-1:-1;1557:20:0;;;;-1:-1:-1;;;;;1557:20:0;;;10965:109;;;;;;;;;;-1:-1:-1;10965:109:0;;;;;:::i;:::-;;:::i;26597:41::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26597:41:0;;;;;3209:88;;;;;;;;;;;;;:::i;2806:37::-;;;;;;;;;;-1:-1:-1;2806:37:0;;;;;;;;4852:58;;;;;;;;;;-1:-1:-1;4852:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;37803:1151;;;;;;;;;;-1:-1:-1;37803:1151:0;;;;;:::i;:::-;;:::i;10331:51::-;;;;;;;;;;-1:-1:-1;10331:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;4724:61;;;;;;;;;;-1:-1:-1;4724:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3096:105;;;;;;;;;;-1:-1:-1;3096:105:0;;;;;:::i;:::-;;:::i;10226:47::-;;;;;;;;;;-1:-1:-1;10226:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;16425:25:1;;;16481:2;16466:18;;16459:34;;;;16398:18;10226:47:0;16380:119:1;31198:964:0;;;;;;;;;;-1:-1:-1;31198:964:0;;;;;:::i;:::-;;:::i;9986:33::-;;;;;;;;;;;;;;;;4556:53;;;;;;;;;;-1:-1:-1;4556:53:0;;;;;:::i;:::-;;:::i;24255:28::-;;;;;;;;;;-1:-1:-1;24255:28:0;;;;;;;;2852:33;;;;;;;;;;;;;;;;13124:633;;;;;;;;;;-1:-1:-1;13124:633:0;;;;;:::i;:::-;;:::i;36694:900::-;;;;;;;;;;-1:-1:-1;36694:900:0;;;;;:::i;:::-;;:::i;5367:1140::-;;;;;;;;;;-1:-1:-1;5367:1140:0;;;;;:::i;:::-;;:::i;40386:263::-;;;;;;;;;;-1:-1:-1;40386:263:0;;;;;:::i;:::-;;:::i;14366:299::-;;;;;;:::i;:::-;;:::i;2215:44::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2215:44:0;;;;;2076:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2076:46:0;;;;;2569:40;;;;;;;;;;;;;;;;13765:593;;;;;;;;;;-1:-1:-1;13765:593:0;;;;;:::i;:::-;;:::i;38962:725::-;;;;;;;;;;-1:-1:-1;38962:725:0;;;;;:::i;:::-;;:::i;1733:153::-;;;;;;;;;;-1:-1:-1;1733:153:0;;;;;:::i;:::-;;:::i;2440:39::-;;;;;;;;;;;;;;;;17999:1509;;;;;;;;;;-1:-1:-1;17999:1509:0;;;;;:::i;:::-;;:::i;45429:1404::-;;;;;;:::i;:::-;;:::i;24452:73::-;;;;;;;;;;;;;:::i;2707:92::-;;;;;;;;;;;;;:::i;28336:317::-;28452:4;-1:-1:-1;;;;;;28483:41:0;;-1:-1:-1;;;28483:41:0;;28482:98;;-1:-1:-1;;;;;;;28543:36:0;;-1:-1:-1;;;28543:36:0;28482:98;:162;;;-1:-1:-1;;;;;;;28598:45:0;;-1:-1:-1;;;28598:45:0;28482:162;28474:171;;28336:317;;;;:::o;32598:830::-;32738:27;32744:10;32756:8;32738:5;:27::i;:::-;32730:36;;;;;;11803:4;11828:28;;;:16;:28;;;;;;:32;32869:148;;12079:28;;;;:16;:28;;;;;12072:35;32971:34;;;32984:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;32971:34:0;11874:18:1;32971:34:0;;;;;;;32869:148;11658:4;11683:27;;;:15;:27;;;;;:33;;;:37;33080:152;;11956:27;;;;:15;:27;;;;;11949:34;;;;;;33180:40;;;33199:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;33180:40:0;11874:18:1;33180:40:0;;;;;;;33080:152;33311:23;33320:8;33330:3;33311:8;:23::i;:::-;33385:35;;33411:8;;-1:-1:-1;;;;;33385:35:0;;;33394:10;;33385:35;;;;;32598:830;;:::o;28661:210::-;28836:6;28855:8;;;39820:177;39900:8;:15;39873:7;;39900:19;;39918:1;;39900:19;:::i;:::-;39893:26;;39820:177;;:::o;11201:143::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;11285:51:::1;::::0;-1:-1:-1;;;;;11285:28:0;::::1;::::0;11314:21:::1;11285:51:::0;::::1;;;::::0;::::1;::::0;;;11314:21;11285:28;:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;11201:143:::0;:::o;11352:90::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;11427:5:::1;::::0;-1:-1:-1;;;;;11427:5:0::1;11406:28;33912:1187:::0;-1:-1:-1;;;;;34122:17:0;;34114:26;;;;;;-1:-1:-1;;;;;34237:20:0;;34252:4;34237:20;;34229:29;;;;;;34328:34;34341:10;34353:8;34328:12;:34::i;:::-;34320:43;;;;;;34382:22;34388:5;34395:8;34382:5;:22::i;:::-;34374:31;;;;;;11803:4;11828:28;;;:16;:28;;;;;;:32;34485:148;;12079:28;;;;:16;:28;;;;;12072:35;34587:34;;;34600:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;34587:34:0;11874:18:1;34587:34:0;;;;;;;34485:148;11658:4;11683:27;;;:15;:27;;;;;:33;;;:37;34696:152;;11956:27;;;;:15;:27;;;;;11949:34;;;;;;34796:40;;;34815:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;34796:40:0;11874:18:1;34796:40:0;;;;;;;34696:152;34949:31;34959:5;34966:3;34971:8;34949:9;:31::i;:::-;35061:30;35070:8;35088:1;35061:8;:30::i;:::-;33912:1187;;;:::o;4917:91::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40888:569::-;41051:22;41028:12;;24102:5;24089:9;:18;24085:52;;41094:17:::1;::::0;::::1;;41086:26;;;::::0;::::1;;41131:29;41137:10;41149;41131:5;:29::i;:::-;41123:38;;;::::0;::::1;;41172:26;41247:14;;41215:29;41238:5;41215:22;:29::i;:::-;:46;;;;:::i;:::-;41172:90:::0;-1:-1:-1;41277:23:0;41273:78:::1;;-1:-1:-1::0;41338:1:0::1;41273:78;41363:50;41370:10;41382;41394:18;41363:6;:50::i;:::-;41431:18:::0;-1:-1:-1;24124:1:0::1;40888:569:::0;;;;;;:::o;4680:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35923:763::-;-1:-1:-1;;;;;36137:17:0;;36129:26;;;;;;-1:-1:-1;;;;;36252:20:0;;36267:4;36252:20;;36244:29;;;;;;36343:34;36356:10;36368:8;36343:12;:34::i;:::-;36335:43;;;;;;36397:22;36403:5;36410:8;36397:5;:22::i;:::-;36389:31;;;;;;36433:39;36451:5;36458:3;36463:8;36433:17;:39::i;:::-;22769:8;22722:18;;22769:8;;36485:194;;36555:63;;-1:-1:-1;;;36555:63:0;;-1:-1:-1;;;;;11487:15:1;;;36555:63:0;;;11469:34:1;36555:37:0;;11519:18:1;;;11512:43;;;11571:18;;;11564:34;;;11634:3;11614:18;;;11607:31;36522:13:0;11654:19:1;;;11647:33;;;36522:13:0;36555:37;;11697:19:1;;36555:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36522:96;-1:-1:-1;;;;;;;;;;36641:25:0;;;36633:34;;;;;;36485:194;35923:763;;;:::o;2978:110::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;3054:14:::1;:26:::0;2978:110::o;49109:629::-;49206:14;49235:13;49263:16;49294:25;49334:19;49368:20;49403:15;49446:23;49472:8;49481:10;49472:20;;;;;;-1:-1:-1;;;49472:20:0;;;;;;;;;;;;;;;;;;;49446:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49446:46:0;;;-1:-1:-1;;49446:46:0;;;;;;;;;;;49525:15;;;49555:14;;;;49584:17;;;;49616:13;;;;49644:14;;;;49673:15;;;;49703:16;;;;;49525:15;;49555:14;;-1:-1:-1;49584:17:0;;-1:-1:-1;49616:13:0;-1:-1:-1;49644:14:0;-1:-1:-1;49673:15:0;;-1:-1:-1;49703:16:0;-1:-1:-1;49109:629:0;-1:-1:-1;;;49109:629:0:o;12393:359::-;12472:29;12478:10;12490;12472:5;:29::i;:::-;12464:38;;;;;;11658:4;11683:27;;;:15;:27;;;;;:33;;;12601:38;;;;;;11956:27;;;;:15;:27;;;;;11949:34;;;;;;12702:42;;;12721:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;12702:42:0;11874:18:1;12702:42:0;;;;;;;;12393:359;:::o;11082:111::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;11147:5:::1;::::0;;11139:46:::1;::::0;-1:-1:-1;;;;;11147:5:0;;::::1;::::0;11163:21:::1;11139:46:::0;::::1;;;::::0;11163:21;;11139:46;11147:5;11139:46;11163:21;11147:5;11139:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;11082:111::o:0;40138:240::-;40241:13;40280:26;;;:16;:26;;;;;;-1:-1:-1;;;;;40280:26:0;40325:19;40317:28;;;;;12760:356;12840:29;12846:10;12858;12840:5;:29::i;:::-;12832:38;;;;;;11803:4;11828:28;;;:16;:28;;;;;;12969:39;;;;;;12079:28;;;;:16;:28;;;;;12072:35;13072:36;;;13085:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;13072:36:0;11874:18:1;13072:36:0;11856:145:1;40657:113:0;40708:13;40741:21;40734:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40657:113;:::o;5111:248::-;5257:19;5296:25;5322:12;5296:39;;;;;;:::i;:::-;;;;;;;;;;;;;5336:14;5296:55;;;;;;:::i;:::-;;;;;;;;;;;;;;5289:62;;5111:248;;;;;:::o;30636:213::-;30737:13;-1:-1:-1;;;;;30776:20:0;;30768:29;;;;;;-1:-1:-1;;;;;;30815:26:0;;;;;:18;:26;;;;;;;30636:213::o;24374:70::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;24421:8:::1;:15:::0;;-1:-1:-1;;24421:15:0::1;24432:4;24421:15;::::0;;24374:70::o;10965:109::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;11042:14:::1;:24:::0;10965:109::o;3209:88::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;3265:17:::1;:24:::0;;-1:-1:-1;;3265:24:0::1;3285:4;3265:24;::::0;;3209:88::o;37803:1151::-;37944:10;37888:36;37927:28;;;:16;:28;;;;;;;;37888:67;;;;;;;;;;;;;;;;;;;37927:28;;37888:67;;;37927:28;37888:67;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37888:67:0;;;;;;;;;;;;;;;;;;;;;;;37970:9;37966:80;;;38013:10;37996:28;;;;:16;:28;;;;;;;:38;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37996:38:0;-1:-1:-1;;;;;37996:38:0;;;;;37966:80;38063:9;38058:829;;38110:10;38093:28;;;;:16;:28;;;;;:35;38089:149;;38159:38;;38191:5;15585:41:1;;-1:-1:-1;;;;;38159:38:0;;;38174:10;;38159:38;;15573:2:1;15558:18;38159:38:0;;;;;;;38216:7;;;38089:149;38254:22;38291:585;38368:19;:26;38351:14;:43;38291:585;;;38485:10;38468:28;;;;:16;:28;;;;;:44;;-1:-1:-1;;;;;38468:51:0;;;:28;38497:14;;38468:44;;;;-1:-1:-1;;;38468:44:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38468:44:0;:51;38464:397;;;38656:10;38639:28;;;;:16;:28;;;;;38694:35;;:39;;38732:1;;38694:39;:::i;:::-;38639:117;;;;;;-1:-1:-1;;;38639:117:0;;;;;;;;;;;;;;;;;;;;;38561:10;38544:28;;:16;:28;;;;;;;:92;;-1:-1:-1;;;;;38639:117:0;;;;38599:14;;38544:92;;;;-1:-1:-1;;;38544:92:0;;;;;;;;;;;;;;;;;;;;;:212;;-1:-1:-1;;;;;;38544:212:0;-1:-1:-1;;;;;38544:212:0;;;;;;;;;;;38796:10;38779:28;;:16;:28;;;;;;:34;;;;;-1:-1:-1;;;38779:34:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;38779:34:0;;;;;-1:-1:-1;;;;;;38779:34:0;;;;;;38836:5;;38464:397;38413:16;;;;:::i;:::-;;;;38291:585;;;38058:829;;38904:42;;15610:14:1;;15603:22;15585:41;;-1:-1:-1;;;;;38904:42:0;;;38919:10;;38904:42;;15573:2:1;15558:18;38904:42:0;;;;;;;37803:1151;;;:::o;3096:105::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;3171:12:::1;:22:::0;3096:105::o;31198:964::-;-1:-1:-1;;;;;31355:17:0;;31347:26;;;;;;-1:-1:-1;;;;;31470:20:0;;31485:4;31470:20;;31462:29;;;;;;31558:27;31564:10;31576:8;31558:5;:27::i;:::-;31550:36;;;;;;11803:4;11828:28;;;:16;:28;;;;;;:32;31665:148;;12079:28;;;;:16;:28;;;;;12072:35;31767:34;;;31780:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;31767:34:0;11874:18:1;31767:34:0;;;;;;;31665:148;11658:4;11683:27;;;:15;:27;;;;;:33;;;:37;31876:152;;11956:27;;;;:15;:27;;;;;11949:34;;;;;;31976:40;;;31995:10;11901:51:1;;11983:2;11968:18;;11961:34;;;-1:-1:-1;;;;;;;;;;;31976:40:0;11874:18:1;31976:40:0;;;;;;;31876:152;32118:36;32128:10;32140:3;32145:8;32118:9;:36::i;4556:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4556:53:0;;-1:-1:-1;4556:53:0;;-1:-1:-1;4556:53:0:o;13124:633::-;13239:29;13245:10;13257;13239:5;:29::i;:::-;13231:38;;;;;;11803:4;11828:28;;;:16;:28;;;;;;:32;13346:40;;;;;;13414:1;13405:6;:10;13397:19;;;;;;13560:1;13517:31;;;:19;:31;;;;;;-1:-1:-1;;;;;13517:31:0;:45;13509:54;;;;;;13606:81;;;;;;;;;;;;;;;;;;-1:-1:-1;13576:27:0;;;:15;:27;;;;;:111;;;;;;;;;;;;;13703:46;;13718:10;13815:51:1;;13882:18;;;13875:34;;;13925:18;;;13918:34;;;13703:46:0;;13803:2:1;13788:18;13703:46:0;;;;;;;;13124:633;;:::o;36694:900::-;-1:-1:-1;;;;;36939:17:0;;36931:26;;;;;;-1:-1:-1;;;;;37054:20:0;;37069:4;37054:20;;37046:29;;;;;;37145:34;37158:10;37170:8;37145:12;:34::i;:::-;37137:43;;;;;;37199:22;37205:5;37212:8;37199:5;:22::i;:::-;37191:31;;;;;;37235:39;37253:5;37260:3;37265:8;37235:17;:39::i;:::-;22769:8;22722:18;;22769:8;;37287:300;;37357:169;;-1:-1:-1;;;37357:169:0;;37324:13;;-1:-1:-1;;;;;37357:37:0;;;;;:169;;37417:5;;37373:3;;37471:8;;37502:5;;;;37357:169;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37324:202;-1:-1:-1;;;;;;;;;;37549:25:0;;;37541:34;;;;;;37287:300;;36694:900;;;;;:::o;5367:1140::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;5705:21:::1;:28:::0;5666:36:::1;::::0;:27:::1;::::0;:36:::1;::::0;5694:7;;5666:36:::1;:::i;:::-;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;:67;;;;5744:21:::1;:35:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;5744:35:0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;5826:1;5790:24;5815:7;5790:33;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;5893:18;5840:30;5871:7;5840:39;;;;;;:::i;:::-;;;;;;;;;;;;;5880:9;;;;;;;;;;;;;-1:-1:-1::0;;;5880:9:0::1;;::::0;5840:50:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:71;;;;;;;;;;;;:::i;:::-;;5970:13;5922:30;5953:7;5922:39;;;;;;:::i;:::-;;;;;;;;;;;;;5962:4;;;;;;;;;;;;;-1:-1:-1::0;;;5962:4:0::1;;::::0;5922:45:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;;;;;;;;;:::i;:::-;;6042:13;5994:30;6025:7;5994:39;;;;;;:::i;:::-;;;;;;;;;;;;;6034:4;;;;;;;;;;;;;-1:-1:-1::0;;;6034:4:0::1;;::::0;5994:45:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:61;;;;;;;;;;;;:::i;:::-;;6118:17;6066:30;6097:7;6066:39;;;;;;:::i;:::-;;;;;;;;;;;;;6106:8;;;;;;;;;;;;;-1:-1:-1::0;;;6106:8:0::1;;::::0;6066:49:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:69;;;;;;;;;;;;:::i;:::-;;6196:15;6146:30;6177:7;6146:39;;;;;;:::i;:::-;;;;;;;;;;;;;6186:6;;;;;;;;;;;;;-1:-1:-1::0;;;6186:6:0::1;;::::0;6146:47:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:65;;;;;;;;;;;;:::i;:::-;;6272:1;6224:25;6250:7;6224:34;;;;;;:::i;:::-;;;;;;;;;;;;;6259:9;;;;;;;;;;;;;-1:-1:-1::0;;;6259:9:0::1;;::::0;6224:45:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;;6327:1;6284:25;6310:7;6284:34;;;;;;:::i;:::-;;;;;;;;;;;;;6319:4;;;;;;;;;;;;;-1:-1:-1::0;;;6319:4:0::1;;::::0;6284:40:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:44;;;;6382:1;6339:25;6365:7;6339:34;;;;;;:::i;:::-;;;;;;;;;;;;;6374:4;;;;;;;;;;;;;-1:-1:-1::0;;;6374:4:0::1;;::::0;6339:40:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:44;;;;6441:1;6394:25;6420:7;6394:34;;;;;;:::i;:::-;;;;;;;;;;;;;6429:8;;;;;;;;;;;;;-1:-1:-1::0;;;6429:8:0::1;;::::0;6394:44:::1;;;;;;:::i;:::-;;;;;;;;;;;;;:48;;;;6498:1;6453:25;6479:7;6453:34;;;;;;:::i;:::-;;;;;;;;;;;;;6488:6;;;;;;;;;;;;;-1:-1:-1::0;;;6488:6:0::1;;::::0;6453:42:::1;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:46;-1:-1:-1;;;;;;5367:1140:0:o;40386:263::-;40490:13;40583:21;40606:19;:8;:17;:19::i;:::-;40566:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40521:120;;40386:263;;;:::o;14366:299::-;14434:15;14452:28;;;:16;:28;;;;;;-1:-1:-1;;;;;14452:28:0;14491:36;14469:10;14517:9;14491:13;:36::i;:::-;14538:42;14548:7;14557:10;14569;14538:9;:42::i;:::-;14598:59;;;14614:10;14232:34:1;;14626:9:0;14297:2:1;14282:18;;14275:34;14325:18;;;14318:34;;;-1:-1:-1;;;;;14388:15:1;;14383:2;14368:18;;14361:43;14598:59:0;;14181:3:1;14166:19;14598:59:0;14148:262:1;13765:593:0;13851:29;13857:10;13869;13851:5;:29::i;:::-;13843:38;;;;;;11658:4;11683:27;;;:15;:27;;;;;:33;;;:37;13958:39;;;;;;11803:4;11828:28;;;:16;:28;;;;;;:32;14061:40;;;;;;14245:1;14202:31;;;:19;:31;;;;;;-1:-1:-1;;;;;14202:31:0;:45;14194:54;;;;;;14261:28;;;;:16;:28;;;;;;;;;:41;;;14318:32;;14327:10;11901:51:1;;11968:18;;;11961:34;;;14318:32:0;;11874:18:1;14318:32:0;11856:145:1;38962:725:0;-1:-1:-1;;;;;39163:24:0;;39091:15;39163:24;;;:16;:24;;;;;;;;39124:63;;;;;;;;;;;;;;;;;39091:15;;39124:63;;39163:24;39124:63;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39124:63:0;;;;;;;;;;;;;;;;;;;;;;;39204:19;:26;39234:1;39204:31;39200:76;;;39259:5;39252:12;;;;;39200:76;39305:4;39286:16;39353:296;39422:19;:26;39405:14;:43;39353:296;;;39549:9;-1:-1:-1;;;;;39510:48:0;:19;39530:14;39510:35;;;;;;-1:-1:-1;;;39510:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39510:48:0;;39506:132;;39593:5;39579:19;;39617:5;;39506:132;39463:16;;;;:::i;:::-;;;;39353:296;;;-1:-1:-1;39668:11:0;38962:725;-1:-1:-1;;;;38962:725:0:o;1733:153::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;-1:-1:-1;;;;;1812:22:0;::::1;::::0;1808:71:::1;;1851:5;:16:::0;;-1:-1:-1;;;;;1851:16:0;::::1;-1:-1:-1::0;;;;;;1851:16:0;;::::1;;::::0;;1733:153;:::o;17999:1509::-;18125:24;18152:8;18161:11;18152:21;;;;;;-1:-1:-1;;;18152:21:0;;;;;;;;;;;;;;;;;;;18125:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18184:24;18211:8;18220:11;18211:21;;;;;;-1:-1:-1;;;18211:21:0;;;;;;;;;;;;;;;;;;;18184:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:31;18335:11;11803:4;11828:28;;;:16;:28;;;;;;:32;;;11737:132;18316:31;18308:40;;;;;;18440:30;18446:10;18458:11;18440:5;:30::i;:::-;18432:39;;;;;;18571:30;18577:10;18589:11;18571:5;:30::i;:::-;18570:31;18562:40;;;;;;18794:9;:18;;;18776:9;:15;;;:36;;;;:::i;:::-;18735:9;:18;;;18717:9;:15;;;:36;;;;:::i;:::-;18716:97;;18694:130;;;;;;18838:17;18857:16;18890:168;18922:11;18952;18982:9;19010;19038:5;18890:13;:168::i;:::-;11803:4;11828:28;;;:16;:28;;;;;;18837:221;;-1:-1:-1;18837:221:0;-1:-1:-1;11828:32:0;19071:162;;12079:28;;;;:16;:28;;;;;12072:35;19071:162;;;12079:28;;;;:16;:28;;;;;12072:35;19188:33;19243:22;19268:27;;;:16;:27;;;;;;;19330:26;;;;;;-1:-1:-1;;;;;19268:27:0;;;;19330:26;19369:50;19330:26;19268:27;19347:8;19369:9;:50::i;:::-;19435:65;;;-1:-1:-1;;;;;12293:15:1;;;12275:34;;12340:2;12325:18;;12318:34;;;12388:15;;12368:18;;;12361:43;12435:2;12420:18;;12413:34;;;19435:65:0;;;;;;;12224:3:1;19435:65:0;;;17999:1509;;;;;;;;;:::o;45429:1404::-;45577:20;40841:18;;40828:9;:31;;40820:40;;;;;;24337:8:::1;::::0;::::1;;24336:9;24328:18;;;::::0;::::1;;45641:11:::2;::::0;45623:8:::2;:15:::0;:29:::2;45615:38;;;::::0;::::2;;45664:26;45693:22;45709:5;45693:15;:22::i;:::-;45664:51;;45726:28;45757:38;45775:5;45782:12;45757:17;:38::i;:::-;45726:69;;45806:14;45868:17;45886:14;45868:33;;;;;;:::i;:::-;;;;;;;;;;;;;;45836:29;45859:5;45836:22;:29::i;:::-;:65;;;;:::i;:::-;45806:95;;45912:17;46003;46021:14;46003:33;;;;;;:::i;:::-;::::0;;;::::2;::::0;;;;;::::2;::::0;;;;45945:38:::2;45968:14;45977:5:::0;45968:6;:14:::2;:::i;:::-;45945:22;:38::i;:::-;:91;;;;:::i;:::-;45912:124;;46091:1;46049:24;46074:12;46049:38;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;46162:1;46103:25;46129:12;46103:39;;;;;;:::i;:::-;;;;;;;;;;;;;46143:14;46103:55;;;;;;:::i;:::-;;;;;;;;;;;;;;:60;;;;;;;:::i;:::-;;;;;;;;46176:18;46210:270;46243:2;46264:6;46289:9;46317:10;46346:14;46379:12;46410:25;46436:12;46410:39;;;;;;:::i;:::-;;;;;;;;;;;;;46450:14;46410:55;;;;;;:::i;:::-;;;;;;;;;;;;;;46210:14;:270::i;:::-;46176:304;;46539:18;;46497:24;46522:12;46497:38;;;;;;:::i;:::-;;;;;;;;;;;;;;:60;46493:141;;46574:48;46609:12;46574:34;:48::i;:::-;46646:20;46669:17;:15;:17::i;:::-;46646:40;;46716:18;;46701:12;:33;46697:99;;;46751:18;:33:::0;;;46697:99:::2;-1:-1:-1::0;46815:10:0;45429:1404;-1:-1:-1;;;;;;45429:1404:0:o;24452:73::-;1699:5;;-1:-1:-1;;;;;1699:5:0;1685:10;:19;1677:28;;;;;;24501:8:::1;:16:::0;;-1:-1:-1;;24501:16:0::1;::::0;;24452:73::o;2707:92::-;;;;;;;:::i;6723:178::-;6825:4;6854:26;;;:16;:26;;;;;;-1:-1:-1;;;;;6854:39:0;;;:26;;:39;;6723:178::o;30330:124::-;30405:29;;;;:19;:29;;;;;;:41;;-1:-1:-1;;;;;;30405:41:0;-1:-1:-1;;;;;30405:41:0;;;;;;;;;30330:124::o;29319:766::-;29428:4;29454:29;;;:19;:29;;;;;;-1:-1:-1;;;;;29454:42:0;;;:29;;:42;29450:86;;;-1:-1:-1;29520:4:0;29513:11;;29450:86;29548:22;29606:26;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;29606:26:0;29678:24;;;:16;:24;;;;;29643:59;;;;;;;;;;;;;;;;;29606:26;;29548:22;;29643:59;;;;29678:24;29643:59;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29643:59:0;;;;;;;;;;;;;;;;;;;;;;;29715:22;29748:293;29817:15;:22;29800:14;:39;29748:293;;;29936:9;-1:-1:-1;;;;;29901:44:0;:15;29917:14;29901:31;;;;;;-1:-1:-1;;;29901:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29901:44:0;;29897:133;;;29986:4;29966:24;;30009:5;;29897:133;29854:16;;;;:::i;:::-;;;;29748:293;;;-1:-1:-1;30060:17:0;;29319:766;-1:-1:-1;;;;;29319:766:0:o;6909:587::-;7030:28;;;;:16;:28;;;;;;;;:34;;-1:-1:-1;;;;;;7030:34:0;-1:-1:-1;;;;;7030:34:0;;;;;;;;7075:23;;:18;:23;;;;;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;7210:19:0;;;7206:198;;7348:1;7306:31;;;:19;:31;;;;;;;;:44;;-1:-1:-1;;;;;;7306:44:0;;;-1:-1:-1;;;;;7365:25:0;;;;:18;:25;;;;;:27;;;;;;:::i;:::-;;;;;;7206:198;7477:10;7472:3;-1:-1:-1;;;;;7456:32:0;7465:5;-1:-1:-1;;;;;7456:32:0;;;;;;;;;;;6909:587;;;:::o;419:314::-;470:7;;628:2;585:16;600:1;585:12;:16;:::i;:::-;558:51;;;575:27;;558:51;;;8804:19:1;8839:12;;8832:28;;;8876:12;;558:51:0;;;;;;;;;;;;548:62;;;;;;522:103;;:108;;;;:::i;:::-;490:141;;657:1;646:7;:12;642:57;;-1:-1:-1;685:2:0;718:7;419:314;-1:-1:-1;;419:314:0:o;25593:571::-;25821:28;;-1:-1:-1;;;25821:28:0;;;10225:23:1;10264:11;;25821:28:0;;;;;;;;;;;;25811:39;;;;;;25782:10;25765:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;25755:39;;;;;;:95;25737:420;;;25877:58;25892:10;25904:18;25924:10;25877:14;:58::i;:::-;25737:420;;;26037:25;;-1:-1:-1;;;26037:25:0;;;9965:20:1;10001:11;;26037:25:0;;;;;;;;;;;;26027:36;;;;;;25998:10;25981:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;25971:39;;;;;;:92;25953:204;;;26090:55;26102:10;26114:18;26134:10;26090:11;:55::i;20112:532::-;20168:13;20198:10;20194:53;;-1:-1:-1;20225:10:0;;;;;;;;;;;;-1:-1:-1;;;20225:10:0;;;;;;20194:53;20272:5;20257:12;20313:78;20320:9;;20313:78;;20346:8;;;;:::i;:::-;;-1:-1:-1;20369:10:0;;-1:-1:-1;20377:2:0;20369:10;;:::i;:::-;;;20313:78;;;20401:19;20433:6;20423:17;;;;;;-1:-1:-1;;;20423:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20423:17:0;;20401:39;;20451:154;20458:10;;20451:154;;20485:11;20495:1;20485:11;;:::i;:::-;;-1:-1:-1;20554:10:0;20562:2;20554:5;:10;:::i;:::-;20541:24;;:2;:24;:::i;:::-;20528:39;;20511:6;20518;20511:14;;;;;;-1:-1:-1;;;20511:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;20511:56:0;;;;;;;;-1:-1:-1;20582:11:0;20591:2;20582:11;;:::i;:::-;;;20451:154;;;20629:6;20112:532;-1:-1:-1;;;;20112:532:0:o;19516:500::-;19604:29;19610:10;19622;19604:5;:29::i;:::-;19603:30;19595:39;;;;;;11658:4;11683:27;;;:15;:27;;;;;:33;;;19645:38;;;;;;19712:27;;;;:15;:27;;;;;:33;;;19702:43;;;19694:52;;;;;;19759:21;19783:28;;;:16;:28;;;;;;-1:-1:-1;;;;;19783:28:0;19822:34;19800:10;11956:27;;;;:15;:27;;;;;11949:34;;;;;;11877:114;19822:34;19869:15;19887:21;19901:6;19887:13;:21::i;:::-;19869:39;-1:-1:-1;19919:17:0;19939:16;19869:39;19939:6;:16;:::i;:::-;19966:42;;19919:36;;-1:-1:-1;;;;;;19966:31:0;;;:42;;;;;19919:36;;19966:42;;;;19919:36;19966:31;:42;;;;;;;;;;;;;;;;;;;15254:2737;15456:16;15474:15;15502:22;15540:48;15572:5;15579:8;15540:31;:48::i;:::-;15502:86;;15599:19;15639:9;:15;;;15621:9;:15;;;:33;;;;:::i;:::-;15599:55;;15665:26;15752:9;:15;;;15707:42;15739:5;15746:2;15707:31;:42::i;:::-;:60;;;;:::i;:::-;15665:102;;15778:26;15891:9;:15;;;15820:51;15852:14;15868:2;15820:31;:51::i;:::-;:86;;;;:::i;:::-;15778:128;-1:-1:-1;15964:40:0;;;;;;16017:725;;16084:208;16114:11;16148;16182:9;:18;;;16223:9;:18;;;16264:5;16272:1;16264:9;;;;:::i;:::-;16084:7;:208::i;:::-;16062:314;;;16335:11;16348;16327:33;;;;;;;;;;;16062:314;16017:725;;;16430:217;16460:11;16494;16528:9;:18;;;16569:9;:18;;;16610:14;16627:1;16610:18;;;;:::i;16430:217::-;16408:323;;;16690:11;16703;16682:33;;;;;;;;;;;16408:323;16758:24;16754:725;;;16821:217;16851:11;16885;16919:9;:18;;;16960:9;:18;;;17001:14;17018:1;17001:18;;;;:::i;16821:217::-;16799:323;;;17081:11;17094;17073:33;;;;;;;;;;;16799:323;16754:725;;;17176:208;17206:11;17240;17274:9;:18;;;17315:9;:18;;;17356:5;17364:1;17356:9;;;;:::i;17176:208::-;17154:314;;;17427:11;17440;17419:33;;;;;;;;;;;17154:314;17491:25;17605:51;17637:14;17653:2;17605:31;:51::i;:::-;17567:9;:18;;;17532:9;:15;;;:53;;;;:::i;:::-;:124;;;;:::i;:::-;17491:165;;17667:25;17781:42;17813:5;17820:2;17781:31;:42::i;:::-;17743:9;:18;;;17708:9;:15;;;:53;;;;:::i;:::-;:115;;;;:::i;:::-;17667:156;;17861:17;17840;:38;17836:104;;17903:11;17916;17895:33;;;;;;;;;;;;;17836:104;17958:11;17971;17950:33;;;;;;;;;;;15254:2737;;;;;;;;;:::o;44413:369::-;44489:26;44533:18;44567:67;44598:5;44605:21;:28;;;;44567:30;:67::i;:::-;44533:101;;44741:21;44763:10;44741:33;;;;;;-1:-1:-1;;;44741:33:0;;;;;;;;;;;;;;;;44734:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44413:369;;;:::o;41465:2940::-;41571:13;41602:19;41637:58;41669:5;41676:18;;41637:31;:58::i;:::-;41602:93;;41706:20;41782;;41764:15;;:38;;;;:::i;:::-;41742:18;;:61;;;;:::i;:::-;41706:97;;41814:20;41925;;41907:15;;41889;;:33;;;;:::i;:::-;:56;;;;:::i;:::-;41850:18;;:96;;;;:::i;:::-;41814:132;;41957:24;42157:20;;42118:15;;42079;;42036:19;;:58;;;;:::i;:::-;:97;;;;:::i;:::-;:141;;;;:::i;:::-;41997:18;;:181;;;;:::i;:::-;41957:221;;42275:20;;42209:25;42235:12;42209:39;;;;;;:::i;:::-;;;;;;;;;;;;;42249:9;;;;;;;;;;;;;-1:-1:-1;;;42249:9:0;;;42209:50;;;;;;:::i;:::-;;;;;;;;;;;;;;:86;:136;;;;;42327:18;;42312:11;:33;42209:136;42191:209;;;42379:9;;;;;;;;;;;;;-1:-1:-1;;;42379:9:0;;;42372:16;;;;;;;;42191:209;42476:15;;42428:25;42454:12;42428:39;;;;;;:::i;:::-;;;;;;;;;;;;;42468:4;;;;;;;;;;;;;-1:-1:-1;;;42468:4:0;;;42428:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:63;:107;;;;;42523:12;42508:11;:27;;42428:107;42410:175;;;42569:4;;;;;;;;;;;;;-1:-1:-1;;;42569:4:0;;;42562:11;;;;;;;;42410:175;42661:15;;42613:25;42639:12;42613:39;;;;;;:::i;:::-;;;;;;;;;;;;;42653:4;;;;;;;;;;;;;-1:-1:-1;;;42653:4:0;;;42613:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:63;:107;;;;;42708:12;42693:11;:27;;42613:107;42595:175;;;42754:4;;;;;;;;;;;;;-1:-1:-1;;;42754:4:0;;;42747:11;;;;;;;;42595:175;42863:19;;42798:25;42824:12;42798:39;;;;;;:::i;:::-;;;;;;;;;;;;;42838:8;;;;;;;;;;;;;-1:-1:-1;;;42838:8:0;;;42798:49;;;;;;:::i;:::-;;;;;;;;;;;;;;:84;:132;;;;;42914:16;42899:11;:31;;42798:132;42780:204;;;42964:8;;;;;;;;;;;;;-1:-1:-1;;;42964:8:0;;;42957:15;;;;;;;;42780:204;43075:17;;43012:25;43038:12;43012:39;;;;;;:::i;:::-;;;;;;;;;;;;;43052:6;;;;;;;;;;;;;-1:-1:-1;;;43052:6:0;;;43012:47;;;;;;:::i;:::-;;;;;;;;;;;;;;:80;:113;;;;;43124:1;43109:11;:16;;43012:113;42994:183;;;43159:6;;;;;;;;;;;;;-1:-1:-1;;;43159:6:0;;;43152:13;;;;;;;;42994:183;43189:33;43317:20;;43251:25;43277:12;43251:39;;;;;;:::i;:::-;;;;;;;;;;;;;43291:9;;;;;;;;;;;;;-1:-1:-1;;;43291:9:0;;;43251:50;;;;;;:::i;:::-;;;;;;;;;;;;;;:86;43233:198;;;43410:9;;;;;;;;;;;;-1:-1:-1;;;43410:9:0;;;;43382:24;;43364:17;;-1:-1:-1;;;43364:43:0;;;;;;;;43233:198;43493:15;;43445:25;43471:12;43445:39;;;;;;:::i;:::-;;;;;;;;;;;;;43485:4;;;;;;;;;;;;;-1:-1:-1;;;43485:4:0;;;43445:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:63;43441:146;;;43571:4;;;;;;;;;;;;-1:-1:-1;;;43571:4:0;;;;43543:24;;43525:17;;-1:-1:-1;;;43525:43:0;;;;;;;;43441:146;43649:15;;43601:25;43627:12;43601:39;;;;;;:::i;:::-;;;;;;;;;;;;;43641:4;;;;;;;;;;;;;-1:-1:-1;;;43641:4:0;;;43601:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:63;43597:146;;;43727:4;;;;;;;;;;;;-1:-1:-1;;;43727:4:0;;;;43699:24;;43681:17;;-1:-1:-1;;;43681:43:0;;;;;;;;43597:146;43836:19;;43771:25;43797:12;43771:39;;;;;;:::i;:::-;;;;;;;;;;;;;43811:8;;;;;;;;;;;;;-1:-1:-1;;;43811:8:0;;;43771:49;;;;;;:::i;:::-;;;;;;;;;;;;;;:84;43753:195;;;43928:8;;;;;;;;;;;;-1:-1:-1;;;43928:8:0;;;;43900:24;;43882:17;;-1:-1:-1;;;43882:43:0;;;;;;;;43753:195;44026:17;;43976:25;44002:12;43976:39;;;;;;:::i;:::-;;;;;;;;;;;;;44016:6;;;;;;;;;;;;;-1:-1:-1;;;44016:6:0;;;43976:47;;;;;;:::i;:::-;;;;;;;;;;;;;;:67;43958:176;;;44116:6;;;;;;;;;;;;-1:-1:-1;;;44116:6:0;;;;44088:24;;44070:17;;-1:-1:-1;;;44070:43:0;;;;;;;;43958:176;44150:17;:24;44178:1;44150:29;44146:89;;;44203:17;44221:1;44203:20;;;;;;-1:-1:-1;;;44203:20:0;;;;;;;;;;;;;;;44196:27;;;;;;;;;44146:89;44247:21;44284:63;44315:5;44322:17;:24;44284:30;:63::i;:::-;44247:100;;44365:17;44383:13;44365:32;;;;;;-1:-1:-1;;;44365:32:0;;;;;;;;;;;;;;;44358:39;;;;;;;;41465:2940;;;;:::o;7504:1299::-;7749:7;7769:27;7812:30;7843:5;7812:37;;;;;;:::i;:::-;;;;;;;;;;;;;7850:7;7812:46;;;;;;:::i;:::-;;;;;;;;;;;;;7769:89;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7869:23;7908:361;;;;;;;;7946:10;7908:361;;;;7983:10;7908:361;;;;8070:6;7908:361;;;;8105:9;7908:361;;;;8139:5;7908:361;;;;8171:7;7908:361;;;;8204:13;7908:361;;;;8245:8;7908:361;;;7869:400;;8282:20;8305:8;:15;;;;8282:38;;8331:8;8345;8331:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8331:23:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8331:23:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;8372:230;8395:6;8416:12;8443:10;8468:6;8489:9;8513:7;8535:5;8555:13;8583:8;8372:230;;;;;;;;;;;;;;:::i;:::-;;;;;;;;8720:43;8738:1;8742:6;8750:12;8720:9;:43::i;:::-;8783:12;7504:1299;-1:-1:-1;;;;;;;;;;7504:1299:0:o;44790:631::-;44896:18;44917:27;44945:12;44917:41;;;;;;:::i;:::-;;;;;;;;;;;;;;44896:62;;45101:12;45084:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;45074:41;;;;;;45018:21;45040:10;45018:33;;;;;;-1:-1:-1;;;45018:33:0;;;;;;;;;;;;;;;;45001:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;44991:62;;;;;;:124;44969:157;;;;;;45192:21;:28;45223:1;-1:-1:-1;45188:188:0;;;45277:21;45317:28;;:32;;45348:1;;45317:32;:::i;:::-;45277:87;;;;;;-1:-1:-1;;;45277:87:0;;;;;;;;;;;;;;;;45241:21;45263:10;45241:33;;;;;;-1:-1:-1;;;45241:33:0;;;;;;;;;;;;;;;;:123;;;;;;:::i;:::-;;;;;;:::i;:::-;;45188:188;45386:21;:27;;;;;-1:-1:-1;;;45386:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44790:631;;:::o;46841:1808::-;46943:8;:15;46886:13;;;;46943:19;;46961:1;;46943:19;:::i;:::-;46912:50;;47002:3;46979:20;:26;46975:87;;;47029:21;47022:28;;;;;46975:87;47100:3;47076:20;:27;;:58;;;;;47130:4;47107:20;:27;47076:58;47072:120;;;47158:22;47151:29;;;;;47072:120;47230:4;47206:20;:28;;:59;;;;;47261:4;47238:20;:27;47206:59;47202:121;;;47289:22;47282:29;;;;;47202:121;47361:4;47337:20;:28;;:59;;;;;47392:4;47369:20;:27;47337:59;47333:121;;;47420:22;47413:29;;;;;47333:121;47492:4;47468:20;:28;;:59;;;;;47523:4;47500:20;:27;47468:59;47464:121;;;47551:22;47544:29;;;;;47464:121;47623:4;47599:20;:28;;:59;;;;;47654:4;47631:20;:27;47599:59;47595:121;;;47682:22;47675:29;;;;;47595:121;47754:4;47730:20;:28;;:59;;;;;47785:4;47762:20;:27;47730:59;47726:121;;;47813:22;47806:29;;;;;47726:121;47885:4;47861:20;:28;;:59;;;;;47916:4;47893:20;:27;47861:59;47857:121;;;47944:22;47937:29;;;;;47857:121;48016:4;47992:20;:28;;:59;;;;;48047:4;48024:20;:27;47992:59;47988:121;;;48075:22;48068:29;;;;;47988:121;48147:4;48123:20;:28;;:59;;;;;48178:4;48155:20;:27;48123:59;48119:121;;;48206:22;48199:29;;;;;48119:121;48278:4;48254:20;:28;;:59;;;;;48309:4;48286:20;:27;48254:59;48250:121;;;48337:22;48330:29;;;;;48250:121;48409:4;48385:20;:28;;:59;;;;;48440:4;48417:20;:27;48385:59;48381:121;;;48468:22;48461:29;;;;;48381:121;48540:4;48516:20;:28;48512:90;;48568:22;48561:29;;;;;48512:90;48619:22;48612:29;;;46841:1808;:::o;9383:452::-;9525:23;9551:8;9560:10;9551:20;;;;;;-1:-1:-1;;;9551:20:0;;;;;;;;;;;;;;;;;;;9525:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9603:18;9582:8;:17;;:39;;;;;;;:::i;:::-;;;-1:-1:-1;9632:45:0;9656:8;9666:10;9632:23;:45::i;:::-;9695:132;;;-1:-1:-1;;;;;13320:32:1;;13302:51;;13384:2;13369:18;;13362:34;;;13432:3;13412:18;;;13405:31;;;13473:1;13452:19;;;13445:30;;;;-1:-1:-1;;;13340:3:1;13491:19;;13484:39;13590:2;13575:18;;13568:34;;;9695:132:0;;13555:3:1;13540:19;9695:132:0;;;;;;;;9383:452;;;;:::o;8995:380::-;9134:23;9160:8;9169:10;9160:20;;;;;;-1:-1:-1;;;9160:20:0;;;;;;;;;;;;;;;;;;;9134:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9209:18;9191:8;:14;;:36;;;;;;;:::i;:::-;;;-1:-1:-1;9238:45:0;9262:8;9272:10;9238:23;:45::i;:::-;9301:66;;;-1:-1:-1;;;;;12744:32:1;;12726:51;;12808:2;12793:18;;12786:34;;;12856:3;12836:18;;;12829:31;;;12897:1;12876:19;;;12869:30;;;;-1:-1:-1;;;12764:3:1;12915:19;;12908:36;13011:2;12996:18;;12989:34;;;9301:66:0;;12976:3:1;12961:19;9301:66:0;12716:313:1;11450:135:0;11562:14;;11512:7;;11541:17;11555:3;11541:11;:17;:::i;:::-;11540:36;;;;:::i;1100:361::-;1191:7;;1354:3;1311:16;1326:1;1311:12;:16;:::i;:::-;1284:51;;;1301:27;;1284:51;;;8804:19:1;8839:12;;8832:28;;;8876:12;;1284:51:0;;;;;;;;;;;;1274:62;;;;;;1248:103;;:109;;;;:::i;:::-;1216:142;;1384:1;1373:7;:12;1369:58;;-1:-1:-1;1412:3:0;1369:58;1446:7;1100:361;-1:-1:-1;;;1100:361:0:o;14673:573::-;14871:4;14888:27;14976:17;14931:42;14963:5;14970:2;14931:31;:42::i;:::-;:62;;;;:::i;:::-;14888:105;-1:-1:-1;15004:28:0;15097:17;15048:46;15080:9;:5;15088:1;15080:9;:::i;:::-;15091:2;15048:31;:46::i;:::-;:66;;;;:::i;:::-;15004:110;;15154:20;15131:19;:43;15127:87;;15198:4;15191:11;;;;;;15127:87;15233:5;15226:12;;;;14673:573;;;;;;;;:::o;859:233::-;949:7;1080:3;1041:16;1056:1;1041:12;:16;:::i;:::-;1014:51;;;1031:27;;1014:51;;;8804:19:1;8839:12;;8832:28;;;8876:12;;1014:51:0;;;;;;;;;;;;1004:62;;;;;;982:95;;:101;;;;:::i;8811:176::-;8964:15;8941:8;8950:10;8941:20;;;;;;-1:-1:-1;;;8941:20:0;;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8941:38:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8941:38:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8811:176;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:739;;288:3;281:4;273:6;269:17;265:27;255:2;;310:5;303;296:20;255:2;350:6;337:20;376:18;413:2;409;406:10;403:2;;;419:18;;:::i;:::-;494:2;488:9;462:2;548:13;;-1:-1:-1;;544:22:1;;;568:2;540:31;536:40;524:53;;;592:18;;;612:22;;;589:46;586:2;;;638:18;;:::i;:::-;678:10;674:2;667:22;713:2;705:6;698:18;759:3;752:4;747:2;739:6;735:15;731:26;728:35;725:2;;;780:5;773;766:20;725:2;848;841:4;833:6;829:17;822:4;814:6;810:17;797:54;871:15;;;888:4;867:26;860:41;;;;-1:-1:-1;875:6:1;245:686;-1:-1:-1;;;245:686:1:o;936:196::-;;1048:2;1036:9;1027:7;1023:23;1019:32;1016:2;;;1069:6;1061;1054:22;1016:2;1097:29;1116:9;1097:29;:::i;1137:270::-;;;1266:2;1254:9;1245:7;1241:23;1237:32;1234:2;;;1287:6;1279;1272:22;1234:2;1315:29;1334:9;1315:29;:::i;:::-;1305:39;;1363:38;1397:2;1386:9;1382:18;1363:38;:::i;:::-;1353:48;;1224:183;;;;;:::o;1412:338::-;;;;1558:2;1546:9;1537:7;1533:23;1529:32;1526:2;;;1579:6;1571;1564:22;1526:2;1607:29;1626:9;1607:29;:::i;:::-;1597:39;;1655:38;1689:2;1678:9;1674:18;1655:38;:::i;:::-;1645:48;;1740:2;1729:9;1725:18;1712:32;1702:42;;1516:234;;;;;:::o;1755:858::-;;;;;;1937:3;1925:9;1916:7;1912:23;1908:33;1905:2;;;1959:6;1951;1944:22;1905:2;1987:29;2006:9;1987:29;:::i;:::-;1977:39;;2035:38;2069:2;2058:9;2054:18;2035:38;:::i;:::-;2025:48;;2120:2;2109:9;2105:18;2092:32;2082:42;;2175:2;2164:9;2160:18;2147:32;2198:18;2239:2;2231:6;2228:14;2225:2;;;2260:6;2252;2245:22;2225:2;2303:6;2292:9;2288:22;2278:32;;2348:7;2341:4;2337:2;2333:13;2329:27;2319:2;;2375:6;2367;2360:22;2319:2;2420;2407:16;2446:2;2438:6;2435:14;2432:2;;;2467:6;2459;2452:22;2432:2;2517:7;2512:2;2503:6;2499:2;2495:15;2491:24;2488:37;2485:2;;;2543:6;2535;2528:22;2485:2;1895:718;;;;-1:-1:-1;1895:718:1;;-1:-1:-1;2579:2:1;2571:11;;2601:6;1895:718;-1:-1:-1;;;1895:718:1:o;2618:367::-;;;2744:2;2732:9;2723:7;2719:23;2715:32;2712:2;;;2765:6;2757;2750:22;2712:2;2793:29;2812:9;2793:29;:::i;:::-;2783:39;;2872:2;2861:9;2857:18;2844:32;2919:5;2912:13;2905:21;2898:5;2895:32;2885:2;;2946:6;2938;2931:22;2885:2;2974:5;2964:15;;;2702:283;;;;;:::o;2990:264::-;;;3119:2;3107:9;3098:7;3094:23;3090:32;3087:2;;;3140:6;3132;3125:22;3087:2;3168:29;3187:9;3168:29;:::i;:::-;3158:39;3244:2;3229:18;;;;3216:32;;-1:-1:-1;;;3077:177:1:o;3259:255::-;;3370:2;3358:9;3349:7;3345:23;3341:32;3338:2;;;3391:6;3383;3376:22;3338:2;3435:9;3422:23;3454:30;3478:5;3454:30;:::i;3519:259::-;;3641:2;3629:9;3620:7;3616:23;3612:32;3609:2;;;3662:6;3654;3647:22;3609:2;3699:9;3693:16;3718:30;3742:5;3718:30;:::i;3783:342::-;;3905:2;3893:9;3884:7;3880:23;3876:32;3873:2;;;3926:6;3918;3911:22;3873:2;3971:9;3958:23;4004:18;3996:6;3993:30;3990:2;;;4041:6;4033;4026:22;3990:2;4069:50;4111:7;4102:6;4091:9;4087:22;4069:50;:::i;4130:573::-;;;4279:2;4267:9;4258:7;4254:23;4250:32;4247:2;;;4300:6;4292;4285:22;4247:2;4345:9;4332:23;4374:18;4415:2;4407:6;4404:14;4401:2;;;4436:6;4428;4421:22;4401:2;4464:50;4506:7;4497:6;4486:9;4482:22;4464:50;:::i;:::-;4454:60;;4567:2;4556:9;4552:18;4539:32;4523:48;;4596:2;4586:8;4583:16;4580:2;;;4617:6;4609;4602:22;4580:2;;4645:52;4689:7;4678:8;4667:9;4663:24;4645:52;:::i;:::-;4635:62;;;4237:466;;;;;:::o;4708:1416::-;;;;;;;4965:3;4953:9;4944:7;4940:23;4936:33;4933:2;;;4987:6;4979;4972:22;4933:2;5032:9;5019:23;5061:18;5102:2;5094:6;5091:14;5088:2;;;5123:6;5115;5108:22;5088:2;5151:50;5193:7;5184:6;5173:9;5169:22;5151:50;:::i;:::-;5141:60;;5254:2;5243:9;5239:18;5226:32;5210:48;;5283:2;5273:8;5270:16;5267:2;;;5304:6;5296;5289:22;5267:2;5332:52;5376:7;5365:8;5354:9;5350:24;5332:52;:::i;:::-;5322:62;;5437:2;5426:9;5422:18;5409:32;5393:48;;5466:2;5456:8;5453:16;5450:2;;;5487:6;5479;5472:22;5450:2;5515:52;5559:7;5548:8;5537:9;5533:24;5515:52;:::i;:::-;5505:62;;5620:2;5609:9;5605:18;5592:32;5576:48;;5649:2;5639:8;5636:16;5633:2;;;5670:6;5662;5655:22;5633:2;5698:52;5742:7;5731:8;5720:9;5716:24;5698:52;:::i;:::-;5688:62;;5803:3;5792:9;5788:19;5775:33;5759:49;;5833:2;5823:8;5820:16;5817:2;;;5854:6;5846;5839:22;5817:2;5882:52;5926:7;5915:8;5904:9;5900:24;5882:52;:::i;:::-;5872:62;;5987:3;5976:9;5972:19;5959:33;5943:49;;6017:2;6007:8;6004:16;6001:2;;;6038:6;6030;6023:22;6001:2;;6066:52;6110:7;6099:8;6088:9;6084:24;6066:52;:::i;:::-;6056:62;;;4923:1201;;;;;;;;:::o;6129:190::-;;6241:2;6229:9;6220:7;6216:23;6212:32;6209:2;;;6262:6;6254;6247:22;6209:2;-1:-1:-1;6290:23:1;;6199:120;-1:-1:-1;6199:120:1:o;6324:478::-;;;;6480:2;6468:9;6459:7;6455:23;6451:32;6448:2;;;6501:6;6493;6486:22;6448:2;6542:9;6529:23;6519:33;;6603:2;6592:9;6588:18;6575:32;6630:18;6622:6;6619:30;6616:2;;;6667:6;6659;6652:22;6616:2;6695:50;6737:7;6728:6;6717:9;6713:22;6695:50;:::i;:::-;6685:60;;;6792:2;6781:9;6777:18;6764:32;6754:42;;6438:364;;;;;:::o;6807:258::-;;;6936:2;6924:9;6915:7;6911:23;6907:32;6904:2;;;6957:6;6949;6942:22;6904:2;-1:-1:-1;;6985:23:1;;;7055:2;7040:18;;;7027:32;;-1:-1:-1;6894:171:1:o;7070:326::-;;;;7216:2;7204:9;7195:7;7191:23;7187:32;7184:2;;;7237:6;7229;7222:22;7184:2;-1:-1:-1;;7265:23:1;;;7335:2;7320:18;;7307:32;;-1:-1:-1;7386:2:1;7371:18;;;7358:32;;7174:222;-1:-1:-1;7174:222:1:o;7401:258::-;;7481:5;7475:12;7508:6;7503:3;7496:19;7524:63;7580:6;7573:4;7568:3;7564:14;7557:4;7550:5;7546:16;7524:63;:::i;:::-;7641:2;7620:15;-1:-1:-1;;7616:29:1;7607:39;;;;7648:4;7603:50;;7451:208;-1:-1:-1;;7451:208:1:o;7664:978::-;7749:12;;7664:978;;7821:1;7806:17;;7842:1;7878:18;;;;7905:2;;7959:4;7951:6;7947:17;7937:27;;7905:2;7985;8033;8025:6;8022:14;8002:18;7999:38;7996:2;;;-1:-1:-1;;;8060:33:1;;8116:4;8113:1;8106:15;8146:4;8067:3;8134:17;7996:2;8177:18;8204:104;;;;8322:1;8317:319;;;;8170:466;;8204:104;-1:-1:-1;;8237:24:1;;8225:37;;8282:16;;;;-1:-1:-1;8204:104:1;;8317:319;17344:127;17410:17;;;17460:4;17444:21;;8411:1;8425:165;8439:6;8436:1;8433:13;8425:165;;;8517:14;;8504:11;;;8497:35;8560:16;;;;8454:10;;8425:165;;;8429:3;;8619:6;8614:3;8610:16;8603:23;;8170:466;;;;;;;7722:920;;;;:::o;8899:276::-;;9068:6;9062:13;9084:53;9130:6;9125:3;9118:4;9110:6;9106:17;9084:53;:::i;:::-;9153:16;;;;;9038:137;-1:-1:-1;;9038:137:1:o;9180:197::-;;9333:38;9367:3;9359:6;9333:38;:::i;9382:376::-;;9586:38;9620:3;9612:6;9586:38;:::i;:::-;9653:6;9647:13;9669:52;9714:6;9710:2;9703:4;9695:6;9691:17;9669:52;:::i;:::-;9737:15;;9566:192;-1:-1:-1;;;;9566:192:1:o;10494:665::-;-1:-1:-1;;;;;10773:15:1;;;10755:34;;10825:15;;10820:2;10805:18;;10798:43;10872:2;10857:18;;10850:34;;;10920:3;10915:2;10900:18;;10893:31;;;10940:19;;10933:35;;;10494:665;10961:6;11011;10735:3;10990:19;;10977:49;11046:22;;;11070:3;11042:32;;;11035:46;;;;11142:2;11121:15;;;-1:-1:-1;;11117:29:1;11102:45;11098:55;;10707:452;-1:-1:-1;;;;10707:452:1:o;14415:1025::-;;14820:3;14879:1;14875;14870:3;14866:11;14862:19;14854:6;14850:32;14839:9;14832:51;14919:6;14914:2;14903:9;14899:18;14892:34;14962:6;14957:2;14946:9;14942:18;14935:34;15005:6;15000:2;14989:9;14985:18;14978:34;15049:6;15043:3;15032:9;15028:19;15021:35;15093:2;15087:3;15076:9;15072:19;15065:31;15119:45;15160:2;15149:9;15145:18;15137:6;15119:45;:::i;:::-;15105:59;;15213:9;15205:6;15201:22;15195:3;15184:9;15180:19;15173:51;15247:33;15273:6;15265;15247:33;:::i;:::-;15233:47;;15329:9;15321:6;15317:22;15311:3;15300:9;15296:19;15289:51;15357:33;15383:6;15375;15357:33;:::i;:::-;15349:41;;;15427:6;15421:3;15410:9;15406:19;15399:35;14800:640;;;;;;;;;;;;:::o;15844:220::-;;15993:2;15982:9;15975:21;16013:45;16054:2;16043:9;16039:18;16031:6;16013:45;:::i;16504:835::-;;16861:6;16850:9;16843:25;16904:6;16899:2;16888:9;16884:18;16877:34;16947:6;16942:2;16931:9;16927:18;16920:34;16990:3;16985:2;16974:9;16970:18;16963:31;17017:46;17058:3;17047:9;17043:19;17035:6;17017:46;:::i;:::-;17112:9;17104:6;17100:22;17094:3;17083:9;17079:19;17072:51;17146:33;17172:6;17164;17146:33;:::i;:::-;17132:47;;17228:9;17220:6;17216:22;17210:3;17199:9;17195:19;17188:51;17256:33;17282:6;17274;17256:33;:::i;:::-;17248:41;;;17326:6;17320:3;17309:9;17305:19;17298:35;16833:506;;;;;;;;;;:::o;17476:128::-;;17547:1;17543:6;17540:1;17537:13;17534:2;;;17553:18;;:::i;:::-;-1:-1:-1;17589:9:1;;17524:80::o;17609:120::-;;17675:1;17665:2;;17680:18;;:::i;:::-;-1:-1:-1;17714:9:1;;17655:74::o;17734:168::-;;17840:1;17836;17832:6;17828:14;17825:1;17822:21;17817:1;17810:9;17803:17;17799:45;17796:2;;;17847:18;;:::i;:::-;-1:-1:-1;17887:9:1;;17786:116::o;17907:125::-;;17975:1;17972;17969:8;17966:2;;;17980:18;;:::i;:::-;-1:-1:-1;18017:9:1;;17956:76::o;18037:258::-;18109:1;18119:113;18133:6;18130:1;18127:13;18119:113;;;18209:11;;;18203:18;18190:11;;;18183:39;18155:2;18148:10;18119:113;;;18250:6;18247:1;18244:13;18241:2;;;-1:-1:-1;;18285:1:1;18267:16;;18260:27;18090:205::o;18300:136::-;;18367:5;18357:2;;18376:18;;:::i;:::-;-1:-1:-1;;;18412:18:1;;18347:89::o;18441:380::-;18526:1;18516:12;;18573:1;18563:12;;;18584:2;;18638:4;18630:6;18626:17;18616:27;;18584:2;18691;18683:6;18680:14;18660:18;18657:38;18654:2;;;18737:10;18732:3;18728:20;18725:1;18718:31;18772:4;18769:1;18762:15;18800:4;18797:1;18790:15;18654:2;;18496:325;;;:::o;18826:135::-;;-1:-1:-1;;18886:17:1;;18883:2;;;18906:18;;:::i;:::-;-1:-1:-1;18953:1:1;18942:13;;18873:88::o;18966:112::-;;19024:1;19014:2;;19029:18;;:::i;:::-;-1:-1:-1;19063:9:1;;19004:74::o;19083:127::-;19144:10;19139:3;19135:20;19132:1;19125:31;19175:4;19172:1;19165:15;19199:4;19196:1;19189:15;19215:127;19276:10;19271:3;19267:20;19264:1;19257:31;19307:4;19304:1;19297:15;19331:4;19328:1;19321:15;19347:127;19408:10;19403:3;19399:20;19396:1;19389:31;19439:4;19436:1;19429:15;19463:4;19460:1;19453:15;19479:131;-1:-1:-1;;;;;;19553:32:1;;19543:43;;19533:2;;19600:1;19597;19590:12

Swarm Source

ipfs://6e89ee0f8d041e1bbc388a14a16b87316463cd4d1cba57214e40420abe5f58b6
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.