ETH Price: $2,416.81 (+0.63%)

Token

Band Of Crazy (BOC)
 

Overview

Max Total Supply

234 BOC

Holders

94

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
99olive99.eth
Balance
2 BOC
0x13817e2e6751585a1314b6e5468ed433760b46c9
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BandOfCrazy

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 16: BandOfCrazy.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

/*
MNK0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000KNM
MO'..   ................................   .... ..... ..  ...  ................................. 'kM
Mk.                                           ......,;;,'.                                       .kM
Mk.                                     .;ldk0KXXXXNWMWWNKOdc,.                                  .kM
Mk.                                 .;oOXWMMMMMMMMMMMMMMMMMMMWKx:.                               .kM
Mk.                             .,lkKWMMMMMMMMMMMMMMMMMMMMMMMMMMWXx:.                            .kM
Mk.                          'lkKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKd'                          .kM
Mk.                        .oXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd'                        .kM
Mk.                        lNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0,                       .kM
Mk.                       ,0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO'                      .kM
Mk.                      .dWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWd.                     .kM
Mk.                      ;KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.                     .kM
Mk.                     .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.                     .kM
Mk.                     ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk.                     .kM
Mk.                     oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx.                     .kM
Mk.                    .dWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk.                     .kM
Mk.                    .xMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.                     .kM
Mk.                    .OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK,                     .kM
Mk.                    ,KMMMMMMMMMWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNc                     .kM
Mk.                    lNMMMMMMM0l:;;;:lx0XWMMMMMMMMMMMMWMMMUNLEARNkNMMMMMNl                     .kM
Mk.                   .xMMMMMMMWl        ..:d0NMMMMMMNOo:'.        ,KMMMMMNc                     .kM
Mk.                    oWMMMMMMMk.           .;0MMMMK:             :XMMMMMK,                     .kM
Mk.                    '0MMMMMMMWk:..     ..';oKMMMMNxc,...     ..:0WMMMMWx.                     .kM
Mk.                     cXMMMMMMMMWXK0OOO00KNWMMMMMMMMMWXK00OOOO0XWMMMMMMX:                      .kM
Mk.                     .oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.                      .kM
Mk.                      .OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWo                       .kM
Mk.                       :XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX;                       .kM
Mk.                       .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx.                       .kM
Mk.                        ;KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX:                        .kM
Mk.                         oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWx.                        .kM
Mk.                         .kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK,                         .kM
Mk.                          '0MMMMMMMMMMMMMMWNK0000KKNWMMMMMMMMMMMMMXc                          .kM
Mk.                           lWMMMMMMMMMMW0l,...  ....;dXMMMMMMMMMMWd.                          .kM
Mk.                           ,KMMMMMMMMMMX;            .xMMMMMMMMMMNl                           .kM
Mk.                          .dNMMMMMMMMMMNl            ;0MMMMMMMMMMWo                           .kM
Mk.                         ;0WMMMMMMMMMMMMXd,.       'oKMMMMMMMMMMMWk.                          .kM
Mk.                       .lXMMMMMMMMMMMMMMMMN0xooooxOXWMMMMMMMMMMMMMW0l'                        .kM
Mk.                      ,kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXx;                      .kM
Mk.                    .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx.                    .kM
Mk.                    ,KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNl                    .kM
Mk.                    .OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX:                    .kM
Mk.                     ;KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWd.                    .kM
Mk.                      :XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo.                     .kM
Mk.                       ;ONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWO;                       .kM
Mk.                        .;dKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNk:.                        .kM
Mk.                           .:xKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWN0o,                           .kM
Mk.                              .;ok0NWMMMMMMMMMMMMMMMMMMMMMWXOxc'.                             .kM
Mk.                                  ..;cldxkO0KKKKKK00Okxol:,.                                  .kM
MKocccccccccccccccccccccccccccccccccccccccccloodddddddollccccccccccccccccccccccccccccccccccccccccoKM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
*/

// Everybody be cool! This is a robbery! https://twitter.com/BandOfCrazy
// Smart contract developed by Ian Cherkowski https://twitter.com/IanCherkowski

import "./ERC721A.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./ReentrancyGuard.sol";
import "./ERC2981.sol";
import "./MerkleProof.sol";
import "./Strings.sol";

contract BandOfCrazy is
    ERC721A,
    ReentrancyGuard,
    Ownable,
    ERC2981
{
    event PaymentReceived(address from, uint256 amount);
    using Strings for uint256;

    struct Character {
        string name;
        uint16 supply;
        uint16 minted;
        uint16 lower;
        uint16 upper;
        uint256 cost;
        uint256 discount;
    }
    Character[] public characters; // store a list of character

    struct Tool {
        string name;
        uint16 count;
        uint16 ability;
        uint256 cost;
        uint256 tokens;
    }
    Tool[] public tools; // store a list of tools

    string private constant _name = "Band Of Crazy";
    string private constant _symbol = "BOC";
    string public baseURI = "https://ipfs.io/ipfs/QmWJPZraaS3ZcqsMYJhMU8QYNvRKYBukK62tVtst1yXaJx/";
    uint16[5] public maxMint = [0, 2, 6, 3, 3];
    uint16 public maxSupply = 3885;
    uint16[] public ability = [0]; //id starts at 1
    uint16[] public character = [0]; //id starts at 1
    bool[5] public phaseActive;
    bool public revealed = false;
    bytes32 public whitelistMerkleRoot;
	mapping(address => uint16[5]) public minted;
    mapping(uint16 => uint16) public left;
    mapping(uint16 => uint16) public right;
    mapping(uint16 => bool) public jailed;
    address public jailer = msg.sender;

    IERC20 public stakingToken20 = IERC20(0x05cd75f850E0ca64FF780f52B0AAC5558ae95265);

    constructor() ERC721A(_name, _symbol) payable {
        _setDefaultRoyalty(address(this), 1000);
        tools.push(Tool("None", 0, 1, 2, 3)); //0 tool is skipped
        characters.push(Character("None", 0, 0, 0, 0, 0, 0)); //0 character is skipped
    }

    // @dev to support payments
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    // create characters
    function setup() external onlyOwner {
        characters.push(Character("The Driver", 555, 0, 2, 4, 0.03 ether, 0));
        characters.push(Character("The Thief", 555, 0, 4, 7, 0.03 ether, 0));
        characters.push(Character("The Inside Man", 555, 0, 7, 10, 0.06 ether, 0.03 ether));
        characters.push(Character("The Hacker", 555, 0, 10, 13, 0.06 ether, 0.03 ether));
        characters.push(Character("The Mastermind", 555, 0, 13, 16, 0.06 ether, 0.03 ether));
        characters.push(Character("The Phantom", 555, 0, 10, 13, 0.06 ether, 0.03 ether));
        characters.push(Character("The Wild Card", 555, 0, 7, 16, 0.06 ether, 0.03 ether));
    }

    // @dev added to support royalties 
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    // @dev public minting of The Guv’nors Game
	function mint(address to, uint16 _mintAmount, bytes32[] calldata merkleProof, uint16 phase) external payable nonReentrant {
        uint16 _character;

        require(Address.isContract(msg.sender) == false, "Band: no contracts");
        require(totalSupply() + _mintAmount <= maxSupply, "Band: Cant mint more than max supply");
        if (phase == 0) {phase = 1;}
        require(phaseActive[phase], "Band: phase is paused");

        if (msg.sender != owner()) {
            require(minted[msg.sender][phase] + _mintAmount <= maxMint[phase], "Band: Must mint less than the max");
        }

        bool approved = isValidMerkleProof(msg.sender, merkleProof);

        //choose character to be minted
        _character = whichCharacter(phase, 10);

        if (msg.sender == owner()) {
            // This is used by the governer to pay out bribes to get you idiots out of jail.
        } else if (merkleProof.length == 0) {
            //proof not provided so full price
            require(msg.value >= characters[_character].cost * _mintAmount, "Band: You must register on premint or pay for the nft");
        } else if (approved == true) {
            //has registered at premint so give a discount, maybe even free
            require(msg.value >= characters[_character].discount * _mintAmount, "Band: Discounted price must be paid");
        } else {
            //has not registered so full price
            require(msg.value >= characters[_character].cost * _mintAmount, "Band: You must register on premint or pay for the nft");
        }

        // We don't want you crying to mummy about high gas fees do we?
        unchecked{
            minted[msg.sender][phase] += _mintAmount;
            for (uint16 i = 0; i < _mintAmount; i++) {

                //set the character and ability
                character.push(_character);
                ability.push(chooseAbility(_character, i));
                characters[_character].minted += 1;

                if (_mintAmount - i > 1) {
                    //choose next character if we are minting another one
                    _character = whichCharacter(phase, i);
                }
            }
        }

        // So you are a wise ass checking the contract eh? Is it safe enough for ya? 
        // You better check the ERC721A as well or do you need a bloody mastermind to hold your hand?
        _safeMint(to, _mintAmount);
    }

    // @dev If they not on the list, then charge em double.
    function isValidMerkleProof(address to, bytes32[] calldata merkleProof) public view returns (bool) {
        return MerkleProof.verify(merkleProof, whitelistMerkleRoot, keccak256(abi.encodePacked(to)));
    }

    // @dev set presale root
    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    // @dev If the Tosser is weak, he need a good slap.
    function setCharacter(uint16 id, string calldata _charName, uint16 _supply, uint16 _lower, uint16 _upper, uint256 _cost, uint256 _discount) external onlyOwner {
        /*
        require(bytes(_charName).length > 0, "Band: character must have a name");
        require(_supply > 0, "Band: character must have a count");
        require(_lower > 0, "Band: character must have lower");
        require(_upper > _lower, "Band: character must have an upper");
        */
        
        if (id == 0) {
            characters.push(Character(_charName, _supply, 0, _lower, _upper, _cost, _discount));
        } else {
            require(id < characters.length, "Band: character does not exist");

            characters[id].name = _charName;
            characters[id].supply = _supply;
            characters[id].lower = _lower;
            characters[id].upper = _upper;
            characters[id].cost = _cost;
            characters[id].discount = _discount;
        }
    }

    // @dev show the first 500 nft owned by an address, needed for better website performance
    function ownedList(address _owner) external view returns (uint16[7][500] memory list) {
        uint16 i;
        uint16 j;
        address nftOwner;
        uint256 ownerBalance;
        uint16[8] memory counts;
        // list[id, character, ability, left, right, jailed, characterCount]
        //      0    1          2         3       4       5       6

        unchecked {
            ownerBalance = balanceOf(_owner);

            //only check the first 500
            if (ownerBalance > 500) {
                ownerBalance = 500;
            }

            //find the list of id owned
            for (i = 1; i <= totalSupply(); i += 1) {
                nftOwner = ownerOf(i);
                if (nftOwner == _owner) {
                    list[j][0] = i;
                    j += 1;
                    if (j == ownerBalance) {
                        break;
                    }
                }
            }

            //record details for each nft            
            for (i = 0; i < ownerBalance; i += 1) {
                j = list[i][0];
                list[i][1] = character[j];
                list[i][2] = ability[j];
                list[i][3] = left[j];
                list[i][4] = right[j];
                list[i][5] = jailed[j] ? 1 : 0;
            }

            //find the count of each character ie nft id 86 could be the 13th Driver
            j = 0;
            for (i = 0; i < list[ownerBalance - 1][0]; i += 1) {
                counts[character[list[i][0]]] += 1;

                if ((i + 1) == list[i][0]) {
                    list[j][6] = counts[character[list[i][0]]];
                    j += 1;
                }
            }
        }

        return (list);
    }

    // @dev choose character to be minted based on phase of mint
	function whichCharacter(uint16 phase, uint16 count) internal view returns (uint16) {
        uint16 _character;

        unchecked{
            require(phase > 0 && phase < 5, "Band: phase is not valid");

            if (phase == 1) {
                //first 2 characters
                _character = uint16(uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, phase * count * 10))) % 2) + 1;
                if (_character < 1 || _character > 2) {
                    _character = 1;
                }
                if (characters[_character].minted == characters[_character].supply) {
                    if (_character == 1) {
                        _character = 2;
                    } else {
                        _character = 1;
                    }
                }

            } else if (phase == 2) {
                //3rd, 4th, 5th characters
                _character = uint16(uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, phase * count * 10))) % 3) + 3;
                if (_character < 3 || _character > 5) {
                    _character = 3;
                }
                if (characters[_character].minted == characters[_character].supply) {
                    if (characters[3].minted < characters[3].supply) {
                        _character = 3;
                    } else if (characters[4].minted < characters[4].supply) {
                        _character = 4;
                    } else {
                        _character = 5;
                    }
                }

            } else if (phase == 3) {
                //6th character
                _character = 6;

            } else if (phase == 4) {
                //7th character
                _character = 7;
            }
        }

        require(characters[_character].minted < characters[_character].supply, "Band: phase is sold out");
        return _character;
	}

    // @dev Bloody pick some rando number for this bloke.
    function chooseAbility(uint16 _character, uint16 count) internal view returns (uint16) {
        uint16 range;
        uint16 random;

        require(characters.length > _character, "Band: missing character data");
        
        unchecked {
            range = characters[_character].upper - characters[_character].lower + 1;
            random = uint16(uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _character * count * 10))) % range) + characters[_character].lower;
        }

        return random;
    }

    // @dev tool has gotta have power.
    function setTool(uint16 id, string calldata _toolname, uint16 _count, uint16 _ability, uint256 _cost, uint256 _tokens) external onlyOwner {
        /*
        require(bytes(_toolname).length > 0, "Band: tool must have a name");
        require(_count > 0, "Band: tool must have a count");
        require(_cost > 0, "Band: tool must have a cost");
        require(_tokens > 0, "Band: tool must have a cost of tokens");
        require(_ability > 0, "Band: tool must have ability");
        */

        if (id == 0) {
            tools.push(Tool(_toolname, _count, _ability, _cost, _tokens));
        } else {
            require(id < tools.length, "Band: tool does not exist");
            tools[id].name = _toolname;
            tools[id].count = _count;
            tools[id].ability = _ability;
            tools[id].cost = _cost;
            tools[id].tokens = _tokens;
        }
    }

    // @dev show how many tools exist
    function toolCount() public view returns (uint256) {
        return tools.length;
    }

    // @dev A tosser needs to buy some tools.
    function buyTool(uint16 tool, uint16 id, bool withToken) external payable nonReentrant {
        require(id <= totalSupply() && id > 0, "Band: NFT does not exist");
        require(tool < tools.length && tool > 0, "Band: Tool does not exist");
        require(msg.sender == ownerOf(id) || msg.sender == owner(), "Band: You are not the owner of this NFT");
        require(tools[tool].count > 0, "Band: We are sold out of that tool");
        require(right[id] == 0, "Band: You can only buy 2 tools");

        if (msg.sender == owner()) {
            //free upgrade from the governer
        } else if (withToken) {
            require(stakingToken20.balanceOf(msg.sender) >= tools[tool].tokens, "Band: You don't have enough token balance");
            require(stakingToken20.allowance(msg.sender, address(this)) >= tools[tool].tokens, "Band: You must give allowance in the token to this NFT contract");
            stakingToken20.transferFrom(msg.sender, address(this), tools[tool].tokens);
        } else {
            require(msg.value >= tools[tool].cost, "Band: Must send cost of tool in eth");
        }

        //add the tool to the nft
        if (left[id] == 0) {
            left[id] = tool;
        } else {
            right[id] = tool;
        }

        //reduce supply of that sold tool
        tools[tool].count -= 1;
        //increase ability of that id
        ability[id] += tools[tool].ability;
    }

    // @dev max mint amount for paid nft
    function setMaxMint(uint16 _phase, uint16 _newMax) external onlyOwner {
	    maxMint[_phase] = _newMax;
	}

    // @dev set jailer address and token address
	function setJailer(address _jailer, address _token) external onlyOwner {
    	jailer = _jailer;
        stakingToken20 = IERC20(_token);
	}
	
    // @dev enable each phase
	function setPhase(uint16 id, bool _status) external onlyOwner {
    	phaseActive[id] = _status;
	}
	
    // @dev Set the base url path to the metadata used by opensea and set if revealed
    function setBaseURI(string memory _baseTokenURI, bool _revealed) external onlyOwner {
        baseURI = _baseTokenURI;
    	revealed = _revealed;
    }

    // @dev show the uri depending on whether it is revealed
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        string memory uri;
        uint256 _char;

        if (revealed) {
            //show image of that nft
            uri = bytes(_baseURI()).length != 0 ? string(abi.encodePacked(_baseURI(), _tokenId.toString(),".json")) : '';
        } else {
            // show video of that nft's character
            _char = character[_tokenId];
            uri = bytes(_baseURI()).length != 0 ? string(abi.encodePacked(_baseURI(), _char.toString(),".json")) : '';
        }

        return uri;
    }

    // @dev Set the nft as jailed, to be used by the staking contract
    function setJail(uint16 id, bool _jail) external nonReentrant {
        require(id <= totalSupply() && id > 0, "Band: NFT does not exist");
        require(msg.sender == jailer, "Band: you are not the jailer");
        jailed[id] = _jail;
    }

    // @dev show the baseuri
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // @dev allow to reduce max supply if needed
    function reduceMaxSupply(uint16 newMax) external onlyOwner {
        require(newMax < maxSupply, "Band: New maximum must be less than existing maximum");
        require(newMax >= totalSupply(), "Band: New maximum can't be less than minted count");
        maxSupply = newMax;
    }

    // @dev set the royalty address and amount
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    // @dev used to withdraw erc20 tokens like DAI
    function withdrawERC20(IERC20 token, address to) external onlyOwner {
        token.transfer(to, token.balanceOf(address(this)));
    }

    // @dev used to withdraw eth
    function withdraw(address payable to) external onlyOwner {
        Address.sendValue(to,address(this).balance);
    }
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity 0.8.15;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity 0.8.15;

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

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

File 4 of 16: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 16: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity 0.8.15;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 6 of 16: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
//https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol

pragma solidity 0.8.15;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Mapping of tokenId storing its staked status
    //mapping(uint256 => bool) public tokenToIsStaked;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    // What's with all this checking my dev's work? You think I am going to steal from ya? I am the Guv’nor. I am fucking rich.
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        // Damn can you stop checking the code and mint it already? We are going to be here all day!
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     *
     * Wow you are really determined to find something bad in here eh? Well better to be safe than sorry. 
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {
        //only check the 1st id because transfer and burn use quantity 1
        //require(tokenToIsStaked[startTokenId] == false, "Cannot transfer - currently locked");
    }

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 7 of 16: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity 0.8.15;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 8 of 16: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity 0.8.15;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 9 of 16: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 10 of 16: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 11 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity 0.8.15;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 12 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity 0.8.15;

/**
 * @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 13 of 16: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity 0.8.15;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 14 of 16: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity 0.8.15;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 16: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity 0.8.15;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity 0.8.15;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ability","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tool","type":"uint16"},{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"bool","name":"withToken","type":"bool"}],"name":"buyTool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"character","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characters","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"},{"internalType":"uint16","name":"lower","type":"uint16"},{"internalType":"uint16","name":"upper","type":"uint16"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"discount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"isValidMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"jailed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jailer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"left","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMint","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint16","name":"phase","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"ownedList","outputs":[{"internalType":"uint16[7][500]","name":"list","type":"uint16[7][500]"}],"stateMutability":"view","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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"phaseActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMax","type":"uint16"}],"name":"reduceMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"right","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"string","name":"_charName","type":"string"},{"internalType":"uint16","name":"_supply","type":"uint16"},{"internalType":"uint16","name":"_lower","type":"uint16"},{"internalType":"uint16","name":"_upper","type":"uint16"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setCharacter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"bool","name":"_jail","type":"bool"}],"name":"setJail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_jailer","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"setJailer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_phase","type":"uint16"},{"internalType":"uint16","name":"_newMax","type":"uint16"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"string","name":"_toolname","type":"string"},{"internalType":"uint16","name":"_count","type":"uint16"},{"internalType":"uint16","name":"_ability","type":"uint16"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"setTool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tools","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"count","type":"uint16"},{"internalType":"uint16","name":"ability","type":"uint16"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260446080818152906200650b60a039600e906200002390826200066b565b506040805160a081018252600081526002602082015260069181019190915260036060820181905260808201526200006090600f906005620004a9565b506010805461ffff1916610f2d1790556040805160208101909152600081526200008f90601190600162000545565b50604080516020810190915260008152620000af90601290600162000545565b506014805460ff19169055601a80546001600160a01b03199081163317909155601b80549091167305cd75f850e0ca64ff780f52b0aac5558ae95265179055604080518082018252600d81526c42616e64204f66204372617a7960981b60208083019190915282518084019093526003835262424f4360e81b908301529060026200013b83826200066b565b5060036200014a82826200066b565b50600160005550506001600855620001623362000352565b62000170306103e8620003a4565b6040805160e081018252600460a08201818152634e6f6e6560e01b60c0840152825260006020830181905260019383018490526002606084015260036080840152600d80549485018155905281519192027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501908190620001f290826200066b565b506020828101516001808401805460408088015161ffff908116620100000263ffffffff199093169516949094171790556060808601516002860155608095860151600390950194909455815161012081018352600460e08201818152634e6f6e6560e01b6101008401528252600094820185905292810184905293840183905293830182905260a0830182905260c08301829052600c8054948501815590915281519192027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701908190620002c990826200066b565b50602082015160018201805460408501516060860151608087015161ffff90811666010000000000000261ffff60301b19928216640100000000029290921663ffffffff60201b19938216620100000263ffffffff19909516919096161792909217169290921791909117905560a0820151600282015560c09091015160039091015562000737565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620004185760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620004705760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200040f565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600183019183908215620005335791602002820160005b838211156200050157835183826101000a81548161ffff021916908360ff1602179055509260200192600201602081600101049283019260010302620004c0565b8015620005315782816101000a81549061ffff021916905560020160208160010104928301926001030262000501565b505b5062000541929150620005af565b5090565b82805482825590600052602060002090600f0160109004810192821562000533579160200282016000838211156200050157835183826101000a81548161ffff021916908360ff1602179055509260200192600201602081600101049283019260010302620004c0565b5b80821115620005415760008155600101620005b0565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005f157607f821691505b6020821081036200061257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200066657600081815260208120601f850160051c81016020861015620006415750805b601f850160051c820191505b8181101562000662578281556001016200064d565b5050505b505050565b81516001600160401b03811115620006875762000687620005c6565b6200069f81620006988454620005dc565b8462000618565b602080601f831160018114620006d75760008415620006be5750858301515b600019600386901b1c1916600185901b17855562000662565b600085815260208120601f198616915b828110156200070857888601518255948401946001909101908401620006e7565b5085821015620007275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615dc480620007476000396000f3fe6080604052600436106103435760003560e01c806384b27f8e116101b0578063ba0bba40116100ec578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610a01578063f2fde38b14610a4a578063faf23b2314610a6a578063feba70b714610a7f57600080fd5b8063d5abeb01146109a6578063d97f22f3146109c1578063def50f6c146109e157600080fd5b8063c1b9c703116100c6578063c1b9c70314610946578063c87b56dd14610966578063c93d3f911461098657600080fd5b8063ba0bba40146108e0578063bc60c31d146108f5578063bd32fb661461092657600080fd5b8063a22cb46511610159578063aa98e0c611610133578063aa98e0c61461086a578063b64b21ca14610880578063b7656808146108a0578063b88d4fde146108c057600080fd5b8063a22cb46514610817578063a723699714610837578063a8c1fedb1461084a57600080fd5b806395d89b411161018a57806395d89b41146107c257806397be7d4d146107d757806398fa6c45146107f757600080fd5b806384b27f8e146107575780638da5cb5b146107845780639456fbcc146107a257600080fd5b8063418258cd1161027f57806351cff8d9116102285780636c0360eb116102025780636c0360eb146106dd57806370a08231146106f2578063714fbc8614610712578063715018a61461074257600080fd5b806351cff8d91461067d5780635d075d041461069d5780636352211e146106bd57600080fd5b80634810bc59116102595780634810bc59146105ff5780634bc8372014610632578063518302271461066357600080fd5b8063418258cd1461059f57806342842e0e146105bf578063468f25b0146105df57600080fd5b806313323ced116102ec57806323b872dd116102c657806323b872dd14610500578063277c5391146105205780632a55205a146105405780633d9e67ec1461057f57600080fd5b806313323ced1461048257806318160ddd146104c65780631e97ef64146104ed57600080fd5b8063076dbc4b1161031d578063076dbc4b1461040a578063081812fc1461042a578063095ea7b31461046257600080fd5b806301ffc9a71461039157806304634d8d146103c657806306fdde03146103e857600080fd5b3661038c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561039d57600080fd5b506103b16103ac3660046151e2565b610a9f565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103e66103e1366004615214565b610ab0565b005b3480156103f457600080fd5b506103fd610b1d565b6040516103bd91906152b6565b34801561041657600080fd5b506103e66104253660046152ee565b610baf565b34801561043657600080fd5b5061044a61044536600461531a565b610c44565b6040516001600160a01b0390911681526020016103bd565b34801561046e57600080fd5b506103e661047d366004615333565b610ca1565b34801561048e57600080fd5b506104b361049d36600461535f565b60176020526000908152604090205461ffff1681565b60405161ffff90911681526020016103bd565b3480156104d257600080fd5b5060015460005403600019015b6040519081526020016103bd565b6103e66104fb36600461537a565b610d60565b34801561050c57600080fd5b506103e661051b3660046153c1565b61157a565b34801561052c57600080fd5b506103b161053b36600461531a565b611585565b34801561054c57600080fd5b5061056061055b366004615402565b6115af565b604080516001600160a01b0390931683526020830191909152016103bd565b34801561058b57600080fd5b506104b361059a36600461531a565b61166c565b3480156105ab57600080fd5b506103e66105ba366004615466565b61169a565b3480156105cb57600080fd5b506103e66105da3660046153c1565b6119d5565b3480156105eb57600080fd5b506104b36105fa36600461531a565b6119f0565b34801561060b57600080fd5b5061061f61061a36600461531a565b611a28565b6040516103bd97969594939291906154ff565b34801561063e57600080fd5b506104b361064d36600461535f565b60186020526000908152604090205461ffff1681565b34801561066f57600080fd5b506014546103b19060ff1681565b34801561068957600080fd5b506103e661069836600461554b565b611b16565b3480156106a957600080fd5b506103e66106b8366004615568565b611b7d565b3480156106c957600080fd5b5061044a6106d836600461531a565b611e24565b3480156106e957600080fd5b506103fd611e36565b3480156106fe57600080fd5b506104df61070d36600461554b565b611ec4565b34801561071e57600080fd5b506103b161072d36600461535f565b60196020526000908152604090205460ff1681565b34801561074e57600080fd5b506103e6611f2c565b34801561076357600080fd5b5061077761077236600461554b565b611f92565b6040516103bd91906155f1565b34801561079057600080fd5b506009546001600160a01b031661044a565b3480156107ae57600080fd5b506103e66107bd366004615652565b6123ad565b3480156107ce57600080fd5b506103fd612501565b3480156107e357600080fd5b50601b5461044a906001600160a01b031681565b34801561080357600080fd5b506103e661081236600461535f565b612510565b34801561082357600080fd5b506103e6610832366004615680565b612685565b6103e66108453660046156e3565b612733565b34801561085657600080fd5b506103e6610865366004615652565b612e17565b34801561087657600080fd5b506104df60155481565b34801561088c57600080fd5b506103e661089b3660046157e7565b612eac565b3480156108ac57600080fd5b506104b36108bb366004615333565b612f27565b3480156108cc57600080fd5b506103e66108db366004615842565b612f64565b3480156108ec57600080fd5b506103e6612fb5565b34801561090157600080fd5b5061091561091036600461531a565b61391e565b6040516103bd9594939291906158c2565b34801561093257600080fd5b506103e661094136600461531a565b6139f5565b34801561095257600080fd5b506104b361096136600461531a565b613a54565b34801561097257600080fd5b506103fd61098136600461531a565b613a64565b34801561099257600080fd5b50601a5461044a906001600160a01b031681565b3480156109b257600080fd5b506010546104b39061ffff1681565b3480156109cd57600080fd5b506103e66109dc3660046158fd565b613b6d565b3480156109ed57600080fd5b506103b16109fc366004615930565b613c08565b348015610a0d57600080fd5b506103b1610a1c366004615652565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a5657600080fd5b506103e6610a6536600461554b565b613c88565b348015610a7657600080fd5b50600d546104df565b348015610a8b57600080fd5b506103e6610a9a3660046152ee565b613d67565b6000610aaa82613eb1565b92915050565b6009546001600160a01b03163314610b0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610b198282613eef565b5050565b606060028054610b2c90615985565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890615985565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6009546001600160a01b03163314610c095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8060138361ffff1660058110610c2157610c216159bf565b602091828204019190066101000a81548160ff0219169083151502179055505050565b6000610c4f82614009565b610c85576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cac82611e24565b9050806001600160a01b0316836001600160a01b031603610cf9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610a1c565b155b15610d50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5b838383614042565b505050565b600260085403610db25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b600260085560015460005403600019018261ffff1611158015610dd9575060008261ffff16115b610e255760405162461bcd60e51b815260206004820152601860248201527f42616e643a204e465420646f6573206e6f7420657869737400000000000000006044820152606401610b06565b600d5461ffff8416108015610e3e575060008361ffff16115b610e8a5760405162461bcd60e51b815260206004820152601960248201527f42616e643a20546f6f6c20646f6573206e6f74206578697374000000000000006044820152606401610b06565b610e978261ffff16611e24565b6001600160a01b0316336001600160a01b03161480610ec057506009546001600160a01b031633145b610f325760405162461bcd60e51b815260206004820152602760248201527f42616e643a20596f7520617265206e6f7420746865206f776e6572206f66207460448201527f686973204e4654000000000000000000000000000000000000000000000000006064820152608401610b06565b6000600d8461ffff1681548110610f4b57610f4b6159bf565b600091825260209091206001600490920201015461ffff1611610fd65760405162461bcd60e51b815260206004820152602260248201527f42616e643a2057652061726520736f6c64206f7574206f66207468617420746f60448201527f6f6c0000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b61ffff80831660009081526018602052604090205416156110395760405162461bcd60e51b815260206004820152601e60248201527f42616e643a20596f752063616e206f6e6c7920627579203220746f6f6c7300006044820152606401610b06565b6009546001600160a01b0316331461140f57801561137157600d8361ffff1681548110611068576110686159bf565b6000918252602090912060049182020160030154601b546040517f70a08231000000000000000000000000000000000000000000000000000000008152339381019390935290916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110591906159d5565b10156111795760405162461bcd60e51b815260206004820152602960248201527f42616e643a20596f7520646f6e2774206861766520656e6f75676820746f6b6560448201527f6e2062616c616e636500000000000000000000000000000000000000000000006064820152608401610b06565b600d8361ffff1681548110611190576111906159bf565b6000918252602090912060049182020160030154601b546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015290916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906159d5565b10156112a75760405162461bcd60e51b815260206004820152603f60248201527f42616e643a20596f75206d757374206769766520616c6c6f77616e636520696e60448201527f2074686520746f6b656e20746f2074686973204e465420636f6e7472616374006064820152608401610b06565b601b54600d80546001600160a01b03909216916323b872dd91339130919061ffff89169081106112d9576112d96159bf565b9060005260206000209060040201600301546040518463ffffffff1660e01b8152600401611328939291906001600160a01b039384168152919092166020820152604081019190915260600190565b6020604051808303816000875af1158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b91906159ee565b5061140f565b600d8361ffff1681548110611388576113886159bf565b90600052602060002090600402016002015434101561140f5760405162461bcd60e51b815260206004820152602360248201527f42616e643a204d7573742073656e6420636f7374206f6620746f6f6c20696e2060448201527f65746800000000000000000000000000000000000000000000000000000000006064820152608401610b06565b61ffff80831660009081526017602052604081205490911690036114565761ffff8281166000908152601760205260409020805461ffff191691851691909117905561147b565b61ffff8281166000908152601860205260409020805461ffff19169185169190911790555b6001600d8461ffff1681548110611494576114946159bf565b60009182526020822060016004909202010180549091906114ba90849061ffff16615a21565b92506101000a81548161ffff021916908361ffff160217905550600d8361ffff16815481106114eb576114eb6159bf565b906000526020600020906004020160010160029054906101000a900461ffff1660118361ffff1681548110611522576115226159bf565b90600052602060002090601091828204019190066002028282829054906101000a900461ffff166115539190615a44565b92506101000a81548161ffff021916908361ffff1602179055506001600881905550505050565b610d5b8383836140ab565b6013816005811061159557600080fd5b60209182820401919006915054906101000a900460ff1681565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff1692820192909252829161162e575060408051808201909152600a546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090611652906bffffffffffffffffffffffff1687615a6a565b61165c9190615a9f565b91519350909150505b9250929050565b600f816005811061167c57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6009546001600160a01b031633146116f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8761ffff1660000361182357604080516101006020601f8a01819004028201810190925260e08101888152600c928291908b908b9081908501838280828437600092018290525093855250505061ffff808a16602080850191909152604084018390528982166060850152908816608084015260a0830187905260c090920185905283546001810185559381522081519192600402019081906117979082615b01565b50602082015160018201805460408501516060860151608087015161ffff90811666010000000000000267ffff00000000000019928216640100000000029290921667ffffffff0000000019938216620100000263ffffffff19909516919096161792909217169290921791909117905560a0820151600282015560c0909101516003909101556119cb565b600c5461ffff8916106118785760405162461bcd60e51b815260206004820152601e60248201527f42616e643a2063686172616374657220646f6573206e6f7420657869737400006044820152606401610b06565b8686600c8a61ffff1681548110611891576118916159bf565b906000526020600020906004020160000191826118af929190615bc1565b5084600c8961ffff16815481106118c8576118c86159bf565b60009182526020909120600490910201600101805461ffff191661ffff928316179055600c805486928b16908110611902576119026159bf565b906000526020600020906004020160010160046101000a81548161ffff021916908361ffff16021790555082600c8961ffff1681548110611945576119456159bf565b906000526020600020906004020160010160066101000a81548161ffff021916908361ffff16021790555081600c8961ffff1681548110611988576119886159bf565b90600052602060002090600402016002018190555080600c8961ffff16815481106119b5576119b56159bf565b9060005260206000209060040201600301819055505b5050505050505050565b610d5b83838360405180602001604052806000815250612f64565b60128181548110611a0057600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b600c8181548110611a3857600080fd5b9060005260206000209060040201600091509050806000018054611a5b90615985565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8790615985565b8015611ad45780601f10611aa957610100808354040283529160200191611ad4565b820191906000526020600020905b815481529060010190602001808311611ab757829003601f168201915b50505060018401546002850154600390950154939461ffff80831695620100008404821695506401000000008404821694506601000000000000909304169187565b6009546001600160a01b03163314611b705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b611b7a81476142e7565b50565b6009546001600160a01b03163314611bd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8661ffff16600003611cb6576040805160c06020601f8901819004028201810190925260a08101878152600d928291908a908a9081908501838280828437600092018290525093855250505061ffff80891660208085019190915290881660408401526060830187905260809092018590528354600181018555938152208151919260040201908190611c6a9082615b01565b506020820151600182018054604085015161ffff908116620100000263ffffffff1990921693169290921791909117905560608201516002820155608090910151600390910155611e1b565b600d5461ffff881610611d0b5760405162461bcd60e51b815260206004820152601960248201527f42616e643a20746f6f6c20646f6573206e6f74206578697374000000000000006044820152606401610b06565b8585600d8961ffff1681548110611d2457611d246159bf565b90600052602060002090600402016000019182611d42929190615bc1565b5083600d8861ffff1681548110611d5b57611d5b6159bf565b60009182526020909120600490910201600101805461ffff191661ffff928316179055600d805485928a16908110611d9557611d956159bf565b906000526020600020906004020160010160026101000a81548161ffff021916908361ffff16021790555081600d8861ffff1681548110611dd857611dd86159bf565b90600052602060002090600402016002018190555080600d8861ffff1681548110611e0557611e056159bf565b9060005260206000209060040201600301819055505b50505050505050565b6000611e2f82614400565b5192915050565b600e8054611e4390615985565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6f90615985565b8015611ebc5780601f10611e9157610100808354040283529160200191611ebc565b820191906000526020600020905b815481529060010190602001808311611e9f57829003601f168201915b505050505081565b60006001600160a01b038216611f06576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6009546001600160a01b03163314611f865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b611f906000614542565b565b611f9a615160565b600080600080611fa861518f565b611fb187611ec4565b91506101f4821115611fc3576101f491505b600194505b60015460005403600019018561ffff161161204557611fea8561ffff16611e24565b9250866001600160a01b0316836001600160a01b03160361203a5784868561ffff166101f4811061201d5761201d6159bf565b602002015161ffff91821690526001949094019384168214612045575b600185019450611fc8565b600094505b818561ffff16101561221e57858561ffff166101f4811061206d5761206d6159bf565b602002015151601280549195509061ffff861690811061208f5761208f6159bf565b90600052602060002090601091828204019190066002029054906101000a900461ffff16868661ffff166101f481106120ca576120ca6159bf565b6020908102919091015161ffff92831691015260118054909186169081106120f4576120f46159bf565b90600052602060002090601091828204019190066002029054906101000a900461ffff16868661ffff166101f4811061212f5761212f6159bf565b6020908102919091015161ffff92831660409182015286831660009081526017909252902054811690879087166101f4811061216d5761216d6159bf565b6020908102919091015161ffff928316606090910152858216600090815260189091526040902054811690879087166101f481106121ad576121ad6159bf565b6020908102919091015161ffff92831660809091015290851660009081526019909152604090205460ff166121e35760006121e6565b60015b60ff16868661ffff166101f48110612200576122006159bf565b602002015161ffff9190911660a0909101526001949094019361204a565b60009350600094505b85600183036101f4811061223d5761223d6159bf565b60200201515161ffff90811690861610156123a3576001816012888861ffff166101f4811061226e5761226e6159bf565b602002015151815461ffff90911690811061228b5761228b6159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff16600881106122bd576122bd6159bf565b60200201805161ffff920182169052869086166101f481106122e1576122e16159bf565b60200201515161ffff908116600187019091160361239857806012878761ffff166101f48110612313576123136159bf565b602002015151815461ffff909116908110612330576123306159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff1660088110612362576123626159bf565b6020020151868561ffff166101f4811061237e5761237e6159bf565b602002015161ffff9190911660c090910152600193909301925b600185019450612227565b5050505050919050565b6009546001600160a01b031633146124075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa15801561246e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249291906159d5565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156124dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5b91906159ee565b606060038054610b2c90615985565b6009546001600160a01b0316331461256a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b60105461ffff908116908216106125e95760405162461bcd60e51b815260206004820152603460248201527f42616e643a204e6577206d6178696d756d206d757374206265206c657373207460448201527f68616e206578697374696e67206d6178696d756d0000000000000000000000006064820152608401610b06565b60015460005403600019018161ffff16101561266d5760405162461bcd60e51b815260206004820152603160248201527f42616e643a204e6577206d6178696d756d2063616e2774206265206c6573732060448201527f7468616e206d696e74656420636f756e740000000000000000000000000000006064820152608401610b06565b6010805461ffff191661ffff92909216919091179055565b336001600160a01b038316036126c7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600854036127855760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b60026008556000333b156127db5760405162461bcd60e51b815260206004820152601260248201527f42616e643a206e6f20636f6e74726163747300000000000000000000000000006044820152606401610b06565b60105460015460005461ffff928316928816919003600019016127fe9190615c81565b11156128715760405162461bcd60e51b8152602060048201526024808201527f42616e643a2043616e74206d696e74206d6f7265207468616e206d617820737560448201527f70706c79000000000000000000000000000000000000000000000000000000006064820152608401610b06565b8161ffff1660000361288257600191505b60138261ffff1660058110612899576128996159bf565b602081049091015460ff601f9092166101000a9004166128fb5760405162461bcd60e51b815260206004820152601560248201527f42616e643a2070686173652069732070617573656400000000000000000000006044820152606401610b06565b6009546001600160a01b03163314612a0157600f8261ffff1660058110612924576129246159bf565b601081049190910154336000908152601660205260409020600f9092166002026101000a900461ffff908116918791851660058110612965576129656159bf565b601091828204019190066002029054906101000a900461ffff166129899190615a44565b61ffff161115612a015760405162461bcd60e51b815260206004820152602160248201527f42616e643a204d757374206d696e74206c657373207468616e20746865206d6160448201527f78000000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b6000612a0e338686613c08565b9050612a1b83600a6145a1565b9150612a2f6009546001600160a01b031690565b6001600160a01b0316336001600160a01b03160315612c67576000849003612b03578561ffff16600c8361ffff1681548110612a6d57612a6d6159bf565b906000526020600020906004020160020154612a899190615a6a565b341015612afe5760405162461bcd60e51b815260206004820152603560248201527f42616e643a20596f75206d757374207265676973746572206f6e207072656d6960448201527f6e74206f722070617920666f7220746865206e667400000000000000000000006064820152608401610b06565b612c67565b801515600103612bba578561ffff16600c8361ffff1681548110612b2957612b296159bf565b906000526020600020906004020160030154612b459190615a6a565b341015612afe5760405162461bcd60e51b815260206004820152602360248201527f42616e643a20446973636f756e746564207072696365206d757374206265207060448201527f61696400000000000000000000000000000000000000000000000000000000006064820152608401610b06565b8561ffff16600c8361ffff1681548110612bd657612bd66159bf565b906000526020600020906004020160020154612bf29190615a6a565b341015612c675760405162461bcd60e51b815260206004820152603560248201527f42616e643a20596f75206d757374207265676973746572206f6e207072656d6960448201527f6e74206f722070617920666f7220746865206e667400000000000000000000006064820152608401610b06565b336000908152601660205260409020869061ffff851660058110612c8d57612c8d6159bf565b60108104909101805461ffff6002600f909416939093026101000a808204841690940183168402929093021990921617905560005b8661ffff168161ffff161015612dfa57601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344460108204018054600f9092166002026101000a61ffff81810219909316928616029190911790556011612d368483614a08565b8154600180820184556000938452602090932060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600c805490918616908110612d8857612d886159bf565b6000918252602090912060016004909202018101805461ffff62010000808304821690950181169094027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9091161790558289039091161115612df257612def84826145a1565b92505b600101612cc2565b50612e09878761ffff16614b9f565b505060016008555050505050565b6009546001600160a01b03163314612e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b601a80546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff1991821617909155601b8054929093169116179055565b6009546001600160a01b03163314612f065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b600e612f128382615b01565b506014805460ff191691151591909117905550565b60166020528160005260406000208160058110612f4357600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b612f6f8484846140ab565b6001600160a01b0383163b15158015612f915750612f8f84848484614bb9565b155b15612faf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6009546001600160a01b0316331461300f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6040805161012081018252600a60e082019081527f5468652044726976657200000000000000000000000000000000000000000000610100830152815261022b6020820152600091810182905260026060820152600460808201819052666a94d74f43000060a083015260c08201839052600c8054600181018255935281519192027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906130c09082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600960e082019081527f5468652054686965660000000000000000000000000000000000000000000000610100830152815261022b9581019590955260009185018290526004938501849052600790850152666a94d74f43000094840194909452938201839052600c80549485018155909252805190929091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906132039082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600e60e082019081527f54686520496e73696465204d616e000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600793850193909352600a9284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906133549082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600a60e082018181527f546865204861636b657200000000000000000000000000000000000000000000610100840152825261022b96820196909652600092810183905293840194909452600d9383019390935266d529ae9e86000093820193909352666a94d74f43000093810193909352600c80549283018155905281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906134a29082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600e60e082019081527f546865204d61737465726d696e64000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600d9385019390935260109284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906135f39082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600b60e082019081527f546865205068616e746f6d000000000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600a93850193909352600d9284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906137449082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600d60e082019081527f5468652057696c64204361726400000000000000000000000000000000000000610100830152815261022b95810195909552600091850182905260079385019390935260109284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906138959082615b01565b50602082015160018201805460408501516060860151608087015161ffff90811666010000000000000267ffff00000000000019928216640100000000029290921667ffffffff0000000019938216620100000263ffffffff19909516919096161792909217169290921791909117905560a0820151600282015560c090910151600390910155565b600d818154811061392e57600080fd5b906000526020600020906004020160009150905080600001805461395190615985565b80601f016020809104026020016040519081016040528092919081815260200182805461397d90615985565b80156139ca5780601f1061399f576101008083540402835291602001916139ca565b820191906000526020600020905b8154815290600101906020018083116139ad57829003601f168201915b50505060018401546002850154600390950154939461ffff8083169562010000909304169350915085565b6009546001600160a01b03163314613a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b601555565b60118181548110611a0057600080fd5b601454606090819060009060ff1615613ad557613a7f614cd6565b51600003613a9c5760405180602001604052806000815250613ace565b613aa4614cd6565b613aad85614ce5565b604051602001613abe929190615c99565b6040516020818303038152906040525b9150613b66565b60128481548110613ae857613ae86159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff169050613b14614cd6565b51600003613b315760405180602001604052806000815250613b63565b613b39614cd6565b613b4282614ce5565b604051602001613b53929190615c99565b6040516020818303038152906040525b91505b5092915050565b6009546001600160a01b03163314613bc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b80600f8361ffff1660058110613bdf57613bdf6159bf565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6000613c80838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120614e1a565b949350505050565b6009546001600160a01b03163314613ce25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6001600160a01b038116613d5e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b06565b611b7a81614542565b600260085403613db95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b600260085560015460005403600019018261ffff1611158015613de0575060008261ffff16115b613e2c5760405162461bcd60e51b815260206004820152601860248201527f42616e643a204e465420646f6573206e6f7420657869737400000000000000006044820152606401610b06565b601a546001600160a01b03163314613e865760405162461bcd60e51b815260206004820152601c60248201527f42616e643a20796f7520617265206e6f7420746865206a61696c6572000000006044820152606401610b06565b61ffff919091166000908152601960205260409020805460ff19169115159190911790556001600855565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aaa5750610aaa82614e30565b6127106bffffffffffffffffffffffff82161115613f755760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610b06565b6001600160a01b038216613fcb5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b06565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600a55565b60008160011115801561401d575060005482105b8015610aaa575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006140b682614400565b9050836001600160a01b031681600001516001600160a01b031614614107576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061412557506141258533610a1c565b8061414057503361413584610c44565b6001600160a01b0316145b905080614179576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166141b9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c560008487614042565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661429b57600054821461429b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156143375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b06565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614384576040519150601f19603f3d011682016040523d82523d6000602084013e614389565b606091505b5050905080610d5b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b06565b60408051606081018252600080825260208201819052918101919091528180600111158015614430575060005481105b1561451057600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061450e5780516001600160a01b0316156144a4579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215614509579392505050565b6144a4565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060008461ffff161180156145bc575060058461ffff16105b6146085760405162461bcd60e51b815260206004820152601860248201527f42616e643a207068617365206973206e6f742076616c696400000000000000006044820152606401610b06565b8361ffff166001036147305760408051426020808301919091523360601b6bffffffffffffffffffffffff191682840152858702600a0260f01b7fffff000000000000000000000000000000000000000000000000000000000000166054830152825160368184030181526056909201909252805191012060029006600101905060018161ffff1610806146a0575060028161ffff16115b156146a9575060015b600c8161ffff16815481106146c0576146c06159bf565b6000918252602090912060016004909202010154600c805461ffff9283169284169081106146f0576146f06159bf565b600091825260209091206004909102016001015462010000900461ffff160361472b578061ffff166001036147275750600261494f565b5060015b61494f565b8361ffff1660020361492b5760408051426020808301919091523360601b6bffffffffffffffffffffffff191682840152858702600a0260f01b7fffff000000000000000000000000000000000000000000000000000000000000166054830152825160368184030181526056909201909252805191012060039006600301905060038161ffff1610806147c8575060058161ffff16115b156147d1575060035b600c8161ffff16815481106147e8576147e86159bf565b6000918252602090912060016004909202010154600c805461ffff928316928416908110614818576148186159bf565b600091825260209091206004909102016001015462010000900461ffff160361472b57600c60038154811061484f5761484f6159bf565b6000918252602090912060016004909202010154600c805461ffff90921691600390811061487f5761487f6159bf565b600091825260209091206004909102016001015462010000900461ffff1610156148ab5750600361494f565b600c6004815481106148bf576148bf6159bf565b906000526020600020906004020160010160009054906101000a900461ffff1661ffff16600c6004815481106148f7576148f76159bf565b600091825260209091206004909102016001015462010000900461ffff1610156149235750600461494f565b50600561494f565b8361ffff1660030361493f5750600661494f565b8361ffff1660040361494f575060075b600c8161ffff1681548110614966576149666159bf565b6000918252602090912060016004909202010154600c805461ffff928316928416908110614996576149966159bf565b600091825260209091206004909102016001015462010000900461ffff1610614a015760405162461bcd60e51b815260206004820152601760248201527f42616e643a20706861736520697320736f6c64206f75740000000000000000006044820152606401610b06565b9392505050565b60008060008461ffff16600c8054905011614a655760405162461bcd60e51b815260206004820152601c60248201527f42616e643a206d697373696e67206368617261637465722064617461000000006044820152606401610b06565b600c8561ffff1681548110614a7c57614a7c6159bf565b906000526020600020906004020160010160049054906101000a900461ffff16600c8661ffff1681548110614ab357614ab36159bf565b906000526020600020906004020160010160069054906101000a900461ffff16036001019150600c8561ffff1681548110614af057614af06159bf565b6000918252602091829020600160049092020101546040805142938101939093526bffffffffffffffffffffffff193360601b16908301527fffff000000000000000000000000000000000000000000000000000000000000600a8888020260f01b16605483015261ffff640100000000909104811691908416906056016040516020818303038152906040528051906020012060001c81614b9457614b94615a89565b060195945050505050565b610b19828260405180602001604052806000815250614ecb565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a0290614c07903390899088908890600401615cf0565b6020604051808303816000875af1925050508015614c42575060408051601f3d908101601f19168201909252614c3f91810190615d2c565b60015b614ca0573d808015614c70576040519150601f19603f3d011682016040523d82523d6000602084013e614c75565b606091505b508051600003614c98576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b6060600e8054610b2c90615985565b606081600003614d2857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115614d525780614d3c81615d49565b9150614d4b9050600a83615a9f565b9150614d2c565b60008167ffffffffffffffff811115614d6d57614d6d61575b565b6040519080825280601f01601f191660200182016040528015614d97576020820181803683370190505b5090505b8415613c8057614dac600183615d63565b9150614db9600a86615d7a565b614dc4906030615c81565b60f81b818381518110614dd957614dd96159bf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614e13600a86615a9f565b9450614d9b565b600082614e278584614ed8565b14949350505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480614e9357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aaa57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aaa565b610d5b8383836001614f4c565b600081815b8451811015614f44576000858281518110614efa57614efa6159bf565b60200260200101519050808311614f205760008381526020829052604090209250614f31565b600081815260208490526040902092505b5080614f3c81615d49565b915050614edd565b509392505050565b6000546001600160a01b038516614f8f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003614fc9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561508a57506001600160a01b0387163b15155b15615112575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46150db6000888480600101955088614bb9565b6150f8576040516368d2bf6b60e11b815260040160405180910390fd5b80820361509057826000541461510d57600080fd5b615157565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203615113575b506000556142e0565b60405180613e8001604052806101f4905b6151796151ae565b8152602001906001900390816151715790505090565b6040518061010001604052806008906020820280368337509192915050565b6040518060e001604052806007906020820280368337509192915050565b6001600160e01b031981168114611b7a57600080fd5b6000602082840312156151f457600080fd5b8135614a01816151cc565b6001600160a01b0381168114611b7a57600080fd5b6000806040838503121561522757600080fd5b8235615232816151ff565b915060208301356bffffffffffffffffffffffff8116811461525357600080fd5b809150509250929050565b60005b83811015615279578181015183820152602001615261565b83811115612faf5750506000910152565b600081518084526152a281602086016020860161525e565b601f01601f19169290920160200192915050565b602081526000614a01602083018461528a565b803561ffff811681146152db57600080fd5b919050565b8015158114611b7a57600080fd5b6000806040838503121561530157600080fd5b61530a836152c9565b91506020830135615253816152e0565b60006020828403121561532c57600080fd5b5035919050565b6000806040838503121561534657600080fd5b8235615351816151ff565b946020939093013593505050565b60006020828403121561537157600080fd5b614a01826152c9565b60008060006060848603121561538f57600080fd5b615398846152c9565b92506153a6602085016152c9565b915060408401356153b6816152e0565b809150509250925092565b6000806000606084860312156153d657600080fd5b83356153e1816151ff565b925060208401356153f1816151ff565b929592945050506040919091013590565b6000806040838503121561541557600080fd5b50508035926020909101359150565b60008083601f84011261543657600080fd5b50813567ffffffffffffffff81111561544e57600080fd5b60208301915083602082850101111561166557600080fd5b60008060008060008060008060e0898b03121561548257600080fd5b61548b896152c9565b9750602089013567ffffffffffffffff8111156154a757600080fd5b6154b38b828c01615424565b90985096506154c6905060408a016152c9565b94506154d460608a016152c9565b93506154e260808a016152c9565b925060a0890135915060c089013590509295985092959890939650565b60e08152600061551260e083018a61528a565b61ffff9889166020840152968816604083015250938616606085015291909416608083015260a082019390935260c00191909152919050565b60006020828403121561555d57600080fd5b8135614a01816151ff565b600080600080600080600060c0888a03121561558357600080fd5b61558c886152c9565b9650602088013567ffffffffffffffff8111156155a857600080fd5b6155b48a828b01615424565b90975095506155c79050604089016152c9565b93506155d5606089016152c9565b92506080880135915060a0880135905092959891949750929550565b6201b580810181836000805b6101f481101561564857825184835b600781101561562f57825161ffff1682526020928301929091019060010161560c565b50505060e09390930192602092909201916001016155fd565b5050505092915050565b6000806040838503121561566557600080fd5b8235615670816151ff565b91506020830135615253816151ff565b6000806040838503121561569357600080fd5b823561530a816151ff565b60008083601f8401126156b057600080fd5b50813567ffffffffffffffff8111156156c857600080fd5b6020830191508360208260051b850101111561166557600080fd5b6000806000806000608086880312156156fb57600080fd5b8535615706816151ff565b9450615714602087016152c9565b9350604086013567ffffffffffffffff81111561573057600080fd5b61573c8882890161569e565b909450925061574f9050606087016152c9565b90509295509295909350565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561578c5761578c61575b565b604051601f8501601f19908116603f011681019082821181831017156157b4576157b461575b565b816040528093508581528686860111156157cd57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156157fa57600080fd5b823567ffffffffffffffff81111561581157600080fd5b8301601f8101851361582257600080fd5b61583185823560208401615771565b9250506020830135615253816152e0565b6000806000806080858703121561585857600080fd5b8435615863816151ff565b93506020850135615873816151ff565b925060408501359150606085013567ffffffffffffffff81111561589657600080fd5b8501601f810187136158a757600080fd5b6158b687823560208401615771565b91505092959194509250565b60a0815260006158d560a083018861528a565b61ffff9687166020840152949095166040820152606081019290925260809091015292915050565b6000806040838503121561591057600080fd5b615919836152c9565b9150615927602084016152c9565b90509250929050565b60008060006040848603121561594557600080fd5b8335615950816151ff565b9250602084013567ffffffffffffffff81111561596c57600080fd5b6159788682870161569e565b9497909650939450505050565b600181811c9082168061599957607f821691505b6020821081036159b957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156159e757600080fd5b5051919050565b600060208284031215615a0057600080fd5b8151614a01816152e0565b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015615a3c57615a3c615a0b565b039392505050565b600061ffff808316818516808303821115615a6157615a61615a0b565b01949350505050565b6000816000190483118215151615615a8457615a84615a0b565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615aae57615aae615a89565b500490565b601f821115610d5b57600081815260208120601f850160051c81016020861015615ada5750805b601f850160051c820191505b81811015615af957828155600101615ae6565b505050505050565b815167ffffffffffffffff811115615b1b57615b1b61575b565b615b2f81615b298454615985565b84615ab3565b602080601f831160018114615b645760008415615b4c5750858301515b600019600386901b1c1916600185901b178555615af9565b600085815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831115615bd957615bd961575b565b615bed83615be78354615985565b83615ab3565b6000601f841160018114615c215760008515615c095750838201355b600019600387901b1c1916600186901b1783556142e0565b600083815260209020601f19861690835b82811015615c525786850135825560209485019460019092019101615c32565b5086821015615c6f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008219821115615c9457615c94615a0b565b500190565b60008351615cab81846020880161525e565b835190830190615cbf81836020880161525e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152615d22608083018461528a565b9695505050505050565b600060208284031215615d3e57600080fd5b8151614a01816151cc565b60006000198203615d5c57615d5c615a0b565b5060010190565b600082821015615d7557615d75615a0b565b500390565b600082615d8957615d89615a89565b50069056fea2646970667358221220073a6769371704d837f51b519ae1b06cb09b9f9d7d7e2892fc843cd1f950a00f64736f6c634300080f003368747470733a2f2f697066732e696f2f697066732f516d574a505a72616153335a6371734d594a684d553851594e76524b5942756b4b36327456747374317958614a782f

Deployed Bytecode

0x6080604052600436106103435760003560e01c806384b27f8e116101b0578063ba0bba40116100ec578063d5abeb0111610095578063e985e9c51161006f578063e985e9c514610a01578063f2fde38b14610a4a578063faf23b2314610a6a578063feba70b714610a7f57600080fd5b8063d5abeb01146109a6578063d97f22f3146109c1578063def50f6c146109e157600080fd5b8063c1b9c703116100c6578063c1b9c70314610946578063c87b56dd14610966578063c93d3f911461098657600080fd5b8063ba0bba40146108e0578063bc60c31d146108f5578063bd32fb661461092657600080fd5b8063a22cb46511610159578063aa98e0c611610133578063aa98e0c61461086a578063b64b21ca14610880578063b7656808146108a0578063b88d4fde146108c057600080fd5b8063a22cb46514610817578063a723699714610837578063a8c1fedb1461084a57600080fd5b806395d89b411161018a57806395d89b41146107c257806397be7d4d146107d757806398fa6c45146107f757600080fd5b806384b27f8e146107575780638da5cb5b146107845780639456fbcc146107a257600080fd5b8063418258cd1161027f57806351cff8d9116102285780636c0360eb116102025780636c0360eb146106dd57806370a08231146106f2578063714fbc8614610712578063715018a61461074257600080fd5b806351cff8d91461067d5780635d075d041461069d5780636352211e146106bd57600080fd5b80634810bc59116102595780634810bc59146105ff5780634bc8372014610632578063518302271461066357600080fd5b8063418258cd1461059f57806342842e0e146105bf578063468f25b0146105df57600080fd5b806313323ced116102ec57806323b872dd116102c657806323b872dd14610500578063277c5391146105205780632a55205a146105405780633d9e67ec1461057f57600080fd5b806313323ced1461048257806318160ddd146104c65780631e97ef64146104ed57600080fd5b8063076dbc4b1161031d578063076dbc4b1461040a578063081812fc1461042a578063095ea7b31461046257600080fd5b806301ffc9a71461039157806304634d8d146103c657806306fdde03146103e857600080fd5b3661038c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561039d57600080fd5b506103b16103ac3660046151e2565b610a9f565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103e66103e1366004615214565b610ab0565b005b3480156103f457600080fd5b506103fd610b1d565b6040516103bd91906152b6565b34801561041657600080fd5b506103e66104253660046152ee565b610baf565b34801561043657600080fd5b5061044a61044536600461531a565b610c44565b6040516001600160a01b0390911681526020016103bd565b34801561046e57600080fd5b506103e661047d366004615333565b610ca1565b34801561048e57600080fd5b506104b361049d36600461535f565b60176020526000908152604090205461ffff1681565b60405161ffff90911681526020016103bd565b3480156104d257600080fd5b5060015460005403600019015b6040519081526020016103bd565b6103e66104fb36600461537a565b610d60565b34801561050c57600080fd5b506103e661051b3660046153c1565b61157a565b34801561052c57600080fd5b506103b161053b36600461531a565b611585565b34801561054c57600080fd5b5061056061055b366004615402565b6115af565b604080516001600160a01b0390931683526020830191909152016103bd565b34801561058b57600080fd5b506104b361059a36600461531a565b61166c565b3480156105ab57600080fd5b506103e66105ba366004615466565b61169a565b3480156105cb57600080fd5b506103e66105da3660046153c1565b6119d5565b3480156105eb57600080fd5b506104b36105fa36600461531a565b6119f0565b34801561060b57600080fd5b5061061f61061a36600461531a565b611a28565b6040516103bd97969594939291906154ff565b34801561063e57600080fd5b506104b361064d36600461535f565b60186020526000908152604090205461ffff1681565b34801561066f57600080fd5b506014546103b19060ff1681565b34801561068957600080fd5b506103e661069836600461554b565b611b16565b3480156106a957600080fd5b506103e66106b8366004615568565b611b7d565b3480156106c957600080fd5b5061044a6106d836600461531a565b611e24565b3480156106e957600080fd5b506103fd611e36565b3480156106fe57600080fd5b506104df61070d36600461554b565b611ec4565b34801561071e57600080fd5b506103b161072d36600461535f565b60196020526000908152604090205460ff1681565b34801561074e57600080fd5b506103e6611f2c565b34801561076357600080fd5b5061077761077236600461554b565b611f92565b6040516103bd91906155f1565b34801561079057600080fd5b506009546001600160a01b031661044a565b3480156107ae57600080fd5b506103e66107bd366004615652565b6123ad565b3480156107ce57600080fd5b506103fd612501565b3480156107e357600080fd5b50601b5461044a906001600160a01b031681565b34801561080357600080fd5b506103e661081236600461535f565b612510565b34801561082357600080fd5b506103e6610832366004615680565b612685565b6103e66108453660046156e3565b612733565b34801561085657600080fd5b506103e6610865366004615652565b612e17565b34801561087657600080fd5b506104df60155481565b34801561088c57600080fd5b506103e661089b3660046157e7565b612eac565b3480156108ac57600080fd5b506104b36108bb366004615333565b612f27565b3480156108cc57600080fd5b506103e66108db366004615842565b612f64565b3480156108ec57600080fd5b506103e6612fb5565b34801561090157600080fd5b5061091561091036600461531a565b61391e565b6040516103bd9594939291906158c2565b34801561093257600080fd5b506103e661094136600461531a565b6139f5565b34801561095257600080fd5b506104b361096136600461531a565b613a54565b34801561097257600080fd5b506103fd61098136600461531a565b613a64565b34801561099257600080fd5b50601a5461044a906001600160a01b031681565b3480156109b257600080fd5b506010546104b39061ffff1681565b3480156109cd57600080fd5b506103e66109dc3660046158fd565b613b6d565b3480156109ed57600080fd5b506103b16109fc366004615930565b613c08565b348015610a0d57600080fd5b506103b1610a1c366004615652565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a5657600080fd5b506103e6610a6536600461554b565b613c88565b348015610a7657600080fd5b50600d546104df565b348015610a8b57600080fd5b506103e6610a9a3660046152ee565b613d67565b6000610aaa82613eb1565b92915050565b6009546001600160a01b03163314610b0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610b198282613eef565b5050565b606060028054610b2c90615985565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5890615985565b8015610ba55780601f10610b7a57610100808354040283529160200191610ba5565b820191906000526020600020905b815481529060010190602001808311610b8857829003601f168201915b5050505050905090565b6009546001600160a01b03163314610c095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8060138361ffff1660058110610c2157610c216159bf565b602091828204019190066101000a81548160ff0219169083151502179055505050565b6000610c4f82614009565b610c85576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610cac82611e24565b9050806001600160a01b0316836001600160a01b031603610cf9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610d195750610d178133610a1c565b155b15610d50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d5b838383614042565b505050565b600260085403610db25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b600260085560015460005403600019018261ffff1611158015610dd9575060008261ffff16115b610e255760405162461bcd60e51b815260206004820152601860248201527f42616e643a204e465420646f6573206e6f7420657869737400000000000000006044820152606401610b06565b600d5461ffff8416108015610e3e575060008361ffff16115b610e8a5760405162461bcd60e51b815260206004820152601960248201527f42616e643a20546f6f6c20646f6573206e6f74206578697374000000000000006044820152606401610b06565b610e978261ffff16611e24565b6001600160a01b0316336001600160a01b03161480610ec057506009546001600160a01b031633145b610f325760405162461bcd60e51b815260206004820152602760248201527f42616e643a20596f7520617265206e6f7420746865206f776e6572206f66207460448201527f686973204e4654000000000000000000000000000000000000000000000000006064820152608401610b06565b6000600d8461ffff1681548110610f4b57610f4b6159bf565b600091825260209091206001600490920201015461ffff1611610fd65760405162461bcd60e51b815260206004820152602260248201527f42616e643a2057652061726520736f6c64206f7574206f66207468617420746f60448201527f6f6c0000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b61ffff80831660009081526018602052604090205416156110395760405162461bcd60e51b815260206004820152601e60248201527f42616e643a20596f752063616e206f6e6c7920627579203220746f6f6c7300006044820152606401610b06565b6009546001600160a01b0316331461140f57801561137157600d8361ffff1681548110611068576110686159bf565b6000918252602090912060049182020160030154601b546040517f70a08231000000000000000000000000000000000000000000000000000000008152339381019390935290916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110591906159d5565b10156111795760405162461bcd60e51b815260206004820152602960248201527f42616e643a20596f7520646f6e2774206861766520656e6f75676820746f6b6560448201527f6e2062616c616e636500000000000000000000000000000000000000000000006064820152608401610b06565b600d8361ffff1681548110611190576111906159bf565b6000918252602090912060049182020160030154601b546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015290916001600160a01b039091169063dd62ed3e90604401602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123391906159d5565b10156112a75760405162461bcd60e51b815260206004820152603f60248201527f42616e643a20596f75206d757374206769766520616c6c6f77616e636520696e60448201527f2074686520746f6b656e20746f2074686973204e465420636f6e7472616374006064820152608401610b06565b601b54600d80546001600160a01b03909216916323b872dd91339130919061ffff89169081106112d9576112d96159bf565b9060005260206000209060040201600301546040518463ffffffff1660e01b8152600401611328939291906001600160a01b039384168152919092166020820152604081019190915260600190565b6020604051808303816000875af1158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b91906159ee565b5061140f565b600d8361ffff1681548110611388576113886159bf565b90600052602060002090600402016002015434101561140f5760405162461bcd60e51b815260206004820152602360248201527f42616e643a204d7573742073656e6420636f7374206f6620746f6f6c20696e2060448201527f65746800000000000000000000000000000000000000000000000000000000006064820152608401610b06565b61ffff80831660009081526017602052604081205490911690036114565761ffff8281166000908152601760205260409020805461ffff191691851691909117905561147b565b61ffff8281166000908152601860205260409020805461ffff19169185169190911790555b6001600d8461ffff1681548110611494576114946159bf565b60009182526020822060016004909202010180549091906114ba90849061ffff16615a21565b92506101000a81548161ffff021916908361ffff160217905550600d8361ffff16815481106114eb576114eb6159bf565b906000526020600020906004020160010160029054906101000a900461ffff1660118361ffff1681548110611522576115226159bf565b90600052602060002090601091828204019190066002028282829054906101000a900461ffff166115539190615a44565b92506101000a81548161ffff021916908361ffff1602179055506001600881905550505050565b610d5b8383836140ab565b6013816005811061159557600080fd5b60209182820401919006915054906101000a900460ff1681565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff1692820192909252829161162e575060408051808201909152600a546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090611652906bffffffffffffffffffffffff1687615a6a565b61165c9190615a9f565b91519350909150505b9250929050565b600f816005811061167c57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6009546001600160a01b031633146116f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8761ffff1660000361182357604080516101006020601f8a01819004028201810190925260e08101888152600c928291908b908b9081908501838280828437600092018290525093855250505061ffff808a16602080850191909152604084018390528982166060850152908816608084015260a0830187905260c090920185905283546001810185559381522081519192600402019081906117979082615b01565b50602082015160018201805460408501516060860151608087015161ffff90811666010000000000000267ffff00000000000019928216640100000000029290921667ffffffff0000000019938216620100000263ffffffff19909516919096161792909217169290921791909117905560a0820151600282015560c0909101516003909101556119cb565b600c5461ffff8916106118785760405162461bcd60e51b815260206004820152601e60248201527f42616e643a2063686172616374657220646f6573206e6f7420657869737400006044820152606401610b06565b8686600c8a61ffff1681548110611891576118916159bf565b906000526020600020906004020160000191826118af929190615bc1565b5084600c8961ffff16815481106118c8576118c86159bf565b60009182526020909120600490910201600101805461ffff191661ffff928316179055600c805486928b16908110611902576119026159bf565b906000526020600020906004020160010160046101000a81548161ffff021916908361ffff16021790555082600c8961ffff1681548110611945576119456159bf565b906000526020600020906004020160010160066101000a81548161ffff021916908361ffff16021790555081600c8961ffff1681548110611988576119886159bf565b90600052602060002090600402016002018190555080600c8961ffff16815481106119b5576119b56159bf565b9060005260206000209060040201600301819055505b5050505050505050565b610d5b83838360405180602001604052806000815250612f64565b60128181548110611a0057600080fd5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b600c8181548110611a3857600080fd5b9060005260206000209060040201600091509050806000018054611a5b90615985565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8790615985565b8015611ad45780601f10611aa957610100808354040283529160200191611ad4565b820191906000526020600020905b815481529060010190602001808311611ab757829003601f168201915b50505060018401546002850154600390950154939461ffff80831695620100008404821695506401000000008404821694506601000000000000909304169187565b6009546001600160a01b03163314611b705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b611b7a81476142e7565b50565b6009546001600160a01b03163314611bd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b8661ffff16600003611cb6576040805160c06020601f8901819004028201810190925260a08101878152600d928291908a908a9081908501838280828437600092018290525093855250505061ffff80891660208085019190915290881660408401526060830187905260809092018590528354600181018555938152208151919260040201908190611c6a9082615b01565b506020820151600182018054604085015161ffff908116620100000263ffffffff1990921693169290921791909117905560608201516002820155608090910151600390910155611e1b565b600d5461ffff881610611d0b5760405162461bcd60e51b815260206004820152601960248201527f42616e643a20746f6f6c20646f6573206e6f74206578697374000000000000006044820152606401610b06565b8585600d8961ffff1681548110611d2457611d246159bf565b90600052602060002090600402016000019182611d42929190615bc1565b5083600d8861ffff1681548110611d5b57611d5b6159bf565b60009182526020909120600490910201600101805461ffff191661ffff928316179055600d805485928a16908110611d9557611d956159bf565b906000526020600020906004020160010160026101000a81548161ffff021916908361ffff16021790555081600d8861ffff1681548110611dd857611dd86159bf565b90600052602060002090600402016002018190555080600d8861ffff1681548110611e0557611e056159bf565b9060005260206000209060040201600301819055505b50505050505050565b6000611e2f82614400565b5192915050565b600e8054611e4390615985565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6f90615985565b8015611ebc5780601f10611e9157610100808354040283529160200191611ebc565b820191906000526020600020905b815481529060010190602001808311611e9f57829003601f168201915b505050505081565b60006001600160a01b038216611f06576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6009546001600160a01b03163314611f865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b611f906000614542565b565b611f9a615160565b600080600080611fa861518f565b611fb187611ec4565b91506101f4821115611fc3576101f491505b600194505b60015460005403600019018561ffff161161204557611fea8561ffff16611e24565b9250866001600160a01b0316836001600160a01b03160361203a5784868561ffff166101f4811061201d5761201d6159bf565b602002015161ffff91821690526001949094019384168214612045575b600185019450611fc8565b600094505b818561ffff16101561221e57858561ffff166101f4811061206d5761206d6159bf565b602002015151601280549195509061ffff861690811061208f5761208f6159bf565b90600052602060002090601091828204019190066002029054906101000a900461ffff16868661ffff166101f481106120ca576120ca6159bf565b6020908102919091015161ffff92831691015260118054909186169081106120f4576120f46159bf565b90600052602060002090601091828204019190066002029054906101000a900461ffff16868661ffff166101f4811061212f5761212f6159bf565b6020908102919091015161ffff92831660409182015286831660009081526017909252902054811690879087166101f4811061216d5761216d6159bf565b6020908102919091015161ffff928316606090910152858216600090815260189091526040902054811690879087166101f481106121ad576121ad6159bf565b6020908102919091015161ffff92831660809091015290851660009081526019909152604090205460ff166121e35760006121e6565b60015b60ff16868661ffff166101f48110612200576122006159bf565b602002015161ffff9190911660a0909101526001949094019361204a565b60009350600094505b85600183036101f4811061223d5761223d6159bf565b60200201515161ffff90811690861610156123a3576001816012888861ffff166101f4811061226e5761226e6159bf565b602002015151815461ffff90911690811061228b5761228b6159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff16600881106122bd576122bd6159bf565b60200201805161ffff920182169052869086166101f481106122e1576122e16159bf565b60200201515161ffff908116600187019091160361239857806012878761ffff166101f48110612313576123136159bf565b602002015151815461ffff909116908110612330576123306159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff1660088110612362576123626159bf565b6020020151868561ffff166101f4811061237e5761237e6159bf565b602002015161ffff9190911660c090910152600193909301925b600185019450612227565b5050505050919050565b6009546001600160a01b031633146124075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa15801561246e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249291906159d5565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156124dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5b91906159ee565b606060038054610b2c90615985565b6009546001600160a01b0316331461256a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b60105461ffff908116908216106125e95760405162461bcd60e51b815260206004820152603460248201527f42616e643a204e6577206d6178696d756d206d757374206265206c657373207460448201527f68616e206578697374696e67206d6178696d756d0000000000000000000000006064820152608401610b06565b60015460005403600019018161ffff16101561266d5760405162461bcd60e51b815260206004820152603160248201527f42616e643a204e6577206d6178696d756d2063616e2774206265206c6573732060448201527f7468616e206d696e74656420636f756e740000000000000000000000000000006064820152608401610b06565b6010805461ffff191661ffff92909216919091179055565b336001600160a01b038316036126c7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600854036127855760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b60026008556000333b156127db5760405162461bcd60e51b815260206004820152601260248201527f42616e643a206e6f20636f6e74726163747300000000000000000000000000006044820152606401610b06565b60105460015460005461ffff928316928816919003600019016127fe9190615c81565b11156128715760405162461bcd60e51b8152602060048201526024808201527f42616e643a2043616e74206d696e74206d6f7265207468616e206d617820737560448201527f70706c79000000000000000000000000000000000000000000000000000000006064820152608401610b06565b8161ffff1660000361288257600191505b60138261ffff1660058110612899576128996159bf565b602081049091015460ff601f9092166101000a9004166128fb5760405162461bcd60e51b815260206004820152601560248201527f42616e643a2070686173652069732070617573656400000000000000000000006044820152606401610b06565b6009546001600160a01b03163314612a0157600f8261ffff1660058110612924576129246159bf565b601081049190910154336000908152601660205260409020600f9092166002026101000a900461ffff908116918791851660058110612965576129656159bf565b601091828204019190066002029054906101000a900461ffff166129899190615a44565b61ffff161115612a015760405162461bcd60e51b815260206004820152602160248201527f42616e643a204d757374206d696e74206c657373207468616e20746865206d6160448201527f78000000000000000000000000000000000000000000000000000000000000006064820152608401610b06565b6000612a0e338686613c08565b9050612a1b83600a6145a1565b9150612a2f6009546001600160a01b031690565b6001600160a01b0316336001600160a01b03160315612c67576000849003612b03578561ffff16600c8361ffff1681548110612a6d57612a6d6159bf565b906000526020600020906004020160020154612a899190615a6a565b341015612afe5760405162461bcd60e51b815260206004820152603560248201527f42616e643a20596f75206d757374207265676973746572206f6e207072656d6960448201527f6e74206f722070617920666f7220746865206e667400000000000000000000006064820152608401610b06565b612c67565b801515600103612bba578561ffff16600c8361ffff1681548110612b2957612b296159bf565b906000526020600020906004020160030154612b459190615a6a565b341015612afe5760405162461bcd60e51b815260206004820152602360248201527f42616e643a20446973636f756e746564207072696365206d757374206265207060448201527f61696400000000000000000000000000000000000000000000000000000000006064820152608401610b06565b8561ffff16600c8361ffff1681548110612bd657612bd66159bf565b906000526020600020906004020160020154612bf29190615a6a565b341015612c675760405162461bcd60e51b815260206004820152603560248201527f42616e643a20596f75206d757374207265676973746572206f6e207072656d6960448201527f6e74206f722070617920666f7220746865206e667400000000000000000000006064820152608401610b06565b336000908152601660205260409020869061ffff851660058110612c8d57612c8d6159bf565b60108104909101805461ffff6002600f909416939093026101000a808204841690940183168402929093021990921617905560005b8661ffff168161ffff161015612dfa57601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344460108204018054600f9092166002026101000a61ffff81810219909316928616029190911790556011612d368483614a08565b8154600180820184556000938452602090932060108204018054600f9092166002026101000a61ffff818102199093169383160292909217909155600c805490918616908110612d8857612d886159bf565b6000918252602090912060016004909202018101805461ffff62010000808304821690950181169094027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9091161790558289039091161115612df257612def84826145a1565b92505b600101612cc2565b50612e09878761ffff16614b9f565b505060016008555050505050565b6009546001600160a01b03163314612e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b601a80546001600160a01b0393841673ffffffffffffffffffffffffffffffffffffffff1991821617909155601b8054929093169116179055565b6009546001600160a01b03163314612f065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b600e612f128382615b01565b506014805460ff191691151591909117905550565b60166020528160005260406000208160058110612f4357600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b612f6f8484846140ab565b6001600160a01b0383163b15158015612f915750612f8f84848484614bb9565b155b15612faf576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6009546001600160a01b0316331461300f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6040805161012081018252600a60e082019081527f5468652044726976657200000000000000000000000000000000000000000000610100830152815261022b6020820152600091810182905260026060820152600460808201819052666a94d74f43000060a083015260c08201839052600c8054600181018255935281519192027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906130c09082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600960e082019081527f5468652054686965660000000000000000000000000000000000000000000000610100830152815261022b9581019590955260009185018290526004938501849052600790850152666a94d74f43000094840194909452938201839052600c80549485018155909252805190929091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906132039082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600e60e082019081527f54686520496e73696465204d616e000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600793850193909352600a9284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906133549082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600a60e082018181527f546865204861636b657200000000000000000000000000000000000000000000610100840152825261022b96820196909652600092810183905293840194909452600d9383019390935266d529ae9e86000093820193909352666a94d74f43000093810193909352600c80549283018155905281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906134a29082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600e60e082019081527f546865204d61737465726d696e64000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600d9385019390935260109284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906135f39082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600b60e082019081527f546865205068616e746f6d000000000000000000000000000000000000000000610100830152815261022b958101959095526000918501829052600a93850193909352600d9284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906137449082615b01565b50602082810151600180840180546040808801516060808a01516080808c015161ffff90811666010000000000000267ffff00000000000019938216640100000000029390931667ffffffff0000000019958216620100000263ffffffff1990981691909a16179590951792909216969096171790925560a080880151600288015560c097880151600390970196909655815161012081018352600d60e082019081527f5468652057696c64204361726400000000000000000000000000000000000000610100830152815261022b95810195909552600091850182905260079385019390935260109284019290925266d529ae9e86000093830193909352666a94d74f43000093820193909352600c8054928301815590925281516004919091027fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7019081906138959082615b01565b50602082015160018201805460408501516060860151608087015161ffff90811666010000000000000267ffff00000000000019928216640100000000029290921667ffffffff0000000019938216620100000263ffffffff19909516919096161792909217169290921791909117905560a0820151600282015560c090910151600390910155565b600d818154811061392e57600080fd5b906000526020600020906004020160009150905080600001805461395190615985565b80601f016020809104026020016040519081016040528092919081815260200182805461397d90615985565b80156139ca5780601f1061399f576101008083540402835291602001916139ca565b820191906000526020600020905b8154815290600101906020018083116139ad57829003601f168201915b50505060018401546002850154600390950154939461ffff8083169562010000909304169350915085565b6009546001600160a01b03163314613a4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b601555565b60118181548110611a0057600080fd5b601454606090819060009060ff1615613ad557613a7f614cd6565b51600003613a9c5760405180602001604052806000815250613ace565b613aa4614cd6565b613aad85614ce5565b604051602001613abe929190615c99565b6040516020818303038152906040525b9150613b66565b60128481548110613ae857613ae86159bf565b60009182526020909120601082040154600f9091166002026101000a900461ffff169050613b14614cd6565b51600003613b315760405180602001604052806000815250613b63565b613b39614cd6565b613b4282614ce5565b604051602001613b53929190615c99565b6040516020818303038152906040525b91505b5092915050565b6009546001600160a01b03163314613bc75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b80600f8361ffff1660058110613bdf57613bdf6159bf565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050565b6000613c80838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120614e1a565b949350505050565b6009546001600160a01b03163314613ce25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6001600160a01b038116613d5e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b06565b611b7a81614542565b600260085403613db95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b600260085560015460005403600019018261ffff1611158015613de0575060008261ffff16115b613e2c5760405162461bcd60e51b815260206004820152601860248201527f42616e643a204e465420646f6573206e6f7420657869737400000000000000006044820152606401610b06565b601a546001600160a01b03163314613e865760405162461bcd60e51b815260206004820152601c60248201527f42616e643a20796f7520617265206e6f7420746865206a61696c6572000000006044820152606401610b06565b61ffff919091166000908152601960205260409020805460ff19169115159190911790556001600855565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aaa5750610aaa82614e30565b6127106bffffffffffffffffffffffff82161115613f755760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610b06565b6001600160a01b038216613fcb5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b06565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217600a55565b60008160011115801561401d575060005482105b8015610aaa575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006140b682614400565b9050836001600160a01b031681600001516001600160a01b031614614107576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b038616148061412557506141258533610a1c565b8061414057503361413584610c44565b6001600160a01b0316145b905080614179576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166141b9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6141c560008487614042565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661429b57600054821461429b578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b804710156143375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b06565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614384576040519150601f19603f3d011682016040523d82523d6000602084013e614389565b606091505b5050905080610d5b5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b06565b60408051606081018252600080825260208201819052918101919091528180600111158015614430575060005481105b1561451057600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff1615159181018290529061450e5780516001600160a01b0316156144a4579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215614509579392505050565b6144a4565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060008461ffff161180156145bc575060058461ffff16105b6146085760405162461bcd60e51b815260206004820152601860248201527f42616e643a207068617365206973206e6f742076616c696400000000000000006044820152606401610b06565b8361ffff166001036147305760408051426020808301919091523360601b6bffffffffffffffffffffffff191682840152858702600a0260f01b7fffff000000000000000000000000000000000000000000000000000000000000166054830152825160368184030181526056909201909252805191012060029006600101905060018161ffff1610806146a0575060028161ffff16115b156146a9575060015b600c8161ffff16815481106146c0576146c06159bf565b6000918252602090912060016004909202010154600c805461ffff9283169284169081106146f0576146f06159bf565b600091825260209091206004909102016001015462010000900461ffff160361472b578061ffff166001036147275750600261494f565b5060015b61494f565b8361ffff1660020361492b5760408051426020808301919091523360601b6bffffffffffffffffffffffff191682840152858702600a0260f01b7fffff000000000000000000000000000000000000000000000000000000000000166054830152825160368184030181526056909201909252805191012060039006600301905060038161ffff1610806147c8575060058161ffff16115b156147d1575060035b600c8161ffff16815481106147e8576147e86159bf565b6000918252602090912060016004909202010154600c805461ffff928316928416908110614818576148186159bf565b600091825260209091206004909102016001015462010000900461ffff160361472b57600c60038154811061484f5761484f6159bf565b6000918252602090912060016004909202010154600c805461ffff90921691600390811061487f5761487f6159bf565b600091825260209091206004909102016001015462010000900461ffff1610156148ab5750600361494f565b600c6004815481106148bf576148bf6159bf565b906000526020600020906004020160010160009054906101000a900461ffff1661ffff16600c6004815481106148f7576148f76159bf565b600091825260209091206004909102016001015462010000900461ffff1610156149235750600461494f565b50600561494f565b8361ffff1660030361493f5750600661494f565b8361ffff1660040361494f575060075b600c8161ffff1681548110614966576149666159bf565b6000918252602090912060016004909202010154600c805461ffff928316928416908110614996576149966159bf565b600091825260209091206004909102016001015462010000900461ffff1610614a015760405162461bcd60e51b815260206004820152601760248201527f42616e643a20706861736520697320736f6c64206f75740000000000000000006044820152606401610b06565b9392505050565b60008060008461ffff16600c8054905011614a655760405162461bcd60e51b815260206004820152601c60248201527f42616e643a206d697373696e67206368617261637465722064617461000000006044820152606401610b06565b600c8561ffff1681548110614a7c57614a7c6159bf565b906000526020600020906004020160010160049054906101000a900461ffff16600c8661ffff1681548110614ab357614ab36159bf565b906000526020600020906004020160010160069054906101000a900461ffff16036001019150600c8561ffff1681548110614af057614af06159bf565b6000918252602091829020600160049092020101546040805142938101939093526bffffffffffffffffffffffff193360601b16908301527fffff000000000000000000000000000000000000000000000000000000000000600a8888020260f01b16605483015261ffff640100000000909104811691908416906056016040516020818303038152906040528051906020012060001c81614b9457614b94615a89565b060195945050505050565b610b19828260405180602001604052806000815250614ecb565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a0290614c07903390899088908890600401615cf0565b6020604051808303816000875af1925050508015614c42575060408051601f3d908101601f19168201909252614c3f91810190615d2c565b60015b614ca0573d808015614c70576040519150601f19603f3d011682016040523d82523d6000602084013e614c75565b606091505b508051600003614c98576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b6060600e8054610b2c90615985565b606081600003614d2857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115614d525780614d3c81615d49565b9150614d4b9050600a83615a9f565b9150614d2c565b60008167ffffffffffffffff811115614d6d57614d6d61575b565b6040519080825280601f01601f191660200182016040528015614d97576020820181803683370190505b5090505b8415613c8057614dac600183615d63565b9150614db9600a86615d7a565b614dc4906030615c81565b60f81b818381518110614dd957614dd96159bf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350614e13600a86615a9f565b9450614d9b565b600082614e278584614ed8565b14949350505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480614e9357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aaa57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aaa565b610d5b8383836001614f4c565b600081815b8451811015614f44576000858281518110614efa57614efa6159bf565b60200260200101519050808311614f205760008381526020829052604090209250614f31565b600081815260208490526040902092505b5080614f3c81615d49565b915050614edd565b509392505050565b6000546001600160a01b038516614f8f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003614fc9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561508a57506001600160a01b0387163b15155b15615112575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46150db6000888480600101955088614bb9565b6150f8576040516368d2bf6b60e11b815260040160405180910390fd5b80820361509057826000541461510d57600080fd5b615157565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203615113575b506000556142e0565b60405180613e8001604052806101f4905b6151796151ae565b8152602001906001900390816151715790505090565b6040518061010001604052806008906020820280368337509192915050565b6040518060e001604052806007906020820280368337509192915050565b6001600160e01b031981168114611b7a57600080fd5b6000602082840312156151f457600080fd5b8135614a01816151cc565b6001600160a01b0381168114611b7a57600080fd5b6000806040838503121561522757600080fd5b8235615232816151ff565b915060208301356bffffffffffffffffffffffff8116811461525357600080fd5b809150509250929050565b60005b83811015615279578181015183820152602001615261565b83811115612faf5750506000910152565b600081518084526152a281602086016020860161525e565b601f01601f19169290920160200192915050565b602081526000614a01602083018461528a565b803561ffff811681146152db57600080fd5b919050565b8015158114611b7a57600080fd5b6000806040838503121561530157600080fd5b61530a836152c9565b91506020830135615253816152e0565b60006020828403121561532c57600080fd5b5035919050565b6000806040838503121561534657600080fd5b8235615351816151ff565b946020939093013593505050565b60006020828403121561537157600080fd5b614a01826152c9565b60008060006060848603121561538f57600080fd5b615398846152c9565b92506153a6602085016152c9565b915060408401356153b6816152e0565b809150509250925092565b6000806000606084860312156153d657600080fd5b83356153e1816151ff565b925060208401356153f1816151ff565b929592945050506040919091013590565b6000806040838503121561541557600080fd5b50508035926020909101359150565b60008083601f84011261543657600080fd5b50813567ffffffffffffffff81111561544e57600080fd5b60208301915083602082850101111561166557600080fd5b60008060008060008060008060e0898b03121561548257600080fd5b61548b896152c9565b9750602089013567ffffffffffffffff8111156154a757600080fd5b6154b38b828c01615424565b90985096506154c6905060408a016152c9565b94506154d460608a016152c9565b93506154e260808a016152c9565b925060a0890135915060c089013590509295985092959890939650565b60e08152600061551260e083018a61528a565b61ffff9889166020840152968816604083015250938616606085015291909416608083015260a082019390935260c00191909152919050565b60006020828403121561555d57600080fd5b8135614a01816151ff565b600080600080600080600060c0888a03121561558357600080fd5b61558c886152c9565b9650602088013567ffffffffffffffff8111156155a857600080fd5b6155b48a828b01615424565b90975095506155c79050604089016152c9565b93506155d5606089016152c9565b92506080880135915060a0880135905092959891949750929550565b6201b580810181836000805b6101f481101561564857825184835b600781101561562f57825161ffff1682526020928301929091019060010161560c565b50505060e09390930192602092909201916001016155fd565b5050505092915050565b6000806040838503121561566557600080fd5b8235615670816151ff565b91506020830135615253816151ff565b6000806040838503121561569357600080fd5b823561530a816151ff565b60008083601f8401126156b057600080fd5b50813567ffffffffffffffff8111156156c857600080fd5b6020830191508360208260051b850101111561166557600080fd5b6000806000806000608086880312156156fb57600080fd5b8535615706816151ff565b9450615714602087016152c9565b9350604086013567ffffffffffffffff81111561573057600080fd5b61573c8882890161569e565b909450925061574f9050606087016152c9565b90509295509295909350565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561578c5761578c61575b565b604051601f8501601f19908116603f011681019082821181831017156157b4576157b461575b565b816040528093508581528686860111156157cd57600080fd5b858560208301376000602087830101525050509392505050565b600080604083850312156157fa57600080fd5b823567ffffffffffffffff81111561581157600080fd5b8301601f8101851361582257600080fd5b61583185823560208401615771565b9250506020830135615253816152e0565b6000806000806080858703121561585857600080fd5b8435615863816151ff565b93506020850135615873816151ff565b925060408501359150606085013567ffffffffffffffff81111561589657600080fd5b8501601f810187136158a757600080fd5b6158b687823560208401615771565b91505092959194509250565b60a0815260006158d560a083018861528a565b61ffff9687166020840152949095166040820152606081019290925260809091015292915050565b6000806040838503121561591057600080fd5b615919836152c9565b9150615927602084016152c9565b90509250929050565b60008060006040848603121561594557600080fd5b8335615950816151ff565b9250602084013567ffffffffffffffff81111561596c57600080fd5b6159788682870161569e565b9497909650939450505050565b600181811c9082168061599957607f821691505b6020821081036159b957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156159e757600080fd5b5051919050565b600060208284031215615a0057600080fd5b8151614a01816152e0565b634e487b7160e01b600052601160045260246000fd5b600061ffff83811690831681811015615a3c57615a3c615a0b565b039392505050565b600061ffff808316818516808303821115615a6157615a61615a0b565b01949350505050565b6000816000190483118215151615615a8457615a84615a0b565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615aae57615aae615a89565b500490565b601f821115610d5b57600081815260208120601f850160051c81016020861015615ada5750805b601f850160051c820191505b81811015615af957828155600101615ae6565b505050505050565b815167ffffffffffffffff811115615b1b57615b1b61575b565b615b2f81615b298454615985565b84615ab3565b602080601f831160018114615b645760008415615b4c5750858301515b600019600386901b1c1916600185901b178555615af9565b600085815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff831115615bd957615bd961575b565b615bed83615be78354615985565b83615ab3565b6000601f841160018114615c215760008515615c095750838201355b600019600387901b1c1916600186901b1783556142e0565b600083815260209020601f19861690835b82811015615c525786850135825560209485019460019092019101615c32565b5086821015615c6f5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008219821115615c9457615c94615a0b565b500190565b60008351615cab81846020880161525e565b835190830190615cbf81836020880161525e565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152615d22608083018461528a565b9695505050505050565b600060208284031215615d3e57600080fd5b8151614a01816151cc565b60006000198203615d5c57615d5c615a0b565b5060010190565b600082821015615d7557615d75615a0b565b500390565b600082615d8957615d89615a89565b50069056fea2646970667358221220073a6769371704d837f51b519ae1b06cb09b9f9d7d7e2892fc843cd1f950a00f64736f6c634300080f0033

Deployed Bytecode Sourcemap

5515:16688:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7331:40;736:10:2;7331:40:1;;;-1:-1:-1;;;;;206:55:16;;;188:74;;7361:9:1;293:2:16;278:18;;271:34;161:18;7331:40:1;;;;;;;5515:16688;;;;;8130:171;;;;;;;;;;-1:-1:-1;8130:171:1;;;;;:::i;:::-;;:::i;:::-;;;913:14:16;;906:22;888:41;;876:2;861:18;8130:171:1;;;;;;;;21696:146;;;;;;;;;;-1:-1:-1;21696:146:1;;;;;:::i;:::-;;:::i;:::-;;7734:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19809::1:-;;;;;;;;;;-1:-1:-1;19809:100:1;;;;;:::i;:::-;;:::i;9245:204:5:-;;;;;;;;;;-1:-1:-1;9245:204:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3303:55:16;;;3285:74;;3273:2;3258:18;9245:204:5;3139:226:16;8808:371:5;;;;;;;;;;-1:-1:-1;8808:371:5;;;;;:::i;:::-;;:::i;6714:37:1:-;;;;;;;;;;-1:-1:-1;6714:37:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4053:6:16;4041:19;;;4023:38;;4011:2;3996:18;6714:37:1;3879:188:16;3870:303:5;;;;;;;;;;-1:-1:-1;3727:1:5;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:5;3870:303;;;4218:25:16;;;4206:2;4191:18;3870:303:5;4072:177:16;17966:1451:1;;;;;;:::i;:::-;;:::i;10110:170:5:-;;;;;;;;;;-1:-1:-1;10110:170:5;;;;;:::i;:::-;;:::i;6558:26:1:-;;;;;;;;;;-1:-1:-1;6558:26:1;;;;;:::i;:::-;;:::i;1674:442:4:-;;;;;;;;;;-1:-1:-1;1674:442:4;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;206:55:16;;;188:74;;293:2;278:18;;271:34;;;;161:18;1674:442:4;14:297:16;6364:42:1;;;;;;;;;;-1:-1:-1;6364:42:1;;;;;:::i;:::-;;:::i;11321:995::-;;;;;;;;;;-1:-1:-1;11321:995:1;;;;;:::i;:::-;;:::i;10351:185:5:-;;;;;;;;;;-1:-1:-1;10351:185:5;;;;;:::i;:::-;;:::i;6503:31:1:-;;;;;;;;;;-1:-1:-1;6503:31:1;;;;;:::i;:::-;;:::i;5899:29::-;;;;;;;;;;-1:-1:-1;5899:29:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;6758:38::-;;;;;;;;;;-1:-1:-1;6758:38:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;6591:28;;;;;;;;;;-1:-1:-1;6591:28:1;;;;;;;;22081:119;;;;;;;;;;-1:-1:-1;22081:119:1;;;;;:::i;:::-;;:::i;16867:908::-;;;;;;;;;;-1:-1:-1;16867:908:1;;;;;:::i;:::-;;:::i;7542:125:5:-;;;;;;;;;;-1:-1:-1;7542:125:5;;;;;:::i;:::-;;:::i;6263:94:1:-;;;;;;;;;;;;;:::i;4990:206:5:-;;;;;;;;;;-1:-1:-1;4990:206:5;;;;;:::i;:::-;;:::i;6803:37:1:-;;;;;;;;;;-1:-1:-1;6803:37:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;1714:103:13;;;;;;;;;;;;;:::i;12419:1768:1:-;;;;;;;;;;-1:-1:-1;12419:1768:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1063:87:13:-;;;;;;;;;;-1:-1:-1;1136:6:13;;-1:-1:-1;;;;;1136:6:13;1063:87;;21902:137:1;;;;;;;;;;-1:-1:-1;21902:137:1;;;;;:::i;:::-;;:::i;7903:104:5:-;;;;;;;;;;;;;:::i;6890:81:1:-;;;;;;;;;;-1:-1:-1;6890:81:1;;;;-1:-1:-1;;;;;6890:81:1;;;21354:286;;;;;;;;;;-1:-1:-1;21354:286:1;;;;;:::i;:::-;;:::i;9521:287:5:-;;;;;;;;;;-1:-1:-1;9521:287:5;;;;;:::i;:::-;;:::i;8357:2460:1:-;;;;;;:::i;:::-;;:::i;19630:142::-;;;;;;;;;;-1:-1:-1;19630:142:1;;;;;:::i;:::-;;:::i;6626:34::-;;;;;;;;;;;;;;;;20005:154;;;;;;;;;;-1:-1:-1;20005:154:1;;;;;:::i;:::-;;:::i;6664:43::-;;;;;;;;;;-1:-1:-1;6664:43:1;;;;;:::i;:::-;;:::i;10607:369:5:-;;;;;;;;;;-1:-1:-1;10607:369:5;;;;;:::i;:::-;;:::i;7413:668:1:-;;;;;;;;;;;;;:::i;6110:19::-;;;;;;;;;;-1:-1:-1;6110:19:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;11134:122::-;;;;;;;;;;-1:-1:-1;11134:122:1;;;;;:::i;:::-;;:::i;6450:29::-;;;;;;;;;;-1:-1:-1;6450:29:1;;;;;:::i;:::-;;:::i;20229:594::-;;;;;;;;;;-1:-1:-1;20229:594:1;;;;;:::i;:::-;;:::i;6847:34::-;;;;;;;;;;-1:-1:-1;6847:34:1;;;;-1:-1:-1;;;;;6847:34:1;;;6413:30;;;;;;;;;;-1:-1:-1;6413:30:1;;;;;;;;19467:108;;;;;;;;;;-1:-1:-1;19467:108:1;;;;;:::i;:::-;;:::i;10886:210::-;;;;;;;;;;-1:-1:-1;10886:210:1;;;;;:::i;:::-;;:::i;9879:164:5:-;;;;;;;;;;-1:-1:-1;9879:164:5;;;;;:::i;:::-;-1:-1:-1;;;;;10000:25:5;;;9976:4;10000:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9879:164;1972:201:13;;;;;;;;;;-1:-1:-1;1972:201:13;;;;;:::i;:::-;;:::i;17822:89:1:-;;;;;;;;;;-1:-1:-1;17891:5:1;:12;17822:89;;20902:248;;;;;;;;;;-1:-1:-1;20902:248:1;;;;;:::i;:::-;;:::i;8130:171::-;8233:4;8257:36;8281:11;8257:23;:36::i;:::-;8250:43;8130:171;-1:-1:-1;;8130:171:1:o;21696:146::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;;;;;;;;;21792:42:1::1;21811:8;21821:12;21792:18;:42::i;:::-;21696:146:::0;;:::o;7734:100:5:-;7788:13;7821:5;7814:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:100;:::o;19809::1:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;19897:7:1::1;19879:11;19891:2;19879:15;;;;;;;;;:::i;:::-;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;19809:100:::0;;:::o;9245:204:5:-;9313:7;9338:16;9346:7;9338;:16::i;:::-;9333:64;;9363:34;;;;;;;;;;;;;;9333:64;-1:-1:-1;9417:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;9417:24:5;;9245:204::o;8808:371::-;8881:13;8897:24;8913:7;8897:15;:24::i;:::-;8881:40;;8942:5;-1:-1:-1;;;;;8936:11:5;:2;-1:-1:-1;;;;;8936:11:5;;8932:48;;8956:24;;;;;;;;;;;;;;8932:48;736:10:2;-1:-1:-1;;;;;8997:21:5;;;;;;:63;;-1:-1:-1;9023:37:5;9040:5;736:10:2;9879:164:5;:::i;9023:37::-;9022:38;8997:63;8993:138;;;9084:35;;;;;;;;;;;;;;8993:138;9143:28;9152:2;9156:7;9165:5;9143:8;:28::i;:::-;8870:309;8808:371;;:::o;17966:1451:1:-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;17225:2:16;2368:63:14;;;17207:21:16;17264:2;17244:18;;;17237:30;17303:33;17283:18;;;17276:61;17354:18;;2368:63:14;17023:355:16;2368:63:14;1778:1;2509:7;:18;3727:1:5;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:5;18072:2:1::1;:19;;;;:29;;;;;18100:1;18095:2;:6;;;18072:29;18064:66;;;::::0;-1:-1:-1;;;18064:66:1;;17585:2:16;18064:66:1::1;::::0;::::1;17567:21:16::0;17624:2;17604:18;;;17597:30;17663:26;17643:18;;;17636:54;17707:18;;18064:66:1::1;17383:348:16::0;18064:66:1::1;18156:5;:12:::0;18149:19:::1;::::0;::::1;;:31:::0;::::1;;;;18179:1;18172:4;:8;;;18149:31;18141:69;;;::::0;-1:-1:-1;;;18141:69:1;;17938:2:16;18141:69:1::1;::::0;::::1;17920:21:16::0;17977:2;17957:18;;;17950:30;18016:27;17996:18;;;17989:55;18061:18;;18141:69:1::1;17736:349:16::0;18141:69:1::1;18243:11;18251:2;18243:11;;:7;:11::i;:::-;-1:-1:-1::0;;;;;18229:25:1::1;:10;-1:-1:-1::0;;;;;18229:25:1::1;;:50;;;-1:-1:-1::0;1136:6:13;;-1:-1:-1;;;;;1136:6:13;18258:10:1::1;:21;18229:50;18221:102;;;::::0;-1:-1:-1;;;18221:102:1;;18292:2:16;18221:102:1::1;::::0;::::1;18274:21:16::0;18331:2;18311:18;;;18304:30;18370:34;18350:18;;;18343:62;18441:9;18421:18;;;18414:37;18468:19;;18221:102:1::1;18090:403:16::0;18221:102:1::1;18362:1;18342:5;18348:4;18342:11;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:17:::1;:11;::::0;;::::1;;:17;::::0;::::1;;:21;18334:68;;;::::0;-1:-1:-1;;;18334:68:1;;18700:2:16;18334:68:1::1;::::0;::::1;18682:21:16::0;18739:2;18719:18;;;18712:30;18778:34;18758:18;;;18751:62;18849:4;18829:18;;;18822:32;18871:19;;18334:68:1::1;18498:398:16::0;18334:68:1::1;18421:9;::::0;;::::1;;::::0;;;:5:::1;:9;::::0;;;;;::::1;:14:::0;18413:57:::1;;;::::0;-1:-1:-1;;;18413:57:1;;19103:2:16;18413:57:1::1;::::0;::::1;19085:21:16::0;19142:2;19122:18;;;19115:30;19181:32;19161:18;;;19154:60;19231:18;;18413:57:1::1;18901:354:16::0;18413:57:1::1;1136:6:13::0;;-1:-1:-1;;;;;1136:6:13;18487:10:1::1;18483:608:::0;::::1;;18578:9;18574:517;;;18652:5;18658:4;18652:11;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:18;;::::0;18612:14:::1;::::0;:36:::1;::::0;;;;18637:10:::1;18612:36:::0;;::::1;3285:74:16::0;;;;18652:18:1;;-1:-1:-1;;;;;18612:14:1;;::::1;::::0;:24:::1;::::0;3258:18:16;;18612:36:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;18604:112;;;::::0;-1:-1:-1;;;18604:112:1;;19651:2:16;18604:112:1::1;::::0;::::1;19633:21:16::0;19690:2;19670:18;;;19663:30;19729:34;19709:18;;;19702:62;19800:11;19780:18;;;19773:39;19829:19;;18604:112:1::1;19449:405:16::0;18604:112:1::1;18794:5;18800:4;18794:11;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:18;;::::0;18739:14:::1;::::0;:51:::1;::::0;;;;18764:10:::1;18739:51:::0;;::::1;20094:34:16::0;;;;18784:4:1::1;20144:18:16::0;;;20137:43;18794:18:1;;-1:-1:-1;;;;;18739:14:1;;::::1;::::0;:24:::1;::::0;20006:18:16;;18739:51:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;18731:149;;;::::0;-1:-1:-1;;;18731:149:1;;20393:2:16;18731:149:1::1;::::0;::::1;20375:21:16::0;20432:2;20412:18;;;20405:30;20471:34;20451:18;;;20444:62;20542:33;20522:18;;;20515:61;20593:19;;18731:149:1::1;20191:427:16::0;18731:149:1::1;18895:14;::::0;18950:5:::1;:11:::0;;-1:-1:-1;;;;;18895:14:1;;::::1;::::0;:27:::1;::::0;18923:10:::1;::::0;18943:4:::1;::::0;18950:5;:11:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;:18;;;18895:74;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20904:15:16;;;20886:34;;20956:15;;;;20951:2;20936:18;;20929:43;21003:2;20988:18;;20981:34;;;;20813:2;20798:18;;20623:398;18895:74:1::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18574:517;;;19023:5;19029:4;19023:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;19010:9;:29;;19002:77;;;::::0;-1:-1:-1;;;19002:77:1;;21478:2:16;19002:77:1::1;::::0;::::1;21460:21:16::0;21517:2;21497:18;;;21490:30;21556:34;21536:18;;;21529:62;21627:5;21607:18;;;21600:33;21650:19;;19002:77:1::1;21276:399:16::0;19002:77:1::1;19142:8;::::0;;::::1;;::::0;;;:4:::1;:8;::::0;;;;;;;::::1;:13:::0;;19138:110:::1;;19172:8;::::0;;::::1;;::::0;;;:4:::1;:8;::::0;;;;:15;;-1:-1:-1;;19172:15:1::1;::::0;;::::1;::::0;;;::::1;::::0;;19138:110:::1;;;19220:9;::::0;;::::1;;::::0;;;:5:::1;:9;::::0;;;;:16;;-1:-1:-1;;19220:16:1::1;::::0;;::::1;::::0;;;::::1;::::0;;19138:110:::1;19324:1;19303:5;19309:4;19303:11;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;:17:::1;:11;::::0;;::::1;;:17;:22:::0;;:17;;:11;:22:::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19390:5;19396:4;19390:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;19375:7;19383:2;19375:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1734:1:14::0;2688:7;:22;;;;17966:1451:1;;;:::o;10110:170:5:-;10244:28;10254:4;10260:2;10264:7;10244:9;:28::i;6558:26:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1674:442:4:-;1771:7;1829:27;;;:17;:27;;;;;;;;1800:56;;;;;;;;;-1:-1:-1;;;;;1800:56:4;;;;;-1:-1:-1;;;1800:56:4;;;;;;;;;;;;1771:7;;1869:92;;-1:-1:-1;1920:29:4;;;;;;;;;1930:19;1920:29;-1:-1:-1;;;;;1920:29:4;;;;-1:-1:-1;;;1920:29:4;;;;;;;;1869:92;2011:23;;;;1973:21;;2482:5;;1998:36;;1997:58;1998:36;:10;:36;:::i;:::-;1997:58;;;;:::i;:::-;2076:16;;;-1:-1:-1;1973:82:4;;-1:-1:-1;;1674:442:4;;;;;;:::o;6364:42:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11321:995::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;11818:2:1::1;:7;;11824:1;11818:7:::0;11814:495:::1;;11858:66;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;11842:10:::1;::::0;11858:66;;;11868:9;;;;;;11858:66;;11868:9;;;;11858:66;::::1;;::::0;::::1;::::0;;;-1:-1:-1;11858:66:1;;;-1:-1:-1;;;11858:66:1::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;11842:83;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;;;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;11842:83:1::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;11842:83:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;11842:83:1;;::::1;::::0;::::1;-1:-1:-1::0;;11842:83:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;11814:495:::1;;;11971:10;:17:::0;11966:22:::1;::::0;::::1;;11958:65;;;::::0;-1:-1:-1;;;11958:65:1;;25452:2:16;11958:65:1::1;::::0;::::1;25434:21:16::0;25491:2;25471:18;;;25464:30;25530:32;25510:18;;;25503:60;25580:18;;11958:65:1::1;25250:354:16::0;11958:65:1::1;12062:9;;12040:10;12051:2;12040:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;:31;;;;;;;:::i;:::-;;12110:7;12086:10;12097:2;12086:14;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:21;;:31:::0;;-1:-1:-1;;12086:31:1::1;;::::0;;::::1;;::::0;;12132:10:::1;:14:::0;;12155:6;;12132:14;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;:20;;;:29;;;;;;;;;;;;;;;;;;12199:6;12176:10;12187:2;12176:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:29;;;;;;;;;;;;;;;;;;12242:5;12220:10;12231:2;12220:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;:27;;;;12288:9;12262:10;12273:2;12262:14;;;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;:35;;;;11814:495;11321:995:::0;;;;;;;;:::o;10351:185:5:-;10489:39;10506:4;10512:2;10516:7;10489:39;;;;;;;;;;;;:16;:39::i;6503:31:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5899:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5899:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5899:29:1;;;;;;-1:-1:-1;5899:29:1;;;;;;;:::o;22081:119::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;22149:43:1::1;22167:2;22170:21;22149:17;:43::i;:::-;22081:119:::0;:::o;16867:908::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;17382:2:1::1;:7;;17388:1;17382:7:::0;17378:390:::1;;17417:49;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;17406:5:::1;::::0;17417:49;;;17422:9;;;;;;17417:49;;17422:9;;;;17417:49;::::1;;::::0;::::1;::::0;;;-1:-1:-1;17417:49:1;;;-1:-1:-1;;;17417:49:1::1;::::0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;17406:61;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;;;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;17406:61:1::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;17406:61:1;;;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;17378:390:::1;;;17513:5;:12:::0;17508:17:::1;::::0;::::1;;17500:55;;;::::0;-1:-1:-1;;;17500:55:1;;27141:2:16;17500:55:1::1;::::0;::::1;27123:21:16::0;27180:2;27160:18;;;27153:30;27219:27;27199:18;;;27192:55;27264:18;;17500:55:1::1;26939:349:16::0;17500:55:1::1;17587:9;;17570:5;17576:2;17570:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;:14;;:26;;;;;;;:::i;:::-;;17629:6;17611:5;17617:2;17611:9;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:15;;:24:::0;;-1:-1:-1;;17611:24:1::1;;::::0;;::::1;;::::0;;17650:5:::1;:9:::0;;17670:8;;17650:9;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;:17;;;:28;;;;;;;;;;;;;;;;;;17710:5;17693;17699:2;17693:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;:14;;:22;;;;17749:7;17730:5;17736:2;17730:9;;;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;:26;;;;17378:390;16867:908:::0;;;;;;;:::o;7542:125:5:-;7606:7;7633:21;7646:7;7633:12;:21::i;:::-;:26;;7542:125;-1:-1:-1;;7542:125:5:o;6263:94:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4990:206:5:-;5054:7;-1:-1:-1;;;;;5078:19:5;;5074:60;;5106:28;;;;;;;;;;;;;;5074:60;-1:-1:-1;;;;;;5160:19:5;;;;;:12;:19;;;;;:27;;;;4990:206::o;1714:103:13:-;1136:6;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;12419:1768:1:-;12477:26;;:::i;:::-;12516:8;12535;12554:16;12581:20;12612:23;;:::i;:::-;12835:17;12845:6;12835:9;:17::i;:::-;12820:32;;12928:3;12913:12;:18;12909:77;;;12967:3;12952:18;;12909:77;13052:1;13048:5;;13043:325;3727:1:5;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:5;13055:1:1;:18;;;13043:325;;13113:10;13121:1;13113:10;;:7;:10::i;:::-;13102:21;;13158:6;-1:-1:-1;;;;;13146:18:1;:8;-1:-1:-1;;;;;13146:18:1;;13142:211;;13202:1;13189:4;13194:1;13189:7;;;;;;;;;:::i;:::-;;;;;:14;;;;;;13231:1;13226:6;;;;;13259:17;;13255:79;;13305:5;13255:79;;13080:1;13075:6;;;;13043:325;;;13448:1;13444:5;;13439:301;13455:12;13451:1;:16;;;13439:301;;;13500:4;13505:1;13500:7;;;;;;;;;:::i;:::-;;;;;:10;13542:9;:12;;13500:10;;-1:-1:-1;13542:9:1;:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;13529:4;13534:1;13529:7;;;;;;;;;:::i;:::-;;;;;;;;;;:25;;;;:10;;:25;13586:7;:10;;:7;;:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;13573:4;13578:1;13573:7;;;;;;;;;:::i;:::-;;;;;;;;;;:23;;;;:10;;;;:23;13628:7;;;;;;;:4;:7;;;;;;;;;13615:4;;:7;;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;:10;;;;:20;13667:8;;;;;;;:5;:8;;;;;;;;;;13654:4;;:7;;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;:10;;;;:21;13707:9;;;;;;;:6;:9;;;;;;;;;:17;;13723:1;13707:17;;;13719:1;13707:17;13694:30;;:4;13699:1;13694:7;;;;;;;;;:::i;:::-;;;;;:30;;;;;:10;;;;:30;13474:1;13469:6;;;;;13439:301;;;13846:1;13842:5;;13871:1;13867:5;;13862:281;13878:4;13898:1;13883:12;:16;13878:22;;;;;;;:::i;:::-;;;;;:25;13874:29;;;;;;;;13862:281;;;13965:1;13932:6;13939:9;13949:4;13954:1;13949:7;;;;;;;;;:::i;:::-;;;;;:10;13939:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;13932:29;;;;;;;:::i;:::-;;;;:34;;;;;;;;;14002:4;;:7;;;;;;;;;:::i;:::-;;;;;:10;13991:21;;;;13996:1;13992:5;;13991:21;;;;13987:141;;14050:6;14057:9;14067:4;14072:1;14067:7;;;;;;;;;:::i;:::-;;;;;:10;14057:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;14050:29;;;;;;;:::i;:::-;;;;;14037:4;14042:1;14037:7;;;;;;;;;:::i;:::-;;;;;:42;;;;;:10;;;;:42;14107:1;14102:6;;;;;13987:141;13910:1;13905:6;;;;13862:281;;;14166:13;;;;;12419:1768;;;:::o;21902:137::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;22000:30:1::1;::::0;;;;22024:4:::1;22000:30;::::0;::::1;3285:74:16::0;-1:-1:-1;;;;;21981:14:1;::::1;::::0;::::1;::::0;21996:2;;21981:14;;22000:15:::1;::::0;3258:18:16;;22000:30:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21981:50;::::0;-1:-1:-1;;;;;;21981:50:1::1;::::0;;;;;;-1:-1:-1;;;;;206:55:16;;;21981:50:1::1;::::0;::::1;188:74:16::0;278:18;;;271:34;161:18;;21981:50:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7903:104:5:-:0;7959:13;7992:7;7985:14;;;;;:::i;21354:286:1:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;21441:9:1::1;::::0;::::1;::::0;;::::1;21432:18:::0;;::::1;;21424:83;;;::::0;-1:-1:-1;;;21424:83:1;;27495:2:16;21424:83:1::1;::::0;::::1;27477:21:16::0;27534:2;27514:18;;;27507:30;27573:34;27553:18;;;27546:62;27644:22;27624:18;;;27617:50;27684:19;;21424:83:1::1;27293:416:16::0;21424:83:1::1;3727:1:5::0;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:5;21526:6:1::1;:23;;;;21518:85;;;::::0;-1:-1:-1;;;21518:85:1;;27916:2:16;21518:85:1::1;::::0;::::1;27898:21:16::0;27955:2;27935:18;;;27928:30;27994:34;27974:18;;;27967:62;28065:19;28045:18;;;28038:47;28102:19;;21518:85:1::1;27714:413:16::0;21518:85:1::1;21614:9;:18:::0;;-1:-1:-1;;21614:18:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;21354:286::o;9521:287:5:-;736:10:2;-1:-1:-1;;;;;9620:24:5;;;9616:54;;9653:17;;;;;;;;;;;;;;9616:54;736:10:2;9683:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9683:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;9683:53:5;;;;;;;;;;9752:48;;888:41:16;;;9683:42:5;;736:10:2;9752:48:5;;861:18:16;9752:48:5;;;;;;;9521:287;;:::o;8357:2460:1:-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;17225:2:16;2368:63:14;;;17207:21:16;17264:2;17244:18;;;17237:30;17303:33;17283:18;;;17276:61;17354:18;;2368:63:14;17023:355:16;2368:63:14;1778:1;2509:7;:18;8490:17:1::1;8547:10;1120:20:0::0;1168:8;8520:70:1::1;;;::::0;-1:-1:-1;;;8520:70:1;;28334:2:16;8520:70:1::1;::::0;::::1;28316:21:16::0;28373:2;28353:18;;;28346:30;28412:20;28392:18;;;28385:48;28450:18;;8520:70:1::1;28132:342:16::0;8520:70:1::1;8640:9;::::0;3727:1:5;4124:12;3914:7;4108:13;8640:9:1::1;::::0;;::::1;::::0;8609:27;::::1;::::0;4108:28:5;;-1:-1:-1;;4108:46:5;8609:27:1::1;;;;:::i;:::-;:40;;8601:89;;;::::0;-1:-1:-1;;;8601:89:1;;28814:2:16;8601:89:1::1;::::0;::::1;28796:21:16::0;28853:2;28833:18;;;28826:30;28892:34;28872:18;;;28865:62;28963:6;28943:18;;;28936:34;28987:19;;8601:89:1::1;28612:400:16::0;8601:89:1::1;8705:5;:10;;8714:1;8705:10:::0;8701:28:::1;;8726:1;8718:9;;8701:28;8747:11;8759:5;8747:18;;;;;;;;;:::i;:::-;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;8739:52;;;::::0;-1:-1:-1;;;8739:52:1;;29219:2:16;8739:52:1::1;::::0;::::1;29201:21:16::0;29258:2;29238:18;;;29231:30;29297:23;29277:18;;;29270:51;29338:18;;8739:52:1::1;29017:345:16::0;8739:52:1::1;1136:6:13::0;;-1:-1:-1;;;;;1136:6:13;8808:10:1::1;:21;8804:157;;8897:7;8905:5;8897:14;;;;;;;;;:::i;:::-;;::::0;::::1;::::0;;;::::1;::::0;8861:10:::1;8854:18;::::0;;;:6:::1;:18;::::0;;;;8897:14;;;;::::1;;;;::::0;::::1;;::::0;;::::1;::::0;8882:11;;8854:25;::::1;;::::0;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:57;;;;8846:103;;;::::0;-1:-1:-1;;;8846:103:1;;29569:2:16;8846:103:1::1;::::0;::::1;29551:21:16::0;29608:2;29588:18;;;29581:30;29647:34;29627:18;;;29620:62;29718:3;29698:18;;;29691:31;29739:19;;8846:103:1::1;29367:397:16::0;8846:103:1::1;8973:13;8989:43;9008:10;9020:11;;8989:18;:43::i;:::-;8973:59;;9099:25;9114:5;9121:2;9099:14;:25::i;:::-;9086:38;;9155:7;1136:6:13::0;;-1:-1:-1;;;;;1136:6:13;;1063:87;9155:7:1::1;-1:-1:-1::0;;;;;9141:21:1::1;:10;-1:-1:-1::0;;;;;9141:21:1::1;::::0;9137:802;::::1;;9302:1;9280:23:::0;;;9276:663:::1;;9419:11;9389:41;;:10;9400;9389:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:41;;;;:::i;:::-;9376:9;:54;;9368:120;;;::::0;-1:-1:-1;;;9368:120:1;;29971:2:16;9368:120:1::1;::::0;::::1;29953:21:16::0;30010:2;29990:18;;;29983:30;30049:34;30029:18;;;30022:62;30120:23;30100:18;;;30093:51;30161:19;;9368:120:1::1;29769:417:16::0;9368:120:1::1;9276:663;;;9510:16:::0;::::1;;9522:4;9510:16:::0;9506:433:::1;;9675:11;9641:45;;:10;9652;9641:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;:31;;;:45;;;;:::i;:::-;9628:9;:58;;9620:106;;;::::0;-1:-1:-1;;;9620:106:1;;30393:2:16;9620:106:1::1;::::0;::::1;30375:21:16::0;30432:2;30412:18;;;30405:30;30471:34;30451:18;;;30444:62;30542:5;30522:18;;;30515:33;30565:19;;9620:106:1::1;30191:399:16::0;9506:433:1::1;9858:11;9828:41;;:10;9839;9828:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:41;;;;:::i;:::-;9815:9;:54;;9807:120;;;::::0;-1:-1:-1;;;9807:120:1;;29971:2:16;9807:120:1::1;::::0;::::1;29953:21:16::0;30010:2;29990:18;;;29983:30;30049:34;30029:18;;;30022:62;30120:23;30100:18;;;30093:51;30161:19;;9807:120:1::1;29769:417:16::0;9807:120:1::1;10055:10;10048:18;::::0;;;:6:::1;:18;::::0;;;;10077:11;;10048:25:::1;::::0;::::1;;::::0;::::1;;;;;:::i;:::-;;::::0;::::1;::::0;;::::1;:40:::0;;::::1;:25;::::0;;;;;;;::::1;:40;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;10103:467:1::1;10126:11;10122:15;;:1;:15;;;10103:467;;;10214:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;10214:26:1;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;10259:7:::1;10272:28;10214:26:::0;10298:1;10272:13:::1;:28::i;:::-;10259:42:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;10259:42:1;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;10320:10:::1;:22:::0;;:10;;:22;::::1;::::0;;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:29:::1;:22;::::0;;::::1;;:29:::0;::::1;:34:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;10379:15;;::::1;:19:::0;;::::1;;10375:180;;;10511:24;10526:5;10533:1;10511:14;:24::i;:::-;10498:37;;10375:180;10139:3;;10103:467;;;;10783:26;10793:2;10797:11;10783:26;;:9;:26::i;:::-;-1:-1:-1::0;;1734:1:14;2688:7;:22;-1:-1:-1;;;;;8357:2460:1:o;19630:142::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;19709:6:1::1;:16:::0;;-1:-1:-1;;;;;19709:16:1;;::::1;-1:-1:-1::0;;19709:16:1;;::::1;;::::0;;;19736:14:::1;:31:::0;;;;;::::1;::::0;::::1;;::::0;;19630:142::o;20005:154::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;20100:7:1::1;:23;20110:13:::0;20100:7;:23:::1;:::i;:::-;-1:-1:-1::0;20131:8:1::1;:20:::0;;-1:-1:-1;;20131:20:1::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;20005:154:1:o;6664:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10607:369:5:-;10774:28;10784:4;10790:2;10794:7;10774:9;:28::i;:::-;-1:-1:-1;;;;;10817:13:5;;1120:20:0;1168:8;;10817:76:5;;;;;10837:56;10868:4;10874:2;10878:7;10887:5;10837:30;:56::i;:::-;10836:57;10817:76;10813:156;;;10917:40;;-1:-1:-1;;;10917:40:5;;;;;;;;;;;10813:156;10607:369;;;;:::o;7413:668:1:-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;7476:52:1::1;::::0;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;7500:3:::1;7476:52;::::0;::::1;::::0;-1:-1:-1;7476:52:1;;;;;;7508:1:::1;7476:52:::0;;;;7511:1:::1;-1:-1:-1::0;7476:52:1;;;;;7514:10:::1;-1:-1:-1::0;7476:52:1;;;-1:-1:-1;7476:52:1;;;;;7460:10:::1;:69:::0;;::::1;::::0;::::1;::::0;;;;;;7476:52;;7460:69:::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7460:69:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7460:69:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7460:69:1;;::::1;::::0;::::1;-1:-1:-1::0;;7460:69:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;7556:51;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7460:69;7556:51:::0;;;;;7579:3:::1;7556:51:::0;;::::1;::::0;;;;7460:69:::1;7556:51:::0;;;;;;7460:69:::1;7556:51:::0;;;;;;7590:1:::1;7556:51:::0;;;;7593:10:::1;7556:51:::0;;;;;;;;;;;;;7540:10:::1;:68:::0;;;;::::1;::::0;;;;;;;7556:51;;7540:68;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7540:68:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7540:68:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7540:68:1;;::::1;::::0;::::1;-1:-1:-1::0;;7540:68:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;7635:66;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7540:68;7635:66:::0;;;;;7663:3:::1;7635:66:::0;;::::1;::::0;;;;7540:68:::1;7635:66:::0;;;;;;7671:1:::1;7635:66:::0;;;;;;;7674:2:::1;7635:66:::0;;;;;;;7678:10:::1;7635:66:::0;;;;;;;7690:10:::1;7635:66:::0;;;;;;;7619:10:::1;:83:::0;;;;::::1;::::0;;;;;;;7540:68:::1;7619:83:::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7619:83:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7619:83:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7619:83:1;;::::1;::::0;::::1;-1:-1:-1::0;;7619:83:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;7729:63;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7619:83;7729:63:::0;;;;;7753:3:::1;7729:63:::0;;::::1;::::0;;;;7619:83:::1;7729:63:::0;;;;;;;;;;;;;7765:2:::1;7729:63:::0;;;;;;;7769:10:::1;7729:63:::0;;;;;;;7781:10:::1;7729:63:::0;;;;;;;7713:10:::1;:80:::0;;;;::::1;::::0;;;;;;7619:83:::1;7713:80:::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7713:80:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7713:80:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7713:80:1;;::::1;::::0;::::1;-1:-1:-1::0;;7713:80:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;7820:67;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7713:80;7820:67:::0;;;;;7848:3:::1;7820:67:::0;;::::1;::::0;;;;7713:80:::1;7820:67:::0;;;;;;7856:2:::1;7820:67:::0;;;;;;;7860:2:::1;7820:67:::0;;;;;;;7864:10:::1;7820:67:::0;;;;;;;7876:10:::1;7820:67:::0;;;;;;;7804:10:::1;:84:::0;;;;::::1;::::0;;;;;;;7713:80:::1;7804:84:::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7804:84:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7804:84:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7804:84:1;;::::1;::::0;::::1;-1:-1:-1::0;;7804:84:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;7915:64;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7804:84;7915:64:::0;;;;;7940:3:::1;7915:64:::0;;::::1;::::0;;;;7804:84:::1;7915:64:::0;;;;;;7948:2:::1;7915:64:::0;;;;;;;7952:2:::1;7915:64:::0;;;;;;;7956:10:::1;7915:64:::0;;;;;;;7968:10:::1;7915:64:::0;;;;;;;7899:10:::1;:81:::0;;;;::::1;::::0;;;;;;;7804:84:::1;7899:81:::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7899:81:1::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7899:81:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7899:81:1;;::::1;::::0;::::1;-1:-1:-1::0;;7899:81:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;8007:65;;;;;;;::::1;;::::0;::::1;::::0;;;::::1;7899:81;8007:65:::0;;;;;8034:3:::1;8007:65:::0;;::::1;::::0;;;;7899:81:::1;8007:65:::0;;;;;;8042:1:::1;8007:65:::0;;;;;;;8045:2:::1;8007:65:::0;;;;;;;8049:10:::1;8007:65:::0;;;;;;;8061:10:::1;8007:65:::0;;;;;;;7991:10:::1;:82:::0;;;;::::1;::::0;;;;;;;7899:81:::1;7991:82:::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;7991:82:1::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;7991:82:1;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;7991:82:1;;::::1;::::0;::::1;-1:-1:-1::0;;7991:82:1;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;7413:668::o;6110:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6110:19:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6110:19:1;-1:-1:-1;6110:19:1;:::o;11134:122::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;11216:19:1::1;:32:::0;11134:122::o;6450:29::-;;;;;;;;;;;;20229:594;20379:8;;20295:13;;;;20349;;20379:8;;20375:418;;;20454:10;:8;:10::i;:::-;20448:24;20476:1;20448:29;:102;;;;;;;;;;;;;;;;;20504:10;:8;:10::i;:::-;20516:19;:8;:17;:19::i;:::-;20487:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20448:102;20442:108;;20375:418;;;20642:9;20652:8;20642:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20688:10:1;:8;:10::i;:::-;20682:24;20710:1;20682:29;:99;;;;;;;;;;;;;;;;;20738:10;:8;:10::i;:::-;20750:16;:5;:14;:16::i;:::-;20721:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20682:99;20676:105;;20375:418;-1:-1:-1;20812:3:1;20229:594;-1:-1:-1;;20229:594:1:o;19467:108::-;1136:6:13;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;19563:7:1::1;19545;19553:6;19545:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;19467:108:::0;;:::o;10886:210::-;10979:4;11003:85;11022:11;;11003:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11035:19:1;;11066:20;;-1:-1:-1;;31386:2:16;31382:15;;;31378:88;11066:20:1;;;31366:101:16;11035:19:1;;-1:-1:-1;31483:12:16;;;-1:-1:-1;11066:20:1;;;;;;;;;;;;11056:31;;;;;;11003:18;:85::i;:::-;10996:92;10886:210;-1:-1:-1;;;;10886:210:1:o;1972:201:13:-;1136:6;;-1:-1:-1;;;;;1136:6:13;736:10:2;1283:23:13;1275:68;;;;-1:-1:-1;;;1275:68:13;;16233:2:16;1275:68:13;;;16215:21:16;;;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16363:18;;1275:68:13;16031:356:16;1275:68:13;-1:-1:-1;;;;;2061:22:13;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:13;;31708:2:16;2053:73:13::1;::::0;::::1;31690:21:16::0;31747:2;31727:18;;;31720:30;31786:34;31766:18;;;31759:62;31857:8;31837:18;;;31830:36;31883:19;;2053:73:13::1;31506:402:16::0;2053:73:13::1;2137:28;2156:8;2137:18;:28::i;20902:248:1:-:0;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;17225:2:16;2368:63:14;;;17207:21:16;17264:2;17244:18;;;17237:30;17303:33;17283:18;;;17276:61;17354:18;;2368:63:14;17023:355:16;2368:63:14;1778:1;2509:7;:18;3727:1:5;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:5;20983:2:1::1;:19;;;;:29;;;;;21011:1;21006:2;:6;;;20983:29;20975:66;;;::::0;-1:-1:-1;;;20975:66:1;;17585:2:16;20975:66:1::1;::::0;::::1;17567:21:16::0;17624:2;17604:18;;;17597:30;17663:26;17643:18;;;17636:54;17707:18;;20975:66:1::1;17383:348:16::0;20975:66:1::1;21074:6;::::0;-1:-1:-1;;;;;21074:6:1::1;21060:10;:20;21052:61;;;::::0;-1:-1:-1;;;21052:61:1;;32115:2:16;21052:61:1::1;::::0;::::1;32097:21:16::0;32154:2;32134:18;;;32127:30;32193;32173:18;;;32166:58;32241:18;;21052:61:1::1;31913:352:16::0;21052:61:1::1;21124:10;::::0;;;::::1;;::::0;;;:6:::1;:10;::::0;;;;:18;;-1:-1:-1;;21124:18:1::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;2688:7:14;:22;20902:248:1:o;1404:215:4:-;1506:4;-1:-1:-1;;;;;;1530:41:4;;1545:26;1530:41;;:81;;;1575:36;1599:11;1575:23;:36::i;2766:332::-;2482:5;2869:33;;;;;2861:88;;;;-1:-1:-1;;;2861:88:4;;32472:2:16;2861:88:4;;;32454:21:16;32511:2;32491:18;;;32484:30;32550:34;32530:18;;;32523:62;32621:12;32601:18;;;32594:40;32651:19;;2861:88:4;32270:406:16;2861:88:4;-1:-1:-1;;;;;2968:22:4;;2960:60;;;;-1:-1:-1;;;2960:60:4;;32883:2:16;2960:60:4;;;32865:21:16;32922:2;32902:18;;;32895:30;32961:27;32941:18;;;32934:55;33006:18;;2960:60:4;32681:349:16;2960:60:4;3055:35;;;;;;;;;-1:-1:-1;;;;;3055:35:4;;;;;;;;;;;;;;;;;-1:-1:-1;;;3033:57:4;;;;:19;:57;2766:332::o;11231:174:5:-;11288:4;11331:7;3727:1;11312:26;;:53;;;;;11352:13;;11342:7;:23;11312:53;:85;;;;-1:-1:-1;;11370:20:5;;;;:11;:20;;;;;:27;-1:-1:-1;;;11370:27:5;;;;11369:28;;11231:174::o;19737:196::-;19852:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;19852:29:5;-1:-1:-1;;;;;19852:29:5;;;;;;;;;19897:28;;19852:24;;19897:28;;;;;;;19737:196;;;:::o;14680:2130::-;14795:35;14833:21;14846:7;14833:12;:21::i;:::-;14795:59;;14893:4;-1:-1:-1;;;;;14871:26:5;:13;:18;;;-1:-1:-1;;;;;14871:26:5;;14867:67;;14906:28;;;;;;;;;;;;;;14867:67;14947:22;736:10:2;-1:-1:-1;;;;;14973:20:5;;;;:73;;-1:-1:-1;15010:36:5;15027:4;736:10:2;9879:164:5;:::i;15010:36::-;14973:126;;;-1:-1:-1;736:10:2;15063:20:5;15075:7;15063:11;:20::i;:::-;-1:-1:-1;;;;;15063:36:5;;14973:126;14947:153;;15118:17;15113:66;;15144:35;;;;;;;;;;;;;;15113:66;-1:-1:-1;;;;;15194:16:5;;15190:52;;15219:23;;;;;;;;;;;;;;15190:52;15363:35;15380:1;15384:7;15393:4;15363:8;:35::i;:::-;-1:-1:-1;;;;;15694:18:5;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15694:31:5;;;;;;;-1:-1:-1;;15694:31:5;;;;;;;15740:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15740:29:5;;;;;;;;;;;15820:20;;;:11;:20;;;;;;15855:18;;-1:-1:-1;;;;;;15888:49:5;;;;-1:-1:-1;;;15921:15:5;15888:49;;;;;;;;;;16211:11;;16271:24;;;;;16314:13;;15820:20;;16271:24;;16314:13;16310:384;;16524:13;;16509:11;:28;16505:174;;16562:20;;16631:28;;;;16605:54;;-1:-1:-1;;;16605:54:5;-1:-1:-1;;;;;;16605:54:5;;;-1:-1:-1;;;;;16562:20:5;;16605:54;;;;16505:174;15669:1036;;;16741:7;16737:2;-1:-1:-1;;;;;16722:27:5;16731:4;-1:-1:-1;;;;;16722:27:5;;;;;;;;;;;16760:42;14784:2026;;14680:2130;;;:::o;2119:317:0:-;2234:6;2209:21;:31;;2201:73;;;;-1:-1:-1;;;2201:73:0;;33237:2:16;2201:73:0;;;33219:21:16;33276:2;33256:18;;;33249:30;33315:31;33295:18;;;33288:59;33364:18;;2201:73:0;33035:353:16;2201:73:0;2288:12;2306:9;-1:-1:-1;;;;;2306:14:0;2328:6;2306:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2287:52;;;2358:7;2350:78;;;;-1:-1:-1;;;2350:78:0;;33805:2:16;2350:78:0;;;33787:21:16;33844:2;33824:18;;;33817:30;33883:34;33863:18;;;33856:62;33954:28;33934:18;;;33927:56;34000:19;;2350:78:0;33603:422:16;6371:1109:5;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6482:7:5;;3727:1;6531:23;;:47;;;;;6565:13;;6558:4;:20;6531:47;6527:886;;;6599:31;6633:17;;;:11;:17;;;;;;;;;6599:51;;;;;;;;;-1:-1:-1;;;;;6599:51:5;;;;-1:-1:-1;;;6599:51:5;;;;;;;;;;;-1:-1:-1;;;6599:51:5;;;;;;;;;;;;;;6669:729;;6719:14;;-1:-1:-1;;;;;6719:28:5;;6715:101;;6783:9;6371:1109;-1:-1:-1;;;6371:1109:5:o;6715:101::-;-1:-1:-1;;;7158:6:5;7203:17;;;;:11;:17;;;;;;;;;7191:29;;;;;;;;;-1:-1:-1;;;;;7191:29:5;;;;;-1:-1:-1;;;7191:29:5;;;;;;;;;;;-1:-1:-1;;;7191:29:5;;;;;;;;;;;;;7251:28;7247:109;;7319:9;6371:1109;-1:-1:-1;;;6371:1109:5:o;7247:109::-;7118:261;;;6580:833;6527:886;7441:31;;;;;;;;;;;;;;2333:191:13;2426:6;;;-1:-1:-1;;;;;2443:17:13;;;-1:-1:-1;;2443:17:13;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;14258:1953:1:-;14333:6;14352:17;14422:1;14414:5;:9;;;:22;;;;;14435:1;14427:5;:9;;;14414:22;14406:59;;;;-1:-1:-1;;;14406:59:1;;34232:2:16;14406:59:1;;;34214:21:16;34271:2;34251:18;;;34244:30;34310:26;34290:18;;;34283:54;34354:18;;14406:59:1;34030:348:16;14406:59:1;14486:5;:10;;14495:1;14486:10;14482:1576;;14593:65;;;14610:15;14593:65;;;;34566:19:16;;;;14627:10:1;34623:2:16;34619:15;-1:-1:-1;;34615:88:16;34601:12;;;34594:110;14639:13:1;;;14655:2;14639:18;34742:3:16;34738:16;34756:66;34734:89;34720:12;;;34713:111;14593:65:1;;;;;;;;;34840:12:16;;;;14593:65:1;;;14583:76;;;;;14663:1;;14575:89;14668:1;14568:101;14555:114;;14705:1;14692:10;:14;;;:32;;;;14723:1;14710:10;:14;;;14692:32;14688:95;;;-1:-1:-1;14762:1:1;14688:95;14838:10;14849;14838:22;;;;;;;;;;:::i;:::-;;;;;;;;;:29;:22;;;;;:29;;14805:10;:22;;14838:29;;;;;14805:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;:62;14801:267;;14896:10;:15;;14910:1;14896:15;14892:157;;-1:-1:-1;14953:1:1;14482:1576;;14892:157;-1:-1:-1;15024:1:1;14892:157;14482:1576;;;15095:5;:10;;15104:1;15095:10;15091:967;;15208:65;;;15225:15;15208:65;;;;34566:19:16;;;;15242:10:1;34623:2:16;34619:15;-1:-1:-1;;34615:88:16;34601:12;;;34594:110;15254:13:1;;;15270:2;15254:18;34742:3:16;34738:16;34756:66;34734:89;34720:12;;;34713:111;15208:65:1;;;;;;;;;34840:12:16;;;;15208:65:1;;;15198:76;;;;;15278:1;;15190:89;15283:1;15183:101;15170:114;;15320:1;15307:10;:14;;;:32;;;;15338:1;15325:10;:14;;;15307:32;15303:95;;;-1:-1:-1;15377:1:1;15303:95;15453:10;15464;15453:22;;;;;;;;;;:::i;:::-;;;;;;;;;:29;:22;;;;;:29;;15420:10;:22;;15453:29;;;;;15420:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;:62;15416:415;;15534:10;15545:1;15534:13;;;;;;;;:::i;:::-;;;;;;;;;:20;:13;;;;;:20;;15511:10;:13;;15534:20;;;;;15522:1;;15511:13;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;;;;;;;;:43;15507:305;;;-1:-1:-1;15596:1:1;14482:1576;;15507:305;15654:10;15665:1;15654:13;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;;;;;;;;;;15631:43;;:10;15642:1;15631:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;;;;;;;;:43;15627:185;;;-1:-1:-1;15716:1:1;14482:1576;;15627:185;-1:-1:-1;15787:1:1;15091:967;;;15858:5;:10;;15867:1;15858:10;15854:204;;-1:-1:-1;15935:1:1;15854:204;;;15964:5;:10;;15973:1;15964:10;15960:98;;-1:-1:-1;16041:1:1;15960:98;16121:10;16132;16121:22;;;;;;;;;;:::i;:::-;;;;;;;;;:29;:22;;;;;:29;;16089:10;:22;;16121:29;;;;;16089:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;:61;16081:97;;;;-1:-1:-1;;;16081:97:1;;35065:2:16;16081:97:1;;;35047:21:16;35104:2;35084:18;;;35077:30;35143:25;35123:18;;;35116:53;35186:18;;16081:97:1;34863:347:16;16081:97:1;16196:10;14258:1953;-1:-1:-1;;;14258:1953:1:o;16278:541::-;16357:6;16376:12;16399:13;16453:10;16433:30;;:10;:17;;;;:30;16425:71;;;;-1:-1:-1;;;16425:71:1;;35417:2:16;16425:71:1;;;35399:21:16;35456:2;35436:18;;;35429:30;35495;35475:18;;;35468:58;35543:18;;16425:71:1;35215:352:16;16425:71:1;16581:10;16592;16581:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;;;;;;;;;;16550:10;16561;16550:22;;;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;;;;;;;;;;:59;16612:1;16550:63;16542:71;;16746:10;16757;16746:22;;;;;;;;;;:::i;:::-;;;;;;;;;;:28;:22;;;;;:28;;16662:70;;;16679:15;16662:70;;;34566:19:16;;;;-1:-1:-1;;16696:10:1;34623:2:16;34619:15;34615:88;34601:12;;;34594:110;34756:66;16729:2:1;16708:18;;;:23;34742:3:16;34738:16;34734:89;34720:12;;;34713:111;16746:28:1;;;;;;;;16644:98;;;;34840:12:16;;16662:70:1;;;;;;;;;;;;16652:81;;;;;;16644:90;;:98;;;;;:::i;:::-;;16637:137;;16278:541;-1:-1:-1;;;;;16278:541:1:o;11544:104:5:-;11613:27;11623:2;11627:8;11613:27;;;;;;;;;;;;:9;:27::i;20425:667::-;20609:72;;;;;20588:4;;-1:-1:-1;;;;;20609:36:5;;;;;:72;;736:10:2;;20660:4:5;;20666:7;;20675:5;;20609:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20609:72:5;;;;;;;;-1:-1:-1;;20609:72:5;;;;;;;;;;;;:::i;:::-;;;20605:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20843:6;:13;20860:1;20843:18;20839:235;;20889:40;;-1:-1:-1;;;20889:40:5;;;;;;;;;;;20839:235;21032:6;21026:13;21017:6;21013:2;21009:15;21002:38;20605:480;-1:-1:-1;;;;;;20728:55:5;20738:45;20728:55;;-1:-1:-1;20425:667:5;;;;;;:::o;21188:108:1:-;21248:13;21281:7;21274:14;;;;;:::i;342:723:15:-;398:13;619:5;628:1;619:10;615:53;;-1:-1:-1;;646:10:15;;;;;;;;;;;;;;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:15;;-1:-1:-1;798:2:15;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:15;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:15;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:15;1012:2;1003:11;;:::i;:::-;;;872:154;;1180:190:12;1305:4;1358;1329:25;1342:5;1349:4;1329:12;:25::i;:::-;:33;;1180:190;-1:-1:-1;;;;1180:190:12:o;4621:305:5:-;4723:4;-1:-1:-1;;;;;;4760:40:5;;4775:25;4760:40;;:105;;-1:-1:-1;;;;;;;4817:48:5;;4832:33;4817:48;4760:105;:158;;;-1:-1:-1;978:25:3;-1:-1:-1;;;;;;963:40:3;;;4882:36:5;854:157:3;12011:265:5;12236:32;12242:2;12246:8;12256:5;12263:4;12236:5;:32::i;1731:675:12:-;1814:7;1857:4;1814:7;1872:497;1896:5;:12;1892:1;:16;1872:497;;;1930:20;1953:5;1959:1;1953:8;;;;;;;;:::i;:::-;;;;;;;1930:31;;1996:12;1980;:28;1976:382;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2108:57;;1976:382;;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2285:57;;1976:382;-1:-1:-1;1910:3:12;;;;:::i;:::-;;;;1872:497;;;-1:-1:-1;2386:12:12;1731:675;-1:-1:-1;;;1731:675:12:o;12651:1775:5:-;12790:20;12813:13;-1:-1:-1;;;;;12841:16:5;;12837:48;;12866:19;;;;;;;;;;;;;;12837:48;12900:8;12912:1;12900:13;12896:44;;12922:18;;;;;;;;;;;;;;12896:44;-1:-1:-1;;;;;13291:16:5;;;;;;:12;:16;;;;;;;;:44;;13350:49;;;13291:44;;;;;;;;13350:49;;;;-1:-1:-1;;13291:44:5;;;;;;13350:49;;;;;;;;;;;;;;;;13416:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;13466:66:5;;;;-1:-1:-1;;;13516:15:5;13466:66;;;;;;;;;;13416:25;13613:23;;;13657:4;:23;;;;-1:-1:-1;;;;;;13665:13:5;;1120:20:0;1168:8;;13665:15:5;13653:641;;;13701:314;13732:38;;13757:12;;-1:-1:-1;;;;;13732:38:5;;;13749:1;;13732:38;;13749:1;;13732:38;13798:69;13837:1;13841:2;13845:14;;;;;;13861:5;13798:30;:69::i;:::-;13793:174;;13903:40;;-1:-1:-1;;;13903:40:5;;;;;;;;;;;13793:174;14010:3;13994:12;:19;13701:314;;14096:12;14079:13;;:29;14075:43;;14110:8;;;14075:43;13653:641;;;14159:120;14190:40;;14215:14;;;;;-1:-1:-1;;;;;14190:40:5;;;14207:1;;14190:40;;14207:1;;14190:40;14274:3;14258:12;:19;14159:120;;13653:641;-1:-1:-1;14308:13:5;:28;14358:60;10607:369;-1:-1:-1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;316:177:16:-;-1:-1:-1;;;;;;394:5:16;390:78;383:5;380:89;370:117;;483:1;480;473:12;498:245;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;664:9;651:23;683:30;707:5;683:30;:::i;940:154::-;-1:-1:-1;;;;;1019:5:16;1015:54;1008:5;1005:65;995:93;;1084:1;1081;1074:12;1099:435;1166:6;1174;1227:2;1215:9;1206:7;1202:23;1198:32;1195:52;;;1243:1;1240;1233:12;1195:52;1282:9;1269:23;1301:31;1326:5;1301:31;:::i;:::-;1351:5;-1:-1:-1;1408:2:16;1393:18;;1380:32;1456:26;1443:40;;1431:53;;1421:81;;1498:1;1495;1488:12;1421:81;1521:7;1511:17;;;1099:435;;;;;:::o;1539:258::-;1611:1;1621:113;1635:6;1632:1;1629:13;1621:113;;;1711:11;;;1705:18;1692:11;;;1685:39;1657:2;1650:10;1621:113;;;1752:6;1749:1;1746:13;1743:48;;;-1:-1:-1;;1787:1:16;1769:16;;1762:27;1539:258::o;1802:317::-;1844:3;1882:5;1876:12;1909:6;1904:3;1897:19;1925:63;1981:6;1974:4;1969:3;1965:14;1958:4;1951:5;1947:16;1925:63;:::i;:::-;2033:2;2021:15;-1:-1:-1;;2017:88:16;2008:98;;;;2108:4;2004:109;;1802:317;-1:-1:-1;;1802:317:16:o;2124:220::-;2273:2;2262:9;2255:21;2236:4;2293:45;2334:2;2323:9;2319:18;2311:6;2293:45;:::i;2349:159::-;2416:20;;2476:6;2465:18;;2455:29;;2445:57;;2498:1;2495;2488:12;2445:57;2349:159;;;:::o;2513:118::-;2599:5;2592:13;2585:21;2578:5;2575:32;2565:60;;2621:1;2618;2611:12;2636:313;2700:6;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2800:28;2818:9;2800:28;:::i;:::-;2790:38;;2878:2;2867:9;2863:18;2850:32;2891:28;2913:5;2891:28;:::i;2954:180::-;3013:6;3066:2;3054:9;3045:7;3041:23;3037:32;3034:52;;;3082:1;3079;3072:12;3034:52;-1:-1:-1;3105:23:16;;2954:180;-1:-1:-1;2954:180:16:o;3370:315::-;3438:6;3446;3499:2;3487:9;3478:7;3474:23;3470:32;3467:52;;;3515:1;3512;3505:12;3467:52;3554:9;3541:23;3573:31;3598:5;3573:31;:::i;:::-;3623:5;3675:2;3660:18;;;;3647:32;;-1:-1:-1;;;3370:315:16:o;3690:184::-;3748:6;3801:2;3789:9;3780:7;3776:23;3772:32;3769:52;;;3817:1;3814;3807:12;3769:52;3840:28;3858:9;3840:28;:::i;4254:385::-;4326:6;4334;4342;4395:2;4383:9;4374:7;4370:23;4366:32;4363:52;;;4411:1;4408;4401:12;4363:52;4434:28;4452:9;4434:28;:::i;:::-;4424:38;;4481:37;4514:2;4503:9;4499:18;4481:37;:::i;:::-;4471:47;;4568:2;4557:9;4553:18;4540:32;4581:28;4603:5;4581:28;:::i;:::-;4628:5;4618:15;;;4254:385;;;;;:::o;4644:456::-;4721:6;4729;4737;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4845:9;4832:23;4864:31;4889:5;4864:31;:::i;:::-;4914:5;-1:-1:-1;4971:2:16;4956:18;;4943:32;4984:33;4943:32;4984:33;:::i;:::-;4644:456;;5036:7;;-1:-1:-1;;;5090:2:16;5075:18;;;;5062:32;;4644:456::o;5105:248::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;-1:-1:-1;;5273:23:16;;;5343:2;5328:18;;;5315:32;;-1:-1:-1;5105:248:16:o;5358:348::-;5410:8;5420:6;5474:3;5467:4;5459:6;5455:17;5451:27;5441:55;;5492:1;5489;5482:12;5441:55;-1:-1:-1;5515:20:16;;5558:18;5547:30;;5544:50;;;5590:1;5587;5580:12;5544:50;5627:4;5619:6;5615:17;5603:29;;5679:3;5672:4;5663:6;5655;5651:19;5647:30;5644:39;5641:59;;;5696:1;5693;5686:12;5711:839;5832:6;5840;5848;5856;5864;5872;5880;5888;5941:3;5929:9;5920:7;5916:23;5912:33;5909:53;;;5958:1;5955;5948:12;5909:53;5981:28;5999:9;5981:28;:::i;:::-;5971:38;;6060:2;6049:9;6045:18;6032:32;6087:18;6079:6;6076:30;6073:50;;;6119:1;6116;6109:12;6073:50;6158:59;6209:7;6200:6;6189:9;6185:22;6158:59;:::i;:::-;6236:8;;-1:-1:-1;6132:85:16;-1:-1:-1;6290:37:16;;-1:-1:-1;6323:2:16;6308:18;;6290:37;:::i;:::-;6280:47;;6346:37;6379:2;6368:9;6364:18;6346:37;:::i;:::-;6336:47;;6402:38;6435:3;6424:9;6420:19;6402:38;:::i;:::-;6392:48;;6487:3;6476:9;6472:19;6459:33;6449:43;;6539:3;6528:9;6524:19;6511:33;6501:43;;5711:839;;;;;;;;;;;:::o;6555:704::-;6864:3;6853:9;6846:22;6827:4;6885:46;6926:3;6915:9;6911:19;6903:6;6885:46;:::i;:::-;6950:6;6992:15;;;6987:2;6972:18;;6965:43;7044:15;;;7039:2;7024:18;;7017:43;-1:-1:-1;7096:15:16;;;7091:2;7076:18;;7069:43;7149:15;;;;7143:3;7128:19;;7121:44;7196:3;7181:19;;7174:35;;;;7240:3;7225:19;7218:35;;;;6877:54;6555:704;-1:-1:-1;6555:704:16:o;7264:255::-;7331:6;7384:2;7372:9;7363:7;7359:23;7355:32;7352:52;;;7400:1;7397;7390:12;7352:52;7439:9;7426:23;7458:31;7483:5;7458:31;:::i;7524:766::-;7637:6;7645;7653;7661;7669;7677;7685;7738:3;7726:9;7717:7;7713:23;7709:33;7706:53;;;7755:1;7752;7745:12;7706:53;7778:28;7796:9;7778:28;:::i;:::-;7768:38;;7857:2;7846:9;7842:18;7829:32;7884:18;7876:6;7873:30;7870:50;;;7916:1;7913;7906:12;7870:50;7955:59;8006:7;7997:6;7986:9;7982:22;7955:59;:::i;:::-;8033:8;;-1:-1:-1;7929:85:16;-1:-1:-1;8087:37:16;;-1:-1:-1;8120:2:16;8105:18;;8087:37;:::i;:::-;8077:47;;8143:37;8176:2;8165:9;8161:18;8143:37;:::i;:::-;8133:47;;8227:3;8216:9;8212:19;8199:33;8189:43;;8279:3;8268:9;8264:19;8251:33;8241:43;;7524:766;;;;;;;;;;:::o;8547:921::-;8775:6;8760:22;;8764:9;8859:6;8733:4;;8914:548;8930:6;8925:3;8922:15;8914:548;;;8993:13;;9032:3;9115:1;9129:249;9145:4;9140:3;9137:13;9129:249;;;9222:15;;9239:6;9218:28;9204:43;;9274:4;9347:17;;;;9304:14;;;;9169:1;9160:11;9129:249;;;-1:-1:-1;;;9407:4:16;9398:14;;;;;9447:4;9435:17;;;;;8956:1;8947:11;8914:548;;;8918:3;;;;8547:921;;;;:::o;9473:403::-;9556:6;9564;9617:2;9605:9;9596:7;9592:23;9588:32;9585:52;;;9633:1;9630;9623:12;9585:52;9672:9;9659:23;9691:31;9716:5;9691:31;:::i;:::-;9741:5;-1:-1:-1;9798:2:16;9783:18;;9770:32;9811:33;9770:32;9811:33;:::i;10127:382::-;10192:6;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10308:9;10295:23;10327:31;10352:5;10327:31;:::i;10514:367::-;10577:8;10587:6;10641:3;10634:4;10626:6;10622:17;10618:27;10608:55;;10659:1;10656;10649:12;10608:55;-1:-1:-1;10682:20:16;;10725:18;10714:30;;10711:50;;;10757:1;10754;10747:12;10711:50;10794:4;10786:6;10782:17;10770:29;;10854:3;10847:4;10837:6;10834:1;10830:14;10822:6;10818:27;10814:38;10811:47;10808:67;;;10871:1;10868;10861:12;10886:717;10997:6;11005;11013;11021;11029;11082:3;11070:9;11061:7;11057:23;11053:33;11050:53;;;11099:1;11096;11089:12;11050:53;11138:9;11125:23;11157:31;11182:5;11157:31;:::i;:::-;11207:5;-1:-1:-1;11231:37:16;11264:2;11249:18;;11231:37;:::i;:::-;11221:47;;11319:2;11308:9;11304:18;11291:32;11346:18;11338:6;11335:30;11332:50;;;11378:1;11375;11368:12;11332:50;11417:70;11479:7;11470:6;11459:9;11455:22;11417:70;:::i;:::-;11506:8;;-1:-1:-1;11391:96:16;-1:-1:-1;11560:37:16;;-1:-1:-1;11593:2:16;11578:18;;11560:37;:::i;:::-;11550:47;;10886:717;;;;;;;;:::o;12183:184::-;-1:-1:-1;;;12232:1:16;12225:88;12332:4;12329:1;12322:15;12356:4;12353:1;12346:15;12372:691;12437:5;12467:18;12508:2;12500:6;12497:14;12494:40;;;12514:18;;:::i;:::-;12648:2;12642:9;12714:2;12702:15;;-1:-1:-1;;12698:24:16;;;12724:2;12694:33;12690:42;12678:55;;;12748:18;;;12768:22;;;12745:46;12742:72;;;12794:18;;:::i;:::-;12834:10;12830:2;12823:22;12863:6;12854:15;;12893:6;12885;12878:22;12933:3;12924:6;12919:3;12915:16;12912:25;12909:45;;;12950:1;12947;12940:12;12909:45;13000:6;12995:3;12988:4;12980:6;12976:17;12963:44;13055:1;13048:4;13039:6;13031;13027:19;13023:30;13016:41;;;;12372:691;;;;;:::o;13068:584::-;13143:6;13151;13204:2;13192:9;13183:7;13179:23;13175:32;13172:52;;;13220:1;13217;13210:12;13172:52;13260:9;13247:23;13293:18;13285:6;13282:30;13279:50;;;13325:1;13322;13315:12;13279:50;13348:22;;13401:4;13393:13;;13389:27;-1:-1:-1;13379:55:16;;13430:1;13427;13420:12;13379:55;13453:76;13521:7;13516:2;13503:16;13496:4;13492:2;13488:13;13453:76;:::i;:::-;13443:86;;;13579:4;13568:9;13564:20;13551:34;13594:28;13616:5;13594:28;:::i;13657:795::-;13752:6;13760;13768;13776;13829:3;13817:9;13808:7;13804:23;13800:33;13797:53;;;13846:1;13843;13836:12;13797:53;13885:9;13872:23;13904:31;13929:5;13904:31;:::i;:::-;13954:5;-1:-1:-1;14011:2:16;13996:18;;13983:32;14024:33;13983:32;14024:33;:::i;:::-;14076:7;-1:-1:-1;14130:2:16;14115:18;;14102:32;;-1:-1:-1;14185:2:16;14170:18;;14157:32;14212:18;14201:30;;14198:50;;;14244:1;14241;14234:12;14198:50;14267:22;;14320:4;14312:13;;14308:27;-1:-1:-1;14298:55:16;;14349:1;14346;14339:12;14298:55;14372:74;14438:7;14433:2;14420:16;14415:2;14411;14407:11;14372:74;:::i;:::-;14362:84;;;13657:795;;;;;;;:::o;14457:546::-;14714:3;14703:9;14696:22;14677:4;14735:46;14776:3;14765:9;14761:19;14753:6;14735:46;:::i;:::-;14800:6;14842:15;;;14837:2;14822:18;;14815:43;14894:15;;;;14889:2;14874:18;;14867:43;14941:2;14926:18;;14919:34;;;;14984:3;14969:19;;;14962:35;14727:54;14457:546;-1:-1:-1;;14457:546:16:o;15193:256::-;15259:6;15267;15320:2;15308:9;15299:7;15295:23;15291:32;15288:52;;;15336:1;15333;15326:12;15288:52;15359:28;15377:9;15359:28;:::i;:::-;15349:38;;15406:37;15439:2;15428:9;15424:18;15406:37;:::i;:::-;15396:47;;15193:256;;;;;:::o;15454:572::-;15549:6;15557;15565;15618:2;15606:9;15597:7;15593:23;15589:32;15586:52;;;15634:1;15631;15624:12;15586:52;15673:9;15660:23;15692:31;15717:5;15692:31;:::i;:::-;15742:5;-1:-1:-1;15798:2:16;15783:18;;15770:32;15825:18;15814:30;;15811:50;;;15857:1;15854;15847:12;15811:50;15896:70;15958:7;15949:6;15938:9;15934:22;15896:70;:::i;:::-;15454:572;;15985:8;;-1:-1:-1;15870:96:16;;-1:-1:-1;;;;15454:572:16:o;16392:437::-;16471:1;16467:12;;;;16514;;;16535:61;;16589:4;16581:6;16577:17;16567:27;;16535:61;16642:2;16634:6;16631:14;16611:18;16608:38;16605:218;;-1:-1:-1;;;16676:1:16;16669:88;16780:4;16777:1;16770:15;16808:4;16805:1;16798:15;16605:218;;16392:437;;;:::o;16834:184::-;-1:-1:-1;;;16883:1:16;16876:88;16983:4;16980:1;16973:15;17007:4;17004:1;16997:15;19260:184;19330:6;19383:2;19371:9;19362:7;19358:23;19354:32;19351:52;;;19399:1;19396;19389:12;19351:52;-1:-1:-1;19422:16:16;;19260:184;-1:-1:-1;19260:184:16:o;21026:245::-;21093:6;21146:2;21134:9;21125:7;21121:23;21117:32;21114:52;;;21162:1;21159;21152:12;21114:52;21194:9;21188:16;21213:28;21235:5;21213:28;:::i;21680:184::-;-1:-1:-1;;;21729:1:16;21722:88;21829:4;21826:1;21819:15;21853:4;21850:1;21843:15;21869:217;21908:4;21937:6;21993:10;;;;21963;;22015:12;;;22012:38;;;22030:18;;:::i;:::-;22067:13;;21869:217;-1:-1:-1;;;21869:217:16:o;22091:224::-;22130:3;22158:6;22191:2;22188:1;22184:10;22221:2;22218:1;22214:10;22252:3;22248:2;22244:12;22239:3;22236:21;22233:47;;;22260:18;;:::i;:::-;22296:13;;22091:224;-1:-1:-1;;;;22091:224:16:o;22320:228::-;22360:7;22486:1;-1:-1:-1;;22414:74:16;22411:1;22408:81;22403:1;22396:9;22389:17;22385:105;22382:131;;;22493:18;;:::i;:::-;-1:-1:-1;22533:9:16;;22320:228::o;22553:184::-;-1:-1:-1;;;22602:1:16;22595:88;22702:4;22699:1;22692:15;22726:4;22723:1;22716:15;22742:120;22782:1;22808;22798:35;;22813:18;;:::i;:::-;-1:-1:-1;22847:9:16;;22742:120::o;22993:545::-;23095:2;23090:3;23087:11;23084:448;;;23131:1;23156:5;23152:2;23145:17;23201:4;23197:2;23187:19;23271:2;23259:10;23255:19;23252:1;23248:27;23242:4;23238:38;23307:4;23295:10;23292:20;23289:47;;;-1:-1:-1;23330:4:16;23289:47;23385:2;23380:3;23376:12;23373:1;23369:20;23363:4;23359:31;23349:41;;23440:82;23458:2;23451:5;23448:13;23440:82;;;23503:17;;;23484:1;23473:13;23440:82;;;23444:3;;;22993:545;;;:::o;23774:1471::-;23900:3;23894:10;23927:18;23919:6;23916:30;23913:56;;;23949:18;;:::i;:::-;23978:97;24068:6;24028:38;24060:4;24054:11;24028:38;:::i;:::-;24022:4;23978:97;:::i;:::-;24130:4;;24194:2;24183:14;;24211:1;24206:782;;;;25032:1;25049:6;25046:89;;;-1:-1:-1;25101:19:16;;;25095:26;25046:89;-1:-1:-1;;23671:1:16;23667:11;;;23663:84;23659:89;23649:100;23755:1;23751:11;;;23646:117;25148:81;;24176:1063;;24206:782;22940:1;22933:14;;;22977:4;22964:18;;-1:-1:-1;;24242:79:16;;;24419:236;24433:7;24430:1;24427:14;24419:236;;;24522:19;;;24516:26;24501:42;;24614:27;;;;24582:1;24570:14;;;;24449:19;;24419:236;;;24423:3;24683:6;24674:7;24671:19;24668:261;;;24744:19;;;24738:26;-1:-1:-1;;24827:1:16;24823:14;;;24839:3;24819:24;24815:97;24811:102;24796:118;24781:134;;24668:261;-1:-1:-1;;;;;24975:1:16;24959:14;;;24955:22;24942:36;;-1:-1:-1;23774:1471:16:o;25609:1325::-;25733:18;25728:3;25725:27;25722:53;;;25755:18;;:::i;:::-;25784:94;25874:3;25834:38;25866:4;25860:11;25834:38;:::i;:::-;25828:4;25784:94;:::i;:::-;25904:1;25929:2;25924:3;25921:11;25946:1;25941:735;;;;26720:1;26737:3;26734:93;;;-1:-1:-1;26793:19:16;;;26780:33;26734:93;-1:-1:-1;;23671:1:16;23667:11;;;23663:84;23659:89;23649:100;23755:1;23751:11;;;23646:117;26840:78;;25914:1014;;25941:735;22940:1;22933:14;;;22977:4;22964:18;;-1:-1:-1;;25977:76:16;;;26137:9;26159:229;26173:7;26170:1;26167:14;26159:229;;;26262:19;;;26249:33;26234:49;;26369:4;26354:20;;;;26322:1;26310:14;;;;26189:12;26159:229;;;26163:3;26416;26407:7;26404:16;26401:219;;;-1:-1:-1;;26530:3:16;26524;26521:1;26517:11;26513:21;26509:94;26505:99;26492:9;26487:3;26483:19;26470:33;26466:139;26458:6;26451:155;26401:219;;;26663:1;26657:3;26654:1;26650:11;26646:19;26640:4;26633:33;25914:1014;;25609:1325;;;:::o;28479:128::-;28519:3;28550:1;28546:6;28543:1;28540:13;28537:39;;;28556:18;;:::i;:::-;-1:-1:-1;28592:9:16;;28479:128::o;30595:637::-;30875:3;30913:6;30907:13;30929:53;30975:6;30970:3;30963:4;30955:6;30951:17;30929:53;:::i;:::-;31045:13;;31004:16;;;;31067:57;31045:13;31004:16;31101:4;31089:17;;31067:57;:::i;:::-;31189:7;31146:20;;31175:22;;;31224:1;31213:13;;30595:637;-1:-1:-1;;;;30595:637:16:o;35572:512::-;35766:4;-1:-1:-1;;;;;35876:2:16;35868:6;35864:15;35853:9;35846:34;35928:2;35920:6;35916:15;35911:2;35900:9;35896:18;35889:43;;35968:6;35963:2;35952:9;35948:18;35941:34;36011:3;36006:2;35995:9;35991:18;35984:31;36032:46;36073:3;36062:9;36058:19;36050:6;36032:46;:::i;:::-;36024:54;35572:512;-1:-1:-1;;;;;;35572:512:16:o;36089:249::-;36158:6;36211:2;36199:9;36190:7;36186:23;36182:32;36179:52;;;36227:1;36224;36217:12;36179:52;36259:9;36253:16;36278:30;36302:5;36278:30;:::i;36343:195::-;36382:3;-1:-1:-1;;36406:5:16;36403:77;36400:103;;36483:18;;:::i;:::-;-1:-1:-1;36530:1:16;36519:13;;36343:195::o;36543:125::-;36583:4;36611:1;36608;36605:8;36602:34;;;36616:18;;:::i;:::-;-1:-1:-1;36653:9:16;;36543:125::o;36673:112::-;36705:1;36731;36721:35;;36736:18;;:::i;:::-;-1:-1:-1;36770:9:16;;36673:112::o

Swarm Source

ipfs://073a6769371704d837f51b519ae1b06cb09b9f9d7d7e2892fc843cd1f950a00f
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.