ETH Price: $2,353.99 (+0.25%)

Token

YourSignOnChain (YSOC)
 

Overview

Max Total Supply

931 YSOC

Holders

913

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 YSOC
0x0634ADcA222E760a4B2B27Aa412229Ed5B6AC99C
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
YourSignOnChain

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-05
*/

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/lib/Constants.sol


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

// File: contracts/Base64.sol


pragma solidity ^0.8.2;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}

// File: contracts/Bytes.sol


/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <[email protected]>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */
pragma solidity ^0.8.2;


library BytesLib {
    
    function concat(
        bytes memory _preBytes,
        bytes memory _postBytes
    )
        internal
        pure
        returns (bytes memory)
    {
        bytes memory tempBytes;

        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
              add(add(end, iszero(add(length, mload(_preBytes)))), 31),
              not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }

}
// File: @openzeppelin/[email protected]/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/[email protected]/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

    /**
     * @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: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/[email protected]/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.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}.
     */
    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);
    }

    /**
     * @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);
        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 _owners[tokenId] != address(0);
    }

    /**
     * @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 = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `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) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @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()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/ordinalSignOnChain.sol


pragma solidity ^0.8.2;







contract YourSignOnChain is ERC721, ERC721Enumerable, Ownable, DefaultOperatorFilterer {
    
    /* Members */
    using Strings   for uint256;
    using BytesLib  for bytes;
    
    struct Particle { uint x; uint y; uint r; }
    struct Owner    { address _address; uint _tokenId; uint _paletteIndex;}

    mapping(uint => Owner)  _owners;

    uint        private _signPrice      = .0285 ether;
    uint        private _saleIsOpen     = 1;
    uint        private _counter        = 0;
    uint        private _maxSupply        = 10000;
    uint[27]    private _consumed       = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

    address public constant OG_SIGN_ON_CHAIN = 0xB605D7F21078e8f79F78EC36099fA556bA9F09BA;
    /* Members */

    /* Constructors */
    constructor() ERC721("YourSignOnChain", "YSOC") {}
    /* Constructors */
    
    /* Private methods */
    function getIterations(bytes memory _data) private pure returns (uint) {
        
        uint[9] memory _iterations = [uint(35),uint(40),uint(45),uint(50),uint(55),uint(60),uint(65),uint(70),uint(75)];

        uint _its = _iterations[((uint(uint8(_data[0])) + uint(uint8(_data[_data.length-1]))) / 2) % _iterations.length];
        
        return _its;
        
    }
    
    function getPalette(uint _pIdx) public pure returns (string[8] memory) {
        string[8][27] memory _palette        = [
    		["Pantone's Glowing Gone*",         "#FFFFFF","#000000","#0f28f0","#dc609f","#fefe55","#841bf0","#841bf0"],
    		["Autumn",          				"#f5efdd","#411d13","#753422","#B05B3B","#D79771","#d6c28c","#d6ad9b"],
            ["Winter",          				"#ffffff","#08022a","#0F044C","#141E61","#787A91","#bfd4ee","#dadada"],
            ["Summer",          				"#edf3ff","#214e4b","#236e96","#15b2d3","#ffd700","#f3872f","#ff598f"],
            ["Spring",          				"#f6fff4","#14403b","#134a1b","#96bb7c","#bcef96","#eece4d","#d58be5"],
            ["Happy",           				"#fff5fc","#2e2269","#845EC2","#ec873a","#ebe300","#FF5E78","#32b9ff"],
            ["CyberPunk v1",   	 				"#270446","#a26df9","#0e2ea8","#e716dd","#f9143a","#0cffe1","#f7ff13"],
            ["Neon",            				"#000000","#c8ff07","#b31fc6","#f21170","#04daf6","#ff5200","#fcff00"],
            ["Blossom",        					"#fff6fc","#736a64","#f1d1d6","#ffabe1","#a685e2","#6155a6","#40274f"],
            ["Oriental",        				"#f5efdd","#000000","#9f0c28","#1A90D9","#f0a612","#f08808","#F23E16"],
            ["ViceCity",        				"#1c1241","#ffffff","#ecc720","#74aae8","#8f6cbf","#c05b85","#ca1481"],
            ["Volcano",         				"#f9f7ef","#000000","#38001C","#b92200","#f57e00","#fac30c","#86806b"],
            ["God of War",      				"#f9f7ef","#730215","#443737","#400909","#FF0000","#000000","#960c33"],
            ["Rainbow",         				"#FFFFFF","#8d5a00","#970ff2","#0597f2","#49d907","#f2e404","#c60835"],
            ["Halloween",       				"#f9f7ef","#000000","#000000","#150050","#3F0071","#610094","#ef8c29"],
            ["Red",             				"#FFFFFF","#C50000","#C50000","#D43434","#E26767","#F19B9B","#FFCECE"],
            ["Pink",            				"#f8f0fd","#b300b0","#EB00E7","#ED30E5","#EF60E3","#F08FE1","#F2BFDF"],
            ["Pantone's Glowing Purple*", 		"#FFFFFF","#5912a3","#5912a3","#831bf1","#8b47d0","#af7fe1","#cba3f3"],
            ["Pantone's Glowing Blue*",   		"#FFFFFF","#091998","#0a1ba7","#0e28f0","#0D0D98","#120DC3","#180DED"],
            ["SkyBlue",        				 	"#FFFFFF","#188BFF","#188BFF","#4AA2FF","#7CBAFF","#AED1FF","#abb9d2"],
            ["Turquise",        				"#FFFFFF","#0CC69E","#0CC69E","#37CFAF","#61D8C1","#8CE0D2","#B6E9E3"],
            ["Green",           				"#FFFFFF","#0A7105","#0A7105","#2C952B","#4EB852","#6FDC78","#91FF9E"],
            ["Grass Green",     				"#FFFFFF","#658505","#A1D408","#B0DC37","#BFE367","#CDEB96","#DCF2C5"],
            ["Pantone's Glowing Yellow*", 		"#000000","#fff000","#fff000","#fefe55","#FFF56F","#FFF9A7","#fffcce"],
            ["Orange",          				"#FFFFFF","#a14600","#cb5800","#FF6F00","#F87F21","#F18E42","#EA9E63"],
            ["Black",           				"#ffffff","#000000","#000000","#282828","#505050","#777777","#9F9F9F"],
            ["Rome Purple",     				"#FFFFFF","#483659","#603d7c","#644b7c","#644b7c","#80609f","#ac7ad3"] 
        ];
        
        return _palette[_pIdx];
    }

    function getPaletteIndex(uint _tokenId) private view returns (uint) {
        
        uint _r = uint(keccak256(abi.encodePacked(_tokenId))) % 27;
        
        uint _s = _r;
        
        uint[27] memory __consumed  = _consumed;
        uint[27] memory _limits     = [uint(80),uint(400),uint(410),uint(290),uint(300),uint(320),uint(80),uint(320),uint(200),uint(380),uint(220),uint(140),uint(180),uint(440),uint(520),uint(760),uint(650),uint(80),uint(80),uint(660),uint(600),uint(650),uint(550),uint(80),uint(650),uint(810),uint(150)];

        while (__consumed[_r] + 1 > _limits[_r])
        {
            _r++;
            
            if (_r >= 27)
            {
                _r = 0;
            }
            
            if (_r == _s)
            {
                revert("Can not produce random from palette id!");
            }
        }
        
        return _r;

    }

    function sqrt(uint x) private pure returns (uint y) {
        
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) 
        {
            y = z;
            z = (x / z + z) / 2;
        }
        
    }

    function distance(uint x1, uint y1, uint x2, uint y2) private pure returns (uint) {
        
        uint x = x1 > x2 ? x1 - x2 : x2 - x1;
        uint y = y1 > y2 ? y1 - y2 : y2 - y1;
        return sqrt(x * x + y * y);
        
    }
    
    function betweenUInt(uint _v, uint _min, uint _max) private pure returns (uint) {
        
        return (_v < _min) ? _min : (_v > _max ? _max : _v);
        
    }
    
    function inRect(uint _v, uint _r) private pure returns (uint) {
        
        return _r > _v ? _r : (_v + _r > 500 ? 500 - _r : _v);
        
    }

    function intersect(Particle[] memory _particles, Particle memory _p, uint _its) private pure returns (bool) {
        
        if (_particles.length == 0)
        {
            return false;
        }
        
        for (uint _index = 0; _index < _its; _index++)
        {
            if (distance(_p.x, _p.y, _particles[_index].x, _particles[_index].y) < _p.r + _particles[_index].r)
            {
                return true;
            }
        }
        
        return false;
    }
    
    function createParticles(bytes memory _data, uint _its) private pure returns (Particle[] memory) {
        
        uint[42] memory _radius = [uint(2),uint(3),uint(4),uint(5),uint(5),uint(5),uint(5),uint(5),uint(6),uint(6),uint(6),uint(6),uint(6),uint(7),uint(7),uint(7),uint(7),uint(7),uint(8),uint(8),uint(8),uint(8),uint(8),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(12),uint(14),uint(14),uint(14),uint(15),uint(16),uint(18),uint(19),uint(22),uint(32)];
        uint _di = 0;
        uint _r;
        uint _x;
        uint _y;
        uint _t; 
        
        Particle memory _p;

        Particle[] memory _particles = new Particle[](_its);

        for (uint _i = 0; _i < _its; _i++)
        {
            _t = 0;
                  
            do
            {
                _x = uint(uint8(_data[_di % _data.length]));
                
                _r = _radius[_x % 42];
                
                _y = uint(uint8(_data[(_di+1) % _data.length]));

                _p = Particle(inRect((_x * (_i+1)) % 500, _r), inRect((_y * (_i+1)) % 500, _r), _r);
                
                _di += 2;
                
                _t++;
                
                if (_t > 20)
                {
                    break;
                }
            
            } while (intersect(_particles, _p, _its));
            
            _particles[_i] = _p;
        }

        return _particles;
    }
    
    function drawLines(Particle[] memory _p, string memory _c, uint _a, uint _its, bytes memory _l, uint _e, string[4] memory _o) private pure returns (bytes memory, uint) {
        
        uint _d;

        for (uint _b = 0; _b < _its; _b++)
        {
            if (_a != _b)
            {
                _d = distance(_p[_a].x, _p[_a].y, _p[_b].x, _p[_b].y);
                if (_d > 0 && _d < 71)
                {
                    _e++;
                    _l = _l.concat(
                        abi.encodePacked(
                            '<line x1="',_p[_a].x.toString(),'" y1="',_p[_a].y.toString(),'" x2="',_p[_b].x.toString(),'" y2="',_p[_b].y.toString(),'" stroke="', _c, '" stroke-opacity="',_o[_d % _o.length],'"/>'
                        )
                    );
                    
                }
            }
        }
        
        return (_l, _e);
    }
    
    function draw(string[8] memory _palette, Particle[] memory _p, uint _its) private pure returns (bytes memory _r, uint _e){
 
        bytes memory _n;
        bytes memory _l;
        
        string[4] memory _o  = ["0.09","0.11","0.18","0.30"];
        string[4] memory _d  = ["0.5","0.9","1","1.2"];

        _e = 0;
        
        for (uint _a = 0; _a < _its; _a++)
        {
            _n = _n.concat(
                abi.encodePacked(
                    '<circle cx="',_p[_a].x.toString(),'" cy="',_p[_a].y.toString(),'" r="',_p[_a].r.toString(),'" fill="', _palette[(_a % 5)+3], '" opacity="0"><animate attributeName="opacity" dur="0.8s" keyTimes="0;0.25;0.5;0.75;1" values="0;0.25;0.5;0.75;1" repeatCount="1" begin="',_d[_a % 4],'s" fill="freeze"/></circle>'
                )
            );
            
            (_l, _e) = drawLines(_p, _palette[2], _a, _its, _l, _e, _o);
        }
        
        _r = _r.concat(abi.encodePacked('<svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><path d="M 0 0 H 500 V 500 H 0 V 0" fill="', _palette[1], '"/><g opacity="0"><animate attributeName="opacity" dur="0.8s" keyTimes="0;0.25;0.5;0.75;1" values="0;0.25;0.5;0.75;1" repeatCount="1" begin="2s" fill="freeze"/>'));
        _r = _r.concat(_l);
        _r = _r.concat(abi.encodePacked("</g>"));
        _r = _r.concat(_n);
        _r = _r.concat(abi.encodePacked('</svg>'));
    }

    function plot(address _address, uint _tokenId, uint _pIdx) private pure returns (bytes memory)  {
        
        bytes memory _data = abi.encodePacked(keccak256(abi.encodePacked(_tokenId))).concat(abi.encodePacked(_address));
        
        string[8] memory _palette = getPalette(_pIdx);

        uint _its = getIterations(_data);

        (bytes memory _s, uint _e) = draw(_palette, createParticles(_data, _its), _its);

        return abi.encodePacked(
            '", "attributes": [{"trait_type": "Name","value": "', _palette[0],
            '"},{"trait_type": "Complexity","value": "', (_its * _e).toString(),
            '"},{"trait_type": "NodeCount","value": "', _its.toString(),
            '"},{"trait_type": "EdgeCount","value": "', _e.toString(),
            '"}],"image": "data:image/svg+xml;base64,', Base64.encode(_s)
        );

    }
    /* Private methods */

    /* Public methods */
    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        
        Owner memory _owner = _owners[tokenId];
        
        require(_owner._address != address(0x0), "Invalid token id!");

        return string(
            abi.encodePacked(
                'data:application/json;base64,', 
                Base64.encode(
                    abi.encodePacked(
                        '{"name": "Your Sign OnChain #',
                        tokenId.toString(),
                        string(plot(_owner._address, tokenId, _owner._paletteIndex)),
                        '"}'
                    )
                )
            )
        );
        
    }

    function claim(uint256 numberOfTokens) public {
        require(IERC721Enumerable(OG_SIGN_ON_CHAIN).balanceOf(msg.sender) >= 1, "OG token count should be greater than 0");

        require(tx.origin == msg.sender, "Bots are not allowed!");

        require(this.balanceOf(msg.sender) + numberOfTokens <= IERC721Enumerable(OG_SIGN_ON_CHAIN).balanceOf(msg.sender), "OG token collectors can claim 1 token per OG collection NFT");

        require(numberOfTokens > 0, "You can't claim 0");

        require(_saleIsOpen == 1, "Sales not open at the moment!");
        
        require(numberOfTokens > 0 && numberOfTokens <= 10, "Too many sign minting request!");

        uint __counter = _counter;
        
        require(__counter + 1 < _maxSupply, "Too many sign minting request!");

        uint _pIdx;

        for (uint _index = 0; _index < numberOfTokens; _index++)
        {
            _pIdx = getPaletteIndex(_counter + 1);
            
            _safeMint(msg.sender, _counter + 1);
            
            _counter++;
            
            __counter = _counter;
            
            _consumed[_pIdx]++;
            
            _owners[_counter] = Owner(msg.sender, __counter, _pIdx);
        }
    }
    
    function freeMint() public {
        require(tx.origin == msg.sender, "Bots are not allowed!");

        require(_saleIsOpen == 1, "Sales not open at the moment!");
        
        uint __counter = _counter;
        
        require(__counter + 1 < _maxSupply, "Too many sign minting request!");

        require(this.balanceOf(msg.sender) + 1 <= 1, "Per wallet limit reached! Per wallet limit is 1 tokens.");

        uint _pIdx;

        _pIdx = getPaletteIndex(_counter + 1);
        
        _safeMint(msg.sender, _counter + 1);
        
        _counter++;
        
        __counter = _counter;
        
        _consumed[_pIdx]++;
        
        _owners[_counter] = Owner(msg.sender, __counter, _pIdx);
    }

    function buy(uint numberOfTokens) public payable {
        require(tx.origin == msg.sender, "Bots are not allowed!");

        require(_saleIsOpen == 1, "Sales not open at the moment!");
        
        require(_signPrice > 0, "No sign price set at the moment!");
        
        require(numberOfTokens > 0 && numberOfTokens <= 10, "Too many sign minting request!");
        
        uint __counter = _counter;
        
        require(__counter + numberOfTokens < _maxSupply, "Too many sign minting request!");

        require(_signPrice * numberOfTokens <= msg.value, "Insufficient funds!");

        uint _pIdx;

        for (uint _index = 0; _index < numberOfTokens; _index++)
        {
            _pIdx = getPaletteIndex(_counter + 1);
            
            _safeMint(msg.sender, _counter + 1);
            
            _counter++;
            
            __counter = _counter;
            
            _consumed[_pIdx]++;
            
            _owners[_counter] = Owner(msg.sender, __counter, _pIdx);
        }

    }

    function ownerMint() public onlyOwner {
        for (uint _index = 10001; _index <= 10101; _index++)
        {
            uint _pIdx = getPaletteIndex(_index);
        
            _safeMint(owner(), _index);

            _owners[_index] = Owner(owner(), _index, _pIdx);
        }
    }
    
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(ERC721, IERC721)
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
 
    function isClaimed(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OG_SIGN_ON_CHAIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pIdx","type":"uint256"}],"name":"getPalette","outputs":[{"internalType":"string[8]","name":"","type":"string[8]"}],"stateMutability":"pure","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":"uint256","name":"tokenId","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6665409958194000600c556001600d556000600e819055612710600f556103e0604052608081815260a082905260c082905260e08290526101008290526101208290526101408290526101608290526101808290526101a08290526101c08290526101e08290526102008290526102208290526102408290526102608290526102808290526102a08290526102c08290526102e08290526103008290526103208290526103408290526103608290526103808290526103a08290526103c091909152620000d190601090601b6200031c565b50348015620000df57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600f81526020016e2cb7bab929b4b3b727b721b430b4b760891b8152506040518060400160405280600481526020016359534f4360e01b81525081600090816200014d919062000420565b5060016200015c828262000420565b5050506200017962000173620002c660201b60201c565b620002ca565b6daaeb6d7670e522a718067333cd4e3b15620002be5780156200020c57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001ed57600080fd5b505af115801562000202573d6000803e3d6000fd5b50505050620002be565b6001600160a01b038216156200025d5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620001d2565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620002a457600080fd5b505af1158015620002b9573d6000803e3d6000fd5b505050505b5050620004ec565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82601b810192821562000352579160200282015b8281111562000352578251829060ff1690559160200191906001019062000330565b506200036092915062000364565b5090565b5b8082111562000360576000815560010162000365565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003a657607f821691505b602082108103620003c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041b57600081815260208120601f850160051c81016020861015620003f65750805b601f850160051c820191505b81811015620004175782815560010162000402565b5050505b505050565b81516001600160401b038111156200043c576200043c6200037b565b62000454816200044d845462000391565b84620003cd565b602080601f8311600181146200048c5760008415620004735750858301515b600019600386901b1c1916600185901b17855562000417565b600085815260208120601f198616915b82811015620004bd578886015182559484019460019091019084016200049c565b5085821015620004dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615e0b80620004fc6000396000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd146104ca578063d96a094a146104ea578063e985e9c5146104fd578063f2fde38b1461054657600080fd5b8063a22cb46514610475578063b12dc99114610495578063b88d4fde146104aa57600080fd5b806376b71ef2116100c657806376b71ef2146103fa5780638da5cb5b1461042257806395d89b41146104405780639e34070f1461045557600080fd5b80636352211e146103a557806370a08231146103c5578063715018a6146103e557600080fd5b8063379607f51161015957806342842e0e1161013357806342842e0e146103235780634f6ccce714610343578063505e570a146103635780635b70ea9f1461039057600080fd5b8063379607f5146102cc5780633ccfd60b146102ec57806341f434341461030157600080fd5b8063095ea7b311610195578063095ea7b31461024b57806318160ddd1461026d57806323b872dd1461028c5780632f745c59146102ac57600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461512f565b610566565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b50610206610577565b6040516101e8919061519c565b34801561021f57600080fd5b5061023361022e3660046151af565b610609565b6040516001600160a01b0390911681526020016101e8565b34801561025757600080fd5b5061026b6102663660046151e4565b6106a3565b005b34801561027957600080fd5b506008545b6040519081526020016101e8565b34801561029857600080fd5b5061026b6102a736600461520e565b6107b8565b3480156102b857600080fd5b5061027e6102c73660046151e4565b6107e3565b3480156102d857600080fd5b5061026b6102e73660046151af565b610879565b3480156102f857600080fd5b5061026b610c65565b34801561030d57600080fd5b506102336daaeb6d7670e522a718067333cd4e81565b34801561032f57600080fd5b5061026b61033e36600461520e565b610cc2565b34801561034f57600080fd5b5061027e61035e3660046151af565b610ce7565b34801561036f57600080fd5b5061038361037e3660046151af565b610d7a565b6040516101e8919061524a565b34801561039c57600080fd5b5061026b612db9565b3480156103b157600080fd5b506102336103c03660046151af565b612fcb565b3480156103d157600080fd5b5061027e6103e0366004615298565b613042565b3480156103f157600080fd5b5061026b6130c9565b34801561040657600080fd5b5061023373b605d7f21078e8f79f78ec36099fa556ba9f09ba81565b34801561042e57600080fd5b50600a546001600160a01b0316610233565b34801561044c57600080fd5b506102066130ff565b34801561046157600080fd5b506101dc6104703660046151af565b61310e565b34801561048157600080fd5b5061026b6104903660046152c1565b61312d565b3480156104a157600080fd5b5061026b6131f1565b3480156104b657600080fd5b5061026b6104c536600461530e565b6132d3565b3480156104d657600080fd5b506102066104e53660046151af565b613300565b61026b6104f83660046151af565b6133ef565b34801561050957600080fd5b506101dc6105183660046153ea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561055257600080fd5b5061026b610561366004615298565b61360b565b6000610571826136a3565b92915050565b6060600080546105869061541d565b80601f01602080910402602001604051908101604052809291908181526020018280546105b29061541d565b80156105ff5780601f106105d4576101008083540402835291602001916105ff565b820191906000526020600020905b8154815290600101906020018083116105e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ae82612fcb565b9050806001600160a01b0316836001600160a01b03160361071b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161067e565b336001600160a01b038216148061073757506107378133610518565b6107a95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161067e565b6107b383836136c8565b505050565b826001600160a01b03811633146107d2576107d233613736565b6107dd8484846137ef565b50505050565b60006107ee83613042565b82106108505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161067e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516370a0823160e01b815233600482015260019073b605d7f21078e8f79f78ec36099fa556ba9f09ba906370a0823190602401602060405180830381865afa1580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190615451565b101561094d5760405162461bcd60e51b815260206004820152602760248201527f4f4720746f6b656e20636f756e742073686f756c6420626520677265617465726044820152660207468616e20360cc1b606482015260840161067e565b32331461096c5760405162461bcd60e51b815260040161067e9061546a565b6040516370a0823160e01b815233600482015273b605d7f21078e8f79f78ec36099fa556ba9f09ba906370a0823190602401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190615451565b6040516370a0823160e01b8152336004820152829030906370a0823190602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190615451565b610a4a91906154af565b1115610abe5760405162461bcd60e51b815260206004820152603b60248201527f4f4720746f6b656e20636f6c6c6563746f72732063616e20636c61696d20312060448201527f746f6b656e20706572204f4720636f6c6c656374696f6e204e46540000000000606482015260840161067e565b60008111610b025760405162461bcd60e51b81526020600482015260116024820152700596f752063616e277420636c61696d203607c1b604482015260640161067e565b600d54600114610b245760405162461bcd60e51b815260040161067e906154c2565b600081118015610b355750600a8111155b610b515760405162461bcd60e51b815260040161067e906154f9565b600e54600f54610b628260016154af565b10610b7f5760405162461bcd60e51b815260040161067e906154f9565b6000805b838110156107dd57610ba2600e546001610b9d91906154af565b613820565b9150610bbc33600e546001610bb791906154af565b613a37565b600e8054906000610bcc83615530565b9190505550600e549250601082601b8110610be957610be9615549565b018054906000610bf883615530565b9091555050604080516060810182523381526020808201868152828401868152600e546000908152600b90935293909120915182546001600160a01b0319166001600160a01b03909116178255516001820155905160029091015580610c5d81615530565b915050610b83565b600a546001600160a01b03163314610c8f5760405162461bcd60e51b815260040161067e9061555f565b6040514790339082156108fc029083906000818181858888f19350505050158015610cbe573d6000803e3d6000fd5b5050565b826001600160a01b0381163314610cdc57610cdc33613736565b6107dd848484613a51565b6000610cf260085490565b8210610d555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161067e565b60088281548110610d6857610d68615549565b90600052602060002001549050919050565b610d826150f1565b60006040518061036001604052806040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720476f6e652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233066323866360cc1b81525081526020016040518060400160405280600781526020016611b2319b181cb360c91b8152508152602001604051806040016040528060078152602001662366656665353560c81b8152508152602001604051806040016040528060078152602001660233834316266360cc1b8152508152602001604051806040016040528060078152602001660233834316266360cc1b81525081525081526020016040518061010001604052806040518060400160405280600681526020016520baba3ab6b760d11b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001662334313164313360c81b815250815260200160405180604001604052806007815260200166119b9a999a191960c91b81525081526020016040518060400160405280600781526020016611a1181aa119a160c91b8152508152602001604051806040016040528060078152602001662344373937373160c81b8152508152602001604051806040016040528060078152602001662364366332386360c81b81525081526020016040518060400160405280600781526020016611b21b30b21cb160c91b8152508152508152602001604051806101000160405280604051806040016040528060068152602001652bb4b73a32b960d11b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001662330383032326160c81b8152508152602001604051806040016040528060078152602001662330463034344360c81b8152508152602001604051806040016040528060078152602001662331343145363160c81b8152508152602001604051806040016040528060078152602001662337383741393160c81b8152508152602001604051806040016040528060078152602001662362666434656560c81b8152508152602001604051806040016040528060078152602001662364616461646160c81b81525081525081526020016040518061010001604052806040518060400160405280600681526020016529bab6b6b2b960d11b81525081526020016040518060400160405280600781526020016611b2b23319b33360c91b8152508152602001604051806040016040528060078152602001661199189a329a3160c91b8152508152602001604051806040016040528060078152602001661199199b329c9b60c91b8152508152602001604051806040016040528060078152602001662331356232643360c81b8152508152602001604051806040016040528060078152602001660236666643730360cc1b81525081526020016040518060400160405280600781526020016611b3199c1b993360c91b81525081526020016040518060400160405280600781526020016611b3331a9c9c3360c91b815250815250815260200160405180610100016040528060405180604001604052806006815260200165537072696e6760d01b81525081526020016040518060400160405280600781526020016608d98d9999998d60ca1b81525081526020016040518060400160405280600781526020016611989a1a1819b160c91b8152508152602001604051806040016040528060078152602001661198999a3098b160c91b8152508152602001604051806040016040528060078152602001662339366262376360c81b81525081526020016040518060400160405280600781526020016611b131b2b31c9b60c91b81525081526020016040518060400160405280600781526020016608d95958d94d1960ca1b8152508152602001604051806040016040528060078152602001662364353862653560c81b815250815250815260200160405180610100016040528060405180604001604052806005815260200164486170707960d81b8152508152602001604051806040016040528060078152602001662366666635666360c81b8152508152602001604051806040016040528060078152602001662332653232363960c81b815250815260200160405180604001604052806007815260200166119c1a1aa2a19960c91b8152508152602001604051806040016040528060078152602001662365633837336160c81b8152508152602001604051806040016040528060078152602001660236562653330360cc1b8152508152602001604051806040016040528060078152602001660468c8c6a8a6e760cb1b815250815260200160405180604001604052806007815260200166119999311cb33360c91b81525081525081526020016040518061010001604052806040518060400160405280600c81526020016b437962657250756e6b20763160a01b81525081526020016040518060400160405280600781526020016611991b981a1a1b60c91b8152508152602001604051806040016040528060078152602001662361323664663960c81b81525081526020016040518060400160405280600781526020016604660ca64cac2760cb1b81525081526020016040518060400160405280600781526020016608d94dcc4d991960ca1b8152508152602001604051806040016040528060078152602001662366393134336160c81b8152508152602001604051806040016040528060078152602001662330636666653160c81b8152508152602001604051806040016040528060078152602001662366376666313360c81b8152508152508152602001604051806101000160405280604051806040016040528060048152602001632732b7b760e11b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662363386666303760c81b81525081526020016040518060400160405280600781526020016611b11998b3319b60c91b8152508152602001604051806040016040528060078152602001660236632313137360cc1b81525081526020016040518060400160405280600781526020016611981a3230b31b60c91b8152508152602001604051806040016040528060078152602001660236666353230360cc1b8152508152602001604051806040016040528060078152602001660236663666630360cc1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166426c6f73736f6d60c81b8152508152602001604051806040016040528060078152602001662366666636666360c81b81525081526020016040518060400160405280600781526020016608cdcccd984d8d60ca1b81525081526020016040518060400160405280600781526020016611b318b218b21b60c91b8152508152602001604051806040016040528060078152602001662366666162653160c81b81525081526020016040518060400160405280600781526020016611b09b1c1ab29960c91b815250815260200160405180604001604052806007815260200166119b189a9ab09b60c91b815250815260200160405180604001604052806007815260200166119a18191b9a3360c91b81525081525081526020016040518061010001604052806040518060400160405280600881526020016713dc9a595b9d185b60c21b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b81525081526020016040518060400160405280600781526020016604672cc60c664760cb1b8152508152602001604051806040016040528060078152602001662331413930443960c81b81525081526020016040518060400160405280600781526020016611b318309b189960c91b815250815260200160405180604001604052806007815260200166046cc60707060760cb1b81525081526020016040518060400160405280600781526020016611a31919a2989b60c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167566963654369747960c01b8152508152602001604051806040016040528060078152602001662331633132343160c81b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001660236563633732360cc1b8152508152602001604051806040016040528060078152602001660466e68c2c2ca760cb1b815250815260200160405180604001604052806007815260200166119c331b31b13360c91b8152508152602001604051806040016040528060078152602001662363303562383560c81b8152508152602001604051806040016040528060078152602001662363613134383160c81b815250815250815260200160405180610100016040528060405180604001604052806007815260200166566f6c63616e6f60c81b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662333383030314360c81b8152508152602001604051806040016040528060078152602001660236239323230360cc1b8152508152602001604051806040016040528060078152602001660236635376530360cc1b8152508152602001604051806040016040528060078152602001662366616333306360c81b815250815260200160405180604001604052806007815260200166119c1b1c181b3160c91b81525081525081526020016040518061010001604052806040518060400160405280600a81526020016923b7b21037b3102bb0b960b11b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001662337333032313560c81b8152508152602001604051806040016040528060078152602001662334343337333760c81b8152508152602001604051806040016040528060078152602001662334303039303960c81b8152508152602001604051806040016040528060078152602001660234646303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662339363063333360c81b8152508152508152602001604051806101000160405280604051806040016040528060078152602001665261696e626f7760c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233864356130360cc1b815250815260200160405180604001604052806007815260200166119c9b9833331960c91b81525081526020016040518060400160405280600781526020016611981a9c9bb31960c91b8152508152602001604051806040016040528060078152602001662334396439303760c81b81525081526020016040518060400160405280600781526020016608d98c994d0c0d60ca1b8152508152602001604051806040016040528060078152602001662363363038333560c81b8152508152508152602001604051806101000160405280604051806040016040528060098152602001682430b63637bbb2b2b760b91b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233135303035360cc1b8152508152602001604051806040016040528060078152602001662333463030373160c81b81525081526020016040518060400160405280600781526020016608cd8c4c0c0e4d60ca1b8152508152602001604051806040016040528060078152602001662365663863323960c81b81525081525081526020016040518061010001604052806040518060400160405280600381526020016214995960ea1b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660234335303030360cc1b8152508152602001604051806040016040528060078152602001660234335303030360cc1b81525081526020016040518060400160405280600781526020016608d10d0ccd0ccd60ca1b8152508152602001604051806040016040528060078152602001662345323637363760c81b81525081526020016040518060400160405280600781526020016611a3189ca11ca160c91b8152508152602001604051806040016040528060078152602001662346464345434560c81b81525081525081526020016040518061010001604052806040518060400160405280600481526020016350696e6b60e01b81525081526020016040518060400160405280600781526020016608d98e198c199960ca1b8152508152602001604051806040016040528060078152602001660236233303062360cc1b8152508152602001604051806040016040528060078152602001662345423030453760c81b8152508152602001604051806040016040528060078152602001662345443330453560c81b8152508152602001604051806040016040528060078152602001662345463630453360c81b8152508152602001604051806040016040528060078152602001662346303846453160c81b81525081526020016040518060400160405280600781526020016611a3192123222360c91b81525081525081526020016040518061010001604052806040518060400160405280601981526020017f50616e746f6e65277320476c6f77696e6720507572706c652a0000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662338333162663160c81b8152508152602001604051806040016040528060078152602001660233862343764360cc1b8152508152602001604051806040016040528060078152602001662361663766653160c81b8152508152602001604051806040016040528060078152602001662363626133663360c81b81525081525081526020016040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720426c75652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660466072627272760cb1b8152508152602001604051806040016040528060078152602001662330613162613760c81b8152508152602001604051806040016040528060078152602001660233065323866360cc1b8152508152602001604051806040016040528060078152602001660466088608872760cb1b8152508152602001604051806040016040528060078152602001662331323044433360c81b81525081526020016040518060400160405280600781526020016608cc4e0c11115160ca1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166536b79426c756560c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b815250815260200160405180604001604052806007815260200166119a20a099232360c91b815250815260200160405180604001604052806007815260200166119ba1a120a32360c91b81525081526020016040518060400160405280600781526020016611a0a2a218a32360c91b81525081526020016040518060400160405280600781526020016611b0b1311cb21960c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167547572717569736560c01b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330434336394560c81b8152508152602001604051806040016040528060078152602001662330434336394560c81b81525081526020016040518060400160405280600781526020016611999ba1a320a360c91b8152508152602001604051806040016040528060078152602001662336314438433160c81b815250815260200160405180604001604052806007815260200166119c21a298221960c91b8152508152602001604051806040016040528060078152602001662342364539453360c81b81525081525081526020016040518061010001604052806040518060400160405280600581526020016423b932b2b760d91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001661199219c9a992160c91b815250815260200160405180604001604052806007815260200166119a22a11c1a9960c91b8152508152602001604051806040016040528060078152602001660466c8c88866e760cb1b8152508152602001604051806040016040528060078152602001662339314646394560c81b81525081525081526020016040518061010001604052806040518060400160405280600b81526020016a23b930b9b99023b932b2b760a91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b815250815260200160405180604090810181526007808352662336353835303560c81b60208085019190915292845281518083018352818152660468262886860760cb1b818501528484015281518083018352818152662342304443333760c81b818501528483015281518083018352818152662342464533363760c81b81850152606080860191909152825180840184528281526611a1a222a11c9b60c91b8186015260808087019190915283518085018552838152662344434632433560c81b8187015260a0968701529587528251610140808201855260196101008084019182527f50616e746f6e65277320476c6f77696e672059656c6c6f772a000000000000006101208086019190915291845286518088018852868152660233030303030360cc1b818a01819052858a019190915287518089018952878152660236666663030360cc1b818b01819052868a01919091528851808a018a52888152808b01919091528587015287518089018952878152662366656665353560c81b818b0152858c0152875180890189528781526611a323231a9b2360c91b818b0152858b015287518089018952878152662346464639413760c81b818b015260c0808701919091528851808a018a52888152662366666663636560c81b818c015260e0808801919091528d8b019690965288518086018a526006818501908152654f72616e676560d01b8287015281528951808b018b528981526611a3232323232360c91b818d01819052828d01919091528a51808c018c528a8152660236131343630360cc1b818e0152828c01528a51808c018c528a8152660236362353830360cc1b818e0152828a01528a51808c018c528a8152660234646364630360cc1b818e0152828f01528a51808c018c528a8152662346383746323160c81b818e0152828e01528a51808c018c528a81526611a3189c229a1960c91b818e0152828401528a51808c018c528a8152662345413945363360c81b818e0152828901528e8b019190915289518087018b52600581860190815264426c61636b60d81b8288015281528a51808c018c528a81526611b3333333333360c91b818e0152818d01528a51808c018c528a8152808d01859052818c01528a51808c018c528a8152808d0194909452808901939093528951808b018b52898152660466470647064760cb1b818d0152838e01528951808b018b52898152660233530353035360cc1b818d0152838d01528951808b018b52898152662337373737373760c81b818d0152838301528951808b018b5289815266119ca31ca31ca360c91b818d0152838801528d88019290925288519485018952600b9285019283526a526f6d6520507572706c6560a81b9385019390935290835286518088018852868152808901919091528288015285518087018752858152662334383336353960c81b818901528287015285518087018752858152662336303364376360c81b818901529382019390935284518086018652848152662336343462376360c81b818801819052828a01919091528551808701875285815280880191909152968101969096528351808501855283815266119c181b181cb360c91b81870152918601919091528251808401909352908252662361633761643360c81b928201929092529082015291015290508083601b8110612dad57612dad615549565b60200201519392505050565b323314612dd85760405162461bcd60e51b815260040161067e9061546a565b600d54600114612dfa5760405162461bcd60e51b815260040161067e906154c2565b600e54600f54612e0b8260016154af565b10612e285760405162461bcd60e51b815260040161067e906154f9565b6040516370a0823160e01b815233600482015260019030906370a0823190602401602060405180830381865afa158015612e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8a9190615451565b612e959060016154af565b1115612f095760405162461bcd60e51b815260206004820152603760248201527f5065722077616c6c6574206c696d69742072656163686564212050657220776160448201527f6c6c6574206c696d6974206973203120746f6b656e732e000000000000000000606482015260840161067e565b6000612f1d600e546001610b9d91906154af565b9050612f3233600e546001610bb791906154af565b600e8054906000612f4283615530565b9190505550600e549150601081601b8110612f5f57612f5f615549565b018054906000612f6e83615530565b9091555050604080516060810182523381526020808201948552818301938452600e546000908152600b90915291909120905181546001600160a01b0319166001600160a01b039091161781559151600183015551600290910155565b6000818152600260205260408120546001600160a01b0316806105715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161067e565b60006001600160a01b0382166130ad5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161067e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146130f35760405162461bcd60e51b815260040161067e9061555f565b6130fd6000613a6c565b565b6060600180546105869061541d565b6000818152600260205260408120546001600160a01b03161515610571565b336001600160a01b038316036131855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161067e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461321b5760405162461bcd60e51b815260040161067e9061555f565b6127115b61277581116132d057600061323382613820565b905061325061324a600a546001600160a01b031690565b83613a37565b604051806060016040528061326d600a546001600160a01b031690565b6001600160a01b03908116825260208083018690526040928301949094526000858152600b8552829020835181546001600160a01b03191692169190911781559282015160018401550151600290910155806132c881615530565b91505061321f565b50565b836001600160a01b03811633146132ed576132ed33613736565b6132f985858585613abe565b5050505050565b6000818152600b602090815260409182902082516060818101855282546001600160a01b03168083526001840154948301949094526002909201549381019390935291906133845760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420746f6b656e2069642160781b604482015260640161067e565b6133c861339084613af0565b6133a38360000151868560400151613bf9565b6040516020016133b49291906155b0565b604051602081830303815290604052613d0e565b6040516020016133d8919061561a565b604051602081830303815290604052915050919050565b32331461340e5760405162461bcd60e51b815260040161067e9061546a565b600d546001146134305760405162461bcd60e51b815260040161067e906154c2565b6000600c54116134825760405162461bcd60e51b815260206004820181905260248201527f4e6f207369676e2070726963652073657420617420746865206d6f6d656e7421604482015260640161067e565b6000811180156134935750600a8111155b6134af5760405162461bcd60e51b815260040161067e906154f9565b600e54600f546134bf83836154af565b106134dc5760405162461bcd60e51b815260040161067e906154f9565b3482600c546134eb919061565f565b111561352f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161067e565b6000805b838110156107dd5761354d600e546001610b9d91906154af565b915061356233600e546001610bb791906154af565b600e805490600061357283615530565b9190505550600e549250601082601b811061358f5761358f615549565b01805490600061359e83615530565b9091555050604080516060810182523381526020808201868152828401868152600e546000908152600b90935293909120915182546001600160a01b0319166001600160a01b0390911617825551600182015590516002909101558061360381615530565b915050613533565b600a546001600160a01b031633146136355760405162461bcd60e51b815260040161067e9061555f565b6001600160a01b03811661369a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6132d081613a6c565b60006001600160e01b0319821663780e9d6360e01b1480610571575061057182613e75565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906136fd82612fcb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6daaeb6d7670e522a718067333cd4e3b156132d057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156137a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c79190615676565b6132d057604051633b79c77360e21b81526001600160a01b038216600482015260240161067e565b6137f93382613ec5565b6138155760405162461bcd60e51b815260040161067e90615693565b6107b3838383613fb8565b600080601b8360405160200161383891815260200190565b6040516020818303038152906040528051906020012060001c61385b91906156fa565b604080516103608101918290529192508291600091601090601b9082845b8154815260200190600101908083116138795750505050509050600060405180610360016040528060508152602001610190815260200161019a8152602001610122815260200161012c8152602001610140815260200160508152602001610140815260200160c8815260200161017c815260200160dc8152602001608c815260200160b481526020016101b8815260200161020881526020016102f8815260200161028a815260200160508152602001605081526020016102948152602001610258815260200161028a815260200161022681526020016050815260200161028a815260200161032a8152602001609681525090505b8084601b811061398257613982615549565b60200201518285601b811061399957613999615549565b60200201516139a99060016154af565b1115613a2d57836139b981615530565b945050601b84106139c957600093505b828403613a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f742070726f647563652072616e646f6d2066726f6d2070616c656044820152667474652069642160c81b606482015260840161067e565b613970565b5091949350505050565b610cbe828260405180602001604052806000815250614163565b6107b3838383604051806020016040528060008152506132d3565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613ac83383613ec5565b613ae45760405162461bcd60e51b815260040161067e90615693565b6107dd84848484614196565b606081600003613b175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613b415780613b2b81615530565b9150613b3a9050600a8361570e565b9150613b1b565b60008167ffffffffffffffff811115613b5c57613b5c6152f8565b6040519080825280601f01601f191660200182016040528015613b86576020820181803683370190505b5090505b8415613bf157613b9b600183615722565b9150613ba8600a866156fa565b613bb39060306154af565b60f81b818381518110613bc857613bc8615549565b60200101906001600160f81b031916908160001a905350613bea600a8661570e565b9450613b8a565b949350505050565b60606000613c7585604051602001613c29919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815282825260208301889052910160408051601f198184030181528282528051602091820120908301520160408051601f19818403018152919052906141c9565b90506000613c8284610d7a565b90506000613c8f83614246565b9050600080613ca884613ca28786614321565b8561465a565b85519193509150613cc1613cbc838661565f565b613af0565b613cca85613af0565b613cd384613af0565b613cdc86613d0e565b604051602001613cf0959493929190615735565b604051602081830303815290604052955050505050505b9392505050565b60608151600003613d2d57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d966040913990506000600384516002613d5c91906154af565b613d66919061570e565b613d7190600461565f565b90506000613d808260206154af565b67ffffffffffffffff811115613d9857613d986152f8565b6040519080825280601f01601f191660200182016040528015613dc2576020820181803683370190505b509050818152600183018586518101602084015b81831015613e305760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613dd6565b600389510660018114613e4a5760028114613e5b57613e67565b613d3d60f01b600119830152613e67565b603d60f81b6000198301525b509398975050505050505050565b60006001600160e01b031982166380ac58cd60e01b1480613ea657506001600160e01b03198216635b5e139f60e01b145b8061057157506301ffc9a760e01b6001600160e01b0319831614610571565b6000818152600260205260408120546001600160a01b0316613f3e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067e565b6000613f4983612fcb565b9050806001600160a01b0316846001600160a01b03161480613f845750836001600160a01b0316613f7984610609565b6001600160a01b0316145b80613bf157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16613bf1565b826001600160a01b0316613fcb82612fcb565b6001600160a01b0316146140335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161067e565b6001600160a01b0382166140955760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067e565b6140a083838361490f565b6140ab6000826136c8565b6001600160a01b03831660009081526003602052604081208054600192906140d4908490615722565b90915550506001600160a01b03821660009081526003602052604081208054600192906141029084906154af565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61416d838361491a565b61417a6000848484614a68565b6107b35760405162461bcd60e51b815260040161067e906158b7565b6141a1848484613fb8565b6141ad84848484614a68565b6107dd5760405162461bcd60e51b815260040161067e906158b7565b6060806040519050835180825260208201818101602087015b818310156141fa5780518352602092830192016141e2565b50855184518101855292509050808201602086015b8183101561422757805183526020928301920161420f565b508651929092011591909101601f01601f191660405250905092915050565b6000806040518061012001604052806023815260200160288152602001602d81526020016032815260200160378152602001603c81526020016041815260200160468152602001604b81525090506000816009600286600188516142aa9190615722565b815181106142ba576142ba615549565b602001015160f81c60f81b60f81c60ff16876000815181106142de576142de615549565b01602001516142f0919060f81c6154af565b6142fa919061570e565b61430491906156fa565b6009811061431457614314615549565b6020020151949350505050565b606060006040518061054001604052806002815260200160038152602001600481526020016005815260200160058152602001600581526020016005815260200160058152602001600681526020016006815260200160068152602001600681526020016006815260200160078152602001600781526020016007815260200160078152602001600781526020016008815260200160088152602001600881526020016008815260200160088152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600c8152602001600e8152602001600e8152602001600e8152602001600f815260200160108152602001601281526020016013815260200160168152602001602081525090506000808060008061448260405180606001604052806000815260200160008152602001600081525090565b60008967ffffffffffffffff81111561449d5761449d6152f8565b6040519080825280602002602001820160405280156144f257816020015b6144df60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816144bb5790505b50905060005b8a81101561464b57600093505b8b8c518961451391906156fa565b8151811061452357614523615549565b016020015160f81c955088614539602a886156fa565b602a811061454957614549615549565b602002015196508b8c5189600161456091906154af565b61456a91906156fa565b8151811061457a5761457a615549565b0160200151604080516060810190915260f89190911c9550806145be6101f46145a48560016154af565b6145ae908b61565f565b6145b891906156fa565b8a614b69565b81526020016145de6101f46145d48560016154af565b6145ae908a61565f565b815260200188905292506145f36002896154af565b9750836145ff81615530565b9450506014841161461a5761461582848d614ba1565b614505575b8282828151811061462d5761462d615549565b6020026020010181905250808061464390615530565b9150506144f8565b509a9950505050505050505050565b6040805160c080820183526004608080840182815263302e303960e01b60a0808701919091529085528551808701875283815263302e313160e01b6020828101919091528087019190915286518088018852848152630605c62760e31b818301528688015286518088018852938452630302e33360e41b8482015260608681019490945286519485018752600392850183815262302e3560e81b928601929092529084528551808701875282815262302e3960e81b81830152848201528551808701875260018152603160f81b818301528487015285518087019096529085526218971960e91b90850152818101939093526000918391829190845b878110156148795761484b6147878a838151811061477657614776615549565b602002602001015160000151613af0565b6147ad8b848151811061479c5761479c615549565b602002602001015160200151613af0565b6147d38c85815181106147c2576147c2615549565b602002602001015160400151613af0565b8d6147df6005876156fa565b6147ea9060036154af565b600881106147fa576147fa615549565b60200201518661480b6004886156fa565b6004811061481b5761481b615549565b6020020151604051602001614834959493929190615909565b60408051601f1981840301815291905286906141c9565b9450614863898b60026020020151838b888b89614c67565b965093508061487181615530565b915050614756565b506020808a01516040516148a992614892929101615a8e565b60408051601f1981840301815291905287906141c9565b95506148b586846141c9565b95506148d460405160200161489290631e17b39f60e11b815260040190565b95506148e086856141c9565b955061490160405160200161489290651e17b9bb339f60d11b815260060190565b955050505050935093915050565b6107b3838383614ddc565b6001600160a01b0382166149705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067e565b6000818152600260205260409020546001600160a01b0316156149d55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6149e16000838361490f565b6001600160a01b0382166000908152600360205260408120805460019290614a0a9084906154af565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15614b5e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614aac903390899088908890600401615c10565b6020604051808303816000875af1925050508015614ae7575060408051601f3d908101601f19168201909252614ae491810190615c4d565b60015b614b44573d808015614b15576040519150601f19603f3d011682016040523d82523d6000602084013e614b1a565b606091505b508051600003614b3c5760405162461bcd60e51b815260040161067e906158b7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613bf1565b506001949350505050565b6000828211614b9b576101f4614b7f83856154af565b11614b8a5782613d07565b614b96826101f4615722565b613d07565b50919050565b60008351600003614bb457506000613d07565b60005b82811015614c5c57848181518110614bd157614bd1615549565b6020026020010151604001518460400151614bec91906154af565b614c3a85600001518660200151888581518110614c0b57614c0b615549565b602002602001015160000151898681518110614c2957614c29615549565b602002602001015160200151614e94565b1015614c4a576001915050613d07565b80614c5481615530565b915050614bb7565b506000949350505050565b606060008060005b87811015614dcb57808914614db957614ced8b8a81518110614c9357614c93615549565b6020026020010151600001518c8b81518110614cb157614cb1615549565b6020026020010151602001518d8481518110614ccf57614ccf615549565b6020026020010151600001518e8581518110614c2957614c29615549565b9150600082118015614cff5750604782105b15614db95785614d0e81615530565b965050614db6614d298c8b8151811061477657614776615549565b614d3e8d8c8151811061479c5761479c615549565b614d538e858151811061477657614776615549565b614d688f868151811061479c5761479c615549565b8e8a614d7560048a6156fa565b60048110614d8557614d85615549565b6020020151604051602001614d9f96959493929190615c6a565b60408051601f1981840301815291905288906141c9565b96505b80614dc381615530565b915050614c6f565b509499939850929650505050505050565b6001600160a01b038316614e3757614e3281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614e5a565b816001600160a01b0316836001600160a01b031614614e5a57614e5a8382614f0e565b6001600160a01b038216614e71576107b381614fab565b826001600160a01b0316826001600160a01b0316146107b3576107b3828261505a565b600080838611614ead57614ea88685615722565b614eb7565b614eb78487615722565b90506000838611614ed157614ecc8685615722565b614edb565b614edb8487615722565b9050614f03614eea828061565f565b614ef4848061565f565b614efe91906154af565b61509e565b979650505050505050565b60006001614f1b84613042565b614f259190615722565b600083815260076020526040902054909150808214614f78576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614fbd90600190615722565b60008381526009602052604081205460088054939450909284908110614fe557614fe5615549565b90600052602060002001549050806008838154811061500657615006615549565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061503e5761503e615d7f565b6001900381819060005260206000200160009055905550505050565b600061506583613042565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008060026150ae8460016154af565b6150b8919061570e565b90508291505b81811015614b9b579050806002816150d6818661570e565b6150e091906154af565b6150ea919061570e565b90506150be565b6040518061010001604052806008905b60608152602001906001900390816151015790505090565b6001600160e01b0319811681146132d057600080fd5b60006020828403121561514157600080fd5b8135613d0781615119565b60005b8381101561516757818101518382015260200161514f565b50506000910152565b6000815180845261518881602086016020860161514c565b601f01601f19169290920160200192915050565b602081526000613d076020830184615170565b6000602082840312156151c157600080fd5b5035919050565b80356001600160a01b03811681146151df57600080fd5b919050565b600080604083850312156151f757600080fd5b615200836151c8565b946020939093013593505050565b60008060006060848603121561522357600080fd5b61522c846151c8565b925061523a602085016151c8565b9150604084013590509250925092565b6020808252600090610120830183820185845b600881101561528c57601f1987850301835261527a848351615170565b9350918401919084019060010161525d565b50919695505050505050565b6000602082840312156152aa57600080fd5b613d07826151c8565b80151581146132d057600080fd5b600080604083850312156152d457600080fd5b6152dd836151c8565b915060208301356152ed816152b3565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561532457600080fd5b61532d856151c8565b935061533b602086016151c8565b925060408501359150606085013567ffffffffffffffff8082111561535f57600080fd5b818701915087601f83011261537357600080fd5b813581811115615385576153856152f8565b604051601f8201601f19908116603f011681019083821181831017156153ad576153ad6152f8565b816040528281528a60208487010111156153c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156153fd57600080fd5b615406836151c8565b9150615414602084016151c8565b90509250929050565b600181811c9082168061543157607f821691505b602082108103614b9b57634e487b7160e01b600052602260045260246000fd5b60006020828403121561546357600080fd5b5051919050565b602080825260159082015274426f747320617265206e6f7420616c6c6f7765642160581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561057157610571615499565b6020808252601d908201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604082015260600190565b6020808252601e908201527f546f6f206d616e79207369676e206d696e74696e672072657175657374210000604082015260600190565b60006001820161554257615542615499565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081516155a681856020860161514c565b9290920192915050565b7f7b226e616d65223a2022596f7572205369676e204f6e436861696e20230000008152600083516155e881601d85016020880161514c565b8351908301906155ff81601d84016020880161514c565b61227d60f01b601d9290910191820152601f01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161565281601d85016020870161514c565b91909101601d0192915050565b808202811582820484141761057157610571615499565b60006020828403121561568857600080fd5b8151613d07816152b3565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082615709576157096156e4565b500690565b60008261571d5761571d6156e4565b500490565b8181038181111561057157610571615499565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a81527110112730b6b29116113b30b63ab2911d101160711b602082015260008651615788816032850160208b0161514c565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479222c22603291840191820152683b30b63ab2911d101160b91b605282015286516157d781605b840160208b0161514c565b7f227d2c7b2274726169745f74797065223a20224e6f6465436f756e74222c2276605b92909101918201526730b63ab2911d101160c11b607b82018190528651615828816083850160208b0161514c565b7f227d2c7b2274726169745f74797065223a202245646765436f756e74222c22766083939091019283015260a38201526158ab6158a561586b60ab840188615594565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b85615594565b98975050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6b1e31b4b931b6329031bc1e9160a11b8152855160009061593181600c850160208b0161514c565b65111031bc9e9160d11b600c918401918201528651615957816012840160208b0161514c565b641110391e9160d91b60129290910191820152855161597d816017840160208a0161514c565b6711103334b6361e9160c11b6017929091019182015284516159a681601f84016020890161514c565b7f22206f7061636974793d2230223e3c616e696d61746520617474726962757465601f92909101918201527f4e616d653d226f70616369747922206475723d22302e387322206b657954696d603f8201527f65733d22303b302e32353b302e353b302e37353b31222076616c7565733d2230605f8201527f3b302e32353b302e353b302e37353b312220726570656174436f756e743d2231607f8201526811103132b3b4b71e9160b91b609f8201526158ab615a6560a8830186615594565b7f73222066696c6c3d22667265657a65222f3e3c2f636972636c653e00000000008152601b0190565b7f3c7376672077696474683d2235303022206865696768743d223530302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7061746820643d2260408201527f4d203020302048203530302056203530302048203020562030222066696c6c3d6060820152601160f91b608082015260008251615b4281608185016020870161514c565b7f222f3e3c67206f7061636974793d2230223e3c616e696d61746520617474726960819390910192830152507f627574654e616d653d226f70616369747922206475723d22302e387322206b6560a18201527f7954696d65733d22303b302e32353b302e353b302e37353b31222076616c756560c18201527f733d22303b302e32353b302e353b302e37353b312220726570656174436f756e60e18201527f743d22312220626567696e3d223273222066696c6c3d22667265657a65222f3e61010182015261012101919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615c4390830184615170565b9695505050505050565b600060208284031215615c5f57600080fd5b8151613d0781615119565b691e3634b732903c189e9160b11b81528651600090615c9081600a850160208c0161514c565b6511103c989e9160d11b600a918401918201528751615cb6816010840160208c0161514c565b6511103c191e9160d11b601092909101918201528651615cdd816016840160208b0161514c565b6511103c991e9160d11b601692909101918201528551615d0481601c840160208a0161514c565b69111039ba3937b5b29e9160b11b601c92909101918201528451615d2f81602684016020890161514c565b615d71615d62615d5c60268486010171111039ba3937b5b296b7b830b1b4ba3c9e9160711b815260120190565b87615594565b6211179f60e91b815260030190565b9a9950505050505050505050565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220be5d4275858ae6afea3254b7cb8d40aa9fda1d25dccbdf4ac8137dab344864f564736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636352211e116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd146104ca578063d96a094a146104ea578063e985e9c5146104fd578063f2fde38b1461054657600080fd5b8063a22cb46514610475578063b12dc99114610495578063b88d4fde146104aa57600080fd5b806376b71ef2116100c657806376b71ef2146103fa5780638da5cb5b1461042257806395d89b41146104405780639e34070f1461045557600080fd5b80636352211e146103a557806370a08231146103c5578063715018a6146103e557600080fd5b8063379607f51161015957806342842e0e1161013357806342842e0e146103235780634f6ccce714610343578063505e570a146103635780635b70ea9f1461039057600080fd5b8063379607f5146102cc5780633ccfd60b146102ec57806341f434341461030157600080fd5b8063095ea7b311610195578063095ea7b31461024b57806318160ddd1461026d57806323b872dd1461028c5780632f745c59146102ac57600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461512f565b610566565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b50610206610577565b6040516101e8919061519c565b34801561021f57600080fd5b5061023361022e3660046151af565b610609565b6040516001600160a01b0390911681526020016101e8565b34801561025757600080fd5b5061026b6102663660046151e4565b6106a3565b005b34801561027957600080fd5b506008545b6040519081526020016101e8565b34801561029857600080fd5b5061026b6102a736600461520e565b6107b8565b3480156102b857600080fd5b5061027e6102c73660046151e4565b6107e3565b3480156102d857600080fd5b5061026b6102e73660046151af565b610879565b3480156102f857600080fd5b5061026b610c65565b34801561030d57600080fd5b506102336daaeb6d7670e522a718067333cd4e81565b34801561032f57600080fd5b5061026b61033e36600461520e565b610cc2565b34801561034f57600080fd5b5061027e61035e3660046151af565b610ce7565b34801561036f57600080fd5b5061038361037e3660046151af565b610d7a565b6040516101e8919061524a565b34801561039c57600080fd5b5061026b612db9565b3480156103b157600080fd5b506102336103c03660046151af565b612fcb565b3480156103d157600080fd5b5061027e6103e0366004615298565b613042565b3480156103f157600080fd5b5061026b6130c9565b34801561040657600080fd5b5061023373b605d7f21078e8f79f78ec36099fa556ba9f09ba81565b34801561042e57600080fd5b50600a546001600160a01b0316610233565b34801561044c57600080fd5b506102066130ff565b34801561046157600080fd5b506101dc6104703660046151af565b61310e565b34801561048157600080fd5b5061026b6104903660046152c1565b61312d565b3480156104a157600080fd5b5061026b6131f1565b3480156104b657600080fd5b5061026b6104c536600461530e565b6132d3565b3480156104d657600080fd5b506102066104e53660046151af565b613300565b61026b6104f83660046151af565b6133ef565b34801561050957600080fd5b506101dc6105183660046153ea565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561055257600080fd5b5061026b610561366004615298565b61360b565b6000610571826136a3565b92915050565b6060600080546105869061541d565b80601f01602080910402602001604051908101604052809291908181526020018280546105b29061541d565b80156105ff5780601f106105d4576101008083540402835291602001916105ff565b820191906000526020600020905b8154815290600101906020018083116105e257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ae82612fcb565b9050806001600160a01b0316836001600160a01b03160361071b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161067e565b336001600160a01b038216148061073757506107378133610518565b6107a95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161067e565b6107b383836136c8565b505050565b826001600160a01b03811633146107d2576107d233613736565b6107dd8484846137ef565b50505050565b60006107ee83613042565b82106108505760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161067e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516370a0823160e01b815233600482015260019073b605d7f21078e8f79f78ec36099fa556ba9f09ba906370a0823190602401602060405180830381865afa1580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190615451565b101561094d5760405162461bcd60e51b815260206004820152602760248201527f4f4720746f6b656e20636f756e742073686f756c6420626520677265617465726044820152660207468616e20360cc1b606482015260840161067e565b32331461096c5760405162461bcd60e51b815260040161067e9061546a565b6040516370a0823160e01b815233600482015273b605d7f21078e8f79f78ec36099fa556ba9f09ba906370a0823190602401602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190615451565b6040516370a0823160e01b8152336004820152829030906370a0823190602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190615451565b610a4a91906154af565b1115610abe5760405162461bcd60e51b815260206004820152603b60248201527f4f4720746f6b656e20636f6c6c6563746f72732063616e20636c61696d20312060448201527f746f6b656e20706572204f4720636f6c6c656374696f6e204e46540000000000606482015260840161067e565b60008111610b025760405162461bcd60e51b81526020600482015260116024820152700596f752063616e277420636c61696d203607c1b604482015260640161067e565b600d54600114610b245760405162461bcd60e51b815260040161067e906154c2565b600081118015610b355750600a8111155b610b515760405162461bcd60e51b815260040161067e906154f9565b600e54600f54610b628260016154af565b10610b7f5760405162461bcd60e51b815260040161067e906154f9565b6000805b838110156107dd57610ba2600e546001610b9d91906154af565b613820565b9150610bbc33600e546001610bb791906154af565b613a37565b600e8054906000610bcc83615530565b9190505550600e549250601082601b8110610be957610be9615549565b018054906000610bf883615530565b9091555050604080516060810182523381526020808201868152828401868152600e546000908152600b90935293909120915182546001600160a01b0319166001600160a01b03909116178255516001820155905160029091015580610c5d81615530565b915050610b83565b600a546001600160a01b03163314610c8f5760405162461bcd60e51b815260040161067e9061555f565b6040514790339082156108fc029083906000818181858888f19350505050158015610cbe573d6000803e3d6000fd5b5050565b826001600160a01b0381163314610cdc57610cdc33613736565b6107dd848484613a51565b6000610cf260085490565b8210610d555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161067e565b60088281548110610d6857610d68615549565b90600052602060002001549050919050565b610d826150f1565b60006040518061036001604052806040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720476f6e652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233066323866360cc1b81525081526020016040518060400160405280600781526020016611b2319b181cb360c91b8152508152602001604051806040016040528060078152602001662366656665353560c81b8152508152602001604051806040016040528060078152602001660233834316266360cc1b8152508152602001604051806040016040528060078152602001660233834316266360cc1b81525081525081526020016040518061010001604052806040518060400160405280600681526020016520baba3ab6b760d11b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001662334313164313360c81b815250815260200160405180604001604052806007815260200166119b9a999a191960c91b81525081526020016040518060400160405280600781526020016611a1181aa119a160c91b8152508152602001604051806040016040528060078152602001662344373937373160c81b8152508152602001604051806040016040528060078152602001662364366332386360c81b81525081526020016040518060400160405280600781526020016611b21b30b21cb160c91b8152508152508152602001604051806101000160405280604051806040016040528060068152602001652bb4b73a32b960d11b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001662330383032326160c81b8152508152602001604051806040016040528060078152602001662330463034344360c81b8152508152602001604051806040016040528060078152602001662331343145363160c81b8152508152602001604051806040016040528060078152602001662337383741393160c81b8152508152602001604051806040016040528060078152602001662362666434656560c81b8152508152602001604051806040016040528060078152602001662364616461646160c81b81525081525081526020016040518061010001604052806040518060400160405280600681526020016529bab6b6b2b960d11b81525081526020016040518060400160405280600781526020016611b2b23319b33360c91b8152508152602001604051806040016040528060078152602001661199189a329a3160c91b8152508152602001604051806040016040528060078152602001661199199b329c9b60c91b8152508152602001604051806040016040528060078152602001662331356232643360c81b8152508152602001604051806040016040528060078152602001660236666643730360cc1b81525081526020016040518060400160405280600781526020016611b3199c1b993360c91b81525081526020016040518060400160405280600781526020016611b3331a9c9c3360c91b815250815250815260200160405180610100016040528060405180604001604052806006815260200165537072696e6760d01b81525081526020016040518060400160405280600781526020016608d98d9999998d60ca1b81525081526020016040518060400160405280600781526020016611989a1a1819b160c91b8152508152602001604051806040016040528060078152602001661198999a3098b160c91b8152508152602001604051806040016040528060078152602001662339366262376360c81b81525081526020016040518060400160405280600781526020016611b131b2b31c9b60c91b81525081526020016040518060400160405280600781526020016608d95958d94d1960ca1b8152508152602001604051806040016040528060078152602001662364353862653560c81b815250815250815260200160405180610100016040528060405180604001604052806005815260200164486170707960d81b8152508152602001604051806040016040528060078152602001662366666635666360c81b8152508152602001604051806040016040528060078152602001662332653232363960c81b815250815260200160405180604001604052806007815260200166119c1a1aa2a19960c91b8152508152602001604051806040016040528060078152602001662365633837336160c81b8152508152602001604051806040016040528060078152602001660236562653330360cc1b8152508152602001604051806040016040528060078152602001660468c8c6a8a6e760cb1b815250815260200160405180604001604052806007815260200166119999311cb33360c91b81525081525081526020016040518061010001604052806040518060400160405280600c81526020016b437962657250756e6b20763160a01b81525081526020016040518060400160405280600781526020016611991b981a1a1b60c91b8152508152602001604051806040016040528060078152602001662361323664663960c81b81525081526020016040518060400160405280600781526020016604660ca64cac2760cb1b81525081526020016040518060400160405280600781526020016608d94dcc4d991960ca1b8152508152602001604051806040016040528060078152602001662366393134336160c81b8152508152602001604051806040016040528060078152602001662330636666653160c81b8152508152602001604051806040016040528060078152602001662366376666313360c81b8152508152508152602001604051806101000160405280604051806040016040528060048152602001632732b7b760e11b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662363386666303760c81b81525081526020016040518060400160405280600781526020016611b11998b3319b60c91b8152508152602001604051806040016040528060078152602001660236632313137360cc1b81525081526020016040518060400160405280600781526020016611981a3230b31b60c91b8152508152602001604051806040016040528060078152602001660236666353230360cc1b8152508152602001604051806040016040528060078152602001660236663666630360cc1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166426c6f73736f6d60c81b8152508152602001604051806040016040528060078152602001662366666636666360c81b81525081526020016040518060400160405280600781526020016608cdcccd984d8d60ca1b81525081526020016040518060400160405280600781526020016611b318b218b21b60c91b8152508152602001604051806040016040528060078152602001662366666162653160c81b81525081526020016040518060400160405280600781526020016611b09b1c1ab29960c91b815250815260200160405180604001604052806007815260200166119b189a9ab09b60c91b815250815260200160405180604001604052806007815260200166119a18191b9a3360c91b81525081525081526020016040518061010001604052806040518060400160405280600881526020016713dc9a595b9d185b60c21b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b81525081526020016040518060400160405280600781526020016604672cc60c664760cb1b8152508152602001604051806040016040528060078152602001662331413930443960c81b81525081526020016040518060400160405280600781526020016611b318309b189960c91b815250815260200160405180604001604052806007815260200166046cc60707060760cb1b81525081526020016040518060400160405280600781526020016611a31919a2989b60c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167566963654369747960c01b8152508152602001604051806040016040528060078152602001662331633132343160c81b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001660236563633732360cc1b8152508152602001604051806040016040528060078152602001660466e68c2c2ca760cb1b815250815260200160405180604001604052806007815260200166119c331b31b13360c91b8152508152602001604051806040016040528060078152602001662363303562383560c81b8152508152602001604051806040016040528060078152602001662363613134383160c81b815250815250815260200160405180610100016040528060405180604001604052806007815260200166566f6c63616e6f60c81b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662333383030314360c81b8152508152602001604051806040016040528060078152602001660236239323230360cc1b8152508152602001604051806040016040528060078152602001660236635376530360cc1b8152508152602001604051806040016040528060078152602001662366616333306360c81b815250815260200160405180604001604052806007815260200166119c1b1c181b3160c91b81525081525081526020016040518061010001604052806040518060400160405280600a81526020016923b7b21037b3102bb0b960b11b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001662337333032313560c81b8152508152602001604051806040016040528060078152602001662334343337333760c81b8152508152602001604051806040016040528060078152602001662334303039303960c81b8152508152602001604051806040016040528060078152602001660234646303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662339363063333360c81b8152508152508152602001604051806101000160405280604051806040016040528060078152602001665261696e626f7760c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233864356130360cc1b815250815260200160405180604001604052806007815260200166119c9b9833331960c91b81525081526020016040518060400160405280600781526020016611981a9c9bb31960c91b8152508152602001604051806040016040528060078152602001662334396439303760c81b81525081526020016040518060400160405280600781526020016608d98c994d0c0d60ca1b8152508152602001604051806040016040528060078152602001662363363038333560c81b8152508152508152602001604051806101000160405280604051806040016040528060098152602001682430b63637bbb2b2b760b91b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233135303035360cc1b8152508152602001604051806040016040528060078152602001662333463030373160c81b81525081526020016040518060400160405280600781526020016608cd8c4c0c0e4d60ca1b8152508152602001604051806040016040528060078152602001662365663863323960c81b81525081525081526020016040518061010001604052806040518060400160405280600381526020016214995960ea1b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660234335303030360cc1b8152508152602001604051806040016040528060078152602001660234335303030360cc1b81525081526020016040518060400160405280600781526020016608d10d0ccd0ccd60ca1b8152508152602001604051806040016040528060078152602001662345323637363760c81b81525081526020016040518060400160405280600781526020016611a3189ca11ca160c91b8152508152602001604051806040016040528060078152602001662346464345434560c81b81525081525081526020016040518061010001604052806040518060400160405280600481526020016350696e6b60e01b81525081526020016040518060400160405280600781526020016608d98e198c199960ca1b8152508152602001604051806040016040528060078152602001660236233303062360cc1b8152508152602001604051806040016040528060078152602001662345423030453760c81b8152508152602001604051806040016040528060078152602001662345443330453560c81b8152508152602001604051806040016040528060078152602001662345463630453360c81b8152508152602001604051806040016040528060078152602001662346303846453160c81b81525081526020016040518060400160405280600781526020016611a3192123222360c91b81525081525081526020016040518061010001604052806040518060400160405280601981526020017f50616e746f6e65277320476c6f77696e6720507572706c652a0000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662338333162663160c81b8152508152602001604051806040016040528060078152602001660233862343764360cc1b8152508152602001604051806040016040528060078152602001662361663766653160c81b8152508152602001604051806040016040528060078152602001662363626133663360c81b81525081525081526020016040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720426c75652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660466072627272760cb1b8152508152602001604051806040016040528060078152602001662330613162613760c81b8152508152602001604051806040016040528060078152602001660233065323866360cc1b8152508152602001604051806040016040528060078152602001660466088608872760cb1b8152508152602001604051806040016040528060078152602001662331323044433360c81b81525081526020016040518060400160405280600781526020016608cc4e0c11115160ca1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166536b79426c756560c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b815250815260200160405180604001604052806007815260200166119a20a099232360c91b815250815260200160405180604001604052806007815260200166119ba1a120a32360c91b81525081526020016040518060400160405280600781526020016611a0a2a218a32360c91b81525081526020016040518060400160405280600781526020016611b0b1311cb21960c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167547572717569736560c01b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330434336394560c81b8152508152602001604051806040016040528060078152602001662330434336394560c81b81525081526020016040518060400160405280600781526020016611999ba1a320a360c91b8152508152602001604051806040016040528060078152602001662336314438433160c81b815250815260200160405180604001604052806007815260200166119c21a298221960c91b8152508152602001604051806040016040528060078152602001662342364539453360c81b81525081525081526020016040518061010001604052806040518060400160405280600581526020016423b932b2b760d91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001661199219c9a992160c91b815250815260200160405180604001604052806007815260200166119a22a11c1a9960c91b8152508152602001604051806040016040528060078152602001660466c8c88866e760cb1b8152508152602001604051806040016040528060078152602001662339314646394560c81b81525081525081526020016040518061010001604052806040518060400160405280600b81526020016a23b930b9b99023b932b2b760a91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b815250815260200160405180604090810181526007808352662336353835303560c81b60208085019190915292845281518083018352818152660468262886860760cb1b818501528484015281518083018352818152662342304443333760c81b818501528483015281518083018352818152662342464533363760c81b81850152606080860191909152825180840184528281526611a1a222a11c9b60c91b8186015260808087019190915283518085018552838152662344434632433560c81b8187015260a0968701529587528251610140808201855260196101008084019182527f50616e746f6e65277320476c6f77696e672059656c6c6f772a000000000000006101208086019190915291845286518088018852868152660233030303030360cc1b818a01819052858a019190915287518089018952878152660236666663030360cc1b818b01819052868a01919091528851808a018a52888152808b01919091528587015287518089018952878152662366656665353560c81b818b0152858c0152875180890189528781526611a323231a9b2360c91b818b0152858b015287518089018952878152662346464639413760c81b818b015260c0808701919091528851808a018a52888152662366666663636560c81b818c015260e0808801919091528d8b019690965288518086018a526006818501908152654f72616e676560d01b8287015281528951808b018b528981526611a3232323232360c91b818d01819052828d01919091528a51808c018c528a8152660236131343630360cc1b818e0152828c01528a51808c018c528a8152660236362353830360cc1b818e0152828a01528a51808c018c528a8152660234646364630360cc1b818e0152828f01528a51808c018c528a8152662346383746323160c81b818e0152828e01528a51808c018c528a81526611a3189c229a1960c91b818e0152828401528a51808c018c528a8152662345413945363360c81b818e0152828901528e8b019190915289518087018b52600581860190815264426c61636b60d81b8288015281528a51808c018c528a81526611b3333333333360c91b818e0152818d01528a51808c018c528a8152808d01859052818c01528a51808c018c528a8152808d0194909452808901939093528951808b018b52898152660466470647064760cb1b818d0152838e01528951808b018b52898152660233530353035360cc1b818d0152838d01528951808b018b52898152662337373737373760c81b818d0152838301528951808b018b5289815266119ca31ca31ca360c91b818d0152838801528d88019290925288519485018952600b9285019283526a526f6d6520507572706c6560a81b9385019390935290835286518088018852868152808901919091528288015285518087018752858152662334383336353960c81b818901528287015285518087018752858152662336303364376360c81b818901529382019390935284518086018652848152662336343462376360c81b818801819052828a01919091528551808701875285815280880191909152968101969096528351808501855283815266119c181b181cb360c91b81870152918601919091528251808401909352908252662361633761643360c81b928201929092529082015291015290508083601b8110612dad57612dad615549565b60200201519392505050565b323314612dd85760405162461bcd60e51b815260040161067e9061546a565b600d54600114612dfa5760405162461bcd60e51b815260040161067e906154c2565b600e54600f54612e0b8260016154af565b10612e285760405162461bcd60e51b815260040161067e906154f9565b6040516370a0823160e01b815233600482015260019030906370a0823190602401602060405180830381865afa158015612e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e8a9190615451565b612e959060016154af565b1115612f095760405162461bcd60e51b815260206004820152603760248201527f5065722077616c6c6574206c696d69742072656163686564212050657220776160448201527f6c6c6574206c696d6974206973203120746f6b656e732e000000000000000000606482015260840161067e565b6000612f1d600e546001610b9d91906154af565b9050612f3233600e546001610bb791906154af565b600e8054906000612f4283615530565b9190505550600e549150601081601b8110612f5f57612f5f615549565b018054906000612f6e83615530565b9091555050604080516060810182523381526020808201948552818301938452600e546000908152600b90915291909120905181546001600160a01b0319166001600160a01b039091161781559151600183015551600290910155565b6000818152600260205260408120546001600160a01b0316806105715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161067e565b60006001600160a01b0382166130ad5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161067e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146130f35760405162461bcd60e51b815260040161067e9061555f565b6130fd6000613a6c565b565b6060600180546105869061541d565b6000818152600260205260408120546001600160a01b03161515610571565b336001600160a01b038316036131855760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161067e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b0316331461321b5760405162461bcd60e51b815260040161067e9061555f565b6127115b61277581116132d057600061323382613820565b905061325061324a600a546001600160a01b031690565b83613a37565b604051806060016040528061326d600a546001600160a01b031690565b6001600160a01b03908116825260208083018690526040928301949094526000858152600b8552829020835181546001600160a01b03191692169190911781559282015160018401550151600290910155806132c881615530565b91505061321f565b50565b836001600160a01b03811633146132ed576132ed33613736565b6132f985858585613abe565b5050505050565b6000818152600b602090815260409182902082516060818101855282546001600160a01b03168083526001840154948301949094526002909201549381019390935291906133845760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420746f6b656e2069642160781b604482015260640161067e565b6133c861339084613af0565b6133a38360000151868560400151613bf9565b6040516020016133b49291906155b0565b604051602081830303815290604052613d0e565b6040516020016133d8919061561a565b604051602081830303815290604052915050919050565b32331461340e5760405162461bcd60e51b815260040161067e9061546a565b600d546001146134305760405162461bcd60e51b815260040161067e906154c2565b6000600c54116134825760405162461bcd60e51b815260206004820181905260248201527f4e6f207369676e2070726963652073657420617420746865206d6f6d656e7421604482015260640161067e565b6000811180156134935750600a8111155b6134af5760405162461bcd60e51b815260040161067e906154f9565b600e54600f546134bf83836154af565b106134dc5760405162461bcd60e51b815260040161067e906154f9565b3482600c546134eb919061565f565b111561352f5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161067e565b6000805b838110156107dd5761354d600e546001610b9d91906154af565b915061356233600e546001610bb791906154af565b600e805490600061357283615530565b9190505550600e549250601082601b811061358f5761358f615549565b01805490600061359e83615530565b9091555050604080516060810182523381526020808201868152828401868152600e546000908152600b90935293909120915182546001600160a01b0319166001600160a01b0390911617825551600182015590516002909101558061360381615530565b915050613533565b600a546001600160a01b031633146136355760405162461bcd60e51b815260040161067e9061555f565b6001600160a01b03811661369a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b6132d081613a6c565b60006001600160e01b0319821663780e9d6360e01b1480610571575061057182613e75565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906136fd82612fcb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6daaeb6d7670e522a718067333cd4e3b156132d057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156137a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c79190615676565b6132d057604051633b79c77360e21b81526001600160a01b038216600482015260240161067e565b6137f93382613ec5565b6138155760405162461bcd60e51b815260040161067e90615693565b6107b3838383613fb8565b600080601b8360405160200161383891815260200190565b6040516020818303038152906040528051906020012060001c61385b91906156fa565b604080516103608101918290529192508291600091601090601b9082845b8154815260200190600101908083116138795750505050509050600060405180610360016040528060508152602001610190815260200161019a8152602001610122815260200161012c8152602001610140815260200160508152602001610140815260200160c8815260200161017c815260200160dc8152602001608c815260200160b481526020016101b8815260200161020881526020016102f8815260200161028a815260200160508152602001605081526020016102948152602001610258815260200161028a815260200161022681526020016050815260200161028a815260200161032a8152602001609681525090505b8084601b811061398257613982615549565b60200201518285601b811061399957613999615549565b60200201516139a99060016154af565b1115613a2d57836139b981615530565b945050601b84106139c957600093505b828403613a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f742070726f647563652072616e646f6d2066726f6d2070616c656044820152667474652069642160c81b606482015260840161067e565b613970565b5091949350505050565b610cbe828260405180602001604052806000815250614163565b6107b3838383604051806020016040528060008152506132d3565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613ac83383613ec5565b613ae45760405162461bcd60e51b815260040161067e90615693565b6107dd84848484614196565b606081600003613b175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613b415780613b2b81615530565b9150613b3a9050600a8361570e565b9150613b1b565b60008167ffffffffffffffff811115613b5c57613b5c6152f8565b6040519080825280601f01601f191660200182016040528015613b86576020820181803683370190505b5090505b8415613bf157613b9b600183615722565b9150613ba8600a866156fa565b613bb39060306154af565b60f81b818381518110613bc857613bc8615549565b60200101906001600160f81b031916908160001a905350613bea600a8661570e565b9450613b8a565b949350505050565b60606000613c7585604051602001613c29919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815282825260208301889052910160408051601f198184030181528282528051602091820120908301520160408051601f19818403018152919052906141c9565b90506000613c8284610d7a565b90506000613c8f83614246565b9050600080613ca884613ca28786614321565b8561465a565b85519193509150613cc1613cbc838661565f565b613af0565b613cca85613af0565b613cd384613af0565b613cdc86613d0e565b604051602001613cf0959493929190615735565b604051602081830303815290604052955050505050505b9392505050565b60608151600003613d2d57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d966040913990506000600384516002613d5c91906154af565b613d66919061570e565b613d7190600461565f565b90506000613d808260206154af565b67ffffffffffffffff811115613d9857613d986152f8565b6040519080825280601f01601f191660200182016040528015613dc2576020820181803683370190505b509050818152600183018586518101602084015b81831015613e305760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613dd6565b600389510660018114613e4a5760028114613e5b57613e67565b613d3d60f01b600119830152613e67565b603d60f81b6000198301525b509398975050505050505050565b60006001600160e01b031982166380ac58cd60e01b1480613ea657506001600160e01b03198216635b5e139f60e01b145b8061057157506301ffc9a760e01b6001600160e01b0319831614610571565b6000818152600260205260408120546001600160a01b0316613f3e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067e565b6000613f4983612fcb565b9050806001600160a01b0316846001600160a01b03161480613f845750836001600160a01b0316613f7984610609565b6001600160a01b0316145b80613bf157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16613bf1565b826001600160a01b0316613fcb82612fcb565b6001600160a01b0316146140335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161067e565b6001600160a01b0382166140955760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067e565b6140a083838361490f565b6140ab6000826136c8565b6001600160a01b03831660009081526003602052604081208054600192906140d4908490615722565b90915550506001600160a01b03821660009081526003602052604081208054600192906141029084906154af565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61416d838361491a565b61417a6000848484614a68565b6107b35760405162461bcd60e51b815260040161067e906158b7565b6141a1848484613fb8565b6141ad84848484614a68565b6107dd5760405162461bcd60e51b815260040161067e906158b7565b6060806040519050835180825260208201818101602087015b818310156141fa5780518352602092830192016141e2565b50855184518101855292509050808201602086015b8183101561422757805183526020928301920161420f565b508651929092011591909101601f01601f191660405250905092915050565b6000806040518061012001604052806023815260200160288152602001602d81526020016032815260200160378152602001603c81526020016041815260200160468152602001604b81525090506000816009600286600188516142aa9190615722565b815181106142ba576142ba615549565b602001015160f81c60f81b60f81c60ff16876000815181106142de576142de615549565b01602001516142f0919060f81c6154af565b6142fa919061570e565b61430491906156fa565b6009811061431457614314615549565b6020020151949350505050565b606060006040518061054001604052806002815260200160038152602001600481526020016005815260200160058152602001600581526020016005815260200160058152602001600681526020016006815260200160068152602001600681526020016006815260200160078152602001600781526020016007815260200160078152602001600781526020016008815260200160088152602001600881526020016008815260200160088152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600c8152602001600e8152602001600e8152602001600e8152602001600f815260200160108152602001601281526020016013815260200160168152602001602081525090506000808060008061448260405180606001604052806000815260200160008152602001600081525090565b60008967ffffffffffffffff81111561449d5761449d6152f8565b6040519080825280602002602001820160405280156144f257816020015b6144df60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816144bb5790505b50905060005b8a81101561464b57600093505b8b8c518961451391906156fa565b8151811061452357614523615549565b016020015160f81c955088614539602a886156fa565b602a811061454957614549615549565b602002015196508b8c5189600161456091906154af565b61456a91906156fa565b8151811061457a5761457a615549565b0160200151604080516060810190915260f89190911c9550806145be6101f46145a48560016154af565b6145ae908b61565f565b6145b891906156fa565b8a614b69565b81526020016145de6101f46145d48560016154af565b6145ae908a61565f565b815260200188905292506145f36002896154af565b9750836145ff81615530565b9450506014841161461a5761461582848d614ba1565b614505575b8282828151811061462d5761462d615549565b6020026020010181905250808061464390615530565b9150506144f8565b509a9950505050505050505050565b6040805160c080820183526004608080840182815263302e303960e01b60a0808701919091529085528551808701875283815263302e313160e01b6020828101919091528087019190915286518088018852848152630605c62760e31b818301528688015286518088018852938452630302e33360e41b8482015260608681019490945286519485018752600392850183815262302e3560e81b928601929092529084528551808701875282815262302e3960e81b81830152848201528551808701875260018152603160f81b818301528487015285518087019096529085526218971960e91b90850152818101939093526000918391829190845b878110156148795761484b6147878a838151811061477657614776615549565b602002602001015160000151613af0565b6147ad8b848151811061479c5761479c615549565b602002602001015160200151613af0565b6147d38c85815181106147c2576147c2615549565b602002602001015160400151613af0565b8d6147df6005876156fa565b6147ea9060036154af565b600881106147fa576147fa615549565b60200201518661480b6004886156fa565b6004811061481b5761481b615549565b6020020151604051602001614834959493929190615909565b60408051601f1981840301815291905286906141c9565b9450614863898b60026020020151838b888b89614c67565b965093508061487181615530565b915050614756565b506020808a01516040516148a992614892929101615a8e565b60408051601f1981840301815291905287906141c9565b95506148b586846141c9565b95506148d460405160200161489290631e17b39f60e11b815260040190565b95506148e086856141c9565b955061490160405160200161489290651e17b9bb339f60d11b815260060190565b955050505050935093915050565b6107b3838383614ddc565b6001600160a01b0382166149705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067e565b6000818152600260205260409020546001600160a01b0316156149d55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067e565b6149e16000838361490f565b6001600160a01b0382166000908152600360205260408120805460019290614a0a9084906154af565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15614b5e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614aac903390899088908890600401615c10565b6020604051808303816000875af1925050508015614ae7575060408051601f3d908101601f19168201909252614ae491810190615c4d565b60015b614b44573d808015614b15576040519150601f19603f3d011682016040523d82523d6000602084013e614b1a565b606091505b508051600003614b3c5760405162461bcd60e51b815260040161067e906158b7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613bf1565b506001949350505050565b6000828211614b9b576101f4614b7f83856154af565b11614b8a5782613d07565b614b96826101f4615722565b613d07565b50919050565b60008351600003614bb457506000613d07565b60005b82811015614c5c57848181518110614bd157614bd1615549565b6020026020010151604001518460400151614bec91906154af565b614c3a85600001518660200151888581518110614c0b57614c0b615549565b602002602001015160000151898681518110614c2957614c29615549565b602002602001015160200151614e94565b1015614c4a576001915050613d07565b80614c5481615530565b915050614bb7565b506000949350505050565b606060008060005b87811015614dcb57808914614db957614ced8b8a81518110614c9357614c93615549565b6020026020010151600001518c8b81518110614cb157614cb1615549565b6020026020010151602001518d8481518110614ccf57614ccf615549565b6020026020010151600001518e8581518110614c2957614c29615549565b9150600082118015614cff5750604782105b15614db95785614d0e81615530565b965050614db6614d298c8b8151811061477657614776615549565b614d3e8d8c8151811061479c5761479c615549565b614d538e858151811061477657614776615549565b614d688f868151811061479c5761479c615549565b8e8a614d7560048a6156fa565b60048110614d8557614d85615549565b6020020151604051602001614d9f96959493929190615c6a565b60408051601f1981840301815291905288906141c9565b96505b80614dc381615530565b915050614c6f565b509499939850929650505050505050565b6001600160a01b038316614e3757614e3281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614e5a565b816001600160a01b0316836001600160a01b031614614e5a57614e5a8382614f0e565b6001600160a01b038216614e71576107b381614fab565b826001600160a01b0316826001600160a01b0316146107b3576107b3828261505a565b600080838611614ead57614ea88685615722565b614eb7565b614eb78487615722565b90506000838611614ed157614ecc8685615722565b614edb565b614edb8487615722565b9050614f03614eea828061565f565b614ef4848061565f565b614efe91906154af565b61509e565b979650505050505050565b60006001614f1b84613042565b614f259190615722565b600083815260076020526040902054909150808214614f78576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614fbd90600190615722565b60008381526009602052604081205460088054939450909284908110614fe557614fe5615549565b90600052602060002001549050806008838154811061500657615006615549565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061503e5761503e615d7f565b6001900381819060005260206000200160009055905550505050565b600061506583613042565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60008060026150ae8460016154af565b6150b8919061570e565b90508291505b81811015614b9b579050806002816150d6818661570e565b6150e091906154af565b6150ea919061570e565b90506150be565b6040518061010001604052806008905b60608152602001906001900390816151015790505090565b6001600160e01b0319811681146132d057600080fd5b60006020828403121561514157600080fd5b8135613d0781615119565b60005b8381101561516757818101518382015260200161514f565b50506000910152565b6000815180845261518881602086016020860161514c565b601f01601f19169290920160200192915050565b602081526000613d076020830184615170565b6000602082840312156151c157600080fd5b5035919050565b80356001600160a01b03811681146151df57600080fd5b919050565b600080604083850312156151f757600080fd5b615200836151c8565b946020939093013593505050565b60008060006060848603121561522357600080fd5b61522c846151c8565b925061523a602085016151c8565b9150604084013590509250925092565b6020808252600090610120830183820185845b600881101561528c57601f1987850301835261527a848351615170565b9350918401919084019060010161525d565b50919695505050505050565b6000602082840312156152aa57600080fd5b613d07826151c8565b80151581146132d057600080fd5b600080604083850312156152d457600080fd5b6152dd836151c8565b915060208301356152ed816152b3565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561532457600080fd5b61532d856151c8565b935061533b602086016151c8565b925060408501359150606085013567ffffffffffffffff8082111561535f57600080fd5b818701915087601f83011261537357600080fd5b813581811115615385576153856152f8565b604051601f8201601f19908116603f011681019083821181831017156153ad576153ad6152f8565b816040528281528a60208487010111156153c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156153fd57600080fd5b615406836151c8565b9150615414602084016151c8565b90509250929050565b600181811c9082168061543157607f821691505b602082108103614b9b57634e487b7160e01b600052602260045260246000fd5b60006020828403121561546357600080fd5b5051919050565b602080825260159082015274426f747320617265206e6f7420616c6c6f7765642160581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561057157610571615499565b6020808252601d908201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604082015260600190565b6020808252601e908201527f546f6f206d616e79207369676e206d696e74696e672072657175657374210000604082015260600190565b60006001820161554257615542615499565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600081516155a681856020860161514c565b9290920192915050565b7f7b226e616d65223a2022596f7572205369676e204f6e436861696e20230000008152600083516155e881601d85016020880161514c565b8351908301906155ff81601d84016020880161514c565b61227d60f01b601d9290910191820152601f01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161565281601d85016020870161514c565b91909101601d0192915050565b808202811582820484141761057157610571615499565b60006020828403121561568857600080fd5b8151613d07816152b3565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082615709576157096156e4565b500690565b60008261571d5761571d6156e4565b500490565b8181038181111561057157610571615499565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a81527110112730b6b29116113b30b63ab2911d101160711b602082015260008651615788816032850160208b0161514c565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479222c22603291840191820152683b30b63ab2911d101160b91b605282015286516157d781605b840160208b0161514c565b7f227d2c7b2274726169745f74797065223a20224e6f6465436f756e74222c2276605b92909101918201526730b63ab2911d101160c11b607b82018190528651615828816083850160208b0161514c565b7f227d2c7b2274726169745f74797065223a202245646765436f756e74222c22766083939091019283015260a38201526158ab6158a561586b60ab840188615594565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b85615594565b98975050505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6b1e31b4b931b6329031bc1e9160a11b8152855160009061593181600c850160208b0161514c565b65111031bc9e9160d11b600c918401918201528651615957816012840160208b0161514c565b641110391e9160d91b60129290910191820152855161597d816017840160208a0161514c565b6711103334b6361e9160c11b6017929091019182015284516159a681601f84016020890161514c565b7f22206f7061636974793d2230223e3c616e696d61746520617474726962757465601f92909101918201527f4e616d653d226f70616369747922206475723d22302e387322206b657954696d603f8201527f65733d22303b302e32353b302e353b302e37353b31222076616c7565733d2230605f8201527f3b302e32353b302e353b302e37353b312220726570656174436f756e743d2231607f8201526811103132b3b4b71e9160b91b609f8201526158ab615a6560a8830186615594565b7f73222066696c6c3d22667265657a65222f3e3c2f636972636c653e00000000008152601b0190565b7f3c7376672077696474683d2235303022206865696768743d223530302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7061746820643d2260408201527f4d203020302048203530302056203530302048203020562030222066696c6c3d6060820152601160f91b608082015260008251615b4281608185016020870161514c565b7f222f3e3c67206f7061636974793d2230223e3c616e696d61746520617474726960819390910192830152507f627574654e616d653d226f70616369747922206475723d22302e387322206b6560a18201527f7954696d65733d22303b302e32353b302e353b302e37353b31222076616c756560c18201527f733d22303b302e32353b302e353b302e37353b312220726570656174436f756e60e18201527f743d22312220626567696e3d223273222066696c6c3d22667265657a65222f3e61010182015261012101919050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615c4390830184615170565b9695505050505050565b600060208284031215615c5f57600080fd5b8151613d0781615119565b691e3634b732903c189e9160b11b81528651600090615c9081600a850160208c0161514c565b6511103c989e9160d11b600a918401918201528751615cb6816010840160208c0161514c565b6511103c191e9160d11b601092909101918201528651615cdd816016840160208b0161514c565b6511103c991e9160d11b601692909101918201528551615d0481601c840160208a0161514c565b69111039ba3937b5b29e9160b11b601c92909101918201528451615d2f81602684016020890161514c565b615d71615d62615d5c60268486010171111039ba3937b5b296b7b830b1b4ba3c9e9160711b815260120190565b87615594565b6211179f60e91b815260030190565b9a9950505050505050505050565b634e487b7160e01b600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220be5d4275858ae6afea3254b7cb8d40aa9fda1d25dccbdf4ac8137dab344864f564736f6c63430008120033

Deployed Bytecode Sourcemap

60345:16941:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76909:179;;;;;;;;;;-1:-1:-1;76909:179:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;76909:179:0;;;;;;;;41997:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43556:221::-;;;;;;;;;;-1:-1:-1;43556:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;43556:221:0;1555:203:1;43079:411:0;;;;;;;;;;-1:-1:-1;43079:411:0;;;;;:::i;:::-;;:::i;:::-;;54751:113;;;;;;;;;;-1:-1:-1;54839:10:0;:17;54751:113;;;2346:25:1;;;2334:2;2319:18;54751:113:0;2200:177:1;76158:180:0;;;;;;;;;;-1:-1:-1;76158:180:0;;;;;:::i;:::-;;:::i;54419:256::-;;;;;;;;;;-1:-1:-1;54419:256:0;;;;;:::i;:::-;;:::i;72611:1252::-;;;;;;;;;;-1:-1:-1;72611:1252:0;;;;;:::i;:::-;;:::i;76007:143::-;;;;;;;;;;;;;:::i;7867:::-;;;;;;;;;;;;195:42;7867:143;;76346:188;;;;;;;;;;-1:-1:-1;76346:188:0;;;;;:::i;:::-;;:::i;54941:233::-;;;;;;;;;;-1:-1:-1;54941:233:0;;;;;:::i;:::-;;:::i;61646:3153::-;;;;;;;;;;-1:-1:-1;61646:3153:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;73875:742::-;;;;;;;;;;;;;:::i;41691:239::-;;;;;;;;;;-1:-1:-1;41691:239:0;;;;;:::i;:::-;;:::i;41421:208::-;;;;;;;;;;-1:-1:-1;41421:208:0;;;;;:::i;:::-;;:::i;21648:94::-;;;;;;;;;;;;;:::i;61006:85::-;;;;;;;;;;;;61049:42;61006:85;;20997:87;;;;;;;;;;-1:-1:-1;21070:6:0;;-1:-1:-1;;;;;21070:6:0;20997:87;;42166:104;;;;;;;;;;;;;:::i;76796:105::-;;;;;;;;;;-1:-1:-1;76796:105:0;;;;;:::i;:::-;;:::i;43849:295::-;;;;;;;;;;-1:-1:-1;43849:295:0;;;;;:::i;:::-;;:::i;75699:296::-;;;;;;;;;;;;;:::i;76542:245::-;;;;;;;;;;-1:-1:-1;76542:245:0;;;;;:::i;:::-;;:::i;71896:707::-;;;;;;;;;;-1:-1:-1;71896:707:0;;;;;:::i;:::-;;:::i;74625:1066::-;;;;;;:::i;:::-;;:::i;44215:164::-;;;;;;;;;;-1:-1:-1;44215:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44336:25:0;;;44312:4;44336:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44215:164;21897:192;;;;;;;;;;-1:-1:-1;21897:192:0;;;;;:::i;:::-;;:::i;76909:179::-;77020:4;77044:36;77068:11;77044:23;:36::i;:::-;77037:43;76909:179;-1:-1:-1;;76909:179:0:o;41997:100::-;42051:13;42084:5;42077:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41997:100;:::o;43556:221::-;43632:7;47039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47039:16:0;43652:73;;;;-1:-1:-1;;;43652:73:0;;6420:2:1;43652:73:0;;;6402:21:1;6459:2;6439:18;;;6432:30;6498:34;6478:18;;;6471:62;-1:-1:-1;;;6549:18:1;;;6542:42;6601:19;;43652:73:0;;;;;;;;;-1:-1:-1;43745:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43745:24:0;;43556:221::o;43079:411::-;43160:13;43176:23;43191:7;43176:14;:23::i;:::-;43160:39;;43224:5;-1:-1:-1;;;;;43218:11:0;:2;-1:-1:-1;;;;;43218:11:0;;43210:57;;;;-1:-1:-1;;;43210:57:0;;6833:2:1;43210:57:0;;;6815:21:1;6872:2;6852:18;;;6845:30;6911:34;6891:18;;;6884:62;-1:-1:-1;;;6962:18:1;;;6955:31;7003:19;;43210:57:0;6631:397:1;43210:57:0;19859:10;-1:-1:-1;;;;;43302:21:0;;;;:62;;-1:-1:-1;43327:37:0;43344:5;19859:10;44215:164;:::i;43327:37::-;43280:168;;;;-1:-1:-1;;;43280:168:0;;7235:2:1;43280:168:0;;;7217:21:1;7274:2;7254:18;;;7247:30;7313:34;7293:18;;;7286:62;7384:26;7364:18;;;7357:54;7428:19;;43280:168:0;7033:420:1;43280:168:0;43461:21;43470:2;43474:7;43461:8;:21::i;:::-;43149:341;43079:411;;:::o;76158:180::-;76276:4;-1:-1:-1;;;;;9375:18:0;;9383:10;9375:18;9371:83;;9410:32;9431:10;9410:20;:32::i;:::-;76293:37:::1;76312:4;76318:2;76322:7;76293:18;:37::i;:::-;76158:180:::0;;;;:::o;54419:256::-;54516:7;54552:23;54569:5;54552:16;:23::i;:::-;54544:5;:31;54536:87;;;;-1:-1:-1;;;54536:87:0;;7660:2:1;54536:87:0;;;7642:21:1;7699:2;7679:18;;;7672:30;7738:34;7718:18;;;7711:62;-1:-1:-1;;;7789:18:1;;;7782:41;7840:19;;54536:87:0;7458:407:1;54536:87:0;-1:-1:-1;;;;;;54641:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;54419:256::o;72611:1252::-;72676:57;;-1:-1:-1;;;72676:57:0;;72722:10;72676:57;;;1701:51:1;72737:1:0;;61049:42;;72676:45;;1674:18:1;;72676:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;72668:114;;;;-1:-1:-1;;;72668:114:0;;8261:2:1;72668:114:0;;;8243:21:1;8300:2;8280:18;;;8273:30;8339:34;8319:18;;;8312:62;-1:-1:-1;;;8390:18:1;;;8383:37;8437:19;;72668:114:0;8059:403:1;72668:114:0;72803:9;72816:10;72803:23;72795:57;;;;-1:-1:-1;;;72795:57:0;;;;;;;:::i;:::-;72920;;-1:-1:-1;;;72920:57:0;;72966:10;72920:57;;;1701:51:1;61049:42:0;;72920:45;;1674:18:1;;72920:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72873:26;;-1:-1:-1;;;72873:26:0;;72888:10;72873:26;;;1701:51:1;72902:14:0;;72873:4;;:14;;1674:18:1;;72873:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;:104;;72865:176;;;;-1:-1:-1;;;72865:176:0;;9281:2:1;72865:176:0;;;9263:21:1;9320:2;9300:18;;;9293:30;9359:34;9339:18;;;9332:62;9430:29;9410:18;;;9403:57;9477:19;;72865:176:0;9079:423:1;72865:176:0;73079:1;73062:14;:18;73054:48;;;;-1:-1:-1;;;73054:48:0;;9709:2:1;73054:48:0;;;9691:21:1;9748:2;9728:18;;;9721:30;-1:-1:-1;;;9767:18:1;;;9760:47;9824:18;;73054:48:0;9507:341:1;73054:48:0;73123:11;;73138:1;73123:16;73115:58;;;;-1:-1:-1;;;73115:58:0;;;;;;;:::i;:::-;73219:1;73202:14;:18;:42;;;;;73242:2;73224:14;:20;;73202:42;73194:85;;;;-1:-1:-1;;;73194:85:0;;;;;;;:::i;:::-;73309:8;;73362:10;;73346:13;73309:8;73358:1;73346:13;:::i;:::-;:26;73338:69;;;;-1:-1:-1;;;73338:69:0;;;;;;;:::i;:::-;73420:10;;73443:413;73474:14;73465:6;:23;73443:413;;;73532:29;73548:8;;73559:1;73548:12;;;;:::i;:::-;73532:15;:29::i;:::-;73524:37;;73590:35;73600:10;73612:8;;73623:1;73612:12;;;;:::i;:::-;73590:9;:35::i;:::-;73654:8;:10;;;:8;:10;;;:::i;:::-;;;;;;73705:8;;73693:20;;73742:9;73752:5;73742:16;;;;;;;:::i;:::-;;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;73809:35:0;;;;;;;;73815:10;73809:35;;;;;;;;;;;;;;;73797:8;;-1:-1:-1;73789:17:0;;;:7;:17;;;;;;;:55;;;;-1:-1:-1;;;;;;73789:55:0;-1:-1:-1;;;;;73789:55:0;;;;;;;-1:-1:-1;73789:55:0;;;;;;;;;;73490:8;;;;:::i;:::-;;;;73443:413;;76007:143;21070:6;;-1:-1:-1;;;;;21070:6:0;19859:10;21217:23;21209:68;;;;-1:-1:-1;;;21209:68:0;;;;;;;:::i;:::-;76105:37:::1;::::0;76073:21:::1;::::0;76113:10:::1;::::0;76105:37;::::1;;;::::0;76073:21;;76055:15:::1;76105:37:::0;76055:15;76105:37;76073:21;76113:10;76105:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;76044:106;76007:143::o:0;76346:188::-;76468:4;-1:-1:-1;;;;;9375:18:0;;9383:10;9375:18;9371:83;;9410:32;9431:10;9410:20;:32::i;:::-;76485:41:::1;76508:4;76514:2;76518:7;76485:22;:41::i;54941:233::-:0;55016:7;55052:30;54839:10;:17;;54751:113;55052:30;55044:5;:38;55036:95;;;;-1:-1:-1;;;55036:95:0;;11405:2:1;55036:95:0;;;11387:21:1;11444:2;11424:18;;;11417:30;11483:34;11463:18;;;11456:62;-1:-1:-1;;;11534:18:1;;;11527:42;11586:19;;55036:95:0;11203:408:1;55036:95:0;55149:10;55160:5;55149:17;;;;;;;;:::i;:::-;;;;;;;;;55142:24;;54941:233;;;:::o;61646:3153::-;61699:16;;:::i;:::-;61728:29;:3020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;;61728:3020:0;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;-1:-1:-1;;;61728:3020:0;;;;;;;;;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;;;-1:-1:-1;;;61728:3020:0;;;;;-1:-1:-1;61728:3020:0;64785:5;64776:15;;;;;;;:::i;:::-;;;;;;61646:3153;-1:-1:-1;;;61646:3153:0:o;73875:742::-;73921:9;73934:10;73921:23;73913:57;;;;-1:-1:-1;;;73913:57:0;;;;;;;:::i;:::-;73991:11;;74006:1;73991:16;73983:58;;;;-1:-1:-1;;;73983:58:0;;;;;;;:::i;:::-;74079:8;;74132:10;;74116:13;74079:8;74128:1;74116:13;:::i;:::-;:26;74108:69;;;;-1:-1:-1;;;74108:69:0;;;;;;;:::i;:::-;74198:26;;-1:-1:-1;;;74198:26:0;;74213:10;74198:26;;;1701:51:1;74232:1:0;;74198:4;;:14;;1674:18:1;;74198:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;;74227:1;74198:30;:::i;:::-;:35;;74190:103;;;;-1:-1:-1;;;74190:103:0;;11818:2:1;74190:103:0;;;11800:21:1;11857:2;11837:18;;;11830:30;11896:34;11876:18;;;11869:62;11967:25;11947:18;;;11940:53;12010:19;;74190:103:0;11616:419:1;74190:103:0;74306:10;74337:29;74353:8;;74364:1;74353:12;;;;:::i;74337:29::-;74329:37;;74387:35;74397:10;74409:8;;74420:1;74409:12;;;;:::i;74387:35::-;74443:8;:10;;;:8;:10;;;:::i;:::-;;;;;;74486:8;;74474:20;;74515:9;74525:5;74515:16;;;;;;;:::i;:::-;;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;74574:35:0;;;;;;;;74580:10;74574:35;;;;;;;;;;;;;;;74562:8;;-1:-1:-1;74554:17:0;;;:7;:17;;;;;;;:55;;;;-1:-1:-1;;;;;;74554:55:0;-1:-1:-1;;;;;74554:55:0;;;;;;;;-1:-1:-1;74554:55:0;;;;;;;;;73875:742::o;41691:239::-;41763:7;41799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41799:16:0;;41826:73;;;;-1:-1:-1;;;41826:73:0;;12242:2:1;41826:73:0;;;12224:21:1;12281:2;12261:18;;;12254:30;12320:34;12300:18;;;12293:62;-1:-1:-1;;;12371:18:1;;;12364:39;12420:19;;41826:73:0;12040:405:1;41421:208:0;41493:7;-1:-1:-1;;;;;41521:19:0;;41513:74;;;;-1:-1:-1;;;41513:74:0;;12652:2:1;41513:74:0;;;12634:21:1;12691:2;12671:18;;;12664:30;12730:34;12710:18;;;12703:62;-1:-1:-1;;;12781:18:1;;;12774:40;12831:19;;41513:74:0;12450:406:1;41513:74:0;-1:-1:-1;;;;;;41605:16:0;;;;;:9;:16;;;;;;;41421:208::o;21648:94::-;21070:6;;-1:-1:-1;;;;;21070:6:0;19859:10;21217:23;21209:68;;;;-1:-1:-1;;;21209:68:0;;;;;;;:::i;:::-;21713:21:::1;21731:1;21713:9;:21::i;:::-;21648:94::o:0;42166:104::-;42222:13;42255:7;42248:14;;;;;:::i;76796:105::-;76853:4;47039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47039:16:0;:30;;76877:16;46950:127;43849:295;19859:10;-1:-1:-1;;;;;43952:24:0;;;43944:62;;;;-1:-1:-1;;;43944:62:0;;13063:2:1;43944:62:0;;;13045:21:1;13102:2;13082:18;;;13075:30;13141:27;13121:18;;;13114:55;13186:18;;43944:62:0;12861:349:1;43944:62:0;19859:10;44019:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44019:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44019:53:0;;;;;;;;;;44088:48;;540:41:1;;;44019:42:0;;19859:10;44088:48;;513:18:1;44088:48:0;;;;;;;43849:295;;:::o;75699:296::-;21070:6;;-1:-1:-1;;;;;21070:6:0;19859:10;21217:23;21209:68;;;;-1:-1:-1;;;21209:68:0;;;;;;;:::i;:::-;75767:5:::1;75748:240;75784:5;75774:6;:15;75748:240;;75825:10;75838:23;75854:6;75838:15;:23::i;:::-;75825:36;;75886:26;75896:7;21070:6:::0;;-1:-1:-1;;;;;21070:6:0;;20997:87;75896:7:::1;75905:6;75886:9;:26::i;:::-;75947:29;;;;;;;;75953:7;21070:6:::0;;-1:-1:-1;;;;;21070:6:0;;20997:87;75953:7:::1;-1:-1:-1::0;;;;;75947:29:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;75929:15:0;;;:7:::1;:15:::0;;;;;:47;;;;-1:-1:-1;;;;;;75929:47:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;75929:47:0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;75947:29;75791:8:::1;75947:29:::0;75791:8:::1;:::i;:::-;;;;75748:240;;;;75699:296::o:0;76542:245::-;76710:4;-1:-1:-1;;;;;9375:18:0;;9383:10;9375:18;9371:83;;9410:32;9431:10;9410:20;:32::i;:::-;76732:47:::1;76755:4;76761:2;76765:7;76774:4;76732:22;:47::i;:::-;76542:245:::0;;;;;:::o;71896:707::-;71997:19;72019:16;;;:7;:16;;;;;;;;;71997:38;;71961:13;71997:38;;;;;;;-1:-1:-1;;;;;71997:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;71961:13;71997:38;72056:61;;;;-1:-1:-1;;;72056:61:0;;13417:2:1;72056:61:0;;;13399:21:1;13456:2;13436:18;;;13429:30;-1:-1:-1;;;13475:18:1;;;13468:47;13532:18;;72056:61:0;13215:341:1;72056:61:0;72244:315;72381:18;:7;:16;:18::i;:::-;72433:52;72438:6;:15;;;72455:7;72464:6;:20;;;72433:4;:52::i;:::-;72280:260;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72244:13;:315::i;:::-;72158:416;;;;;;;;:::i;:::-;;;;;;;;;;;;;72130:455;;;71896:707;;;:::o;74625:1066::-;74693:9;74706:10;74693:23;74685:57;;;;-1:-1:-1;;;74685:57:0;;;;;;;:::i;:::-;74763:11;;74778:1;74763:16;74755:58;;;;-1:-1:-1;;;74755:58:0;;;;;;;:::i;:::-;74855:1;74842:10;;:14;74834:59;;;;-1:-1:-1;;;74834:59:0;;15306:2:1;74834:59:0;;;15288:21:1;;;15325:18;;;15318:30;15384:34;15364:18;;;15357:62;15436:18;;74834:59:0;15104:356:1;74834:59:0;74939:1;74922:14;:18;:42;;;;;74962:2;74944:14;:20;;74922:42;74914:85;;;;-1:-1:-1;;;74914:85:0;;;;;;;:::i;:::-;75037:8;;75103:10;;75074:26;75086:14;75037:8;75074:26;:::i;:::-;:39;75066:82;;;;-1:-1:-1;;;75066:82:0;;;;;;;:::i;:::-;75200:9;75182:14;75169:10;;:27;;;;:::i;:::-;:40;;75161:72;;;;-1:-1:-1;;;75161:72:0;;15840:2:1;75161:72:0;;;15822:21:1;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15898:18:1;;;15891:49;15957:18;;75161:72:0;15638:343:1;75161:72:0;75246:10;;75269:413;75300:14;75291:6;:23;75269:413;;;75358:29;75374:8;;75385:1;75374:12;;;;:::i;75358:29::-;75350:37;;75416:35;75426:10;75438:8;;75449:1;75438:12;;;;:::i;75416:35::-;75480:8;:10;;;:8;:10;;;:::i;:::-;;;;;;75531:8;;75519:20;;75568:9;75578:5;75568:16;;;;;;;:::i;:::-;;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;75635:35:0;;;;;;;;75641:10;75635:35;;;;;;;;;;;;;;;75623:8;;-1:-1:-1;75615:17:0;;;:7;:17;;;;;;;:55;;;;-1:-1:-1;;;;;;75615:55:0;-1:-1:-1;;;;;75615:55:0;;;;;;;-1:-1:-1;75615:55:0;;;;;;;;;;75316:8;;;;:::i;:::-;;;;75269:413;;21897:192;21070:6;;-1:-1:-1;;;;;21070:6:0;19859:10;21217:23;21209:68;;;;-1:-1:-1;;;21209:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21986:22:0;::::1;21978:73;;;::::0;-1:-1:-1;;;21978:73:0;;16188:2:1;21978:73:0::1;::::0;::::1;16170:21:1::0;16227:2;16207:18;;;16200:30;16266:34;16246:18;;;16239:62;-1:-1:-1;;;16317:18:1;;;16310:36;16363:19;;21978:73:0::1;15986:402:1::0;21978:73:0::1;22062:19;22072:8;22062:9;:19::i;54111:224::-:0;54213:4;-1:-1:-1;;;;;;54237:50:0;;-1:-1:-1;;;54237:50:0;;:90;;;54291:36;54315:11;54291:23;:36::i;50932:174::-;51007:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51007:29:0;-1:-1:-1;;;;;51007:29:0;;;;;;;;:24;;51061:23;51007:24;51061:14;:23::i;:::-;-1:-1:-1;;;;;51052:46:0;;;;;;;;;;;50932:174;;:::o;9792:647::-;195:42;9983:45;:49;9979:453;;10282:67;;-1:-1:-1;;;10282:67:0;;10333:4;10282:67;;;16605:34:1;-1:-1:-1;;;;;16675:15:1;;16655:18;;;16648:43;195:42:0;;10282;;16540:18:1;;10282:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10277:144;;10377:28;;-1:-1:-1;;;10377:28:0;;-1:-1:-1;;;;;1719:32:1;;10377:28:0;;;1701:51:1;1674:18;;10377:28:0;1555:203:1;44446:339:0;44641:41;19859:10;44674:7;44641:18;:41::i;:::-;44633:103;;;;-1:-1:-1;;;44633:103:0;;;;;;;:::i;:::-;44749:28;44759:4;44765:2;44769:7;44749:9;:28::i;64807:915::-;64869:4;64896:7;64952:2;64938:8;64921:26;;;;;;17499:19:1;;17543:2;17534:12;;17370:182;64921:26:0;;;;;;;;;;;;;64911:37;;;;;;64906:43;;:48;;;;:::i;:::-;65008:39;;;;;;;;;;64896:58;;-1:-1:-1;64896:58:0;;-1:-1:-1;;65038:9:0;;65008:39;;65038:9;65008:39;;;;;;;;;;;;;;;;;;;;;;;;65058:23;:296;;;;;;;;65094:2;65058:296;;;;65103:3;65058:296;;;;65113:3;65058:296;;;;65123:3;65058:296;;;;65133:3;65058:296;;;;65143:3;65058:296;;;;65153:2;65058:296;;;;65162:3;65058:296;;;;65172:3;65058:296;;;;65182:3;65058:296;;;;65192:3;65058:296;;;;65202:3;65058:296;;;;65212:3;65058:296;;;;65222:3;65058:296;;;;65232:3;65058:296;;;;65242:3;65058:296;;;;65252:3;65058:296;;;;65262:2;65058:296;;;;65271:2;65058:296;;;;65280:3;65058:296;;;;65290:3;65058:296;;;;65300:3;65058:296;;;;65310:3;65058:296;;;;65320:2;65058:296;;;;65329:3;65058:296;;;;65339:3;65058:296;;;;65349:3;65058:296;;;;;65367:316;65395:7;65403:2;65395:11;;;;;;;:::i;:::-;;;;;65374:10;65385:2;65374:14;;;;;;;:::i;:::-;;;;;:18;;65391:1;65374:18;:::i;:::-;:32;65367:316;;;65432:4;;;;:::i;:::-;;;;65475:2;65469;:8;65465:68;;65516:1;65511:6;;65465:68;65571:2;65565;:8;65561:111;;65607:49;;-1:-1:-1;;;65607:49:0;;18008:2:1;65607:49:0;;;17990:21:1;18047:2;18027:18;;;18020:30;18086:34;18066:18;;;18059:62;-1:-1:-1;;;18137:18:1;;;18130:37;18184:19;;65607:49:0;17806:403:1;65561:111:0;65367:316;;;-1:-1:-1;65710:2:0;;64807:915;-1:-1:-1;;;;64807:915:0:o;47934:110::-;48010:26;48020:2;48024:7;48010:26;;;;;;;;;;;;:9;:26::i;44856:185::-;44994:39;45011:4;45017:2;45021:7;44994:39;;;;;;;;;;;;:16;:39::i;22097:173::-;22172:6;;;-1:-1:-1;;;;;22189:17:0;;;-1:-1:-1;;;;;;22189:17:0;;;;;;;22222:40;;22172:6;;;22189:17;22172:6;;22222:40;;22153:16;;22222:40;22142:128;22097:173;:::o;45112:328::-;45287:41;19859:10;45320:7;45287:18;:41::i;:::-;45279:103;;;;-1:-1:-1;;;45279:103:0;;;;;;;:::i;:::-;45393:39;45407:4;45413:2;45417:7;45426:5;45393:13;:39::i;17389:723::-;17445:13;17666:5;17675:1;17666:10;17662:53;;-1:-1:-1;;17693:10:0;;;;;;;;;;;;-1:-1:-1;;;17693:10:0;;;;;17389:723::o;17662:53::-;17740:5;17725:12;17781:78;17788:9;;17781:78;;17814:8;;;;:::i;:::-;;-1:-1:-1;17837:10:0;;-1:-1:-1;17845:2:0;17837:10;;:::i;:::-;;;17781:78;;;17869:19;17901:6;17891:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17891:17:0;;17869:39;;17919:154;17926:10;;17919:154;;17953:11;17963:1;17953:11;;:::i;:::-;;-1:-1:-1;18022:10:0;18030:2;18022:5;:10;:::i;:::-;18009:24;;:2;:24;:::i;:::-;17996:39;;17979:6;17986;17979:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17979:56:0;;;;;;;;-1:-1:-1;18050:11:0;18059:2;18050:11;;:::i;:::-;;;17919:154;;;18097:6;17389:723;-1:-1:-1;;;;17389:723:0:o;70963:872::-;71044:12;71080:18;71101:90;71181:8;71164:26;;;;;;;18621:2:1;18617:15;;;;-1:-1:-1;;18613:53:1;18601:66;;18692:2;18683:12;;18472:229;71164:26:0;;;;-1:-1:-1;;71164:26:0;;;;;;;;;;71128;;17499:19:1;;;71164:26:0;17534:12:1;71128:26:0;;;-1:-1:-1;;71128:26:0;;;;;;;;;71118:37;;71128:26;71118:37;;;;71101:55;;;17499:19:1;17534:12;71101:55:0;;;-1:-1:-1;;71101:55:0;;;;;;;;;;:62;:90::i;:::-;71080:111;;71212:25;71240:17;71251:5;71240:10;:17::i;:::-;71212:45;;71270:9;71282:20;71296:5;71282:13;:20::i;:::-;71270:32;;71316:15;71333:7;71344:50;71349:8;71359:28;71375:5;71382:4;71359:15;:28::i;:::-;71389:4;71344;:50::i;:::-;71499:11;;71315:79;;-1:-1:-1;71315:79:0;-1:-1:-1;71570:22:0;71571:9;71315:79;71571:4;:9;:::i;:::-;71570:20;:22::i;:::-;71651:15;:4;:13;:15::i;:::-;71725:13;:2;:11;:13::i;:::-;71797:17;71811:2;71797:13;:17::i;:::-;71414:411;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71407:418;;;;;;;70963:872;;;;;;:::o;11592:2037::-;11650:13;11680:4;:11;11695:1;11680:16;11676:31;;-1:-1:-1;;11698:9:0;;;;;;;;;-1:-1:-1;11698:9:0;;;11592:2037::o;11676:31::-;11767:19;11789:5;;;;;;;;;;;;;;;;;11767:27;;11846:18;11892:1;11873:4;:11;11887:1;11873:15;;;;:::i;:::-;11872:21;;;;:::i;:::-;11867:27;;:1;:27;:::i;:::-;11846:48;-1:-1:-1;11977:20:0;12011:15;11846:48;12024:2;12011:15;:::i;:::-;12000:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12000:27:0;;11977:50;;12124:10;12116:6;12109:26;12231:1;12224:5;12220:13;12302:4;12353;12347:11;12338:7;12334:25;12461:2;12453:6;12449:15;12546:810;12565:6;12556:7;12553:19;12546:810;;;12631:1;12618:15;;;12712:14;;12865:4;12853:2;12849:14;;;12845:25;;12831:40;;12825:47;12820:3;12816:57;;;12798:76;;12993:2;12989:14;;;12985:25;;12971:40;;12965:47;12956:57;;12919:1;12904:17;;12938:76;13134:1;13129:14;;;13125:25;;13111:40;;13105:47;13096:57;;13044:17;;;13078:76;13265:25;;13251:40;;13245:47;13236:57;;13184:17;;;13218:76;;;;13324:17;;12546:810;;;13441:1;13434:4;13428:11;13424:19;13462:1;13457:54;;;;13530:1;13525:52;;;;13417:160;;13457:54;-1:-1:-1;;;;;13473:17:0;;13466:43;13457:54;;13525:52;-1:-1:-1;;;;;13541:17:0;;13534:41;13417:160;-1:-1:-1;13615:6:0;;11592:2037;-1:-1:-1;;;;;;;;11592:2037:0:o;41052:305::-;41154:4;-1:-1:-1;;;;;;41191:40:0;;-1:-1:-1;;;41191:40:0;;:105;;-1:-1:-1;;;;;;;41248:48:0;;-1:-1:-1;;;41248:48:0;41191:105;:158;;;-1:-1:-1;;;;;;;;;;33116:40:0;;;41313:36;33007:157;47244:348;47337:4;47039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47039:16:0;47354:73;;;;-1:-1:-1;;;47354:73:0;;21377:2:1;47354:73:0;;;21359:21:1;21416:2;21396:18;;;21389:30;21455:34;21435:18;;;21428:62;-1:-1:-1;;;21506:18:1;;;21499:42;21558:19;;47354:73:0;21175:408:1;47354:73:0;47438:13;47454:23;47469:7;47454:14;:23::i;:::-;47438:39;;47507:5;-1:-1:-1;;;;;47496:16:0;:7;-1:-1:-1;;;;;47496:16:0;;:51;;;;47540:7;-1:-1:-1;;;;;47516:31:0;:20;47528:7;47516:11;:20::i;:::-;-1:-1:-1;;;;;47516:31:0;;47496:51;:87;;;-1:-1:-1;;;;;;44336:25:0;;;44312:4;44336:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;47551:32;44215:164;50236:578;50395:4;-1:-1:-1;;;;;50368:31:0;:23;50383:7;50368:14;:23::i;:::-;-1:-1:-1;;;;;50368:31:0;;50360:85;;;;-1:-1:-1;;;50360:85:0;;21790:2:1;50360:85:0;;;21772:21:1;21829:2;21809:18;;;21802:30;21868:34;21848:18;;;21841:62;-1:-1:-1;;;21919:18:1;;;21912:39;21968:19;;50360:85:0;21588:405:1;50360:85:0;-1:-1:-1;;;;;50464:16:0;;50456:65;;;;-1:-1:-1;;;50456:65:0;;22200:2:1;50456:65:0;;;22182:21:1;22239:2;22219:18;;;22212:30;22278:34;22258:18;;;22251:62;-1:-1:-1;;;22329:18:1;;;22322:34;22373:19;;50456:65:0;21998:400:1;50456:65:0;50534:39;50555:4;50561:2;50565:7;50534:20;:39::i;:::-;50638:29;50655:1;50659:7;50638:8;:29::i;:::-;-1:-1:-1;;;;;50680:15:0;;;;;;:9;:15;;;;;:20;;50699:1;;50680:15;:20;;50699:1;;50680:20;:::i;:::-;;;;-1:-1:-1;;;;;;;50711:13:0;;;;;;:9;:13;;;;;:18;;50728:1;;50711:13;:18;;50728:1;;50711:18;:::i;:::-;;;;-1:-1:-1;;50740:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50740:21:0;-1:-1:-1;;;;;50740:21:0;;;;;;;;;50779:27;;50740:16;;50779:27;;;;;;;50236:578;;;:::o;48271:321::-;48401:18;48407:2;48411:7;48401:5;:18::i;:::-;48452:54;48483:1;48487:2;48491:7;48500:5;48452:22;:54::i;:::-;48430:154;;;;-1:-1:-1;;;48430:154:0;;;;;;;:::i;46322:315::-;46479:28;46489:4;46495:2;46499:7;46479:9;:28::i;:::-;46526:48;46549:4;46555:2;46559:7;46568:5;46526:22;:48::i;:::-;46518:111;;;;-1:-1:-1;;;46518:111:0;;;;;;;:::i;14034:3031::-;14174:12;14204:22;14414:4;14408:11;14395:24;;14575:9;14569:16;14617:6;14606:9;14599:25;14864:4;14853:9;14849:20;15016:6;15012:2;15008:15;15215:4;15204:9;15200:20;15039:537;15243:3;15239:2;15236:11;15039:537;;;15551:9;;15540:21;;15352:4;15344:13;;;;15381;15039:537;;;-1:-1:-1;15792:17:0;;15853:16;;15841:29;;15823:48;;15792:17;-1:-1:-1;16019:3:0;-1:-1:-1;16159:15:0;;;16239:4;16223:21;;16190:228;16267:3;16263:2;16260:11;16190:228;;;16393:9;;16382:21;;16305:4;16297:13;;;;16334;16190:228;;;-1:-1:-1;16915:16:0;;16903:29;;;;16896:37;16887:47;;;;16960:2;16883:56;-1:-1:-1;;16863:154:0;16857:4;16850:168;-1:-1:-1;17048:9:0;-1:-1:-1;14034:3031:0;;;;:::o;61256:378::-;61321:4;61348:26;:111;;;;;;;;61383:2;61348:111;;;;61392:2;61348:111;;;;61401:2;61348:111;;;;61410:2;61348:111;;;;61419:2;61348:111;;;;61428:2;61348:111;;;;61437:2;61348:111;;;;61446:2;61348:111;;;;61455:2;61348:111;;;;;61472:9;61484:11;61565:18;61560:1;61533:5;61552:1;61539:5;:12;:14;;;;:::i;:::-;61533:21;;;;;;;;:::i;:::-;;;;;;;;;61527:28;;61522:34;;61509:5;61515:1;61509:8;;;;;;;;:::i;:::-;;;;;61498:58;;;61509:8;;61498:58;:::i;:::-;61497:64;;;;:::i;:::-;61496:87;;;;:::i;:::-;61484:100;;;;;;;:::i;:::-;;;;;;61256:378;-1:-1:-1;;;;61256:378:0:o;67080:1494::-;67158:17;67198:23;:373;;;;;;;;67230:1;67198:373;;;;67238:1;67198:373;;;;67246:1;67198:373;;;;67254:1;67198:373;;;;67262:1;67198:373;;;;67270:1;67198:373;;;;67278:1;67198:373;;;;67286:1;67198:373;;;;67294:1;67198:373;;;;67302:1;67198:373;;;;67310:1;67198:373;;;;67318:1;67198:373;;;;67326:1;67198:373;;;;67334:1;67198:373;;;;67342:1;67198:373;;;;67350:1;67198:373;;;;67358:1;67198:373;;;;67366:1;67198:373;;;;67374:1;67198:373;;;;67382:1;67198:373;;;;67390:1;67198:373;;;;67398:1;67198:373;;;;67406:1;67198:373;;;;67414:1;67198:373;;;;67422:1;67198:373;;;;67430:1;67198:373;;;;67438:1;67198:373;;;;67446:1;67198:373;;;;67454:1;67198:373;;;;67462:1;67198:373;;;;67470:1;67198:373;;;;67478:1;67198:373;;;;67486:2;67198:373;;;;67495:2;67198:373;;;;67504:2;67198:373;;;;67513:2;67198:373;;;;67522:2;67198:373;;;;67531:2;67198:373;;;;67540:2;67198:373;;;;67549:2;67198:373;;;;67558:2;67198:373;;;;67567:2;67198:373;;;;;67582:8;67605:7;67623;67641;67659;67688:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;67688:18:0;67719:28;67765:4;67750:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;67750:20:0;;;;;;;;;;;;;;;;;67719:51;;67788:7;67783:754;67806:4;67801:2;:9;67783:754;;;67847:1;67842:6;;67883:595;67934:5;67946;:12;67940:3;:18;;;;:::i;:::-;67934:25;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;68003:7:0;68011;68016:2;67934:25;68011:7;:::i;:::-;68003:16;;;;;;;:::i;:::-;;;;;67998:21;;68072:5;68088;:12;68079:3;68083:1;68079:5;;;;:::i;:::-;68078:22;;;;:::i;:::-;68072:29;;;;;;;;:::i;:::-;;;;;68129:78;;;;;;;;;68072:29;;;;;;-1:-1:-1;68129:78:0;68138:31;68161:3;68152:4;:2;68155:1;68152:4;:::i;:::-;68146:11;;:2;:11;:::i;:::-;68145:19;;;;:::i;:::-;68166:2;68138:6;:31::i;:::-;68129:78;;;;68171:31;68194:3;68185:4;:2;68188:1;68185:4;:::i;:::-;68179:11;;:2;:11;:::i;68171:31::-;68129:78;;;;;;;68124:83;-1:-1:-1;68244:8:0;68251:1;68244:8;;:::i;:::-;;-1:-1:-1;68289:4:0;;;;:::i;:::-;;;;68339:2;68334;:7;68383:5;68330:78;68445:31;68455:10;68467:2;68471:4;68445:9;:31::i;:::-;67883:595;;;68523:2;68506:10;68517:2;68506:14;;;;;;;;:::i;:::-;;;;;;:19;;;;67812:4;;;;;:::i;:::-;;;;67783:754;;;-1:-1:-1;68556:10:0;67080:1494;-1:-1:-1;;;;;;;;;;67080:1494:0:o;69506:1449::-;69703:52;;;;;;;;;;;;;;;;;-1:-1:-1;;;69703:52:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69703:52:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69703:52:0;;;;-1:-1:-1;;;69703:52:0;;;;;;;;;;;-1:-1:-1;;;69703:52:0;;;;69602:15;-1:-1:-1;;;69703:52:0;;;;69766:46;;;;;;;;;;;;;;-1:-1:-1;;;69766:46:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69766:46:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69766:46:0;;;;-1:-1:-1;;;69766:46:0;;;;;;;;;;;;-1:-1:-1;;;69766:46:0;;;;-1:-1:-1;;;69766:46:0;;;;69619:7;;69602:15;;;;69703:52;69619:7;69852:571;69875:4;69870:2;:9;69852:571;;;69916:407;69998:19;:2;70001;69998:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;70027;:2;70030;70027:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;70055;:2;70058;70055:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;70087:8;70097:6;70102:1;70097:2;:6;:::i;:::-;70096:10;;70105:1;70096:10;:::i;:::-;70087:20;;;;;;;:::i;:::-;;;;;70249:2;70252:6;70257:1;70252:2;:6;:::i;:::-;70249:10;;;;;;;:::i;:::-;;;;;69944:364;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69944:364:0;;;;;;;;;69916:2;;:9;:407::i;:::-;69911:412;-1:-1:-1;70363:48:0;70373:2;70377:8;70386:1;70377:11;;;;70390:2;70394:4;70400:2;70404;70408;70363:9;:48::i;:::-;70352:59;-1:-1:-1;70352:59:0;-1:-1:-1;69881:4:0;;;;:::i;:::-;;;;69852:571;;;-1:-1:-1;70608:11:0;;;;;70458:326;;70448:337;;70458:326;;70608:11;70458:326;;:::i;:::-;;;;-1:-1:-1;;70458:326:0;;;;;;;;;70448:2;;:9;:337::i;:::-;70443:342;-1:-1:-1;70801:13:0;70443:342;70811:2;70801:9;:13::i;:::-;70796:18;;70830:35;70840:24;;;;;;-1:-1:-1;;;26985:19:1;;27029:1;27020:11;;26783:254;70830:35:0;70825:40;-1:-1:-1;70881:13:0;70825:40;70891:2;70881:9;:13::i;:::-;70876:18;;70910:37;70920:26;;;;;;-1:-1:-1;;;27244:21:1;;27290:1;27281:11;;27042:256;70910:37:0;70905:42;;69627:1328;;;;69506:1449;;;;;;:::o;77096:187::-;77231:44;77258:4;77264:2;77268:6;77231:26;:44::i;48928:382::-;-1:-1:-1;;;;;49008:16:0;;49000:61;;;;-1:-1:-1;;;49000:61:0;;27505:2:1;49000:61:0;;;27487:21:1;;;27524:18;;;27517:30;27583:34;27563:18;;;27556:62;27635:18;;49000:61:0;27303:356:1;49000:61:0;47015:4;47039:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47039:16:0;:30;49072:58;;;;-1:-1:-1;;;49072:58:0;;27866:2:1;49072:58:0;;;27848:21:1;27905:2;27885:18;;;27878:30;27944;27924:18;;;27917:58;27992:18;;49072:58:0;27664:352:1;49072:58:0;49143:45;49172:1;49176:2;49180:7;49143:20;:45::i;:::-;-1:-1:-1;;;;;49201:13:0;;;;;;:9;:13;;;;;:18;;49218:1;;49201:13;:18;;49218:1;;49201:18;:::i;:::-;;;;-1:-1:-1;;49230:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49230:21:0;-1:-1:-1;;;;;49230:21:0;;;;;;;;49269:33;;49230:16;;;49269:33;;49230:16;;49269:33;48928:382;;:::o;51671:799::-;51826:4;-1:-1:-1;;;;;51847:13:0;;23372:20;23420:8;51843:620;;51883:72;;-1:-1:-1;;;51883:72:0;;-1:-1:-1;;;;;51883:36:0;;;;;:72;;19859:10;;51934:4;;51940:7;;51949:5;;51883:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51883:72:0;;;;;;;;-1:-1:-1;;51883:72:0;;;;;;;;;;;;:::i;:::-;;;51879:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52125:6;:13;52142:1;52125:18;52121:272;;52168:60;;-1:-1:-1;;;52168:60:0;;;;;;;:::i;52121:272::-;52343:6;52337:13;52328:6;52324:2;52320:15;52313:38;51879:529;-1:-1:-1;;;;;;52006:51:0;-1:-1:-1;;;52006:51:0;;-1:-1:-1;51999:58:0;;51843:620;-1:-1:-1;52447:4:0;51671:799;;;;;;:::o;66400:154::-;66456:4;66495:2;66490;:7;:46;;66516:3;66506:7;66511:2;66506;:7;:::i;:::-;:13;:29;;66533:2;66490:46;;66506:29;66522:8;66528:2;66522:3;:8;:::i;:::-;66490:46;;;-1:-1:-1;66500:2:0;66483:53;-1:-1:-1;66400:154:0:o;66562:506::-;66664:4;66695:10;:17;66716:1;66695:22;66691:76;;-1:-1:-1;66750:5:0;66743:12;;66691:76;66792:11;66787:241;66818:4;66809:6;:13;66787:241;;;66936:10;66947:6;66936:18;;;;;;;;:::i;:::-;;;;;;;:20;;;66929:2;:4;;;:27;;;;:::i;:::-;66862:64;66871:2;:4;;;66877:2;:4;;;66883:10;66894:6;66883:18;;;;;;;;:::i;:::-;;;;;;;:20;;;66905:10;66916:6;66905:18;;;;;;;;:::i;:::-;;;;;;;:20;;;66862:8;:64::i;:::-;:94;66858:159;;;66997:4;66990:11;;;;;66858:159;66824:8;;;;:::i;:::-;;;;66787:241;;;-1:-1:-1;67055:5:0;;66562:506;-1:-1:-1;;;;66562:506:0:o;68586:908::-;68734:12;68748:4;68775:7;68800;68795:656;68818:4;68813:2;:9;68795:656;;;68864:2;68858;:8;68854:586;;68905:48;68914:2;68917;68914:6;;;;;;;;:::i;:::-;;;;;;;:8;;;68924:2;68927;68924:6;;;;;;;;:::i;:::-;;;;;;;:8;;;68934:2;68937;68934:6;;;;;;;;:::i;:::-;;;;;;;:8;;;68944:2;68947;68944:6;;;;;;;;:::i;68905:48::-;68900:53;;68981:1;68976:2;:6;:17;;;;;68991:2;68986;:7;68976:17;68972:453;;;69035:4;;;;:::i;:::-;;;;69067:316;69163:19;:2;69166;69163:6;;;;;;;;:::i;:19::-;69192;:2;69195;69192:6;;;;;;;;:::i;:19::-;69221;:2;69224;69221:6;;;;;;;;:::i;:19::-;69250;:2;69253;69250:6;;;;;;;;:::i;:19::-;69284:2;69309;69312:14;69317:9;69312:2;:14;:::i;:::-;69309:18;;;;;;;:::i;:::-;;;;;69103:257;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69103:257:0;;;;;;;;;69067:2;;:9;:316::i;:::-;69062:321;;68972:453;68824:4;;;;:::i;:::-;;;;68795:656;;;-1:-1:-1;69479:2:0;;69483;;-1:-1:-1;68586:908:0;;-1:-1:-1;;;;;;;68586:908:0:o;55787:589::-;-1:-1:-1;;;;;55993:18:0;;55989:187;;56028:40;56060:7;57203:10;:17;;57176:24;;;;:15;:24;;;;;:44;;;57231:24;;;;;;;;;;;;57099:164;56028:40;55989:187;;;56098:2;-1:-1:-1;;;;;56090:10:0;:4;-1:-1:-1;;;;;56090:10:0;;56086:90;;56117:47;56150:4;56156:7;56117:32;:47::i;:::-;-1:-1:-1;;;;;56190:16:0;;56186:183;;56223:45;56260:7;56223:36;:45::i;56186:183::-;56296:4;-1:-1:-1;;;;;56290:10:0;:2;-1:-1:-1;;;;;56290:10:0;;56286:83;;56317:40;56345:2;56349:7;56317:27;:40::i;65965:241::-;66041:4;66068:6;66082:2;66077;:7;:27;;66097:7;66102:2;66097;:7;:::i;:::-;66077:27;;;66087:7;66092:2;66087;:7;:::i;:::-;66068:36;;66115:6;66129:2;66124;:7;:27;;66144:7;66149:2;66144;:7;:::i;:::-;66124:27;;;66134:7;66139:2;66134;:7;:::i;:::-;66115:36;-1:-1:-1;66169:19:0;66182:5;66115:36;;66182:5;:::i;:::-;66174;66178:1;;66174:5;:::i;:::-;:13;;;;:::i;:::-;66169:4;:19::i;:::-;66162:26;65965:241;-1:-1:-1;;;;;;;65965:241:0:o;57890:988::-;58156:22;58206:1;58181:22;58198:4;58181:16;:22::i;:::-;:26;;;;:::i;:::-;58218:18;58239:26;;;:17;:26;;;;;;58156:51;;-1:-1:-1;58372:28:0;;;58368:328;;-1:-1:-1;;;;;58439:18:0;;58417:19;58439:18;;;:12;:18;;;;;;;;:34;;;;;;;;;58490:30;;;;;;:44;;;58607:30;;:17;:30;;;;;:43;;;58368:328;-1:-1:-1;58792:26:0;;;;:17;:26;;;;;;;;58785:33;;;-1:-1:-1;;;;;58836:18:0;;;;;:12;:18;;;;;:34;;;;;;;58829:41;57890:988::o;59173:1079::-;59451:10;:17;59426:22;;59451:21;;59471:1;;59451:21;:::i;:::-;59483:18;59504:24;;;:15;:24;;;;;;59877:10;:26;;59426:46;;-1:-1:-1;59504:24:0;;59426:46;;59877:26;;;;;;:::i;:::-;;;;;;;;;59855:48;;59941:11;59916:10;59927;59916:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;60021:28;;;:15;:28;;;;;;;:41;;;60193:24;;;;;60186:31;60228:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59244:1008;;;59173:1079;:::o;56677:221::-;56762:14;56779:20;56796:2;56779:16;:20::i;:::-;-1:-1:-1;;;;;56810:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;56855:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;56677:221:0:o;65730:227::-;65774:6;;65822:1;65813:5;:1;65817;65813:5;:::i;:::-;65812:11;;;;:::i;:::-;65803:20;;65838:1;65834:5;;65850:90;65861:1;65857;:5;65850:90;;;65893:1;-1:-1:-1;65893:1:0;65927;65893;65914:5;65893:1;65914;:5;:::i;:::-;:9;;;;:::i;:::-;65913:15;;;;:::i;:::-;65909:19;;65850:90;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1860:70;1763:173;;;:::o;1941:254::-;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2382:328::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2567:29;2586:9;2567:29;:::i;:::-;2557:39;;2615:38;2649:2;2638:9;2634:18;2615:38;:::i;:::-;2605:48;;2700:2;2689:9;2685:18;2672:32;2662:42;;2382:328;;;;;:::o;2954:700::-;3141:2;3193:21;;;3112:4;;3300:3;3285:19;;3166:18;;;3327:6;3112:4;3361:264;3375:4;3372:1;3369:11;3361:264;;;3466:2;3462:7;3450:9;3442:6;3438:22;3434:36;3429:3;3422:49;3494:51;3538:6;3529;3523:13;3494:51;:::i;:::-;3484:61;-1:-1:-1;3603:12:1;;;;3568:15;;;;3395:1;3388:9;3361:264;;;-1:-1:-1;3642:6:1;;2954:700;-1:-1:-1;;;;;;2954:700:1:o;3659:186::-;3718:6;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;3810:29;3829:9;3810:29;:::i;3850:118::-;3936:5;3929:13;3922:21;3915:5;3912:32;3902:60;;3958:1;3955;3948:12;3973:315;4038:6;4046;4099:2;4087:9;4078:7;4074:23;4070:32;4067:52;;;4115:1;4112;4105:12;4067:52;4138:29;4157:9;4138:29;:::i;:::-;4128:39;;4217:2;4206:9;4202:18;4189:32;4230:28;4252:5;4230:28;:::i;:::-;4277:5;4267:15;;;3973:315;;;;;:::o;4293:127::-;4354:10;4349:3;4345:20;4342:1;4335:31;4385:4;4382:1;4375:15;4409:4;4406:1;4399:15;4425:1138;4520:6;4528;4536;4544;4597:3;4585:9;4576:7;4572:23;4568:33;4565:53;;;4614:1;4611;4604:12;4565:53;4637:29;4656:9;4637:29;:::i;:::-;4627:39;;4685:38;4719:2;4708:9;4704:18;4685:38;:::i;:::-;4675:48;;4770:2;4759:9;4755:18;4742:32;4732:42;;4825:2;4814:9;4810:18;4797:32;4848:18;4889:2;4881:6;4878:14;4875:34;;;4905:1;4902;4895:12;4875:34;4943:6;4932:9;4928:22;4918:32;;4988:7;4981:4;4977:2;4973:13;4969:27;4959:55;;5010:1;5007;5000:12;4959:55;5046:2;5033:16;5068:2;5064;5061:10;5058:36;;;5074:18;;:::i;:::-;5149:2;5143:9;5117:2;5203:13;;-1:-1:-1;;5199:22:1;;;5223:2;5195:31;5191:40;5179:53;;;5247:18;;;5267:22;;;5244:46;5241:72;;;5293:18;;:::i;:::-;5333:10;5329:2;5322:22;5368:2;5360:6;5353:18;5408:7;5403:2;5398;5394;5390:11;5386:20;5383:33;5380:53;;;5429:1;5426;5419:12;5380:53;5485:2;5480;5476;5472:11;5467:2;5459:6;5455:15;5442:46;5530:1;5525:2;5520;5512:6;5508:15;5504:24;5497:35;5551:6;5541:16;;;;;;;4425:1138;;;;;;;:::o;5568:260::-;5636:6;5644;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5736:29;5755:9;5736:29;:::i;:::-;5726:39;;5784:38;5818:2;5807:9;5803:18;5784:38;:::i;:::-;5774:48;;5568:260;;;;;:::o;5833:380::-;5912:1;5908:12;;;;5955;;;5976:61;;6030:4;6022:6;6018:17;6008:27;;5976:61;6083:2;6075:6;6072:14;6052:18;6049:38;6046:161;;6129:10;6124:3;6120:20;6117:1;6110:31;6164:4;6161:1;6154:15;6192:4;6189:1;6182:15;7870:184;7940:6;7993:2;7981:9;7972:7;7968:23;7964:32;7961:52;;;8009:1;8006;7999:12;7961:52;-1:-1:-1;8032:16:1;;7870:184;-1:-1:-1;7870:184:1:o;8467:345::-;8669:2;8651:21;;;8708:2;8688:18;;;8681:30;-1:-1:-1;;;8742:2:1;8727:18;;8720:51;8803:2;8788:18;;8467:345::o;8817:127::-;8878:10;8873:3;8869:20;8866:1;8859:31;8909:4;8906:1;8899:15;8933:4;8930:1;8923:15;8949:125;9014:9;;;9035:10;;;9032:36;;;9048:18;;:::i;9853:353::-;10055:2;10037:21;;;10094:2;10074:18;;;10067:30;10133:31;10128:2;10113:18;;10106:59;10197:2;10182:18;;9853:353::o;10211:354::-;10413:2;10395:21;;;10452:2;10432:18;;;10425:30;10491:32;10486:2;10471:18;;10464:60;10556:2;10541:18;;10211:354::o;10570:135::-;10609:3;10630:17;;;10627:43;;10650:18;;:::i;:::-;-1:-1:-1;10697:1:1;10686:13;;10570:135::o;10710:127::-;10771:10;10766:3;10762:20;10759:1;10752:31;10802:4;10799:1;10792:15;10826:4;10823:1;10816:15;10842:356;11044:2;11026:21;;;11063:18;;;11056:30;11122:34;11117:2;11102:18;;11095:62;11189:2;11174:18;;10842:356::o;13561:198::-;13603:3;13641:5;13635:12;13656:65;13714:6;13709:3;13702:4;13695:5;13691:16;13656:65;:::i;:::-;13737:16;;;;;13561:198;-1:-1:-1;;13561:198:1:o;13764:869::-;14175:66;14170:3;14163:79;14145:3;14271:6;14265:13;14287:75;14355:6;14350:2;14345:3;14341:12;14334:4;14326:6;14322:17;14287:75;:::i;:::-;14422:13;;14381:16;;;;14444:76;14422:13;14506:2;14498:11;;14491:4;14479:17;;14444:76;:::i;:::-;-1:-1:-1;;;14580:2:1;14539:17;;;;14572:11;;;14565:35;14624:2;14616:11;;13764:869;-1:-1:-1;;;;13764:869:1:o;14638:461::-;14900:31;14895:3;14888:44;14870:3;14961:6;14955:13;14977:75;15045:6;15040:2;15035:3;15031:12;15024:4;15016:6;15012:17;14977:75;:::i;:::-;15072:16;;;;15090:2;15068:25;;14638:461;-1:-1:-1;;14638:461:1:o;15465:168::-;15538:9;;;15569;;15586:15;;;15580:22;;15566:37;15556:71;;15607:18;;:::i;16702:245::-;16769:6;16822:2;16810:9;16801:7;16797:23;16793:32;16790:52;;;16838:1;16835;16828:12;16790:52;16870:9;16864:16;16889:28;16911:5;16889:28;:::i;16952:413::-;17154:2;17136:21;;;17193:2;17173:18;;;17166:30;17232:34;17227:2;17212:18;;17205:62;-1:-1:-1;;;17298:2:1;17283:18;;17276:47;17355:3;17340:19;;16952:413::o;17557:127::-;17618:10;17613:3;17609:20;17606:1;17599:31;17649:4;17646:1;17639:15;17673:4;17670:1;17663:15;17689:112;17721:1;17747;17737:35;;17752:18;;:::i;:::-;-1:-1:-1;17786:9:1;;17689:112::o;18214:120::-;18254:1;18280;18270:35;;18285:18;;:::i;:::-;-1:-1:-1;18319:9:1;;18214:120::o;18339:128::-;18406:9;;;18427:11;;;18424:37;;;18441:18;;:::i;19117:2053::-;19975:66;19970:3;19963:79;20081:38;20076:3;20072:48;20067:2;20062:3;20058:12;20051:70;19945:3;20150:6;20144:13;20166:73;20232:6;20227:2;20222:3;20218:12;20213:2;20205:6;20201:15;20166:73;:::i;:::-;20303:66;20298:2;20258:16;;;20290:11;;;20283:87;-1:-1:-1;;;20394:2:1;20386:11;;20379:51;20455:13;;20477:74;20455:13;20537:2;20529:11;;20524:2;20512:15;;20477:74;:::i;:::-;20616:66;20611:2;20570:17;;;;20603:11;;;20596:87;-1:-1:-1;;;20754:3:1;20746:12;;20739:24;;;20788:13;;20810:75;20788:13;20870:3;20862:12;;20857:2;20845:15;;20810:75;:::i;:::-;20951:66;20945:3;20904:17;;;;20937:12;;;20930:88;21042:3;21034:12;;21027:24;21067:97;21093:70;21123:39;21157:3;21149:12;;21141:6;21123:39;:::i;:::-;18970:66;18958:79;;-1:-1:-1;;;19062:2:1;19053:12;;19046:32;19103:2;19094:12;;18893:219;21093:70;21085:6;21067:97;:::i;:::-;21060:104;19117:2053;-1:-1:-1;;;;;;;;19117:2053:1:o;22403:414::-;22605:2;22587:21;;;22644:2;22624:18;;;22617:30;22683:34;22678:2;22663:18;;22656:62;-1:-1:-1;;;22749:2:1;22734:18;;22727:48;22807:3;22792:19;;22403:414::o;23005:2330::-;-1:-1:-1;;;23952:49:1;;24024:13;;23934:3;;24046:75;24024:13;24109:2;24100:12;;24093:4;24081:17;;24046:75;:::i;:::-;-1:-1:-1;;;24180:2:1;24140:16;;;24172:11;;;24165:45;24235:13;;24257:76;24235:13;24319:2;24311:11;;24304:4;24292:17;;24257:76;:::i;:::-;-1:-1:-1;;;24393:2:1;24352:17;;;;24385:11;;;24378:43;24446:13;;24468:76;24446:13;24530:2;24522:11;;24515:4;24503:17;;24468:76;:::i;:::-;-1:-1:-1;;;24604:2:1;24563:17;;;;24596:11;;;24589:49;24663:13;;24685:76;24663:13;24747:2;24739:11;;24732:4;24720:17;;24685:76;:::i;:::-;24826:66;24821:2;24780:17;;;;24813:11;;;24806:87;24922:66;24917:2;24909:11;;24902:87;25018:66;25013:2;25005:11;;24998:87;25115:66;25109:3;25101:12;;25094:88;-1:-1:-1;;;25206:3:1;25198:12;;25191:52;25259:70;25289:39;25323:3;25315:12;;25307:6;25289:39;:::i;:::-;22899:66;22887:79;;22991:2;22982:12;;22822:178;25340:1438;25703:66;25698:3;25691:79;25800:66;25795:2;25790:3;25786:12;25779:88;25897:66;25892:2;25887:3;25883:12;25876:88;25994:66;25989:2;25984:3;25980:12;25973:88;26101:2;26096:3;26092:12;26086:3;26081;26077:13;26070:35;25673:3;26134:6;26128:13;26150:74;26217:6;26211:3;26206;26202:13;26197:2;26189:6;26185:15;26150:74;:::i;:::-;26289:66;26283:3;26243:16;;;;26275:12;;;26268:88;-1:-1:-1;26386:66:1;26380:3;26372:12;;26365:88;26483:66;26477:3;26469:12;;26462:88;26580:66;26574:3;26566:12;;26559:88;26677:66;26671:3;26663:12;;26656:88;26768:3;26760:12;;25340:1438;-1:-1:-1;25340:1438:1:o;28021:500::-;-1:-1:-1;;;;;28290:15:1;;;28272:34;;28342:15;;28337:2;28322:18;;28315:43;28389:2;28374:18;;28367:34;;;28437:3;28432:2;28417:18;;28410:31;;;28215:4;;28458:57;;28495:19;;28487:6;28458:57;:::i;:::-;28450:65;28021:500;-1:-1:-1;;;;;;28021:500:1:o;28526:249::-;28595:6;28648:2;28636:9;28627:7;28623:23;28619:32;28616:52;;;28664:1;28661;28654:12;28616:52;28696:9;28690:16;28715:30;28739:5;28715:30;:::i;29078:2257::-;-1:-1:-1;;;30174:45:1;;30242:13;;30156:3;;30264:75;30242:13;30327:2;30318:12;;30311:4;30299:17;;30264:75;:::i;:::-;-1:-1:-1;;;30398:2:1;30358:16;;;30390:11;;;30383:45;30453:13;;30475:76;30453:13;30537:2;30529:11;;30522:4;30510:17;;30475:76;:::i;:::-;-1:-1:-1;;;30611:2:1;30570:17;;;;30603:11;;;30596:45;30666:13;;30688:76;30666:13;30750:2;30742:11;;30735:4;30723:17;;30688:76;:::i;:::-;-1:-1:-1;;;30824:2:1;30783:17;;;;30816:11;;;30809:45;30879:13;;30901:76;30879:13;30963:2;30955:11;;30948:4;30936:17;;30901:76;:::i;:::-;-1:-1:-1;;;31037:2:1;30996:17;;;;31029:11;;;31022:53;31100:13;;31122:76;31100:13;31184:2;31176:11;;31169:4;31157:17;;31122:76;:::i;:::-;31214:115;31244:84;31270:57;31323:2;31312:8;31308:2;31304:17;31300:26;-1:-1:-1;;;28845:61:1;;28931:2;28922:12;;28780:160;31270:57;31262:6;31244:84;:::i;:::-;-1:-1:-1;;;29010:30:1;;29065:1;29056:11;;28945:128;31214:115;31207:122;29078:2257;-1:-1:-1;;;;;;;;;;29078:2257:1:o;31340:127::-;31401:10;31396:3;31392:20;31389:1;31382:31;31432:4;31429:1;31422:15;31456:4;31453:1;31446:15

Swarm Source

ipfs://be5d4275858ae6afea3254b7cb8d40aa9fda1d25dccbdf4ac8137dab344864f5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.