Token Business Card

Overview BRC721

Total Supply:
7 BCARD

Holders:
3 addresses

Transfers:
-

Profile Summary

 
Contract:
0x056ac821e4c0edaf366547c2ba3de78623378a730x056aC821e4C0EDaf366547c2bA3De78623378A73

Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xac2ef62E283A61D05A1f0a00CF9C8E6d74Ef43ca

Contract Name:
BusinessCard

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 16: BusinessCard.sol
// SPDX-License-Identifier: MIT

// Because every self-respected businessman needs his business card

pragma solidity ^0.8.0;

import "./BusinessCardUtils.sol";
import "./Ownable.sol";
import "./IERC721.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Metadata.sol";
import "./IERC721Receiver.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165Storage.sol";
import "./SafeMath.sol";
import "./EnumerableMap.sol";
import "./EnumerableSet.sol";

contract ISoulboundCard {

    function burnAllSoulboundCardsOfToken(uint256 tokenId) external { }

} 

/**
 * @title NFT Business Card smart contract
 * @dev compliant with https://eips.ethereum.org/EIPS/eip-721
 */
contract BusinessCard is ERC165Storage, IERC721, IERC721Metadata, IERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    // Public variables
    uint256 public constant maxSupply = 1111;
    bool public saleStarted;

    // Random nonce for generating genes
    uint256 private randNonce;

    struct Card {
        uint256 genes;
        string name;
    }

    // Mapping from token ID to genes
    mapping (uint256 => Card) private _tokenStats;
    // Mapping for reserved names, reserved names are stored in lowercase
    mapping (string => bool) private _nameReserved;

    // Values sent in the event when minting / updating a card
    // All the metadata attributes that do NOT get stored on chain
    struct CardProperties {
        string position;
        string twitterAccount;
        string telegramAccount;
        string telegramGroup;
        uint256 discordAccount;
        string discordGroup;
        string githubUsername;
        string website;
    }

    // Default URI
    string private _defaultURI;

    // Address of the oracle
    address private serverOracle;
    // Requests made to the NFT oracle
    mapping(uint256 => bool) public requests;

    // Marketplace address
    address private bCardMarketplace;
    // sCard address - SoulboundCards
    ISoulboundCard private sCard;

    // Token mint price
    uint256 public mintPrice = 10000 ether;
    // Token URI update / swap price
    uint256 public updatePrice = 5000 ether;
    // Oracle update transaction gas price
    uint256 public oraclePrice = 1500 ether;

    // Oracle related events
    event UpdateRequest(uint256 tokenId, uint256 genes, string name, CardProperties cardProperties);
    event SwapRequest(uint256 tokenId1, uint256 tokenId2, uint256 genes1, uint256 genes2);
    event TokenURIUpdated(uint256 tokenId, string tokenURI);

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection, and defining base and default URIs.
     */
    constructor (string memory name_, string memory symbol_, string memory baseURI_, string memory defaultURI_) {
        _name = name_;
        _symbol = symbol_;
        _baseURI = baseURI_;
        _defaultURI = defaultURI_;

        // register the supported interfaces to conform to ERC721 via ERC165
        /*
        *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
        *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
        *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
        *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
        *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
        *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
        *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
        *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
        *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
        *
        *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
        *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
        */
        _registerInterface(0x80ac58cd);

        /*
        *     bytes4(keccak256('name()')) == 0x06fdde03
        *     bytes4(keccak256('symbol()')) == 0x95d89b41
        *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
        *
        *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
        */
        _registerInterface(0x5b5e139f);

        /*
        *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
        *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
        *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
        *
        *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
        */
        _registerInterface(0x780e9d63);
    }
    
    /**
     * @dev Sets up a new oracle that handles the dynamic aspect of the NFT
     */
    function setOracle(address _serverOracle) external onlyOwner {
        serverOracle = _serverOracle;
    }

    /**
     * @dev Sets up a Marketplace allowing the native trading of Business Cards
     */
    function setMarketplace(address _marketplace) external onlyOwner {
        bCardMarketplace = _marketplace;
    }

    /**
     * @dev Sets up the sCard address for interaction
     */
    function setSoulboundCard(address _soulbound) external onlyOwner {
        sCard = ISoulboundCard(_soulbound);
    }

    /**
     * @dev Changes the update price for the usage of the oracle
     */
    function modifyUpdatePrice(uint256 newUpdatePrice) external onlyOwner {
        require(newUpdatePrice >= oraclePrice); // dev: Update price must always cover the gas costs of running the oracle
        updatePrice = newUpdatePrice;
    }

    /**
     * @dev Calls the oracle to update a certain token URI with the newly defined Card struct
     */
    function _updateTokenURI(uint256 _tokenId, uint256 _genes, string calldata _cardName, CardProperties calldata _cardProperties) internal {
        require(BusinessCardUtils.validateOtherProperties(_cardProperties));  // Other properties are not valid
        require(_exists(_tokenId));
        // Calls for updating the token can only be made if it is not being processed already
        require(requests[_tokenId] == false, "Update being processed");
        requests[_tokenId] = true;
        // Fund the server oracle with enough funds for the updateCallback transaction
        payable(serverOracle).transfer(oraclePrice);
        // Emit event to be catched by the server oracle running off-chain
        emit UpdateRequest(_tokenId, _genes, _cardName, _cardProperties);
    }

    /**
     * @dev Updates a certain token URI and clears the corresponding update request
     * Only the assigned server oracle is allowed to call this function
     */
     function updateCallback(uint256 _tokenId, string memory _tokenURI) external {
        _callback(_tokenId, _tokenURI);
    }

    /**
     * @dev Updates a certain token URI and clears the corresponding update request
     * Only the assigned server oracle is allowed to call this function
     */
     function swapCallback(uint256 _tokenId1, uint256 _tokenId2, string memory _tokenURI1, string memory _tokenURI2) external {
        _callback(_tokenId1, _tokenURI1);
        _callback(_tokenId2, _tokenURI2);
    }

    /**
     * @dev Updates a certain token URI and clears the corresponding update request
     * Only the assigned server oracle is allowed to call this function
     */
     function _callback(uint256 _tokenId, string memory _tokenURI) internal {
        require(_msgSender() == serverOracle); // dev: Only the assigned oracle can call this function
        require(requests[_tokenId]); // dev: Request not in pending list
        _tokenURIs[_tokenId] = _tokenURI;
        delete requests[_tokenId];
        emit TokenURIUpdated(_tokenId, _tokenURI);
     }

     /**
     * @dev Mints a new NFT Business Card
     */
    function getCard(string calldata _cardName, CardProperties calldata _cardProperties) public payable {
        require(saleStarted == true);  // dev: sale not started or paused, can be managed on frontend
        require(totalSupply() < maxSupply);  // dev: sale has ended, can be managed on frontend
        require(msg.value >= mintPrice);  // dev: value sent is below the price, can be managed on frontend
        // Minting a new NFT with the name and position provided
        _safeMint(_msgSender(), totalSupply() + 1, _cardName, _cardProperties);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address _to, uint256 _tokenId, string calldata _cardName, CardProperties calldata _cardProperties) internal virtual {
        require(
            BusinessCardUtils.validateName(_cardName) &&
            isNameReserved(_cardName) == false, 
            "Name taken or not valid"
        );
        require(
            BusinessCardUtils.validatePosition(_cardProperties.position), 
            "Position not valid"
        );

        // Generating the random genes, defined by a 26 digit number
        // The server oracle will convert the genes to a string and add leading zeros, as tokenURIs are generated with this constraint
        uint256 genes = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _cardName, randNonce))) % 10**30;
        randNonce++;
        
        // Generating a new card
        toggleReserveName(_cardName, true);
        _tokenStats[_tokenId] = Card(genes, _cardName);
        _safeMint(_to, _tokenId, abi.encodePacked(_cardName, genes));
        _updateTokenURI(_tokenId, genes, _cardName, _cardProperties);
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Changes the name and/or position of a given NFT, must be owned by the caller.
     * Whenever such change is made, it is first immediately reflected in the Card struct, and in the metadata after oracle updates.
     * User can change both name and position, just the name, or just the position (by leaving those inputs empty)
     */
    function updateCard(uint256 tokenId, string calldata newName, CardProperties calldata newCardProperties) public payable {
        require(saleStarted == true);  // dev: updates paused, can be managed on frontend
        require(_isApprovedOrOwner(_msgSender(), tokenId), "Caller is not owner nor approved");
        require(
            isNameReserved(newName) == false &&
            (
                bytes(newName).length == 0 
                ||
                BusinessCardUtils.validateName(newName) == true
            )
            , 
            "Name taken or not valid"
        );
        require(
            bytes(newCardProperties.position).length == 0
            ||
            BusinessCardUtils.validatePosition(newCardProperties.position) == true
            , 
            "Position not valid"
        );
        require(
            msg.value >= updatePrice || _msgSender() == bCardMarketplace
        );  // dev: value sent is below the price, can be managed on frontend

        // Only change the name if specified
        if (bytes(newName).length > 0) {
            // De-reserve the old name
            toggleReserveName(_tokenStats[tokenId].name, false);
            // Reserve the new name
            toggleReserveName(newName, true);
            // Changing the token name
            _tokenStats[tokenId].name = newName;
        }

        // Make new tokenURI update request
        _updateTokenURI(tokenId, _tokenStats[tokenId].genes, newName, newCardProperties);
    }

    /**
     * @dev Swaps the name and position between two NFTs, must be owned by the caller.
     * This is to give customers the ability to directly shuffle name and positions of their
     * cards, and prevent possible "name snipers"
     */
    function swapCards(uint256 tokenId1, uint256 tokenId2) public payable {
        require(saleStarted == true);  // dev: updates paused, can be managed on frontend
        require(
            _isApprovedOrOwner(_msgSender(), tokenId1) &&
            _isApprovedOrOwner(_msgSender(), tokenId2), 
            "Caller is not owner nor approved"
        );
        require(msg.value >= updatePrice);  // dev: value sent is below the price, can be managed on frontend
        // Calls for updating the token can only be made if it is not being processed already
        require(requests[tokenId1] == false && requests[tokenId2] == false, "Update being processed");

        // Swapping names between tokens
        string memory name1 = _tokenStats[tokenId1].name;
        _tokenStats[tokenId1].name = _tokenStats[tokenId2].name;
        _tokenStats[tokenId2].name = name1;

        // Requests now pending
        requests[tokenId1] = true;
        requests[tokenId2] = true;

        // Emitting a single swap request to the oracle -- processed differently
        emit SwapRequest(tokenId1, tokenId2, _tokenStats[tokenId1].genes, _tokenStats[tokenId2].genes);

        // Fund the server oracle with enough funds for the swapCallback transaction
        payable(serverOracle).transfer(oraclePrice);
    }

    /**
     * @dev Updates the tokenURI, intented to be used only when oracle fails to update a tokenURI
     */
    function updateTokenURI(uint256 tokenId, string calldata cardName, CardProperties calldata _cardProperties) external onlyOwner {
        _updateTokenURI(tokenId, _tokenStats[tokenId].genes, cardName, _cardProperties);
    }

    /**
     * @dev Starts the sale, cannot do so until the oracle is defined
     */
    function startSale() external onlyOwner {
        require(serverOracle != address(0));  // dev: Oracle not defined
        saleStarted = true;
    }

    /**
     * @dev Pauses the sale
     */
    function pauseSale() external onlyOwner {
        saleStarted = false;
    }

    /**
     * @dev Returns the stats of a token
     */
    function tokenStats(uint256 tokenId) public view returns (Card memory) {
        return _tokenStats[tokenId];
    }

    /**
     * @dev Overrides the default tokenURI behaviour to include the default URI
     */
    function tokenURI(uint256 tokenId) external view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory token = _tokenURIs[tokenId];

        // If there is no tokenURI, returns the defaultURI, which must be defined after deployment
        if (bytes(token).length == 0) {
            return string(abi.encodePacked( baseURI(), defaultURI() ));
        } else {
            return string(abi.encodePacked( baseURI(), token ));
        }
    }

    /**
     * @dev For setting the baseURI for all tokenId's.
     */
    function setBaseURI(string memory newBaseURI) external onlyOwner {
        require(bytes(newBaseURI).length > 0);
        _baseURI = newBaseURI;
    }

    /**
    * @dev Returns the default URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function defaultURI() public view virtual returns (string memory) {
        return _defaultURI;
    }

    /**
     * @dev For setting the default URI for all tokenId's. 
     */
    function setDefaultURI(string calldata newDefaultURI) external onlyOwner {
        require(bytes(newDefaultURI).length > 0);  // dev: cannot be set to empty string
        _defaultURI = newDefaultURI;
    }

    /**
     * @dev Returns if the name has been reserved.
     * Name reservation checks are made in lowercase
     */
    function isNameReserved(string calldata nameString) public view returns (bool) {
        return _nameReserved[BusinessCardUtils.toLower(nameString)];
    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     * Names are reserved in lowercase, but stored in whatever case the user gave
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[BusinessCardUtils.toLower(str)] = isReserve;
    }

    /**
     * @dev Withdraw balance from this contract (Callable by owner)
    */
    function withdraw() onlyOwner external {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < balanceOf(owner));  // @dev: index out of bounds
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < totalSupply());  // @dev: index out of bounds
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     *
     * If the sCard smart contract was specified, it burns all Soulbound Cards associated 
     * with the Business Card `tokenId` in the process
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId, true);
    }

    /**
     * @dev Works as `transferFrom`, but will not burn the associated Soulbound Cards 
     */
    function transferFromWithoutBurn(address from, address to, uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId, false);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId, true);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address _to, uint256 _tokenId) internal virtual {
        require(_to != address(0), "ERC721: mint to the zero address");
        require(!_exists(_tokenId), "ERC721: token already minted");

        _holderTokens[_to].add(_tokenId);

        _tokenOwners.set(_tokenId, _to);

        emit Transfer(address(0), _to, _tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId, bool burn) internal virtual {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        // Burn the associated Soulbound Cards
        if (address(sCard) != address(0) && burn) {
            sCard.burnAllSoulboundCardsOfToken(tokenId);
        }

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == 0x150b7a02);
    }

}

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

pragma solidity ^0.8.1;

/**
 * @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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 16: BusinessCardUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./BusinessCard.sol";

/**
 * @dev Useful functions for validating the name and position of Business Cards
 */
library BusinessCardUtils {
    /**
     * @dev Check if the name string is valid:
     * Alphanumeric and spaces without leading or trailing space, with maximum characters
     * Must contain at most one space, ensuring a Name SURNAME input.
     */
    function validateName(string calldata str) internal pure returns (bool) {
        bytes memory b = bytes(str);
        // String length requirements
        if(
            b.length == 0 || b.length > 22 || b[0] == 0x20 || b[b.length - 1] == 0x20
        ) return false;
        // Characters check
        require(validateString(str), "Non valid characters");

        // Name is validated 
        return true;
    }

    /**
     * @dev Check if the position string is valid:
     * Alphanumeric and spaces without leading or trailing space, with maximum characters
     */
    function validatePosition(string calldata str) internal pure returns (bool) {
        bytes memory b = bytes(str);
        // String length requirements
        if(
            b.length == 0 || b.length > 32 || b[0] == 0x20 || b[b.length - 1] == 0x20
        ) return false;
        // Characters check
        require(validateString(str), "Non valid characters");

        // Position is validated
        return true;
    }

    /**
     * @dev Validates that string contains valid characters, alphanumerical and some special symbols
     */
    function validateString(string calldata str) internal pure returns (bool) {
        bytes memory b = bytes(str);
        bytes1 lastChar = b[0];

        for(uint i; i<b.length; ++i){
            bytes1 char = b[i];

            if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continuous spaces

            if(
                !(char >= 0x20 && char <= 0x3F) &&  // Special characters and numbers
                !(char >= 0x41 && char <= 0x5A) &&  // A-Z
                !(char >= 0x61 && char <= 0x7A)  // a-z
            )
                return false;

            lastChar = char;
        }
        return true;
    }

    function validateOtherProperties(BusinessCard.CardProperties calldata cardProperties) internal pure returns (bool) {
        if(
            bytes(cardProperties.twitterAccount).length < 15 &&
            bytes(cardProperties.telegramAccount).length < 32 &&
            bytes(cardProperties.telegramGroup).length < 32 &&
            ((cardProperties.discordAccount >= 10**17 && cardProperties.discordAccount < 10**18) || cardProperties.discordAccount == 0) &&
            bytes(cardProperties.discordGroup).length < 32 &&
            bytes(cardProperties.githubUsername).length < 39 &&
            bytes(cardProperties.website).length < 50
        )
            return true;
        
        return false;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) internal pure returns (string memory){
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);

        for (uint i = 0; i < bStr.length; ++i) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

}

File 4 of 16: 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 5 of 16: EnumerableMap.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableMap.sol)

pragma solidity ^0.8.0;

import "./EnumerableSet.sol";

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * The following map types are supported:
 *
 * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0
 * - `address -> uint256` (`AddressToUintMap`) since v4.6.0
 * - `bytes32 -> bytes32` (`Bytes32ToBytes32`) since v4.6.0
 * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0
 * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an array of EnumerableMap.
 * ====
 */
library EnumerableMap {
    using EnumerableSet for EnumerableSet.Bytes32Set;

    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct Bytes32ToBytes32Map {
        // Storage of keys
        EnumerableSet.Bytes32Set _keys;
        mapping(bytes32 => bytes32) _values;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        Bytes32ToBytes32Map storage map,
        bytes32 key,
        bytes32 value
    ) internal returns (bool) {
        map._values[key] = value;
        return map._keys.add(key);
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {
        delete map._values[key];
        return map._keys.remove(key);
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) {
        return map._keys.contains(key);
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) {
        return map._keys.length();
    }

    /**
     * @dev Returns the key-value pair stored at position `index` in the map. O(1).
     *
     * Note that there are no guarantees on the ordering of entries inside the
     * array, and it may change when more entries are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) {
        bytes32 key = map._keys.at(index);
        return (key, map._values[key]);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) {
        bytes32 value = map._values[key];
        if (value == bytes32(0)) {
            return (contains(map, key), bytes32(0));
        } else {
            return (true, value);
        }
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || contains(map, key), "EnumerableMap: nonexistent key");
        return value;
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function get(
        Bytes32ToBytes32Map storage map,
        bytes32 key,
        string memory errorMessage
    ) internal view returns (bytes32) {
        bytes32 value = map._values[key];
        require(value != 0 || contains(map, key), errorMessage);
        return value;
    }

    // UintToUintMap

    struct UintToUintMap {
        Bytes32ToBytes32Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToUintMap storage map,
        uint256 key,
        uint256 value
    ) internal returns (bool) {
        return set(map._inner, bytes32(key), bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToUintMap storage map, uint256 key) internal returns (bool) {
        return remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) {
        return contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToUintMap storage map) internal view returns (uint256) {
        return length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) {
        (bytes32 key, bytes32 value) = at(map._inner, index);
        return (uint256(key), uint256(value));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) {
        (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));
        return (success, uint256(value));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) {
        return uint256(get(map._inner, bytes32(key)));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToUintMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (uint256) {
        return uint256(get(map._inner, bytes32(key), errorMessage));
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Bytes32ToBytes32Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToAddressMap storage map,
        uint256 key,
        address value
    ) internal returns (bool) {
        return set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToAddressMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (address) {
        return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage))));
    }

    // AddressToUintMap

    struct AddressToUintMap {
        Bytes32ToBytes32Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        AddressToUintMap storage map,
        address key,
        uint256 value
    ) internal returns (bool) {
        return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(AddressToUintMap storage map, address key) internal returns (bool) {
        return remove(map._inner, bytes32(uint256(uint160(key))));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(AddressToUintMap storage map, address key) internal view returns (bool) {
        return contains(map._inner, bytes32(uint256(uint160(key))));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(AddressToUintMap storage map) internal view returns (uint256) {
        return length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) {
        (bytes32 key, bytes32 value) = at(map._inner, index);
        return (address(uint160(uint256(key))), uint256(value));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) {
        (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key))));
        return (success, uint256(value));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(AddressToUintMap storage map, address key) internal view returns (uint256) {
        return uint256(get(map._inner, bytes32(uint256(uint160(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        AddressToUintMap storage map,
        address key,
        string memory errorMessage
    ) internal view returns (uint256) {
        return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage));
    }

    // Bytes32ToUintMap

    struct Bytes32ToUintMap {
        Bytes32ToBytes32Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        Bytes32ToUintMap storage map,
        bytes32 key,
        uint256 value
    ) internal returns (bool) {
        return set(map._inner, key, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) {
        return remove(map._inner, key);
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) {
        return contains(map._inner, key);
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(Bytes32ToUintMap storage map) internal view returns (uint256) {
        return length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) {
        (bytes32 key, bytes32 value) = at(map._inner, index);
        return (key, uint256(value));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) {
        (bool success, bytes32 value) = tryGet(map._inner, key);
        return (success, uint256(value));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) {
        return uint256(get(map._inner, key));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        Bytes32ToUintMap storage map,
        bytes32 key,
        string memory errorMessage
    ) internal view returns (uint256) {
        return uint256(get(map._inner, key, errorMessage));
    }
}

File 6 of 16: EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 7 of 16: 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 8 of 16: ERC165Storage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol)

pragma solidity ^0.8.0;

import "./ERC165.sol";

/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 9 of 16: 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 10 of 16: 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

    /**
     * @dev 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 11 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 13 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 14 of 16: 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 15 of 16: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"defaultURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"tokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes2","type":"uint256"}],"name":"SwapRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"genes","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"indexed":false,"internalType":"struct BusinessCard.CardProperties","name":"cardProperties","type":"tuple"}],"name":"UpdateRequest","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_cardName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"_cardProperties","type":"tuple"}],"name":"getCard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newUpdatePrice","type":"uint256"}],"name":"modifyUpdatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newDefaultURI","type":"string"}],"name":"setDefaultURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_serverOracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_soulbound","type":"address"}],"name":"setSoulboundCard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"},{"internalType":"string","name":"_tokenURI1","type":"string"},{"internalType":"string","name":"_tokenURI2","type":"string"}],"name":"swapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId1","type":"uint256"},{"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"swapCards","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenStats","outputs":[{"components":[{"internalType":"uint256","name":"genes","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct BusinessCard.Card","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFromWithoutBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"updateCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"newCardProperties","type":"tuple"}],"name":"updateCard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"updatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cardName","type":"string"},{"components":[{"internalType":"string","name":"position","type":"string"},{"internalType":"string","name":"twitterAccount","type":"string"},{"internalType":"string","name":"telegramAccount","type":"string"},{"internalType":"string","name":"telegramGroup","type":"string"},{"internalType":"uint256","name":"discordAccount","type":"uint256"},{"internalType":"string","name":"discordGroup","type":"string"},{"internalType":"string","name":"githubUsername","type":"string"},{"internalType":"string","name":"website","type":"string"}],"internalType":"struct BusinessCard.CardProperties","name":"_cardProperties","type":"tuple"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405269021e19e0c9bab240000060155569010f0cf064dd59200000601655685150ae84a8cdf000006017553480156200003a57600080fd5b5060405162006672380380620066728339818101604052810190620000609190620003fe565b62000080620000746200013660201b60201c565b6200013e60201b60201c565b836008908051906020019062000098929190620002dc565b508260099080519060200190620000b1929190620002dc565b5081600b9080519060200190620000ca929190620002dc565b508060109080519060200190620000e3929190620002dc565b50620000fc6380ac58cd60e01b6200020460201b60201c565b62000114635b5e139f60e01b6200020460201b60201c565b6200012c63780e9d6360e01b6200020460201b60201c565b50505050620006c1565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026790620004f5565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054620002ea90620005bd565b90600052602060002090601f0160209004810192826200030e57600085556200035a565b82601f106200032957805160ff19168380011785556200035a565b828001600101855582156200035a579182015b82811115620003595782518255916020019190600101906200033c565b5b5090506200036991906200036d565b5090565b5b80821115620003885760008160009055506001016200036e565b5090565b6000620003a36200039d8462000540565b62000517565b905082815260208101848484011115620003bc57600080fd5b620003c984828562000587565b509392505050565b600082601f830112620003e357600080fd5b8151620003f58482602086016200038c565b91505092915050565b600080600080608085870312156200041557600080fd5b600085015167ffffffffffffffff8111156200043057600080fd5b6200043e87828801620003d1565b945050602085015167ffffffffffffffff8111156200045c57600080fd5b6200046a87828801620003d1565b935050604085015167ffffffffffffffff8111156200048857600080fd5b6200049687828801620003d1565b925050606085015167ffffffffffffffff811115620004b457600080fd5b620004c287828801620003d1565b91505092959194509250565b6000620004dd601c8362000576565b9150620004ea8262000698565b602082019050919050565b600060208201905081810360008301526200051081620004ce565b9050919050565b60006200052362000536565b9050620005318282620005f3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200055e576200055d62000658565b5b620005698262000687565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620005a75780820151818401526020810190506200058a565b83811115620005b7576000848401525b50505050565b60006002820490506001821680620005d657607f821691505b60208210811415620005ed57620005ec62000629565b5b50919050565b620005fe8262000687565b810181811067ffffffffffffffff8211171562000620576200061f62000658565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b615fa180620006d16000396000f3fe6080604052600436106102725760003560e01c80636817c76c1161014f578063b25691a9116100c1578063d58be3ce1161007a578063d58be3ce1461090f578063d5abeb0114610938578063da1b9e0814610963578063e926ca951461098c578063e985e9c5146109c9578063f2fde38b14610a0657610272565b8063b25691a914610824578063b66a0e5d14610840578063b88d4fde14610857578063bedc922814610880578063c6716137146108a9578063c87b56dd146108d257610272565b80637adbf973116101135780637adbf9731461071657806381d12c581461073f5780638da5cb5b1461077c57806395d89b41146107a7578063a22cb465146107d2578063a5f24d06146107fb57610272565b80636817c76c146106435780636c0360eb1461066e57806370a0823114610699578063715018a6146106d657806373ad6c2d146106ed57610272565b80633a367a67116101e857806355f804b3116101ac57806355f804b314610533578063566c2e951461055c5780635c474f9e146105855780636352211e146105b0578063668aa824146105ed578063673a7e281461061857610272565b80633a367a67146104745780633ccfd60b1461049f57806342842e0e146104b65780634f6ccce7146104df57806355367ba91461051c57610272565b806314a86a011161023a57806314a86a011461036e57806315b56d101461038a57806317ae7a03146103c757806318160ddd146103e357806323b872dd1461040e5780632f745c591461043757610272565b806301ffc9a71461027757806302b53ad0146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906145aa565b610a2f565b6040516102ab919061504e565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d6919061479f565b610aa6565b005b3480156102e957600080fd5b506102f2610ab4565b6040516102ff9190615069565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906146f2565b610b46565b60405161033c9190614fe7565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061456e565b610bcb565b005b6103886004803603810190610383919061471b565b610ce3565b005b34801561039657600080fd5b506103b160048036038101906103ac91906145fc565b611006565b6040516103be919061504e565b60405180910390f35b6103e160048036038101906103dc91906147f3565b611088565b005b3480156103ef57600080fd5b506103f86113fa565b604051610405919061536d565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190614468565b61140b565b005b34801561044357600080fd5b5061045e6004803603810190610459919061456e565b61146d565b60405161046b919061536d565b60405180910390f35b34801561048057600080fd5b506104896114dc565b6040516104969190615069565b60405180910390f35b3480156104ab57600080fd5b506104b461156e565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190614468565b6115c5565b005b3480156104eb57600080fd5b50610506600480360381019061050191906146f2565b6115e5565b604051610513919061536d565b60405180910390f35b34801561052857600080fd5b5061053161161c565b005b34801561053f57600080fd5b5061055a600480360381019061055591906146b1565b611641565b005b34801561056857600080fd5b50610583600480360381019061057e919061471b565b611671565b005b34801561059157600080fd5b5061059a6116a2565b6040516105a7919061504e565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d291906146f2565b6116b5565b6040516105e49190614fe7565b60405180910390f35b3480156105f957600080fd5b506106026116ec565b60405161060f919061536d565b60405180910390f35b34801561062457600080fd5b5061062d6116f2565b60405161063a919061536d565b60405180910390f35b34801561064f57600080fd5b506106586116f8565b604051610665919061536d565b60405180910390f35b34801561067a57600080fd5b506106836116fe565b6040516106909190615069565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190614403565b611790565b6040516106cd919061536d565b60405180910390f35b3480156106e257600080fd5b506106eb61184f565b005b3480156106f957600080fd5b50610714600480360381019061070f9190614403565b611863565b005b34801561072257600080fd5b5061073d60048036038101906107389190614403565b6118af565b005b34801561074b57600080fd5b50610766600480360381019061076191906146f2565b6118fb565b604051610773919061504e565b60405180910390f35b34801561078857600080fd5b5061079161191b565b60405161079e9190614fe7565b60405180910390f35b3480156107b357600080fd5b506107bc611945565b6040516107c99190615069565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f49190614532565b6119d7565b005b34801561080757600080fd5b50610822600480360381019061081d9190614468565b611b58565b005b61083e60048036038101906108399190614641565b611bba565b005b34801561084c57600080fd5b50610855611c2a565b005b34801561086357600080fd5b5061087e600480360381019061087991906144b7565b611cab565b005b34801561088c57600080fd5b506108a760048036038101906108a2919061482f565b611d0d565b005b3480156108b557600080fd5b506108d060048036038101906108cb91906146f2565b611d27565b005b3480156108de57600080fd5b506108f960048036038101906108f491906146f2565b611d48565b6040516109069190615069565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190614403565b611ea6565b005b34801561094457600080fd5b5061094d611ef2565b60405161095a919061536d565b60405180910390f35b34801561096f57600080fd5b5061098a600480360381019061098591906145fc565b611ef8565b005b34801561099857600080fd5b506109b360048036038101906109ae91906146f2565b611f26565b6040516109c0919061534b565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb919061442c565b611fef565b6040516109fd919061504e565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a289190614403565b612083565b005b6000610a3a82612107565b80610a9f5750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b610ab08282612171565b5050565b606060088054610ac390615781565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef90615781565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182612284565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b87906151eb565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd6826116b5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e906152ab565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c666122a1565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f6122a1565b611fef565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb9061518b565b60405180910390fd5b610cde83836122a9565b505050565b60011515600c60009054906101000a900460ff16151514610d0357600080fd5b610d14610d0e6122a1565b85612362565b610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a906152cb565b60405180910390fd5b60001515610d618484611006565b1515148015610d8b57506000838390501480610d8a575060011515610d868484612440565b1515145b5b610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc19061516b565b60405180910390fd5b6000818060000190610ddc9190615452565b90501480610e05575060011515610e01828060000190610dfc9190615452565b6125f3565b1515145b610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b9061524b565b60405180910390fd5b60165434101580610ea95750601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610e916122a1565b73ffffffffffffffffffffffffffffffffffffffff16145b610eb257600080fd5b6000838390501115610fdd57610f67600e60008681526020019081526020016000206001018054610ee290615781565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0e90615781565b8015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b505050505060006127a6565b610fb683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060016127a6565b8282600e60008781526020019081526020016000206001019190610fdb929190614094565b505b61100084600e6000878152602001908152602001600020600001548585856127e8565b50505050565b6000600f61105784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612950565b6040516110649190614f60565b908152602001604051809103902060009054906101000a900460ff16905092915050565b60011515600c60009054906101000a900460ff161515146110a857600080fd5b6110b96110b36122a1565b83612362565b80156110d257506110d16110cb6122a1565b82612362565b5b611111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611108906152cb565b60405180910390fd5b60165434101561112057600080fd5b600015156012600084815260200190815260200160002060009054906101000a900460ff1615151480156111785750600015156012600083815260200190815260200160002060009054906101000a900460ff161515145b6111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061532b565b60405180910390fd5b6000600e600084815260200190815260200160002060010180546111da90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461120690615781565b80156112535780601f1061122857610100808354040283529160200191611253565b820191906000526020600020905b81548152906001019060200180831161123657829003601f168201915b50505050509050600e6000838152602001908152602001600020600101600e600085815260200190815260200160002060010190805461129290615781565b61129d92919061411a565b5080600e600084815260200190815260200160002060010190805190602001906112c89291906141a7565b5060016012600085815260200190815260200160002060006101000a81548160ff02191690831515021790555060016012600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507fbab79a74f80f351e29e4b66520154c19064e8a12e5052364180b47ba641c50128383600e600087815260200190815260200160002060000154600e600087815260200190815260200160002060000154604051611382949392919061540d565b60405180910390a1601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6017549081150290604051600060405180830381858888f193505050501580156113f4573d6000803e3d6000fd5b50505050565b60006114066003612c10565b905090565b61141c6114166122a1565b82612362565b61145b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611452906152eb565b60405180910390fd5b6114688383836001612c25565b505050565b600061147883611790565b821061148357600080fd5b6114d482600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612f2190919063ffffffff16565b905092915050565b6060601080546114eb90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461151790615781565b80156115645780601f1061153957610100808354040283529160200191611564565b820191906000526020600020905b81548152906001019060200180831161154757829003601f168201915b5050505050905090565b611576612f3b565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115c1573d6000803e3d6000fd5b5050565b6115e083838360405180602001604052806000815250611cab565b505050565b60006115ef6113fa565b82106115fa57600080fd5b6000611610836003612fb990919063ffffffff16565b50905080915050919050565b611624612f3b565b6000600c60006101000a81548160ff021916908315150217905550565b611649612f3b565b600081511161165757600080fd5b80600b908051906020019061166d9291906141a7565b5050565b611679612f3b565b61169c84600e6000878152602001908152602001600020600001548585856127e8565b50505050565b600c60009054906101000a900460ff1681565b60006116e582604051806060016040528060298152602001615f43602991396003612fe59092919063ffffffff16565b9050919050565b60175481565b60165481565b60155481565b6060600b805461170d90615781565b80601f016020809104026020016040519081016040528092919081815260200182805461173990615781565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f8906151ab565b60405180910390fd5b611848600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613004565b9050919050565b611857612f3b565b6118616000613019565b565b61186b612f3b565b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6118b7612f3b565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606009805461195490615781565b80601f016020809104026020016040519081016040528092919081815260200182805461198090615781565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b5050505050905090565b6119df6122a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a449061510b565b60405180910390fd5b8060076000611a5a6122a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b076122a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b4c919061504e565b60405180910390a35050565b611b69611b636122a1565b82612362565b611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f906152eb565b60405180910390fd5b611bb58383836000612c25565b505050565b60011515600c60009054906101000a900460ff16151514611bda57600080fd5b610457611be56113fa565b10611bef57600080fd5b601554341015611bfe57600080fd5b611c25611c096122a1565b6001611c136113fa565b611c1d91906155fd565b8585856130df565b505050565b611c32612f3b565b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611c8e57600080fd5b6001600c60006101000a81548160ff021916908315150217905550565b611cbc611cb66122a1565b83612362565b611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf2906152eb565b60405180910390fd5b611d0784848484613328565b50505050565b611d178483612171565b611d218382612171565b50505050565b611d2f612f3b565b601754811015611d3e57600080fd5b8060168190555050565b6060611d5382612284565b611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d899061526b565b60405180910390fd5b6000600a60008481526020019081526020016000208054611db290615781565b80601f0160208091040260200160405190810160405280929190818152602001828054611dde90615781565b8015611e2b5780601f10611e0057610100808354040283529160200191611e2b565b820191906000526020600020905b815481529060010190602001808311611e0e57829003601f168201915b50505050509050600081511415611e7457611e446116fe565b611e4c6114dc565b604051602001611e5d929190614f77565b604051602081830303815290604052915050611ea1565b611e7c6116fe565b81604051602001611e8e929190614f77565b6040516020818303038152906040529150505b919050565b611eae612f3b565b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61045781565b611f00612f3b565b60008282905011611f1057600080fd5b818160109190611f21929190614094565b505050565b611f2e61422d565b600e600083815260200190815260200160002060405180604001604052908160008201548152602001600182018054611f6690615781565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9290615781565b8015611fdf5780601f10611fb457610100808354040283529160200191611fdf565b820191906000526020600020905b815481529060010190602001808311611fc257829003601f168201915b5050505050815250509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61208b612f3b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f2906150ab565b60405180910390fd5b61210481613019565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121b26122a1565b73ffffffffffffffffffffffffffffffffffffffff16146121d257600080fd5b6012600083815260200190815260200160002060009054906101000a900460ff166121fc57600080fd5b80600a600084815260200190815260200160002090805190602001906122239291906141a7565b506012600083815260200190815260200160002060006101000a81549060ff02191690557f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051612278929190615388565b60405180910390a15050565b600061229a82600361338690919063ffffffff16565b9050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661231c836116b5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061236d82612284565b6123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a39061514b565b60405180910390fd5b60006123b7836116b5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061242657508373ffffffffffffffffffffffffffffffffffffffff1661240e84610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061243757506124368185611fef565b5b91505092915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008151148061249b575060168151115b8061250f5750602060f81b816000815181106124e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061258f5750602060f81b8160018351612529919061568a565b81518110612560577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b1561259e5760009150506125ed565b6125a884846133a0565b6125e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125de9061528b565b60405180910390fd5b60019150505b92915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060008151148061264e575060208151115b806126c25750602060f81b81600081518110612693577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127425750602060f81b81600183516126dc919061568a565b81518110612713577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156127515760009150506127a0565b61275b84846133a0565b61279a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127919061528b565b60405180910390fd5b60019150505b92915050565b80600f6127b284612950565b6040516127bf9190614f60565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6127f18161364f565b6127fa57600080fd5b61280385612284565b61280c57600080fd5b600015156012600087815260200190815260200160002060009054906101000a900460ff16151514612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286a9061532b565b60405180910390fd5b60016012600087815260200190815260200160002060006101000a81548160ff021916908315150217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6017549081150290604051600060405180830381858888f19350505050158015612909573d6000803e3d6000fd5b507f04d6aedc38d372f18e01cc1d43d491d6bd883fdc6af386e8ceab5d441a84235885858585856040516129419594939291906153b8565b60405180910390a15050505050565b606060008290506000815167ffffffffffffffff81111561299a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129cc5781602001600182028036833780820191505090505b50905060005b8251811015612c05576041838281518110612a16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1610158015612a7f5750605a838281518110612a6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b15612b47576020838281518110612abf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c612ad79190615653565b60f81b828281518110612b13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612bf4565b828181518110612b80577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110612bc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80612bfe906157e4565b90506129d2565b508092505050919050565b6000612c1e8260000161374d565b9050919050565b8373ffffffffffffffffffffffffffffffffffffffff16612c45836116b5565b73ffffffffffffffffffffffffffffffffffffffff1614612c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c929061522b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d02906150eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015612d675750805b15612dfa57601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ca3c5c07836040518263ffffffff1660e01b8152600401612dc7919061536d565b600060405180830381600087803b158015612de157600080fd5b505af1158015612df5573d6000803e3d6000fd5b505050505b612e056000836122a9565b612e5682600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061376290919063ffffffff16565b50612ea882600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061377c90919063ffffffff16565b50612ebf828460036137969092919063ffffffff16565b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6000612f3083600001836137cb565b60001c905092915050565b612f436122a1565b73ffffffffffffffffffffffffffffffffffffffff16612f6161191b565b73ffffffffffffffffffffffffffffffffffffffff1614612fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fae9061520b565b60405180910390fd5b565b600080600080612fcc866000018661381c565b915091508160001c8160001c9350935050509250929050565b6000612ff8846000018460001b8461385c565b60001c90509392505050565b6000613012826000016138dd565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130e98383612440565b80156131025750600015156130fe8484611006565b1515145b613141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131389061516b565b60405180910390fd5b6131598180600001906131549190615452565b6125f3565b613198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318f9061524b565b60405180910390fd5b60006c0c9f2c9cd04674edea4000000042338686600d546040516020016131c3959493929190614f9b565b6040516020818303038152906040528051906020012060001c6131e6919061585b565b9050600d60008154809291906131fb906157e4565b919050555061324f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060016127a6565b604051806040016040528082815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250600e60008781526020019081526020016000206000820151816000015560208201518160010190805190602001906132e19291906141a7565b5090505061331386868686856040516020016132ff93929190614f36565b6040516020818303038152906040526138ee565b61332085828686866127e8565b505050505050565b6133358484846001612c25565b61334184848484613949565b613380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133779061508b565b60405180910390fd5b50505050565b6000613398836000018360001b613a8e565b905092915050565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600081600081518110613426577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b905060005b825181101561364157600083828151811061347a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156134e15750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156134f3576000945050505050613649565b602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561354f5750603f60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156135b55750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156135b35750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b801561361a5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156136185750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b1561362c576000945050505050613649565b809250508061363a906157e4565b9050613436565b506001925050505b92915050565b6000600f8280602001906136639190615452565b90501080156136835750602082806040019061367f9190615452565b9050105b80156136a05750602082806060019061369c9190615452565b9050105b80156136de575067016345785d8a00008260800135101580156136ce5750670de0b6b3a76400008260800135105b806136dd575060008260800135145b5b80156136fb57506020828060a001906136f79190615452565b9050105b801561371857506027828060c001906137149190615452565b9050105b801561373557506032828060e001906137319190615452565b9050105b156137435760019050613748565b600090505b919050565b600061375b82600001613aae565b9050919050565b6000613774836000018360001b613ac3565b905092915050565b600061378e836000018360001b613c49565b905092915050565b60006137c2846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613cb9565b90509392505050565b6000826000018281548110613809577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008060006138378486600001613cf490919063ffffffff16565b9050808560020160008381526020019081526020016000205492509250509250929050565b6000808460020160008581526020019081526020016000205490506000801b8114158061388f575061388e8585613a8e565b5b83906138d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c89190615069565b60405180910390fd5b50809150509392505050565b600081600001805490509050919050565b6138f88383613d0b565b6139056000848484613949565b613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393b9061508b565b60405180910390fd5b505050565b600061396a8473ffffffffffffffffffffffffffffffffffffffff16613e8d565b6139775760019050613a86565b6000613a3e63150b7a0260e01b61398c6122a1565b8887876040516024016139a29493929190615002565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615f11603291398773ffffffffffffffffffffffffffffffffffffffff16613eb09092919063ffffffff16565b9050600081806020019051810190613a5691906145d3565b905063150b7a0260e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000613aa68284600001613ec890919063ffffffff16565b905092915050565b6000613abc826000016138dd565b9050919050565b60008083600101600084815260200190815260200160002054905060008114613c3d576000600182613af5919061568a565b9050600060018660000180549050613b0d919061568a565b9050818114613bc8576000866000018281548110613b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613b9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613c02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613c43565b60009150505b92915050565b6000613c558383613edf565b613cae578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613cb3565b600090505b92915050565b60008184600201600085815260200190815260200160002081905550613ceb8385600001613f0290919063ffffffff16565b90509392505050565b6000613d0383600001836137cb565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d72906151cb565b60405180910390fd5b613d8481612284565b15613dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dbb906150cb565b60405180910390fd5b613e1581600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061377c90919063ffffffff16565b50613e2c818360036137969092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613ebf8484600085613f19565b90509392505050565b6000613ed78360000183613edf565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000613f118360000183613c49565b905092915050565b606082471015613f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f559061512b565b60405180910390fd5b613f6785613e8d565b613fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9d9061530b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613fcf9190614f1f565b60006040518083038185875af1925050503d806000811461400c576040519150601f19603f3d011682016040523d82523d6000602084013e614011565b606091505b509150915061402182828661402d565b92505050949350505050565b6060831561403d5782905061408d565b6000835111156140505782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140849190615069565b60405180910390fd5b9392505050565b8280546140a090615781565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57803560ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782358255916020019190600101906140ed565b5b5090506141169190614247565b5090565b82805461412690615781565b90600052602060002090601f0160209004810192826141485760008555614196565b82601f106141595780548555614196565b8280016001018555821561419657600052602060002091601f016020900482015b8281111561419557825482559160010191906001019061417a565b5b5090506141a39190614247565b5090565b8280546141b390615781565b90600052602060002090601f0160209004810192826141d5576000855561421c565b82601f106141ee57805160ff191683800117855561421c565b8280016001018555821561421c579182015b8281111561421b578251825591602001919060010190614200565b5b5090506142299190614247565b5090565b604051806040016040528060008152602001606081525090565b5b80821115614260576000816000905550600101614248565b5090565b6000614277614272846154ce565b6154a9565b90508281526020810184848401111561428f57600080fd5b61429a84828561573f565b509392505050565b60006142b56142b0846154ff565b6154a9565b9050828152602081018484840111156142cd57600080fd5b6142d884828561573f565b509392505050565b6000813590506142ef81615eb4565b92915050565b60008135905061430481615ecb565b92915050565b60008135905061431981615ee2565b92915050565b60008151905061432e81615ee2565b92915050565b600082601f83011261434557600080fd5b8135614355848260208601614264565b91505092915050565b60008083601f84011261437057600080fd5b8235905067ffffffffffffffff81111561438957600080fd5b6020830191508360018202830111156143a157600080fd5b9250929050565b600082601f8301126143b957600080fd5b81356143c98482602086016142a2565b91505092915050565b600061010082840312156143e557600080fd5b81905092915050565b6000813590506143fd81615ef9565b92915050565b60006020828403121561441557600080fd5b6000614423848285016142e0565b91505092915050565b6000806040838503121561443f57600080fd5b600061444d858286016142e0565b925050602061445e858286016142e0565b9150509250929050565b60008060006060848603121561447d57600080fd5b600061448b868287016142e0565b935050602061449c868287016142e0565b92505060406144ad868287016143ee565b9150509250925092565b600080600080608085870312156144cd57600080fd5b60006144db878288016142e0565b94505060206144ec878288016142e0565b93505060406144fd878288016143ee565b925050606085013567ffffffffffffffff81111561451a57600080fd5b61452687828801614334565b91505092959194509250565b6000806040838503121561454557600080fd5b6000614553858286016142e0565b9250506020614564858286016142f5565b9150509250929050565b6000806040838503121561458157600080fd5b600061458f858286016142e0565b92505060206145a0858286016143ee565b9150509250929050565b6000602082840312156145bc57600080fd5b60006145ca8482850161430a565b91505092915050565b6000602082840312156145e557600080fd5b60006145f38482850161431f565b91505092915050565b6000806020838503121561460f57600080fd5b600083013567ffffffffffffffff81111561462957600080fd5b6146358582860161435e565b92509250509250929050565b60008060006040848603121561465657600080fd5b600084013567ffffffffffffffff81111561467057600080fd5b61467c8682870161435e565b9350935050602084013567ffffffffffffffff81111561469b57600080fd5b6146a7868287016143d2565b9150509250925092565b6000602082840312156146c357600080fd5b600082013567ffffffffffffffff8111156146dd57600080fd5b6146e9848285016143a8565b91505092915050565b60006020828403121561470457600080fd5b6000614712848285016143ee565b91505092915050565b6000806000806060858703121561473157600080fd5b600061473f878288016143ee565b945050602085013567ffffffffffffffff81111561475c57600080fd5b6147688782880161435e565b9350935050604085013567ffffffffffffffff81111561478757600080fd5b614793878288016143d2565b91505092959194509250565b600080604083850312156147b257600080fd5b60006147c0858286016143ee565b925050602083013567ffffffffffffffff8111156147dd57600080fd5b6147e9858286016143a8565b9150509250929050565b6000806040838503121561480657600080fd5b6000614814858286016143ee565b9250506020614825858286016143ee565b9150509250929050565b6000806000806080858703121561484557600080fd5b6000614853878288016143ee565b9450506020614864878288016143ee565b935050604085013567ffffffffffffffff81111561488157600080fd5b61488d878288016143a8565b925050606085013567ffffffffffffffff8111156148aa57600080fd5b6148b6878288016143a8565b91505092959194509250565b6148cb816156be565b82525050565b6148e26148dd826156be565b61582d565b82525050565b6148f1816156d0565b82525050565b600061490282615530565b61490c8185615546565b935061491c81856020860161574e565b61492581615948565b840191505092915050565b600061493b82615530565b6149458185615557565b935061495581856020860161574e565b80840191505092915050565b600061496d8385615562565b935061497a83858461573f565b61498383615948565b840190509392505050565b600061499a8385615573565b93506149a783858461573f565b6149b083615948565b840190509392505050565b60006149c78385615584565b93506149d483858461573f565b82840190509392505050565b60006149eb8261553b565b6149f58185615562565b9350614a0581856020860161574e565b614a0e81615948565b840191505092915050565b6000614a248261553b565b614a2e8185615573565b9350614a3e81856020860161574e565b614a4781615948565b840191505092915050565b6000614a5d8261553b565b614a678185615584565b9350614a7781856020860161574e565b80840191505092915050565b6000614a90603283615573565b9150614a9b82615966565b604082019050919050565b6000614ab3602683615573565b9150614abe826159b5565b604082019050919050565b6000614ad6601c83615573565b9150614ae182615a04565b602082019050919050565b6000614af9602483615573565b9150614b0482615a2d565b604082019050919050565b6000614b1c601983615573565b9150614b2782615a7c565b602082019050919050565b6000614b3f602683615573565b9150614b4a82615aa5565b604082019050919050565b6000614b62602c83615573565b9150614b6d82615af4565b604082019050919050565b6000614b85601783615573565b9150614b9082615b43565b602082019050919050565b6000614ba8603883615573565b9150614bb382615b6c565b604082019050919050565b6000614bcb602a83615573565b9150614bd682615bbb565b604082019050919050565b6000614bee602083615573565b9150614bf982615c0a565b602082019050919050565b6000614c11602c83615573565b9150614c1c82615c33565b604082019050919050565b6000614c34602083615573565b9150614c3f82615c82565b602082019050919050565b6000614c57602983615573565b9150614c6282615cab565b604082019050919050565b6000614c7a601283615573565b9150614c8582615cfa565b602082019050919050565b6000614c9d602f83615573565b9150614ca882615d23565b604082019050919050565b6000614cc0601483615573565b9150614ccb82615d72565b602082019050919050565b6000614ce3602183615573565b9150614cee82615d9b565b604082019050919050565b6000614d06602083615573565b9150614d1182615dea565b602082019050919050565b6000614d29603183615573565b9150614d3482615e13565b604082019050919050565b6000614d4c601d83615573565b9150614d5782615e62565b602082019050919050565b6000614d6f601683615573565b9150614d7a82615e8b565b602082019050919050565b60006101008301614d99600084018461558f565b8583036000870152614dac838284614961565b92505050614dbd602084018461558f565b8583036020870152614dd0838284614961565b92505050614de1604084018461558f565b8583036040870152614df4838284614961565b92505050614e05606084018461558f565b8583036060870152614e18838284614961565b92505050614e2960808401846155e6565b614e366080860182614eea565b50614e4460a084018461558f565b85830360a0870152614e57838284614961565b92505050614e6860c084018461558f565b85830360c0870152614e7b838284614961565b92505050614e8c60e084018461558f565b85830360e0870152614e9f838284614961565b925050508091505092915050565b6000604083016000830151614ec56000860182614eea565b5060208301518482036020860152614edd82826149e0565b9150508091505092915050565b614ef381615728565b82525050565b614f0281615728565b82525050565b614f19614f1482615728565b615851565b82525050565b6000614f2b8284614930565b915081905092915050565b6000614f438285876149bb565b9150614f4f8284614f08565b602082019150819050949350505050565b6000614f6c8284614a52565b915081905092915050565b6000614f838285614a52565b9150614f8f8284614a52565b91508190509392505050565b6000614fa78288614f08565b602082019150614fb782876148d1565b601482019150614fc88285876149bb565b9150614fd48284614f08565b6020820191508190509695505050505050565b6000602082019050614ffc60008301846148c2565b92915050565b600060808201905061501760008301876148c2565b61502460208301866148c2565b6150316040830185614ef9565b818103606083015261504381846148f7565b905095945050505050565b600060208201905061506360008301846148e8565b92915050565b600060208201905081810360008301526150838184614a19565b905092915050565b600060208201905081810360008301526150a481614a83565b9050919050565b600060208201905081810360008301526150c481614aa6565b9050919050565b600060208201905081810360008301526150e481614ac9565b9050919050565b6000602082019050818103600083015261510481614aec565b9050919050565b6000602082019050818103600083015261512481614b0f565b9050919050565b6000602082019050818103600083015261514481614b32565b9050919050565b6000602082019050818103600083015261516481614b55565b9050919050565b6000602082019050818103600083015261518481614b78565b9050919050565b600060208201905081810360008301526151a481614b9b565b9050919050565b600060208201905081810360008301526151c481614bbe565b9050919050565b600060208201905081810360008301526151e481614be1565b9050919050565b6000602082019050818103600083015261520481614c04565b9050919050565b6000602082019050818103600083015261522481614c27565b9050919050565b6000602082019050818103600083015261524481614c4a565b9050919050565b6000602082019050818103600083015261526481614c6d565b9050919050565b6000602082019050818103600083015261528481614c90565b9050919050565b600060208201905081810360008301526152a481614cb3565b9050919050565b600060208201905081810360008301526152c481614cd6565b9050919050565b600060208201905081810360008301526152e481614cf9565b9050919050565b6000602082019050818103600083015261530481614d1c565b9050919050565b6000602082019050818103600083015261532481614d3f565b9050919050565b6000602082019050818103600083015261534481614d62565b9050919050565b600060208201905081810360008301526153658184614ead565b905092915050565b60006020820190506153826000830184614ef9565b92915050565b600060408201905061539d6000830185614ef9565b81810360208301526153af8184614a19565b90509392505050565b60006080820190506153cd6000830188614ef9565b6153da6020830187614ef9565b81810360408301526153ed81858761498e565b905081810360608301526154018184614d85565b90509695505050505050565b60006080820190506154226000830187614ef9565b61542f6020830186614ef9565b61543c6040830185614ef9565b6154496060830184614ef9565b95945050505050565b6000808335600160200384360303811261546b57600080fd5b80840192508235915067ffffffffffffffff82111561548957600080fd5b6020830192506001820236038313156154a157600080fd5b509250929050565b60006154b36154c4565b90506154bf82826157b3565b919050565b6000604051905090565b600067ffffffffffffffff8211156154e9576154e8615919565b5b6154f282615948565b9050602081019050919050565b600067ffffffffffffffff82111561551a57615519615919565b5b61552382615948565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600080833560016020038436030381126155a857600080fd5b83810192508235915060208301925067ffffffffffffffff8211156155cc57600080fd5b6001820236038413156155de57600080fd5b509250929050565b60006155f560208401846143ee565b905092915050565b600061560882615728565b915061561383615728565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156485761564761588c565b5b828201905092915050565b600061565e82615732565b915061566983615732565b92508260ff0382111561567f5761567e61588c565b5b828201905092915050565b600061569582615728565b91506156a083615728565b9250828210156156b3576156b261588c565b5b828203905092915050565b60006156c982615708565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561576c578082015181840152602081019050615751565b8381111561577b576000848401525b50505050565b6000600282049050600182168061579957607f821691505b602082108114156157ad576157ac6158ea565b5b50919050565b6157bc82615948565b810181811067ffffffffffffffff821117156157db576157da615919565b5b80604052505050565b60006157ef82615728565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156158225761582161588c565b5b600182019050919050565b60006158388261583f565b9050919050565b600061584a82615959565b9050919050565b6000819050919050565b600061586682615728565b915061587183615728565b925082615881576158806158bb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e616d652074616b656e206f72206e6f742076616c6964000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f506f736974696f6e206e6f742076616c69640000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f6e2076616c69642063686172616374657273000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f557064617465206265696e672070726f63657373656400000000000000000000600082015250565b615ebd816156be565b8114615ec857600080fd5b50565b615ed4816156d0565b8114615edf57600080fd5b50565b615eeb816156dc565b8114615ef657600080fd5b50565b615f0281615728565b8114615f0d57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212205c4addbdc0bfe0cb30aba7754866f51c4ac88c1f08863dd9f1893188df854c5764736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d427573696e65737320436172640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054243415244000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f646f72736961636c75622e6d7970696e6174612e636c6f75642f697066732f516d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c6246703372796275765a376a396534784236574c6564753867764c636a6256715572475545756751577a39750000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

742:27809:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:188:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7773:125:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18816:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20870:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20414:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11791:1539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17488:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13589:1326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19821:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21916:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19509:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16957:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18083:142;;;;;;;;;;;;;:::i;:::-;;22722:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20109:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15568:78;;;;;;;;;;;;;:::i;:::-;;16562:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15040:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1872:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18572:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3237:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3064:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19328:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18289:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:13;;;;;;;;;;;;;:::i;:::-;;6029:115:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5814:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2847:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18985:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21163:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22339:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8942:564;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15362:151;;;;;;;;;;;;;:::i;:::-;;22944:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8083:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6435:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15938:542;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6225:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1825:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17147:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15714:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;596:188:5;681:4;704:36;728:11;704:23;:36::i;:::-;:73;;;;744:20;:33;765:11;744:33;;;;;;;;;;;;;;;;;;;;;;;;;;;704:73;697:80;;596:188;;;:::o;7773:125:1:-;7860:30;7870:8;7880:9;7860;:30::i;:::-;7773:125;;:::o;18816:100::-;18870:13;18903:5;18896:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18816:100;:::o;20870:221::-;20946:7;20974:16;20982:7;20974;:16::i;:::-;20966:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21059:15;:24;21075:7;21059:24;;;;;;;;;;;;;;;;;;;;;21052:31;;20870:221;;;:::o;20414:390::-;20495:13;20511:16;20519:7;20511;:16::i;:::-;20495:32;;20552:5;20546:11;;:2;:11;;;;20538:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;20632:5;20616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20641:37;20658:5;20665:12;:10;:12::i;:::-;20641:16;:37::i;:::-;20616:62;20608:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20775:21;20784:2;20788:7;20775:8;:21::i;:::-;20414:390;;;:::o;11791:1539::-;11945:4;11930:19;;:11;;;;;;;;;;;:19;;;11922:28;;;;;;12021:41;12040:12;:10;:12::i;:::-;12054:7;12021:18;:41::i;:::-;12013:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;12159:5;12132:32;;:23;12147:7;;12132:14;:23::i;:::-;:32;;;:195;;;;;12225:1;12206:7;;12200:21;;:26;:112;;;;12308:4;12265:47;;:39;12296:7;;12265:30;:39::i;:::-;:47;;;12200:112;12132:195;12110:283;;;;;;;;;;;;:::i;:::-;;;;;;;;;12470:1;12432:17;:26;;;;;;;;:::i;:::-;12426:40;;:45;:145;;;;12567:4;12501:70;;:62;12536:17;:26;;;;;;;;:::i;:::-;12501:34;:62::i;:::-;:70;;;12426:145;12404:228;;;;;;;;;;;;:::i;:::-;;;;;;;;;12678:11;;12665:9;:24;;:60;;;;12709:16;;;;;;;;;;;12693:32;;:12;:10;:12::i;:::-;:32;;;12665:60;12643:93;;;;;;12890:1;12872:7;;12866:21;;:25;12862:323;;;12948:51;12966:11;:20;12978:7;12966:20;;;;;;;;;;;:25;;12948:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12993:5;12948:17;:51::i;:::-;13051:32;13069:7;;13051:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13078:4;13051:17;:32::i;:::-;13166:7;;13138:11;:20;13150:7;13138:20;;;;;;;;;;;:25;;:35;;;;;;;:::i;:::-;;12862:323;13242:80;13258:7;13267:11;:20;13279:7;13267:20;;;;;;;;;;;:26;;;13295:7;;13304:17;13242:15;:80::i;:::-;11791:1539;;;;:::o;17488:157::-;17561:4;17585:13;17599:37;17625:10;;17599:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;:37::i;:::-;17585:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17578:59;;17488:157;;;;:::o;13589:1326::-;13693:4;13678:19;;:11;;;;;;;;;;;:19;;;13670:28;;;;;;13783:42;13802:12;:10;:12::i;:::-;13816:8;13783:18;:42::i;:::-;:101;;;;;13842:42;13861:12;:10;:12::i;:::-;13875:8;13842:18;:42::i;:::-;13783:101;13761:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;13977:11;;13964:9;:24;;13956:33;;;;;;14192:5;14170:27;;:8;:18;14179:8;14170:18;;;;;;;;;;;;;;;;;;;;;:27;;;:58;;;;;14223:5;14201:27;;:8;:18;14210:8;14201:18;;;;;;;;;;;;;;;;;;;;;:27;;;14170:58;14162:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;14310:19;14332:11;:21;14344:8;14332:21;;;;;;;;;;;:26;;14310:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14398:11;:21;14410:8;14398:21;;;;;;;;;;;:26;;14369:11;:21;14381:8;14369:21;;;;;;;;;;;:26;;:55;;;;;;:::i;:::-;;;;;;:::i;:::-;;14464:5;14435:11;:21;14447:8;14435:21;;;;;;;;;;;:26;;:34;;;;;;;;;;;;:::i;:::-;;14536:4;14515:8;:18;14524:8;14515:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;14572:4;14551:8;:18;14560:8;14551:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;14676:89;14688:8;14698;14708:11;:21;14720:8;14708:21;;;;;;;;;;;:27;;;14737:11;:21;14749:8;14737:21;;;;;;;;;;;:27;;;14676:89;;;;;;;;;:::i;:::-;;;;;;;;14872:12;;;;;;;;;;;14864:30;;:43;14895:11;;14864:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13589:1326;;;:::o;19821:211::-;19882:7;20003:21;:12;:19;:21::i;:::-;19996:28;;19821:211;:::o;21916:309::-;22077:41;22096:12;:10;:12::i;:::-;22110:7;22077:18;:41::i;:::-;22069:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22183:34;22193:4;22199:2;22203:7;22212:4;22183:9;:34::i;:::-;21916:309;;;:::o;19509:236::-;19606:7;19642:16;19652:5;19642:9;:16::i;:::-;19634:5;:24;19626:33;;;;;;19707:30;19731:5;19707:13;:20;19721:5;19707:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;19700:37;;19509:236;;;;:::o;16957:103::-;17008:13;17041:11;17034:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16957:103;:::o;18083:142::-;1087:13:13;:11;:13::i;:::-;18133:12:1::1;18148:21;18133:36;;18188:10;18180:28;;:37;18209:7;18180:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1110:1:13;18083:142:1:o:0;22722:151::-;22826:39;22843:4;22849:2;22853:7;22826:39;;;;;;;;;;;;:16;:39::i;:::-;22722:151;;;:::o;20109:243::-;20184:7;20220:13;:11;:13::i;:::-;20212:5;:21;20204:30;;;;;;20276:15;20297:22;20313:5;20297:12;:15;;:22;;;;:::i;:::-;20275:44;;;20337:7;20330:14;;;20109:243;;;:::o;15568:78::-;1087:13:13;:11;:13::i;:::-;15633:5:1::1;15619:11;;:19;;;;;;;;;;;;;;;;;;15568:78::o:0;16562:153::-;1087:13:13;:11;:13::i;:::-;16673:1:1::1;16652:10;16646:24;:28;16638:37;;;::::0;::::1;;16697:10;16686:8;:21;;;;;;;;;;;;:::i;:::-;;16562:153:::0;:::o;15040:225::-;1087:13:13;:11;:13::i;:::-;15178:79:1::1;15194:7;15203:11;:20;15215:7;15203:20;;;;;;;;;;;:26;;;15231:8;;15241:15;15178;:79::i;:::-;15040:225:::0;;;;:::o;1872:23::-;;;;;;;;;;;;;:::o;18572:177::-;18644:7;18671:70;18688:7;18671:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;18664:77;;18572:177;;;:::o;3237:39::-;;;;:::o;3147:::-;;;;:::o;3064:38::-;;;;:::o;19328:97::-;19376:13;19409:8;19402:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19328:97;:::o;18289:221::-;18361:7;18406:1;18389:19;;:5;:19;;;;18381:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18473:29;:13;:20;18487:5;18473:20;;;;;;;;;;;;;;;:27;:29::i;:::-;18466:36;;18289:221;;;:::o;1824:101:13:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;6029:115:1:-;1087:13:13;:11;:13::i;:::-;6124:12:1::1;6105:16;;:31;;;;;;;;;;;;;;;;;;6029:115:::0;:::o;5814:108::-;1087:13:13;:11;:13::i;:::-;5901::1::1;5886:12;;:28;;;;;;;;;;;;;;;;;;5814:108:::0;:::o;2847:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;1194:85:13:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;18985:104:1:-;19041:13;19074:7;19067:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18985:104;:::o;21163:295::-;21278:12;:10;:12::i;:::-;21266:24;;:8;:24;;;;21258:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;21378:8;21333:18;:32;21352:12;:10;:12::i;:::-;21333:32;;;;;;;;;;;;;;;:42;21366:8;21333:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;21431:8;21402:48;;21417:12;:10;:12::i;:::-;21402:48;;;21441:8;21402:48;;;;;;:::i;:::-;;;;;;;;21163:295;;:::o;22339:312::-;22502:41;22521:12;:10;:12::i;:::-;22535:7;22502:18;:41::i;:::-;22494:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22608:35;22618:4;22624:2;22628:7;22637:5;22608:9;:35::i;:::-;22339:312;;;:::o;8942:564::-;9076:4;9061:19;;:11;;;;;;;;;;;:19;;;9053:28;;;;;;1861:4;9164:13;:11;:13::i;:::-;:25;9156:34;;;;;;9274:9;;9261;:22;;9253:31;;;;;;9428:70;9438:12;:10;:12::i;:::-;9468:1;9452:13;:11;:13::i;:::-;:17;;;;:::i;:::-;9471:9;;9482:15;9428:9;:70::i;:::-;8942:564;;;:::o;15362:151::-;1087:13:13;:11;:13::i;:::-;15445:1:1::1;15421:26;;:12;;;;;;;;;;;:26;;;;15413:35;;;::::0;::::1;;15501:4;15487:11;;:18;;;;;;;;;;;;;;;;;;15362:151::o:0;22944:285::-;23076:41;23095:12;:10;:12::i;:::-;23109:7;23076:18;:41::i;:::-;23068:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23182:39;23196:4;23202:2;23206:7;23215:5;23182:13;:39::i;:::-;22944:285;;;;:::o;8083:215::-;8215:32;8225:9;8236:10;8215:9;:32::i;:::-;8258;8268:9;8279:10;8258:9;:32::i;:::-;8083:215;;;;:::o;6435:241::-;1087:13:13;:11;:13::i;:::-;6542:11:1::1;;6524:14;:29;;6516:38;;;::::0;::::1;;6654:14;6640:11;:28;;;;6435:241:::0;:::o;15938:542::-;16005:13;16039:16;16047:7;16039;:16::i;:::-;16031:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;16120:19;16142:10;:19;16153:7;16142:19;;;;;;;;;;;16120:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16301:1;16284:5;16278:19;:24;16274:199;;;16351:9;:7;:9::i;:::-;16362:12;:10;:12::i;:::-;16333:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16319:58;;;;;16274:199;16442:9;:7;:9::i;:::-;16453:5;16424:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16410:51;;;15938:542;;;;:::o;6225:118::-;1087:13:13;:11;:13::i;:::-;6324:10:1::1;6301:5;;:34;;;;;;;;;;;;;;;;;;6225:118:::0;:::o;1825:40::-;1861:4;1825:40;:::o;17147:209::-;1087:13:13;:11;:13::i;:::-;17269:1:1::1;17245:13;;17239:27;;:31;17231:40;;;::::0;::::1;;17335:13;;17321:11;:27;;;;;;;:::i;:::-;;17147:209:::0;;:::o;15714:117::-;15772:11;;:::i;:::-;15803;:20;15815:7;15803:20;;;;;;;;;;;15796:27;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15714:117;;;:::o;21529:164::-;21626:4;21650:18;:25;21669:5;21650:25;;;;;;;;;;;;;;;:35;21676:8;21650:35;;;;;;;;;;;;;;;;;;;;;;;;;21643:42;;21529:164;;;;:::o;2074:198:13:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8483:389:1:-;8589:12;;;;;;;;;;;8573:28;;:12;:10;:12::i;:::-;:28;;;8565:37;;;;;;8677:8;:18;8686:8;8677:18;;;;;;;;;;;;;;;;;;;;;8669:27;;;;;;8766:9;8743:10;:20;8754:8;8743:20;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;8793:8;:18;8802:8;8793:18;;;;;;;;;;;;8786:25;;;;;;;;;;;8827:36;8843:8;8853:9;8827:36;;;;;;;:::i;:::-;;;;;;;;8483:389;;:::o;24702:127::-;24767:4;24791:30;24813:7;24791:12;:21;;:30;;;;:::i;:::-;24784:37;;24702:127;;;:::o;640:96:3:-;693:7;719:10;712:17;;640:96;:::o;27207:176:1:-;27300:2;27273:15;:24;27289:7;27273:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27349:7;27345:2;27318:39;;27327:16;27335:7;27327;:16::i;:::-;27318:39;;;;;;;;;;;;27207:176;;:::o;24996:341::-;25089:4;25114:16;25122:7;25114;:16::i;:::-;25106:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25190:13;25206:16;25214:7;25206;:16::i;:::-;25190:32;;25252:5;25241:16;;:7;:16;;;:51;;;;25285:7;25261:31;;:20;25273:7;25261:11;:20::i;:::-;:31;;;25241:51;:87;;;;25296:32;25313:5;25320:7;25296:16;:32::i;:::-;25241:87;25233:96;;;24996:341;;;;:::o;446:429:2:-;512:4;529:14;552:3;;529:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;635:1;623;:8;:13;:30;;;;651:2;640:1;:8;:13;623:30;:46;;;;665:4;657:12;;:1;659;657:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;623:46;:73;;;;692:4;673:23;;:1;686;675;:8;:12;;;;:::i;:::-;673:15;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;623:73;606:114;;;715:5;708:12;;;;;606:114;768:19;783:3;;768:14;:19::i;:::-;760:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;863:4;856:11;;;446:429;;;;;:::o;1044:436::-;1114:4;1131:14;1154:3;;1131:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1237:1;1225;:8;:13;:30;;;;1253:2;1242:1;:8;:13;1225:30;:46;;;;1267:4;1259:12;;:1;1261;1259:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;1225:46;:73;;;;1294:4;1275:23;;:1;1288;1277;:8;:12;;;;:::i;:::-;1275:15;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;1225:73;1208:114;;;1317:5;1310:12;;;;;1208:114;1370:19;1385:3;;1370:14;:19::i;:::-;1362:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1468:4;1461:11;;;1044:436;;;;;:::o;17842:147:1:-;17972:9;17924:13;17938:30;17964:3;17938:25;:30::i;:::-;17924:45;;;;;;:::i;:::-;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;17842:147;;:::o;6797:791::-;6952:58;6994:15;6952:41;:58::i;:::-;6944:67;;;;;;7065:17;7073:8;7065:7;:17::i;:::-;7057:26;;;;;;7219:5;7197:27;;:8;:18;7206:8;7197:18;;;;;;;;;;;;;;;;;;;;;:27;;;7189:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;7283:4;7262:8;:18;7271:8;7262:18;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;7394:12;;;;;;;;;;;7386:30;;:43;7417:11;;7386:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7521:59;7535:8;7545:6;7553:9;;7564:15;7521:59;;;;;;;;;;:::i;:::-;;;;;;;;6797:791;;;;;:::o;3076:510:2:-;3135:13;3160:17;3186:3;3160:30;;3201:19;3233:4;:11;3223:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3201:44;;3263:6;3258:289;3279:4;:11;3275:1;:15;3258:289;;;3371:2;3359:4;3364:1;3359:7;;;;;;;;;;;;;;;;;;;;;;;;3353:14;;:20;;;;3352:48;;;;;3397:2;3385:4;3390:1;3385:7;;;;;;;;;;;;;;;;;;;;;;;;3379:14;;:20;;;;3352:48;3348:188;;;3457:2;3446:4;3451:1;3446:7;;;;;;;;;;;;;;;;;;;;;;;;3440:14;;:19;;;;:::i;:::-;3433:27;;3421:6;3428:1;3421:9;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;3348:188;;;3513:4;3518:1;3513:7;;;;;;;;;;;;;;;;;;;;;;;;3501:6;3508:1;3501:9;;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;3348:188;3292:3;;;;:::i;:::-;;;3258:289;;;;3571:6;3557:21;;;;3076:510;;;:::o;9436:120:6:-;9505:7;9531:18;9538:3;:10;;9531:6;:18::i;:::-;9524:25;;9436:120;;;:::o;26366:723:1:-;26495:4;26475:24;;:16;26483:7;26475;:16::i;:::-;:24;;;26467:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;26596:1;26582:16;;:2;:16;;;;26574:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;26730:1;26704:28;;26712:5;;;;;;;;;;;26704:28;;;;:36;;;;;26736:4;26704:36;26700:112;;;26757:5;;;;;;;;;;;:34;;;26792:7;26757:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26700:112;26876:29;26893:1;26897:7;26876:8;:29::i;:::-;26918:35;26945:7;26918:13;:19;26932:4;26918:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;26964:30;26986:7;26964:13;:17;26978:2;26964:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;27007:29;27024:7;27033:2;27007:12;:16;;:29;;;;;:::i;:::-;;27073:7;27069:2;27054:27;;27063:4;27054:27;;;;;;;;;;;;26366:723;;;;:::o;11708:135:7:-;11779:7;11813:22;11817:3;:10;;11829:5;11813:3;:22::i;:::-;11805:31;;11798:38;;11708:135;;;;:::o;1352:130:13:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;9893:232:6:-;9973:7;9982;10002:11;10015:13;10032:21;10035:3;:10;;10047:5;10032:2;:21::i;:::-;10001:52;;;;10079:3;10071:12;;10109:5;10101:14;;10063:55;;;;;;9893:232;;;;;:::o;11143:240::-;11280:7;11330:43;11334:3;:10;;11354:3;11346:12;;11360;11330:3;:43::i;:::-;11322:52;;11299:77;;11143:240;;;;;:::o;11254:112:7:-;11314:7;11340:19;11348:3;:10;;11340:7;:19::i;:::-;11333:26;;11254:112;;;:::o;2426:187:13:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2426:187;;:::o;9849:1098:1:-;10017:41;10048:9;;10017:30;:41::i;:::-;:92;;;;;10104:5;10075:34;;:25;10090:9;;10075:14;:25::i;:::-;:34;;;10017:92;9995:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;10194:60;10229:15;:24;;;;;;;;:::i;:::-;10194:34;:60::i;:::-;10172:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;10520:13;10623:6;10568:15;10585:10;10597:9;;10608;;10551:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10541:78;;;;;;10536:84;;:93;;;;:::i;:::-;10520:109;;10640:9;;:11;;;;;;;;;:::i;:::-;;;;;;10706:34;10724:9;;10706:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10735:4;10706:17;:34::i;:::-;10775:22;;;;;;;;10780:5;10775:22;;;;10787:9;;10775:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10751:11;:21;10763:8;10751:21;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;10808:60;10818:3;10823:8;10850:9;;10861:5;10833:34;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10808:9;:60::i;:::-;10879;10895:8;10905:5;10912:9;;10923:15;10879;:60::i;:::-;9849:1098;;;;;;:::o;24111:278::-;24225:34;24235:4;24241:2;24245:7;24254:4;24225:9;:34::i;:::-;24278:48;24301:4;24307:2;24311:7;24320:5;24278:22;:48::i;:::-;24270:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24111:278;;;;:::o;9205:148:6:-;9289:4;9312:34;9321:3;:10;;9341:3;9333:12;;9312:8;:34::i;:::-;9305:41;;9205:148;;;;:::o;1608:664:2:-;1676:4;1693:14;1716:3;;1693:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1731:15;1749:1;1751;1749:4;;;;;;;;;;;;;;;;;;;;;;;;1731:22;;1770:6;1766:477;1780:1;:8;1778:1;:10;1766:477;;;1809:11;1823:1;1825;1823:4;;;;;;;;;;;;;;;;;;;;;;;;1809:18;;1856:4;1848:12;;:4;:12;;;;:32;;;;;1876:4;1864:16;;:8;:16;;;;1848:32;1844:50;;;1889:5;1882:12;;;;;;;;1844:50;1978:4;1970:12;;:4;:12;;;;;:28;;;;;1994:4;1986:12;;:4;:12;;;;;1970:28;1968:31;:118;;;;;2065:4;2057:12;;:4;:12;;;;;:28;;;;;2081:4;2073:12;;:4;:12;;;;;2057:28;2055:31;1968:118;:178;;;;;2125:4;2117:12;;:4;:12;;;;;:28;;;;;2141:4;2133:12;;:4;:12;;;;;2117:28;2115:31;1968:178;1947:252;;;2194:5;2187:12;;;;;;;;1947:252;2227:4;2216:15;;1766:477;1790:3;;;;:::i;:::-;;;1766:477;;;;2260:4;2253:11;;;;1608:664;;;;;:::o;2280:724::-;2389:4;2469:2;2429:14;:29;;;;;;;;:::i;:::-;2423:43;;:48;:114;;;;;2535:2;2494:14;:30;;;;;;;;:::i;:::-;2488:44;;:49;2423:114;:178;;;;;2599:2;2560:14;:28;;;;;;;;:::i;:::-;2554:42;;:47;2423:178;:318;;;;;2653:6;2620:14;:29;;;:39;;:81;;;;;2695:6;2663:14;:29;;;:38;2620:81;2619:121;;;;2739:1;2706:14;:29;;;:34;2619:121;2423:318;:381;;;;;2802:2;2764:14;:27;;;;;;;;:::i;:::-;2758:41;;:46;2423:381;:446;;;;;2867:2;2827:14;:29;;;;;;;;:::i;:::-;2821:43;;:48;2423:446;:504;;;;;2925:2;2892:14;:22;;;;;;;;:::i;:::-;2886:36;;:41;2423:504;2406:557;;;2959:4;2952:11;;;;2406:557;2991:5;2984:12;;2280:724;;;;:::o;3284:123:6:-;3356:7;3382:18;:3;:9;;:16;:18::i;:::-;3375:25;;3284:123;;;:::o;10813:135:7:-;10883:4;10906:35;10914:3;:10;;10934:5;10926:14;;10906:7;:35::i;:::-;10899:42;;10813:135;;;;:::o;10516:129::-;10583:4;10606:32;10611:3;:10;;10631:5;10623:14;;10606:4;:32::i;:::-;10599:39;;10516:129;;;;:::o;8616:212:6:-;8735:4;8758:63;8762:3;:10;;8782:3;8774:12;;8812:5;8796:23;;8788:32;;8758:3;:63::i;:::-;8751:70;;8616:212;;;;;:::o;4811:118:7:-;4878:7;4904:3;:11;;4916:5;4904:18;;;;;;;;;;;;;;;;;;;;;;;;4897:25;;4811:118;;;;:::o;3760:191:6:-;3843:7;3852;3871:11;3885:19;3898:5;3885:3;:9;;:12;;:19;;;;:::i;:::-;3871:33;;3922:3;3927;:11;;:16;3939:3;3927:16;;;;;;;;;;;;3914:30;;;;;3760:191;;;;;:::o;5072:285::-;5212:7;5231:13;5247:3;:11;;:16;5259:3;5247:16;;;;;;;;;;;;5231:32;;5290:1;5281:10;;:5;:10;;:32;;;;5295:18;5304:3;5309;5295:8;:18::i;:::-;5281:32;5315:12;5273:55;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5345:5;5338:12;;;5072:285;;;;;:::o;4362:107:7:-;4418:7;4444:3;:11;;:18;;;;4437:25;;4362:107;;;:::o;11174:250:1:-;11270:18;11276:2;11280:7;11270:5;:18::i;:::-;11307:54;11338:1;11342:2;11346:7;11355:5;11307:22;:54::i;:::-;11299:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;11174:250;;;:::o;27948:598::-;28069:4;28096:15;:2;:13;;;:15::i;:::-;28091:60;;28135:4;28128:11;;;;28091:60;28161:23;28187:252;28240:45;;;28300:12;:10;:12::i;:::-;28327:4;28346:7;28368:5;28203:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28187:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;28161:278;;28450:13;28477:10;28466:32;;;;;;;;;;;;:::i;:::-;28450:48;;28527:10;28517:20;;:6;:20;;;;28509:29;;;;27948:598;;;;;;;:::o;3054:140:6:-;3141:4;3164:23;3183:3;3164;:9;;:18;;:23;;;;:::i;:::-;3157:30;;3054:140;;;;:::o;6538:115:7:-;6601:7;6627:19;6635:3;:10;;6627:7;:19::i;:::-;6620:26;;6538:115;;;:::o;2685:1388::-;2751:4;2867:18;2888:3;:12;;:19;2901:5;2888:19;;;;;;;;;;;;2867:40;;2936:1;2922:10;:15;2918:1149;;3291:21;3328:1;3315:10;:14;;;;:::i;:::-;3291:38;;3343:17;3384:1;3363:3;:11;;:18;;;;:22;;;;:::i;:::-;3343:42;;3417:13;3404:9;:26;3400:398;;3450:17;3470:3;:11;;3482:9;3470:22;;;;;;;;;;;;;;;;;;;;;;;;3450:42;;3621:9;3592:3;:11;;3604:13;3592:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3730:10;3704:3;:12;;:23;3717:9;3704:23;;;;;;;;;;;:36;;;;3400:398;;3876:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:3;:12;;:19;3981:5;3968:19;;;;;;;;;;;3961:26;;;4009:4;4002:11;;;;;;;2918:1149;4051:5;4044:12;;;2685:1388;;;;;:::o;2113:404::-;2176:4;2197:21;2207:3;2212:5;2197:9;:21::i;:::-;2192:319;;2234:3;:11;;2251:5;2234:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:3;:11;;:18;;;;2392:3;:12;;:19;2405:5;2392:19;;;;;;;;;;;:40;;;;2453:4;2446:11;;;;2192:319;2495:5;2488:12;;2113:404;;;;;:::o;2439:204:6:-;2561:4;2596:5;2577:3;:11;;:16;2589:3;2577:16;;;;;;;;;;;:24;;;;2618:18;2632:3;2618;:9;;:13;;:18;;;;:::i;:::-;2611:25;;2439:204;;;;;:::o;6995:129:7:-;7069:7;7095:22;7099:3;:10;;7111:5;7095:3;:22::i;:::-;7088:29;;6995:129;;;;:::o;25673:356:1:-;25770:1;25755:17;;:3;:17;;;;25747:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25829:17;25837:8;25829:7;:17::i;:::-;25828:18;25820:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;25892:32;25915:8;25892:13;:18;25906:3;25892:18;;;;;;;;;;;;;;;:22;;:32;;;;:::i;:::-;;25937:31;25954:8;25964:3;25937:12;:16;;:31;;;;;:::i;:::-;;26012:8;26007:3;25986:35;;26003:1;25986:35;;;;;;;;;;;;25673:356;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;3861:223::-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;;3861:223;;;;;:::o;6319:138:7:-;6399:4;6422:28;6432:3;:10;;6444:5;6422:9;:28::i;:::-;6415:35;;6319:138;;;;:::o;4154:127::-;4227:4;4273:1;4250:3;:12;;:19;4263:5;4250:19;;;;;;;;;;;;:24;;4243:31;;4154:127;;;;:::o;5818:123::-;5888:4;5911:23;5916:3;:10;;5928:5;5911:4;:23::i;:::-;5904:30;;5818:123;;;;:::o;4948:499:0:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5236:18;5247:6;5236:10;:18::i;:::-;5228:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;;;;4948:499;;;;;;:::o;7561:742::-;7707:12;7735:7;7731:566;;;7765:10;7758:17;;;;7731:566;7896:1;7876:10;:17;:21;7872:415;;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;8069:145;8259:12;8252:20;;;;;;;;;;;:::i;:::-;;;;;;;;7561:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:352::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1957:273::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2080:1;2077;2070:12;2029:2;2120:6;2107:20;2145:79;2220:3;2212:6;2205:4;2197:6;2193:17;2145:79;:::i;:::-;2136:88;;2019:211;;;;;:::o;2278:171::-;2357:5;2398:3;2389:6;2384:3;2380:16;2376:26;2373:2;;;2415:1;2412;2405:12;2373:2;2437:6;2428:15;;2363:86;;;;:::o;2455:139::-;2501:5;2539:6;2526:20;2517:29;;2555:33;2582:5;2555:33;:::i;:::-;2507:87;;;;:::o;2600:262::-;2659:6;2708:2;2696:9;2687:7;2683:23;2679:32;2676:2;;;2724:1;2721;2714:12;2676:2;2767:1;2792:53;2837:7;2828:6;2817:9;2813:22;2792:53;:::i;:::-;2782:63;;2738:117;2666:196;;;;:::o;2868:407::-;2936:6;2944;2993:2;2981:9;2972:7;2968:23;2964:32;2961:2;;;3009:1;3006;2999:12;2961:2;3052:1;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3023:117;3179:2;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3150:118;2951:324;;;;;:::o;3281:552::-;3358:6;3366;3374;3423:2;3411:9;3402:7;3398:23;3394:32;3391:2;;;3439:1;3436;3429:12;3391:2;3482:1;3507:53;3552:7;3543:6;3532:9;3528:22;3507:53;:::i;:::-;3497:63;;3453:117;3609:2;3635:53;3680:7;3671:6;3660:9;3656:22;3635:53;:::i;:::-;3625:63;;3580:118;3737:2;3763:53;3808:7;3799:6;3788:9;3784:22;3763:53;:::i;:::-;3753:63;;3708:118;3381:452;;;;;:::o;3839:809::-;3934:6;3942;3950;3958;4007:3;3995:9;3986:7;3982:23;3978:33;3975:2;;;4024:1;4021;4014:12;3975:2;4067:1;4092:53;4137:7;4128:6;4117:9;4113:22;4092:53;:::i;:::-;4082:63;;4038:117;4194:2;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4165:118;4322:2;4348:53;4393:7;4384:6;4373:9;4369:22;4348:53;:::i;:::-;4338:63;;4293:118;4478:2;4467:9;4463:18;4450:32;4509:18;4501:6;4498:30;4495:2;;;4541:1;4538;4531:12;4495:2;4569:62;4623:7;4614:6;4603:9;4599:22;4569:62;:::i;:::-;4559:72;;4421:220;3965:683;;;;;;;:::o;4654:401::-;4719:6;4727;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4792:1;4789;4782:12;4744:2;4835:1;4860:53;4905:7;4896:6;4885:9;4881:22;4860:53;:::i;:::-;4850:63;;4806:117;4962:2;4988:50;5030:7;5021:6;5010:9;5006:22;4988:50;:::i;:::-;4978:60;;4933:115;4734:321;;;;;:::o;5061:407::-;5129:6;5137;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;5202:1;5199;5192:12;5154:2;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5144:324;;;;;:::o;5474:260::-;5532:6;5581:2;5569:9;5560:7;5556:23;5552:32;5549:2;;;5597:1;5594;5587:12;5549:2;5640:1;5665:52;5709:7;5700:6;5689:9;5685:22;5665:52;:::i;:::-;5655:62;;5611:116;5539:195;;;;:::o;5740:282::-;5809:6;5858:2;5846:9;5837:7;5833:23;5829:32;5826:2;;;5874:1;5871;5864:12;5826:2;5917:1;5942:63;5997:7;5988:6;5977:9;5973:22;5942:63;:::i;:::-;5932:73;;5888:127;5816:206;;;;:::o;6028:395::-;6099:6;6107;6156:2;6144:9;6135:7;6131:23;6127:32;6124:2;;;6172:1;6169;6162:12;6124:2;6243:1;6232:9;6228:17;6215:31;6273:18;6265:6;6262:30;6259:2;;;6305:1;6302;6295:12;6259:2;6341:65;6398:7;6389:6;6378:9;6374:22;6341:65;:::i;:::-;6323:83;;;;6186:230;6114:309;;;;;:::o;6429:699::-;6542:6;6550;6558;6607:2;6595:9;6586:7;6582:23;6578:32;6575:2;;;6623:1;6620;6613:12;6575:2;6694:1;6683:9;6679:17;6666:31;6724:18;6716:6;6713:30;6710:2;;;6756:1;6753;6746:12;6710:2;6792:65;6849:7;6840:6;6829:9;6825:22;6792:65;:::i;:::-;6774:83;;;;6637:230;6934:2;6923:9;6919:18;6906:32;6965:18;6957:6;6954:30;6951:2;;;6997:1;6994;6987:12;6951:2;7025:86;7103:7;7094:6;7083:9;7079:22;7025:86;:::i;:::-;7015:96;;6877:244;6565:563;;;;;:::o;7134:375::-;7203:6;7252:2;7240:9;7231:7;7227:23;7223:32;7220:2;;;7268:1;7265;7258:12;7220:2;7339:1;7328:9;7324:17;7311:31;7369:18;7361:6;7358:30;7355:2;;;7401:1;7398;7391:12;7355:2;7429:63;7484:7;7475:6;7464:9;7460:22;7429:63;:::i;:::-;7419:73;;7282:220;7210:299;;;;:::o;7515:262::-;7574:6;7623:2;7611:9;7602:7;7598:23;7594:32;7591:2;;;7639:1;7636;7629:12;7591:2;7682:1;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7653:117;7581:196;;;;:::o;7783:844::-;7905:6;7913;7921;7929;7978:2;7966:9;7957:7;7953:23;7949:32;7946:2;;;7994:1;7991;7984:12;7946:2;8037:1;8062:53;8107:7;8098:6;8087:9;8083:22;8062:53;:::i;:::-;8052:63;;8008:117;8192:2;8181:9;8177:18;8164:32;8223:18;8215:6;8212:30;8209:2;;;8255:1;8252;8245:12;8209:2;8291:65;8348:7;8339:6;8328:9;8324:22;8291:65;:::i;:::-;8273:83;;;;8135:231;8433:2;8422:9;8418:18;8405:32;8464:18;8456:6;8453:30;8450:2;;;8496:1;8493;8486:12;8450:2;8524:86;8602:7;8593:6;8582:9;8578:22;8524:86;:::i;:::-;8514:96;;8376:244;7936:691;;;;;;;:::o;8633:520::-;8711:6;8719;8768:2;8756:9;8747:7;8743:23;8739:32;8736:2;;;8784:1;8781;8774:12;8736:2;8827:1;8852:53;8897:7;8888:6;8877:9;8873:22;8852:53;:::i;:::-;8842:63;;8798:117;8982:2;8971:9;8967:18;8954:32;9013:18;9005:6;9002:30;8999:2;;;9045:1;9042;9035:12;8999:2;9073:63;9128:7;9119:6;9108:9;9104:22;9073:63;:::i;:::-;9063:73;;8925:221;8726:427;;;;;:::o;9159:407::-;9227:6;9235;9284:2;9272:9;9263:7;9259:23;9255:32;9252:2;;;9300:1;9297;9290:12;9252:2;9343:1;9368:53;9413:7;9404:6;9393:9;9389:22;9368:53;:::i;:::-;9358:63;;9314:117;9470:2;9496:53;9541:7;9532:6;9521:9;9517:22;9496:53;:::i;:::-;9486:63;;9441:118;9242:324;;;;;:::o;9572:924::-;9678:6;9686;9694;9702;9751:3;9739:9;9730:7;9726:23;9722:33;9719:2;;;9768:1;9765;9758:12;9719:2;9811:1;9836:53;9881:7;9872:6;9861:9;9857:22;9836:53;:::i;:::-;9826:63;;9782:117;9938:2;9964:53;10009:7;10000:6;9989:9;9985:22;9964:53;:::i;:::-;9954:63;;9909:118;10094:2;10083:9;10079:18;10066:32;10125:18;10117:6;10114:30;10111:2;;;10157:1;10154;10147:12;10111:2;10185:63;10240:7;10231:6;10220:9;10216:22;10185:63;:::i;:::-;10175:73;;10037:221;10325:2;10314:9;10310:18;10297:32;10356:18;10348:6;10345:30;10342:2;;;10388:1;10385;10378:12;10342:2;10416:63;10471:7;10462:6;10451:9;10447:22;10416:63;:::i;:::-;10406:73;;10268:221;9709:787;;;;;;;:::o;10502:118::-;10589:24;10607:5;10589:24;:::i;:::-;10584:3;10577:37;10567:53;;:::o;10626:157::-;10731:45;10751:24;10769:5;10751:24;:::i;:::-;10731:45;:::i;:::-;10726:3;10719:58;10709:74;;:::o;10789:109::-;10870:21;10885:5;10870:21;:::i;:::-;10865:3;10858:34;10848:50;;:::o;10904:360::-;10990:3;11018:38;11050:5;11018:38;:::i;:::-;11072:70;11135:6;11130:3;11072:70;:::i;:::-;11065:77;;11151:52;11196:6;11191:3;11184:4;11177:5;11173:16;11151:52;:::i;:::-;11228:29;11250:6;11228:29;:::i;:::-;11223:3;11219:39;11212:46;;10994:270;;;;;:::o;11270:373::-;11374:3;11402:38;11434:5;11402:38;:::i;:::-;11456:88;11537:6;11532:3;11456:88;:::i;:::-;11449:95;;11553:52;11598:6;11593:3;11586:4;11579:5;11575:16;11553:52;:::i;:::-;11630:6;11625:3;11621:16;11614:23;;11378:265;;;;;:::o;11673:284::-;11761:3;11782:61;11836:6;11831:3;11782:61;:::i;:::-;11775:68;;11853:43;11889:6;11884:3;11877:5;11853:43;:::i;:::-;11921:29;11943:6;11921:29;:::i;:::-;11916:3;11912:39;11905:46;;11765:192;;;;;:::o;11987:304::-;12085:3;12106:71;12170:6;12165:3;12106:71;:::i;:::-;12099:78;;12187:43;12223:6;12218:3;12211:5;12187:43;:::i;:::-;12255:29;12277:6;12255:29;:::i;:::-;12250:3;12246:39;12239:46;;12089:202;;;;;:::o;12321:317::-;12437:3;12458:89;12540:6;12535:3;12458:89;:::i;:::-;12451:96;;12557:43;12593:6;12588:3;12581:5;12557:43;:::i;:::-;12625:6;12620:3;12616:16;12609:23;;12441:197;;;;;:::o;12644:344::-;12722:3;12750:39;12783:5;12750:39;:::i;:::-;12805:61;12859:6;12854:3;12805:61;:::i;:::-;12798:68;;12875:52;12920:6;12915:3;12908:4;12901:5;12897:16;12875:52;:::i;:::-;12952:29;12974:6;12952:29;:::i;:::-;12947:3;12943:39;12936:46;;12726:262;;;;;:::o;12994:364::-;13082:3;13110:39;13143:5;13110:39;:::i;:::-;13165:71;13229:6;13224:3;13165:71;:::i;:::-;13158:78;;13245:52;13290:6;13285:3;13278:4;13271:5;13267:16;13245:52;:::i;:::-;13322:29;13344:6;13322:29;:::i;:::-;13317:3;13313:39;13306:46;;13086:272;;;;;:::o;13364:377::-;13470:3;13498:39;13531:5;13498:39;:::i;:::-;13553:89;13635:6;13630:3;13553:89;:::i;:::-;13546:96;;13651:52;13696:6;13691:3;13684:4;13677:5;13673:16;13651:52;:::i;:::-;13728:6;13723:3;13719:16;13712:23;;13474:267;;;;;:::o;13747:366::-;13889:3;13910:67;13974:2;13969:3;13910:67;:::i;:::-;13903:74;;13986:93;14075:3;13986:93;:::i;:::-;14104:2;14099:3;14095:12;14088:19;;13893:220;;;:::o;14119:366::-;14261:3;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14358:93;14447:3;14358:93;:::i;:::-;14476:2;14471:3;14467:12;14460:19;;14265:220;;;:::o;14491:366::-;14633:3;14654:67;14718:2;14713:3;14654:67;:::i;:::-;14647:74;;14730:93;14819:3;14730:93;:::i;:::-;14848:2;14843:3;14839:12;14832:19;;14637:220;;;:::o;14863:366::-;15005:3;15026:67;15090:2;15085:3;15026:67;:::i;:::-;15019:74;;15102:93;15191:3;15102:93;:::i;:::-;15220:2;15215:3;15211:12;15204:19;;15009:220;;;:::o;15235:366::-;15377:3;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15474:93;15563:3;15474:93;:::i;:::-;15592:2;15587:3;15583:12;15576:19;;15381:220;;;:::o;15607:366::-;15749:3;15770:67;15834:2;15829:3;15770:67;:::i;:::-;15763:74;;15846:93;15935:3;15846:93;:::i;:::-;15964:2;15959:3;15955:12;15948:19;;15753:220;;;:::o;15979:366::-;16121:3;16142:67;16206:2;16201:3;16142:67;:::i;:::-;16135:74;;16218:93;16307:3;16218:93;:::i;:::-;16336:2;16331:3;16327:12;16320:19;;16125:220;;;:::o;16351:366::-;16493:3;16514:67;16578:2;16573:3;16514:67;:::i;:::-;16507:74;;16590:93;16679:3;16590:93;:::i;:::-;16708:2;16703:3;16699:12;16692:19;;16497:220;;;:::o;16723:366::-;16865:3;16886:67;16950:2;16945:3;16886:67;:::i;:::-;16879:74;;16962:93;17051:3;16962:93;:::i;:::-;17080:2;17075:3;17071:12;17064:19;;16869:220;;;:::o;17095:366::-;17237:3;17258:67;17322:2;17317:3;17258:67;:::i;:::-;17251:74;;17334:93;17423:3;17334:93;:::i;:::-;17452:2;17447:3;17443:12;17436:19;;17241:220;;;:::o;17467:366::-;17609:3;17630:67;17694:2;17689:3;17630:67;:::i;:::-;17623:74;;17706:93;17795:3;17706:93;:::i;:::-;17824:2;17819:3;17815:12;17808:19;;17613:220;;;:::o;17839:366::-;17981:3;18002:67;18066:2;18061:3;18002:67;:::i;:::-;17995:74;;18078:93;18167:3;18078:93;:::i;:::-;18196:2;18191:3;18187:12;18180:19;;17985:220;;;:::o;18211:366::-;18353:3;18374:67;18438:2;18433:3;18374:67;:::i;:::-;18367:74;;18450:93;18539:3;18450:93;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18357:220;;;:::o;18583:366::-;18725:3;18746:67;18810:2;18805:3;18746:67;:::i;:::-;18739:74;;18822:93;18911:3;18822:93;:::i;:::-;18940:2;18935:3;18931:12;18924:19;;18729:220;;;:::o;18955:366::-;19097:3;19118:67;19182:2;19177:3;19118:67;:::i;:::-;19111:74;;19194:93;19283:3;19194:93;:::i;:::-;19312:2;19307:3;19303:12;19296:19;;19101:220;;;:::o;19327:366::-;19469:3;19490:67;19554:2;19549:3;19490:67;:::i;:::-;19483:74;;19566:93;19655:3;19566:93;:::i;:::-;19684:2;19679:3;19675:12;19668:19;;19473:220;;;:::o;19699:366::-;19841:3;19862:67;19926:2;19921:3;19862:67;:::i;:::-;19855:74;;19938:93;20027:3;19938:93;:::i;:::-;20056:2;20051:3;20047:12;20040:19;;19845:220;;;:::o;20071:366::-;20213:3;20234:67;20298:2;20293:3;20234:67;:::i;:::-;20227:74;;20310:93;20399:3;20310:93;:::i;:::-;20428:2;20423:3;20419:12;20412:19;;20217:220;;;:::o;20443:366::-;20585:3;20606:67;20670:2;20665:3;20606:67;:::i;:::-;20599:74;;20682:93;20771:3;20682:93;:::i;:::-;20800:2;20795:3;20791:12;20784:19;;20589:220;;;:::o;20815:366::-;20957:3;20978:67;21042:2;21037:3;20978:67;:::i;:::-;20971:74;;21054:93;21143:3;21054:93;:::i;:::-;21172:2;21167:3;21163:12;21156:19;;20961:220;;;:::o;21187:366::-;21329:3;21350:67;21414:2;21409:3;21350:67;:::i;:::-;21343:74;;21426:93;21515:3;21426:93;:::i;:::-;21544:2;21539:3;21535:12;21528:19;;21333:220;;;:::o;21559:366::-;21701:3;21722:67;21786:2;21781:3;21722:67;:::i;:::-;21715:74;;21798:93;21887:3;21798:93;:::i;:::-;21916:2;21911:3;21907:12;21900:19;;21705:220;;;:::o;22011:2667::-;22144:3;22180:6;22175:3;22171:16;22270:62;22326:4;22319:5;22315:16;22308:5;22270:62;:::i;:::-;22379:3;22373:4;22369:14;22362:4;22357:3;22353:14;22346:38;22405:89;22489:4;22475:12;22461;22405:89;:::i;:::-;22397:97;;22197:308;;22594:62;22650:4;22643:5;22639:16;22632:5;22594:62;:::i;:::-;22703:3;22697:4;22693:14;22686:4;22681:3;22677:14;22670:38;22729:89;22813:4;22799:12;22785;22729:89;:::i;:::-;22721:97;;22515:314;;22919:62;22975:4;22968:5;22964:16;22957:5;22919:62;:::i;:::-;23028:3;23022:4;23018:14;23011:4;23006:3;23002:14;22995:38;23054:89;23138:4;23124:12;23110;23054:89;:::i;:::-;23046:97;;22839:315;;23242:62;23298:4;23291:5;23287:16;23280:5;23242:62;:::i;:::-;23351:3;23345:4;23341:14;23334:4;23329:3;23325:14;23318:38;23377:89;23461:4;23447:12;23433;23377:89;:::i;:::-;23369:97;;23164:313;;23552:50;23596:4;23589:5;23585:16;23578:5;23552:50;:::i;:::-;23615:63;23672:4;23667:3;23663:14;23649:12;23615:63;:::i;:::-;23487:201;23775:62;23831:4;23824:5;23820:16;23813:5;23775:62;:::i;:::-;23884:3;23878:4;23874:14;23867:4;23862:3;23858:14;23851:38;23910:89;23994:4;23980:12;23966;23910:89;:::i;:::-;23902:97;;23698:312;;24099:62;24155:4;24148:5;24144:16;24137:5;24099:62;:::i;:::-;24208:3;24202:4;24198:14;24191:4;24186:3;24182:14;24175:38;24234:89;24318:4;24304:12;24290;24234:89;:::i;:::-;24226:97;;24020:314;;24416:62;24472:4;24465:5;24461:16;24454:5;24416:62;:::i;:::-;24525:3;24519:4;24515:14;24508:4;24503:3;24499:14;24492:38;24551:89;24635:4;24621:12;24607;24551:89;:::i;:::-;24543:97;;24344:307;;24668:4;24661:11;;22149:2529;;;;;:::o;24744:599::-;24855:3;24891:4;24886:3;24882:14;24979:4;24972:5;24968:16;24962:23;24998:63;25055:4;25050:3;25046:14;25032:12;24998:63;:::i;:::-;24906:165;25153:4;25146:5;25142:16;25136:23;25206:3;25200:4;25196:14;25189:4;25184:3;25180:14;25173:38;25232:73;25300:4;25286:12;25232:73;:::i;:::-;25224:81;;25081:235;25333:4;25326:11;;24860:483;;;;;:::o;25349:108::-;25426:24;25444:5;25426:24;:::i;:::-;25421:3;25414:37;25404:53;;:::o;25463:118::-;25550:24;25568:5;25550:24;:::i;:::-;25545:3;25538:37;25528:53;;:::o;25587:157::-;25692:45;25712:24;25730:5;25712:24;:::i;:::-;25692:45;:::i;:::-;25687:3;25680:58;25670:74;;:::o;25750:271::-;25880:3;25902:93;25991:3;25982:6;25902:93;:::i;:::-;25895:100;;26012:3;26005:10;;25884:137;;;;:::o;26027:436::-;26197:3;26219:105;26320:3;26311:6;26303;26219:105;:::i;:::-;26212:112;;26334:75;26405:3;26396:6;26334:75;:::i;:::-;26434:2;26429:3;26425:12;26418:19;;26454:3;26447:10;;26201:262;;;;;;:::o;26469:275::-;26601:3;26623:95;26714:3;26705:6;26623:95;:::i;:::-;26616:102;;26735:3;26728:10;;26605:139;;;;:::o;26750:435::-;26930:3;26952:95;27043:3;27034:6;26952:95;:::i;:::-;26945:102;;27064:95;27155:3;27146:6;27064:95;:::i;:::-;27057:102;;27176:3;27169:10;;26934:251;;;;;:::o;27191:718::-;27417:3;27432:75;27503:3;27494:6;27432:75;:::i;:::-;27532:2;27527:3;27523:12;27516:19;;27545:75;27616:3;27607:6;27545:75;:::i;:::-;27645:2;27640:3;27636:12;27629:19;;27665:105;27766:3;27757:6;27749;27665:105;:::i;:::-;27658:112;;27780:75;27851:3;27842:6;27780:75;:::i;:::-;27880:2;27875:3;27871:12;27864:19;;27900:3;27893:10;;27421:488;;;;;;;;:::o;27915:222::-;28008:4;28046:2;28035:9;28031:18;28023:26;;28059:71;28127:1;28116:9;28112:17;28103:6;28059:71;:::i;:::-;28013:124;;;;:::o;28143:640::-;28338:4;28376:3;28365:9;28361:19;28353:27;;28390:71;28458:1;28447:9;28443:17;28434:6;28390:71;:::i;:::-;28471:72;28539:2;28528:9;28524:18;28515:6;28471:72;:::i;:::-;28553;28621:2;28610:9;28606:18;28597:6;28553:72;:::i;:::-;28672:9;28666:4;28662:20;28657:2;28646:9;28642:18;28635:48;28700:76;28771:4;28762:6;28700:76;:::i;:::-;28692:84;;28343:440;;;;;;;:::o;28789:210::-;28876:4;28914:2;28903:9;28899:18;28891:26;;28927:65;28989:1;28978:9;28974:17;28965:6;28927:65;:::i;:::-;28881:118;;;;:::o;29005:313::-;29118:4;29156:2;29145:9;29141:18;29133:26;;29205:9;29199:4;29195:20;29191:1;29180:9;29176:17;29169:47;29233:78;29306:4;29297:6;29233:78;:::i;:::-;29225:86;;29123:195;;;;:::o;29324:419::-;29490:4;29528:2;29517:9;29513:18;29505:26;;29577:9;29571:4;29567:20;29563:1;29552:9;29548:17;29541:47;29605:131;29731:4;29605:131;:::i;:::-;29597:139;;29495:248;;;:::o;29749:419::-;29915:4;29953:2;29942:9;29938:18;29930:26;;30002:9;29996:4;29992:20;29988:1;29977:9;29973:17;29966:47;30030:131;30156:4;30030:131;:::i;:::-;30022:139;;29920:248;;;:::o;30174:419::-;30340:4;30378:2;30367:9;30363:18;30355:26;;30427:9;30421:4;30417:20;30413:1;30402:9;30398:17;30391:47;30455:131;30581:4;30455:131;:::i;:::-;30447:139;;30345:248;;;:::o;30599:419::-;30765:4;30803:2;30792:9;30788:18;30780:26;;30852:9;30846:4;30842:20;30838:1;30827:9;30823:17;30816:47;30880:131;31006:4;30880:131;:::i;:::-;30872:139;;30770:248;;;:::o;31024:419::-;31190:4;31228:2;31217:9;31213:18;31205:26;;31277:9;31271:4;31267:20;31263:1;31252:9;31248:17;31241:47;31305:131;31431:4;31305:131;:::i;:::-;31297:139;;31195:248;;;:::o;31449:419::-;31615:4;31653:2;31642:9;31638:18;31630:26;;31702:9;31696:4;31692:20;31688:1;31677:9;31673:17;31666:47;31730:131;31856:4;31730:131;:::i;:::-;31722:139;;31620:248;;;:::o;31874:419::-;32040:4;32078:2;32067:9;32063:18;32055:26;;32127:9;32121:4;32117:20;32113:1;32102:9;32098:17;32091:47;32155:131;32281:4;32155:131;:::i;:::-;32147:139;;32045:248;;;:::o;32299:419::-;32465:4;32503:2;32492:9;32488:18;32480:26;;32552:9;32546:4;32542:20;32538:1;32527:9;32523:17;32516:47;32580:131;32706:4;32580:131;:::i;:::-;32572:139;;32470:248;;;:::o;32724:419::-;32890:4;32928:2;32917:9;32913:18;32905:26;;32977:9;32971:4;32967:20;32963:1;32952:9;32948:17;32941:47;33005:131;33131:4;33005:131;:::i;:::-;32997:139;;32895:248;;;:::o;33149:419::-;33315:4;33353:2;33342:9;33338:18;33330:26;;33402:9;33396:4;33392:20;33388:1;33377:9;33373:17;33366:47;33430:131;33556:4;33430:131;:::i;:::-;33422:139;;33320:248;;;:::o;33574:419::-;33740:4;33778:2;33767:9;33763:18;33755:26;;33827:9;33821:4;33817:20;33813:1;33802:9;33798:17;33791:47;33855:131;33981:4;33855:131;:::i;:::-;33847:139;;33745:248;;;:::o;33999:419::-;34165:4;34203:2;34192:9;34188:18;34180:26;;34252:9;34246:4;34242:20;34238:1;34227:9;34223:17;34216:47;34280:131;34406:4;34280:131;:::i;:::-;34272:139;;34170:248;;;:::o;34424:419::-;34590:4;34628:2;34617:9;34613:18;34605:26;;34677:9;34671:4;34667:20;34663:1;34652:9;34648:17;34641:47;34705:131;34831:4;34705:131;:::i;:::-;34697:139;;34595:248;;;:::o;34849:419::-;35015:4;35053:2;35042:9;35038:18;35030:26;;35102:9;35096:4;35092:20;35088:1;35077:9;35073:17;35066:47;35130:131;35256:4;35130:131;:::i;:::-;35122:139;;35020:248;;;:::o;35274:419::-;35440:4;35478:2;35467:9;35463:18;35455:26;;35527:9;35521:4;35517:20;35513:1;35502:9;35498:17;35491:47;35555:131;35681:4;35555:131;:::i;:::-;35547:139;;35445:248;;;:::o;35699:419::-;35865:4;35903:2;35892:9;35888:18;35880:26;;35952:9;35946:4;35942:20;35938:1;35927:9;35923:17;35916:47;35980:131;36106:4;35980:131;:::i;:::-;35972:139;;35870:248;;;:::o;36124:419::-;36290:4;36328:2;36317:9;36313:18;36305:26;;36377:9;36371:4;36367:20;36363:1;36352:9;36348:17;36341:47;36405:131;36531:4;36405:131;:::i;:::-;36397:139;;36295:248;;;:::o;36549:419::-;36715:4;36753:2;36742:9;36738:18;36730:26;;36802:9;36796:4;36792:20;36788:1;36777:9;36773:17;36766:47;36830:131;36956:4;36830:131;:::i;:::-;36822:139;;36720:248;;;:::o;36974:419::-;37140:4;37178:2;37167:9;37163:18;37155:26;;37227:9;37221:4;37217:20;37213:1;37202:9;37198:17;37191:47;37255:131;37381:4;37255:131;:::i;:::-;37247:139;;37145:248;;;:::o;37399:419::-;37565:4;37603:2;37592:9;37588:18;37580:26;;37652:9;37646:4;37642:20;37638:1;37627:9;37623:17;37616:47;37680:131;37806:4;37680:131;:::i;:::-;37672:139;;37570:248;;;:::o;37824:419::-;37990:4;38028:2;38017:9;38013:18;38005:26;;38077:9;38071:4;38067:20;38063:1;38052:9;38048:17;38041:47;38105:131;38231:4;38105:131;:::i;:::-;38097:139;;37995:248;;;:::o;38249:419::-;38415:4;38453:2;38442:9;38438:18;38430:26;;38502:9;38496:4;38492:20;38488:1;38477:9;38473:17;38466:47;38530:131;38656:4;38530:131;:::i;:::-;38522:139;;38420:248;;;:::o;38674:357::-;38809:4;38847:2;38836:9;38832:18;38824:26;;38896:9;38890:4;38886:20;38882:1;38871:9;38867:17;38860:47;38924:100;39019:4;39010:6;38924:100;:::i;:::-;38916:108;;38814:217;;;;:::o;39037:222::-;39130:4;39168:2;39157:9;39153:18;39145:26;;39181:71;39249:1;39238:9;39234:17;39225:6;39181:71;:::i;:::-;39135:124;;;;:::o;39265:423::-;39406:4;39444:2;39433:9;39429:18;39421:26;;39457:71;39525:1;39514:9;39510:17;39501:6;39457:71;:::i;:::-;39575:9;39569:4;39565:20;39560:2;39549:9;39545:18;39538:48;39603:78;39676:4;39667:6;39603:78;:::i;:::-;39595:86;;39411:277;;;;;:::o;39694:843::-;39965:4;40003:3;39992:9;39988:19;39980:27;;40017:71;40085:1;40074:9;40070:17;40061:6;40017:71;:::i;:::-;40098:72;40166:2;40155:9;40151:18;40142:6;40098:72;:::i;:::-;40217:9;40211:4;40207:20;40202:2;40191:9;40187:18;40180:48;40245:88;40328:4;40319:6;40311;40245:88;:::i;:::-;40237:96;;40380:9;40374:4;40370:20;40365:2;40354:9;40350:18;40343:48;40408:122;40525:4;40516:6;40408:122;:::i;:::-;40400:130;;39970:567;;;;;;;;:::o;40543:553::-;40720:4;40758:3;40747:9;40743:19;40735:27;;40772:71;40840:1;40829:9;40825:17;40816:6;40772:71;:::i;:::-;40853:72;40921:2;40910:9;40906:18;40897:6;40853:72;:::i;:::-;40935;41003:2;40992:9;40988:18;40979:6;40935:72;:::i;:::-;41017;41085:2;41074:9;41070:18;41061:6;41017:72;:::i;:::-;40725:371;;;;;;;:::o;41102:524::-;41180:4;41186:6;41242:11;41229:25;41342:1;41336:4;41332:12;41321:8;41305:14;41301:29;41297:48;41277:18;41273:73;41263:2;;41360:1;41357;41350:12;41263:2;41395:18;41385:8;41381:33;41373:41;;41447:4;41434:18;41424:28;;41475:18;41467:6;41464:30;41461:2;;;41507:1;41504;41497:12;41461:2;41538;41532:4;41528:13;41520:21;;41595:4;41587:6;41583:17;41567:14;41563:38;41557:4;41553:49;41550:2;;;41615:1;41612;41605:12;41550:2;41193:433;;;;;;:::o;41632:129::-;41666:6;41693:20;;:::i;:::-;41683:30;;41722:33;41750:4;41742:6;41722:33;:::i;:::-;41673:88;;;:::o;41767:75::-;41800:6;41833:2;41827:9;41817:19;;41807:35;:::o;41848:307::-;41909:4;41999:18;41991:6;41988:30;41985:2;;;42021:18;;:::i;:::-;41985:2;42059:29;42081:6;42059:29;:::i;:::-;42051:37;;42143:4;42137;42133:15;42125:23;;41914:241;;;:::o;42161:308::-;42223:4;42313:18;42305:6;42302:30;42299:2;;;42335:18;;:::i;:::-;42299:2;42373:29;42395:6;42373:29;:::i;:::-;42365:37;;42457:4;42451;42447:15;42439:23;;42228:241;;;:::o;42475:98::-;42526:6;42560:5;42554:12;42544:22;;42533:40;;;:::o;42579:99::-;42631:6;42665:5;42659:12;42649:22;;42638:40;;;:::o;42684:168::-;42767:11;42801:6;42796:3;42789:19;42841:4;42836:3;42832:14;42817:29;;42779:73;;;;:::o;42858:147::-;42959:11;42996:3;42981:18;;42971:34;;;;:::o;43011:159::-;43085:11;43119:6;43114:3;43107:19;43159:4;43154:3;43150:14;43135:29;;43097:73;;;;:::o;43176:169::-;43260:11;43294:6;43289:3;43282:19;43334:4;43329:3;43325:14;43310:29;;43272:73;;;;:::o;43351:148::-;43453:11;43490:3;43475:18;;43465:34;;;;:::o;43505:514::-;43570:5;43577:6;43633:3;43620:17;43725:1;43719:4;43715:12;43704:8;43688:14;43684:29;43680:48;43660:18;43656:73;43646:2;;43743:1;43740;43733:12;43646:2;43789:8;43769:18;43765:33;43756:42;;43831:5;43818:19;43808:29;;43866:4;43859:5;43855:16;43846:25;;43894:18;43886:6;43883:30;43880:2;;;43926:1;43923;43916:12;43880:2;43988:4;43980:6;43976:17;43960:14;43956:38;43946:8;43942:53;43939:2;;;44008:1;44005;43998:12;43939:2;43584:435;;;;;;:::o;44025:122::-;44077:5;44102:39;44137:2;44132:3;44128:12;44123:3;44102:39;:::i;:::-;44093:48;;44083:64;;;;:::o;44153:305::-;44193:3;44212:20;44230:1;44212:20;:::i;:::-;44207:25;;44246:20;44264:1;44246:20;:::i;:::-;44241:25;;44400:1;44332:66;44328:74;44325:1;44322:81;44319:2;;;44406:18;;:::i;:::-;44319:2;44450:1;44447;44443:9;44436:16;;44197:261;;;;:::o;44464:237::-;44502:3;44521:18;44537:1;44521:18;:::i;:::-;44516:23;;44553:18;44569:1;44553:18;:::i;:::-;44548:23;;44643:1;44637:4;44633:12;44630:1;44627:19;44624:2;;;44649:18;;:::i;:::-;44624:2;44693:1;44690;44686:9;44679:16;;44506:195;;;;:::o;44707:191::-;44747:4;44767:20;44785:1;44767:20;:::i;:::-;44762:25;;44801:20;44819:1;44801:20;:::i;:::-;44796:25;;44840:1;44837;44834:8;44831:2;;;44845:18;;:::i;:::-;44831:2;44890:1;44887;44883:9;44875:17;;44752:146;;;;:::o;44904:96::-;44941:7;44970:24;44988:5;44970:24;:::i;:::-;44959:35;;44949:51;;;:::o;45006:90::-;45040:7;45083:5;45076:13;45069:21;45058:32;;45048:48;;;:::o;45102:149::-;45138:7;45178:66;45171:5;45167:78;45156:89;;45146:105;;;:::o;45257:126::-;45294:7;45334:42;45327:5;45323:54;45312:65;;45302:81;;;:::o;45389:77::-;45426:7;45455:5;45444:16;;45434:32;;;:::o;45472:86::-;45507:7;45547:4;45540:5;45536:16;45525:27;;45515:43;;;:::o;45564:154::-;45648:6;45643:3;45638;45625:30;45710:1;45701:6;45696:3;45692:16;45685:27;45615:103;;;:::o;45724:307::-;45792:1;45802:113;45816:6;45813:1;45810:13;45802:113;;;45901:1;45896:3;45892:11;45886:18;45882:1;45877:3;45873:11;45866:39;45838:2;45835:1;45831:10;45826:15;;45802:113;;;45933:6;45930:1;45927:13;45924:2;;;46013:1;46004:6;45999:3;45995:16;45988:27;45924:2;45773:258;;;;:::o;46037:320::-;46081:6;46118:1;46112:4;46108:12;46098:22;;46165:1;46159:4;46155:12;46186:18;46176:2;;46242:4;46234:6;46230:17;46220:27;;46176:2;46304;46296:6;46293:14;46273:18;46270:38;46267:2;;;46323:18;;:::i;:::-;46267:2;46088:269;;;;:::o;46363:281::-;46446:27;46468:4;46446:27;:::i;:::-;46438:6;46434:40;46576:6;46564:10;46561:22;46540:18;46528:10;46525:34;46522:62;46519:2;;;46587:18;;:::i;:::-;46519:2;46627:10;46623:2;46616:22;46406:238;;;:::o;46650:233::-;46689:3;46712:24;46730:5;46712:24;:::i;:::-;46703:33;;46758:66;46751:5;46748:77;46745:2;;;46828:18;;:::i;:::-;46745:2;46875:1;46868:5;46864:13;46857:20;;46693:190;;;:::o;46889:100::-;46928:7;46957:26;46977:5;46957:26;:::i;:::-;46946:37;;46936:53;;;:::o;46995:94::-;47034:7;47063:20;47077:5;47063:20;:::i;:::-;47052:31;;47042:47;;;:::o;47095:79::-;47134:7;47163:5;47152:16;;47142:32;;;:::o;47180:176::-;47212:1;47229:20;47247:1;47229:20;:::i;:::-;47224:25;;47263:20;47281:1;47263:20;:::i;:::-;47258:25;;47302:1;47292:2;;47307:18;;:::i;:::-;47292:2;47348:1;47345;47341:9;47336:14;;47214:142;;;;:::o;47362:180::-;47410:77;47407:1;47400:88;47507:4;47504:1;47497:15;47531:4;47528:1;47521:15;47548:180;47596:77;47593:1;47586:88;47693:4;47690:1;47683:15;47717:4;47714:1;47707:15;47734:180;47782:77;47779:1;47772:88;47879:4;47876:1;47869:15;47903:4;47900:1;47893:15;47920:180;47968:77;47965:1;47958:88;48065:4;48062:1;48055:15;48089:4;48086:1;48079:15;48106:102;48147:6;48198:2;48194:7;48189:2;48182:5;48178:14;48174:28;48164:38;;48154:54;;;:::o;48214:94::-;48247:8;48295:5;48291:2;48287:14;48266:35;;48256:52;;;:::o;48314:237::-;48454:34;48450:1;48442:6;48438:14;48431:58;48523:20;48518:2;48510:6;48506:15;48499:45;48420:131;:::o;48557:225::-;48697:34;48693:1;48685:6;48681:14;48674:58;48766:8;48761:2;48753:6;48749:15;48742:33;48663:119;:::o;48788:178::-;48928:30;48924:1;48916:6;48912:14;48905:54;48894:72;:::o;48972:223::-;49112:34;49108:1;49100:6;49096:14;49089:58;49181:6;49176:2;49168:6;49164:15;49157:31;49078:117;:::o;49201:175::-;49341:27;49337:1;49329:6;49325:14;49318:51;49307:69;:::o;49382:225::-;49522:34;49518:1;49510:6;49506:14;49499:58;49591:8;49586:2;49578:6;49574:15;49567:33;49488:119;:::o;49613:231::-;49753:34;49749:1;49741:6;49737:14;49730:58;49822:14;49817:2;49809:6;49805:15;49798:39;49719:125;:::o;49850:173::-;49990:25;49986:1;49978:6;49974:14;49967:49;49956:67;:::o;50029:243::-;50169:34;50165:1;50157:6;50153:14;50146:58;50238:26;50233:2;50225:6;50221:15;50214:51;50135:137;:::o;50278:229::-;50418:34;50414:1;50406:6;50402:14;50395:58;50487:12;50482:2;50474:6;50470:15;50463:37;50384:123;:::o;50513:182::-;50653:34;50649:1;50641:6;50637:14;50630:58;50619:76;:::o;50701:231::-;50841:34;50837:1;50829:6;50825:14;50818:58;50910:14;50905:2;50897:6;50893:15;50886:39;50807:125;:::o;50938:182::-;51078:34;51074:1;51066:6;51062:14;51055:58;51044:76;:::o;51126:228::-;51266:34;51262:1;51254:6;51250:14;51243:58;51335:11;51330:2;51322:6;51318:15;51311:36;51232:122;:::o;51360:168::-;51500:20;51496:1;51488:6;51484:14;51477:44;51466:62;:::o;51534:234::-;51674:34;51670:1;51662:6;51658:14;51651:58;51743:17;51738:2;51730:6;51726:15;51719:42;51640:128;:::o;51774:170::-;51914:22;51910:1;51902:6;51898:14;51891:46;51880:64;:::o;51950:220::-;52090:34;52086:1;52078:6;52074:14;52067:58;52159:3;52154:2;52146:6;52142:15;52135:28;52056:114;:::o;52176:182::-;52316:34;52312:1;52304:6;52300:14;52293:58;52282:76;:::o;52364:236::-;52504:34;52500:1;52492:6;52488:14;52481:58;52573:19;52568:2;52560:6;52556:15;52549:44;52470:130;:::o;52606:179::-;52746:31;52742:1;52734:6;52730:14;52723:55;52712:73;:::o;52791:172::-;52931:24;52927:1;52919:6;52915:14;52908:48;52897:66;:::o;52969:122::-;53042:24;53060:5;53042:24;:::i;:::-;53035:5;53032:35;53022:2;;53081:1;53078;53071:12;53022:2;53012:79;:::o;53097:116::-;53167:21;53182:5;53167:21;:::i;:::-;53160:5;53157:32;53147:2;;53203:1;53200;53193:12;53147:2;53137:76;:::o;53219:120::-;53291:23;53308:5;53291:23;:::i;:::-;53284:5;53281:34;53271:2;;53329:1;53326;53319:12;53271:2;53261:78;:::o;53345:122::-;53418:24;53436:5;53418:24;:::i;:::-;53411:5;53408:35;53398:2;;53457:1;53454;53447:12;53398:2;53388:79;:::o

Swarm Source

ipfs://5c4addbdc0bfe0cb30aba7754866f51c4ac88c1f08863dd9f1893188df854c57
Loading