Token Chad Sports

Overview ERC1155

Total Supply:
0 CHADS

Holders:
63 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ChadSports

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 20: ChadSportsMint.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**

  ________              __   _____                  __      
  / ____/ /_  ____ _____/ /  / ___/____  ____  _____/ /______
 / /   / __ \/ __ `/ __  /   \__ \/ __ \/ __ \/ ___/ __/ ___/
/ /___/ / / / /_/ / /_/ /   ___/ / /_/ / /_/ / /  / /_(__  ) 
\____/_/ /_/\__,_/\__,_/   /____/ .___/\____/_/   \__/____/  
                               /_/                           


*/

// OpenZeppelin
import "./ERC1155.sol";
import "./ERC1155Supply.sol";
import "./IERC721.sol";
import "./IERC2981.sol";
import "./Ownable.sol";
import "./Strings.sol";
import "./ReentrancyGuard.sol";

// Chainlink
import "./VRFCoordinatorV2Interface.sol";
import "./VRFConsumerBaseV2.sol";

// Raffle
import "./IRaffle.sol";

// Utils functions
import "./Utils.sol";

/// @title Chad Sports Minting.
/// @author Memepanze
/** @notice ERC1155 Minting contract for Chad Sports.
* - Minting: The contract allows to mint specific Teams (1 or 4 ERC1155 tokenId(s)) or to mint randomly Teams (1 or 4 ERC1155 tokenId(s))
* - The randomness is powered by Chainlink VRF.
* There is no maximum supply, however the minting period is 24h.
* - Discount: There are two types of Discount Price: normal discount and Chad discount.
* -- Normal Discount: For that feature we will allow the holders addresses of collection that we partner with + addresses that participate to the whitelisting process on social media and website.
* -- Normal Discount benefits: a discount price to mint Teams during the minting period.
* -- Chad Discount: Only the 32 hodlers of the unique Chad collection (1:1) can be part of the ChadList
* -- Chad Discount Benefits: The 32 hodlers can freemint 4 teams of their choice only one time.
*/

contract ChadSports is ERC1155, ERC1155Supply, IERC2981, ReentrancyGuard, VRFConsumerBaseV2, Ownable {
    using Strings for uint256;

    // vrf coordinator {addres} Avalanche Fuji 0x2eD832Ba664535e5886b75D64C46EB9a228C2610
    // vrf coordinator {addres} Avalanche Mainnet 0xd5D517aBE5cF79B7e95eC98dB0f0277788aFF634
    constructor(uint64 _vrfSubId, address _vrfCoordinator, bytes32 _keyHash) ERC1155("")
        VRFConsumerBaseV2(_vrfCoordinator)
        {
        name = "Chad Sports";
        symbol = "CHADS";
        _uriBase = "ipfs://bafybeia3m4w3xcif7bs3g35mgphgnwrouguny36so6f57hziw3gobstpty/"; // IPFS base for ChadSports collection

        mintPrice = 1.9 ether;
        discountMintPrice = 1.5 ether;

        mintBatchPrice = 4.5 ether;
        discountMintBatchPrice = 3 ether;

        mintRandomPrice = 0.75 ether;
        discountMintRandomPrice = 0.5 ether;

        mintBatchRandomPrice = 3 ether;
        discountMintBatchRandomPrice = 1.5 ether;
        
        // Avalanche Fuji 0x354d2f95da55398f44b7cff77da56283d9c6c829a4bdf1bbcaf2ad6a4d081f61
        // Avalanche Mainnet 0x89630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46
        keyHash = _keyHash;
        s_subscriptionId = _vrfSubId;
        vrfCoordinator = _vrfCoordinator;
    }

    /// @notice The Name of collection 
    string public name;
    /// @notice The Symbol of collection 
    string public symbol;
    /// @notice The URI Base for the metadata of the collection 
    string public _uriBase;

    /// @notice The start date for the minting
    /// @dev for the 2022 world cup 1668877200
    uint public startDate;

    /// @notice The end date for the minting
    /// @dev for the 2022 world cup 1668952800
    uint public endDate;

    /// @notice The address of the Raffle contract 
    address public raffle;

    /// @notice The struct used for the 1:1 hodlers 
    struct chadState {
        bool isAuthorized;
        bool hasMint;
    }

    /// @notice The minting state of each 1:1 hodler 
    mapping(address => chadState) public chadlist;
    
    /// @notice The authorization to mint with discount price for each address
    mapping(address => bool) public discountlist;

    /// @notice The struct used for the VRF requests
    struct RequestStatus {
        address sender; // msg.sender of the request
        bool fulfilled; // whether the request has been successfully fulfilled
        bool exists; // whether a requestId exists
    }

    /// @notice The request status for each request ID (Chainlink VRF)
    mapping(uint256 => RequestStatus) public s_requests; /* requestId --> requestStatus */
    // VRFCoordinatorV2Interface COORDINATOR;

    /// @notice The vrf coordinator address
    address vrfCoordinator;
    /// @notice The subscription ID (Chainlink VRF)
    uint64 s_subscriptionId;

    /// @notice The past resquests Id (Chainlink VRF)
    uint256[] public requestIds;
    /// @notice The last resquest Id (Chainlink VRF)
    uint256 public lastRequestId;

    /** @notice The gas lane to use, which specifies the maximum gas price to bump to.
      * For a list of available gas lanes on each network,
      * see https://docs.chain.link/docs/vrf/v2/subscription/supported-networks/#configurations
      */
    bytes32 keyHash;

    /** @notice Depends on the number of requested values that you want sent to the
      * fulfillRandomWords() function. Storing each word costs about 20,000 gas,
      * so 100,000 is a safe default for this example contract. Test and adjust
      * this limit based on the network that you select, the size of the request,
      * and the processing of the callback request in the fulfillRandomWords()
      * function.
      */
    uint32 callbackGasLimit = 500000;

    /// @notice The number of block confirmation, the default is 3, but it can be set this higher.
    uint16 requestConfirmations = 3;

    /// @notice The number of random numbers to request. 
    /// @dev Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS.
    uint32 numWordsSingle = 1;
    uint32 numWordsBatch = 4;

    /// @notice royalties recipient address
    address public _recipient;

    /// @notice The standard mint price for single specific mint
    uint internal mintPrice;
    /// @notice The discount mint price for single specific mint
    uint internal discountMintPrice;

    /// @notice The standard mint price for batch specific mint
    uint internal mintBatchPrice;
    /// @notice The discount mint price for batch specific mint
    uint internal discountMintBatchPrice;

    /// @notice The standard mint price for single random mint
    uint internal mintRandomPrice;
    /// @notice The discount mint price for single random mint
    uint internal discountMintRandomPrice;

    /// @notice The standard mint price for batch random mint
    uint internal mintBatchRandomPrice;
    /// @notice The discount mint price for batch random mint
    uint internal discountMintBatchRandomPrice;

    /// @notice Emitted on mintRandom()
    /// @param requestId The request id for the VRF request
    /// @param numWords number of random numbers requested
    event RequestSent(uint256 requestId, uint32 numWords);
    /// @notice Emitted on fulfillRandomWords()
    /// @param requestId The request id for the VRF fulfilled request
    /// @param randomWords number of random numbers requested
    event RequestFulfilled(uint256 requestId, uint256[] randomWords);

    /// @notice Emitted on withdrawBalance() 
    event BalanceWithdraw(address to, uint amount);

    // E R R O R S

    error Chad__Unauthorized();

    error Chad__NotInTheMitingPeriod();

    error Chad__TransferFailed();

    // M O D I F I E R S
    
    /// @notice Check if the minter is an externally owned account
    modifier isEOA() {
        if (tx.origin != msg.sender) {
            revert Chad__Unauthorized();
        }
        _;
    }

    /**
    * @dev Modifier to set the minting price for the specific mint functions
    * @param _ids The NFT ids to mint
    */
    modifier payableMint(uint[] memory _ids) {
        require(block.timestamp >= startDate && block.timestamp <= endDate);
        if(_ids.length > 1){
            if(discountlist[msg.sender]){
                require(msg.value >= discountMintBatchPrice);
            } else if(chadlist[msg.sender].isAuthorized) {
                require(!chadlist[msg.sender].hasMint);
                chadlist[msg.sender].hasMint = true;
            } else{
                require(msg.value >= mintBatchPrice);
            }
        } else {
            if(discountlist[msg.sender]){
                require(msg.value >= discountMintPrice);
            } else {
                require(msg.value >= mintPrice);
            }
        }
        _;
    }

    /**
    * @dev Modifier to set the minting price for the random mint functions
    * @param _number The number of NFTs to mint
    */
    modifier payableRandomMint(uint _number) {
        if(block.timestamp >= startDate && block.timestamp <= endDate){
            if(_number == 1){
                if(discountlist[msg.sender]){
                    require(msg.value >= discountMintRandomPrice);
                } else {
                    require(msg.value >= mintRandomPrice);
                }
            } else {
                if(discountlist[msg.sender]){
                    require(msg.value >= discountMintBatchRandomPrice);
                } else{
                    require(msg.value >= mintBatchRandomPrice);
                }
            }
        } else {
            revert Chad__NotInTheMitingPeriod();
        }
        _;
    }

    /// @notice Update VRF config.
    function setVRFConfig(uint64 _vrfSubId, bytes32 _keyHash) external onlyOwner {
        keyHash = _keyHash;
        s_subscriptionId = _vrfSubId;
    }

    /// @notice Set the start date (timestamp) for the minting.
    function setStartDate(uint _date) external onlyOwner {
        startDate = _date;
    }

    /// @notice Set the end date (timestamp) for the minting.
    function setEndDate(uint _date) external onlyOwner {
        endDate = _date;
    }

    /// @notice Set the new base URI for the collection.
    function setUriBase(string memory _newUriBase) external onlyOwner {
        _uriBase = _newUriBase;
    }

    /// @notice URI override for OpenSea traits compatibility.
    function uri(uint256 tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(_uriBase, tokenId.toString(), ".json"));
    }

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    /// @notice Admin function to change the VRF subscription ID
    function changeSubscriptionVRF(uint64 _sub) external onlyOwner {
        s_subscriptionId = _sub;
    }

    /// @notice Set the Raffle contract address.
    function setRaffleContract(address _addr) external onlyOwner {
        raffle = _addr;
    }

    // D I S C O U N T

    /// @notice Set the authorization for discount price for each address.
    /// @param _addresses An array of addresses to set authorization.
    function addDiscountlist(address[] calldata _addresses) external onlyOwner {
        for(uint i; i < _addresses.length; i++){
            discountlist[_addresses[i]] = true;
        }
    }

    /// @notice Set the authorization for freemint for each 1:1 Holders.
    /// @param _addresses An array of addresses to set authorization.
    function addChadlist(address[] calldata _addresses) external onlyOwner {
        for(uint i; i < _addresses.length; i++){
            chadlist[_addresses[i]].isAuthorized = true;
        }
    }

    // M I N T

    /// @notice Mint specific tokenIDs.
    /// @param _ids An array of the tokenIDs to mint.
    /// @dev the array must contain 1 or 4 values
    /// @dev the tokenIds are from 1 to 32
    function mint(uint[] memory _ids) public payable nonReentrant isEOA
        payableMint(_ids) {
        if(_ids.length > 1){
            require(_ids.length == 4);

            uint[] memory amount = new uint[](4);
            amount[0] = 1;
            amount[1] = 1;
            amount[2] = 1;
            amount[3] = 1;

            _mintBatch(msg.sender, _ids, amount, "");
        } else {
            _mint(msg.sender, _ids[0], 1, "");
        }
        IRaffle(raffle).incrementMinters(msg.sender);
    }

    /// @notice Store the address of each random minters to be used in the callback function for the Raffle contract interface.
    mapping (uint => address) randomMinters;

    /// @notice Function to request random numbers.
    /// @param _numberOfNFTs The number of NFTs to mint.
    /// @dev Call Chainlink VRF to request random numbers and callback fulfillRandomWords.
    /// @dev Assumes the subscription is funded sufficiently.
    /// @return requestId
    function mintRandom(uint _numberOfNFTs) external payable nonReentrant isEOA 
        payableRandomMint(_numberOfNFTs) returns (uint256 requestId) {
        // Will revert if subscription is not set and funded.
        requestId = VRFCoordinatorV2Interface(vrfCoordinator).requestRandomWords(
            keyHash,
            s_subscriptionId,
            requestConfirmations,
            callbackGasLimit,
            _numberOfNFTs == 1 ? numWordsSingle : numWordsBatch
        );
        s_requests[requestId] = RequestStatus({exists: true, fulfilled: false, sender: msg.sender});
        requestIds.push(requestId);
        lastRequestId = requestId;
        if(_numberOfNFTs == 1){
            emit RequestSent(requestId, numWordsSingle);
        } else {
            emit RequestSent(requestId, numWordsBatch);
        }
        randomMinters[requestId] = msg.sender;
        return requestId;
    }

    /**
    * @notice Callback function called by the Chainlink Oracle with the array 
    * containing the random numbers to mint the ERC1155 tokens.
    * @dev if the number of random numbers is higher than 1, the myRandNum array 
    * must contain unique numbers to prevent the minting of similar tokenIDs 
    * for the user.
    */
    function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal override {
        require(s_requests[_requestId].exists);

        uint[] memory myRandNum = new uint[](4);

        if(_randomWords.length>1){
            for(uint i=0; i<_randomWords.length; i++){
                uint j;
                // The contract start the tokenId at 0 so the mximum tokenId is 31
                uint randnum = _randomWords[i] % 32;
                // checks to get unique random numbers in the myRandNum array
                if(randnum < 30){
                    while(Utils.indexOf(myRandNum, ((randnum) + 2*j)) > -1){
                        j++;
                    }
                    myRandNum[i] = (randnum) + 2*j;
                } else {
                    while(Utils.indexOf(myRandNum, ((randnum) - 2*j)) > -1){
                        j++;
                    }
                    myRandNum[i] = (randnum) - 2*j;
                }
            }

            uint[] memory ids = new uint[](4);
            ids[0] = myRandNum[0];
            ids[1] = myRandNum[1];
            ids[2] = myRandNum[2];
            ids[3] = myRandNum[3];
            
            uint[] memory amounts = new uint[](4);
            amounts[0] = 1;
            amounts[1] = 1;
            amounts[2] = 1;
            amounts[3] = 1;

            _mintBatch(s_requests[_requestId].sender, ids, amounts, "");
        } else {
            uint r = Utils.randomNum(101);
            if(r>=20){
                // tokenId start at 0
                myRandNum[0] = _randomWords[0] % 20;
            } else if (r<20 && r>=5){
                myRandNum[0] = (_randomWords[0] % 10) + 20;
            } else {
                // until tokenId 31
                myRandNum[0] = (_randomWords[0] % 2) + 30;
            }
            _mint(s_requests[_requestId].sender, myRandNum[0], 1, "");
        }
        // Push the address of the minter in the Raffle Index
        IRaffle(raffle).incrementMinters(randomMinters[_requestId]);

        emit RequestFulfilled(_requestId, _randomWords);
    }

    /// @notice Withdraw the contract balance to the contract owner
    /// @param _to Recipient of the withdrawal
    function withdrawBalance(address _to) external onlyOwner nonReentrant {
        uint amount = address(this).balance;
        bool sent;

        (sent, ) = _to.call{value: amount}("");
        if (!sent) {
            revert Chad__TransferFailed();
        }

        emit BalanceWithdraw(_to, amount);
    }

    // R O Y A L T I E S

    /// @dev Royalties implementation.

    /**
     * @dev EIP2981 royalties implementation: set the recepient of the royalties fee to 'newRecepient'
     * Maintain flexibility to modify royalties recipient (could also add basis points).
     *
     * Requirements:
     *
     * - `newRecepient` cannot be the zero address.
     */

    function _setRoyalties(address newRecipient) internal {
        require(newRecipient != address(0));
        _recipient = newRecipient;
    }

    function setRoyalties(address newRecipient) external onlyOwner {
        _setRoyalties(newRecipient);
    }

    // EIP2981 standard royalties return.
    function royaltyInfo(uint256 _salePrice) external view override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (_recipient, (_salePrice * 6) / 100);
    }

    // EIP2981 standard Interface return. Adds to ERC1155 and ERC165 Interface returns.
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, IERC165)
        returns (bool)
    {
        return (
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId)
        );
    }
}

File 1 of 20: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

File 4 of 20: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 5 of 20: ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 7 of 20: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 8 of 20: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 9 of 20: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

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

pragma solidity ^0.8.0;

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

File 11 of 20: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 12 of 20: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

    /**
     * @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 have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

File 13 of 20: IRaffle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IRaffle {
    function incrementMinters(address _minter) external;
}

File 14 of 20: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 15 of 20: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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

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 making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 17 of 20: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 18 of 20: Utils.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library Utils {
    function getRandomTier() internal view returns(uint){
        uint num;
        uint a = randomNum(101);

        if(a>=20){
            num = 0;
        } else if (a<20 && a>=5){
            num = 1;
        } else {
            num = 2;
        }

        return num;
    }

    function indexOf(uint256[] memory arr, uint256 searchFor) internal pure returns (int256) {
        for (uint256 i = 0; i < arr.length; i++) {
            if (arr[i] == searchFor) {
                return int(i);
            }
        }
        return -1; // not found
    }

    function indexOfAddresses(address[] memory arr, address searchFor) internal pure returns (int256) {
        for (uint256 i = 0; i < arr.length; i++) {
            if (arr[i] == searchFor) {
                return int(i);
            }
        }
        return -1; // not found
    }

    function randomNum(uint _mod) internal view returns(uint){
        uint rand;
        rand = uint(keccak256(
           abi.encodePacked(
               block.timestamp, 
               block.difficulty, 
               msg.sender)
            )
        ) % _mod;
        return rand;
    }
}

File 19 of 20: VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

File 20 of 20: VRFCoordinatorV2Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;

  /*
   * @notice Check to see if there exists a request commitment consumers
   * for all consumers and keyhashes for a given sub.
   * @param subId - ID of the subscription
   * @return true if there exists at least one unfulfilled request for the subscription, false
   * otherwise.
   */
  function pendingRequestExists(uint64 subId) external view returns (bool);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint64","name":"_vrfSubId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinator","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Chad__NotInTheMitingPeriod","type":"error"},{"inputs":[],"name":"Chad__TransferFailed","type":"error"},{"inputs":[],"name":"Chad__Unauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceWithdraw","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":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"RequestFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"numWords","type":"uint32"}],"name":"RequestSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"_recipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uriBase","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addChadlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addDiscountlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"chadlist","outputs":[{"internalType":"bool","name":"isAuthorized","type":"bool"},{"internalType":"bool","name":"hasMint","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_sub","type":"uint64"}],"name":"changeSubscriptionVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"discountlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfNFTs","type":"uint256"}],"name":"mintRandom","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_requests","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"fulfilled","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_date","type":"uint256"}],"name":"setEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setRaffleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_date","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUriBase","type":"string"}],"name":"setUriBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_vrfSubId","type":"uint64"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"name":"setVRFConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526207a120601360006101000a81548163ffffffff021916908363ffffffff1602179055506003601360046101000a81548161ffff021916908361ffff1602179055506001601360066101000a81548163ffffffff021916908363ffffffff16021790555060046013600a6101000a81548163ffffffff021916908363ffffffff1602179055503480156200009757600080fd5b5060405162006676380380620066768339818101604052810190620000bd9190620004b5565b8160405180602001604052806000815250620000df81620002e860201b60201c565b5060016004819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200013d62000131620002fd60201b60201c565b6200030560201b60201c565b6040518060400160405280600b81526020017f436861642053706f727473000000000000000000000000000000000000000000815250600690816200018391906200078b565b506040518060400160405280600581526020017f434841445300000000000000000000000000000000000000000000000000000081525060079081620001ca91906200078b565b50604051806080016040528060438152602001620066336043913960089081620001f591906200078b565b50671a5e27eef13e00006015819055506714d1120d7b160000601681905550673e733628714200006017819055506729a2241af62c0000601881905550670a688906bd8b00006019819055506706f05b59d3b20000601a819055506729a2241af62c0000601b819055506714d1120d7b160000601c819055508060128190555082600f60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000872565b8060029081620002f991906200078b565b5050565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600067ffffffffffffffff82169050919050565b620003ef81620003d0565b8114620003fb57600080fd5b50565b6000815190506200040f81620003e4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004428262000415565b9050919050565b620004548162000435565b81146200046057600080fd5b50565b600081519050620004748162000449565b92915050565b6000819050919050565b6200048f816200047a565b81146200049b57600080fd5b50565b600081519050620004af8162000484565b92915050565b600080600060608486031215620004d157620004d0620003cb565b5b6000620004e186828701620003fe565b9350506020620004f48682870162000463565b925050604062000507868287016200049e565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200059357607f821691505b602082108103620005a957620005a86200054b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005d4565b6200061f8683620005d4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200066c62000666620006608462000637565b62000641565b62000637565b9050919050565b6000819050919050565b62000688836200064b565b620006a0620006978262000673565b848454620005e1565b825550505050565b600090565b620006b7620006a8565b620006c48184846200067d565b505050565b5b81811015620006ec57620006e0600082620006ad565b600181019050620006ca565b5050565b601f8211156200073b576200070581620005af565b6200071084620005c4565b8101602085101562000720578190505b620007386200072f85620005c4565b830182620006c9565b50505b505050565b600082821c905092915050565b6000620007606000198460080262000740565b1980831691505092915050565b60006200077b83836200074d565b9150826002028217905092915050565b620007968262000511565b67ffffffffffffffff811115620007b257620007b16200051c565b5b620007be82546200057a565b620007cb828285620006f0565b600060209050601f831160018114620008035760008415620007ee578287015190505b620007fa85826200076d565b8655506200086a565b601f1984166200081386620005af565b60005b828110156200083d5784890151825560018201915060208501945060208101905062000816565b868310156200085d578489015162000859601f8916826200074d565b8355505b6001600288020188555050505b505050505050565b608051615d9e620008956000396000818161108f01526110e30152615d9e6000f3fe60806040526004361061022e5760003560e01c80637943c0511161012e578063c24a0f8b116100ab578063f242432a1161006f578063f242432a1461089e578063f2fde38b146108c7578063f75bb9a4146108f0578063f8e93ef914610919578063fc2a88c3146109355761022e565b8063c24a0f8b14610790578063cef6d368146107bb578063d4cca5f1146107f9578063e1101e1e14610824578063e985e9c5146108615761022e565b806395d89b41116100f257806395d89b4114610695578063a168fa89146106c0578063a22cb465146106ff578063b5d2709c14610728578063bd85b039146107535761022e565b80637943c0511461059d57806382ab4628146105c657806382d95df5146106045780638796ba8c1461062d5780638da5cb5b1461066a5761022e565b80632a9e63c6116101bc5780634e1273f4116101805780634e1273f4146104ba5780634f558e79146104f757806366557cf614610534578063715018a61461055d578063756af45f146105745761022e565b80632a9e63c6146103eb5780632eb2c2d61461041457806333c1420a1461043d5780633784f0001461046857806339165520146104915761022e565b80630b97bc86116102035780630b97bc86146103015780630d5169971461032c5780630e89341c1461035c5780631fe543e31461039957806327fc0cff146103c25761022e565b806256c08414610233578062fdd58e1461025c57806301ffc9a71461029957806306fdde03146102d6575b600080fd5b34801561023f57600080fd5b5061025a60048036038101906102559190613e8c565b610960565b005b34801561026857600080fd5b50610283600480360381019061027e9190613eef565b6109ac565b6040516102909190613f3e565b60405180910390f35b3480156102a557600080fd5b506102c060048036038101906102bb9190613fb1565b610a74565b6040516102cd9190613ff9565b60405180910390f35b3480156102e257600080fd5b506102eb610aee565b6040516102f891906140a4565b60405180910390f35b34801561030d57600080fd5b50610316610b7c565b6040516103239190613f3e565b60405180910390f35b610346600480360381019061034191906140c6565b610b82565b6040516103539190613f3e565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e91906140c6565b611059565b60405161039091906140a4565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb919061423b565b61108d565b005b3480156103ce57600080fd5b506103e960048036038101906103e4919061434c565b61114d565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613e8c565b611168565b005b34801561042057600080fd5b5061043b60048036038101906104369190614436565b61117c565b005b34801561044957600080fd5b5061045261121d565b60405161045f9190614514565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906140c6565b611243565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061458a565b611255565b005b3480156104c657600080fd5b506104e160048036038101906104dc919061469a565b611302565b6040516104ee91906147d0565b60405180910390f35b34801561050357600080fd5b5061051e600480360381019061051991906140c6565b61141b565b60405161052b9190613ff9565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190614832565b61142f565b005b34801561056957600080fd5b50610572611463565b005b34801561058057600080fd5b5061059b60048036038101906105969190613e8c565b611477565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190614895565b611577565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613e8c565b6115b3565b6040516105fb9291906148d5565b60405180910390f35b34801561061057600080fd5b5061062b600480360381019061062691906140c6565b6115f1565b005b34801561063957600080fd5b50610654600480360381019061064f91906140c6565b611603565b6040516106619190613f3e565b60405180910390f35b34801561067657600080fd5b5061067f611627565b60405161068c9190614514565b60405180910390f35b3480156106a157600080fd5b506106aa611651565b6040516106b791906140a4565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e291906140c6565b6116df565b6040516106f6939291906148fe565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190614961565b611743565b005b34801561073457600080fd5b5061073d611759565b60405161074a91906140a4565b60405180910390f35b34801561075f57600080fd5b5061077a600480360381019061077591906140c6565b6117e7565b6040516107879190613f3e565b60405180910390f35b34801561079c57600080fd5b506107a5611804565b6040516107b29190613f3e565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd91906140c6565b61180a565b6040516107f09291906149a1565b60405180910390f35b34801561080557600080fd5b5061080e611852565b60405161081b9190614514565b60405180910390f35b34801561083057600080fd5b5061084b60048036038101906108469190613e8c565b611878565b6040516108589190613ff9565b60405180910390f35b34801561086d57600080fd5b50610888600480360381019061088391906149ca565b611898565b6040516108959190613ff9565b60405180910390f35b3480156108aa57600080fd5b506108c560048036038101906108c09190614a0a565b61192c565b005b3480156108d357600080fd5b506108ee60048036038101906108e99190613e8c565b6119cd565b005b3480156108fc57600080fd5b506109176004803603810190610912919061458a565b611a50565b005b610933600480360381019061092e9190614aa1565b611b00565b005b34801561094157600080fd5b5061094a611f77565b6040516109579190613f3e565b60405180910390f35b610968611f7d565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390614b5c565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fcef6d368000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae75750610ae682611ffb565b5b9050919050565b60068054610afb90614bab565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2790614bab565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b505050505081565b60095481565b6000610b8c6120dd565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610bf1576040517f56b9338500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816009544210158015610c065750600a544211155b15610d0a5760018103610c8e57600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610c7957601a54341015610c7457600080fd5b610c89565b601954341015610c8857600080fd5b5b610d05565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cf457601c54341015610cef57600080fd5b610d04565b601b54341015610d0357600080fd5b5b5b610d3c565b6040517f806cb10d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30601254600f60149054906101000a900467ffffffffffffffff16601360049054906101000a900461ffff16601360009054906101000a900463ffffffff1660018914610dd8576013600a9054906101000a900463ffffffff16610dec565b601360069054906101000a900463ffffffff165b6040518663ffffffff1660e01b8152600401610e0c959493929190614c36565b6020604051808303816000875af1158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190614c9e565b915060405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815260200160011515815250600e600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160000160156101000a81548160ff02191690831515021790555090505060108290806001815401808255809150506001900390600052602060002001600090919091909150558160118190555060018303610fad577fcc58b13ad3eab50626c6a6300b1d139cd6ebb1688a7cced9461c2f7e762665ee82601360069054906101000a900463ffffffff16604051610fa0929190614ccb565b60405180910390a1610ff9565b7fcc58b13ad3eab50626c6a6300b1d139cd6ebb1688a7cced9461c2f7e762665ee826013600a9054906101000a900463ffffffff16604051610ff0929190614ccb565b60405180910390a15b33601d600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061105461212c565b919050565b6060600861106683612136565b604051602001611077929190614e14565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461113f57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401611136929190614e43565b60405180910390fd5b6111498282612204565b5050565b611155611f7d565b80600890816111649190615003565b5050565b611170611f7d565b6111798161290d565b50565b61118461298a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111ca57506111c9856111c461298a565b611898565b5b611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090615147565b60405180910390fd5b6112168585858585612992565b5050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61124b611f7d565b80600a8190555050565b61125d611f7d565b60005b828290508110156112fd576001600d600085858581811061128457611283615167565b5b90506020020160208101906112999190613e8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806112f5906151c5565b915050611260565b505050565b60608151835114611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f9061527f565b60405180910390fd5b6000835167ffffffffffffffff811115611365576113646140f8565b5b6040519080825280602002602001820160405280156113935781602001602082028036833780820191505090505b50905060005b8451811015611410576113e08582815181106113b8576113b7615167565b5b60200260200101518583815181106113d3576113d2615167565b5b60200260200101516109ac565b8282815181106113f3576113f2615167565b5b60200260200101818152505080611409906151c5565b9050611399565b508091505092915050565b600080611427836117e7565b119050919050565b611437611f7d565b80600f60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b61146b611f7d565b6114756000612cb3565b565b61147f611f7d565b6114876120dd565b600047905060008273ffffffffffffffffffffffffffffffffffffffff16826040516114b2906152d0565b60006040518083038185875af1925050503d80600081146114ef576040519150601f19603f3d011682016040523d82523d6000602084013e6114f4565b606091505b50508091505080611531576040517faf67691e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f8777844761eb456b028cf7f87fc8dcb146ad8eeafbc6f80f2d006e5cd9e5a74583836040516115629291906149a1565b60405180910390a1505061157461212c565b50565b61157f611f7d565b8060128190555081600f60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b600c6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16905082565b6115f9611f7d565b8060098190555050565b6010818154811061161357600080fd5b906000526020600020016000915090505481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6007805461165e90614bab565b80601f016020809104026020016040519081016040528092919081815260200182805461168a90614bab565b80156116d75780601f106116ac576101008083540402835291602001916116d7565b820191906000526020600020905b8154815290600101906020018083116116ba57829003601f168201915b505050505081565b600e6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060000160159054906101000a900460ff16905083565b61175561174e61298a565b8383612d79565b5050565b6008805461176690614bab565b80601f016020809104026020016040519081016040528092919081815260200182805461179290614bab565b80156117df5780601f106117b4576101008083540402835291602001916117df565b820191906000526020600020905b8154815290600101906020018083116117c257829003601f168201915b505050505081565b600060036000838152602001908152602001600020549050919050565b600a5481565b600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606460068561183f91906152e5565b6118499190615356565b91509150915091565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61193461298a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061197a57506119798561197461298a565b611898565b5b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090615147565b60405180910390fd5b6119c68585858585612ee5565b5050505050565b6119d5611f7d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b906153f9565b60405180910390fd5b611a4d81612cb3565b50565b611a58611f7d565b60005b82829050811015611afb576001600c6000858585818110611a7f57611a7e615167565b5b9050602002016020810190611a949190613e8c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508080611af3906151c5565b915050611a5b565b505050565b611b086120dd565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f56b9338500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806009544210158015611b825750600a544211155b611b8b57600080fd5b600181511115611d2057600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611bfb57601854341015611bf657600080fd5b611d1b565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615611d0a57600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1615611caa57600080fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff021916908315150217905550611d1a565b601754341015611d1957600080fd5b5b5b611d97565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d8657601654341015611d8157600080fd5b611d96565b601554341015611d9557600080fd5b5b5b600182511115611ea6576004825114611daf57600080fd5b6000600467ffffffffffffffff811115611dcc57611dcb6140f8565b5b604051908082528060200260200182016040528015611dfa5781602001602082028036833780820191505090505b509050600181600081518110611e1357611e12615167565b5b602002602001018181525050600181600181518110611e3557611e34615167565b5b602002602001018181525050600181600281518110611e5757611e56615167565b5b602002602001018181525050600181600381518110611e7957611e78615167565b5b602002602001018181525050611ea033848360405180602001604052806000815250613180565b50611ede565b611edd3383600081518110611ebe57611ebd615167565b5b60200260200101516001604051806020016040528060008152506133ac565b5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166375936157336040518263ffffffff1660e01b8152600401611f399190614514565b600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b5050505050611f7461212c565b50565b60115481565b611f8561298a565b73ffffffffffffffffffffffffffffffffffffffff16611fa3611627565b73ffffffffffffffffffffffffffffffffffffffff1614611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090615465565b60405180910390fd5b565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806120c657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120d657506120d58261355c565b5b9050919050565b600260045403612122576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612119906154d1565b60405180910390fd5b6002600481905550565b6001600481905550565b606060006001612145846135c6565b01905060008167ffffffffffffffff811115612164576121636140f8565b5b6040519080825280601f01601f1916602001820160405280156121965781602001600182028036833780820191505090505b509050600082602001820190505b6001156121f9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816121ed576121ec615327565b5b049450600085036121a4575b819350505050919050565b600e600083815260200190815260200160002060000160159054906101000a900460ff1661223157600080fd5b6000600467ffffffffffffffff81111561224e5761224d6140f8565b5b60405190808252806020026020018201604052801561227c5781602001602082028036833780820191505090505b5090506001825111156126785760005b825181101561240b5760008060208584815181106122ad576122ac615167565b5b60200260200101516122bf91906154f1565b9050601e811015612362575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61230d858460026122fd91906152e5565b846123089190615522565b613719565b131561232657818061231e906151c5565b9250506122cb565b81600261233391906152e5565b8161233e9190615522565b84848151811061235157612350615167565b5b6020026020010181815250506123f6565b5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6123a58584600261239591906152e5565b846123a09190615556565b613719565b13156123be5781806123b6906151c5565b925050612363565b8160026123cb91906152e5565b816123d69190615556565b8484815181106123e9576123e8615167565b5b6020026020010181815250505b50508080612403906151c5565b91505061228c565b506000600467ffffffffffffffff811115612429576124286140f8565b5b6040519080825280602002602001820160405280156124575781602001602082028036833780820191505090505b5090508160008151811061246e5761246d615167565b5b60200260200101518160008151811061248a57612489615167565b5b602002602001018181525050816001815181106124aa576124a9615167565b5b6020026020010151816001815181106124c6576124c5615167565b5b602002602001018181525050816002815181106124e6576124e5615167565b5b60200260200101518160028151811061250257612501615167565b5b6020026020010181815250508160038151811061252257612521615167565b5b60200260200101518160038151811061253e5761253d615167565b5b6020026020010181815250506000600467ffffffffffffffff811115612567576125666140f8565b5b6040519080825280602002602001820160405280156125955781602001602082028036833780820191505090505b5090506001816000815181106125ae576125ad615167565b5b6020026020010181815250506001816001815181106125d0576125cf615167565b5b6020026020010181815250506001816002815181106125f2576125f1615167565b5b60200260200101818152505060018160038151811061261457612613615167565b5b602002602001018181525050612671600e600087815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838360405180602001604052806000815250613180565b505061280f565b60006126846065613792565b9050601481106126db576014836000815181106126a4576126a3615167565b5b60200260200101516126b691906154f1565b826000815181106126ca576126c9615167565b5b6020026020010181815250506127a0565b6014811080156126ec575060058110155b1561274a576014600a8460008151811061270957612708615167565b5b602002602001015161271b91906154f1565b6127259190615522565b8260008151811061273957612738615167565b5b60200260200101818152505061279f565b601e60028460008151811061276257612761615167565b5b602002602001015161277491906154f1565b61277e9190615522565b8260008151811061279257612791615167565b5b6020026020010181815250505b5b61280d600e600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000815181106127ee576127ed615167565b5b60200260200101516001604051806020016040528060008152506133ac565b505b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166375936157601d600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161289d9190614514565b600060405180830381600087803b1580156128b757600080fd5b505af11580156128cb573d6000803e3d6000fd5b505050507ffe2e2d779dba245964d4e3ef9b994be63856fd568bf7d3ca9e224755cb1bd54d838360405161290092919061558a565b60405180910390a1505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361294657600080fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b81518351146129d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cd9061562c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3c906156be565b60405180910390fd5b6000612a4f61298a565b9050612a5f8187878787876137d9565b60005b8451811015612c10576000858281518110612a8057612a7f615167565b5b602002602001015190506000858381518110612a9f57612a9e615167565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3790615750565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf59190615522565b9250508190555050505080612c09906151c5565b9050612a62565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c87929190615770565b60405180910390a4612c9d8187878787876137ef565b612cab8187878787876137f7565b505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dde90615819565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ed89190613ff9565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b906156be565b60405180910390fd5b6000612f5e61298a565b90506000612f6b856139ce565b90506000612f78856139ce565b9050612f888389898585896137d9565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561301f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301690615750565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d49190615522565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051613151929190615839565b60405180910390a4613167848a8a86868a6137ef565b613175848a8a8a8a8a613a48565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036131ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e6906158d4565b60405180910390fd5b8151835114613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a9061562c565b60405180910390fd5b600061323d61298a565b905061324e816000878787876137d9565b60005b84518110156133075783818151811061326d5761326c615167565b5b602002602001015160008087848151811061328b5761328a615167565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132ed9190615522565b9250508190555080806132ff906151c5565b915050613251565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161337f929190615770565b60405180910390a4613396816000878787876137ef565b6133a5816000878787876137f7565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361341b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613412906158d4565b60405180910390fd5b600061342561298a565b90506000613432856139ce565b9050600061343f856139ce565b9050613450836000898585896137d9565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134af9190615522565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161352d929190615839565b60405180910390a4613544836000898585896137ef565b61355383600089898989613a48565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613624577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161361a57613619615327565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613661576d04ee2d6d415b85acef8100000000838161365757613656615327565b5b0492506020810190505b662386f26fc10000831061369057662386f26fc10000838161368657613685615327565b5b0492506010810190505b6305f5e10083106136b9576305f5e10083816136af576136ae615327565b5b0492506008810190505b61271083106136de5761271083816136d4576136d3615327565b5b0492506004810190505b6064831061370157606483816136f7576136f6615327565b5b0492506002810190505b600a8310613710576001810190505b80915050919050565b600080600090505b8351811015613767578284828151811061373e5761373d615167565b5b602002602001015103613754578091505061378c565b808061375f906151c5565b915050613721565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90505b92915050565b600080824244336040516020016137ab9392919061595d565b6040516020818303038152906040528051906020012060001c6137ce91906154f1565b905080915050919050565b6137e7868686868686613c1f565b505050505050565b505050505050565b6138168473ffffffffffffffffffffffffffffffffffffffff16613def565b156139c6578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161385c9594939291906159ef565b6020604051808303816000875af192505050801561389857506040513d601f19601f820116820180604052508101906138959190615a6c565b60015b61393d576138a4615aa6565b806308c379a00361390057506138b8615ac8565b806138c35750613902565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f791906140a4565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393490615bca565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146139c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139bb90615c5c565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156139ed576139ec6140f8565b5b604051908082528060200260200182016040528015613a1b5781602001602082028036833780820191505090505b5090508281600081518110613a3357613a32615167565b5b60200260200101818152505080915050919050565b613a678473ffffffffffffffffffffffffffffffffffffffff16613def565b15613c17578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613aad959493929190615c7c565b6020604051808303816000875af1925050508015613ae957506040513d601f19601f82011682018060405250810190613ae69190615a6c565b60015b613b8e57613af5615aa6565b806308c379a003613b515750613b09615ac8565b80613b145750613b53565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4891906140a4565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8590615bca565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c0c90615c5c565b60405180910390fd5b505b505050505050565b613c2d868686868686613e12565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613cde5760005b8351811015613cdc57828181518110613c8057613c7f615167565b5b602002602001015160036000868481518110613c9f57613c9e615167565b5b602002602001015181526020019081526020016000206000828254613cc49190615522565b9250508190555080613cd5906151c5565b9050613c64565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613de75760005b8351811015613de5576000848281518110613d3357613d32615167565b5b602002602001015190506000848381518110613d5257613d51615167565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015613db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dae90615d48565b60405180910390fd5b818103600360008581526020019081526020016000208190555050505080613dde906151c5565b9050613d15565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e5982613e2e565b9050919050565b613e6981613e4e565b8114613e7457600080fd5b50565b600081359050613e8681613e60565b92915050565b600060208284031215613ea257613ea1613e24565b5b6000613eb084828501613e77565b91505092915050565b6000819050919050565b613ecc81613eb9565b8114613ed757600080fd5b50565b600081359050613ee981613ec3565b92915050565b60008060408385031215613f0657613f05613e24565b5b6000613f1485828601613e77565b9250506020613f2585828601613eda565b9150509250929050565b613f3881613eb9565b82525050565b6000602082019050613f536000830184613f2f565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f8e81613f59565b8114613f9957600080fd5b50565b600081359050613fab81613f85565b92915050565b600060208284031215613fc757613fc6613e24565b5b6000613fd584828501613f9c565b91505092915050565b60008115159050919050565b613ff381613fde565b82525050565b600060208201905061400e6000830184613fea565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561404e578082015181840152602081019050614033565b60008484015250505050565b6000601f19601f8301169050919050565b600061407682614014565b614080818561401f565b9350614090818560208601614030565b6140998161405a565b840191505092915050565b600060208201905081810360008301526140be818461406b565b905092915050565b6000602082840312156140dc576140db613e24565b5b60006140ea84828501613eda565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141308261405a565b810181811067ffffffffffffffff8211171561414f5761414e6140f8565b5b80604052505050565b6000614162613e1a565b905061416e8282614127565b919050565b600067ffffffffffffffff82111561418e5761418d6140f8565b5b602082029050602081019050919050565b600080fd5b60006141b76141b284614173565b614158565b905080838252602082019050602084028301858111156141da576141d961419f565b5b835b8181101561420357806141ef8882613eda565b8452602084019350506020810190506141dc565b5050509392505050565b600082601f830112614222576142216140f3565b5b81356142328482602086016141a4565b91505092915050565b6000806040838503121561425257614251613e24565b5b600061426085828601613eda565b925050602083013567ffffffffffffffff81111561428157614280613e29565b5b61428d8582860161420d565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156142b7576142b66140f8565b5b6142c08261405a565b9050602081019050919050565b82818337600083830152505050565b60006142ef6142ea8461429c565b614158565b90508281526020810184848401111561430b5761430a614297565b5b6143168482856142cd565b509392505050565b600082601f830112614333576143326140f3565b5b81356143438482602086016142dc565b91505092915050565b60006020828403121561436257614361613e24565b5b600082013567ffffffffffffffff8111156143805761437f613e29565b5b61438c8482850161431e565b91505092915050565b600067ffffffffffffffff8211156143b0576143af6140f8565b5b6143b98261405a565b9050602081019050919050565b60006143d96143d484614395565b614158565b9050828152602081018484840111156143f5576143f4614297565b5b6144008482856142cd565b509392505050565b600082601f83011261441d5761441c6140f3565b5b813561442d8482602086016143c6565b91505092915050565b600080600080600060a0868803121561445257614451613e24565b5b600061446088828901613e77565b955050602061447188828901613e77565b945050604086013567ffffffffffffffff81111561449257614491613e29565b5b61449e8882890161420d565b935050606086013567ffffffffffffffff8111156144bf576144be613e29565b5b6144cb8882890161420d565b925050608086013567ffffffffffffffff8111156144ec576144eb613e29565b5b6144f888828901614408565b9150509295509295909350565b61450e81613e4e565b82525050565b60006020820190506145296000830184614505565b92915050565b600080fd5b60008083601f84011261454a576145496140f3565b5b8235905067ffffffffffffffff8111156145675761456661452f565b5b6020830191508360208202830111156145835761458261419f565b5b9250929050565b600080602083850312156145a1576145a0613e24565b5b600083013567ffffffffffffffff8111156145bf576145be613e29565b5b6145cb85828601614534565b92509250509250929050565b600067ffffffffffffffff8211156145f2576145f16140f8565b5b602082029050602081019050919050565b6000614616614611846145d7565b614158565b905080838252602082019050602084028301858111156146395761463861419f565b5b835b81811015614662578061464e8882613e77565b84526020840193505060208101905061463b565b5050509392505050565b600082601f830112614681576146806140f3565b5b8135614691848260208601614603565b91505092915050565b600080604083850312156146b1576146b0613e24565b5b600083013567ffffffffffffffff8111156146cf576146ce613e29565b5b6146db8582860161466c565b925050602083013567ffffffffffffffff8111156146fc576146fb613e29565b5b6147088582860161420d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474781613eb9565b82525050565b6000614759838361473e565b60208301905092915050565b6000602082019050919050565b600061477d82614712565b614787818561471d565b93506147928361472e565b8060005b838110156147c35781516147aa888261474d565b97506147b583614765565b925050600181019050614796565b5085935050505092915050565b600060208201905081810360008301526147ea8184614772565b905092915050565b600067ffffffffffffffff82169050919050565b61480f816147f2565b811461481a57600080fd5b50565b60008135905061482c81614806565b92915050565b60006020828403121561484857614847613e24565b5b60006148568482850161481d565b91505092915050565b6000819050919050565b6148728161485f565b811461487d57600080fd5b50565b60008135905061488f81614869565b92915050565b600080604083850312156148ac576148ab613e24565b5b60006148ba8582860161481d565b92505060206148cb85828601614880565b9150509250929050565b60006040820190506148ea6000830185613fea565b6148f76020830184613fea565b9392505050565b60006060820190506149136000830186614505565b6149206020830185613fea565b61492d6040830184613fea565b949350505050565b61493e81613fde565b811461494957600080fd5b50565b60008135905061495b81614935565b92915050565b6000806040838503121561497857614977613e24565b5b600061498685828601613e77565b92505060206149978582860161494c565b9150509250929050565b60006040820190506149b66000830185614505565b6149c36020830184613f2f565b9392505050565b600080604083850312156149e1576149e0613e24565b5b60006149ef85828601613e77565b9250506020614a0085828601613e77565b9150509250929050565b600080600080600060a08688031215614a2657614a25613e24565b5b6000614a3488828901613e77565b9550506020614a4588828901613e77565b9450506040614a5688828901613eda565b9350506060614a6788828901613eda565b925050608086013567ffffffffffffffff811115614a8857614a87613e29565b5b614a9488828901614408565b9150509295509295909350565b600060208284031215614ab757614ab6613e24565b5b600082013567ffffffffffffffff811115614ad557614ad4613e29565b5b614ae18482850161420d565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000614b46602a8361401f565b9150614b5182614aea565b604082019050919050565b60006020820190508181036000830152614b7581614b39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614bc357607f821691505b602082108103614bd657614bd5614b7c565b5b50919050565b614be58161485f565b82525050565b614bf4816147f2565b82525050565b600061ffff82169050919050565b614c1181614bfa565b82525050565b600063ffffffff82169050919050565b614c3081614c17565b82525050565b600060a082019050614c4b6000830188614bdc565b614c586020830187614beb565b614c656040830186614c08565b614c726060830185614c27565b614c7f6080830184614c27565b9695505050505050565b600081519050614c9881613ec3565b92915050565b600060208284031215614cb457614cb3613e24565b5b6000614cc284828501614c89565b91505092915050565b6000604082019050614ce06000830185613f2f565b614ced6020830184614c27565b9392505050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614d2181614bab565b614d2b8186614cf4565b94506001821660008114614d465760018114614d5b57614d8e565b60ff1983168652811515820286019350614d8e565b614d6485614cff565b60005b83811015614d8657815481890152600182019150602081019050614d67565b838801955050505b50505092915050565b6000614da282614014565b614dac8185614cf4565b9350614dbc818560208601614030565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614dfe600583614cf4565b9150614e0982614dc8565b600582019050919050565b6000614e208285614d14565b9150614e2c8284614d97565b9150614e3782614df1565b91508190509392505050565b6000604082019050614e586000830185614505565b614e656020830184614505565b9392505050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614eb97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e7c565b614ec38683614e7c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614f00614efb614ef684613eb9565b614edb565b613eb9565b9050919050565b6000819050919050565b614f1a83614ee5565b614f2e614f2682614f07565b848454614e89565b825550505050565b600090565b614f43614f36565b614f4e818484614f11565b505050565b5b81811015614f7257614f67600082614f3b565b600181019050614f54565b5050565b601f821115614fb757614f8881614cff565b614f9184614e6c565b81016020851015614fa0578190505b614fb4614fac85614e6c565b830182614f53565b50505b505050565b600082821c905092915050565b6000614fda60001984600802614fbc565b1980831691505092915050565b6000614ff38383614fc9565b9150826002028217905092915050565b61500c82614014565b67ffffffffffffffff811115615025576150246140f8565b5b61502f8254614bab565b61503a828285614f76565b600060209050601f83116001811461506d576000841561505b578287015190505b6150658582614fe7565b8655506150cd565b601f19841661507b86614cff565b60005b828110156150a35784890151825560018201915060208501945060208101905061507e565b868310156150c057848901516150bc601f891682614fc9565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000615131602e8361401f565b915061513c826150d5565b604082019050919050565b6000602082019050818103600083015261516081615124565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006151d082613eb9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361520257615201615196565b5b600182019050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061526960298361401f565b91506152748261520d565b604082019050919050565b600060208201905081810360008301526152988161525c565b9050919050565b600081905092915050565b50565b60006152ba60008361529f565b91506152c5826152aa565b600082019050919050565b60006152db826152ad565b9150819050919050565b60006152f082613eb9565b91506152fb83613eb9565b925082820261530981613eb9565b915082820484148315176153205761531f615196565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061536182613eb9565b915061536c83613eb9565b92508261537c5761537b615327565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153e360268361401f565b91506153ee82615387565b604082019050919050565b60006020820190508181036000830152615412816153d6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061544f60208361401f565b915061545a82615419565b602082019050919050565b6000602082019050818103600083015261547e81615442565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006154bb601f8361401f565b91506154c682615485565b602082019050919050565b600060208201905081810360008301526154ea816154ae565b9050919050565b60006154fc82613eb9565b915061550783613eb9565b92508261551757615516615327565b5b828206905092915050565b600061552d82613eb9565b915061553883613eb9565b92508282019050808211156155505761554f615196565b5b92915050565b600061556182613eb9565b915061556c83613eb9565b925082820390508181111561558457615583615196565b5b92915050565b600060408201905061559f6000830185613f2f565b81810360208301526155b18184614772565b90509392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061561660288361401f565b9150615621826155ba565b604082019050919050565b6000602082019050818103600083015261564581615609565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006156a860258361401f565b91506156b38261564c565b604082019050919050565b600060208201905081810360008301526156d78161569b565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061573a602a8361401f565b9150615745826156de565b604082019050919050565b600060208201905081810360008301526157698161572d565b9050919050565b6000604082019050818103600083015261578a8185614772565b9050818103602083015261579e8184614772565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061580360298361401f565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b600060408201905061584e6000830185613f2f565b61585b6020830184613f2f565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006158be60218361401f565b91506158c982615862565b604082019050919050565b600060208201905081810360008301526158ed816158b1565b9050919050565b6000819050919050565b61590f61590a82613eb9565b6158f4565b82525050565b60008160601b9050919050565b600061592d82615915565b9050919050565b600061593f82615922565b9050919050565b61595761595282613e4e565b615934565b82525050565b600061596982866158fe565b60208201915061597982856158fe565b6020820191506159898284615946565b601482019150819050949350505050565b600081519050919050565b600082825260208201905092915050565b60006159c18261599a565b6159cb81856159a5565b93506159db818560208601614030565b6159e48161405a565b840191505092915050565b600060a082019050615a046000830188614505565b615a116020830187614505565b8181036040830152615a238186614772565b90508181036060830152615a378185614772565b90508181036080830152615a4b81846159b6565b90509695505050505050565b600081519050615a6681613f85565b92915050565b600060208284031215615a8257615a81613e24565b5b6000615a9084828501615a57565b91505092915050565b60008160e01c9050919050565b600060033d1115615ac55760046000803e615ac2600051615a99565b90505b90565b600060443d10615b5557615ada613e1a565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b02575050615b55565b808201805167ffffffffffffffff811115615b205750505050615b55565b80602083010160043d038501811115615b3d575050505050615b55565b615b4c82602001850186614127565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615bb460348361401f565b9150615bbf82615b58565b604082019050919050565b60006020820190508181036000830152615be381615ba7565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615c4660288361401f565b9150615c5182615bea565b604082019050919050565b60006020820190508181036000830152615c7581615c39565b9050919050565b600060a082019050615c916000830188614505565b615c9e6020830187614505565b615cab6040830186613f2f565b615cb86060830185613f2f565b8181036080830152615cca81846159b6565b90509695505050505050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000615d3260288361401f565b9150615d3d82615cd6565b604082019050919050565b60006020820190508181036000830152615d6181615d25565b905091905056fea26469706673582212202f33f4761dd05a3eba5a1f5f22026390ce810fec3ee8b1f7636259ed6a33106b64736f6c63430008110033697066733a2f2f6261667962656961336d34773378636966376273336733356d677068676e77726f7567756e793336736f36663537687a697733676f6273747074792f000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000d5d517abe5cf79b7e95ec98db0f0277788aff63489630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000d5d517abe5cf79b7e95ec98db0f0277788aff63489630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46

-----Decoded View---------------
Arg [0] : _vrfSubId (uint64): 92
Arg [1] : _vrfCoordinator (address): 0xd5d517abe5cf79b7e95ec98db0f0277788aff634
Arg [2] : _keyHash (bytes32): 0x89630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [1] : 000000000000000000000000d5d517abe5cf79b7e95ec98db0f0277788aff634
Arg [2] : 89630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46


Deployed ByteCode Sourcemap

1742:16036:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10776:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2130:227:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17482:294:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3069:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3349:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12763:904;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10093:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6618:256:18;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9919:105:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17047:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4009:426:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3547:21:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9773:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11043:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2514:508:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;900:120:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10618:103:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1824:101:14;;;;;;;;;;;;;:::i;:::-;;16224:308:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9398:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3761:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;9618:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4634:27;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3135:20:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4288:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;3090:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3226:22:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;696:111:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3469:19:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17202:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5860:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3896:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3310:166:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3543:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11381:194:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11784:511;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4720:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10776:92;1087:13:14;:11;:13::i;:::-;10856:5:1::1;10847:6;;:14;;;;;;;;;;;;;;;;;;10776:92:::0;:::o;2130:227:3:-;2216:7;2262:1;2243:21;;:7;:21;;;2235:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2328:9;:13;2338:2;2328:13;;;;;;;;;;;:22;2342:7;2328:22;;;;;;;;;;;;;;;;2321:29;;2130:227;;;;:::o;17482:294:1:-;17625:4;17681:26;17666:41;;;:11;:41;;;;:93;;;;17723:36;17747:11;17723:23;:36::i;:::-;17666:93;17645:124;;17482:294;;;:::o;3069:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3349:21::-;;;;:::o;12763:904::-;12890:17;2246:21:15;:19;:21::i;:::-;7550:10:1::1;7537:23;;:9;:23;;;7533:81;;7583:20;;;;;;;;;;;;;;7533:81;12866:13:::2;8719:9;;8700:15;:28;;:58;;;;;8751:7;;8732:15;:26;;8700:58;8697:643;;;8787:1;8776:7;:12:::0;8773:491:::2;;8810:12;:24;8823:10;8810:24;;;;;;;;;;;;;;;;;;;;;;;;;8807:198;;;8878:23;;8865:9;:36;;8857:45;;;::::0;::::2;;8807:198;;;8970:15;;8957:9;:28;;8949:37;;;::::0;::::2;;8807:198;8773:491;;;9046:12;:24;9059:10;9046:24;;;;;;;;;;;;;;;;;;;;;;;;;9043:207;;;9114:28;;9101:9;:41;;9093:50;;;::::0;::::2;;9043:207;;;9210:20;;9197:9;:33;;9189:42;;;::::0;::::2;;9043:207;8773:491;8697:643;;;9301:28;;;;;;;;;;;;;;8697:643;13019:14:::3;;;;;;;;;;;12993:60;;;13067:7;;13088:16;;;;;;;;;;;13118:20;;;;;;;;;;;13152:16;;;;;;;;;;;13199:1;13182:13;:18;:51;;13220:13;;;;;;;;;;;13182:51;;;13203:14;;;;;;;;;;;13182:51;12993:250;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12981:262;;13277:67;;;;;;;;13332:10;13277:67;;;;;;13317:5;13277:67;;;;;;13300:4;13277:67;;;;::::0;13253:10:::3;:21;13264:9;13253:21;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13354:10;13370:9;13354:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13406:9;13390:13;:25;;;;13445:1;13428:13;:18:::0;13425:163:::3;;13466:38;13478:9;13489:14;;;;;;;;;;;13466:38;;;;;;;:::i;:::-;;;;;;;;13425:163;;;13540:37;13552:9;13563:13;;;;;;;;;;;13540:37;;;;;;;:::i;:::-;;;;;;;;13425:163;13624:10;13597:13;:24;13611:9;13597:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;7623:1:::2;2288:20:15::0;:18;:20::i;:::-;12763:904:1;;;:::o;10093:162::-;10153:13;10209:8;10219:18;:7;:16;:18::i;:::-;10192:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10178:70;;10093:162;;;:::o;6618:256:18:-;6731:14;6717:28;;:10;:28;;;6713:109;;6788:10;6800:14;6762:53;;;;;;;;;;;;:::i;:::-;;;;;;;;6713:109;6827:42;6846:9;6857:11;6827:18;:42::i;:::-;6618:256;;:::o;9919:105:1:-;1087:13:14;:11;:13::i;:::-;10006:11:1::1;9995:8;:22;;;;;;:::i;:::-;;9919:105:::0;:::o;17047:107::-;1087:13:14;:11;:13::i;:::-;17120:27:1::1;17134:12;17120:13;:27::i;:::-;17047:107:::0;:::o;4009:426:3:-;4242:12;:10;:12::i;:::-;4234:20;;:4;:20;;;:60;;;;4258:36;4275:4;4281:12;:10;:12::i;:::-;4258:16;:36::i;:::-;4234:60;4213:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;4376:52;4399:4;4405:2;4409:3;4414:7;4423:4;4376:22;:52::i;:::-;4009:426;;;;;:::o;3547:21:1:-;;;;;;;;;;;;;:::o;9773:83::-;1087:13:14;:11;:13::i;:::-;9844:5:1::1;9834:7;:15;;;;9773:83:::0;:::o;11043:189::-;1087:13:14;:11;:13::i;:::-;11132:6:1::1;11128:98;11144:10;;:17;;11140:1;:21;11128:98;;;11211:4;11181:12;:27;11194:10;;11205:1;11194:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11181:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;11163:3;;;;;:::i;:::-;;;;11128:98;;;;11043:189:::0;;:::o;2514:508:3:-;2665:16;2724:3;:10;2705:8;:15;:29;2697:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:30;2838:8;:15;2824:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2791:63;;2870:9;2865:120;2889:8;:15;2885:1;:19;2865:120;;;2944:30;2954:8;2963:1;2954:11;;;;;;;;:::i;:::-;;;;;;;;2967:3;2971:1;2967:6;;;;;;;;:::i;:::-;;;;;;;;2944:9;:30::i;:::-;2925:13;2939:1;2925:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2906:3;;;;:::i;:::-;;;2865:120;;;;3002:13;2995:20;;;2514:508;;;;:::o;900:120:4:-;957:4;1012:1;980:29;1006:2;980:25;:29::i;:::-;:33;973:40;;900:120;;;:::o;10618:103:1:-;1087:13:14;:11;:13::i;:::-;10710:4:1::1;10691:16;;:23;;;;;;;;;;;;;;;;;;10618:103:::0;:::o;1824:101:14:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;16224:308:1:-;1087:13:14;:11;:13::i;:::-;2246:21:15::1;:19;:21::i;:::-;16304:11:1::2;16318:21;16304:35;;16349:9;16380:3;:8;;16396:6;16380:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16369:38;;;;;16422:4;16417:65;;16449:22;;;;;;;;;;;;;;16417:65;16497:28;16513:3;16518:6;16497:28;;;;;;;:::i;:::-;;;;;;;;16294:238;;2288:20:15::1;:18;:20::i;:::-;16224:308:1::0;:::o;9398:150::-;1087:13:14;:11;:13::i;:::-;9495:8:1::1;9485:7;:18;;;;9532:9;9513:16;;:28;;;;;;;;;;;;;;;;;;9398:150:::0;;:::o;3761:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9618:87::-;1087:13:14;:11;:13::i;:::-;9693:5:1::1;9681:9;:17;;;;9618:87:::0;:::o;4634:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1194:85:14:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;3135:20:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4288:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3090:153:3:-;3184:52;3203:12;:10;:12::i;:::-;3217:8;3227;3184:18;:52::i;:::-;3090:153;;:::o;3226:22:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;696:111:4:-;758:7;784:12;:16;797:2;784:16;;;;;;;;;;;;777:23;;696:111;;;:::o;3469:19:1:-;;;;:::o;17202:186::-;17283:16;17301:21;17346:10;;;;;;;;;;;17377:3;17372:1;17359:10;:14;;;;:::i;:::-;17358:22;;;;:::i;:::-;17338:43;;;;17202:186;;;:::o;5860:25::-;;;;;;;;;;;;;:::o;3896:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;3310:166:3:-;3409:4;3432:18;:27;3451:7;3432:27;;;;;;;;;;;;;;;:37;3460:8;3432:37;;;;;;;;;;;;;;;;;;;;;;;;;3425:44;;3310:166;;;;:::o;3543:394::-;3751:12;:10;:12::i;:::-;3743:20;;:4;:20;;;:60;;;;3767:36;3784:4;3790:12;:10;:12::i;:::-;3767:16;:36::i;:::-;3743:60;3722:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;3885:45;3903:4;3909:2;3913;3917:6;3925:4;3885:17;:45::i;:::-;3543:394;;;;;:::o;2074:198:14:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;11381:194:1:-;1087:13:14;:11;:13::i;:::-;11466:6:1::1;11462:107;11478:10;;:17;;11474:1;:21;11462:107;;;11554:4;11515:8;:23;11524:10;;11535:1;11524:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11515:23;;;;;;;;;;;;;;;:36;;;:43;;;;;;;;;;;;;;;;;;11497:3;;;;;:::i;:::-;;;;11462:107;;;;11381:194:::0;;:::o;11784:511::-;2246:21:15;:19;:21::i;:::-;7550:10:1::1;7537:23;;:9;:23;;;7533:81;;7583:20;;;;;;;;;;;;;;7533:81;11872:4:::2;7845:9;;7826:15;:28;;:58;;;;;7877:7;;7858:15;:26;;7826:58;7818:67;;;::::0;::::2;;7912:1;7898:4;:11;:15;7895:590;;;7931:12;:24;7944:10;7931:24;;;;;;;;;;;;;;;;;;;;;;;;;7928:347;;;7995:22;;7982:9;:35;;7974:44;;;::::0;::::2;;7928:347;;;8042:8;:20;8051:10;8042:20;;;;;;;;;;;;;;;:33;;;;;;;;;;;;8039:236;;;8104:8;:20;8113:10;8104:20;;;;;;;;;;;;;;;:28;;;;;;;;;;;;8103:29;8095:38;;;::::0;::::2;;8182:4;8151:8;:20;8160:10;8151:20;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;;8039:236;;;8245:14;;8232:9;:27;;8224:36;;;::::0;::::2;;8039:236;7928:347;7895:590;;;8308:12;:24;8321:10;8308:24;;;;;;;;;;;;;;;;;;;;;;;;;8305:170;;;8372:17;;8359:9;:30;;8351:39;;;::::0;::::2;;8305:170;;;8450:9;;8437;:22;;8429:31;;;::::0;::::2;;8305:170;7895:590;11905:1:::3;11891:4;:11;:15;11888:347;;;11944:1;11929:4;:11;:16;11921:25;;;::::0;::::3;;11961:20;11995:1;11984:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11961:36;;12023:1;12011:6;12018:1;12011:9;;;;;;;;:::i;:::-;;;;;;;:13;;;::::0;::::3;12050:1;12038:6;12045:1;12038:9;;;;;;;;:::i;:::-;;;;;;;:13;;;::::0;::::3;12077:1;12065:6;12072:1;12065:9;;;;;;;;:::i;:::-;;;;;;;:13;;;::::0;::::3;12104:1;12092:6;12099:1;12092:9;;;;;;;;:::i;:::-;;;;;;;:13;;;::::0;::::3;12120:40;12131:10;12143:4;12149:6;12120:40;;;;;;;;;;;::::0;:10:::3;:40::i;:::-;11907:264;11888:347;;;12191:33;12197:10;12209:4;12214:1;12209:7;;;;;;;;:::i;:::-;;;;;;;;12218:1;12191:33;;;;;;;;;;;::::0;:5:::3;:33::i;:::-;11888:347;12252:6;;;;;;;;;;;12244:32;;;12277:10;12244:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;7623:1:::2;2288:20:15::0;:18;:20::i;:::-;11784:511:1;:::o;4720:28::-;;;;:::o;1352:130:14:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;1181:305:3:-;1283:4;1333:26;1318:41;;;:11;:41;;;;:109;;;;1390:37;1375:52;;;:11;:52;;;;1318:109;:161;;;;1443:36;1467:11;1443:23;:36::i;:::-;1318:161;1299:180;;1181:305;;;:::o;2321:287:15:-;1744:1;2453:7;;:19;2445:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2583:7;:18;;;;2321:287::o;2614:209::-;1701:1;2794:7;:22;;;;2614:209::o;410:696:16:-;466:13;515:14;552:1;532:17;543:5;532:10;:17::i;:::-;:21;515:38;;567:20;601:6;590:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:41;;622:11;748:6;744:2;740:15;732:6;728:28;721:35;;783:280;790:4;783:280;;;814:5;;;;;;;;953:8;948:2;941:5;937:14;932:30;927:3;919:44;1007:2;998:11;;;;;;:::i;:::-;;;;;1040:1;1031:5;:10;783:280;1027:21;783:280;1083:6;1076:13;;;;;410:696;;;:::o;14011:2092:1:-;14126:10;:22;14137:10;14126:22;;;;;;;;;;;:29;;;;;;;;;;;;14118:38;;;;;;14167:23;14204:1;14193:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14167:39;;14240:1;14220:12;:19;:21;14217:1691;;;14260:6;14256:731;14272:12;:19;14270:1;:21;14256:731;;;14315:6;14422:12;14455:2;14437:12;14450:1;14437:15;;;;;;;;:::i;:::-;;;;;;;;:20;;;;:::i;:::-;14422:35;;14566:2;14556:7;:12;14553:420;;;14591:107;14643:2;14597:43;14611:9;14637:1;14635;:3;;;;:::i;:::-;14624:7;14623:15;;;;:::i;:::-;14597:13;:43::i;:::-;:48;14591:107;;;14672:3;;;;;:::i;:::-;;;;14591:107;;;14748:1;14746;:3;;;;:::i;:::-;14735:7;14734:15;;;;:::i;:::-;14719:9;14729:1;14719:12;;;;;;;;:::i;:::-;;;;;;;:30;;;;;14553:420;;;14796:107;14848:2;14802:43;14816:9;14842:1;14840;:3;;;;:::i;:::-;14829:7;14828:15;;;;:::i;:::-;14802:13;:43::i;:::-;:48;14796:107;;;14877:3;;;;;:::i;:::-;;;;14796:107;;;14953:1;14951;:3;;;;:::i;:::-;14940:7;14939:15;;;;:::i;:::-;14924:9;14934:1;14924:12;;;;;;;;:::i;:::-;;;;;;;:30;;;;;14553:420;14297:690;;14293:3;;;;;:::i;:::-;;;;14256:731;;;;15001:17;15032:1;15021:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15001:33;;15057:9;15067:1;15057:12;;;;;;;;:::i;:::-;;;;;;;;15048:3;15052:1;15048:6;;;;;;;;:::i;:::-;;;;;;;:21;;;;;15092:9;15102:1;15092:12;;;;;;;;:::i;:::-;;;;;;;;15083:3;15087:1;15083:6;;;;;;;;:::i;:::-;;;;;;;:21;;;;;15127:9;15137:1;15127:12;;;;;;;;:::i;:::-;;;;;;;;15118:3;15122:1;15118:6;;;;;;;;:::i;:::-;;;;;;;:21;;;;;15162:9;15172:1;15162:12;;;;;;;;:::i;:::-;;;;;;;;15153:3;15157:1;15153:6;;;;;;;;:::i;:::-;;;;;;;:21;;;;;15201;15236:1;15225:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15201:37;;15265:1;15252:7;15260:1;15252:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;15293:1;15280:7;15288:1;15280:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;15321:1;15308:7;15316:1;15308:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;15349:1;15336:7;15344:1;15336:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;15365:59;15376:10;:22;15387:10;15376:22;;;;;;;;;;;:29;;;;;;;;;;;;15407:3;15412:7;15365:59;;;;;;;;;;;;:10;:59::i;:::-;14242:1193;;14217:1691;;;15455:6;15464:20;15480:3;15464:15;:20::i;:::-;15455:29;;15504:2;15501:1;:5;15498:329;;15596:2;15578:12;15591:1;15578:15;;;;;;;;:::i;:::-;;;;;;;;:20;;;;:::i;:::-;15563:9;15573:1;15563:12;;;;;;;;:::i;:::-;;;;;;;:35;;;;;15498:329;;;15625:2;15623:1;:4;:12;;;;;15634:1;15631;:4;;15623:12;15619:208;;;15694:2;15688;15670:12;15683:1;15670:15;;;;;;;;:::i;:::-;;;;;;;;:20;;;;:::i;:::-;15669:27;;;;:::i;:::-;15654:9;15664:1;15654:12;;;;;;;;:::i;:::-;;;;;;;:42;;;;;15619:208;;;15810:2;15805:1;15787:12;15800:1;15787:15;;;;;;;;:::i;:::-;;;;;;;;:19;;;;:::i;:::-;15786:26;;;;:::i;:::-;15771:9;15781:1;15771:12;;;;;;;;:::i;:::-;;;;;;;:41;;;;;15619:208;15498:329;15840:57;15846:10;:22;15857:10;15846:22;;;;;;;;;;;:29;;;;;;;;;;;;15877:9;15887:1;15877:12;;;;;;;;:::i;:::-;;;;;;;;15891:1;15840:57;;;;;;;;;;;;:5;:57::i;:::-;15441:467;14217:1691;15987:6;;;;;;;;;;;15979:32;;;16012:13;:25;16026:10;16012:25;;;;;;;;;;;;;;;;;;;;;15979:59;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16054:42;16071:10;16083:12;16054:42;;;;;;;:::i;:::-;;;;;;;;14108:1995;14011:2092;;:::o;16900:141::-;16996:1;16972:26;;:12;:26;;;16964:35;;;;;;17022:12;17009:10;;:25;;;;;;;;;;;;;;;;;;16900:141;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;6178:1115:3:-;6398:7;:14;6384:3;:10;:28;6376:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6489:1;6475:16;;:2;:16;;;6467:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6544:16;6563:12;:10;:12::i;:::-;6544:31;;6586:60;6607:8;6617:4;6623:2;6627:3;6632:7;6641:4;6586:20;:60::i;:::-;6662:9;6657:411;6681:3;:10;6677:1;:14;6657:411;;;6712:10;6725:3;6729:1;6725:6;;;;;;;;:::i;:::-;;;;;;;;6712:19;;6745:14;6762:7;6770:1;6762:10;;;;;;;;:::i;:::-;;;;;;;;6745:27;;6787:19;6809:9;:13;6819:2;6809:13;;;;;;;;;;;:19;6823:4;6809:19;;;;;;;;;;;;;;;;6787:41;;6865:6;6850:11;:21;;6842:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6996:6;6982:11;:20;6960:9;:13;6970:2;6960:13;;;;;;;;;;;:19;6974:4;6960:19;;;;;;;;;;;;;;;:42;;;;7051:6;7030:9;:13;7040:2;7030:13;;;;;;;;;;;:17;7044:2;7030:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6698:370;;;6693:3;;;;:::i;:::-;;;6657:411;;;;7113:2;7083:47;;7107:4;7083:47;;7097:8;7083:47;;;7117:3;7122:7;7083:47;;;;;;;:::i;:::-;;;;;;;;7141:59;7161:8;7171:4;7177:2;7181:3;7186:7;7195:4;7141:19;:59::i;:::-;7211:75;7247:8;7257:4;7263:2;7267:3;7272:7;7281:4;7211:35;:75::i;:::-;6366:927;6178:1115;;;;;:::o;2426:187:14:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;12855:323:3:-;13005:8;12996:17;;:5;:17;;;12988:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;13107:8;13069:18;:25;13088:5;13069:25;;;;;;;;;;;;;;;:35;13095:8;13069:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13152:8;13130:41;;13145:5;13130:41;;;13162:8;13130:41;;;;;;:::i;:::-;;;;;;;;12855:323;;;:::o;4885:947::-;5080:1;5066:16;;:2;:16;;;5058:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5135:16;5154:12;:10;:12::i;:::-;5135:31;;5176:20;5199:21;5217:2;5199:17;:21::i;:::-;5176:44;;5230:24;5257:25;5275:6;5257:17;:25::i;:::-;5230:52;;5293:60;5314:8;5324:4;5330:2;5334:3;5339:7;5348:4;5293:20;:60::i;:::-;5364:19;5386:9;:13;5396:2;5386:13;;;;;;;;;;;:19;5400:4;5386:19;;;;;;;;;;;;;;;;5364:41;;5438:6;5423:11;:21;;5415:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:6;5547:11;:20;5525:9;:13;5535:2;5525:13;;;;;;;;;;;:19;5539:4;5525:19;;;;;;;;;;;;;;;:42;;;;5608:6;5587:9;:13;5597:2;5587:13;;;;;;;;;;;:17;5601:2;5587:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5661:2;5630:46;;5655:4;5630:46;;5645:8;5630:46;;;5665:2;5669:6;5630:46;;;;;;;:::i;:::-;;;;;;;;5687:59;5707:8;5717:4;5723:2;5727:3;5732:7;5741:4;5687:19;:59::i;:::-;5757:68;5788:8;5798:4;5804:2;5808;5812:6;5820:4;5757:30;:68::i;:::-;5048:784;;;;4885:947;;;;;:::o;9674:791::-;9860:1;9846:16;;:2;:16;;;9838:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9932:7;:14;9918:3;:10;:28;9910:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10002:16;10021:12;:10;:12::i;:::-;10002:31;;10044:66;10065:8;10083:1;10087:2;10091:3;10096:7;10105:4;10044:20;:66::i;:::-;10126:9;10121:101;10145:3;:10;10141:1;:14;10121:101;;;10201:7;10209:1;10201:10;;;;;;;;:::i;:::-;;;;;;;;10176:9;:17;10186:3;10190:1;10186:6;;;;;;;;:::i;:::-;;;;;;;;10176:17;;;;;;;;;;;:21;10194:2;10176:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;10157:3;;;;;:::i;:::-;;;;10121:101;;;;10273:2;10237:53;;10269:1;10237:53;;10251:8;10237:53;;;10277:3;10282:7;10237:53;;;;;;;:::i;:::-;;;;;;;;10301:65;10321:8;10339:1;10343:2;10347:3;10352:7;10361:4;10301:19;:65::i;:::-;10377:81;10413:8;10431:1;10435:2;10439:3;10444:7;10453:4;10377:35;:81::i;:::-;9828:637;9674:791;;;;:::o;8575:709::-;8736:1;8722:16;;:2;:16;;;8714:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8787:16;8806:12;:10;:12::i;:::-;8787:31;;8828:20;8851:21;8869:2;8851:17;:21::i;:::-;8828:44;;8882:24;8909:25;8927:6;8909:17;:25::i;:::-;8882:52;;8945:66;8966:8;8984:1;8988:2;8992:3;8997:7;9006:4;8945:20;:66::i;:::-;9043:6;9022:9;:13;9032:2;9022:13;;;;;;;;;;;:17;9036:2;9022:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9101:2;9064:52;;9097:1;9064:52;;9079:8;9064:52;;;9105:2;9109:6;9064:52;;;;;;;:::i;:::-;;;;;;;;9127:65;9147:8;9165:1;9169:2;9173:3;9178:7;9187:4;9127:19;:65::i;:::-;9203:74;9234:8;9252:1;9256:2;9260;9264:6;9272:4;9203:30;:74::i;:::-;8704:580;;;8575:709;;;;:::o;829:155:5:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9889:890:13:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;358:273:17:-;439:6;462:9;474:1;462:13;;457:136;481:3;:10;477:1;:14;457:136;;;526:9;516:3;520:1;516:6;;;;;;;;:::i;:::-;;;;;;;;:19;512:71;;566:1;555:13;;;;;512:71;493:3;;;;;:::i;:::-;;;;457:136;;;;609:2;602:9;;358:273;;;;;:::o;925:290::-;977:4;992:9;1183:4;1078:15;1111:16;1145:10;1045:111;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1023:147;;;;;;1018:162;;:169;;;;:::i;:::-;1011:176;;1204:4;1197:11;;;925:290;;;:::o;10261:286:1:-;10474:66;10501:8;10511:4;10517:2;10521:3;10526:7;10535:4;10474:26;:66::i;:::-;10261:286;;;;;;:::o;15261:213:3:-;;;;;;;:::o;16211:792::-;16443:15;:2;:13;;;:15::i;:::-;16439:558;;;16495:2;16478:43;;;16522:8;16532:4;16538:3;16543:7;16552:4;16478:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16474:513;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16863:6;16856:14;;;;;;;;;;;:::i;:::-;;;;;;;;16474:513;;;16910:62;;;;;;;;;;:::i;:::-;;;;;;;;16474:513;16648:48;;;16636:60;;;:8;:60;;;;16632:157;;16720:50;;;;;;;;;;:::i;:::-;;;;;;;;16632:157;16558:245;16439:558;16211:792;;;;;;:::o;17009:193::-;17075:16;17103:22;17142:1;17128:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:41;;17165:7;17154:5;17160:1;17154:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;17190:5;17183:12;;;17009:193;;;:::o;15480:725::-;15687:15;:2;:13;;;:15::i;:::-;15683:516;;;15739:2;15722:38;;;15761:8;15771:4;15777:2;15781:6;15789:4;15722:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15718:471;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16065:6;16058:14;;;;;;;;;;;:::i;:::-;;;;;;;;15718:471;;;16112:62;;;;;;;;;;:::i;:::-;;;;;;;;15718:471;15855:43;;;15843:55;;;:8;:55;;;;15839:152;;15922:50;;;;;;;;;;:::i;:::-;;;;;;;;15839:152;15795:210;15683:516;15480:725;;;;;;:::o;1090:904:4:-;1321:66;1348:8;1358:4;1364:2;1368:3;1373:7;1382:4;1321:26;:66::i;:::-;1418:1;1402:18;;:4;:18;;;1398:156;;1441:9;1436:108;1460:3;:10;1456:1;:14;1436:108;;;1519:7;1527:1;1519:10;;;;;;;;:::i;:::-;;;;;;;;1495:12;:20;1508:3;1512:1;1508:6;;;;;;;;:::i;:::-;;;;;;;;1495:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;1472:3;;;;:::i;:::-;;;1436:108;;;;1398:156;1582:1;1568:16;;:2;:16;;;1564:424;;1605:9;1600:378;1624:3;:10;1620:1;:14;1600:378;;;1659:10;1672:3;1676:1;1672:6;;;;;;;;:::i;:::-;;;;;;;;1659:19;;1696:14;1713:7;1721:1;1713:10;;;;;;;;:::i;:::-;;;;;;;;1696:27;;1741:14;1758:12;:16;1771:2;1758:16;;;;;;;;;;;;1741:33;;1810:6;1800;:16;;1792:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1939:6;1930;:15;1911:12;:16;1924:2;1911:16;;;;;;;;;;;:34;;;;1641:337;;;1636:3;;;;:::i;:::-;;;1600:378;;;;1564:424;1090:904;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;14114:214:3:-;;;;;;;:::o;7:75:20:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:474::-;1600:6;1608;1657:2;1645:9;1636:7;1632:23;1628:32;1625:119;;;1663:79;;:::i;:::-;1625:119;1783:1;1808:53;1853:7;1844:6;1833:9;1829:22;1808:53;:::i;:::-;1798:63;;1754:117;1910:2;1936:53;1981:7;1972:6;1961:9;1957:22;1936:53;:::i;:::-;1926:63;;1881:118;1532:474;;;;;:::o;2012:118::-;2099:24;2117:5;2099:24;:::i;:::-;2094:3;2087:37;2012:118;;:::o;2136:222::-;2229:4;2267:2;2256:9;2252:18;2244:26;;2280:71;2348:1;2337:9;2333:17;2324:6;2280:71;:::i;:::-;2136:222;;;;:::o;2364:149::-;2400:7;2440:66;2433:5;2429:78;2418:89;;2364:149;;;:::o;2519:120::-;2591:23;2608:5;2591:23;:::i;:::-;2584:5;2581:34;2571:62;;2629:1;2626;2619:12;2571:62;2519:120;:::o;2645:137::-;2690:5;2728:6;2715:20;2706:29;;2744:32;2770:5;2744:32;:::i;:::-;2645:137;;;;:::o;2788:327::-;2846:6;2895:2;2883:9;2874:7;2870:23;2866:32;2863:119;;;2901:79;;:::i;:::-;2863:119;3021:1;3046:52;3090:7;3081:6;3070:9;3066:22;3046:52;:::i;:::-;3036:62;;2992:116;2788:327;;;;:::o;3121:90::-;3155:7;3198:5;3191:13;3184:21;3173:32;;3121:90;;;:::o;3217:109::-;3298:21;3313:5;3298:21;:::i;:::-;3293:3;3286:34;3217:109;;:::o;3332:210::-;3419:4;3457:2;3446:9;3442:18;3434:26;;3470:65;3532:1;3521:9;3517:17;3508:6;3470:65;:::i;:::-;3332:210;;;;:::o;3548:99::-;3600:6;3634:5;3628:12;3618:22;;3548:99;;;:::o;3653:169::-;3737:11;3771:6;3766:3;3759:19;3811:4;3806:3;3802:14;3787:29;;3653:169;;;;:::o;3828:246::-;3909:1;3919:113;3933:6;3930:1;3927:13;3919:113;;;4018:1;4013:3;4009:11;4003:18;3999:1;3994:3;3990:11;3983:39;3955:2;3952:1;3948:10;3943:15;;3919:113;;;4066:1;4057:6;4052:3;4048:16;4041:27;3890:184;3828:246;;;:::o;4080:102::-;4121:6;4172:2;4168:7;4163:2;4156:5;4152:14;4148:28;4138:38;;4080:102;;;:::o;4188:377::-;4276:3;4304:39;4337:5;4304:39;:::i;:::-;4359:71;4423:6;4418:3;4359:71;:::i;:::-;4352:78;;4439:65;4497:6;4492:3;4485:4;4478:5;4474:16;4439:65;:::i;:::-;4529:29;4551:6;4529:29;:::i;:::-;4524:3;4520:39;4513:46;;4280:285;4188:377;;;;:::o;4571:313::-;4684:4;4722:2;4711:9;4707:18;4699:26;;4771:9;4765:4;4761:20;4757:1;4746:9;4742:17;4735:47;4799:78;4872:4;4863:6;4799:78;:::i;:::-;4791:86;;4571:313;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:117::-;5334:1;5331;5324:12;5348:180;5396:77;5393:1;5386:88;5493:4;5490:1;5483:15;5517:4;5514:1;5507:15;5534:281;5617:27;5639:4;5617:27;:::i;:::-;5609:6;5605:40;5747:6;5735:10;5732:22;5711:18;5699:10;5696:34;5693:62;5690:88;;;5758:18;;:::i;:::-;5690:88;5798:10;5794:2;5787:22;5577:238;5534:281;;:::o;5821:129::-;5855:6;5882:20;;:::i;:::-;5872:30;;5911:33;5939:4;5931:6;5911:33;:::i;:::-;5821:129;;;:::o;5956:311::-;6033:4;6123:18;6115:6;6112:30;6109:56;;;6145:18;;:::i;:::-;6109:56;6195:4;6187:6;6183:17;6175:25;;6255:4;6249;6245:15;6237:23;;5956:311;;;:::o;6273:117::-;6382:1;6379;6372:12;6413:710;6509:5;6534:81;6550:64;6607:6;6550:64;:::i;:::-;6534:81;:::i;:::-;6525:90;;6635:5;6664:6;6657:5;6650:21;6698:4;6691:5;6687:16;6680:23;;6751:4;6743:6;6739:17;6731:6;6727:30;6780:3;6772:6;6769:15;6766:122;;;6799:79;;:::i;:::-;6766:122;6914:6;6897:220;6931:6;6926:3;6923:15;6897:220;;;7006:3;7035:37;7068:3;7056:10;7035:37;:::i;:::-;7030:3;7023:50;7102:4;7097:3;7093:14;7086:21;;6973:144;6957:4;6952:3;6948:14;6941:21;;6897:220;;;6901:21;6515:608;;6413:710;;;;;:::o;7146:370::-;7217:5;7266:3;7259:4;7251:6;7247:17;7243:27;7233:122;;7274:79;;:::i;:::-;7233:122;7391:6;7378:20;7416:94;7506:3;7498:6;7491:4;7483:6;7479:17;7416:94;:::i;:::-;7407:103;;7223:293;7146:370;;;;:::o;7522:684::-;7615:6;7623;7672:2;7660:9;7651:7;7647:23;7643:32;7640:119;;;7678:79;;:::i;:::-;7640:119;7798:1;7823:53;7868:7;7859:6;7848:9;7844:22;7823:53;:::i;:::-;7813:63;;7769:117;7953:2;7942:9;7938:18;7925:32;7984:18;7976:6;7973:30;7970:117;;;8006:79;;:::i;:::-;7970:117;8111:78;8181:7;8172:6;8161:9;8157:22;8111:78;:::i;:::-;8101:88;;7896:303;7522:684;;;;;:::o;8212:117::-;8321:1;8318;8311:12;8335:308;8397:4;8487:18;8479:6;8476:30;8473:56;;;8509:18;;:::i;:::-;8473:56;8547:29;8569:6;8547:29;:::i;:::-;8539:37;;8631:4;8625;8621:15;8613:23;;8335:308;;;:::o;8649:146::-;8746:6;8741:3;8736;8723:30;8787:1;8778:6;8773:3;8769:16;8762:27;8649:146;;;:::o;8801:425::-;8879:5;8904:66;8920:49;8962:6;8920:49;:::i;:::-;8904:66;:::i;:::-;8895:75;;8993:6;8986:5;8979:21;9031:4;9024:5;9020:16;9069:3;9060:6;9055:3;9051:16;9048:25;9045:112;;;9076:79;;:::i;:::-;9045:112;9166:54;9213:6;9208:3;9203;9166:54;:::i;:::-;8885:341;8801:425;;;;;:::o;9246:340::-;9302:5;9351:3;9344:4;9336:6;9332:17;9328:27;9318:122;;9359:79;;:::i;:::-;9318:122;9476:6;9463:20;9501:79;9576:3;9568:6;9561:4;9553:6;9549:17;9501:79;:::i;:::-;9492:88;;9308:278;9246:340;;;;:::o;9592:509::-;9661:6;9710:2;9698:9;9689:7;9685:23;9681:32;9678:119;;;9716:79;;:::i;:::-;9678:119;9864:1;9853:9;9849:17;9836:31;9894:18;9886:6;9883:30;9880:117;;;9916:79;;:::i;:::-;9880:117;10021:63;10076:7;10067:6;10056:9;10052:22;10021:63;:::i;:::-;10011:73;;9807:287;9592:509;;;;:::o;10107:307::-;10168:4;10258:18;10250:6;10247:30;10244:56;;;10280:18;;:::i;:::-;10244:56;10318:29;10340:6;10318:29;:::i;:::-;10310:37;;10402:4;10396;10392:15;10384:23;;10107:307;;;:::o;10420:423::-;10497:5;10522:65;10538:48;10579:6;10538:48;:::i;:::-;10522:65;:::i;:::-;10513:74;;10610:6;10603:5;10596:21;10648:4;10641:5;10637:16;10686:3;10677:6;10672:3;10668:16;10665:25;10662:112;;;10693:79;;:::i;:::-;10662:112;10783:54;10830:6;10825:3;10820;10783:54;:::i;:::-;10503:340;10420:423;;;;;:::o;10862:338::-;10917:5;10966:3;10959:4;10951:6;10947:17;10943:27;10933:122;;10974:79;;:::i;:::-;10933:122;11091:6;11078:20;11116:78;11190:3;11182:6;11175:4;11167:6;11163:17;11116:78;:::i;:::-;11107:87;;10923:277;10862:338;;;;:::o;11206:1509::-;11360:6;11368;11376;11384;11392;11441:3;11429:9;11420:7;11416:23;11412:33;11409:120;;;11448:79;;:::i;:::-;11409:120;11568:1;11593:53;11638:7;11629:6;11618:9;11614:22;11593:53;:::i;:::-;11583:63;;11539:117;11695:2;11721:53;11766:7;11757:6;11746:9;11742:22;11721:53;:::i;:::-;11711:63;;11666:118;11851:2;11840:9;11836:18;11823:32;11882:18;11874:6;11871:30;11868:117;;;11904:79;;:::i;:::-;11868:117;12009:78;12079:7;12070:6;12059:9;12055:22;12009:78;:::i;:::-;11999:88;;11794:303;12164:2;12153:9;12149:18;12136:32;12195:18;12187:6;12184:30;12181:117;;;12217:79;;:::i;:::-;12181:117;12322:78;12392:7;12383:6;12372:9;12368:22;12322:78;:::i;:::-;12312:88;;12107:303;12477:3;12466:9;12462:19;12449:33;12509:18;12501:6;12498:30;12495:117;;;12531:79;;:::i;:::-;12495:117;12636:62;12690:7;12681:6;12670:9;12666:22;12636:62;:::i;:::-;12626:72;;12420:288;11206:1509;;;;;;;;:::o;12721:118::-;12808:24;12826:5;12808:24;:::i;:::-;12803:3;12796:37;12721:118;;:::o;12845:222::-;12938:4;12976:2;12965:9;12961:18;12953:26;;12989:71;13057:1;13046:9;13042:17;13033:6;12989:71;:::i;:::-;12845:222;;;;:::o;13073:117::-;13182:1;13179;13172:12;13213:568;13286:8;13296:6;13346:3;13339:4;13331:6;13327:17;13323:27;13313:122;;13354:79;;:::i;:::-;13313:122;13467:6;13454:20;13444:30;;13497:18;13489:6;13486:30;13483:117;;;13519:79;;:::i;:::-;13483:117;13633:4;13625:6;13621:17;13609:29;;13687:3;13679:4;13671:6;13667:17;13657:8;13653:32;13650:41;13647:128;;;13694:79;;:::i;:::-;13647:128;13213:568;;;;;:::o;13787:559::-;13873:6;13881;13930:2;13918:9;13909:7;13905:23;13901:32;13898:119;;;13936:79;;:::i;:::-;13898:119;14084:1;14073:9;14069:17;14056:31;14114:18;14106:6;14103:30;14100:117;;;14136:79;;:::i;:::-;14100:117;14249:80;14321:7;14312:6;14301:9;14297:22;14249:80;:::i;:::-;14231:98;;;;14027:312;13787:559;;;;;:::o;14352:311::-;14429:4;14519:18;14511:6;14508:30;14505:56;;;14541:18;;:::i;:::-;14505:56;14591:4;14583:6;14579:17;14571:25;;14651:4;14645;14641:15;14633:23;;14352:311;;;:::o;14686:710::-;14782:5;14807:81;14823:64;14880:6;14823:64;:::i;:::-;14807:81;:::i;:::-;14798:90;;14908:5;14937:6;14930:5;14923:21;14971:4;14964:5;14960:16;14953:23;;15024:4;15016:6;15012:17;15004:6;15000:30;15053:3;15045:6;15042:15;15039:122;;;15072:79;;:::i;:::-;15039:122;15187:6;15170:220;15204:6;15199:3;15196:15;15170:220;;;15279:3;15308:37;15341:3;15329:10;15308:37;:::i;:::-;15303:3;15296:50;15375:4;15370:3;15366:14;15359:21;;15246:144;15230:4;15225:3;15221:14;15214:21;;15170:220;;;15174:21;14788:608;;14686:710;;;;;:::o;15419:370::-;15490:5;15539:3;15532:4;15524:6;15520:17;15516:27;15506:122;;15547:79;;:::i;:::-;15506:122;15664:6;15651:20;15689:94;15779:3;15771:6;15764:4;15756:6;15752:17;15689:94;:::i;:::-;15680:103;;15496:293;15419:370;;;;:::o;15795:894::-;15913:6;15921;15970:2;15958:9;15949:7;15945:23;15941:32;15938:119;;;15976:79;;:::i;:::-;15938:119;16124:1;16113:9;16109:17;16096:31;16154:18;16146:6;16143:30;16140:117;;;16176:79;;:::i;:::-;16140:117;16281:78;16351:7;16342:6;16331:9;16327:22;16281:78;:::i;:::-;16271:88;;16067:302;16436:2;16425:9;16421:18;16408:32;16467:18;16459:6;16456:30;16453:117;;;16489:79;;:::i;:::-;16453:117;16594:78;16664:7;16655:6;16644:9;16640:22;16594:78;:::i;:::-;16584:88;;16379:303;15795:894;;;;;:::o;16695:114::-;16762:6;16796:5;16790:12;16780:22;;16695:114;;;:::o;16815:184::-;16914:11;16948:6;16943:3;16936:19;16988:4;16983:3;16979:14;16964:29;;16815:184;;;;:::o;17005:132::-;17072:4;17095:3;17087:11;;17125:4;17120:3;17116:14;17108:22;;17005:132;;;:::o;17143:108::-;17220:24;17238:5;17220:24;:::i;:::-;17215:3;17208:37;17143:108;;:::o;17257:179::-;17326:10;17347:46;17389:3;17381:6;17347:46;:::i;:::-;17425:4;17420:3;17416:14;17402:28;;17257:179;;;;:::o;17442:113::-;17512:4;17544;17539:3;17535:14;17527:22;;17442:113;;;:::o;17591:732::-;17710:3;17739:54;17787:5;17739:54;:::i;:::-;17809:86;17888:6;17883:3;17809:86;:::i;:::-;17802:93;;17919:56;17969:5;17919:56;:::i;:::-;17998:7;18029:1;18014:284;18039:6;18036:1;18033:13;18014:284;;;18115:6;18109:13;18142:63;18201:3;18186:13;18142:63;:::i;:::-;18135:70;;18228:60;18281:6;18228:60;:::i;:::-;18218:70;;18074:224;18061:1;18058;18054:9;18049:14;;18014:284;;;18018:14;18314:3;18307:10;;17715:608;;;17591:732;;;;:::o;18329:373::-;18472:4;18510:2;18499:9;18495:18;18487:26;;18559:9;18553:4;18549:20;18545:1;18534:9;18530:17;18523:47;18587:108;18690:4;18681:6;18587:108;:::i;:::-;18579:116;;18329:373;;;;:::o;18708:101::-;18744:7;18784:18;18777:5;18773:30;18762:41;;18708:101;;;:::o;18815:120::-;18887:23;18904:5;18887:23;:::i;:::-;18880:5;18877:34;18867:62;;18925:1;18922;18915:12;18867:62;18815:120;:::o;18941:137::-;18986:5;19024:6;19011:20;19002:29;;19040:32;19066:5;19040:32;:::i;:::-;18941:137;;;;:::o;19084:327::-;19142:6;19191:2;19179:9;19170:7;19166:23;19162:32;19159:119;;;19197:79;;:::i;:::-;19159:119;19317:1;19342:52;19386:7;19377:6;19366:9;19362:22;19342:52;:::i;:::-;19332:62;;19288:116;19084:327;;;;:::o;19417:77::-;19454:7;19483:5;19472:16;;19417:77;;;:::o;19500:122::-;19573:24;19591:5;19573:24;:::i;:::-;19566:5;19563:35;19553:63;;19612:1;19609;19602:12;19553:63;19500:122;:::o;19628:139::-;19674:5;19712:6;19699:20;19690:29;;19728:33;19755:5;19728:33;:::i;:::-;19628:139;;;;:::o;19773:472::-;19840:6;19848;19897:2;19885:9;19876:7;19872:23;19868:32;19865:119;;;19903:79;;:::i;:::-;19865:119;20023:1;20048:52;20092:7;20083:6;20072:9;20068:22;20048:52;:::i;:::-;20038:62;;19994:116;20149:2;20175:53;20220:7;20211:6;20200:9;20196:22;20175:53;:::i;:::-;20165:63;;20120:118;19773:472;;;;;:::o;20251:308::-;20360:4;20398:2;20387:9;20383:18;20375:26;;20411:65;20473:1;20462:9;20458:17;20449:6;20411:65;:::i;:::-;20486:66;20548:2;20537:9;20533:18;20524:6;20486:66;:::i;:::-;20251:308;;;;;:::o;20565:418::-;20702:4;20740:2;20729:9;20725:18;20717:26;;20753:71;20821:1;20810:9;20806:17;20797:6;20753:71;:::i;:::-;20834:66;20896:2;20885:9;20881:18;20872:6;20834:66;:::i;:::-;20910;20972:2;20961:9;20957:18;20948:6;20910:66;:::i;:::-;20565:418;;;;;;:::o;20989:116::-;21059:21;21074:5;21059:21;:::i;:::-;21052:5;21049:32;21039:60;;21095:1;21092;21085:12;21039:60;20989:116;:::o;21111:133::-;21154:5;21192:6;21179:20;21170:29;;21208:30;21232:5;21208:30;:::i;:::-;21111:133;;;;:::o;21250:468::-;21315:6;21323;21372:2;21360:9;21351:7;21347:23;21343:32;21340:119;;;21378:79;;:::i;:::-;21340:119;21498:1;21523:53;21568:7;21559:6;21548:9;21544:22;21523:53;:::i;:::-;21513:63;;21469:117;21625:2;21651:50;21693:7;21684:6;21673:9;21669:22;21651:50;:::i;:::-;21641:60;;21596:115;21250:468;;;;;:::o;21724:332::-;21845:4;21883:2;21872:9;21868:18;21860:26;;21896:71;21964:1;21953:9;21949:17;21940:6;21896:71;:::i;:::-;21977:72;22045:2;22034:9;22030:18;22021:6;21977:72;:::i;:::-;21724:332;;;;;:::o;22062:474::-;22130:6;22138;22187:2;22175:9;22166:7;22162:23;22158:32;22155:119;;;22193:79;;:::i;:::-;22155:119;22313:1;22338:53;22383:7;22374:6;22363:9;22359:22;22338:53;:::i;:::-;22328:63;;22284:117;22440:2;22466:53;22511:7;22502:6;22491:9;22487:22;22466:53;:::i;:::-;22456:63;;22411:118;22062:474;;;;;:::o;22542:1089::-;22646:6;22654;22662;22670;22678;22727:3;22715:9;22706:7;22702:23;22698:33;22695:120;;;22734:79;;:::i;:::-;22695:120;22854:1;22879:53;22924:7;22915:6;22904:9;22900:22;22879:53;:::i;:::-;22869:63;;22825:117;22981:2;23007:53;23052:7;23043:6;23032:9;23028:22;23007:53;:::i;:::-;22997:63;;22952:118;23109:2;23135:53;23180:7;23171:6;23160:9;23156:22;23135:53;:::i;:::-;23125:63;;23080:118;23237:2;23263:53;23308:7;23299:6;23288:9;23284:22;23263:53;:::i;:::-;23253:63;;23208:118;23393:3;23382:9;23378:19;23365:33;23425:18;23417:6;23414:30;23411:117;;;23447:79;;:::i;:::-;23411:117;23552:62;23606:7;23597:6;23586:9;23582:22;23552:62;:::i;:::-;23542:72;;23336:288;22542:1089;;;;;;;;:::o;23637:539::-;23721:6;23770:2;23758:9;23749:7;23745:23;23741:32;23738:119;;;23776:79;;:::i;:::-;23738:119;23924:1;23913:9;23909:17;23896:31;23954:18;23946:6;23943:30;23940:117;;;23976:79;;:::i;:::-;23940:117;24081:78;24151:7;24142:6;24131:9;24127:22;24081:78;:::i;:::-;24071:88;;23867:302;23637:539;;;;:::o;24182:229::-;24322:34;24318:1;24310:6;24306:14;24299:58;24391:12;24386:2;24378:6;24374:15;24367:37;24182:229;:::o;24417:366::-;24559:3;24580:67;24644:2;24639:3;24580:67;:::i;:::-;24573:74;;24656:93;24745:3;24656:93;:::i;:::-;24774:2;24769:3;24765:12;24758:19;;24417:366;;;:::o;24789:419::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:131;25196:4;25070:131;:::i;:::-;25062:139;;24789:419;;;:::o;25214:180::-;25262:77;25259:1;25252:88;25359:4;25356:1;25349:15;25383:4;25380:1;25373:15;25400:320;25444:6;25481:1;25475:4;25471:12;25461:22;;25528:1;25522:4;25518:12;25549:18;25539:81;;25605:4;25597:6;25593:17;25583:27;;25539:81;25667:2;25659:6;25656:14;25636:18;25633:38;25630:84;;25686:18;;:::i;:::-;25630:84;25451:269;25400:320;;;:::o;25726:118::-;25813:24;25831:5;25813:24;:::i;:::-;25808:3;25801:37;25726:118;;:::o;25850:115::-;25935:23;25952:5;25935:23;:::i;:::-;25930:3;25923:36;25850:115;;:::o;25971:89::-;26007:7;26047:6;26040:5;26036:18;26025:29;;25971:89;;;:::o;26066:115::-;26151:23;26168:5;26151:23;:::i;:::-;26146:3;26139:36;26066:115;;:::o;26187:93::-;26223:7;26263:10;26256:5;26252:22;26241:33;;26187:93;;;:::o;26286:115::-;26371:23;26388:5;26371:23;:::i;:::-;26366:3;26359:36;26286:115;;:::o;26407:648::-;26604:4;26642:3;26631:9;26627:19;26619:27;;26656:71;26724:1;26713:9;26709:17;26700:6;26656:71;:::i;:::-;26737:70;26803:2;26792:9;26788:18;26779:6;26737:70;:::i;:::-;26817;26883:2;26872:9;26868:18;26859:6;26817:70;:::i;:::-;26897;26963:2;26952:9;26948:18;26939:6;26897:70;:::i;:::-;26977:71;27043:3;27032:9;27028:19;27019:6;26977:71;:::i;:::-;26407:648;;;;;;;;:::o;27061:143::-;27118:5;27149:6;27143:13;27134:22;;27165:33;27192:5;27165:33;:::i;:::-;27061:143;;;;:::o;27210:351::-;27280:6;27329:2;27317:9;27308:7;27304:23;27300:32;27297:119;;;27335:79;;:::i;:::-;27297:119;27455:1;27480:64;27536:7;27527:6;27516:9;27512:22;27480:64;:::i;:::-;27470:74;;27426:128;27210:351;;;;:::o;27567:328::-;27686:4;27724:2;27713:9;27709:18;27701:26;;27737:71;27805:1;27794:9;27790:17;27781:6;27737:71;:::i;:::-;27818:70;27884:2;27873:9;27869:18;27860:6;27818:70;:::i;:::-;27567:328;;;;;:::o;27901:148::-;28003:11;28040:3;28025:18;;27901:148;;;;:::o;28055:141::-;28104:4;28127:3;28119:11;;28150:3;28147:1;28140:14;28184:4;28181:1;28171:18;28163:26;;28055:141;;;:::o;28226:874::-;28329:3;28366:5;28360:12;28395:36;28421:9;28395:36;:::i;:::-;28447:89;28529:6;28524:3;28447:89;:::i;:::-;28440:96;;28567:1;28556:9;28552:17;28583:1;28578:166;;;;28758:1;28753:341;;;;28545:549;;28578:166;28662:4;28658:9;28647;28643:25;28638:3;28631:38;28724:6;28717:14;28710:22;28702:6;28698:35;28693:3;28689:45;28682:52;;28578:166;;28753:341;28820:38;28852:5;28820:38;:::i;:::-;28880:1;28894:154;28908:6;28905:1;28902:13;28894:154;;;28982:7;28976:14;28972:1;28967:3;28963:11;28956:35;29032:1;29023:7;29019:15;29008:26;;28930:4;28927:1;28923:12;28918:17;;28894:154;;;29077:6;29072:3;29068:16;29061:23;;28760:334;;28545:549;;28333:767;;28226:874;;;;:::o;29106:390::-;29212:3;29240:39;29273:5;29240:39;:::i;:::-;29295:89;29377:6;29372:3;29295:89;:::i;:::-;29288:96;;29393:65;29451:6;29446:3;29439:4;29432:5;29428:16;29393:65;:::i;:::-;29483:6;29478:3;29474:16;29467:23;;29216:280;29106:390;;;;:::o;29502:155::-;29642:7;29638:1;29630:6;29626:14;29619:31;29502:155;:::o;29663:400::-;29823:3;29844:84;29926:1;29921:3;29844:84;:::i;:::-;29837:91;;29937:93;30026:3;29937:93;:::i;:::-;30055:1;30050:3;30046:11;30039:18;;29663:400;;;:::o;30069:695::-;30347:3;30369:92;30457:3;30448:6;30369:92;:::i;:::-;30362:99;;30478:95;30569:3;30560:6;30478:95;:::i;:::-;30471:102;;30590:148;30734:3;30590:148;:::i;:::-;30583:155;;30755:3;30748:10;;30069:695;;;;;:::o;30770:332::-;30891:4;30929:2;30918:9;30914:18;30906:26;;30942:71;31010:1;30999:9;30995:17;30986:6;30942:71;:::i;:::-;31023:72;31091:2;31080:9;31076:18;31067:6;31023:72;:::i;:::-;30770:332;;;;;:::o;31108:93::-;31145:6;31192:2;31187;31180:5;31176:14;31172:23;31162:33;;31108:93;;;:::o;31207:107::-;31251:8;31301:5;31295:4;31291:16;31270:37;;31207:107;;;;:::o;31320:393::-;31389:6;31439:1;31427:10;31423:18;31462:97;31492:66;31481:9;31462:97;:::i;:::-;31580:39;31610:8;31599:9;31580:39;:::i;:::-;31568:51;;31652:4;31648:9;31641:5;31637:21;31628:30;;31701:4;31691:8;31687:19;31680:5;31677:30;31667:40;;31396:317;;31320:393;;;;;:::o;31719:60::-;31747:3;31768:5;31761:12;;31719:60;;;:::o;31785:142::-;31835:9;31868:53;31886:34;31895:24;31913:5;31895:24;:::i;:::-;31886:34;:::i;:::-;31868:53;:::i;:::-;31855:66;;31785:142;;;:::o;31933:75::-;31976:3;31997:5;31990:12;;31933:75;;;:::o;32014:269::-;32124:39;32155:7;32124:39;:::i;:::-;32185:91;32234:41;32258:16;32234:41;:::i;:::-;32226:6;32219:4;32213:11;32185:91;:::i;:::-;32179:4;32172:105;32090:193;32014:269;;;:::o;32289:73::-;32334:3;32289:73;:::o;32368:189::-;32445:32;;:::i;:::-;32486:65;32544:6;32536;32530:4;32486:65;:::i;:::-;32421:136;32368:189;;:::o;32563:186::-;32623:120;32640:3;32633:5;32630:14;32623:120;;;32694:39;32731:1;32724:5;32694:39;:::i;:::-;32667:1;32660:5;32656:13;32647:22;;32623:120;;;32563:186;;:::o;32755:543::-;32856:2;32851:3;32848:11;32845:446;;;32890:38;32922:5;32890:38;:::i;:::-;32974:29;32992:10;32974:29;:::i;:::-;32964:8;32960:44;33157:2;33145:10;33142:18;33139:49;;;33178:8;33163:23;;33139:49;33201:80;33257:22;33275:3;33257:22;:::i;:::-;33247:8;33243:37;33230:11;33201:80;:::i;:::-;32860:431;;32845:446;32755:543;;;:::o;33304:117::-;33358:8;33408:5;33402:4;33398:16;33377:37;;33304:117;;;;:::o;33427:169::-;33471:6;33504:51;33552:1;33548:6;33540:5;33537:1;33533:13;33504:51;:::i;:::-;33500:56;33585:4;33579;33575:15;33565:25;;33478:118;33427:169;;;;:::o;33601:295::-;33677:4;33823:29;33848:3;33842:4;33823:29;:::i;:::-;33815:37;;33885:3;33882:1;33878:11;33872:4;33869:21;33861:29;;33601:295;;;;:::o;33901:1395::-;34018:37;34051:3;34018:37;:::i;:::-;34120:18;34112:6;34109:30;34106:56;;;34142:18;;:::i;:::-;34106:56;34186:38;34218:4;34212:11;34186:38;:::i;:::-;34271:67;34331:6;34323;34317:4;34271:67;:::i;:::-;34365:1;34389:4;34376:17;;34421:2;34413:6;34410:14;34438:1;34433:618;;;;35095:1;35112:6;35109:77;;;35161:9;35156:3;35152:19;35146:26;35137:35;;35109:77;35212:67;35272:6;35265:5;35212:67;:::i;:::-;35206:4;35199:81;35068:222;34403:887;;34433:618;34485:4;34481:9;34473:6;34469:22;34519:37;34551:4;34519:37;:::i;:::-;34578:1;34592:208;34606:7;34603:1;34600:14;34592:208;;;34685:9;34680:3;34676:19;34670:26;34662:6;34655:42;34736:1;34728:6;34724:14;34714:24;;34783:2;34772:9;34768:18;34755:31;;34629:4;34626:1;34622:12;34617:17;;34592:208;;;34828:6;34819:7;34816:19;34813:179;;;34886:9;34881:3;34877:19;34871:26;34929:48;34971:4;34963:6;34959:17;34948:9;34929:48;:::i;:::-;34921:6;34914:64;34836:156;34813:179;35038:1;35034;35026:6;35022:14;35018:22;35012:4;35005:36;34440:611;;;34403:887;;33993:1303;;;33901:1395;;:::o;35302:233::-;35442:34;35438:1;35430:6;35426:14;35419:58;35511:16;35506:2;35498:6;35494:15;35487:41;35302:233;:::o;35541:366::-;35683:3;35704:67;35768:2;35763:3;35704:67;:::i;:::-;35697:74;;35780:93;35869:3;35780:93;:::i;:::-;35898:2;35893:3;35889:12;35882:19;;35541:366;;;:::o;35913:419::-;36079:4;36117:2;36106:9;36102:18;36094:26;;36166:9;36160:4;36156:20;36152:1;36141:9;36137:17;36130:47;36194:131;36320:4;36194:131;:::i;:::-;36186:139;;35913:419;;;:::o;36338:180::-;36386:77;36383:1;36376:88;36483:4;36480:1;36473:15;36507:4;36504:1;36497:15;36524:180;36572:77;36569:1;36562:88;36669:4;36666:1;36659:15;36693:4;36690:1;36683:15;36710:233;36749:3;36772:24;36790:5;36772:24;:::i;:::-;36763:33;;36818:66;36811:5;36808:77;36805:103;;36888:18;;:::i;:::-;36805:103;36935:1;36928:5;36924:13;36917:20;;36710:233;;;:::o;36949:228::-;37089:34;37085:1;37077:6;37073:14;37066:58;37158:11;37153:2;37145:6;37141:15;37134:36;36949:228;:::o;37183:366::-;37325:3;37346:67;37410:2;37405:3;37346:67;:::i;:::-;37339:74;;37422:93;37511:3;37422:93;:::i;:::-;37540:2;37535:3;37531:12;37524:19;;37183:366;;;:::o;37555:419::-;37721:4;37759:2;37748:9;37744:18;37736:26;;37808:9;37802:4;37798:20;37794:1;37783:9;37779:17;37772:47;37836:131;37962:4;37836:131;:::i;:::-;37828:139;;37555:419;;;:::o;37980:147::-;38081:11;38118:3;38103:18;;37980:147;;;;:::o;38133:114::-;;:::o;38253:398::-;38412:3;38433:83;38514:1;38509:3;38433:83;:::i;:::-;38426:90;;38525:93;38614:3;38525:93;:::i;:::-;38643:1;38638:3;38634:11;38627:18;;38253:398;;;:::o;38657:379::-;38841:3;38863:147;39006:3;38863:147;:::i;:::-;38856:154;;39027:3;39020:10;;38657:379;;;:::o;39042:410::-;39082:7;39105:20;39123:1;39105:20;:::i;:::-;39100:25;;39139:20;39157:1;39139:20;:::i;:::-;39134:25;;39194:1;39191;39187:9;39216:30;39234:11;39216:30;:::i;:::-;39205:41;;39395:1;39386:7;39382:15;39379:1;39376:22;39356:1;39349:9;39329:83;39306:139;;39425:18;;:::i;:::-;39306:139;39090:362;39042:410;;;;:::o;39458:180::-;39506:77;39503:1;39496:88;39603:4;39600:1;39593:15;39627:4;39624:1;39617:15;39644:185;39684:1;39701:20;39719:1;39701:20;:::i;:::-;39696:25;;39735:20;39753:1;39735:20;:::i;:::-;39730:25;;39774:1;39764:35;;39779:18;;:::i;:::-;39764:35;39821:1;39818;39814:9;39809:14;;39644:185;;;;:::o;39835:225::-;39975:34;39971:1;39963:6;39959:14;39952:58;40044:8;40039:2;40031:6;40027:15;40020:33;39835:225;:::o;40066:366::-;40208:3;40229:67;40293:2;40288:3;40229:67;:::i;:::-;40222:74;;40305:93;40394:3;40305:93;:::i;:::-;40423:2;40418:3;40414:12;40407:19;;40066:366;;;:::o;40438:419::-;40604:4;40642:2;40631:9;40627:18;40619:26;;40691:9;40685:4;40681:20;40677:1;40666:9;40662:17;40655:47;40719:131;40845:4;40719:131;:::i;:::-;40711:139;;40438:419;;;:::o;40863:182::-;41003:34;40999:1;40991:6;40987:14;40980:58;40863:182;:::o;41051:366::-;41193:3;41214:67;41278:2;41273:3;41214:67;:::i;:::-;41207:74;;41290:93;41379:3;41290:93;:::i;:::-;41408:2;41403:3;41399:12;41392:19;;41051:366;;;:::o;41423:419::-;41589:4;41627:2;41616:9;41612:18;41604:26;;41676:9;41670:4;41666:20;41662:1;41651:9;41647:17;41640:47;41704:131;41830:4;41704:131;:::i;:::-;41696:139;;41423:419;;;:::o;41848:181::-;41988:33;41984:1;41976:6;41972:14;41965:57;41848:181;:::o;42035:366::-;42177:3;42198:67;42262:2;42257:3;42198:67;:::i;:::-;42191:74;;42274:93;42363:3;42274:93;:::i;:::-;42392:2;42387:3;42383:12;42376:19;;42035:366;;;:::o;42407:419::-;42573:4;42611:2;42600:9;42596:18;42588:26;;42660:9;42654:4;42650:20;42646:1;42635:9;42631:17;42624:47;42688:131;42814:4;42688:131;:::i;:::-;42680:139;;42407:419;;;:::o;42832:176::-;42864:1;42881:20;42899:1;42881:20;:::i;:::-;42876:25;;42915:20;42933:1;42915:20;:::i;:::-;42910:25;;42954:1;42944:35;;42959:18;;:::i;:::-;42944:35;43000:1;42997;42993:9;42988:14;;42832:176;;;;:::o;43014:191::-;43054:3;43073:20;43091:1;43073:20;:::i;:::-;43068:25;;43107:20;43125:1;43107:20;:::i;:::-;43102:25;;43150:1;43147;43143:9;43136:16;;43171:3;43168:1;43165:10;43162:36;;;43178:18;;:::i;:::-;43162:36;43014:191;;;;:::o;43211:194::-;43251:4;43271:20;43289:1;43271:20;:::i;:::-;43266:25;;43305:20;43323:1;43305:20;:::i;:::-;43300:25;;43349:1;43346;43342:9;43334:17;;43373:1;43367:4;43364:11;43361:37;;;43378:18;;:::i;:::-;43361:37;43211:194;;;;:::o;43411:483::-;43582:4;43620:2;43609:9;43605:18;43597:26;;43633:71;43701:1;43690:9;43686:17;43677:6;43633:71;:::i;:::-;43751:9;43745:4;43741:20;43736:2;43725:9;43721:18;43714:48;43779:108;43882:4;43873:6;43779:108;:::i;:::-;43771:116;;43411:483;;;;;:::o;43900:227::-;44040:34;44036:1;44028:6;44024:14;44017:58;44109:10;44104:2;44096:6;44092:15;44085:35;43900:227;:::o;44133:366::-;44275:3;44296:67;44360:2;44355:3;44296:67;:::i;:::-;44289:74;;44372:93;44461:3;44372:93;:::i;:::-;44490:2;44485:3;44481:12;44474:19;;44133:366;;;:::o;44505:419::-;44671:4;44709:2;44698:9;44694:18;44686:26;;44758:9;44752:4;44748:20;44744:1;44733:9;44729:17;44722:47;44786:131;44912:4;44786:131;:::i;:::-;44778:139;;44505:419;;;:::o;44930:224::-;45070:34;45066:1;45058:6;45054:14;45047:58;45139:7;45134:2;45126:6;45122:15;45115:32;44930:224;:::o;45160:366::-;45302:3;45323:67;45387:2;45382:3;45323:67;:::i;:::-;45316:74;;45399:93;45488:3;45399:93;:::i;:::-;45517:2;45512:3;45508:12;45501:19;;45160:366;;;:::o;45532:419::-;45698:4;45736:2;45725:9;45721:18;45713:26;;45785:9;45779:4;45775:20;45771:1;45760:9;45756:17;45749:47;45813:131;45939:4;45813:131;:::i;:::-;45805:139;;45532:419;;;:::o;45957:229::-;46097:34;46093:1;46085:6;46081:14;46074:58;46166:12;46161:2;46153:6;46149:15;46142:37;45957:229;:::o;46192:366::-;46334:3;46355:67;46419:2;46414:3;46355:67;:::i;:::-;46348:74;;46431:93;46520:3;46431:93;:::i;:::-;46549:2;46544:3;46540:12;46533:19;;46192:366;;;:::o;46564:419::-;46730:4;46768:2;46757:9;46753:18;46745:26;;46817:9;46811:4;46807:20;46803:1;46792:9;46788:17;46781:47;46845:131;46971:4;46845:131;:::i;:::-;46837:139;;46564:419;;;:::o;46989:634::-;47210:4;47248:2;47237:9;47233:18;47225:26;;47297:9;47291:4;47287:20;47283:1;47272:9;47268:17;47261:47;47325:108;47428:4;47419:6;47325:108;:::i;:::-;47317:116;;47480:9;47474:4;47470:20;47465:2;47454:9;47450:18;47443:48;47508:108;47611:4;47602:6;47508:108;:::i;:::-;47500:116;;46989:634;;;;;:::o;47629:228::-;47769:34;47765:1;47757:6;47753:14;47746:58;47838:11;47833:2;47825:6;47821:15;47814:36;47629:228;:::o;47863:366::-;48005:3;48026:67;48090:2;48085:3;48026:67;:::i;:::-;48019:74;;48102:93;48191:3;48102:93;:::i;:::-;48220:2;48215:3;48211:12;48204:19;;47863:366;;;:::o;48235:419::-;48401:4;48439:2;48428:9;48424:18;48416:26;;48488:9;48482:4;48478:20;48474:1;48463:9;48459:17;48452:47;48516:131;48642:4;48516:131;:::i;:::-;48508:139;;48235:419;;;:::o;48660:332::-;48781:4;48819:2;48808:9;48804:18;48796:26;;48832:71;48900:1;48889:9;48885:17;48876:6;48832:71;:::i;:::-;48913:72;48981:2;48970:9;48966:18;48957:6;48913:72;:::i;:::-;48660:332;;;;;:::o;48998:220::-;49138:34;49134:1;49126:6;49122:14;49115:58;49207:3;49202:2;49194:6;49190:15;49183:28;48998:220;:::o;49224:366::-;49366:3;49387:67;49451:2;49446:3;49387:67;:::i;:::-;49380:74;;49463:93;49552:3;49463:93;:::i;:::-;49581:2;49576:3;49572:12;49565:19;;49224:366;;;:::o;49596:419::-;49762:4;49800:2;49789:9;49785:18;49777:26;;49849:9;49843:4;49839:20;49835:1;49824:9;49820:17;49813:47;49877:131;50003:4;49877:131;:::i;:::-;49869:139;;49596:419;;;:::o;50021:79::-;50060:7;50089:5;50078:16;;50021:79;;;:::o;50106:157::-;50211:45;50231:24;50249:5;50231:24;:::i;:::-;50211:45;:::i;:::-;50206:3;50199:58;50106:157;;:::o;50269:94::-;50302:8;50350:5;50346:2;50342:14;50321:35;;50269:94;;;:::o;50369:::-;50408:7;50437:20;50451:5;50437:20;:::i;:::-;50426:31;;50369:94;;;:::o;50469:100::-;50508:7;50537:26;50557:5;50537:26;:::i;:::-;50526:37;;50469:100;;;:::o;50575:157::-;50680:45;50700:24;50718:5;50700:24;:::i;:::-;50680:45;:::i;:::-;50675:3;50668:58;50575:157;;:::o;50738:538::-;50906:3;50921:75;50992:3;50983:6;50921:75;:::i;:::-;51021:2;51016:3;51012:12;51005:19;;51034:75;51105:3;51096:6;51034:75;:::i;:::-;51134:2;51129:3;51125:12;51118:19;;51147:75;51218:3;51209:6;51147:75;:::i;:::-;51247:2;51242:3;51238:12;51231:19;;51267:3;51260:10;;50738:538;;;;;;:::o;51282:98::-;51333:6;51367:5;51361:12;51351:22;;51282:98;;;:::o;51386:168::-;51469:11;51503:6;51498:3;51491:19;51543:4;51538:3;51534:14;51519:29;;51386:168;;;;:::o;51560:373::-;51646:3;51674:38;51706:5;51674:38;:::i;:::-;51728:70;51791:6;51786:3;51728:70;:::i;:::-;51721:77;;51807:65;51865:6;51860:3;51853:4;51846:5;51842:16;51807:65;:::i;:::-;51897:29;51919:6;51897:29;:::i;:::-;51892:3;51888:39;51881:46;;51650:283;51560:373;;;;:::o;51939:1053::-;52262:4;52300:3;52289:9;52285:19;52277:27;;52314:71;52382:1;52371:9;52367:17;52358:6;52314:71;:::i;:::-;52395:72;52463:2;52452:9;52448:18;52439:6;52395:72;:::i;:::-;52514:9;52508:4;52504:20;52499:2;52488:9;52484:18;52477:48;52542:108;52645:4;52636:6;52542:108;:::i;:::-;52534:116;;52697:9;52691:4;52687:20;52682:2;52671:9;52667:18;52660:48;52725:108;52828:4;52819:6;52725:108;:::i;:::-;52717:116;;52881:9;52875:4;52871:20;52865:3;52854:9;52850:19;52843:49;52909:76;52980:4;52971:6;52909:76;:::i;:::-;52901:84;;51939:1053;;;;;;;;:::o;52998:141::-;53054:5;53085:6;53079:13;53070:22;;53101:32;53127:5;53101:32;:::i;:::-;52998:141;;;;:::o;53145:349::-;53214:6;53263:2;53251:9;53242:7;53238:23;53234:32;53231:119;;;53269:79;;:::i;:::-;53231:119;53389:1;53414:63;53469:7;53460:6;53449:9;53445:22;53414:63;:::i;:::-;53404:73;;53360:127;53145:349;;;;:::o;53500:106::-;53544:8;53593:5;53588:3;53584:15;53563:36;;53500:106;;;:::o;53612:183::-;53647:3;53685:1;53667:16;53664:23;53661:128;;;53723:1;53720;53717;53702:23;53745:34;53776:1;53770:8;53745:34;:::i;:::-;53738:41;;53661:128;53612:183;:::o;53801:711::-;53840:3;53878:4;53860:16;53857:26;53886:5;53854:39;53915:20;;:::i;:::-;53990:1;53972:16;53968:24;53965:1;53959:4;53944:49;54023:4;54017:11;54122:16;54115:4;54107:6;54103:17;54100:39;54067:18;54059:6;54056:30;54040:113;54037:146;;;54168:5;;;;54037:146;54214:6;54208:4;54204:17;54250:3;54244:10;54277:18;54269:6;54266:30;54263:43;;;54299:5;;;;;;54263:43;54347:6;54340:4;54335:3;54331:14;54327:27;54406:1;54388:16;54384:24;54378:4;54374:35;54369:3;54366:44;54363:57;;;54413:5;;;;;;;54363:57;54430;54478:6;54472:4;54468:17;54460:6;54456:30;54450:4;54430:57;:::i;:::-;54503:3;54496:10;;53844:668;;;;;53801:711;;:::o;54518:239::-;54658:34;54654:1;54646:6;54642:14;54635:58;54727:22;54722:2;54714:6;54710:15;54703:47;54518:239;:::o;54763:366::-;54905:3;54926:67;54990:2;54985:3;54926:67;:::i;:::-;54919:74;;55002:93;55091:3;55002:93;:::i;:::-;55120:2;55115:3;55111:12;55104:19;;54763:366;;;:::o;55135:419::-;55301:4;55339:2;55328:9;55324:18;55316:26;;55388:9;55382:4;55378:20;55374:1;55363:9;55359:17;55352:47;55416:131;55542:4;55416:131;:::i;:::-;55408:139;;55135:419;;;:::o;55560:227::-;55700:34;55696:1;55688:6;55684:14;55677:58;55769:10;55764:2;55756:6;55752:15;55745:35;55560:227;:::o;55793:366::-;55935:3;55956:67;56020:2;56015:3;55956:67;:::i;:::-;55949:74;;56032:93;56121:3;56032:93;:::i;:::-;56150:2;56145:3;56141:12;56134:19;;55793:366;;;:::o;56165:419::-;56331:4;56369:2;56358:9;56354:18;56346:26;;56418:9;56412:4;56408:20;56404:1;56393:9;56389:17;56382:47;56446:131;56572:4;56446:131;:::i;:::-;56438:139;;56165:419;;;:::o;56590:751::-;56813:4;56851:3;56840:9;56836:19;56828:27;;56865:71;56933:1;56922:9;56918:17;56909:6;56865:71;:::i;:::-;56946:72;57014:2;57003:9;56999:18;56990:6;56946:72;:::i;:::-;57028;57096:2;57085:9;57081:18;57072:6;57028:72;:::i;:::-;57110;57178:2;57167:9;57163:18;57154:6;57110:72;:::i;:::-;57230:9;57224:4;57220:20;57214:3;57203:9;57199:19;57192:49;57258:76;57329:4;57320:6;57258:76;:::i;:::-;57250:84;;56590:751;;;;;;;;:::o;57347:227::-;57487:34;57483:1;57475:6;57471:14;57464:58;57556:10;57551:2;57543:6;57539:15;57532:35;57347:227;:::o;57580:366::-;57722:3;57743:67;57807:2;57802:3;57743:67;:::i;:::-;57736:74;;57819:93;57908:3;57819:93;:::i;:::-;57937:2;57932:3;57928:12;57921:19;;57580:366;;;:::o;57952:419::-;58118:4;58156:2;58145:9;58141:18;58133:26;;58205:9;58199:4;58195:20;58191:1;58180:9;58176:17;58169:47;58233:131;58359:4;58233:131;:::i;:::-;58225:139;;57952:419;;;:::o

Swarm Source

ipfs://2f33f4761dd05a3eba5a1f5f22026390ce810fec3ee8b1f7636259ed6a33106b
Loading