ETH Price: $3,458.55 (+0.12%)
Gas: 5 Gwei

Token

LISA EVO-X (LISA)
 

Overview

Max Total Supply

1,192 LISA

Holders

566

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bitcoin007.eth
Balance
1 LISA
0x9cead5773f576e9ae649251339b5f71c21edee3c
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:
NFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 9 of 11: NFT.sol
// SPDX-License-Identifier: MIT
// Create by 0xChrisx
// 0xChrisx Version : NEW ERC721A 4.x + MerkleProof + Burn + Queryable

//* LISA 2
/*
    * Max 10 Per Wallet

    * GoldPass
    * Free 3
    * Additional 0.0033
    == Free 3 , mint 4 (Free 3), mint 5(Free 3), -- mint 10(Free 3)

    * Whitelist
    * Free 1
    * Additional 0.0033
    == Free 1 , mint 2 (Free 1), mint 2(Free 1), -- mint 10(Free 1)

    * Public
    * 0.0055 per 1 NFT
    == mint 1, mint 2 , -- mint 10

*/

pragma solidity ^0.8.0;

import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./ERC721A.sol";
import "./MerkleProof.sol";
import "./ERC721AQueryable.sol";
import "./ERC721ABurnable.sol";

contract NFT is Ownable, ERC721A, ReentrancyGuard, ERC721AQueryable, ERC721ABurnable {

    event Received(address, uint);

    uint256 public collectionSize_ = 10000 ;

    uint256 public maxPerWallet = 10;

    uint256 public GoldPassFree = 3 ;
    uint256 public WhitelistFree = 1 ;

    uint256 public wlPrice = 0.0033 ether ;
    uint256 public publicPrice = 0.0055 ether ;

    bytes32 public WLroot ;
    bytes32 public GProot ;

    string private baseURI ;

    struct AddressDetail {
        uint256 BurnBalance ;  // data 0 
        uint256 BurnBalanceUsed ; // data 1
        uint256 GPBalance ; // Phase 1 // data 2  
        uint256 WLBalance ; // Phase 3 // data 3 
        uint256 PBBalance ; // Phase 5 // data 4
        uint256 WalletBalance ; // data 5

    }

    mapping(address => AddressDetail) public _addressDetail ;


    constructor() ERC721A("LISA EVO-X", "LISA") {
        
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
    _;
    }

//------------------ BaseURI 
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setBaseURI (string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

//--------------------- END BaseURI
//--------------------- Set & Change anythings
    
    function setCollectionSize (uint256 newCollectionSize) public onlyOwner {
        collectionSize_ = newCollectionSize ;
    }

    function setWLRoot (bytes32 newWLRoot) public onlyOwner {
        WLroot = newWLRoot ;
    }

    function setGPRoot (bytes32 newGPRoot) public onlyOwner {
        GProot = newGPRoot ;
    }

    function setWLMintPrice (uint256 newWlPrice) public onlyOwner {
        wlPrice = newWlPrice ;
    }

    function setPBMintPrice (uint256 newPublicPrice) public onlyOwner {
        publicPrice = newPublicPrice ;
    }

//--------------------- END Set & Change anythings
//--------------------------------------- Mint //////////////
//-------------------- DevMint
    function devMint(address _to ,uint256 _mintAmount) external onlyOwner {

        require(totalSupply() + _mintAmount <= collectionSize_ , "You can't mint more than collection size");

        _safeMint( _to,_mintAmount);
    }
//-------------------- END DevMint
//-------------------- GoldpassMint

    function mintGoldpass(uint256 _mintAmount , bytes32[] memory _Proof) external payable {

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_Proof, GProot, leaf),
            "You're not GoldPass Holder"
        );

        require(totalSupply() + _mintAmount <= collectionSize_, "Purchase would exceed max tokens");
        
        require(_addressDetail[msg.sender].WalletBalance + _mintAmount <= maxPerWallet, "reached max per wallet."); // Can't mint more than maxPerWallet

        // จำนวนที่มิ้นไปแล้ว < มีน้อยกว่า < จำนวนที่ฟรี = แสดงว่า เหลือสิทธ์ฟรี
        if (_addressDetail[msg.sender].GPBalance < GoldPassFree ) {

            // สิทธ์ที่ฟรี เหลือเท่าไหร่
            uint256 freeRight = GoldPassFree - _addressDetail[msg.sender].GPBalance ;

            uint256 paidAmount ;
            // if - จำนวนที่จะมิ้น <= น้อยกว่า หรือเท่ากับ <= จำนวนที่ฟรี --> ให้มิ้นได้เลย
            if(_mintAmount <= freeRight) {

                paidAmount = 0 ;

            }
            // else -  จำนวนมิ้น > มากกว่า > จำนวนที่ฟรี --> ให้หาจำนวนที่ไม่ฟรี แล้วจ่าย
            else {

                paidAmount = _mintAmount - freeRight ;
            
            }


            require(wlPrice * paidAmount <= msg.value, "Ether value sent is not correct"); // จ่ายเท่าที่ต้องจ่าย

            _safeMint(msg.sender, _mintAmount); // มิ้นเท่าจำนวนที่จะมิ้น
            _addressDetail[msg.sender].GPBalance += _mintAmount ;
            _addressDetail[msg.sender].WalletBalance += _mintAmount ;

        }
        // นอกจากนั้น คือ ถ้าไม่เหลือสิทธิ์ฟรี ||  จำนวนที่มิ้นไปแล้ว >= มีมากกว่ากว่า หรือ เท่ากับ >= จำนวนที่ฟรี = แสดงว่า ไม่เหลือสิทธ์ฟรี
        else {

            require(wlPrice * _mintAmount <= msg.value, "Ether value sent is not correct"); // จ่ายเท่าที่ต้องจ่าย
        
            _safeMint(msg.sender, _mintAmount); // มิ้นเท่าจำนวนที่จะมิ้น
            _addressDetail[msg.sender].GPBalance += _mintAmount ;
            _addressDetail[msg.sender].WalletBalance += _mintAmount ;

        }


    }

    function isValidGP(bytes32[] memory proof, address wallet) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(wallet));
        return MerkleProof.verify(proof, GProot, leaf);

    }

//-------------------- END GoldpassMint
//-------------------- WhitelistMint

    function mintWhiteList(uint256 _mintAmount , bytes32[] memory _Proof) external payable {

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_Proof, WLroot, leaf),
            "You're not whitelist."
        );
        
        require(totalSupply() + _mintAmount <= collectionSize_, "Purchase would exceed max tokens");

        require(_addressDetail[msg.sender].WalletBalance + _mintAmount <= maxPerWallet, "reached max per wallet."); // Can't mint more than maxPerWallet

            // จำนวนที่มิ้นไปแล้ว < มีน้อยกว่า < จำนวนที่ฟรี = แสดงว่า เหลือสิทธ์ฟรี
            if (_addressDetail[msg.sender].WLBalance < WhitelistFree ) {
                
                uint256 paidAmount ;

                // สิทธ์ที่ฟรี เหลือเท่าไหร่
                uint256 freeRight = WhitelistFree - _addressDetail[msg.sender].WLBalance ;

                // if - จำนวนที่จะมิ้น <= น้อยกว่า หรือเท่ากับ <= จำนวนที่ฟรี --> ให้มิ้นได้เลย
                if(_mintAmount <= freeRight) {

                    paidAmount = 0 ;

                }
                // else -  จำนวนมิ้น > มากกว่า > จำนวนที่ฟรี --> ให้หาจำนวนที่ไม่ฟรี แล้วจ่าย
                else {

                    paidAmount = _mintAmount - freeRight ;
                
                }

                require(wlPrice * paidAmount <= msg.value, "Ether value sent is not correct"); // จ่ายเท่าที่ต้องจ่าย

                _safeMint(msg.sender, _mintAmount); // มิ้นเท่าจำนวนที่จะมิ้น
                _addressDetail[msg.sender].WLBalance += _mintAmount ;
                _addressDetail[msg.sender].WalletBalance += _mintAmount ;

            }
            // นอกจากนั้น คือ ถ้าไม่เหลือสิทธิ์ฟรี || จำนวนที่มิ้นไปแล้ว >= มีมากกว่ากว่า หรือ เท่ากับ >= จำนวนที่ฟรี = แสดงว่า ไม่เหลือสิทธ์ฟรี
            else {

                require(wlPrice * _mintAmount <= msg.value, "Ether value sent is not correct"); // จ่ายเท่าที่ต้องจ่าย
            
                _safeMint(msg.sender, _mintAmount); // มิ้นเท่าจำนวนที่จะมิ้น
                _addressDetail[msg.sender].WLBalance += _mintAmount ;
                _addressDetail[msg.sender].WalletBalance += _mintAmount ;


            }


    }

    function isValidWL(bytes32[] memory proof, address wallet) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(wallet));
        return MerkleProof.verify(proof, WLroot, leaf);

    }

//-------------------- END WhitelistMint
//-------------------- PublicMint
    function publicMint(uint256 _mintAmount) external payable callerIsUser {

        require(totalSupply() + _mintAmount <= collectionSize_  , "reached max supply"); // must less than collction size
        
        require(_addressDetail[msg.sender].WalletBalance + _mintAmount <= maxPerWallet, "reached max per wallet."); // Can't mint more than maxPerWallet
        
        require(msg.value >= publicPrice * _mintAmount, "ETH amount is not sufficient");

        _safeMint(msg.sender, _mintAmount);
        _addressDetail[msg.sender].PBBalance += _mintAmount ;
        _addressDetail[msg.sender].WalletBalance += _mintAmount ;
    }

    function numberMinted(address owner) public view returns (uint256) { // check number Minted of that address จำนวนที่มิ้นไปแล้ว ใน address นั้น
        return _numberMinted(owner);
    }
//-------------------- END PublicMint
//--------------------------------------------- END Mint //////////////
//------------------------- Withdraw Money

        address private wallet1 = 0x7884A13d537D281568Ad7e9b9821b745eB8f1EDa; // K.Fulls
        address private wallet2 = 0x4B0A54D5529D34352048022a6e67BB6a26d91A7A; // K.Kayy
        address private wallet3 = 0x977EE6f3C17ECB90Ac5504ad92240D40a33ba129; // K.Chris
        address private wallet4 = 0x5350303b367FeA34bFb85Fd0da683eA9D8Ebd550; // VAULT

    function withdrawMoney() external payable nonReentrant { 

        uint256 _paytoW1 = address(this).balance*20/100 ; // K.Fulls
        uint256 _paytoW2 = address(this).balance*20/100 ; // K.Kayy
        uint256 _paytoW3 = address(this).balance*20/100 ; // K.Chris
        uint256 _paytoW4 = address(this).balance*40/100 ; // VAULT

        require(address(this).balance > 0, "No ETH left");

        require(payable(wallet1).send(_paytoW1));
        require(payable(wallet2).send(_paytoW2));
        require(payable(wallet3).send(_paytoW3));
        require(payable(wallet4).send(_paytoW4));

    }
//------------------------- END Withdraw Money

//-------------------- START Fallback Receive Ether Function
    receive() external payable {
            emit Received(msg.sender, msg.value);
    }
//-------------------- END Fallback Receive Ether Function

}

File 1 of 11: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 2 of 11: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If not burned.
            if (packed & _BITMASK_BURNED == 0) {
                // If the data at the starting slot does not exist, start the scan.
                if (packed == 0) {
                    if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken();
                    // Invariant:
                    // There will always be an initialized ownership slot
                    // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                    // before an unintialized ownership slot
                    // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                    // Hence, `tokenId` will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed will be zero.
                    for (;;) {
                        unchecked {
                            packed = _packedOwnerships[--tokenId];
                        }
                        if (packed == 0) continue;
                        return packed;
                    }
                }
                // Otherwise, the data exists and is not burned. We can skip the scan.
                // This is possible because we have already achieved the target condition.
                // This saves 2143 gas on transfers of initialized tokens.
                return packed;
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 {}

    /**
     * @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 {}

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                       APPROVAL OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_approve(to, tokenId, false)`.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _approve(to, tokenId, false);
    }

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

        if (approvalCheck)
            if (_msgSenderERC721A() != owner)
                if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                    revert ApprovalCallerNotOwnerNorApproved();
                }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev 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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 3 of 11: ERC721ABurnable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721ABurnable.sol";
import "./ERC721A.sol";

/**
 * @title ERC721ABurnable.
 *
 * @dev ERC721A token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

File 4 of 11: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721AQueryable.sol";
import "./ERC721A.sol";

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 5 of 11: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

    /**
     * @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 payable;

    /**
     * @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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @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);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 6 of 11: IERC721ABurnable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721A.sol";

/**
 * @dev Interface of ERC721ABurnable.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

File 7 of 11: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import "./IERC721A.sol";

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 8 of 11: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] calldata leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] calldata leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 10 of 11: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 11: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 make 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;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GProot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GoldPassFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelistFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_addressDetail","outputs":[{"internalType":"uint256","name":"BurnBalance","type":"uint256"},{"internalType":"uint256","name":"BurnBalanceUsed","type":"uint256"},{"internalType":"uint256","name":"GPBalance","type":"uint256"},{"internalType":"uint256","name":"WLBalance","type":"uint256"},{"internalType":"uint256","name":"PBBalance","type":"uint256"},{"internalType":"uint256","name":"WalletBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"wallet","type":"address"}],"name":"isValidGP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"address","name":"wallet","type":"address"}],"name":"isValidWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"mintGoldpass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"mintWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCollectionSize","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newGPRoot","type":"bytes32"}],"name":"setGPRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPublicPrice","type":"uint256"}],"name":"setPBMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWlPrice","type":"uint256"}],"name":"setWLMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWLRoot","type":"bytes32"}],"name":"setWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052612710600a55600a600b556003600c556001600d55660bb9551fc24000600e5566138a388a43c000600f55737884a13d537d281568ad7e9b9821b745eb8f1eda601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734b0a54d5529d34352048022a6e67bb6a26d91a7a601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073977ee6f3c17ecb90ac5504ad92240d40a33ba129601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735350303b367fea34bfb85fd0da683ea9d8ebd550601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200019057600080fd5b506040518060400160405280600a81526020017f4c4953412045564f2d58000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c495341000000000000000000000000000000000000000000000000000000008152506200021d620002116200026760201b60201c565b6200026f60201b60201c565b81600390816200022e9190620005b2565b508060049081620002409190620005b2565b50620002516200033360201b60201c565b6001819055505050600160098190555062000699565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ba57607f821691505b602082108103620003d057620003cf62000372565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200043a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003fb565b620004468683620003fb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004936200048d62000487846200045e565b62000468565b6200045e565b9050919050565b6000819050919050565b620004af8362000472565b620004c7620004be826200049a565b84845462000408565b825550505050565b600090565b620004de620004cf565b620004eb818484620004a4565b505050565b5b81811015620005135762000507600082620004d4565b600181019050620004f1565b5050565b601f82111562000562576200052c81620003d6565b6200053784620003eb565b8101602085101562000547578190505b6200055f6200055685620003eb565b830182620004f0565b50505b505050565b600082821c905092915050565b6000620005876000198460080262000567565b1980831691505092915050565b6000620005a2838362000574565b9150826002028217905092915050565b620005bd8262000338565b67ffffffffffffffff811115620005d957620005d862000343565b5b620005e58254620003a1565b620005f282828562000517565b600060209050601f8311600181146200062a576000841562000615578287015190505b62000621858262000594565b86555062000691565b601f1984166200063a86620003d6565b60005b8281101562000664578489015182556001820191506020850194506020810190506200063d565b8683101562000684578489015162000680601f89168262000574565b8355505b6001600288020188555050505b505050505050565b61536e80620006a96000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063aca8ffe7116100c1578063c87b56dd1161007a578063c87b56dd14610965578063d50f0715146109a2578063dc33e681146109cd578063e1e62b0214610a0a578063e985e9c514610a33578063f2fde38b14610a70576102b6565b8063aca8ffe714610864578063b11c7f821461088d578063b88d4fde146108b6578063b9c08ac8146108d2578063c23dc68f146108fd578063c7f8d01a1461093a576102b6565b806395d89b411161011357806395d89b411461075c57806399a2557a14610787578063a06c03ec146107c4578063a22cb46514610806578063a945bf801461082f578063ac4460021461085a576102b6565b806370a0823114610677578063715018a6146106b4578063828298a5146106cb5780638462151c146106f45780638da5cb5b14610731576102b6565b80633ffde173116101e85780634d626710116101ac5780634d6267101461055257806355f804b31461056e5780635bbb21771461059757806360e04aa4146105d4578063627804af146106115780636352211e1461063a576102b6565b80633ffde1731461049b57806342842e0e146104c657806342966c68146104e2578063453c23101461050b5780634d10b54614610536576102b6565b806318160ddd1161023a57806318160ddd146103b957806323a47023146103e457806323b872dd1461040f5780632b7f2f771461042b5780632c55d823146104545780632db115441461047f576102b6565b806301ffc9a7146102bb57806306fdde03146102f8578063081812fc14610323578063095ea7b31461036057806312025e591461037c576102b6565b366102b6577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516102ac929190613a8b565b60405180910390a1005b600080fd5b3480156102c757600080fd5b506102e260048036038101906102dd9190613b20565b610a99565b6040516102ef9190613b68565b60405180910390f35b34801561030457600080fd5b5061030d610b2b565b60405161031a9190613c13565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613c61565b610bbd565b6040516103579190613c8e565b60405180910390f35b61037a60048036038101906103759190613cd5565b610c3c565b005b34801561038857600080fd5b506103a3600480360381019061039e9190613e93565b610c4c565b6040516103b09190613b68565b60405180910390f35b3480156103c557600080fd5b506103ce610c8e565b6040516103db9190613eef565b60405180910390f35b3480156103f057600080fd5b506103f9610ca5565b6040516104069190613eef565b60405180910390f35b61042960048036038101906104249190613f0a565b610cab565b005b34801561043757600080fd5b50610452600480360381019061044d9190613f5d565b610fcd565b005b34801561046057600080fd5b50610469611053565b6040516104769190613eef565b60405180910390f35b61049960048036038101906104949190613c61565b611059565b005b3480156104a757600080fd5b506104b06112bf565b6040516104bd9190613f99565b60405180910390f35b6104e060048036038101906104db9190613f0a565b6112c5565b005b3480156104ee57600080fd5b5061050960048036038101906105049190613c61565b6112e5565b005b34801561051757600080fd5b506105206112f3565b60405161052d9190613eef565b60405180910390f35b610550600480360381019061054b9190613fb4565b6112f9565b005b61056c60048036038101906105679190613fb4565b61173e565b005b34801561057a57600080fd5b50610595600480360381019061059091906140c5565b611b84565b005b3480156105a357600080fd5b506105be60048036038101906105b99190614169565b611c13565b6040516105cb9190614319565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613e93565b611cd6565b6040516106089190613b68565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613cd5565b611d18565b005b34801561064657600080fd5b50610661600480360381019061065c9190613c61565b611df9565b60405161066e9190613c8e565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061433b565b611e0b565b6040516106ab9190613eef565b60405180910390f35b3480156106c057600080fd5b506106c9611ec3565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613c61565b611f4b565b005b34801561070057600080fd5b5061071b6004803603810190610716919061433b565b611fd1565b6040516107289190614426565b60405180910390f35b34801561073d57600080fd5b50610746612114565b6040516107539190613c8e565b60405180910390f35b34801561076857600080fd5b5061077161213d565b60405161077e9190613c13565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a99190614448565b6121cf565b6040516107bb9190614426565b60405180910390f35b3480156107d057600080fd5b506107eb60048036038101906107e6919061433b565b6123db565b6040516107fd9695949392919061449b565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190614528565b612417565b005b34801561083b57600080fd5b50610844612522565b6040516108519190613eef565b60405180910390f35b610862612528565b005b34801561087057600080fd5b5061088b60048036038101906108869190613c61565b6127ba565b005b34801561089957600080fd5b506108b460048036038101906108af9190613f5d565b612840565b005b6108d060048036038101906108cb9190614609565b6128c6565b005b3480156108de57600080fd5b506108e7612939565b6040516108f49190613f99565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613c61565b61293f565b60405161093191906146e1565b60405180910390f35b34801561094657600080fd5b5061094f6129a9565b60405161095c9190613eef565b60405180910390f35b34801561097157600080fd5b5061098c60048036038101906109879190613c61565b6129af565b6040516109999190613c13565b60405180910390f35b3480156109ae57600080fd5b506109b7612a4d565b6040516109c49190613eef565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061433b565b612a53565b604051610a019190613eef565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613c61565b612a65565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a5591906146fc565b612aeb565b604051610a679190613b68565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a92919061433b565b612b7f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b245750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b3a9061476b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b669061476b565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b6000610bc882612c76565b610bfe576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c4882826001612cd5565b5050565b60008082604051602001610c6091906147e4565b604051602081830303815290604052805190602001209050610c858460105483612e21565b91505092915050565b6000610c98612e38565b6002546001540303905090565b600a5481565b6000610cb682612e3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d2984612f35565b91509150610d3f8187610d3a612f5c565b612f64565b610d8b57610d5486610d4f612f5c565b612aeb565b610d8a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610df1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfe8686866001612fa8565b8015610e0957600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ed785610eb3888887612fae565b7c020000000000000000000000000000000000000000000000000000000017612fd6565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f5d5760006001850190506000600560008381526020019081526020016000205403610f5b576001548114610f5a578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fc58686866001613001565b505050505050565b610fd5613007565b73ffffffffffffffffffffffffffffffffffffffff16610ff3612114565b73ffffffffffffffffffffffffffffffffffffffff1614611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110409061484b565b60405180910390fd5b8060118190555050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906148b7565b60405180910390fd5b600a54816110d3610c8e565b6110dd9190614906565b111561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590614986565b60405180910390fd5b600b5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461116f9190614906565b11156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a7906149f2565b60405180910390fd5b80600f546111be9190614a12565b341015611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790614aa0565b60405180910390fd5b61120a338261300f565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600082825461125c9190614906565b9250508190555080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008282546112b59190614906565b9250508190555050565b60105481565b6112e0838383604051806020016040528060008152506128c6565b505050565b6112f081600161302d565b50565b600b5481565b60003360405160200161130c91906147e4565b6040516020818303038152906040528051906020012090506113318260105483612e21565b611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790614b0c565b60405180910390fd5b600a548361137c610c8e565b6113869190614906565b11156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90614b78565b60405180910390fd5b600b5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501546114189190614906565b1115611459576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611450906149f2565b60405180910390fd5b600d54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154101561162c57600080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154600d546114f89190614b98565b905080851161150a5760009150611519565b80856115169190614b98565b91505b3482600e546115289190614a12565b1115611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090614c18565b60405180910390fd5b611573338661300f565b84601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546115c59190614906565b9250508190555084601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501600082825461161e9190614906565b925050819055505050611739565b3483600e5461163b9190614a12565b111561167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614c18565b60405180910390fd5b611686338461300f565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546116d89190614906565b9250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008282546117319190614906565b925050819055505b505050565b60003360405160200161175191906147e4565b6040516020818303038152906040528051906020012090506117768260115483612e21565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614c84565b60405180910390fd5b600a54836117c1610c8e565b6117cb9190614906565b111561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390614b78565b60405180910390fd5b600b5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461185d9190614906565b111561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906149f2565b60405180910390fd5b600c54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611a72576000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600c5461193c9190614b98565b90506000818511611950576000905061195f565b818561195c9190614b98565b90505b3481600e5461196e9190614a12565b11156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690614c18565b60405180910390fd5b6119b9338661300f565b84601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254611a0b9190614906565b9250508190555084601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005016000828254611a649190614906565b925050819055505050611b7f565b3483600e54611a819190614a12565b1115611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614c18565b60405180910390fd5b611acc338461300f565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254611b1e9190614906565b9250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005016000828254611b779190614906565b925050819055505b505050565b611b8c613007565b73ffffffffffffffffffffffffffffffffffffffff16611baa612114565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061484b565b60405180910390fd5b8060129081611c0f9190614e50565b5050565b6060600083839050905060008167ffffffffffffffff811115611c3957611c38613d1a565b5b604051908082528060200260200182016040528015611c7257816020015b611c5f6139e2565b815260200190600190039081611c575790505b50905060005b828114611cca57611ca1868683818110611c9557611c94614f22565b5b9050602002013561293f565b828281518110611cb457611cb3614f22565b5b6020026020010181905250806001019050611c78565b50809250505092915050565b60008082604051602001611cea91906147e4565b604051602081830303815290604052805190602001209050611d0f8460115483612e21565b91505092915050565b611d20613007565b73ffffffffffffffffffffffffffffffffffffffff16611d3e612114565b73ffffffffffffffffffffffffffffffffffffffff1614611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061484b565b60405180910390fd5b600a5481611da0610c8e565b611daa9190614906565b1115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614fc3565b60405180910390fd5b611df5828261300f565b5050565b6000611e0482612e3d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e72576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611ecb613007565b73ffffffffffffffffffffffffffffffffffffffff16611ee9612114565b73ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061484b565b60405180910390fd5b611f49600061327f565b565b611f53613007565b73ffffffffffffffffffffffffffffffffffffffff16611f71612114565b73ffffffffffffffffffffffffffffffffffffffff1614611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe9061484b565b60405180910390fd5b80600f8190555050565b60606000806000611fe185611e0b565b905060008167ffffffffffffffff811115611fff57611ffe613d1a565b5b60405190808252806020026020018201604052801561202d5781602001602082028036833780820191505090505b5090506120386139e2565b6000612042612e38565b90505b8386146121065761205581613343565b915081604001516120fb57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120a057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120fa57808387806001019850815181106120ed576120ec614f22565b5b6020026020010181815250505b5b806001019050612045565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461214c9061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061476b565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b5050505050905090565b606081831061220a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061221561336e565b905061221f612e38565b8510156122315761222e612e38565b94505b8084111561223d578093505b600061224887611e0b565b90508486101561226b576000868603905081811015612265578091505b50612270565b600090505b60008167ffffffffffffffff81111561228c5761228b613d1a565b5b6040519080825280602002602001820160405280156122ba5781602001602082028036833780820191505090505b509050600082036122d157809450505050506123d4565b60006122dc8861293f565b9050600081604001516122f157816000015190505b60008990505b8881141580156123075750848714155b156123c65761231581613343565b925082604001516123bb57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ba57808488806001019950815181106123ad576123ac614f22565b5b6020026020010181815250505b5b8060010190506122f7565b508583528296505050505050505b9392505050565b60136020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b8060086000612424612f5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124d1612f5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125169190613b68565b60405180910390a35050565b600f5481565b60026009540361256d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125649061502f565b60405180910390fd5b6002600981905550600060646014476125869190614a12565b612590919061507e565b9050600060646014476125a39190614a12565b6125ad919061507e565b9050600060646014476125c09190614a12565b6125ca919061507e565b9050600060646028476125dd9190614a12565b6125e7919061507e565b90506000471161262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906150fb565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061268c57600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050506126ec57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061274c57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506127ac57600080fd5b505050506001600981905550565b6127c2613007565b73ffffffffffffffffffffffffffffffffffffffff166127e0612114565b73ffffffffffffffffffffffffffffffffffffffff1614612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d9061484b565b60405180910390fd5b80600a8190555050565b612848613007565b73ffffffffffffffffffffffffffffffffffffffff16612866612114565b73ffffffffffffffffffffffffffffffffffffffff16146128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b39061484b565b60405180910390fd5b8060108190555050565b6128d1848484610cab565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612933576128fc84848484613378565b612932576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b6129476139e2565b61294f6139e2565b612957612e38565b83108061296b575061296761336e565b8310155b1561297957809150506129a4565b61298283613343565b905080604001511561299757809150506129a4565b6129a0836134c8565b9150505b919050565b600e5481565b60606129ba82612c76565b6129f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129fa6134e8565b90506000815103612a1a5760405180602001604052806000815250612a45565b80612a248461357a565b604051602001612a35929190615157565b6040516020818303038152906040525b915050919050565b600d5481565b6000612a5e826135ca565b9050919050565b612a6d613007565b73ffffffffffffffffffffffffffffffffffffffff16612a8b612114565b73ffffffffffffffffffffffffffffffffffffffff1614612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad89061484b565b60405180910390fd5b80600e8190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b87613007565b73ffffffffffffffffffffffffffffffffffffffff16612ba5612114565b73ffffffffffffffffffffffffffffffffffffffff1614612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061484b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906151ed565b60405180910390fd5b612c738161327f565b50565b600081612c81612e38565b11158015612c90575060015482105b8015612cce575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000612ce083611df9565b90508115612d6b578073ffffffffffffffffffffffffffffffffffffffff16612d07612f5c565b73ffffffffffffffffffffffffffffffffffffffff1614612d6a57612d3381612d2e612f5c565b612aeb565b612d69576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600082612e2e8584613621565b1490509392505050565b600090565b600081612e48612e38565b11612efe576005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612efd5760008103612ef8576001548210612ecd576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600560008360019003935083815260200190815260200160002054905060008103612f3057612ece565b612f30565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fc5868684613677565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b613029828260405180602001604052806000815250613680565b5050565b600061303883612e3d565b9050600081905060008061304b86612f35565b9150915084156130b4576130678184613062612f5c565b612f64565b6130b35761307c83613077612f5c565b612aeb565b6130b2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6130c2836000886001612fa8565b80156130cd57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131758361313285600088612fae565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612fd6565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036131fb57600060018701905060006005600083815260200190815260200160002054036131f95760015481146131f8578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613265836000886001613001565b600260008154809291906001019190505550505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61334b6139e2565b613367600560008481526020019081526020016000205461371e565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261339e612f5c565b8786866040518563ffffffff1660e01b81526004016133c09493929190615262565b6020604051808303816000875af19250505080156133fc57506040513d601f19601f820116820180604052508101906133f991906152c3565b60015b613475573d806000811461342c576040519150601f19603f3d011682016040523d82523d6000602084013e613431565b606091505b50600081510361346d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6134d06139e2565b6134e16134dc83612e3d565b61371e565b9050919050565b6060601280546134f79061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546135239061476b565b80156135705780601f1061354557610100808354040283529160200191613570565b820191906000526020600020905b81548152906001019060200180831161355357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156135b557600184039350600a81066030018453600a8104905080613593575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008082905060005b845181101561366c576136578286838151811061364a57613649614f22565b5b60200260200101516137d4565b91508080613664906152f0565b91505061362a565b508091505092915050565b60009392505050565b61368a83836137ff565b60008373ffffffffffffffffffffffffffffffffffffffff163b146137195760006001549050600083820390505b6136cb6000868380600101945086613378565b613701576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136b857816001541461371657600080fd5b50505b505050565b6137266139e2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008183106137ec576137e782846139bb565b6137f7565b6137f683836139bb565b5b905092915050565b6000600154905060008203613840576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61384d6000848385612fa8565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506138c4836138b56000866000612fae565b6138be856139d2565b17612fd6565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461396557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061392a565b50600082036139a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506139b66000848385613001565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5c82613a31565b9050919050565b613a6c81613a51565b82525050565b6000819050919050565b613a8581613a72565b82525050565b6000604082019050613aa06000830185613a63565b613aad6020830184613a7c565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613afd81613ac8565b8114613b0857600080fd5b50565b600081359050613b1a81613af4565b92915050565b600060208284031215613b3657613b35613abe565b5b6000613b4484828501613b0b565b91505092915050565b60008115159050919050565b613b6281613b4d565b82525050565b6000602082019050613b7d6000830184613b59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bbd578082015181840152602081019050613ba2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613be582613b83565b613bef8185613b8e565b9350613bff818560208601613b9f565b613c0881613bc9565b840191505092915050565b60006020820190508181036000830152613c2d8184613bda565b905092915050565b613c3e81613a72565b8114613c4957600080fd5b50565b600081359050613c5b81613c35565b92915050565b600060208284031215613c7757613c76613abe565b5b6000613c8584828501613c4c565b91505092915050565b6000602082019050613ca36000830184613a63565b92915050565b613cb281613a51565b8114613cbd57600080fd5b50565b600081359050613ccf81613ca9565b92915050565b60008060408385031215613cec57613ceb613abe565b5b6000613cfa85828601613cc0565b9250506020613d0b85828601613c4c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5282613bc9565b810181811067ffffffffffffffff82111715613d7157613d70613d1a565b5b80604052505050565b6000613d84613ab4565b9050613d908282613d49565b919050565b600067ffffffffffffffff821115613db057613daf613d1a565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613dd981613dc6565b8114613de457600080fd5b50565b600081359050613df681613dd0565b92915050565b6000613e0f613e0a84613d95565b613d7a565b90508083825260208201905060208402830185811115613e3257613e31613dc1565b5b835b81811015613e5b5780613e478882613de7565b845260208401935050602081019050613e34565b5050509392505050565b600082601f830112613e7a57613e79613d15565b5b8135613e8a848260208601613dfc565b91505092915050565b60008060408385031215613eaa57613ea9613abe565b5b600083013567ffffffffffffffff811115613ec857613ec7613ac3565b5b613ed485828601613e65565b9250506020613ee585828601613cc0565b9150509250929050565b6000602082019050613f046000830184613a7c565b92915050565b600080600060608486031215613f2357613f22613abe565b5b6000613f3186828701613cc0565b9350506020613f4286828701613cc0565b9250506040613f5386828701613c4c565b9150509250925092565b600060208284031215613f7357613f72613abe565b5b6000613f8184828501613de7565b91505092915050565b613f9381613dc6565b82525050565b6000602082019050613fae6000830184613f8a565b92915050565b60008060408385031215613fcb57613fca613abe565b5b6000613fd985828601613c4c565b925050602083013567ffffffffffffffff811115613ffa57613ff9613ac3565b5b61400685828601613e65565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156140305761402f613d1a565b5b61403982613bc9565b9050602081019050919050565b82818337600083830152505050565b600061406861406384614015565b613d7a565b90508281526020810184848401111561408457614083614010565b5b61408f848285614046565b509392505050565b600082601f8301126140ac576140ab613d15565b5b81356140bc848260208601614055565b91505092915050565b6000602082840312156140db576140da613abe565b5b600082013567ffffffffffffffff8111156140f9576140f8613ac3565b5b61410584828501614097565b91505092915050565b600080fd5b60008083601f84011261412957614128613d15565b5b8235905067ffffffffffffffff8111156141465761414561410e565b5b60208301915083602082028301111561416257614161613dc1565b5b9250929050565b600080602083850312156141805761417f613abe565b5b600083013567ffffffffffffffff81111561419e5761419d613ac3565b5b6141aa85828601614113565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141eb81613a51565b82525050565b600067ffffffffffffffff82169050919050565b61420e816141f1565b82525050565b61421d81613b4d565b82525050565b600062ffffff82169050919050565b61423b81614223565b82525050565b60808201600082015161425760008501826141e2565b50602082015161426a6020850182614205565b50604082015161427d6040850182614214565b5060608201516142906060850182614232565b50505050565b60006142a28383614241565b60808301905092915050565b6000602082019050919050565b60006142c6826141b6565b6142d081856141c1565b93506142db836141d2565b8060005b8381101561430c5781516142f38882614296565b97506142fe836142ae565b9250506001810190506142df565b5085935050505092915050565b6000602082019050818103600083015261433381846142bb565b905092915050565b60006020828403121561435157614350613abe565b5b600061435f84828501613cc0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61439d81613a72565b82525050565b60006143af8383614394565b60208301905092915050565b6000602082019050919050565b60006143d382614368565b6143dd8185614373565b93506143e883614384565b8060005b8381101561441957815161440088826143a3565b975061440b836143bb565b9250506001810190506143ec565b5085935050505092915050565b6000602082019050818103600083015261444081846143c8565b905092915050565b60008060006060848603121561446157614460613abe565b5b600061446f86828701613cc0565b935050602061448086828701613c4c565b925050604061449186828701613c4c565b9150509250925092565b600060c0820190506144b06000830189613a7c565b6144bd6020830188613a7c565b6144ca6040830187613a7c565b6144d76060830186613a7c565b6144e46080830185613a7c565b6144f160a0830184613a7c565b979650505050505050565b61450581613b4d565b811461451057600080fd5b50565b600081359050614522816144fc565b92915050565b6000806040838503121561453f5761453e613abe565b5b600061454d85828601613cc0565b925050602061455e85828601614513565b9150509250929050565b600067ffffffffffffffff82111561458357614582613d1a565b5b61458c82613bc9565b9050602081019050919050565b60006145ac6145a784614568565b613d7a565b9050828152602081018484840111156145c8576145c7614010565b5b6145d3848285614046565b509392505050565b600082601f8301126145f0576145ef613d15565b5b8135614600848260208601614599565b91505092915050565b6000806000806080858703121561462357614622613abe565b5b600061463187828801613cc0565b945050602061464287828801613cc0565b935050604061465387828801613c4c565b925050606085013567ffffffffffffffff81111561467457614673613ac3565b5b614680878288016145db565b91505092959194509250565b6080820160008201516146a260008501826141e2565b5060208201516146b56020850182614205565b5060408201516146c86040850182614214565b5060608201516146db6060850182614232565b50505050565b60006080820190506146f6600083018461468c565b92915050565b6000806040838503121561471357614712613abe565b5b600061472185828601613cc0565b925050602061473285828601613cc0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478357607f821691505b6020821081036147965761479561473c565b5b50919050565b60008160601b9050919050565b60006147b48261479c565b9050919050565b60006147c6826147a9565b9050919050565b6147de6147d982613a51565b6147bb565b82525050565b60006147f082846147cd565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614835602083613b8e565b9150614840826147ff565b602082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006148a1601e83613b8e565b91506148ac8261486b565b602082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061491182613a72565b915061491c83613a72565b9250828201905080821115614934576149336148d7565b5b92915050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614970601283613b8e565b915061497b8261493a565b602082019050919050565b6000602082019050818103600083015261499f81614963565b9050919050565b7f72656163686564206d6178207065722077616c6c65742e000000000000000000600082015250565b60006149dc601783613b8e565b91506149e7826149a6565b602082019050919050565b60006020820190508181036000830152614a0b816149cf565b9050919050565b6000614a1d82613a72565b9150614a2883613a72565b9250828202614a3681613a72565b91508282048414831517614a4d57614a4c6148d7565b5b5092915050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b6000614a8a601c83613b8e565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f596f75277265206e6f742077686974656c6973742e0000000000000000000000600082015250565b6000614af6601583613b8e565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614b62602083613b8e565b9150614b6d82614b2c565b602082019050919050565b60006020820190508181036000830152614b9181614b55565b9050919050565b6000614ba382613a72565b9150614bae83613a72565b9250828203905081811115614bc657614bc56148d7565b5b92915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614c02601f83613b8e565b9150614c0d82614bcc565b602082019050919050565b60006020820190508181036000830152614c3181614bf5565b9050919050565b7f596f75277265206e6f7420476f6c645061737320486f6c646572000000000000600082015250565b6000614c6e601a83613b8e565b9150614c7982614c38565b602082019050919050565b60006020820190508181036000830152614c9d81614c61565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614cc9565b614d108683614cc9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614d4d614d48614d4384613a72565b614d28565b613a72565b9050919050565b6000819050919050565b614d6783614d32565b614d7b614d7382614d54565b848454614cd6565b825550505050565b600090565b614d90614d83565b614d9b818484614d5e565b505050565b5b81811015614dbf57614db4600082614d88565b600181019050614da1565b5050565b601f821115614e0457614dd581614ca4565b614dde84614cb9565b81016020851015614ded578190505b614e01614df985614cb9565b830182614da0565b50505b505050565b600082821c905092915050565b6000614e2760001984600802614e09565b1980831691505092915050565b6000614e408383614e16565b9150826002028217905092915050565b614e5982613b83565b67ffffffffffffffff811115614e7257614e71613d1a565b5b614e7c825461476b565b614e87828285614dc3565b600060209050601f831160018114614eba5760008415614ea8578287015190505b614eb28582614e34565b865550614f1a565b601f198416614ec886614ca4565b60005b82811015614ef057848901518255600182019150602085019450602081019050614ecb565b86831015614f0d5784890151614f09601f891682614e16565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b6000614fad602883613b8e565b9150614fb882614f51565b604082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615019601f83613b8e565b915061502482614fe3565b602082019050919050565b600060208201905081810360008301526150488161500c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061508982613a72565b915061509483613a72565b9250826150a4576150a361504f565b5b828204905092915050565b7f4e6f20455448206c656674000000000000000000000000000000000000000000600082015250565b60006150e5600b83613b8e565b91506150f0826150af565b602082019050919050565b60006020820190508181036000830152615114816150d8565b9050919050565b600081905092915050565b600061513182613b83565b61513b818561511b565b935061514b818560208601613b9f565b80840191505092915050565b60006151638285615126565b915061516f8284615126565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151d7602683613b8e565b91506151e28261517b565b604082019050919050565b60006020820190508181036000830152615206816151ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152348261520d565b61523e8185615218565b935061524e818560208601613b9f565b61525781613bc9565b840191505092915050565b60006080820190506152776000830187613a63565b6152846020830186613a63565b6152916040830185613a7c565b81810360608301526152a38184615229565b905095945050505050565b6000815190506152bd81613af4565b92915050565b6000602082840312156152d9576152d8613abe565b5b60006152e7848285016152ae565b91505092915050565b60006152fb82613a72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361532d5761532c6148d7565b5b60018201905091905056fea2646970667358221220324637c96e95dc27ba8df438f1c29d2379f29a7ad65886dfc09d0c4c0f2d08e764736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063aca8ffe7116100c1578063c87b56dd1161007a578063c87b56dd14610965578063d50f0715146109a2578063dc33e681146109cd578063e1e62b0214610a0a578063e985e9c514610a33578063f2fde38b14610a70576102b6565b8063aca8ffe714610864578063b11c7f821461088d578063b88d4fde146108b6578063b9c08ac8146108d2578063c23dc68f146108fd578063c7f8d01a1461093a576102b6565b806395d89b411161011357806395d89b411461075c57806399a2557a14610787578063a06c03ec146107c4578063a22cb46514610806578063a945bf801461082f578063ac4460021461085a576102b6565b806370a0823114610677578063715018a6146106b4578063828298a5146106cb5780638462151c146106f45780638da5cb5b14610731576102b6565b80633ffde173116101e85780634d626710116101ac5780634d6267101461055257806355f804b31461056e5780635bbb21771461059757806360e04aa4146105d4578063627804af146106115780636352211e1461063a576102b6565b80633ffde1731461049b57806342842e0e146104c657806342966c68146104e2578063453c23101461050b5780634d10b54614610536576102b6565b806318160ddd1161023a57806318160ddd146103b957806323a47023146103e457806323b872dd1461040f5780632b7f2f771461042b5780632c55d823146104545780632db115441461047f576102b6565b806301ffc9a7146102bb57806306fdde03146102f8578063081812fc14610323578063095ea7b31461036057806312025e591461037c576102b6565b366102b6577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516102ac929190613a8b565b60405180910390a1005b600080fd5b3480156102c757600080fd5b506102e260048036038101906102dd9190613b20565b610a99565b6040516102ef9190613b68565b60405180910390f35b34801561030457600080fd5b5061030d610b2b565b60405161031a9190613c13565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613c61565b610bbd565b6040516103579190613c8e565b60405180910390f35b61037a60048036038101906103759190613cd5565b610c3c565b005b34801561038857600080fd5b506103a3600480360381019061039e9190613e93565b610c4c565b6040516103b09190613b68565b60405180910390f35b3480156103c557600080fd5b506103ce610c8e565b6040516103db9190613eef565b60405180910390f35b3480156103f057600080fd5b506103f9610ca5565b6040516104069190613eef565b60405180910390f35b61042960048036038101906104249190613f0a565b610cab565b005b34801561043757600080fd5b50610452600480360381019061044d9190613f5d565b610fcd565b005b34801561046057600080fd5b50610469611053565b6040516104769190613eef565b60405180910390f35b61049960048036038101906104949190613c61565b611059565b005b3480156104a757600080fd5b506104b06112bf565b6040516104bd9190613f99565b60405180910390f35b6104e060048036038101906104db9190613f0a565b6112c5565b005b3480156104ee57600080fd5b5061050960048036038101906105049190613c61565b6112e5565b005b34801561051757600080fd5b506105206112f3565b60405161052d9190613eef565b60405180910390f35b610550600480360381019061054b9190613fb4565b6112f9565b005b61056c60048036038101906105679190613fb4565b61173e565b005b34801561057a57600080fd5b50610595600480360381019061059091906140c5565b611b84565b005b3480156105a357600080fd5b506105be60048036038101906105b99190614169565b611c13565b6040516105cb9190614319565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190613e93565b611cd6565b6040516106089190613b68565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613cd5565b611d18565b005b34801561064657600080fd5b50610661600480360381019061065c9190613c61565b611df9565b60405161066e9190613c8e565b60405180910390f35b34801561068357600080fd5b5061069e6004803603810190610699919061433b565b611e0b565b6040516106ab9190613eef565b60405180910390f35b3480156106c057600080fd5b506106c9611ec3565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613c61565b611f4b565b005b34801561070057600080fd5b5061071b6004803603810190610716919061433b565b611fd1565b6040516107289190614426565b60405180910390f35b34801561073d57600080fd5b50610746612114565b6040516107539190613c8e565b60405180910390f35b34801561076857600080fd5b5061077161213d565b60405161077e9190613c13565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a99190614448565b6121cf565b6040516107bb9190614426565b60405180910390f35b3480156107d057600080fd5b506107eb60048036038101906107e6919061433b565b6123db565b6040516107fd9695949392919061449b565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190614528565b612417565b005b34801561083b57600080fd5b50610844612522565b6040516108519190613eef565b60405180910390f35b610862612528565b005b34801561087057600080fd5b5061088b60048036038101906108869190613c61565b6127ba565b005b34801561089957600080fd5b506108b460048036038101906108af9190613f5d565b612840565b005b6108d060048036038101906108cb9190614609565b6128c6565b005b3480156108de57600080fd5b506108e7612939565b6040516108f49190613f99565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190613c61565b61293f565b60405161093191906146e1565b60405180910390f35b34801561094657600080fd5b5061094f6129a9565b60405161095c9190613eef565b60405180910390f35b34801561097157600080fd5b5061098c60048036038101906109879190613c61565b6129af565b6040516109999190613c13565b60405180910390f35b3480156109ae57600080fd5b506109b7612a4d565b6040516109c49190613eef565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061433b565b612a53565b604051610a019190613eef565b60405180910390f35b348015610a1657600080fd5b50610a316004803603810190610a2c9190613c61565b612a65565b005b348015610a3f57600080fd5b50610a5a6004803603810190610a5591906146fc565b612aeb565b604051610a679190613b68565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a92919061433b565b612b7f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b245750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b3a9061476b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b669061476b565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b6000610bc882612c76565b610bfe576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c4882826001612cd5565b5050565b60008082604051602001610c6091906147e4565b604051602081830303815290604052805190602001209050610c858460105483612e21565b91505092915050565b6000610c98612e38565b6002546001540303905090565b600a5481565b6000610cb682612e3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d2984612f35565b91509150610d3f8187610d3a612f5c565b612f64565b610d8b57610d5486610d4f612f5c565b612aeb565b610d8a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610df1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfe8686866001612fa8565b8015610e0957600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ed785610eb3888887612fae565b7c020000000000000000000000000000000000000000000000000000000017612fd6565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f5d5760006001850190506000600560008381526020019081526020016000205403610f5b576001548114610f5a578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fc58686866001613001565b505050505050565b610fd5613007565b73ffffffffffffffffffffffffffffffffffffffff16610ff3612114565b73ffffffffffffffffffffffffffffffffffffffff1614611049576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110409061484b565b60405180910390fd5b8060118190555050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be906148b7565b60405180910390fd5b600a54816110d3610c8e565b6110dd9190614906565b111561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590614986565b60405180910390fd5b600b5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461116f9190614906565b11156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a7906149f2565b60405180910390fd5b80600f546111be9190614a12565b341015611200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f790614aa0565b60405180910390fd5b61120a338261300f565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401600082825461125c9190614906565b9250508190555080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008282546112b59190614906565b9250508190555050565b60105481565b6112e0838383604051806020016040528060008152506128c6565b505050565b6112f081600161302d565b50565b600b5481565b60003360405160200161130c91906147e4565b6040516020818303038152906040528051906020012090506113318260105483612e21565b611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136790614b0c565b60405180910390fd5b600a548361137c610c8e565b6113869190614906565b11156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90614b78565b60405180910390fd5b600b5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501546114189190614906565b1115611459576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611450906149f2565b60405180910390fd5b600d54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154101561162c57600080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154600d546114f89190614b98565b905080851161150a5760009150611519565b80856115169190614b98565b91505b3482600e546115289190614a12565b1115611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090614c18565b60405180910390fd5b611573338661300f565b84601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546115c59190614906565b9250508190555084601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501600082825461161e9190614906565b925050819055505050611739565b3483600e5461163b9190614a12565b111561167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614c18565b60405180910390fd5b611686338461300f565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008282546116d89190614906565b9250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008282546117319190614906565b925050819055505b505050565b60003360405160200161175191906147e4565b6040516020818303038152906040528051906020012090506117768260115483612e21565b6117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac90614c84565b60405180910390fd5b600a54836117c1610c8e565b6117cb9190614906565b111561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390614b78565b60405180910390fd5b600b5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461185d9190614906565b111561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906149f2565b60405180910390fd5b600c54601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611a72576000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154600c5461193c9190614b98565b90506000818511611950576000905061195f565b818561195c9190614b98565b90505b3481600e5461196e9190614a12565b11156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690614c18565b60405180910390fd5b6119b9338661300f565b84601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254611a0b9190614906565b9250508190555084601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005016000828254611a649190614906565b925050819055505050611b7f565b3483600e54611a819190614a12565b1115611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990614c18565b60405180910390fd5b611acc338461300f565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254611b1e9190614906565b9250508190555082601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005016000828254611b779190614906565b925050819055505b505050565b611b8c613007565b73ffffffffffffffffffffffffffffffffffffffff16611baa612114565b73ffffffffffffffffffffffffffffffffffffffff1614611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf79061484b565b60405180910390fd5b8060129081611c0f9190614e50565b5050565b6060600083839050905060008167ffffffffffffffff811115611c3957611c38613d1a565b5b604051908082528060200260200182016040528015611c7257816020015b611c5f6139e2565b815260200190600190039081611c575790505b50905060005b828114611cca57611ca1868683818110611c9557611c94614f22565b5b9050602002013561293f565b828281518110611cb457611cb3614f22565b5b6020026020010181905250806001019050611c78565b50809250505092915050565b60008082604051602001611cea91906147e4565b604051602081830303815290604052805190602001209050611d0f8460115483612e21565b91505092915050565b611d20613007565b73ffffffffffffffffffffffffffffffffffffffff16611d3e612114565b73ffffffffffffffffffffffffffffffffffffffff1614611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b9061484b565b60405180910390fd5b600a5481611da0610c8e565b611daa9190614906565b1115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614fc3565b60405180910390fd5b611df5828261300f565b5050565b6000611e0482612e3d565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e72576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611ecb613007565b73ffffffffffffffffffffffffffffffffffffffff16611ee9612114565b73ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061484b565b60405180910390fd5b611f49600061327f565b565b611f53613007565b73ffffffffffffffffffffffffffffffffffffffff16611f71612114565b73ffffffffffffffffffffffffffffffffffffffff1614611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe9061484b565b60405180910390fd5b80600f8190555050565b60606000806000611fe185611e0b565b905060008167ffffffffffffffff811115611fff57611ffe613d1a565b5b60405190808252806020026020018201604052801561202d5781602001602082028036833780820191505090505b5090506120386139e2565b6000612042612e38565b90505b8386146121065761205581613343565b915081604001516120fb57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146120a057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036120fa57808387806001019850815181106120ed576120ec614f22565b5b6020026020010181815250505b5b806001019050612045565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461214c9061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546121789061476b565b80156121c55780601f1061219a576101008083540402835291602001916121c5565b820191906000526020600020905b8154815290600101906020018083116121a857829003601f168201915b5050505050905090565b606081831061220a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061221561336e565b905061221f612e38565b8510156122315761222e612e38565b94505b8084111561223d578093505b600061224887611e0b565b90508486101561226b576000868603905081811015612265578091505b50612270565b600090505b60008167ffffffffffffffff81111561228c5761228b613d1a565b5b6040519080825280602002602001820160405280156122ba5781602001602082028036833780820191505090505b509050600082036122d157809450505050506123d4565b60006122dc8861293f565b9050600081604001516122f157816000015190505b60008990505b8881141580156123075750848714155b156123c65761231581613343565b925082604001516123bb57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461236057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ba57808488806001019950815181106123ad576123ac614f22565b5b6020026020010181815250505b5b8060010190506122f7565b508583528296505050505050505b9392505050565b60136020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b8060086000612424612f5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166124d1612f5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125169190613b68565b60405180910390a35050565b600f5481565b60026009540361256d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125649061502f565b60405180910390fd5b6002600981905550600060646014476125869190614a12565b612590919061507e565b9050600060646014476125a39190614a12565b6125ad919061507e565b9050600060646014476125c09190614a12565b6125ca919061507e565b9050600060646028476125dd9190614a12565b6125e7919061507e565b90506000471161262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906150fb565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061268c57600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050506126ec57600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061274c57600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506127ac57600080fd5b505050506001600981905550565b6127c2613007565b73ffffffffffffffffffffffffffffffffffffffff166127e0612114565b73ffffffffffffffffffffffffffffffffffffffff1614612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d9061484b565b60405180910390fd5b80600a8190555050565b612848613007565b73ffffffffffffffffffffffffffffffffffffffff16612866612114565b73ffffffffffffffffffffffffffffffffffffffff16146128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b39061484b565b60405180910390fd5b8060108190555050565b6128d1848484610cab565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612933576128fc84848484613378565b612932576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b6129476139e2565b61294f6139e2565b612957612e38565b83108061296b575061296761336e565b8310155b1561297957809150506129a4565b61298283613343565b905080604001511561299757809150506129a4565b6129a0836134c8565b9150505b919050565b600e5481565b60606129ba82612c76565b6129f0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006129fa6134e8565b90506000815103612a1a5760405180602001604052806000815250612a45565b80612a248461357a565b604051602001612a35929190615157565b6040516020818303038152906040525b915050919050565b600d5481565b6000612a5e826135ca565b9050919050565b612a6d613007565b73ffffffffffffffffffffffffffffffffffffffff16612a8b612114565b73ffffffffffffffffffffffffffffffffffffffff1614612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad89061484b565b60405180910390fd5b80600e8190555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b87613007565b73ffffffffffffffffffffffffffffffffffffffff16612ba5612114565b73ffffffffffffffffffffffffffffffffffffffff1614612bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf29061484b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c61906151ed565b60405180910390fd5b612c738161327f565b50565b600081612c81612e38565b11158015612c90575060015482105b8015612cce575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b6000612ce083611df9565b90508115612d6b578073ffffffffffffffffffffffffffffffffffffffff16612d07612f5c565b73ffffffffffffffffffffffffffffffffffffffff1614612d6a57612d3381612d2e612f5c565b612aeb565b612d69576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600082612e2e8584613621565b1490509392505050565b600090565b600081612e48612e38565b11612efe576005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612efd5760008103612ef8576001548210612ecd576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600560008360019003935083815260200190815260200160002054905060008103612f3057612ece565b612f30565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612fc5868684613677565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b613029828260405180602001604052806000815250613680565b5050565b600061303883612e3d565b9050600081905060008061304b86612f35565b9150915084156130b4576130678184613062612f5c565b612f64565b6130b35761307c83613077612f5c565b612aeb565b6130b2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6130c2836000886001612fa8565b80156130cd57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131758361313285600088612fae565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612fd6565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036131fb57600060018701905060006005600083815260200190815260200160002054036131f95760015481146131f8578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613265836000886001613001565b600260008154809291906001019190505550505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61334b6139e2565b613367600560008481526020019081526020016000205461371e565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261339e612f5c565b8786866040518563ffffffff1660e01b81526004016133c09493929190615262565b6020604051808303816000875af19250505080156133fc57506040513d601f19601f820116820180604052508101906133f991906152c3565b60015b613475573d806000811461342c576040519150601f19603f3d011682016040523d82523d6000602084013e613431565b606091505b50600081510361346d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6134d06139e2565b6134e16134dc83612e3d565b61371e565b9050919050565b6060601280546134f79061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546135239061476b565b80156135705780601f1061354557610100808354040283529160200191613570565b820191906000526020600020905b81548152906001019060200180831161355357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156135b557600184039350600a81066030018453600a8104905080613593575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008082905060005b845181101561366c576136578286838151811061364a57613649614f22565b5b60200260200101516137d4565b91508080613664906152f0565b91505061362a565b508091505092915050565b60009392505050565b61368a83836137ff565b60008373ffffffffffffffffffffffffffffffffffffffff163b146137195760006001549050600083820390505b6136cb6000868380600101945086613378565b613701576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136b857816001541461371657600080fd5b50505b505050565b6137266139e2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008183106137ec576137e782846139bb565b6137f7565b6137f683836139bb565b5b905092915050565b6000600154905060008203613840576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61384d6000848385612fa8565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506138c4836138b56000866000612fae565b6138be856139d2565b17612fd6565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461396557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061392a565b50600082036139a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506139b66000848385613001565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5c82613a31565b9050919050565b613a6c81613a51565b82525050565b6000819050919050565b613a8581613a72565b82525050565b6000604082019050613aa06000830185613a63565b613aad6020830184613a7c565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613afd81613ac8565b8114613b0857600080fd5b50565b600081359050613b1a81613af4565b92915050565b600060208284031215613b3657613b35613abe565b5b6000613b4484828501613b0b565b91505092915050565b60008115159050919050565b613b6281613b4d565b82525050565b6000602082019050613b7d6000830184613b59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bbd578082015181840152602081019050613ba2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613be582613b83565b613bef8185613b8e565b9350613bff818560208601613b9f565b613c0881613bc9565b840191505092915050565b60006020820190508181036000830152613c2d8184613bda565b905092915050565b613c3e81613a72565b8114613c4957600080fd5b50565b600081359050613c5b81613c35565b92915050565b600060208284031215613c7757613c76613abe565b5b6000613c8584828501613c4c565b91505092915050565b6000602082019050613ca36000830184613a63565b92915050565b613cb281613a51565b8114613cbd57600080fd5b50565b600081359050613ccf81613ca9565b92915050565b60008060408385031215613cec57613ceb613abe565b5b6000613cfa85828601613cc0565b9250506020613d0b85828601613c4c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5282613bc9565b810181811067ffffffffffffffff82111715613d7157613d70613d1a565b5b80604052505050565b6000613d84613ab4565b9050613d908282613d49565b919050565b600067ffffffffffffffff821115613db057613daf613d1a565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613dd981613dc6565b8114613de457600080fd5b50565b600081359050613df681613dd0565b92915050565b6000613e0f613e0a84613d95565b613d7a565b90508083825260208201905060208402830185811115613e3257613e31613dc1565b5b835b81811015613e5b5780613e478882613de7565b845260208401935050602081019050613e34565b5050509392505050565b600082601f830112613e7a57613e79613d15565b5b8135613e8a848260208601613dfc565b91505092915050565b60008060408385031215613eaa57613ea9613abe565b5b600083013567ffffffffffffffff811115613ec857613ec7613ac3565b5b613ed485828601613e65565b9250506020613ee585828601613cc0565b9150509250929050565b6000602082019050613f046000830184613a7c565b92915050565b600080600060608486031215613f2357613f22613abe565b5b6000613f3186828701613cc0565b9350506020613f4286828701613cc0565b9250506040613f5386828701613c4c565b9150509250925092565b600060208284031215613f7357613f72613abe565b5b6000613f8184828501613de7565b91505092915050565b613f9381613dc6565b82525050565b6000602082019050613fae6000830184613f8a565b92915050565b60008060408385031215613fcb57613fca613abe565b5b6000613fd985828601613c4c565b925050602083013567ffffffffffffffff811115613ffa57613ff9613ac3565b5b61400685828601613e65565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156140305761402f613d1a565b5b61403982613bc9565b9050602081019050919050565b82818337600083830152505050565b600061406861406384614015565b613d7a565b90508281526020810184848401111561408457614083614010565b5b61408f848285614046565b509392505050565b600082601f8301126140ac576140ab613d15565b5b81356140bc848260208601614055565b91505092915050565b6000602082840312156140db576140da613abe565b5b600082013567ffffffffffffffff8111156140f9576140f8613ac3565b5b61410584828501614097565b91505092915050565b600080fd5b60008083601f84011261412957614128613d15565b5b8235905067ffffffffffffffff8111156141465761414561410e565b5b60208301915083602082028301111561416257614161613dc1565b5b9250929050565b600080602083850312156141805761417f613abe565b5b600083013567ffffffffffffffff81111561419e5761419d613ac3565b5b6141aa85828601614113565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141eb81613a51565b82525050565b600067ffffffffffffffff82169050919050565b61420e816141f1565b82525050565b61421d81613b4d565b82525050565b600062ffffff82169050919050565b61423b81614223565b82525050565b60808201600082015161425760008501826141e2565b50602082015161426a6020850182614205565b50604082015161427d6040850182614214565b5060608201516142906060850182614232565b50505050565b60006142a28383614241565b60808301905092915050565b6000602082019050919050565b60006142c6826141b6565b6142d081856141c1565b93506142db836141d2565b8060005b8381101561430c5781516142f38882614296565b97506142fe836142ae565b9250506001810190506142df565b5085935050505092915050565b6000602082019050818103600083015261433381846142bb565b905092915050565b60006020828403121561435157614350613abe565b5b600061435f84828501613cc0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61439d81613a72565b82525050565b60006143af8383614394565b60208301905092915050565b6000602082019050919050565b60006143d382614368565b6143dd8185614373565b93506143e883614384565b8060005b8381101561441957815161440088826143a3565b975061440b836143bb565b9250506001810190506143ec565b5085935050505092915050565b6000602082019050818103600083015261444081846143c8565b905092915050565b60008060006060848603121561446157614460613abe565b5b600061446f86828701613cc0565b935050602061448086828701613c4c565b925050604061449186828701613c4c565b9150509250925092565b600060c0820190506144b06000830189613a7c565b6144bd6020830188613a7c565b6144ca6040830187613a7c565b6144d76060830186613a7c565b6144e46080830185613a7c565b6144f160a0830184613a7c565b979650505050505050565b61450581613b4d565b811461451057600080fd5b50565b600081359050614522816144fc565b92915050565b6000806040838503121561453f5761453e613abe565b5b600061454d85828601613cc0565b925050602061455e85828601614513565b9150509250929050565b600067ffffffffffffffff82111561458357614582613d1a565b5b61458c82613bc9565b9050602081019050919050565b60006145ac6145a784614568565b613d7a565b9050828152602081018484840111156145c8576145c7614010565b5b6145d3848285614046565b509392505050565b600082601f8301126145f0576145ef613d15565b5b8135614600848260208601614599565b91505092915050565b6000806000806080858703121561462357614622613abe565b5b600061463187828801613cc0565b945050602061464287828801613cc0565b935050604061465387828801613c4c565b925050606085013567ffffffffffffffff81111561467457614673613ac3565b5b614680878288016145db565b91505092959194509250565b6080820160008201516146a260008501826141e2565b5060208201516146b56020850182614205565b5060408201516146c86040850182614214565b5060608201516146db6060850182614232565b50505050565b60006080820190506146f6600083018461468c565b92915050565b6000806040838503121561471357614712613abe565b5b600061472185828601613cc0565b925050602061473285828601613cc0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478357607f821691505b6020821081036147965761479561473c565b5b50919050565b60008160601b9050919050565b60006147b48261479c565b9050919050565b60006147c6826147a9565b9050919050565b6147de6147d982613a51565b6147bb565b82525050565b60006147f082846147cd565b60148201915081905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614835602083613b8e565b9150614840826147ff565b602082019050919050565b6000602082019050818103600083015261486481614828565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006148a1601e83613b8e565b91506148ac8261486b565b602082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061491182613a72565b915061491c83613a72565b9250828201905080821115614934576149336148d7565b5b92915050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614970601283613b8e565b915061497b8261493a565b602082019050919050565b6000602082019050818103600083015261499f81614963565b9050919050565b7f72656163686564206d6178207065722077616c6c65742e000000000000000000600082015250565b60006149dc601783613b8e565b91506149e7826149a6565b602082019050919050565b60006020820190508181036000830152614a0b816149cf565b9050919050565b6000614a1d82613a72565b9150614a2883613a72565b9250828202614a3681613a72565b91508282048414831517614a4d57614a4c6148d7565b5b5092915050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b6000614a8a601c83613b8e565b9150614a9582614a54565b602082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b7f596f75277265206e6f742077686974656c6973742e0000000000000000000000600082015250565b6000614af6601583613b8e565b9150614b0182614ac0565b602082019050919050565b60006020820190508181036000830152614b2581614ae9565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614b62602083613b8e565b9150614b6d82614b2c565b602082019050919050565b60006020820190508181036000830152614b9181614b55565b9050919050565b6000614ba382613a72565b9150614bae83613a72565b9250828203905081811115614bc657614bc56148d7565b5b92915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000614c02601f83613b8e565b9150614c0d82614bcc565b602082019050919050565b60006020820190508181036000830152614c3181614bf5565b9050919050565b7f596f75277265206e6f7420476f6c645061737320486f6c646572000000000000600082015250565b6000614c6e601a83613b8e565b9150614c7982614c38565b602082019050919050565b60006020820190508181036000830152614c9d81614c61565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614d067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614cc9565b614d108683614cc9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614d4d614d48614d4384613a72565b614d28565b613a72565b9050919050565b6000819050919050565b614d6783614d32565b614d7b614d7382614d54565b848454614cd6565b825550505050565b600090565b614d90614d83565b614d9b818484614d5e565b505050565b5b81811015614dbf57614db4600082614d88565b600181019050614da1565b5050565b601f821115614e0457614dd581614ca4565b614dde84614cb9565b81016020851015614ded578190505b614e01614df985614cb9565b830182614da0565b50505b505050565b600082821c905092915050565b6000614e2760001984600802614e09565b1980831691505092915050565b6000614e408383614e16565b9150826002028217905092915050565b614e5982613b83565b67ffffffffffffffff811115614e7257614e71613d1a565b5b614e7c825461476b565b614e87828285614dc3565b600060209050601f831160018114614eba5760008415614ea8578287015190505b614eb28582614e34565b865550614f1a565b601f198416614ec886614ca4565b60005b82811015614ef057848901518255600182019150602085019450602081019050614ecb565b86831015614f0d5784890151614f09601f891682614e16565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f752063616e2774206d696e74206d6f7265207468616e20636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b6000614fad602883613b8e565b9150614fb882614f51565b604082019050919050565b60006020820190508181036000830152614fdc81614fa0565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615019601f83613b8e565b915061502482614fe3565b602082019050919050565b600060208201905081810360008301526150488161500c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061508982613a72565b915061509483613a72565b9250826150a4576150a361504f565b5b828204905092915050565b7f4e6f20455448206c656674000000000000000000000000000000000000000000600082015250565b60006150e5600b83613b8e565b91506150f0826150af565b602082019050919050565b60006020820190508181036000830152615114816150d8565b9050919050565b600081905092915050565b600061513182613b83565b61513b818561511b565b935061514b818560208601613b9f565b80840191505092915050565b60006151638285615126565b915061516f8284615126565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151d7602683613b8e565b91506151e28261517b565b604082019050919050565b60006020820190508181036000830152615206816151ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152348261520d565b61523e8185615218565b935061524e818560208601613b9f565b61525781613bc9565b840191505092915050565b60006080820190506152776000830187613a63565b6152846020830186613a63565b6152916040830185613a7c565b81810360608301526152a38184615229565b905095945050505050565b6000815190506152bd81613af4565b92915050565b6000602082840312156152d9576152d8613abe565b5b60006152e7848285016152ae565b91505092915050565b60006152fb82613a72565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361532d5761532c6148d7565b5b60018201905091905056fea2646970667358221220324637c96e95dc27ba8df438f1c29d2379f29a7ad65886dfc09d0c4c0f2d08e764736f6c63430008120033

Deployed Bytecode Sourcemap

683:11027:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11610:31;11619:10;11631:9;11610:31;;;;;;;:::i;:::-;;;;;;;;683:11027;;;;;9155:630:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10039:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16278:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16006:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9174:210:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5894:317:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;811:38:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19821:2764:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:92:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;896:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9465:634;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1067:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22676:187:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;509:92:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;857:32:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6200:2968;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3054:2846;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1859:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1640:513:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5906:210:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2751:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11391:150:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:9;;;;;;;;;;;;;:::i;:::-;;2489:112:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5416:879:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:85:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10208:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2527:2454:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1467:55:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;16819:231:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1018:41:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10851:599;;;:::i;:::-;;2056:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2187:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23444:396:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1095:21:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1069:418:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;974:37:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10411:313:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;934:32:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10105:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2383:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17200:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9155:630:1;9240:4;9573:10;9558:25;;:11;:25;;;;:101;;;;9649:10;9634:25;;:11;:25;;;;9558:101;:177;;;;9725:10;9710:25;;:11;:25;;;;9558:177;9539:196;;9155:630;;;:::o;10039:98::-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16278:214::-;16354:7;16378:16;16386:7;16378;:16::i;:::-;16373:64;;16403:34;;;;;;;;;;;;;;16373:64;16455:15;:24;16471:7;16455:24;;;;;;;;;;;:30;;;;;;;;;;;;16448:37;;16278:214;;;:::o;16006:122::-;16094:27;16103:2;16107:7;16116:4;16094:8;:27::i;:::-;16006:122;;:::o;9174:210:8:-;9254:4;9270:12;9312:6;9295:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;9285:35;;;;;;9270:50;;9337:39;9356:5;9363:6;;9371:4;9337:18;:39::i;:::-;9330:46;;;9174:210;;;;:::o;5894:317:1:-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;811:38:8:-;;;;:::o;19821:2764:1:-;19958:27;19988;20007:7;19988:18;:27::i;:::-;19958:57;;20071:4;20030:45;;20046:19;20030:45;;;20026:86;;20084:28;;;;;;;;;;;;;;20026:86;20124:27;20153:23;20180:35;20207:7;20180:26;:35::i;:::-;20123:92;;;;20312:68;20337:15;20354:4;20360:19;:17;:19::i;:::-;20312:24;:68::i;:::-;20307:179;;20399:43;20416:4;20422:19;:17;:19::i;:::-;20399:16;:43::i;:::-;20394:92;;20451:35;;;;;;;;;;;;;;20394:92;20307:179;20515:1;20501:16;;:2;:16;;;20497:52;;20526:23;;;;;;;;;;;;;;20497:52;20560:43;20582:4;20588:2;20592:7;20601:1;20560:21;:43::i;:::-;20692:15;20689:157;;;20830:1;20809:19;20802:30;20689:157;21218:18;:24;21237:4;21218:24;;;;;;;;;;;;;;;;21216:26;;;;;;;;;;;;21286:18;:22;21305:2;21286:22;;;;;;;;;;;;;;;;21284:24;;;;;;;;;;;21601:143;21637:2;21685:45;21700:4;21706:2;21710:19;21685:14;:45::i;:::-;2392:8;21657:73;21601:18;:143::i;:::-;21572:17;:26;21590:7;21572:26;;;;;;;;;;;:172;;;;21912:1;2392:8;21861:19;:47;:52;21857:617;;21933:19;21965:1;21955:7;:11;21933:33;;22120:1;22086:17;:30;22104:11;22086:30;;;;;;;;;;;;:35;22082:378;;22222:13;;22207:11;:28;22203:239;;22400:19;22367:17;:30;22385:11;22367:30;;;;;;;;;;;:52;;;;22203:239;22082:378;21915:559;21857:617;22518:7;22514:2;22499:27;;22508:4;22499:27;;;;;;;;;;;;22536:42;22557:4;22563:2;22567:7;22576:1;22536:20;:42::i;:::-;19948:2637;;;19821:2764;;;:::o;2285:92:8:-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2360:9:8::1;2351:6;:18;;;;2285:92:::0;:::o;896:31::-;;;;:::o;9465:634::-;1652:10;1639:23;;:9;:23;;;1631:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;9586:15:::1;;9571:11;9555:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;9547:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9744:12;;9729:11;9686:14;:26;9701:10;9686:26;;;;;;;;;;;;;;;:40;;;:54;;;;:::i;:::-;:70;;9678:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;9875:11;9861;;:25;;;;:::i;:::-;9848:9;:38;;9840:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9930:34;9940:10;9952:11;9930:9;:34::i;:::-;10014:11;9974:14;:26;9989:10;9974:26;;;;;;;;;;;;;;;:36;;;:51;;;;;;;:::i;:::-;;;;;;;;10080:11;10036:14;:26;10051:10;10036:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;9465:634:::0;:::o;1067:21::-;;;;:::o;22676:187:1:-;22817:39;22834:4;22840:2;22844:7;22817:39;;;;;;;;;;;;:16;:39::i;:::-;22676:187;;;:::o;509:92:2:-;574:20;580:7;589:4;574:5;:20::i;:::-;509:92;:::o;857:32:8:-;;;;:::o;6200:2968::-;6298:12;6340:10;6323:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;6313:39;;;;;;6298:54;;6383:40;6402:6;6410;;6418:4;6383:18;:40::i;:::-;6362:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;6528:15;;6513:11;6497:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;6489:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;6657:12;;6642:11;6599:14;:26;6614:10;6599:26;;;;;;;;;;;;;;;:40;;;:54;;;;:::i;:::-;:70;;6591:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;6995:13;;6956:14;:26;6971:10;6956:26;;;;;;;;;;;;;;;:36;;;:52;6952:2208;;;7046:18;7177:17;7213:14;:26;7228:10;7213:26;;;;;;;;;;;;;;;:36;;;7197:13;;:52;;;;:::i;:::-;7177:72;;7497:9;7482:11;:24;7479:407;;7544:1;7531:14;;7479:407;;;7840:9;7826:11;:23;;;;:::i;:::-;7813:36;;7479:407;7936:9;7922:10;7912:7;;:20;;;;:::i;:::-;:33;;7904:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;8061:34;8071:10;8083:11;8061:9;:34::i;:::-;8223:11;8183:14;:26;8198:10;8183:26;;;;;;;;;;;;;;;:36;;;:51;;;;;;;:::i;:::-;;;;;;;;8297:11;8253:14;:26;8268:10;8253:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;7011:1314;;6952:2208;;;8758:9;8743:11;8733:7;;:21;;;;:::i;:::-;:34;;8725:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;8895:34;8905:10;8917:11;8895:9;:34::i;:::-;9057:11;9017:14;:26;9032:10;9017:26;;;;;;;;;;;;;;;:36;;;:51;;;;;;;:::i;:::-;;;;;;;;9131:11;9087:14;:26;9102:10;9087:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;6952:2208;6287:2881;6200:2968;;:::o;3054:2846::-;3151:12;3193:10;3176:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3166:39;;;;;;3151:54;;3236:40;3255:6;3263;;3271:4;3236:18;:40::i;:::-;3215:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;3378:15;;3363:11;3347:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;3339:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;3515:12;;3500:11;3457:14;:26;3472:10;3457:26;;;;;;;;;;;;;;;:40;;;:54;;;;:::i;:::-;:70;;3449:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;3845:12;;3806:14;:26;3821:10;3806:26;;;;;;;;;;;;;;;:36;;;:51;3802:2090;;;3964:17;3999:14;:26;4014:10;3999:26;;;;;;;;;;;;;;;:36;;;3984:12;;:51;;;;:::i;:::-;3964:71;;4051:18;4308:9;4293:11;:24;4290:379;;4351:1;4338:14;;4290:379;;;4631:9;4617:11;:23;;;;:::i;:::-;4604:36;;4290:379;4716:9;4702:10;4692:7;;:20;;;;:::i;:::-;:33;;4684:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4837:34;4847:10;4859:11;4837:9;:34::i;:::-;4995:11;4955:14;:26;4970:10;4955:26;;;;;;;;;;;;;;;:36;;;:51;;;;;;;:::i;:::-;;;;;;;;5065:11;5021:14;:26;5036:10;5021:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;3860:1229;;3802:2090;;;5511:9;5496:11;5486:7;;:21;;;;:::i;:::-;:34;;5478:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5640:34;5650:10;5662:11;5640:9;:34::i;:::-;5798:11;5758:14;:26;5773:10;5758:26;;;;;;;;;;;;;;;:36;;;:51;;;;;;;:::i;:::-;;;;;;;;5868:11;5824:14;:26;5839:10;5824:26;;;;;;;;;;;;;;;:40;;;:55;;;;;;;:::i;:::-;;;;;;;;3802:2090;3140:2760;3054:2846;;:::o;1859:103::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1944:11:8::1;1934:7;:21;;;;;;:::i;:::-;;1859:103:::0;:::o;1640:513:3:-;1779:23;1842:22;1867:8;;:15;;1842:40;;1896:34;1954:14;1933:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1896:73;;1988:9;1983:123;2004:14;1999:1;:19;1983:123;;2059:32;2079:8;;2088:1;2079:11;;;;;;;:::i;:::-;;;;;;;;2059:19;:32::i;:::-;2043:10;2054:1;2043:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;2020:3;;;;;1983:123;;;;2126:10;2119:17;;;;1640:513;;;;:::o;5906:210:8:-;5986:4;6002:12;6044:6;6027:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;6017:35;;;;;;6002:50;;6069:39;6088:5;6095:6;;6103:4;6069:18;:39::i;:::-;6062:46;;;5906:210;;;;:::o;2751:226::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2871:15:8::1;;2856:11;2840:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;2832:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;2943:27;2954:3;2958:11;2943:9;:27::i;:::-;2751:226:::0;;:::o;11391:150:1:-;11463:7;11505:27;11524:7;11505:18;:27::i;:::-;11482:52;;11391:150;;;:::o;7045:230::-;7117:7;7157:1;7140:19;;:5;:19;;;7136:60;;7168:28;;;;;;;;;;;;;;7136:60;1360:13;7213:18;:25;7232:5;7213:25;;;;;;;;;;;;;;;;:55;7206:62;;7045:230;;;:::o;1598:92:9:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;2489:112:8:-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2579:14:8::1;2565:11;:28;;;;2489:112:::0;:::o;5416:879:3:-;5494:16;5546:19;5579:25;5618:22;5643:16;5653:5;5643:9;:16::i;:::-;5618:41;;5673:25;5715:14;5701:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5673:57;;5744:31;;:::i;:::-;5794:9;5806:15;:13;:15::i;:::-;5794:27;;5789:461;5838:14;5823:11;:29;5789:461;;5889:15;5902:1;5889:12;:15::i;:::-;5877:27;;5926:9;:16;;;5966:8;5922:71;6040:1;6014:28;;:9;:14;;;:28;;;6010:109;;6086:9;:14;;;6066:34;;6010:109;6161:5;6140:26;;:17;:26;;;6136:100;;6216:1;6190:8;6199:13;;;;;;6190:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6136:100;5789:461;5854:3;;;;;5789:461;;;;6270:8;6263:15;;;;;;;5416:879;;;:::o;966:85:9:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;10208:102:1:-;10264:13;10296:7;10289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:102;:::o;2527:2454:3:-;2666:16;2731:4;2722:5;:13;2718:45;;2744:19;;;;;;;;;;;;;;2718:45;2777:19;2810:17;2830:14;:12;:14::i;:::-;2810:34;;2928:15;:13;:15::i;:::-;2920:5;:23;2916:85;;;2971:15;:13;:15::i;:::-;2963:23;;2916:85;3075:9;3068:4;:16;3064:71;;;3111:9;3104:16;;3064:71;3148:25;3176:16;3186:5;3176:9;:16::i;:::-;3148:44;;3367:4;3359:5;:12;3355:271;;;3391:19;3420:5;3413:4;:12;3391:34;;3461:17;3447:11;:31;3443:109;;;3522:11;3502:31;;3443:109;3373:193;3355:271;;;3610:1;3590:21;;3355:271;3639:25;3681:17;3667:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3639:60;;3738:1;3717:17;:22;3713:76;;3766:8;3759:15;;;;;;;;3713:76;3930:31;3964:26;3984:5;3964:19;:26::i;:::-;3930:60;;4004:25;4246:9;:16;;;4241:90;;4302:9;:14;;;4282:34;;4241:90;4349:9;4361:5;4349:17;;4344:467;4373:4;4368:1;:9;;:45;;;;;4396:17;4381:11;:32;;4368:45;4344:467;;;4450:15;4463:1;4450:12;:15::i;:::-;4438:27;;4487:9;:16;;;4527:8;4483:71;4601:1;4575:28;;:9;:14;;;:28;;;4571:109;;4647:9;:14;;;4627:34;;4571:109;4722:5;4701:26;;:17;:26;;;4697:100;;4777:1;4751:8;4760:13;;;;;;4751:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4697:100;4344:467;4415:3;;;;;4344:467;;;;4910:11;4900:8;4893:29;4956:8;4949:15;;;;;;;;2527:2454;;;;;;:::o;1467:55:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16819:231:1:-;16965:8;16913:18;:39;16932:19;:17;:19::i;:::-;16913:39;;;;;;;;;;;;;;;:49;16953:8;16913:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17024:8;16988:55;;17003:19;:17;:19::i;:::-;16988:55;;;17034:8;16988:55;;;;;;:::i;:::-;;;;;;;;16819:231;;:::o;1018:41:8:-;;;;:::o;10851:599::-;1680:1:10;2259:7;;:19;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;10918:16:8::1;10962:3;10959:2;10937:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;10918:47;;10987:16;11031:3;11028:2;11006:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;10987:47;;11055:16;11099:3;11096:2;11074:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;11055:47;;11124:16;11168:3;11165:2;11143:21;:24;;;;:::i;:::-;:28;;;;:::i;:::-;11124:47;;11224:1;11200:21;:25;11192:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;11268:7;;;;;;;;;;;11260:21;;:31;11282:8;11260:31;;;;;;;;;;;;;;;;;;;;;;;11252:40;;;::::0;::::1;;11318:7;;;;;;;;;;;11310:21;;:31;11332:8;11310:31;;;;;;;;;;;;;;;;;;;;;;;11302:40;;;::::0;::::1;;11368:7;;;;;;;;;;;11360:21;;:31;11382:8;11360:31;;;;;;;;;;;;;;;;;;;;;;;11352:40;;;::::0;::::1;;11418:7;;;;;;;;;;;11410:21;;:31;11432:8;11410:31;;;;;;;;;;;;;;;;;;;;;;;11402:40;;;::::0;::::1;;10906:544;;;;1637:1:10::0;2562:7;:22;;;;10851:599:8:o;2056:125::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2156:17:8::1;2138:15;:35;;;;2056:125:::0;:::o;2187:92::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2262:9:8::1;2253:6;:18;;;;2187:92:::0;:::o;23444:396:1:-;23613:31;23626:4;23632:2;23636:7;23613:12;:31::i;:::-;23676:1;23658:2;:14;;;:19;23654:180;;23696:56;23727:4;23733:2;23737:7;23746:5;23696:30;:56::i;:::-;23691:143;;23779:40;;;;;;;;;;;;;;23691:143;23654:180;23444:396;;;;:::o;1095:21:8:-;;;;:::o;1069:418:3:-;1153:21;;:::i;:::-;1186:31;;:::i;:::-;1241:15;:13;:15::i;:::-;1231:7;:25;:54;;;;1271:14;:12;:14::i;:::-;1260:7;:25;;1231:54;1227:101;;;1308:9;1301:16;;;;;1227:101;1349:21;1362:7;1349:12;:21::i;:::-;1337:33;;1384:9;:16;;;1380:63;;;1423:9;1416:16;;;;;1380:63;1459:21;1472:7;1459:12;:21::i;:::-;1452:28;;;1069:418;;;;:::o;974:37:8:-;;;;:::o;10411:313:1:-;10484:13;10514:16;10522:7;10514;:16::i;:::-;10509:59;;10539:29;;;;;;;;;;;;;;10509:59;10579:21;10603:10;:8;:10::i;:::-;10579:34;;10655:1;10636:7;10630:21;:26;:87;;;;;;;;;;;;;;;;;10683:7;10692:18;10702:7;10692:9;:18::i;:::-;10666:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10630:87;10623:94;;;10411:313;;;:::o;934:32:8:-;;;;:::o;10105:233::-;10163:7;10311:20;10325:5;10311:13;:20::i;:::-;10304:27;;10105:233;;;:::o;2383:100::-;1189:12:9;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2465:10:8::1;2455:7;:20;;;;2383:100:::0;:::o;17200:162:1:-;17297:4;17320:18;:25;17339:5;17320:25;;;;;;;;;;;;;;;:35;17346:8;17320:35;;;;;;;;;;;;;;;;;;;;;;;;;17313:42;;17200:162;;;;:::o;1839:189:9:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;::::0;1919:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;17611:277:1:-;17676:4;17730:7;17711:15;:13;:15::i;:::-;:26;;:65;;;;;17763:13;;17753:7;:23;17711:65;:151;;;;;17861:1;2118:8;17813:17;:26;17831:7;17813:26;;;;;;;;;;;;:44;:49;17711:151;17692:170;;17611:277;;;:::o;34231:477::-;34355:13;34371:16;34379:7;34371;:16::i;:::-;34355:32;;34402:13;34398:215;;;34456:5;34433:28;;:19;:17;:19::i;:::-;:28;;;34429:184;;34484:44;34501:5;34508:19;:17;:19::i;:::-;34484:16;:44::i;:::-;34479:134;;34559:35;;;;;;;;;;;;;;34479:134;34429:184;34398:215;34656:2;34623:15;:24;34639:7;34623:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34693:7;34689:2;34673:28;;34682:5;34673:28;;;;;;;;;;;;34345:363;34231:477;;;:::o;1153:184:7:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;5426:90:1:-;5482:7;5426:90;:::o;12515:1680::-;12582:14;12631:7;12612:15;:13;:15::i;:::-;:26;12608:1533;;12663:17;:26;12681:7;12663:26;;;;;;;;;;;;12654:35;;12765:1;2118:8;12737:6;:24;:29;12733:1398;;12884:1;12874:6;:11;12870:963;;12924:13;;12913:7;:24;12909:68;;12946:31;;;;;;;;;;;;;;12909:68;13564:251;13648:17;:28;13666:9;;;;;;;13648:28;;;;;;;;;;;;13639:37;;13742:1;13732:6;:11;13779:13;13728:25;13564:251;;12870:963;14103:13;;12733:1398;12608:1533;14157:31;;;;;;;;;;;;;;12515:1680;;;;:::o;18746:474::-;18845:27;18874:23;18913:38;18954:15;:24;18970:7;18954:24;;;;;;;;;;;18913:65;;19128:18;19105:41;;19184:19;19178:26;19159:45;;19091:123;18746:474;;;:::o;40612:103::-;40672:7;40698:10;40691:17;;40612:103;:::o;17992:646::-;18137:11;18299:16;18292:5;18288:28;18279:37;;18457:16;18446:9;18442:32;18429:45;;18605:15;18594:9;18591:30;18583:5;18572:9;18569:20;18566:56;18556:66;;17992:646;;;;;:::o;24484:154::-;;;;;:::o;39939:304::-;40070:7;40089:16;2513:3;40115:19;:41;;40089:68;;2513:3;40182:31;40193:4;40199:2;40203:9;40182:10;:31::i;:::-;40174:40;;:62;;40167:69;;;39939:304;;;;;:::o;14728:443::-;14808:14;14973:16;14966:5;14962:28;14953:37;;15148:5;15134:11;15109:23;15105:41;15102:52;15095:5;15092:63;15082:73;;14728:443;;;;:::o;25285:153::-;;;;;:::o;586:96:0:-;639:7;665:10;658:17;;586:96;:::o;33341:110:1:-;33417:27;33427:2;33431:8;33417:27;;;;;;;;;;;;:9;:27::i;:::-;33341:110;;:::o;35270:3015::-;35349:27;35379;35398:7;35379:18;:27::i;:::-;35349:57;;35417:12;35448:19;35417:52;;35481:27;35510:23;35537:35;35564:7;35537:26;:35::i;:::-;35480:92;;;;35587:13;35583:312;;;35706:68;35731:15;35748:4;35754:19;:17;:19::i;:::-;35706:24;:68::i;:::-;35701:183;;35797:43;35814:4;35820:19;:17;:19::i;:::-;35797:16;:43::i;:::-;35792:92;;35849:35;;;;;;;;;;;;;;35792:92;35701:183;35583:312;35905:51;35927:4;35941:1;35945:7;35954:1;35905:21;:51::i;:::-;36045:15;36042:157;;;36183:1;36162:19;36155:30;36042:157;36847:1;1619:3;36817:1;:26;;36816:32;36788:18;:24;36807:4;36788:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;37108:173;37144:4;37214:53;37229:4;37243:1;37247:19;37214:14;:53::i;:::-;2392:8;2118;37167:43;37166:101;37108:18;:173::i;:::-;37079:17;:26;37097:7;37079:26;;;;;;;;;;;:202;;;;37449:1;2392:8;37398:19;:47;:52;37394:617;;37470:19;37502:1;37492:7;:11;37470:33;;37657:1;37623:17;:30;37641:11;37623:30;;;;;;;;;;;;:35;37619:378;;37759:13;;37744:11;:28;37740:239;;37937:19;37904:17;:30;37922:11;37904:30;;;;;;;;;;;:52;;;;37740:239;37619:378;37452:559;37394:617;38063:7;38059:1;38036:35;;38045:4;38036:35;;;;;;;;;;;;38081:50;38102:4;38116:1;38120:7;38129:1;38081:20;:50::i;:::-;38254:12;;:14;;;;;;;;;;;;;35339:2946;;;;35270:3015;;:::o;2034:169:9:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;11979:159:1:-;12047:21;;:::i;:::-;12087:44;12106:17;:24;12124:5;12106:24;;;;;;;;;;;;12087:18;:44::i;:::-;12080:51;;11979:159;;;:::o;5590:101::-;5645:7;5671:13;;5664:20;;5590:101;:::o;25866:697::-;26024:4;26069:2;26044:45;;;26090:19;:17;:19::i;:::-;26111:4;26117:7;26126:5;26044:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26040:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26339:1;26322:6;:13;:18;26318:229;;26367:40;;;;;;;;;;;;;;26318:229;26507:6;26501:13;26492:6;26488:2;26484:15;26477:38;26040:517;26210:54;;;26200:64;;;:6;:64;;;;26193:71;;;25866:697;;;;;;:::o;11724:164::-;11794:21;;:::i;:::-;11834:47;11853:27;11872:7;11853:18;:27::i;:::-;11834:18;:47::i;:::-;11827:54;;11724:164;;;:::o;1747:106:8:-;1807:13;1839:7;1832:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1747:106;:::o;40812:1708:1:-;40877:17;41305:4;41298;41292:11;41288:22;41395:1;41389:4;41382:15;41468:4;41465:1;41461:12;41454:19;;41548:1;41543:3;41536:14;41649:3;41883:5;41865:419;41891:1;41865:419;;;41930:1;41925:3;41921:11;41914:18;;42098:2;42092:4;42088:13;42084:2;42080:22;42075:3;42067:36;42190:2;42184:4;42180:13;42172:21;;42255:4;41865:419;42245:25;41865:419;41869:21;42321:3;42316;42312:13;42434:4;42429:3;42425:14;42418:21;;42497:6;42492:3;42485:19;40915:1599;;;40812:1708;;;:::o;7352:176::-;7413:7;1360:13;1495:2;7440:18;:25;7459:5;7440:25;;;;;;;;;;;;;;;;:50;;7439:82;7432:89;;7352:176;;;:::o;1991:290:7:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;39650:143:1:-;39783:6;39650:143;;;;;:::o;32593:669::-;32719:19;32725:2;32729:8;32719:5;:19::i;:::-;32795:1;32777:2;:14;;;:19;32773:473;;32816:11;32830:13;;32816:27;;32861:13;32883:8;32877:3;:14;32861:30;;32909:229;32939:62;32978:1;32982:2;32986:7;;;;;;32995:5;32939:30;:62::i;:::-;32934:165;;33036:40;;;;;;;;;;;;;;32934:165;33133:3;33125:5;:11;32909:229;;33218:3;33201:13;;:20;33197:34;;33223:8;;;33197:34;32798:448;;32773:473;32593:669;;;:::o;14289:361::-;14355:31;;:::i;:::-;14431:6;14398:9;:14;;:41;;;;;;;;;;;2004:3;14483:6;:33;;14449:9;:24;;:68;;;;;;;;;;;14574:1;2118:8;14546:6;:24;:29;;14527:9;:16;;:48;;;;;;;;;;;2513:3;14614:6;:28;;14585:9;:19;;:58;;;;;;;;;;;14289:361;;;:::o;5518:147:7:-;5581:7;5611:1;5607;:5;:51;;5638:20;5653:1;5656;5638:14;:20::i;:::-;5607:51;;;5615:20;5630:1;5633;5615:14;:20::i;:::-;5607:51;5600:58;;5518:147;;;;:::o;27009:2902:1:-;27081:20;27104:13;;27081:36;;27143:1;27131:8;:13;27127:44;;27153:18;;;;;;;;;;;;;;27127:44;27182:61;27212:1;27216:2;27220:12;27234:8;27182:21;:61::i;:::-;27715:1;1495:2;27685:1;:26;;27684:32;27672:8;:45;27646:18;:22;27665:2;27646:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;27987:136;28023:2;28076:33;28099:1;28103:2;28107:1;28076:14;:33::i;:::-;28043:30;28064:8;28043:20;:30::i;:::-;:66;27987:18;:136::i;:::-;27953:17;:31;27971:12;27953:31;;;;;;;;;;;:170;;;;28138:16;28168:11;28197:8;28182:12;:23;28168:37;;28710:16;28706:2;28702:25;28690:37;;29074:12;29035:8;28995:1;28934:25;28876:1;28816;28790:328;29438:1;29424:12;29420:20;29379:339;29478:3;29469:7;29466:16;29379:339;;29692:7;29682:8;29679:1;29652:25;29649:1;29646;29641:59;29530:1;29521:7;29517:15;29506:26;;29379:339;;;29383:75;29761:1;29749:8;:13;29745:45;;29771:19;;;;;;;;;;;;;;29745:45;29821:3;29805:13;:19;;;;27426:2409;;29844:60;29873:1;29877:2;29881:12;29895:8;29844:20;:60::i;:::-;27071:2840;27009:2902;;:::o;5671:261:7:-;5739:13;5843:1;5837:4;5830:15;5871:1;5865:4;5858:15;5911:4;5905;5895:21;5886:30;;5671:261;;;;:::o;15268:318:1:-;15338:14;15567:1;15557:8;15554:15;15528:24;15524:46;15514:56;;15268:318;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:126:11:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:99::-;2473:6;2507:5;2501:12;2491:22;;2421:99;;;:::o;2526:169::-;2610:11;2644:6;2639:3;2632:19;2684:4;2679:3;2675:14;2660:29;;2526:169;;;;:::o;2701:246::-;2782:1;2792:113;2806:6;2803:1;2800:13;2792:113;;;2891:1;2886:3;2882:11;2876:18;2872:1;2867:3;2863:11;2856:39;2828:2;2825:1;2821:10;2816:15;;2792:113;;;2939:1;2930:6;2925:3;2921:16;2914:27;2763:184;2701:246;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:377::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:65;3370:6;3365:3;3358:4;3351:5;3347:16;3312:65;:::i;:::-;3402:29;3424:6;3402:29;:::i;:::-;3397:3;3393:39;3386:46;;3153:285;3061:377;;;;:::o;3444:313::-;3557:4;3595:2;3584:9;3580:18;3572:26;;3644:9;3638:4;3634:20;3630:1;3619:9;3615:17;3608:47;3672:78;3745:4;3736:6;3672:78;:::i;:::-;3664:86;;3444:313;;;;:::o;3763:122::-;3836:24;3854:5;3836:24;:::i;:::-;3829:5;3826:35;3816:63;;3875:1;3872;3865:12;3816:63;3763:122;:::o;3891:139::-;3937:5;3975:6;3962:20;3953:29;;3991:33;4018:5;3991:33;:::i;:::-;3891:139;;;;:::o;4036:329::-;4095:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:119;;;4150:79;;:::i;:::-;4112:119;4270:1;4295:53;4340:7;4331:6;4320:9;4316:22;4295:53;:::i;:::-;4285:63;;4241:117;4036:329;;;;:::o;4371:222::-;4464:4;4502:2;4491:9;4487:18;4479:26;;4515:71;4583:1;4572:9;4568:17;4559:6;4515:71;:::i;:::-;4371:222;;;;:::o;4599:122::-;4672:24;4690:5;4672:24;:::i;:::-;4665:5;4662:35;4652:63;;4711:1;4708;4701:12;4652:63;4599:122;:::o;4727:139::-;4773:5;4811:6;4798:20;4789:29;;4827:33;4854:5;4827:33;:::i;:::-;4727:139;;;;:::o;4872:474::-;4940:6;4948;4997:2;4985:9;4976:7;4972:23;4968:32;4965:119;;;5003:79;;:::i;:::-;4965:119;5123:1;5148:53;5193:7;5184:6;5173:9;5169:22;5148:53;:::i;:::-;5138:63;;5094:117;5250:2;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5221:118;4872:474;;;;;:::o;5352:117::-;5461:1;5458;5451:12;5475:180;5523:77;5520:1;5513:88;5620:4;5617:1;5610:15;5644:4;5641:1;5634:15;5661:281;5744:27;5766:4;5744:27;:::i;:::-;5736:6;5732:40;5874:6;5862:10;5859:22;5838:18;5826:10;5823:34;5820:62;5817:88;;;5885:18;;:::i;:::-;5817:88;5925:10;5921:2;5914:22;5704:238;5661:281;;:::o;5948:129::-;5982:6;6009:20;;:::i;:::-;5999:30;;6038:33;6066:4;6058:6;6038:33;:::i;:::-;5948:129;;;:::o;6083:311::-;6160:4;6250:18;6242:6;6239:30;6236:56;;;6272:18;;:::i;:::-;6236:56;6322:4;6314:6;6310:17;6302:25;;6382:4;6376;6372:15;6364:23;;6083:311;;;:::o;6400:117::-;6509:1;6506;6499:12;6523:77;6560:7;6589:5;6578:16;;6523:77;;;:::o;6606:122::-;6679:24;6697:5;6679:24;:::i;:::-;6672:5;6669:35;6659:63;;6718:1;6715;6708:12;6659:63;6606:122;:::o;6734:139::-;6780:5;6818:6;6805:20;6796:29;;6834:33;6861:5;6834:33;:::i;:::-;6734:139;;;;:::o;6896:710::-;6992:5;7017:81;7033:64;7090:6;7033:64;:::i;:::-;7017:81;:::i;:::-;7008:90;;7118:5;7147:6;7140:5;7133:21;7181:4;7174:5;7170:16;7163:23;;7234:4;7226:6;7222:17;7214:6;7210:30;7263:3;7255:6;7252:15;7249:122;;;7282:79;;:::i;:::-;7249:122;7397:6;7380:220;7414:6;7409:3;7406:15;7380:220;;;7489:3;7518:37;7551:3;7539:10;7518:37;:::i;:::-;7513:3;7506:50;7585:4;7580:3;7576:14;7569:21;;7456:144;7440:4;7435:3;7431:14;7424:21;;7380:220;;;7384:21;6998:608;;6896:710;;;;;:::o;7629:370::-;7700:5;7749:3;7742:4;7734:6;7730:17;7726:27;7716:122;;7757:79;;:::i;:::-;7716:122;7874:6;7861:20;7899:94;7989:3;7981:6;7974:4;7966:6;7962:17;7899:94;:::i;:::-;7890:103;;7706:293;7629:370;;;;:::o;8005:684::-;8098:6;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8309:1;8298:9;8294:17;8281:31;8339:18;8331:6;8328:30;8325:117;;;8361:79;;:::i;:::-;8325:117;8466:78;8536:7;8527:6;8516:9;8512:22;8466:78;:::i;:::-;8456:88;;8252:302;8593:2;8619:53;8664:7;8655:6;8644:9;8640:22;8619:53;:::i;:::-;8609:63;;8564:118;8005:684;;;;;:::o;8695:222::-;8788:4;8826:2;8815:9;8811:18;8803:26;;8839:71;8907:1;8896:9;8892:17;8883:6;8839:71;:::i;:::-;8695:222;;;;:::o;8923:619::-;9000:6;9008;9016;9065:2;9053:9;9044:7;9040:23;9036:32;9033:119;;;9071:79;;:::i;:::-;9033:119;9191:1;9216:53;9261:7;9252:6;9241:9;9237:22;9216:53;:::i;:::-;9206:63;;9162:117;9318:2;9344:53;9389:7;9380:6;9369:9;9365:22;9344:53;:::i;:::-;9334:63;;9289:118;9446:2;9472:53;9517:7;9508:6;9497:9;9493:22;9472:53;:::i;:::-;9462:63;;9417:118;8923:619;;;;;:::o;9548:329::-;9607:6;9656:2;9644:9;9635:7;9631:23;9627:32;9624:119;;;9662:79;;:::i;:::-;9624:119;9782:1;9807:53;9852:7;9843:6;9832:9;9828:22;9807:53;:::i;:::-;9797:63;;9753:117;9548:329;;;;:::o;9883:118::-;9970:24;9988:5;9970:24;:::i;:::-;9965:3;9958:37;9883:118;;:::o;10007:222::-;10100:4;10138:2;10127:9;10123:18;10115:26;;10151:71;10219:1;10208:9;10204:17;10195:6;10151:71;:::i;:::-;10007:222;;;;:::o;10235:684::-;10328:6;10336;10385:2;10373:9;10364:7;10360:23;10356:32;10353:119;;;10391:79;;:::i;:::-;10353:119;10511:1;10536:53;10581:7;10572:6;10561:9;10557:22;10536:53;:::i;:::-;10526:63;;10482:117;10666:2;10655:9;10651:18;10638:32;10697:18;10689:6;10686:30;10683:117;;;10719:79;;:::i;:::-;10683:117;10824:78;10894:7;10885:6;10874:9;10870:22;10824:78;:::i;:::-;10814:88;;10609:303;10235:684;;;;;:::o;10925:117::-;11034:1;11031;11024:12;11048:308;11110:4;11200:18;11192:6;11189:30;11186:56;;;11222:18;;:::i;:::-;11186:56;11260:29;11282:6;11260:29;:::i;:::-;11252:37;;11344:4;11338;11334:15;11326:23;;11048:308;;;:::o;11362:146::-;11459:6;11454:3;11449;11436:30;11500:1;11491:6;11486:3;11482:16;11475:27;11362:146;;;:::o;11514:425::-;11592:5;11617:66;11633:49;11675:6;11633:49;:::i;:::-;11617:66;:::i;:::-;11608:75;;11706:6;11699:5;11692:21;11744:4;11737:5;11733:16;11782:3;11773:6;11768:3;11764:16;11761:25;11758:112;;;11789:79;;:::i;:::-;11758:112;11879:54;11926:6;11921:3;11916;11879:54;:::i;:::-;11598:341;11514:425;;;;;:::o;11959:340::-;12015:5;12064:3;12057:4;12049:6;12045:17;12041:27;12031:122;;12072:79;;:::i;:::-;12031:122;12189:6;12176:20;12214:79;12289:3;12281:6;12274:4;12266:6;12262:17;12214:79;:::i;:::-;12205:88;;12021:278;11959:340;;;;:::o;12305:509::-;12374:6;12423:2;12411:9;12402:7;12398:23;12394:32;12391:119;;;12429:79;;:::i;:::-;12391:119;12577:1;12566:9;12562:17;12549:31;12607:18;12599:6;12596:30;12593:117;;;12629:79;;:::i;:::-;12593:117;12734:63;12789:7;12780:6;12769:9;12765:22;12734:63;:::i;:::-;12724:73;;12520:287;12305:509;;;;:::o;12820:117::-;12929:1;12926;12919:12;12960:568;13033:8;13043:6;13093:3;13086:4;13078:6;13074:17;13070:27;13060:122;;13101:79;;:::i;:::-;13060:122;13214:6;13201:20;13191:30;;13244:18;13236:6;13233:30;13230:117;;;13266:79;;:::i;:::-;13230:117;13380:4;13372:6;13368:17;13356:29;;13434:3;13426:4;13418:6;13414:17;13404:8;13400:32;13397:41;13394:128;;;13441:79;;:::i;:::-;13394:128;12960:568;;;;;:::o;13534:559::-;13620:6;13628;13677:2;13665:9;13656:7;13652:23;13648:32;13645:119;;;13683:79;;:::i;:::-;13645:119;13831:1;13820:9;13816:17;13803:31;13861:18;13853:6;13850:30;13847:117;;;13883:79;;:::i;:::-;13847:117;13996:80;14068:7;14059:6;14048:9;14044:22;13996:80;:::i;:::-;13978:98;;;;13774:312;13534:559;;;;;:::o;14099:146::-;14198:6;14232:5;14226:12;14216:22;;14099:146;;;:::o;14251:216::-;14382:11;14416:6;14411:3;14404:19;14456:4;14451:3;14447:14;14432:29;;14251:216;;;;:::o;14473:164::-;14572:4;14595:3;14587:11;;14625:4;14620:3;14616:14;14608:22;;14473:164;;;:::o;14643:108::-;14720:24;14738:5;14720:24;:::i;:::-;14715:3;14708:37;14643:108;;:::o;14757:101::-;14793:7;14833:18;14826:5;14822:30;14811:41;;14757:101;;;:::o;14864:105::-;14939:23;14956:5;14939:23;:::i;:::-;14934:3;14927:36;14864:105;;:::o;14975:99::-;15046:21;15061:5;15046:21;:::i;:::-;15041:3;15034:34;14975:99;;:::o;15080:91::-;15116:7;15156:8;15149:5;15145:20;15134:31;;15080:91;;;:::o;15177:105::-;15252:23;15269:5;15252:23;:::i;:::-;15247:3;15240:36;15177:105;;:::o;15360:866::-;15511:4;15506:3;15502:14;15598:4;15591:5;15587:16;15581:23;15617:63;15674:4;15669:3;15665:14;15651:12;15617:63;:::i;:::-;15526:164;15782:4;15775:5;15771:16;15765:23;15801:61;15856:4;15851:3;15847:14;15833:12;15801:61;:::i;:::-;15700:172;15956:4;15949:5;15945:16;15939:23;15975:57;16026:4;16021:3;16017:14;16003:12;15975:57;:::i;:::-;15882:160;16129:4;16122:5;16118:16;16112:23;16148:61;16203:4;16198:3;16194:14;16180:12;16148:61;:::i;:::-;16052:167;15480:746;15360:866;;:::o;16232:307::-;16365:10;16386:110;16492:3;16484:6;16386:110;:::i;:::-;16528:4;16523:3;16519:14;16505:28;;16232:307;;;;:::o;16545:145::-;16647:4;16679;16674:3;16670:14;16662:22;;16545:145;;;:::o;16772:988::-;16955:3;16984:86;17064:5;16984:86;:::i;:::-;17086:118;17197:6;17192:3;17086:118;:::i;:::-;17079:125;;17228:88;17310:5;17228:88;:::i;:::-;17339:7;17370:1;17355:380;17380:6;17377:1;17374:13;17355:380;;;17456:6;17450:13;17483:127;17606:3;17591:13;17483:127;:::i;:::-;17476:134;;17633:92;17718:6;17633:92;:::i;:::-;17623:102;;17415:320;17402:1;17399;17395:9;17390:14;;17355:380;;;17359:14;17751:3;17744:10;;16960:800;;;16772:988;;;;:::o;17766:501::-;17973:4;18011:2;18000:9;17996:18;17988:26;;18060:9;18054:4;18050:20;18046:1;18035:9;18031:17;18024:47;18088:172;18255:4;18246:6;18088:172;:::i;:::-;18080:180;;17766:501;;;;:::o;18273:329::-;18332:6;18381:2;18369:9;18360:7;18356:23;18352:32;18349:119;;;18387:79;;:::i;:::-;18349:119;18507:1;18532:53;18577:7;18568:6;18557:9;18553:22;18532:53;:::i;:::-;18522:63;;18478:117;18273:329;;;;:::o;18608:114::-;18675:6;18709:5;18703:12;18693:22;;18608:114;;;:::o;18728:184::-;18827:11;18861:6;18856:3;18849:19;18901:4;18896:3;18892:14;18877:29;;18728:184;;;;:::o;18918:132::-;18985:4;19008:3;19000:11;;19038:4;19033:3;19029:14;19021:22;;18918:132;;;:::o;19056:108::-;19133:24;19151:5;19133:24;:::i;:::-;19128:3;19121:37;19056:108;;:::o;19170:179::-;19239:10;19260:46;19302:3;19294:6;19260:46;:::i;:::-;19338:4;19333:3;19329:14;19315:28;;19170:179;;;;:::o;19355:113::-;19425:4;19457;19452:3;19448:14;19440:22;;19355:113;;;:::o;19504:732::-;19623:3;19652:54;19700:5;19652:54;:::i;:::-;19722:86;19801:6;19796:3;19722:86;:::i;:::-;19715:93;;19832:56;19882:5;19832:56;:::i;:::-;19911:7;19942:1;19927:284;19952:6;19949:1;19946:13;19927:284;;;20028:6;20022:13;20055:63;20114:3;20099:13;20055:63;:::i;:::-;20048:70;;20141:60;20194:6;20141:60;:::i;:::-;20131:70;;19987:224;19974:1;19971;19967:9;19962:14;;19927:284;;;19931:14;20227:3;20220:10;;19628:608;;;19504:732;;;;:::o;20242:373::-;20385:4;20423:2;20412:9;20408:18;20400:26;;20472:9;20466:4;20462:20;20458:1;20447:9;20443:17;20436:47;20500:108;20603:4;20594:6;20500:108;:::i;:::-;20492:116;;20242:373;;;;:::o;20621:619::-;20698:6;20706;20714;20763:2;20751:9;20742:7;20738:23;20734:32;20731:119;;;20769:79;;:::i;:::-;20731:119;20889:1;20914:53;20959:7;20950:6;20939:9;20935:22;20914:53;:::i;:::-;20904:63;;20860:117;21016:2;21042:53;21087:7;21078:6;21067:9;21063:22;21042:53;:::i;:::-;21032:63;;20987:118;21144:2;21170:53;21215:7;21206:6;21195:9;21191:22;21170:53;:::i;:::-;21160:63;;21115:118;20621:619;;;;;:::o;21246:775::-;21479:4;21517:3;21506:9;21502:19;21494:27;;21531:71;21599:1;21588:9;21584:17;21575:6;21531:71;:::i;:::-;21612:72;21680:2;21669:9;21665:18;21656:6;21612:72;:::i;:::-;21694;21762:2;21751:9;21747:18;21738:6;21694:72;:::i;:::-;21776;21844:2;21833:9;21829:18;21820:6;21776:72;:::i;:::-;21858:73;21926:3;21915:9;21911:19;21902:6;21858:73;:::i;:::-;21941;22009:3;21998:9;21994:19;21985:6;21941:73;:::i;:::-;21246:775;;;;;;;;;:::o;22027:116::-;22097:21;22112:5;22097:21;:::i;:::-;22090:5;22087:32;22077:60;;22133:1;22130;22123:12;22077:60;22027:116;:::o;22149:133::-;22192:5;22230:6;22217:20;22208:29;;22246:30;22270:5;22246:30;:::i;:::-;22149:133;;;;:::o;22288:468::-;22353:6;22361;22410:2;22398:9;22389:7;22385:23;22381:32;22378:119;;;22416:79;;:::i;:::-;22378:119;22536:1;22561:53;22606:7;22597:6;22586:9;22582:22;22561:53;:::i;:::-;22551:63;;22507:117;22663:2;22689:50;22731:7;22722:6;22711:9;22707:22;22689:50;:::i;:::-;22679:60;;22634:115;22288:468;;;;;:::o;22762:307::-;22823:4;22913:18;22905:6;22902:30;22899:56;;;22935:18;;:::i;:::-;22899:56;22973:29;22995:6;22973:29;:::i;:::-;22965:37;;23057:4;23051;23047:15;23039:23;;22762:307;;;:::o;23075:423::-;23152:5;23177:65;23193:48;23234:6;23193:48;:::i;:::-;23177:65;:::i;:::-;23168:74;;23265:6;23258:5;23251:21;23303:4;23296:5;23292:16;23341:3;23332:6;23327:3;23323:16;23320:25;23317:112;;;23348:79;;:::i;:::-;23317:112;23438:54;23485:6;23480:3;23475;23438:54;:::i;:::-;23158:340;23075:423;;;;;:::o;23517:338::-;23572:5;23621:3;23614:4;23606:6;23602:17;23598:27;23588:122;;23629:79;;:::i;:::-;23588:122;23746:6;23733:20;23771:78;23845:3;23837:6;23830:4;23822:6;23818:17;23771:78;:::i;:::-;23762:87;;23578:277;23517:338;;;;:::o;23861:943::-;23956:6;23964;23972;23980;24029:3;24017:9;24008:7;24004:23;24000:33;23997:120;;;24036:79;;:::i;:::-;23997:120;24156:1;24181:53;24226:7;24217:6;24206:9;24202:22;24181:53;:::i;:::-;24171:63;;24127:117;24283:2;24309:53;24354:7;24345:6;24334:9;24330:22;24309:53;:::i;:::-;24299:63;;24254:118;24411:2;24437:53;24482:7;24473:6;24462:9;24458:22;24437:53;:::i;:::-;24427:63;;24382:118;24567:2;24556:9;24552:18;24539:32;24598:18;24590:6;24587:30;24584:117;;;24620:79;;:::i;:::-;24584:117;24725:62;24779:7;24770:6;24759:9;24755:22;24725:62;:::i;:::-;24715:72;;24510:287;23861:943;;;;;;;:::o;24882:876::-;25043:4;25038:3;25034:14;25130:4;25123:5;25119:16;25113:23;25149:63;25206:4;25201:3;25197:14;25183:12;25149:63;:::i;:::-;25058:164;25314:4;25307:5;25303:16;25297:23;25333:61;25388:4;25383:3;25379:14;25365:12;25333:61;:::i;:::-;25232:172;25488:4;25481:5;25477:16;25471:23;25507:57;25558:4;25553:3;25549:14;25535:12;25507:57;:::i;:::-;25414:160;25661:4;25654:5;25650:16;25644:23;25680:61;25735:4;25730:3;25726:14;25712:12;25680:61;:::i;:::-;25584:167;25012:746;24882:876;;:::o;25764:351::-;25921:4;25959:3;25948:9;25944:19;25936:27;;25973:135;26105:1;26094:9;26090:17;26081:6;25973:135;:::i;:::-;25764:351;;;;:::o;26121:474::-;26189:6;26197;26246:2;26234:9;26225:7;26221:23;26217:32;26214:119;;;26252:79;;:::i;:::-;26214:119;26372:1;26397:53;26442:7;26433:6;26422:9;26418:22;26397:53;:::i;:::-;26387:63;;26343:117;26499:2;26525:53;26570:7;26561:6;26550:9;26546:22;26525:53;:::i;:::-;26515:63;;26470:118;26121:474;;;;;:::o;26601:180::-;26649:77;26646:1;26639:88;26746:4;26743:1;26736:15;26770:4;26767:1;26760:15;26787:320;26831:6;26868:1;26862:4;26858:12;26848:22;;26915:1;26909:4;26905:12;26936:18;26926:81;;26992:4;26984:6;26980:17;26970:27;;26926:81;27054:2;27046:6;27043:14;27023:18;27020:38;27017:84;;27073:18;;:::i;:::-;27017:84;26838:269;26787:320;;;:::o;27113:94::-;27146:8;27194:5;27190:2;27186:14;27165:35;;27113:94;;;:::o;27213:::-;27252:7;27281:20;27295:5;27281:20;:::i;:::-;27270:31;;27213:94;;;:::o;27313:100::-;27352:7;27381:26;27401:5;27381:26;:::i;:::-;27370:37;;27313:100;;;:::o;27419:157::-;27524:45;27544:24;27562:5;27544:24;:::i;:::-;27524:45;:::i;:::-;27519:3;27512:58;27419:157;;:::o;27582:256::-;27694:3;27709:75;27780:3;27771:6;27709:75;:::i;:::-;27809:2;27804:3;27800:12;27793:19;;27829:3;27822:10;;27582:256;;;;:::o;27844:182::-;27984:34;27980:1;27972:6;27968:14;27961:58;27844:182;:::o;28032:366::-;28174:3;28195:67;28259:2;28254:3;28195:67;:::i;:::-;28188:74;;28271:93;28360:3;28271:93;:::i;:::-;28389:2;28384:3;28380:12;28373:19;;28032:366;;;:::o;28404:419::-;28570:4;28608:2;28597:9;28593:18;28585:26;;28657:9;28651:4;28647:20;28643:1;28632:9;28628:17;28621:47;28685:131;28811:4;28685:131;:::i;:::-;28677:139;;28404:419;;;:::o;28829:180::-;28969:32;28965:1;28957:6;28953:14;28946:56;28829:180;:::o;29015:366::-;29157:3;29178:67;29242:2;29237:3;29178:67;:::i;:::-;29171:74;;29254:93;29343:3;29254:93;:::i;:::-;29372:2;29367:3;29363:12;29356:19;;29015:366;;;:::o;29387:419::-;29553:4;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29387:419;;;:::o;29812:180::-;29860:77;29857:1;29850:88;29957:4;29954:1;29947:15;29981:4;29978:1;29971:15;29998:191;30038:3;30057:20;30075:1;30057:20;:::i;:::-;30052:25;;30091:20;30109:1;30091:20;:::i;:::-;30086:25;;30134:1;30131;30127:9;30120:16;;30155:3;30152:1;30149:10;30146:36;;;30162:18;;:::i;:::-;30146:36;29998:191;;;;:::o;30195:168::-;30335:20;30331:1;30323:6;30319:14;30312:44;30195:168;:::o;30369:366::-;30511:3;30532:67;30596:2;30591:3;30532:67;:::i;:::-;30525:74;;30608:93;30697:3;30608:93;:::i;:::-;30726:2;30721:3;30717:12;30710:19;;30369:366;;;:::o;30741:419::-;30907:4;30945:2;30934:9;30930:18;30922:26;;30994:9;30988:4;30984:20;30980:1;30969:9;30965:17;30958:47;31022:131;31148:4;31022:131;:::i;:::-;31014:139;;30741:419;;;:::o;31166:173::-;31306:25;31302:1;31294:6;31290:14;31283:49;31166:173;:::o;31345:366::-;31487:3;31508:67;31572:2;31567:3;31508:67;:::i;:::-;31501:74;;31584:93;31673:3;31584:93;:::i;:::-;31702:2;31697:3;31693:12;31686:19;;31345:366;;;:::o;31717:419::-;31883:4;31921:2;31910:9;31906:18;31898:26;;31970:9;31964:4;31960:20;31956:1;31945:9;31941:17;31934:47;31998:131;32124:4;31998:131;:::i;:::-;31990:139;;31717:419;;;:::o;32142:410::-;32182:7;32205:20;32223:1;32205:20;:::i;:::-;32200:25;;32239:20;32257:1;32239:20;:::i;:::-;32234:25;;32294:1;32291;32287:9;32316:30;32334:11;32316:30;:::i;:::-;32305:41;;32495:1;32486:7;32482:15;32479:1;32476:22;32456:1;32449:9;32429:83;32406:139;;32525:18;;:::i;:::-;32406:139;32190:362;32142:410;;;;:::o;32558:178::-;32698:30;32694:1;32686:6;32682:14;32675:54;32558:178;:::o;32742:366::-;32884:3;32905:67;32969:2;32964:3;32905:67;:::i;:::-;32898:74;;32981:93;33070:3;32981:93;:::i;:::-;33099:2;33094:3;33090:12;33083:19;;32742:366;;;:::o;33114:419::-;33280:4;33318:2;33307:9;33303:18;33295:26;;33367:9;33361:4;33357:20;33353:1;33342:9;33338:17;33331:47;33395:131;33521:4;33395:131;:::i;:::-;33387:139;;33114:419;;;:::o;33539:171::-;33679:23;33675:1;33667:6;33663:14;33656:47;33539:171;:::o;33716:366::-;33858:3;33879:67;33943:2;33938:3;33879:67;:::i;:::-;33872:74;;33955:93;34044:3;33955:93;:::i;:::-;34073:2;34068:3;34064:12;34057:19;;33716:366;;;:::o;34088:419::-;34254:4;34292:2;34281:9;34277:18;34269:26;;34341:9;34335:4;34331:20;34327:1;34316:9;34312:17;34305:47;34369:131;34495:4;34369:131;:::i;:::-;34361:139;;34088:419;;;:::o;34513:182::-;34653:34;34649:1;34641:6;34637:14;34630:58;34513:182;:::o;34701:366::-;34843:3;34864:67;34928:2;34923:3;34864:67;:::i;:::-;34857:74;;34940:93;35029:3;34940:93;:::i;:::-;35058:2;35053:3;35049:12;35042:19;;34701:366;;;:::o;35073:419::-;35239:4;35277:2;35266:9;35262:18;35254:26;;35326:9;35320:4;35316:20;35312:1;35301:9;35297:17;35290:47;35354:131;35480:4;35354:131;:::i;:::-;35346:139;;35073:419;;;:::o;35498:194::-;35538:4;35558:20;35576:1;35558:20;:::i;:::-;35553:25;;35592:20;35610:1;35592:20;:::i;:::-;35587:25;;35636:1;35633;35629:9;35621:17;;35660:1;35654:4;35651:11;35648:37;;;35665:18;;:::i;:::-;35648:37;35498:194;;;;:::o;35698:181::-;35838:33;35834:1;35826:6;35822:14;35815:57;35698:181;:::o;35885:366::-;36027:3;36048:67;36112:2;36107:3;36048:67;:::i;:::-;36041:74;;36124:93;36213:3;36124:93;:::i;:::-;36242:2;36237:3;36233:12;36226:19;;35885:366;;;:::o;36257:419::-;36423:4;36461:2;36450:9;36446:18;36438:26;;36510:9;36504:4;36500:20;36496:1;36485:9;36481:17;36474:47;36538:131;36664:4;36538:131;:::i;:::-;36530:139;;36257:419;;;:::o;36682:176::-;36822:28;36818:1;36810:6;36806:14;36799:52;36682:176;:::o;36864:366::-;37006:3;37027:67;37091:2;37086:3;37027:67;:::i;:::-;37020:74;;37103:93;37192:3;37103:93;:::i;:::-;37221:2;37216:3;37212:12;37205:19;;36864:366;;;:::o;37236:419::-;37402:4;37440:2;37429:9;37425:18;37417:26;;37489:9;37483:4;37479:20;37475:1;37464:9;37460:17;37453:47;37517:131;37643:4;37517:131;:::i;:::-;37509:139;;37236:419;;;:::o;37661:141::-;37710:4;37733:3;37725:11;;37756:3;37753:1;37746:14;37790:4;37787:1;37777:18;37769:26;;37661:141;;;:::o;37808:93::-;37845:6;37892:2;37887;37880:5;37876:14;37872:23;37862:33;;37808:93;;;:::o;37907:107::-;37951:8;38001:5;37995:4;37991:16;37970:37;;37907:107;;;;:::o;38020:393::-;38089:6;38139:1;38127:10;38123:18;38162:97;38192:66;38181:9;38162:97;:::i;:::-;38280:39;38310:8;38299:9;38280:39;:::i;:::-;38268:51;;38352:4;38348:9;38341:5;38337:21;38328:30;;38401:4;38391:8;38387:19;38380:5;38377:30;38367:40;;38096:317;;38020:393;;;;;:::o;38419:60::-;38447:3;38468:5;38461:12;;38419:60;;;:::o;38485:142::-;38535:9;38568:53;38586:34;38595:24;38613:5;38595:24;:::i;:::-;38586:34;:::i;:::-;38568:53;:::i;:::-;38555:66;;38485:142;;;:::o;38633:75::-;38676:3;38697:5;38690:12;;38633:75;;;:::o;38714:269::-;38824:39;38855:7;38824:39;:::i;:::-;38885:91;38934:41;38958:16;38934:41;:::i;:::-;38926:6;38919:4;38913:11;38885:91;:::i;:::-;38879:4;38872:105;38790:193;38714:269;;;:::o;38989:73::-;39034:3;38989:73;:::o;39068:189::-;39145:32;;:::i;:::-;39186:65;39244:6;39236;39230:4;39186:65;:::i;:::-;39121:136;39068:189;;:::o;39263:186::-;39323:120;39340:3;39333:5;39330:14;39323:120;;;39394:39;39431:1;39424:5;39394:39;:::i;:::-;39367:1;39360:5;39356:13;39347:22;;39323:120;;;39263:186;;:::o;39455:543::-;39556:2;39551:3;39548:11;39545:446;;;39590:38;39622:5;39590:38;:::i;:::-;39674:29;39692:10;39674:29;:::i;:::-;39664:8;39660:44;39857:2;39845:10;39842:18;39839:49;;;39878:8;39863:23;;39839:49;39901:80;39957:22;39975:3;39957:22;:::i;:::-;39947:8;39943:37;39930:11;39901:80;:::i;:::-;39560:431;;39545:446;39455:543;;;:::o;40004:117::-;40058:8;40108:5;40102:4;40098:16;40077:37;;40004:117;;;;:::o;40127:169::-;40171:6;40204:51;40252:1;40248:6;40240:5;40237:1;40233:13;40204:51;:::i;:::-;40200:56;40285:4;40279;40275:15;40265:25;;40178:118;40127:169;;;;:::o;40301:295::-;40377:4;40523:29;40548:3;40542:4;40523:29;:::i;:::-;40515:37;;40585:3;40582:1;40578:11;40572:4;40569:21;40561:29;;40301:295;;;;:::o;40601:1395::-;40718:37;40751:3;40718:37;:::i;:::-;40820:18;40812:6;40809:30;40806:56;;;40842:18;;:::i;:::-;40806:56;40886:38;40918:4;40912:11;40886:38;:::i;:::-;40971:67;41031:6;41023;41017:4;40971:67;:::i;:::-;41065:1;41089:4;41076:17;;41121:2;41113:6;41110:14;41138:1;41133:618;;;;41795:1;41812:6;41809:77;;;41861:9;41856:3;41852:19;41846:26;41837:35;;41809:77;41912:67;41972:6;41965:5;41912:67;:::i;:::-;41906:4;41899:81;41768:222;41103:887;;41133:618;41185:4;41181:9;41173:6;41169:22;41219:37;41251:4;41219:37;:::i;:::-;41278:1;41292:208;41306:7;41303:1;41300:14;41292:208;;;41385:9;41380:3;41376:19;41370:26;41362:6;41355:42;41436:1;41428:6;41424:14;41414:24;;41483:2;41472:9;41468:18;41455:31;;41329:4;41326:1;41322:12;41317:17;;41292:208;;;41528:6;41519:7;41516:19;41513:179;;;41586:9;41581:3;41577:19;41571:26;41629:48;41671:4;41663:6;41659:17;41648:9;41629:48;:::i;:::-;41621:6;41614:64;41536:156;41513:179;41738:1;41734;41726:6;41722:14;41718:22;41712:4;41705:36;41140:611;;;41103:887;;40693:1303;;;40601:1395;;:::o;42002:180::-;42050:77;42047:1;42040:88;42147:4;42144:1;42137:15;42171:4;42168:1;42161:15;42188:227;42328:34;42324:1;42316:6;42312:14;42305:58;42397:10;42392:2;42384:6;42380:15;42373:35;42188:227;:::o;42421:366::-;42563:3;42584:67;42648:2;42643:3;42584:67;:::i;:::-;42577:74;;42660:93;42749:3;42660:93;:::i;:::-;42778:2;42773:3;42769:12;42762:19;;42421:366;;;:::o;42793:419::-;42959:4;42997:2;42986:9;42982:18;42974:26;;43046:9;43040:4;43036:20;43032:1;43021:9;43017:17;43010:47;43074:131;43200:4;43074:131;:::i;:::-;43066:139;;42793:419;;;:::o;43218:181::-;43358:33;43354:1;43346:6;43342:14;43335:57;43218:181;:::o;43405:366::-;43547:3;43568:67;43632:2;43627:3;43568:67;:::i;:::-;43561:74;;43644:93;43733:3;43644:93;:::i;:::-;43762:2;43757:3;43753:12;43746:19;;43405:366;;;:::o;43777:419::-;43943:4;43981:2;43970:9;43966:18;43958:26;;44030:9;44024:4;44020:20;44016:1;44005:9;44001:17;43994:47;44058:131;44184:4;44058:131;:::i;:::-;44050:139;;43777:419;;;:::o;44202:180::-;44250:77;44247:1;44240:88;44347:4;44344:1;44337:15;44371:4;44368:1;44361:15;44388:185;44428:1;44445:20;44463:1;44445:20;:::i;:::-;44440:25;;44479:20;44497:1;44479:20;:::i;:::-;44474:25;;44518:1;44508:35;;44523:18;;:::i;:::-;44508:35;44565:1;44562;44558:9;44553:14;;44388:185;;;;:::o;44579:161::-;44719:13;44715:1;44707:6;44703:14;44696:37;44579:161;:::o;44746:366::-;44888:3;44909:67;44973:2;44968:3;44909:67;:::i;:::-;44902:74;;44985:93;45074:3;44985:93;:::i;:::-;45103:2;45098:3;45094:12;45087:19;;44746:366;;;:::o;45118:419::-;45284:4;45322:2;45311:9;45307:18;45299:26;;45371:9;45365:4;45361:20;45357:1;45346:9;45342:17;45335:47;45399:131;45525:4;45399:131;:::i;:::-;45391:139;;45118:419;;;:::o;45543:148::-;45645:11;45682:3;45667:18;;45543:148;;;;:::o;45697:390::-;45803:3;45831:39;45864:5;45831:39;:::i;:::-;45886:89;45968:6;45963:3;45886:89;:::i;:::-;45879:96;;45984:65;46042:6;46037:3;46030:4;46023:5;46019:16;45984:65;:::i;:::-;46074:6;46069:3;46065:16;46058:23;;45807:280;45697:390;;;;:::o;46093:435::-;46273:3;46295:95;46386:3;46377:6;46295:95;:::i;:::-;46288:102;;46407:95;46498:3;46489:6;46407:95;:::i;:::-;46400:102;;46519:3;46512:10;;46093:435;;;;;:::o;46534:225::-;46674:34;46670:1;46662:6;46658:14;46651:58;46743:8;46738:2;46730:6;46726:15;46719:33;46534:225;:::o;46765:366::-;46907:3;46928:67;46992:2;46987:3;46928:67;:::i;:::-;46921:74;;47004:93;47093:3;47004:93;:::i;:::-;47122:2;47117:3;47113:12;47106:19;;46765:366;;;:::o;47137:419::-;47303:4;47341:2;47330:9;47326:18;47318:26;;47390:9;47384:4;47380:20;47376:1;47365:9;47361:17;47354:47;47418:131;47544:4;47418:131;:::i;:::-;47410:139;;47137:419;;;:::o;47562:98::-;47613:6;47647:5;47641:12;47631:22;;47562:98;;;:::o;47666:168::-;47749:11;47783:6;47778:3;47771:19;47823:4;47818:3;47814:14;47799:29;;47666:168;;;;:::o;47840:373::-;47926:3;47954:38;47986:5;47954:38;:::i;:::-;48008:70;48071:6;48066:3;48008:70;:::i;:::-;48001:77;;48087:65;48145:6;48140:3;48133:4;48126:5;48122:16;48087:65;:::i;:::-;48177:29;48199:6;48177:29;:::i;:::-;48172:3;48168:39;48161:46;;47930:283;47840:373;;;;:::o;48219:640::-;48414:4;48452:3;48441:9;48437:19;48429:27;;48466:71;48534:1;48523:9;48519:17;48510:6;48466:71;:::i;:::-;48547:72;48615:2;48604:9;48600:18;48591:6;48547:72;:::i;:::-;48629;48697:2;48686:9;48682:18;48673:6;48629:72;:::i;:::-;48748:9;48742:4;48738:20;48733:2;48722:9;48718:18;48711:48;48776:76;48847:4;48838:6;48776:76;:::i;:::-;48768:84;;48219:640;;;;;;;:::o;48865:141::-;48921:5;48952:6;48946:13;48937:22;;48968:32;48994:5;48968:32;:::i;:::-;48865:141;;;;:::o;49012:349::-;49081:6;49130:2;49118:9;49109:7;49105:23;49101:32;49098:119;;;49136:79;;:::i;:::-;49098:119;49256:1;49281:63;49336:7;49327:6;49316:9;49312:22;49281:63;:::i;:::-;49271:73;;49227:127;49012:349;;;;:::o;49367:233::-;49406:3;49429:24;49447:5;49429:24;:::i;:::-;49420:33;;49475:66;49468:5;49465:77;49462:103;;49545:18;;:::i;:::-;49462:103;49592:1;49585:5;49581:13;49574:20;;49367:233;;;:::o

Swarm Source

ipfs://324637c96e95dc27ba8df438f1c29d2379f29a7ad65886dfc09d0c4c0f2d08e7
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.