ETH Price: $3,107.30 (-0.27%)

Token

Spacegate Pass (SGP)
 

Overview

Max Total Supply

2,000 SGP

Holders

399

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
thebunk.eth
0x002a5920e786596381dc318544ed77047f54d56a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

By owning a Spacegate Pass, you will get lifetime access to the ground-breaking app as well as access to our exclusive private alpha group. In total, only 550 passes will be available for mint. There are many benefits of holding a Spacegate Pass, from access to all Spacegate f...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpacegatePass

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-15
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

// File: ERC1155.sol


pragma solidity >=0.8.0;

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
    /*///////////////////////////////////////////////////////////////
                                EVENTS
    //////////////////////////////////////////////////////////////*/

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    event URI(string value, uint256 indexed id);

    /*///////////////////////////////////////////////////////////////
                            ERC1155 STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public balanceOf;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                             METADATA LOGIC
    //////////////////////////////////////////////////////////////*/

    function uri(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                             ERC1155 LOGIC
    //////////////////////////////////////////////////////////////*/

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        balanceOf[from][id] -= amount;
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, from, to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        // Storing these outside the loop saves ~15 gas per iteration.
        uint256 id;
        uint256 amount;

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

            balanceOf[from][id] -= amount;
            balanceOf[to][id] += amount;

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function balanceOfBatch(address[] memory owners, uint256[] memory ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        uint256 ownersLength = owners.length; // Saves MLOADs.

        require(ownersLength == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](ownersLength);

        // Unchecked because the only math done is incrementing
        // the array index counter which cannot possibly overflow.
        unchecked {
            for (uint256 i = 0; i < ownersLength; ++i) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

    /*///////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal {
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, address(0), to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[to][ids[i]] += amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, address(0), to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchBurn(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[from][ids[i]] -= amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, address(0), ids, amounts);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal {
        balanceOf[from][id] -= amount;

        emit TransferSingle(msg.sender, from, address(0), id, amount);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC1155 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
interface ERC1155TokenReceiver {
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4);

    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external returns (bytes4);
}

// File: SpacegatePass.sol
pragma solidity ^0.8.9;

/*
* @title ERC1155 Contract for SpacegatePass
*
* @author tony-stark.eth | What The Commit https://what-the-commit.com
*/
contract SpacegatePass is ERC1155, PaymentSplitter {
    string public name_;
    string public symbol_;

    bool public publicSaleIsOpen;
    bool public allowlistIsOpen;

    uint8 private constant tokenId = 0;

    uint256 public constant mintPrice = 0.2 ether;

    uint256 public constant maxSupply = 2000;
    uint256 public currentSupply = 0;

    string public baseURI = "ipfs://QmY6GYY7ZcbZpBEkM5uXb2C9Kp7vYgYRJDznkHZMpwUrXC";

    bytes32 private merkleRoot;
    address public owner;

    /// @notice Mapping of addresses who have claimed tokens
    mapping(address => uint256) public hasClaimed;

    /// @notice Thrown if address has already claimed
    error AlreadyClaimed();
    /// @notice Thrown if address/amount are not part of Merkle tree
    error NotInMerkle();
    /// @notice Thrown if bad price
    error PaymentNotCorrect();
    error NotOwner();
    error MintExceedsMaxSupply();
    error TooManyMintsPerTransaction();
    error PublicSaleNotStarted();
    error AllowlistSaleNotStarted();

    constructor(
        address[] memory payees,
        uint256[] memory shares_
    ) ERC1155() PaymentSplitter(payees, shares_) {
        owner = msg.sender;
        name_ = "Spacegate Pass";
        symbol_ = "SGP";
    }

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }

    function uri(uint256 id) override public view virtual returns (string memory) {
        return baseURI;
    }

    function claim(
        address to,
        uint256 proofAmount,
        uint256 mintAmount,
        bytes32[] calldata proof
    ) external payable {
        if (!allowlistIsOpen) revert AllowlistSaleNotStarted();
        if (currentSupply + mintAmount > maxSupply) revert MintExceedsMaxSupply();
        // Throw if address has already claimed tokens
        if (hasClaimed[to] + mintAmount > proofAmount) revert AlreadyClaimed();
        if (msg.value != mintPrice * mintAmount) revert PaymentNotCorrect();

        // Verify merkle proof, or revert if not in tree
        bytes32 leaf = keccak256(abi.encodePacked(to, proofAmount));
        bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
        if (!isValidLeaf) revert NotInMerkle();

        // Set address to claimed
        hasClaimed[to] += mintAmount;

        // Mint tokens to address
        _mint(to, tokenId, mintAmount, "");
        currentSupply += mintAmount;
    }

    function publicMint() external payable {
        if (!publicSaleIsOpen) revert PublicSaleNotStarted();
        if (currentSupply + 1 > maxSupply) revert MintExceedsMaxSupply();
        if (msg.value != mintPrice) revert PaymentNotCorrect();

        _mint(msg.sender, tokenId, 1, "");
        currentSupply += 1;
    }

    /// ============ Owner Functions ============

    modifier onlyOwner() {
        if (msg.sender != owner) revert NotOwner();

        _;
    }

    function setOwner(address newOwner) external onlyOwner {
        owner = newOwner;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setBools(bool allowlist, bool publicSale) external onlyOwner {
        allowlistIsOpen = allowlist;
        publicSaleIsOpen = publicSale;
    }

    function ownerMint(address to, uint256 amount) external onlyOwner {
        if (currentSupply + amount > maxSupply) revert MintExceedsMaxSupply();
        _mint(to, tokenId, amount, "");
        currentSupply += amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowlistSaleNotStarted","type":"error"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"MintExceedsMaxSupply","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PaymentNotCorrect","type":"error"},{"inputs":[],"name":"PublicSaleNotStarted","type":"error"},{"inputs":[],"name":"TooManyMintsPerTransaction","type":"error"},{"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"allowlistIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"proofAmount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allowlist","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"}],"name":"setBools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol_","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600c556040518060600160405280603581526020016200539560359139600d90805190602001906200003a9291906200048e565b503480156200004857600080fd5b50604051620053ca380380620053ca83398181016040528101906200006e91906200083d565b81818051825114620000b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ae9062000949565b60405180910390fd5b6000825111620000fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f590620009bb565b60405180910390fd5b60005b82518110156200016d5762000157838281518110620001255762000124620009dd565b5b6020026020010151838381518110620001435762000142620009dd565b5b60200260200101516200025560201b60201c565b8080620001649062000a3b565b91505062000101565b50505033600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600e81526020017f537061636567617465205061737300000000000000000000000000000000000081525060099080519060200190620001fe9291906200048e565b506040518060400160405280600381526020017f5347500000000000000000000000000000000000000000000000000000000000815250600a90805190602001906200024c9291906200048e565b50505062000d3a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002be9062000afe565b60405180910390fd5b600081116200030d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003049062000b70565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003899062000c08565b60405180910390fd5b6006829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060025462000449919062000c2a565b6002819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200048292919062000ca9565b60405180910390a15050565b8280546200049c9062000d05565b90600052602060002090601f016020900481019282620004c057600085556200050c565b82601f10620004db57805160ff19168380011785556200050c565b828001600101855582156200050c579182015b828111156200050b578251825591602001919060010190620004ee565b5b5090506200051b91906200051f565b5090565b5b808211156200053a57600081600090555060010162000520565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005a28262000557565b810181811067ffffffffffffffff82111715620005c457620005c362000568565b5b80604052505050565b6000620005d96200053e565b9050620005e7828262000597565b919050565b600067ffffffffffffffff8211156200060a576200060962000568565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200064d8262000620565b9050919050565b6200065f8162000640565b81146200066b57600080fd5b50565b6000815190506200067f8162000654565b92915050565b60006200069c6200069684620005ec565b620005cd565b90508083825260208201905060208402830185811115620006c257620006c16200061b565b5b835b81811015620006ef5780620006da88826200066e565b845260208401935050602081019050620006c4565b5050509392505050565b600082601f83011262000711576200071062000552565b5b81516200072384826020860162000685565b91505092915050565b600067ffffffffffffffff8211156200074a576200074962000568565b5b602082029050602081019050919050565b6000819050919050565b62000770816200075b565b81146200077c57600080fd5b50565b600081519050620007908162000765565b92915050565b6000620007ad620007a7846200072c565b620005cd565b90508083825260208201905060208402830185811115620007d357620007d26200061b565b5b835b81811015620008005780620007eb88826200077f565b845260208401935050602081019050620007d5565b5050509392505050565b600082601f83011262000822576200082162000552565b5b81516200083484826020860162000796565b91505092915050565b6000806040838503121562000857576200085662000548565b5b600083015167ffffffffffffffff8111156200087857620008776200054d565b5b6200088685828601620006f9565b925050602083015167ffffffffffffffff811115620008aa57620008a96200054d565b5b620008b8858286016200080a565b9150509250929050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000931603283620008c2565b91506200093e82620008d3565b604082019050919050565b60006020820190508181036000830152620009648162000922565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b6000620009a3601a83620008c2565b9150620009b0826200096b565b602082019050919050565b60006020820190508181036000830152620009d68162000994565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000a48826200075b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000a7d5762000a7c62000a0c565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000ae6602c83620008c2565b915062000af38262000a88565b604082019050919050565b6000602082019050818103600083015262000b198162000ad7565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000b58601d83620008c2565b915062000b658262000b20565b602082019050919050565b6000602082019050818103600083015262000b8b8162000b49565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000bf0602b83620008c2565b915062000bfd8262000b92565b604082019050919050565b6000602082019050818103600083015262000c238162000be1565b9050919050565b600062000c37826200075b565b915062000c44836200075b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c7c5762000c7b62000a0c565b5b828201905092915050565b62000c928162000640565b82525050565b62000ca3816200075b565b82525050565b600060408201905062000cc0600083018562000c87565b62000ccf602083018462000c98565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d1e57607f821691505b60208210810362000d345762000d3362000cd6565b5b50919050565b61464b8062000d4a6000396000f3fe6080604052600436106102125760003560e01c8063771282f611610118578063af17dea6116100a0578063d79779b21161006f578063d79779b2146107f3578063e2b9e18614610830578063e33b7de31461085b578063e985e9c514610886578063f242432a146108c357610259565b8063af17dea614610735578063b8e4e17514610760578063ce7c2ac21461078b578063d5abeb01146107c857610259565b80638da5cb5b116100e75780638da5cb5b1461065057806395d89b411461067b5780639852595c146106a6578063a22cb465146106e3578063a7bba5411461070c57610259565b8063771282f614610594578063774d1103146105bf5780637cb64759146105ea5780638b83209b1461061357610259565b80633a98ef391161019b5780634e1273f41161016a5780634e1273f41461049b57806355f804b3146104d85780636817c76c146105015780636c0360eb1461052c57806373b2e80e1461055757610259565b80633a98ef39146103e1578063406072a91461040c578063484b973c1461044957806348b750441461047257610259565b806313af4035116101e257806313af403514610340578063172bd6de14610369578063191655871461038557806326092b83146103ae5780632eb2c2d6146103b857610259565b8062fdd58e1461025e57806301ffc9a71461029b57806306fdde03146102d85780630e89341c1461030357610259565b36610259577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102406108ec565b3460405161024f929190612e15565b60405180910390a1005b600080fd5b34801561026a57600080fd5b5061028560048036038101906102809190612eaa565b6108f4565b6040516102929190612eea565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd9190612f5d565b610919565b6040516102cf9190612fa5565b60405180910390f35b3480156102e457600080fd5b506102ed6109ab565b6040516102fa9190613059565b60405180910390f35b34801561030f57600080fd5b5061032a6004803603810190610325919061307b565b610a3d565b6040516103379190613059565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906130a8565b610ad1565b005b610383600480360381019061037e919061313a565b610b9c565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613200565b610e48565b005b6103b6610ff2565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613420565b6110ff565b005b3480156103ed57600080fd5b506103f661154f565b6040516104039190612eea565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e919061352d565b611559565b6040516104409190612eea565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612eaa565b6115e0565b005b34801561047e57600080fd5b506104996004803603810190610494919061352d565b6116ec565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613630565b6119a4565b6040516104cf9190613766565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190613829565b611afb565b005b34801561050d57600080fd5b50610516611b9c565b6040516105239190612eea565b60405180910390f35b34801561053857600080fd5b50610541611ba8565b60405161054e9190613059565b60405180910390f35b34801561056357600080fd5b5061057e600480360381019061057991906130a8565b611c36565b60405161058b9190612eea565b60405180910390f35b3480156105a057600080fd5b506105a9611c4e565b6040516105b69190612eea565b60405180910390f35b3480156105cb57600080fd5b506105d4611c54565b6040516105e19190612fa5565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906138a8565b611c67565b005b34801561061f57600080fd5b5061063a6004803603810190610635919061307b565b611cf8565b60405161064791906138d5565b60405180910390f35b34801561065c57600080fd5b50610665611d40565b60405161067291906138d5565b60405180910390f35b34801561068757600080fd5b50610690611d66565b60405161069d9190613059565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906130a8565b611df8565b6040516106da9190612eea565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061391c565b611e41565b005b34801561071857600080fd5b50610733600480360381019061072e919061395c565b611f3e565b005b34801561074157600080fd5b5061074a611ffd565b6040516107579190613059565b60405180910390f35b34801561076c57600080fd5b5061077561208b565b6040516107829190612fa5565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad91906130a8565b61209e565b6040516107bf9190612eea565b60405180910390f35b3480156107d457600080fd5b506107dd6120e7565b6040516107ea9190612eea565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061399c565b6120ed565b6040516108279190612eea565b60405180910390f35b34801561083c57600080fd5b50610845612136565b6040516108529190613059565b60405180910390f35b34801561086757600080fd5b506108706121c4565b60405161087d9190612eea565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906139c9565b6121ce565b6040516108ba9190612fa5565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613a09565b6121fd565b005b600033905090565b6000602052816000526040600020602052806000526040600020600091509150505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610974575063d9b67a2660e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a45750630e89341c60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600980546109ba90613acf565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613acf565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6060600d8054610a4c90613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613acf565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b50505050509050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b58576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60019054906101000a900460ff16610be2576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d083600c54610bf39190613b2f565b1115610c2b576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c779190613b2f565b1115610caf576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826702c68af0bb140000610cc39190613b85565b3414610cfb576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008585604051602001610d10929190613c48565b6040516020818303038152906040528051906020012090506000610d78848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54846125ad565b905080610db1576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e009190613b2f565b92505081905550610e2687600060ff1687604051806020016040528060008152506125c4565b84600c6000828254610e389190613b2f565b9250508190555050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190613ce6565b60405180910390fd5b6000610ed46121c4565b47610edf9190613b2f565b90506000610ef68383610ef186611df8565b612810565b905060008103610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613d78565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f8a9190613b2f565b925050819055508060036000828254610fa39190613b2f565b92505081905550610fb4838261287e565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fe5929190613df7565b60405180910390a1505050565b600b60009054906101000a900460ff16611038576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d06001600c5461104a9190613b2f565b1115611082576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6702c68af0bb14000034146110c3576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110e333600060ff166001604051806020016040528060008152506125c4565b6001600c60008282546110f69190613b2f565b92505081905550565b60008351905082518114611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613e6c565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112085750600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613ed8565b60405180910390fd5b60008060005b838110156113665786818151811061126857611267613ef8565b5b6020026020010151925085818151811061128557611284613ef8565b5b60200260200101519150816000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546112ee9190613f27565b92505081905550816000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546113549190613b2f565b9250508190555080600101905061124d565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516113dd929190613f5b565b60405180910390a460008773ffffffffffffffffffffffffffffffffffffffff163b146114d45763bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff1663bc197c81338b8a8a8a6040518663ffffffff1660e01b815260040161146c959493929190613fe7565b6020604051808303816000875af115801561148b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114af9190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611506565b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c906140dd565b60405180910390fd5b5050505050505050565b6000600254905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611667576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d081600c546116789190613b2f565b11156116b0576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116cf82600060ff1683604051806020016040528060008152506125c4565b80600c60008282546116e19190613b2f565b925050819055505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613ce6565b60405180910390fd5b6000611779836120ed565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117b291906138d5565b602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190614112565b6117fd9190613b2f565b9050600061181583836118108787611559565b612810565b90506000810361185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613d78565b60405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e69190613b2f565b9250508190555080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461193c9190613b2f565b9250508190555061194e848483612972565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611996929190612e15565b60405180910390a250505050565b6060600083519050825181146119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e690613e6c565b60405180910390fd5b8067ffffffffffffffff811115611a0957611a0861322d565b5b604051908082528060200260200182016040528015611a375781602001602082028036833780820191505090505b50915060005b81811015611af357600080868381518110611a5b57611a5a613ef8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858381518110611ab257611ab1613ef8565b5b6020026020010151815260200190815260200160002054838281518110611adc57611adb613ef8565b5b602002602001018181525050806001019050611a3d565b505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b82576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d9080519060200190611b98929190612d18565b5050565b6702c68af0bb14000081565b600d8054611bb590613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611be190613acf565b8015611c2e5780601f10611c0357610100808354040283529160200191611c2e565b820191906000526020600020905b815481529060010190602001808311611c1157829003601f168201915b505050505081565b60106020528060005260406000206000915090505481565b600c5481565b600b60019054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e8190555050565b600060068281548110611d0e57611d0d613ef8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a8054611d7590613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611da190613acf565b8015611dee5780601f10611dc357610100808354040283529160200191611dee565b820191906000526020600020905b815481529060010190602001808311611dd157829003601f168201915b5050505050905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f329190612fa5565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc5576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600b60016101000a81548160ff02191690831515021790555080600b60006101000a81548160ff0219169083151502179055505050565b600a805461200a90613acf565b80601f016020809104026020016040519081016040528092919081815260200182805461203690613acf565b80156120835780601f1061205857610100808354040283529160200191612083565b820191906000526020600020905b81548152906001019060200180831161206657829003601f168201915b505050505081565b600b60009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107d081565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009805461214390613acf565b80601f016020809104026020016040519081016040528092919081815260200182805461216f90613acf565b80156121bc5780601f10612191576101008083540402835291602001916121bc565b820191906000526020600020905b81548152906001019060200180831161219f57829003601f168201915b505050505081565b6000600354905090565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122bd5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f390613ed8565b60405180910390fd5b816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461235b9190613f27565b92505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546123c19190613b2f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161243e92919061413f565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146125355763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b81526004016124cd959493929190614168565b6020604051808303816000875af11580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125109190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612567565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b6125a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259d906140dd565b60405180910390fd5b5050505050565b6000826125ba85846129f8565b1490509392505050565b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546126239190613b2f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6286866040516126a192919061413f565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146127995763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e613360008787876040518663ffffffff1660e01b8152600401612731959493929190614168565b6020604051808303816000875af1158015612750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127749190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127cb565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b61280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906140dd565b60405180910390fd5b50505050565b600081600254600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856128619190613b85565b61286b91906141f1565b6128759190613f27565b90509392505050565b804710156128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b89061426e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128e7906142bf565b60006040518083038185875af1925050503d8060008114612924576040519150601f19603f3d011682016040523d82523d6000602084013e612929565b606091505b505090508061296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614346565b60405180910390fd5b505050565b6129f38363a9059cbb60e01b8484604051602401612991929190612e15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612aab565b505050565b60008082905060005b8451811015612aa0576000858281518110612a1f57612a1e613ef8565b5b60200260200101519050808311612a60578281604051602001612a43929190614387565b604051602081830303815290604052805190602001209250612a8c565b8083604051602001612a73929190614387565b6040516020818303038152906040528051906020012092505b508080612a98906143b3565b915050612a01565b508091505092915050565b6000612b0d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b729092919063ffffffff16565b9050600081511115612b6d5780806020019051810190612b2d9190614410565b612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906144af565b60405180910390fd5b5b505050565b6060612b818484600085612b8a565b90509392505050565b606082471015612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614541565b60405180910390fd5b612bd885612c9e565b612c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0e906145ad565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c4091906145fe565b60006040518083038185875af1925050503d8060008114612c7d576040519150601f19603f3d011682016040523d82523d6000602084013e612c82565b606091505b5091509150612c92828286612cb1565b92505050949350505050565b600080823b905060008111915050919050565b60608315612cc157829050612d11565b600083511115612cd45782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d089190613059565b60405180910390fd5b9392505050565b828054612d2490613acf565b90600052602060002090601f016020900481019282612d465760008555612d8d565b82601f10612d5f57805160ff1916838001178555612d8d565b82800160010185558215612d8d579182015b82811115612d8c578251825591602001919060010190612d71565b5b509050612d9a9190612d9e565b5090565b5b80821115612db7576000816000905550600101612d9f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de682612dbb565b9050919050565b612df681612ddb565b82525050565b6000819050919050565b612e0f81612dfc565b82525050565b6000604082019050612e2a6000830185612ded565b612e376020830184612e06565b9392505050565b6000604051905090565b600080fd5b600080fd5b612e5b81612ddb565b8114612e6657600080fd5b50565b600081359050612e7881612e52565b92915050565b612e8781612dfc565b8114612e9257600080fd5b50565b600081359050612ea481612e7e565b92915050565b60008060408385031215612ec157612ec0612e48565b5b6000612ecf85828601612e69565b9250506020612ee085828601612e95565b9150509250929050565b6000602082019050612eff6000830184612e06565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f3a81612f05565b8114612f4557600080fd5b50565b600081359050612f5781612f31565b92915050565b600060208284031215612f7357612f72612e48565b5b6000612f8184828501612f48565b91505092915050565b60008115159050919050565b612f9f81612f8a565b82525050565b6000602082019050612fba6000830184612f96565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ffa578082015181840152602081019050612fdf565b83811115613009576000848401525b50505050565b6000601f19601f8301169050919050565b600061302b82612fc0565b6130358185612fcb565b9350613045818560208601612fdc565b61304e8161300f565b840191505092915050565b600060208201905081810360008301526130738184613020565b905092915050565b60006020828403121561309157613090612e48565b5b600061309f84828501612e95565b91505092915050565b6000602082840312156130be576130bd612e48565b5b60006130cc84828501612e69565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130fa576130f96130d5565b5b8235905067ffffffffffffffff811115613117576131166130da565b5b602083019150836020820283011115613133576131326130df565b5b9250929050565b60008060008060006080868803121561315657613155612e48565b5b600061316488828901612e69565b955050602061317588828901612e95565b945050604061318688828901612e95565b935050606086013567ffffffffffffffff8111156131a7576131a6612e4d565b5b6131b3888289016130e4565b92509250509295509295909350565b60006131cd82612dbb565b9050919050565b6131dd816131c2565b81146131e857600080fd5b50565b6000813590506131fa816131d4565b92915050565b60006020828403121561321657613215612e48565b5b6000613224848285016131eb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132658261300f565b810181811067ffffffffffffffff821117156132845761328361322d565b5b80604052505050565b6000613297612e3e565b90506132a3828261325c565b919050565b600067ffffffffffffffff8211156132c3576132c261322d565b5b602082029050602081019050919050565b60006132e76132e2846132a8565b61328d565b9050808382526020820190506020840283018581111561330a576133096130df565b5b835b81811015613333578061331f8882612e95565b84526020840193505060208101905061330c565b5050509392505050565b600082601f830112613352576133516130d5565b5b81356133628482602086016132d4565b91505092915050565b600080fd5b600067ffffffffffffffff82111561338b5761338a61322d565b5b6133948261300f565b9050602081019050919050565b82818337600083830152505050565b60006133c36133be84613370565b61328d565b9050828152602081018484840111156133df576133de61336b565b5b6133ea8482856133a1565b509392505050565b600082601f830112613407576134066130d5565b5b81356134178482602086016133b0565b91505092915050565b600080600080600060a0868803121561343c5761343b612e48565b5b600061344a88828901612e69565b955050602061345b88828901612e69565b945050604086013567ffffffffffffffff81111561347c5761347b612e4d565b5b6134888882890161333d565b935050606086013567ffffffffffffffff8111156134a9576134a8612e4d565b5b6134b58882890161333d565b925050608086013567ffffffffffffffff8111156134d6576134d5612e4d565b5b6134e2888289016133f2565b9150509295509295909350565b60006134fa82612ddb565b9050919050565b61350a816134ef565b811461351557600080fd5b50565b60008135905061352781613501565b92915050565b6000806040838503121561354457613543612e48565b5b600061355285828601613518565b925050602061356385828601612e69565b9150509250929050565b600067ffffffffffffffff8211156135885761358761322d565b5b602082029050602081019050919050565b60006135ac6135a78461356d565b61328d565b905080838252602082019050602084028301858111156135cf576135ce6130df565b5b835b818110156135f857806135e48882612e69565b8452602084019350506020810190506135d1565b5050509392505050565b600082601f830112613617576136166130d5565b5b8135613627848260208601613599565b91505092915050565b6000806040838503121561364757613646612e48565b5b600083013567ffffffffffffffff81111561366557613664612e4d565b5b61367185828601613602565b925050602083013567ffffffffffffffff81111561369257613691612e4d565b5b61369e8582860161333d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136dd81612dfc565b82525050565b60006136ef83836136d4565b60208301905092915050565b6000602082019050919050565b6000613713826136a8565b61371d81856136b3565b9350613728836136c4565b8060005b8381101561375957815161374088826136e3565b975061374b836136fb565b92505060018101905061372c565b5085935050505092915050565b600060208201905081810360008301526137808184613708565b905092915050565b600067ffffffffffffffff8211156137a3576137a261322d565b5b6137ac8261300f565b9050602081019050919050565b60006137cc6137c784613788565b61328d565b9050828152602081018484840111156137e8576137e761336b565b5b6137f38482856133a1565b509392505050565b600082601f8301126138105761380f6130d5565b5b81356138208482602086016137b9565b91505092915050565b60006020828403121561383f5761383e612e48565b5b600082013567ffffffffffffffff81111561385d5761385c612e4d565b5b613869848285016137fb565b91505092915050565b6000819050919050565b61388581613872565b811461389057600080fd5b50565b6000813590506138a28161387c565b92915050565b6000602082840312156138be576138bd612e48565b5b60006138cc84828501613893565b91505092915050565b60006020820190506138ea6000830184612ded565b92915050565b6138f981612f8a565b811461390457600080fd5b50565b600081359050613916816138f0565b92915050565b6000806040838503121561393357613932612e48565b5b600061394185828601612e69565b925050602061395285828601613907565b9150509250929050565b6000806040838503121561397357613972612e48565b5b600061398185828601613907565b925050602061399285828601613907565b9150509250929050565b6000602082840312156139b2576139b1612e48565b5b60006139c084828501613518565b91505092915050565b600080604083850312156139e0576139df612e48565b5b60006139ee85828601612e69565b92505060206139ff85828601612e69565b9150509250929050565b600080600080600060a08688031215613a2557613a24612e48565b5b6000613a3388828901612e69565b9550506020613a4488828901612e69565b9450506040613a5588828901612e95565b9350506060613a6688828901612e95565b925050608086013567ffffffffffffffff811115613a8757613a86612e4d565b5b613a93888289016133f2565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ae757607f821691505b602082108103613afa57613af9613aa0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b3a82612dfc565b9150613b4583612dfc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b7a57613b79613b00565b5b828201905092915050565b6000613b9082612dfc565b9150613b9b83612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bd457613bd3613b00565b5b828202905092915050565b60008160601b9050919050565b6000613bf782613bdf565b9050919050565b6000613c0982613bec565b9050919050565b613c21613c1c82612ddb565b613bfe565b82525050565b6000819050919050565b613c42613c3d82612dfc565b613c27565b82525050565b6000613c548285613c10565b601482019150613c648284613c31565b6020820191508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000613cd0602683612fcb565b9150613cdb82613c74565b604082019050919050565b60006020820190508181036000830152613cff81613cc3565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000613d62602b83612fcb565b9150613d6d82613d06565b604082019050919050565b60006020820190508181036000830152613d9181613d55565b9050919050565b6000819050919050565b6000613dbd613db8613db384612dbb565b613d98565b612dbb565b9050919050565b6000613dcf82613da2565b9050919050565b6000613de182613dc4565b9050919050565b613df181613dd6565b82525050565b6000604082019050613e0c6000830185613de8565b613e196020830184612e06565b9392505050565b7f4c454e4754485f4d49534d415443480000000000000000000000000000000000600082015250565b6000613e56600f83612fcb565b9150613e6182613e20565b602082019050919050565b60006020820190508181036000830152613e8581613e49565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000613ec2600e83612fcb565b9150613ecd82613e8c565b602082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f3282612dfc565b9150613f3d83612dfc565b925082821015613f5057613f4f613b00565b5b828203905092915050565b60006040820190508181036000830152613f758185613708565b90508181036020830152613f898184613708565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613fb982613f92565b613fc38185613f9d565b9350613fd3818560208601612fdc565b613fdc8161300f565b840191505092915050565b600060a082019050613ffc6000830188612ded565b6140096020830187612ded565b818103604083015261401b8186613708565b9050818103606083015261402f8185613708565b905081810360808301526140438184613fae565b90509695505050505050565b60008151905061405e81612f31565b92915050565b60006020828403121561407a57614079612e48565b5b60006140888482850161404f565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b60006140c7601083612fcb565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b60008151905061410c81612e7e565b92915050565b60006020828403121561412857614127612e48565b5b6000614136848285016140fd565b91505092915050565b60006040820190506141546000830185612e06565b6141616020830184612e06565b9392505050565b600060a08201905061417d6000830188612ded565b61418a6020830187612ded565b6141976040830186612e06565b6141a46060830185612e06565b81810360808301526141b68184613fae565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141fc82612dfc565b915061420783612dfc565b925082614217576142166141c2565b5b828204905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614258601d83612fcb565b915061426382614222565b602082019050919050565b600060208201905081810360008301526142878161424b565b9050919050565b600081905092915050565b50565b60006142a960008361428e565b91506142b482614299565b600082019050919050565b60006142ca8261429c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614330603a83612fcb565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b6000819050919050565b61438161437c82613872565b614366565b82525050565b60006143938285614370565b6020820191506143a38284614370565b6020820191508190509392505050565b60006143be82612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143f0576143ef613b00565b5b600182019050919050565b60008151905061440a816138f0565b92915050565b60006020828403121561442657614425612e48565b5b6000614434848285016143fb565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614499602a83612fcb565b91506144a48261443d565b604082019050919050565b600060208201905081810360008301526144c88161448c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061452b602683612fcb565b9150614536826144cf565b604082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614597601d83612fcb565b91506145a282614561565b602082019050919050565b600060208201905081810360008301526145c68161458a565b9050919050565b60006145d882613f92565b6145e2818561428e565b93506145f2818560208601612fdc565b80840191505092915050565b600061460a82846145cd565b91508190509291505056fea2646970667358221220b34da6a67949650da0c88937505f667f7ce8e70d29ad04d4a6a20f4efb6adf1e64736f6c634300080d0033697066733a2f2f516d5936475959375a63625a7042456b4d357558623243394b703776596759524a447a6e6b485a4d707755725843000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c974df7cf267fdd454776cc64725dd6f77f0212a00000000000000000000000076a3b1104d06ba886af27b8084fbf69aaeb2dd56000000000000000000000000bc56f459bb04147dbf3dc18ac54707bb6f65a515000000000000000000000000bccc6d16e447f0c1293972d0c080860acd1f053d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x6080604052600436106102125760003560e01c8063771282f611610118578063af17dea6116100a0578063d79779b21161006f578063d79779b2146107f3578063e2b9e18614610830578063e33b7de31461085b578063e985e9c514610886578063f242432a146108c357610259565b8063af17dea614610735578063b8e4e17514610760578063ce7c2ac21461078b578063d5abeb01146107c857610259565b80638da5cb5b116100e75780638da5cb5b1461065057806395d89b411461067b5780639852595c146106a6578063a22cb465146106e3578063a7bba5411461070c57610259565b8063771282f614610594578063774d1103146105bf5780637cb64759146105ea5780638b83209b1461061357610259565b80633a98ef391161019b5780634e1273f41161016a5780634e1273f41461049b57806355f804b3146104d85780636817c76c146105015780636c0360eb1461052c57806373b2e80e1461055757610259565b80633a98ef39146103e1578063406072a91461040c578063484b973c1461044957806348b750441461047257610259565b806313af4035116101e257806313af403514610340578063172bd6de14610369578063191655871461038557806326092b83146103ae5780632eb2c2d6146103b857610259565b8062fdd58e1461025e57806301ffc9a71461029b57806306fdde03146102d85780630e89341c1461030357610259565b36610259577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102406108ec565b3460405161024f929190612e15565b60405180910390a1005b600080fd5b34801561026a57600080fd5b5061028560048036038101906102809190612eaa565b6108f4565b6040516102929190612eea565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd9190612f5d565b610919565b6040516102cf9190612fa5565b60405180910390f35b3480156102e457600080fd5b506102ed6109ab565b6040516102fa9190613059565b60405180910390f35b34801561030f57600080fd5b5061032a6004803603810190610325919061307b565b610a3d565b6040516103379190613059565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906130a8565b610ad1565b005b610383600480360381019061037e919061313a565b610b9c565b005b34801561039157600080fd5b506103ac60048036038101906103a79190613200565b610e48565b005b6103b6610ff2565b005b3480156103c457600080fd5b506103df60048036038101906103da9190613420565b6110ff565b005b3480156103ed57600080fd5b506103f661154f565b6040516104039190612eea565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e919061352d565b611559565b6040516104409190612eea565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612eaa565b6115e0565b005b34801561047e57600080fd5b506104996004803603810190610494919061352d565b6116ec565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190613630565b6119a4565b6040516104cf9190613766565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190613829565b611afb565b005b34801561050d57600080fd5b50610516611b9c565b6040516105239190612eea565b60405180910390f35b34801561053857600080fd5b50610541611ba8565b60405161054e9190613059565b60405180910390f35b34801561056357600080fd5b5061057e600480360381019061057991906130a8565b611c36565b60405161058b9190612eea565b60405180910390f35b3480156105a057600080fd5b506105a9611c4e565b6040516105b69190612eea565b60405180910390f35b3480156105cb57600080fd5b506105d4611c54565b6040516105e19190612fa5565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906138a8565b611c67565b005b34801561061f57600080fd5b5061063a6004803603810190610635919061307b565b611cf8565b60405161064791906138d5565b60405180910390f35b34801561065c57600080fd5b50610665611d40565b60405161067291906138d5565b60405180910390f35b34801561068757600080fd5b50610690611d66565b60405161069d9190613059565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906130a8565b611df8565b6040516106da9190612eea565b60405180910390f35b3480156106ef57600080fd5b5061070a6004803603810190610705919061391c565b611e41565b005b34801561071857600080fd5b50610733600480360381019061072e919061395c565b611f3e565b005b34801561074157600080fd5b5061074a611ffd565b6040516107579190613059565b60405180910390f35b34801561076c57600080fd5b5061077561208b565b6040516107829190612fa5565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad91906130a8565b61209e565b6040516107bf9190612eea565b60405180910390f35b3480156107d457600080fd5b506107dd6120e7565b6040516107ea9190612eea565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061399c565b6120ed565b6040516108279190612eea565b60405180910390f35b34801561083c57600080fd5b50610845612136565b6040516108529190613059565b60405180910390f35b34801561086757600080fd5b506108706121c4565b60405161087d9190612eea565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906139c9565b6121ce565b6040516108ba9190612fa5565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613a09565b6121fd565b005b600033905090565b6000602052816000526040600020602052806000526040600020600091509150505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610974575063d9b67a2660e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a45750630e89341c60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600980546109ba90613acf565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690613acf565b8015610a335780601f10610a0857610100808354040283529160200191610a33565b820191906000526020600020905b815481529060010190602001808311610a1657829003601f168201915b5050505050905090565b6060600d8054610a4c90613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613acf565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b50505050509050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b58576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60019054906101000a900460ff16610be2576040517f55a5151f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d083600c54610bf39190613b2f565b1115610c2b576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8383601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c779190613b2f565b1115610caf576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826702c68af0bb140000610cc39190613b85565b3414610cfb576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008585604051602001610d10929190613c48565b6040516020818303038152906040528051906020012090506000610d78848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54846125ad565b905080610db1576040517f8a585be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e009190613b2f565b92505081905550610e2687600060ff1687604051806020016040528060008152506125c4565b84600c6000828254610e389190613b2f565b9250508190555050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec190613ce6565b60405180910390fd5b6000610ed46121c4565b47610edf9190613b2f565b90506000610ef68383610ef186611df8565b612810565b905060008103610f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3290613d78565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f8a9190613b2f565b925050819055508060036000828254610fa39190613b2f565b92505081905550610fb4838261287e565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fe5929190613df7565b60405180910390a1505050565b600b60009054906101000a900460ff16611038576040517fac4d09c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d06001600c5461104a9190613b2f565b1115611082576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6702c68af0bb14000034146110c3576040517f3c7215a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110e333600060ff166001604051806020016040528060008152506125c4565b6001600c60008282546110f69190613b2f565b92505081905550565b60008351905082518114611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613e6c565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112085750600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613ed8565b60405180910390fd5b60008060005b838110156113665786818151811061126857611267613ef8565b5b6020026020010151925085818151811061128557611284613ef8565b5b60200260200101519150816000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546112ee9190613f27565b92505081905550816000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546113549190613b2f565b9250508190555080600101905061124d565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516113dd929190613f5b565b60405180910390a460008773ffffffffffffffffffffffffffffffffffffffff163b146114d45763bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff1663bc197c81338b8a8a8a6040518663ffffffff1660e01b815260040161146c959493929190613fe7565b6020604051808303816000875af115801561148b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114af9190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611506565b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c906140dd565b60405180910390fd5b5050505050505050565b6000600254905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611667576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107d081600c546116789190613b2f565b11156116b0576040517f3e0866c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116cf82600060ff1683604051806020016040528060008152506125c4565b80600c60008282546116e19190613b2f565b925050819055505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613ce6565b60405180910390fd5b6000611779836120ed565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117b291906138d5565b602060405180830381865afa1580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190614112565b6117fd9190613b2f565b9050600061181583836118108787611559565b612810565b90506000810361185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613d78565b60405180910390fd5b80600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118e69190613b2f565b9250508190555080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461193c9190613b2f565b9250508190555061194e848483612972565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611996929190612e15565b60405180910390a250505050565b6060600083519050825181146119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e690613e6c565b60405180910390fd5b8067ffffffffffffffff811115611a0957611a0861322d565b5b604051908082528060200260200182016040528015611a375781602001602082028036833780820191505090505b50915060005b81811015611af357600080868381518110611a5b57611a5a613ef8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858381518110611ab257611ab1613ef8565b5b6020026020010151815260200190815260200160002054838281518110611adc57611adb613ef8565b5b602002602001018181525050806001019050611a3d565b505092915050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b82576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d9080519060200190611b98929190612d18565b5050565b6702c68af0bb14000081565b600d8054611bb590613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611be190613acf565b8015611c2e5780601f10611c0357610100808354040283529160200191611c2e565b820191906000526020600020905b815481529060010190602001808311611c1157829003601f168201915b505050505081565b60106020528060005260406000206000915090505481565b600c5481565b600b60019054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cee576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e8190555050565b600060068281548110611d0e57611d0d613ef8565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a8054611d7590613acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611da190613acf565b8015611dee5780601f10611dc357610100808354040283529160200191611dee565b820191906000526020600020905b815481529060010190602001808311611dd157829003601f168201915b5050505050905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f329190612fa5565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fc5576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600b60016101000a81548160ff02191690831515021790555080600b60006101000a81548160ff0219169083151502179055505050565b600a805461200a90613acf565b80601f016020809104026020016040519081016040528092919081815260200182805461203690613acf565b80156120835780601f1061205857610100808354040283529160200191612083565b820191906000526020600020905b81548152906001019060200180831161206657829003601f168201915b505050505081565b600b60009054906101000a900460ff1681565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107d081565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009805461214390613acf565b80601f016020809104026020016040519081016040528092919081815260200182805461216f90613acf565b80156121bc5780601f10612191576101008083540402835291602001916121bc565b820191906000526020600020905b81548152906001019060200180831161219f57829003601f168201915b505050505081565b6000600354905090565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122bd5750600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f390613ed8565b60405180910390fd5b816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600082825461235b9190613f27565b92505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546123c19190613b2f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161243e92919061413f565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146125355763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b81526004016124cd959493929190614168565b6020604051808303816000875af11580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125109190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612567565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b6125a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259d906140dd565b60405180910390fd5b5050505050565b6000826125ba85846129f8565b1490509392505050565b816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060008282546126239190613b2f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6286866040516126a192919061413f565b60405180910390a460008473ffffffffffffffffffffffffffffffffffffffff163b146127995763f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663f23a6e613360008787876040518663ffffffff1660e01b8152600401612731959493929190614168565b6020604051808303816000875af1158015612750573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127749190614064565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146127cb565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b61280a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612801906140dd565b60405180910390fd5b50505050565b600081600254600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856128619190613b85565b61286b91906141f1565b6128759190613f27565b90509392505050565b804710156128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b89061426e565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128e7906142bf565b60006040518083038185875af1925050503d8060008114612924576040519150601f19603f3d011682016040523d82523d6000602084013e612929565b606091505b505090508061296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490614346565b60405180910390fd5b505050565b6129f38363a9059cbb60e01b8484604051602401612991929190612e15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612aab565b505050565b60008082905060005b8451811015612aa0576000858281518110612a1f57612a1e613ef8565b5b60200260200101519050808311612a60578281604051602001612a43929190614387565b604051602081830303815290604052805190602001209250612a8c565b8083604051602001612a73929190614387565b6040516020818303038152906040528051906020012092505b508080612a98906143b3565b915050612a01565b508091505092915050565b6000612b0d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b729092919063ffffffff16565b9050600081511115612b6d5780806020019051810190612b2d9190614410565b612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906144af565b60405180910390fd5b5b505050565b6060612b818484600085612b8a565b90509392505050565b606082471015612bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc690614541565b60405180910390fd5b612bd885612c9e565b612c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0e906145ad565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c4091906145fe565b60006040518083038185875af1925050503d8060008114612c7d576040519150601f19603f3d011682016040523d82523d6000602084013e612c82565b606091505b5091509150612c92828286612cb1565b92505050949350505050565b600080823b905060008111915050919050565b60608315612cc157829050612d11565b600083511115612cd45782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d089190613059565b60405180910390fd5b9392505050565b828054612d2490613acf565b90600052602060002090601f016020900481019282612d465760008555612d8d565b82601f10612d5f57805160ff1916838001178555612d8d565b82800160010185558215612d8d579182015b82811115612d8c578251825591602001919060010190612d71565b5b509050612d9a9190612d9e565b5090565b5b80821115612db7576000816000905550600101612d9f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de682612dbb565b9050919050565b612df681612ddb565b82525050565b6000819050919050565b612e0f81612dfc565b82525050565b6000604082019050612e2a6000830185612ded565b612e376020830184612e06565b9392505050565b6000604051905090565b600080fd5b600080fd5b612e5b81612ddb565b8114612e6657600080fd5b50565b600081359050612e7881612e52565b92915050565b612e8781612dfc565b8114612e9257600080fd5b50565b600081359050612ea481612e7e565b92915050565b60008060408385031215612ec157612ec0612e48565b5b6000612ecf85828601612e69565b9250506020612ee085828601612e95565b9150509250929050565b6000602082019050612eff6000830184612e06565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f3a81612f05565b8114612f4557600080fd5b50565b600081359050612f5781612f31565b92915050565b600060208284031215612f7357612f72612e48565b5b6000612f8184828501612f48565b91505092915050565b60008115159050919050565b612f9f81612f8a565b82525050565b6000602082019050612fba6000830184612f96565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ffa578082015181840152602081019050612fdf565b83811115613009576000848401525b50505050565b6000601f19601f8301169050919050565b600061302b82612fc0565b6130358185612fcb565b9350613045818560208601612fdc565b61304e8161300f565b840191505092915050565b600060208201905081810360008301526130738184613020565b905092915050565b60006020828403121561309157613090612e48565b5b600061309f84828501612e95565b91505092915050565b6000602082840312156130be576130bd612e48565b5b60006130cc84828501612e69565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130fa576130f96130d5565b5b8235905067ffffffffffffffff811115613117576131166130da565b5b602083019150836020820283011115613133576131326130df565b5b9250929050565b60008060008060006080868803121561315657613155612e48565b5b600061316488828901612e69565b955050602061317588828901612e95565b945050604061318688828901612e95565b935050606086013567ffffffffffffffff8111156131a7576131a6612e4d565b5b6131b3888289016130e4565b92509250509295509295909350565b60006131cd82612dbb565b9050919050565b6131dd816131c2565b81146131e857600080fd5b50565b6000813590506131fa816131d4565b92915050565b60006020828403121561321657613215612e48565b5b6000613224848285016131eb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132658261300f565b810181811067ffffffffffffffff821117156132845761328361322d565b5b80604052505050565b6000613297612e3e565b90506132a3828261325c565b919050565b600067ffffffffffffffff8211156132c3576132c261322d565b5b602082029050602081019050919050565b60006132e76132e2846132a8565b61328d565b9050808382526020820190506020840283018581111561330a576133096130df565b5b835b81811015613333578061331f8882612e95565b84526020840193505060208101905061330c565b5050509392505050565b600082601f830112613352576133516130d5565b5b81356133628482602086016132d4565b91505092915050565b600080fd5b600067ffffffffffffffff82111561338b5761338a61322d565b5b6133948261300f565b9050602081019050919050565b82818337600083830152505050565b60006133c36133be84613370565b61328d565b9050828152602081018484840111156133df576133de61336b565b5b6133ea8482856133a1565b509392505050565b600082601f830112613407576134066130d5565b5b81356134178482602086016133b0565b91505092915050565b600080600080600060a0868803121561343c5761343b612e48565b5b600061344a88828901612e69565b955050602061345b88828901612e69565b945050604086013567ffffffffffffffff81111561347c5761347b612e4d565b5b6134888882890161333d565b935050606086013567ffffffffffffffff8111156134a9576134a8612e4d565b5b6134b58882890161333d565b925050608086013567ffffffffffffffff8111156134d6576134d5612e4d565b5b6134e2888289016133f2565b9150509295509295909350565b60006134fa82612ddb565b9050919050565b61350a816134ef565b811461351557600080fd5b50565b60008135905061352781613501565b92915050565b6000806040838503121561354457613543612e48565b5b600061355285828601613518565b925050602061356385828601612e69565b9150509250929050565b600067ffffffffffffffff8211156135885761358761322d565b5b602082029050602081019050919050565b60006135ac6135a78461356d565b61328d565b905080838252602082019050602084028301858111156135cf576135ce6130df565b5b835b818110156135f857806135e48882612e69565b8452602084019350506020810190506135d1565b5050509392505050565b600082601f830112613617576136166130d5565b5b8135613627848260208601613599565b91505092915050565b6000806040838503121561364757613646612e48565b5b600083013567ffffffffffffffff81111561366557613664612e4d565b5b61367185828601613602565b925050602083013567ffffffffffffffff81111561369257613691612e4d565b5b61369e8582860161333d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136dd81612dfc565b82525050565b60006136ef83836136d4565b60208301905092915050565b6000602082019050919050565b6000613713826136a8565b61371d81856136b3565b9350613728836136c4565b8060005b8381101561375957815161374088826136e3565b975061374b836136fb565b92505060018101905061372c565b5085935050505092915050565b600060208201905081810360008301526137808184613708565b905092915050565b600067ffffffffffffffff8211156137a3576137a261322d565b5b6137ac8261300f565b9050602081019050919050565b60006137cc6137c784613788565b61328d565b9050828152602081018484840111156137e8576137e761336b565b5b6137f38482856133a1565b509392505050565b600082601f8301126138105761380f6130d5565b5b81356138208482602086016137b9565b91505092915050565b60006020828403121561383f5761383e612e48565b5b600082013567ffffffffffffffff81111561385d5761385c612e4d565b5b613869848285016137fb565b91505092915050565b6000819050919050565b61388581613872565b811461389057600080fd5b50565b6000813590506138a28161387c565b92915050565b6000602082840312156138be576138bd612e48565b5b60006138cc84828501613893565b91505092915050565b60006020820190506138ea6000830184612ded565b92915050565b6138f981612f8a565b811461390457600080fd5b50565b600081359050613916816138f0565b92915050565b6000806040838503121561393357613932612e48565b5b600061394185828601612e69565b925050602061395285828601613907565b9150509250929050565b6000806040838503121561397357613972612e48565b5b600061398185828601613907565b925050602061399285828601613907565b9150509250929050565b6000602082840312156139b2576139b1612e48565b5b60006139c084828501613518565b91505092915050565b600080604083850312156139e0576139df612e48565b5b60006139ee85828601612e69565b92505060206139ff85828601612e69565b9150509250929050565b600080600080600060a08688031215613a2557613a24612e48565b5b6000613a3388828901612e69565b9550506020613a4488828901612e69565b9450506040613a5588828901612e95565b9350506060613a6688828901612e95565b925050608086013567ffffffffffffffff811115613a8757613a86612e4d565b5b613a93888289016133f2565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ae757607f821691505b602082108103613afa57613af9613aa0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b3a82612dfc565b9150613b4583612dfc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b7a57613b79613b00565b5b828201905092915050565b6000613b9082612dfc565b9150613b9b83612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bd457613bd3613b00565b5b828202905092915050565b60008160601b9050919050565b6000613bf782613bdf565b9050919050565b6000613c0982613bec565b9050919050565b613c21613c1c82612ddb565b613bfe565b82525050565b6000819050919050565b613c42613c3d82612dfc565b613c27565b82525050565b6000613c548285613c10565b601482019150613c648284613c31565b6020820191508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000613cd0602683612fcb565b9150613cdb82613c74565b604082019050919050565b60006020820190508181036000830152613cff81613cc3565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000613d62602b83612fcb565b9150613d6d82613d06565b604082019050919050565b60006020820190508181036000830152613d9181613d55565b9050919050565b6000819050919050565b6000613dbd613db8613db384612dbb565b613d98565b612dbb565b9050919050565b6000613dcf82613da2565b9050919050565b6000613de182613dc4565b9050919050565b613df181613dd6565b82525050565b6000604082019050613e0c6000830185613de8565b613e196020830184612e06565b9392505050565b7f4c454e4754485f4d49534d415443480000000000000000000000000000000000600082015250565b6000613e56600f83612fcb565b9150613e6182613e20565b602082019050919050565b60006020820190508181036000830152613e8581613e49565b9050919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000613ec2600e83612fcb565b9150613ecd82613e8c565b602082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613f3282612dfc565b9150613f3d83612dfc565b925082821015613f5057613f4f613b00565b5b828203905092915050565b60006040820190508181036000830152613f758185613708565b90508181036020830152613f898184613708565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613fb982613f92565b613fc38185613f9d565b9350613fd3818560208601612fdc565b613fdc8161300f565b840191505092915050565b600060a082019050613ffc6000830188612ded565b6140096020830187612ded565b818103604083015261401b8186613708565b9050818103606083015261402f8185613708565b905081810360808301526140438184613fae565b90509695505050505050565b60008151905061405e81612f31565b92915050565b60006020828403121561407a57614079612e48565b5b60006140888482850161404f565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b60006140c7601083612fcb565b91506140d282614091565b602082019050919050565b600060208201905081810360008301526140f6816140ba565b9050919050565b60008151905061410c81612e7e565b92915050565b60006020828403121561412857614127612e48565b5b6000614136848285016140fd565b91505092915050565b60006040820190506141546000830185612e06565b6141616020830184612e06565b9392505050565b600060a08201905061417d6000830188612ded565b61418a6020830187612ded565b6141976040830186612e06565b6141a46060830185612e06565b81810360808301526141b68184613fae565b90509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141fc82612dfc565b915061420783612dfc565b925082614217576142166141c2565b5b828204905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614258601d83612fcb565b915061426382614222565b602082019050919050565b600060208201905081810360008301526142878161424b565b9050919050565b600081905092915050565b50565b60006142a960008361428e565b91506142b482614299565b600082019050919050565b60006142ca8261429c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614330603a83612fcb565b915061433b826142d4565b604082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b6000819050919050565b61438161437c82613872565b614366565b82525050565b60006143938285614370565b6020820191506143a38284614370565b6020820191508190509392505050565b60006143be82612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143f0576143ef613b00565b5b600182019050919050565b60008151905061440a816138f0565b92915050565b60006020828403121561442657614425612e48565b5b6000614434848285016143fb565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614499602a83612fcb565b91506144a48261443d565b604082019050919050565b600060208201905081810360008301526144c88161448c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061452b602683612fcb565b9150614536826144cf565b604082019050919050565b6000602082019050818103600083015261455a8161451e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614597601d83612fcb565b91506145a282614561565b602082019050919050565b600060208201905081810360008301526145c68161458a565b9050919050565b60006145d882613f92565b6145e2818561428e565b93506145f2818560208601612fdc565b80840191505092915050565b600061460a82846145cd565b91508190509291505056fea2646970667358221220b34da6a67949650da0c88937505f667f7ce8e70d29ad04d4a6a20f4efb6adf1e64736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c974df7cf267fdd454776cc64725dd6f77f0212a00000000000000000000000076a3b1104d06ba886af27b8084fbf69aaeb2dd56000000000000000000000000bc56f459bb04147dbf3dc18ac54707bb6f65a515000000000000000000000000bccc6d16e447f0c1293972d0c080860acd1f053d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : payees (address[]): 0xc974dF7cf267Fdd454776CC64725Dd6f77F0212A,0x76a3B1104d06ba886Af27B8084fBF69AAEb2dD56,0xBc56f459bb04147dbF3Dc18AC54707BB6F65A515,0xbcCC6D16E447f0c1293972d0c080860acd1F053D
Arg [1] : shares_ (uint256[]): 41,41,8,10

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 000000000000000000000000c974df7cf267fdd454776cc64725dd6f77f0212a
Arg [4] : 00000000000000000000000076a3b1104d06ba886af27b8084fbf69aaeb2dd56
Arg [5] : 000000000000000000000000bc56f459bb04147dbf3dc18ac54707bb6f65a515
Arg [6] : 000000000000000000000000bccc6d16e447f0c1293972d0c080860acd1f053d
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [11] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

34302:3789:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21363:40;21379:12;:10;:12::i;:::-;21393:9;21363:40;;;;;;;:::i;:::-;;;;;;;;34302:3789;;;;;26855:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30559:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35598:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35784:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37375:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35903:974;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23149:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36885:325;;;:::i;:::-;;28398:1299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21494:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22623:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37859:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23983:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29705:659;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37587:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34530:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34672:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34884:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34631:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34451:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37473:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22849:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34793:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35689:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22345:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27457:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37695:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34386:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34416:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22141:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34584:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21931:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34360:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21679:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26928:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27672:718;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2882:98;2935:7;2962:10;2955:17;;2882:98;:::o;26855:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30559:345::-;30635:4;30687:10;30672:25;;:11;:25;;;;:101;;;;30763:10;30748:25;;:11;:25;;;;30672:101;:178;;;;30840:10;30825:25;;:11;:25;;;;30672:178;30652:198;;30559:345;;;:::o;35598:83::-;35635:13;35668:5;35661:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35598:83;:::o;35784:111::-;35847:13;35880:7;35873:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35784:111;;;:::o;37375:90::-;37321:5;;;;;;;;;;;37307:19;;:10;:19;;;37303:42;;37335:10;;;;;;;;;;;;;;37303:42;37449:8:::1;37441:5;;:16;;;;;;;;;;;;;;;;;;37375:90:::0;:::o;35903:974::-;36073:15;;;;;;;;;;;36068:54;;36097:25;;;;;;;;;;;;;;36068:54;34620:4;36153:10;36137:13;;:26;;;;:::i;:::-;:38;36133:73;;;36184:22;;;;;;;;;;;;;;36133:73;36307:11;36294:10;36277;:14;36288:2;36277:14;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:41;36273:70;;;36327:16;;;;;;;;;;;;;;36273:70;36383:10;34566:9;36371:22;;;;:::i;:::-;36358:9;:35;36354:67;;36402:19;;;;;;;;;;;;;;36354:67;36492:12;36534:2;36538:11;36517:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36507:44;;;;;;36492:59;;36562:16;36581:43;36600:5;;36581:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36607:10;;36619:4;36581:18;:43::i;:::-;36562:62;;36640:11;36635:38;;36660:13;;;;;;;;;;;;;;36635:38;36739:10;36721;:14;36732:2;36721:14;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;36797:34;36803:2;34520:1;36797:34;;36816:10;36797:34;;;;;;;;;;;;:5;:34::i;:::-;36859:10;36842:13;;:27;;;;;;;:::i;:::-;;;;;;;;36057:820;;35903:974;;;;;:::o;23149:566::-;23244:1;23225:7;:16;23233:7;23225:16;;;;;;;;;;;;;;;;:20;23217:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23301:21;23349:15;:13;:15::i;:::-;23325:21;:39;;;;:::i;:::-;23301:63;;23375:15;23393:58;23409:7;23418:13;23433:17;23442:7;23433:8;:17::i;:::-;23393:15;:58::i;:::-;23375:76;;23483:1;23472:7;:12;23464:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23567:7;23545:9;:18;23555:7;23545:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;23603:7;23585:14;;:25;;;;;;;:::i;:::-;;;;;;;;23623:35;23641:7;23650;23623:17;:35::i;:::-;23674:33;23690:7;23699;23674:33;;;;;;;:::i;:::-;;;;;;;;23206:509;;23149:566;:::o;36885:325::-;36940:16;;;;;;;;;;;36935:52;;36965:22;;;;;;;;;;;;;;36935:52;34620:4;37018:1;37002:13;;:17;;;;:::i;:::-;:29;36998:64;;;37040:22;;;;;;;;;;;;;;36998:64;34566:9;37077;:22;37073:54;;37108:19;;;;;;;;;;;;;;37073:54;37140:33;37146:10;34520:1;37140:33;;37167:1;37140:33;;;;;;;;;;;;:5;:33::i;:::-;37201:1;37184:13;;:18;;;;;;;:::i;:::-;;;;;;;;36885:325::o;28398:1299::-;28600:17;28620:3;:10;28600:30;;28681:7;:14;28668:9;:27;28660:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;28750:4;28736:18;;:10;:18;;;:56;;;;28758:16;:22;28775:4;28758:22;;;;;;;;;;;;;;;:34;28781:10;28758:34;;;;;;;;;;;;;;;;;;;;;;;;;28736:56;28728:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28896:10;28917:14;28949:9;28944:363;28968:9;28964:1;:13;28944:363;;;29001:3;29005:1;29001:6;;;;;;;;:::i;:::-;;;;;;;;28996:11;;29031:7;29039:1;29031:10;;;;;;;;:::i;:::-;;;;;;;;29022:19;;29081:6;29058:9;:15;29068:4;29058:15;;;;;;;;;;;;;;;:19;29074:2;29058:19;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;29123:6;29102:9;:13;29112:2;29102:13;;;;;;;;;;;;;;;:17;29116:2;29102:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29277:3;;;;;28944:363;;;;29356:2;29324:49;;29350:4;29324:49;;29338:10;29324:49;;;29360:3;29365:7;29324:49;;;;;;;:::i;:::-;;;;;;;;29426:1;29408:2;:14;;;:19;:237;;29593:52;;;29483:162;;;29504:2;29483:47;;;29531:10;29543:4;29549:3;29554:7;29563:4;29483:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:162;;;;29408:237;;;29461:1;29447:16;;:2;:16;;;;29408:237;29386:303;;;;;;;;;;;;:::i;:::-;;;;;;;;;28589:1108;;;28398:1299;;;;;:::o;21494:91::-;21538:7;21565:12;;21558:19;;21494:91;:::o;22623:135::-;22693:7;22720:14;:21;22735:5;22720:21;;;;;;;;;;;;;;;:30;22742:7;22720:30;;;;;;;;;;;;;;;;22713:37;;22623:135;;;;:::o;37859:229::-;37321:5;;;;;;;;;;;37307:19;;:10;:19;;;37303:42;;37335:10;;;;;;;;;;;;;;37303:42;34620:4:::1;37956:6;37940:13;;:22;;;;:::i;:::-;:34;37936:69;;;37983:22;;;;;;;;;;;;;;37936:69;38016:30;38022:2;34520:1;38016:30;;38035:6;38016:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;38074:6;38057:13;;:23;;;;;;;:::i;:::-;;;;;;;;37859:229:::0;;:::o;23983:641::-;24084:1;24065:7;:16;24073:7;24065:16;;;;;;;;;;;;;;;;:20;24057:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24141:21;24198:20;24212:5;24198:13;:20::i;:::-;24165:5;:15;;;24189:4;24165:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;24141:77;;24229:15;24247:65;24263:7;24272:13;24287:24;24296:5;24303:7;24287:8;:24::i;:::-;24247:15;:65::i;:::-;24229:83;;24344:1;24333:7;:12;24325:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24440:7;24406:14;:21;24421:5;24406:21;;;;;;;;;;;;;;;:30;24428:7;24406:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;24488:7;24458:19;:26;24478:5;24458:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;24508:47;24531:5;24538:7;24547;24508:22;:47::i;:::-;24592:5;24571:45;;;24599:7;24608;24571:45;;;;;;;:::i;:::-;;;;;;;;24046:578;;23983:641;;:::o;29705:659::-;29841:25;29884:20;29907:6;:13;29884:36;;29974:3;:10;29958:12;:26;29950:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;30042:12;30028:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30017:38;;30231:9;30226:120;30250:12;30246:1;:16;30226:120;;;30302:9;:20;30312:6;30319:1;30312:9;;;;;;;;:::i;:::-;;;;;;;;30302:20;;;;;;;;;;;;;;;:28;30323:3;30327:1;30323:6;;;;;;;;:::i;:::-;;;;;;;;30302:28;;;;;;;;;;;;30288:8;30297:1;30288:11;;;;;;;;:::i;:::-;;;;;;;:42;;;;;30264:3;;;;;30226:120;;;;29873:491;29705:659;;;;:::o;37587:100::-;37321:5;;;;;;;;;;;37307:19;;:10;:19;;;37303:42;;37335:10;;;;;;;;;;;;;;37303:42;37671:8:::1;37661:7;:18;;;;;;;;;;;;:::i;:::-;;37587:100:::0;:::o;34530:45::-;34566:9;34530:45;:::o;34672:79::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34884:45::-;;;;;;;;;;;;;;;;;:::o;34631:32::-;;;;:::o;34451:27::-;;;;;;;;;;;;;:::o;37473:106::-;37321:5;;;;;;;;;;;37307:19;;:10;:19;;;37303:42;;37335:10;;;;;;;;;;;;;;37303:42;37560:11:::1;37547:10;:24;;;;37473:106:::0;:::o;22849:100::-;22900:7;22927;22935:5;22927:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22920:21;;22849:100;;;:::o;34793:20::-;;;;;;;;;;;;;:::o;35689:87::-;35728:13;35761:7;35754:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35689:87;:::o;22345:109::-;22401:7;22428:9;:18;22438:7;22428:18;;;;;;;;;;;;;;;;22421:25;;22345:109;;;:::o;27457:207::-;27584:8;27543:16;:28;27560:10;27543:28;;;;;;;;;;;;;;;:38;27572:8;27543:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;27637:8;27610:46;;27625:10;27610:46;;;27647:8;27610:46;;;;;;:::i;:::-;;;;;;;;27457:207;;:::o;37695:156::-;37321:5;;;;;;;;;;;37307:19;;:10;:19;;;37303:42;;37335:10;;;;;;;;;;;;;;37303:42;37794:9:::1;37776:15;;:27;;;;;;;;;;;;;;;;;;37833:10;37814:16;;:29;;;;;;;;;;;;;;;;;;37695:156:::0;;:::o;34386:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34416:28::-;;;;;;;;;;;;;:::o;22141:105::-;22195:7;22222;:16;22230:7;22222:16;;;;;;;;;;;;;;;;22215:23;;22141:105;;;:::o;34584:40::-;34620:4;34584:40;:::o;21931:119::-;21989:7;22016:19;:26;22036:5;22016:26;;;;;;;;;;;;;;;;22009:33;;21931:119;;;:::o;34360:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21679:95::-;21725:7;21752:14;;21745:21;;21679:95;:::o;26928:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27672:718::-;27871:4;27857:18;;:10;:18;;;:56;;;;27879:16;:22;27896:4;27879:22;;;;;;;;;;;;;;;:34;27902:10;27879:34;;;;;;;;;;;;;;;;;;;;;;;;;27857:56;27849:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27968:6;27945:9;:15;27955:4;27945:15;;;;;;;;;;;;;;;:19;27961:2;27945:19;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;28006:6;27985:9;:13;27995:2;27985:13;;;;;;;;;;;;;;;:17;27999:2;27985:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28063:2;28030:48;;28057:4;28030:48;;28045:10;28030:48;;;28067:2;28071:6;28030:48;;;;;;;:::i;:::-;;;;;;;;28131:1;28113:2;:14;;;:19;:225;;28291:47;;;28188:150;;;28209:2;28188:42;;;28231:10;28243:4;28249:2;28253:6;28261:4;28188:78;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:150;;;;28113:225;;;28166:1;28152:16;;:2;:16;;;;28113:225;28091:291;;;;;;;;;;;;:::i;:::-;;;;;;;;;27672:718;;;;;:::o;943:190::-;1068:4;1121;1092:25;1105:5;1112:4;1092:12;:25::i;:::-;:33;1085:40;;943:190;;;;;:::o;31105:554::-;31263:6;31242:9;:13;31252:2;31242:13;;;;;;;;;;;;;;;:17;31256:2;31242:17;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;31326:2;31287:54;;31322:1;31287:54;;31302:10;31287:54;;;31330:2;31334:6;31287:54;;;;;;;:::i;:::-;;;;;;;;31394:1;31376:2;:14;;;:19;:231;;31560:47;;;31451:156;;;31472:2;31451:42;;;31494:10;31514:1;31518:2;31522:6;31530:4;31451:84;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:156;;;;31376:231;;;31429:1;31415:16;;:2;:16;;;;31376:231;31354:297;;;;;;;;;;;;:::i;:::-;;;;;;;;;31105:554;;;;:::o;24802:248::-;24948:7;25027:15;25012:12;;24992:7;:16;25000:7;24992:16;;;;;;;;;;;;;;;;24976:13;:32;;;;:::i;:::-;24975:49;;;;:::i;:::-;:67;;;;:::i;:::-;24968:74;;24802:248;;;;;:::o;5238:317::-;5353:6;5328:21;:31;;5320:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5407:12;5425:9;:14;;5447:6;5425:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5406:52;;;5477:7;5469:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5309:246;5238:317;;:::o;14823:211::-;14940:86;14960:5;14990:23;;;15015:2;15019:5;14967:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14940:19;:86::i;:::-;14823:211;;;:::o;1495:701::-;1578:7;1598:20;1621:4;1598:27;;1641:9;1636:523;1660:5;:12;1656:1;:16;1636:523;;;1694:20;1717:5;1723:1;1717:8;;;;;;;;:::i;:::-;;;;;;;;1694:31;;1760:12;1744;:28;1740:408;;1914:12;1928;1897:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1887:55;;;;;;1872:70;;1740:408;;;2104:12;2118;2087:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2077:55;;;;;;2062:70;;1740:408;1679:480;1674:3;;;;;:::i;:::-;;;;1636:523;;;;2176:12;2169:19;;;1495:701;;;;:::o;17396:716::-;17820:23;17846:69;17874:4;17846:69;;;;;;;;;;;;;;;;;17854:5;17846:27;;;;:69;;;;;:::i;:::-;17820:95;;17950:1;17930:10;:17;:21;17926:179;;;18027:10;18016:30;;;;;;;;;;;;:::i;:::-;18008:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;17926:179;17466:646;17396:716;;:::o;6722:229::-;6859:12;6891:52;6913:6;6921:4;6927:1;6930:12;6891:21;:52::i;:::-;6884:59;;6722:229;;;;;:::o;7842:510::-;8012:12;8070:5;8045:21;:30;;8037:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8137:18;8148:6;8137:10;:18::i;:::-;8129:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;8203:12;8217:23;8244:6;:11;;8263:5;8270:4;8244:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8202:73;;;;8293:51;8310:7;8319:10;8331:12;8293:16;:51::i;:::-;8286:58;;;;7842:510;;;;;;:::o;3916:387::-;3976:4;4184:12;4251:7;4239:20;4231:28;;4294:1;4287:4;:8;4280:15;;;3916:387;;;:::o;10528:712::-;10678:12;10707:7;10703:530;;;10738:10;10731:17;;;;10703:530;10872:1;10852:10;:17;:21;10848:374;;;11050:10;11044:17;11111:15;11098:10;11094:2;11090:19;11083:44;10848:374;11193:12;11186:20;;;;;;;;;;;:::i;:::-;;;;;;;;10528:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:122;1310:24;1328:5;1310:24;:::i;:::-;1303:5;1300:35;1290:63;;1349:1;1346;1339:12;1290:63;1237:122;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1365:139;;;;:::o;1510:122::-;1583:24;1601:5;1583:24;:::i;:::-;1576:5;1573:35;1563:63;;1622:1;1619;1612:12;1563:63;1510:122;:::o;1638:139::-;1684:5;1722:6;1709:20;1700:29;;1738:33;1765:5;1738:33;:::i;:::-;1638:139;;;;:::o;1783:474::-;1851:6;1859;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:53;2104:7;2095:6;2084:9;2080:22;2059:53;:::i;:::-;2049:63;;2005:117;2161:2;2187:53;2232:7;2223:6;2212:9;2208:22;2187:53;:::i;:::-;2177:63;;2132:118;1783:474;;;;;:::o;2263:222::-;2356:4;2394:2;2383:9;2379:18;2371:26;;2407:71;2475:1;2464:9;2460:17;2451:6;2407:71;:::i;:::-;2263:222;;;;:::o;2491:149::-;2527:7;2567:66;2560:5;2556:78;2545:89;;2491:149;;;:::o;2646:120::-;2718:23;2735:5;2718:23;:::i;:::-;2711:5;2708:34;2698:62;;2756:1;2753;2746:12;2698:62;2646:120;:::o;2772:137::-;2817:5;2855:6;2842:20;2833:29;;2871:32;2897:5;2871:32;:::i;:::-;2772:137;;;;:::o;2915:327::-;2973:6;3022:2;3010:9;3001:7;2997:23;2993:32;2990:119;;;3028:79;;:::i;:::-;2990:119;3148:1;3173:52;3217:7;3208:6;3197:9;3193:22;3173:52;:::i;:::-;3163:62;;3119:116;2915:327;;;;:::o;3248:90::-;3282:7;3325:5;3318:13;3311:21;3300:32;;3248:90;;;:::o;3344:109::-;3425:21;3440:5;3425:21;:::i;:::-;3420:3;3413:34;3344:109;;:::o;3459:210::-;3546:4;3584:2;3573:9;3569:18;3561:26;;3597:65;3659:1;3648:9;3644:17;3635:6;3597:65;:::i;:::-;3459:210;;;;:::o;3675:99::-;3727:6;3761:5;3755:12;3745:22;;3675:99;;;:::o;3780:169::-;3864:11;3898:6;3893:3;3886:19;3938:4;3933:3;3929:14;3914:29;;3780:169;;;;:::o;3955:307::-;4023:1;4033:113;4047:6;4044:1;4041:13;4033:113;;;4132:1;4127:3;4123:11;4117:18;4113:1;4108:3;4104:11;4097:39;4069:2;4066:1;4062:10;4057:15;;4033:113;;;4164:6;4161:1;4158:13;4155:101;;;4244:1;4235:6;4230:3;4226:16;4219:27;4155:101;4004:258;3955:307;;;:::o;4268:102::-;4309:6;4360:2;4356:7;4351:2;4344:5;4340:14;4336:28;4326:38;;4268:102;;;:::o;4376:364::-;4464:3;4492:39;4525:5;4492:39;:::i;:::-;4547:71;4611:6;4606:3;4547:71;:::i;:::-;4540:78;;4627:52;4672:6;4667:3;4660:4;4653:5;4649:16;4627:52;:::i;:::-;4704:29;4726:6;4704:29;:::i;:::-;4699:3;4695:39;4688:46;;4468:272;4376:364;;;;:::o;4746:313::-;4859:4;4897:2;4886:9;4882:18;4874:26;;4946:9;4940:4;4936:20;4932:1;4921:9;4917:17;4910:47;4974:78;5047:4;5038:6;4974:78;:::i;:::-;4966:86;;4746:313;;;;:::o;5065:329::-;5124:6;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5065:329;;;;:::o;5400:::-;5459:6;5508:2;5496:9;5487:7;5483:23;5479:32;5476:119;;;5514:79;;:::i;:::-;5476:119;5634:1;5659:53;5704:7;5695:6;5684:9;5680:22;5659:53;:::i;:::-;5649:63;;5605:117;5400:329;;;;:::o;5735:117::-;5844:1;5841;5834:12;5858:117;5967:1;5964;5957:12;5981:117;6090:1;6087;6080:12;6121:568;6194:8;6204:6;6254:3;6247:4;6239:6;6235:17;6231:27;6221:122;;6262:79;;:::i;:::-;6221:122;6375:6;6362:20;6352:30;;6405:18;6397:6;6394:30;6391:117;;;6427:79;;:::i;:::-;6391:117;6541:4;6533:6;6529:17;6517:29;;6595:3;6587:4;6579:6;6575:17;6565:8;6561:32;6558:41;6555:128;;;6602:79;;:::i;:::-;6555:128;6121:568;;;;;:::o;6695:995::-;6808:6;6816;6824;6832;6840;6889:3;6877:9;6868:7;6864:23;6860:33;6857:120;;;6896:79;;:::i;:::-;6857:120;7016:1;7041:53;7086:7;7077:6;7066:9;7062:22;7041:53;:::i;:::-;7031:63;;6987:117;7143:2;7169:53;7214:7;7205:6;7194:9;7190:22;7169:53;:::i;:::-;7159:63;;7114:118;7271:2;7297:53;7342:7;7333:6;7322:9;7318:22;7297:53;:::i;:::-;7287:63;;7242:118;7427:2;7416:9;7412:18;7399:32;7458:18;7450:6;7447:30;7444:117;;;7480:79;;:::i;:::-;7444:117;7593:80;7665:7;7656:6;7645:9;7641:22;7593:80;:::i;:::-;7575:98;;;;7370:313;6695:995;;;;;;;;:::o;7696:104::-;7741:7;7770:24;7788:5;7770:24;:::i;:::-;7759:35;;7696:104;;;:::o;7806:138::-;7887:32;7913:5;7887:32;:::i;:::-;7880:5;7877:43;7867:71;;7934:1;7931;7924:12;7867:71;7806:138;:::o;7950:155::-;8004:5;8042:6;8029:20;8020:29;;8058:41;8093:5;8058:41;:::i;:::-;7950:155;;;;:::o;8111:345::-;8178:6;8227:2;8215:9;8206:7;8202:23;8198:32;8195:119;;;8233:79;;:::i;:::-;8195:119;8353:1;8378:61;8431:7;8422:6;8411:9;8407:22;8378:61;:::i;:::-;8368:71;;8324:125;8111:345;;;;:::o;8462:180::-;8510:77;8507:1;8500:88;8607:4;8604:1;8597:15;8631:4;8628:1;8621:15;8648:281;8731:27;8753:4;8731:27;:::i;:::-;8723:6;8719:40;8861:6;8849:10;8846:22;8825:18;8813:10;8810:34;8807:62;8804:88;;;8872:18;;:::i;:::-;8804:88;8912:10;8908:2;8901:22;8691:238;8648:281;;:::o;8935:129::-;8969:6;8996:20;;:::i;:::-;8986:30;;9025:33;9053:4;9045:6;9025:33;:::i;:::-;8935:129;;;:::o;9070:311::-;9147:4;9237:18;9229:6;9226:30;9223:56;;;9259:18;;:::i;:::-;9223:56;9309:4;9301:6;9297:17;9289:25;;9369:4;9363;9359:15;9351:23;;9070:311;;;:::o;9404:710::-;9500:5;9525:81;9541:64;9598:6;9541:64;:::i;:::-;9525:81;:::i;:::-;9516:90;;9626:5;9655:6;9648:5;9641:21;9689:4;9682:5;9678:16;9671:23;;9742:4;9734:6;9730:17;9722:6;9718:30;9771:3;9763:6;9760:15;9757:122;;;9790:79;;:::i;:::-;9757:122;9905:6;9888:220;9922:6;9917:3;9914:15;9888:220;;;9997:3;10026:37;10059:3;10047:10;10026:37;:::i;:::-;10021:3;10014:50;10093:4;10088:3;10084:14;10077:21;;9964:144;9948:4;9943:3;9939:14;9932:21;;9888:220;;;9892:21;9506:608;;9404:710;;;;;:::o;10137:370::-;10208:5;10257:3;10250:4;10242:6;10238:17;10234:27;10224:122;;10265:79;;:::i;:::-;10224:122;10382:6;10369:20;10407:94;10497:3;10489:6;10482:4;10474:6;10470:17;10407:94;:::i;:::-;10398:103;;10214:293;10137:370;;;;:::o;10513:117::-;10622:1;10619;10612:12;10636:307;10697:4;10787:18;10779:6;10776:30;10773:56;;;10809:18;;:::i;:::-;10773:56;10847:29;10869:6;10847:29;:::i;:::-;10839:37;;10931:4;10925;10921:15;10913:23;;10636:307;;;:::o;10949:154::-;11033:6;11028:3;11023;11010:30;11095:1;11086:6;11081:3;11077:16;11070:27;10949:154;;;:::o;11109:410::-;11186:5;11211:65;11227:48;11268:6;11227:48;:::i;:::-;11211:65;:::i;:::-;11202:74;;11299:6;11292:5;11285:21;11337:4;11330:5;11326:16;11375:3;11366:6;11361:3;11357:16;11354:25;11351:112;;;11382:79;;:::i;:::-;11351:112;11472:41;11506:6;11501:3;11496;11472:41;:::i;:::-;11192:327;11109:410;;;;;:::o;11538:338::-;11593:5;11642:3;11635:4;11627:6;11623:17;11619:27;11609:122;;11650:79;;:::i;:::-;11609:122;11767:6;11754:20;11792:78;11866:3;11858:6;11851:4;11843:6;11839:17;11792:78;:::i;:::-;11783:87;;11599:277;11538:338;;;;:::o;11882:1509::-;12036:6;12044;12052;12060;12068;12117:3;12105:9;12096:7;12092:23;12088:33;12085:120;;;12124:79;;:::i;:::-;12085:120;12244:1;12269:53;12314:7;12305:6;12294:9;12290:22;12269:53;:::i;:::-;12259:63;;12215:117;12371:2;12397:53;12442:7;12433:6;12422:9;12418:22;12397:53;:::i;:::-;12387:63;;12342:118;12527:2;12516:9;12512:18;12499:32;12558:18;12550:6;12547:30;12544:117;;;12580:79;;:::i;:::-;12544:117;12685:78;12755:7;12746:6;12735:9;12731:22;12685:78;:::i;:::-;12675:88;;12470:303;12840:2;12829:9;12825:18;12812:32;12871:18;12863:6;12860:30;12857:117;;;12893:79;;:::i;:::-;12857:117;12998:78;13068:7;13059:6;13048:9;13044:22;12998:78;:::i;:::-;12988:88;;12783:303;13153:3;13142:9;13138:19;13125:33;13185:18;13177:6;13174:30;13171:117;;;13207:79;;:::i;:::-;13171:117;13312:62;13366:7;13357:6;13346:9;13342:22;13312:62;:::i;:::-;13302:72;;13096:288;11882:1509;;;;;;;;:::o;13397:110::-;13448:7;13477:24;13495:5;13477:24;:::i;:::-;13466:35;;13397:110;;;:::o;13513:150::-;13600:38;13632:5;13600:38;:::i;:::-;13593:5;13590:49;13580:77;;13653:1;13650;13643:12;13580:77;13513:150;:::o;13669:167::-;13729:5;13767:6;13754:20;13745:29;;13783:47;13824:5;13783:47;:::i;:::-;13669:167;;;;:::o;13842:502::-;13924:6;13932;13981:2;13969:9;13960:7;13956:23;13952:32;13949:119;;;13987:79;;:::i;:::-;13949:119;14107:1;14132:67;14191:7;14182:6;14171:9;14167:22;14132:67;:::i;:::-;14122:77;;14078:131;14248:2;14274:53;14319:7;14310:6;14299:9;14295:22;14274:53;:::i;:::-;14264:63;;14219:118;13842:502;;;;;:::o;14350:311::-;14427:4;14517:18;14509:6;14506:30;14503:56;;;14539:18;;:::i;:::-;14503:56;14589:4;14581:6;14577:17;14569:25;;14649:4;14643;14639:15;14631:23;;14350:311;;;:::o;14684:710::-;14780:5;14805:81;14821:64;14878:6;14821:64;:::i;:::-;14805:81;:::i;:::-;14796:90;;14906:5;14935:6;14928:5;14921:21;14969:4;14962:5;14958:16;14951:23;;15022:4;15014:6;15010:17;15002:6;14998:30;15051:3;15043:6;15040:15;15037:122;;;15070:79;;:::i;:::-;15037:122;15185:6;15168:220;15202:6;15197:3;15194:15;15168:220;;;15277:3;15306:37;15339:3;15327:10;15306:37;:::i;:::-;15301:3;15294:50;15373:4;15368:3;15364:14;15357:21;;15244:144;15228:4;15223:3;15219:14;15212:21;;15168:220;;;15172:21;14786:608;;14684:710;;;;;:::o;15417:370::-;15488:5;15537:3;15530:4;15522:6;15518:17;15514:27;15504:122;;15545:79;;:::i;:::-;15504:122;15662:6;15649:20;15687:94;15777:3;15769:6;15762:4;15754:6;15750:17;15687:94;:::i;:::-;15678:103;;15494:293;15417:370;;;;:::o;15793:894::-;15911:6;15919;15968:2;15956:9;15947:7;15943:23;15939:32;15936:119;;;15974:79;;:::i;:::-;15936:119;16122:1;16111:9;16107:17;16094:31;16152:18;16144:6;16141:30;16138:117;;;16174:79;;:::i;:::-;16138:117;16279:78;16349:7;16340:6;16329:9;16325:22;16279:78;:::i;:::-;16269:88;;16065:302;16434:2;16423:9;16419:18;16406:32;16465:18;16457:6;16454:30;16451:117;;;16487:79;;:::i;:::-;16451:117;16592:78;16662:7;16653:6;16642:9;16638:22;16592:78;:::i;:::-;16582:88;;16377:303;15793:894;;;;;:::o;16693:114::-;16760:6;16794:5;16788:12;16778:22;;16693:114;;;:::o;16813:184::-;16912:11;16946:6;16941:3;16934:19;16986:4;16981:3;16977:14;16962:29;;16813:184;;;;:::o;17003:132::-;17070:4;17093:3;17085:11;;17123:4;17118:3;17114:14;17106:22;;17003:132;;;:::o;17141:108::-;17218:24;17236:5;17218:24;:::i;:::-;17213:3;17206:37;17141:108;;:::o;17255:179::-;17324:10;17345:46;17387:3;17379:6;17345:46;:::i;:::-;17423:4;17418:3;17414:14;17400:28;;17255:179;;;;:::o;17440:113::-;17510:4;17542;17537:3;17533:14;17525:22;;17440:113;;;:::o;17589:732::-;17708:3;17737:54;17785:5;17737:54;:::i;:::-;17807:86;17886:6;17881:3;17807:86;:::i;:::-;17800:93;;17917:56;17967:5;17917:56;:::i;:::-;17996:7;18027:1;18012:284;18037:6;18034:1;18031:13;18012:284;;;18113:6;18107:13;18140:63;18199:3;18184:13;18140:63;:::i;:::-;18133:70;;18226:60;18279:6;18226:60;:::i;:::-;18216:70;;18072:224;18059:1;18056;18052:9;18047:14;;18012:284;;;18016:14;18312:3;18305:10;;17713:608;;;17589:732;;;;:::o;18327:373::-;18470:4;18508:2;18497:9;18493:18;18485:26;;18557:9;18551:4;18547:20;18543:1;18532:9;18528:17;18521:47;18585:108;18688:4;18679:6;18585:108;:::i;:::-;18577:116;;18327:373;;;;:::o;18706:308::-;18768:4;18858:18;18850:6;18847:30;18844:56;;;18880:18;;:::i;:::-;18844:56;18918:29;18940:6;18918:29;:::i;:::-;18910:37;;19002:4;18996;18992:15;18984:23;;18706:308;;;:::o;19020:412::-;19098:5;19123:66;19139:49;19181:6;19139:49;:::i;:::-;19123:66;:::i;:::-;19114:75;;19212:6;19205:5;19198:21;19250:4;19243:5;19239:16;19288:3;19279:6;19274:3;19270:16;19267:25;19264:112;;;19295:79;;:::i;:::-;19264:112;19385:41;19419:6;19414:3;19409;19385:41;:::i;:::-;19104:328;19020:412;;;;;:::o;19452:340::-;19508:5;19557:3;19550:4;19542:6;19538:17;19534:27;19524:122;;19565:79;;:::i;:::-;19524:122;19682:6;19669:20;19707:79;19782:3;19774:6;19767:4;19759:6;19755:17;19707:79;:::i;:::-;19698:88;;19514:278;19452:340;;;;:::o;19798:509::-;19867:6;19916:2;19904:9;19895:7;19891:23;19887:32;19884:119;;;19922:79;;:::i;:::-;19884:119;20070:1;20059:9;20055:17;20042:31;20100:18;20092:6;20089:30;20086:117;;;20122:79;;:::i;:::-;20086:117;20227:63;20282:7;20273:6;20262:9;20258:22;20227:63;:::i;:::-;20217:73;;20013:287;19798:509;;;;:::o;20313:77::-;20350:7;20379:5;20368:16;;20313:77;;;:::o;20396:122::-;20469:24;20487:5;20469:24;:::i;:::-;20462:5;20459:35;20449:63;;20508:1;20505;20498:12;20449:63;20396:122;:::o;20524:139::-;20570:5;20608:6;20595:20;20586:29;;20624:33;20651:5;20624:33;:::i;:::-;20524:139;;;;:::o;20669:329::-;20728:6;20777:2;20765:9;20756:7;20752:23;20748:32;20745:119;;;20783:79;;:::i;:::-;20745:119;20903:1;20928:53;20973:7;20964:6;20953:9;20949:22;20928:53;:::i;:::-;20918:63;;20874:117;20669:329;;;;:::o;21004:222::-;21097:4;21135:2;21124:9;21120:18;21112:26;;21148:71;21216:1;21205:9;21201:17;21192:6;21148:71;:::i;:::-;21004:222;;;;:::o;21232:116::-;21302:21;21317:5;21302:21;:::i;:::-;21295:5;21292:32;21282:60;;21338:1;21335;21328:12;21282:60;21232:116;:::o;21354:133::-;21397:5;21435:6;21422:20;21413:29;;21451:30;21475:5;21451:30;:::i;:::-;21354:133;;;;:::o;21493:468::-;21558:6;21566;21615:2;21603:9;21594:7;21590:23;21586:32;21583:119;;;21621:79;;:::i;:::-;21583:119;21741:1;21766:53;21811:7;21802:6;21791:9;21787:22;21766:53;:::i;:::-;21756:63;;21712:117;21868:2;21894:50;21936:7;21927:6;21916:9;21912:22;21894:50;:::i;:::-;21884:60;;21839:115;21493:468;;;;;:::o;21967:462::-;22029:6;22037;22086:2;22074:9;22065:7;22061:23;22057:32;22054:119;;;22092:79;;:::i;:::-;22054:119;22212:1;22237:50;22279:7;22270:6;22259:9;22255:22;22237:50;:::i;:::-;22227:60;;22183:114;22336:2;22362:50;22404:7;22395:6;22384:9;22380:22;22362:50;:::i;:::-;22352:60;;22307:115;21967:462;;;;;:::o;22435:357::-;22508:6;22557:2;22545:9;22536:7;22532:23;22528:32;22525:119;;;22563:79;;:::i;:::-;22525:119;22683:1;22708:67;22767:7;22758:6;22747:9;22743:22;22708:67;:::i;:::-;22698:77;;22654:131;22435:357;;;;:::o;22798:474::-;22866:6;22874;22923:2;22911:9;22902:7;22898:23;22894:32;22891:119;;;22929:79;;:::i;:::-;22891:119;23049:1;23074:53;23119:7;23110:6;23099:9;23095:22;23074:53;:::i;:::-;23064:63;;23020:117;23176:2;23202:53;23247:7;23238:6;23227:9;23223:22;23202:53;:::i;:::-;23192:63;;23147:118;22798:474;;;;;:::o;23278:1089::-;23382:6;23390;23398;23406;23414;23463:3;23451:9;23442:7;23438:23;23434:33;23431:120;;;23470:79;;:::i;:::-;23431:120;23590:1;23615:53;23660:7;23651:6;23640:9;23636:22;23615:53;:::i;:::-;23605:63;;23561:117;23717:2;23743:53;23788:7;23779:6;23768:9;23764:22;23743:53;:::i;:::-;23733:63;;23688:118;23845:2;23871:53;23916:7;23907:6;23896:9;23892:22;23871:53;:::i;:::-;23861:63;;23816:118;23973:2;23999:53;24044:7;24035:6;24024:9;24020:22;23999:53;:::i;:::-;23989:63;;23944:118;24129:3;24118:9;24114:19;24101:33;24161:18;24153:6;24150:30;24147:117;;;24183:79;;:::i;:::-;24147:117;24288:62;24342:7;24333:6;24322:9;24318:22;24288:62;:::i;:::-;24278:72;;24072:288;23278:1089;;;;;;;;:::o;24373:180::-;24421:77;24418:1;24411:88;24518:4;24515:1;24508:15;24542:4;24539:1;24532:15;24559:320;24603:6;24640:1;24634:4;24630:12;24620:22;;24687:1;24681:4;24677:12;24708:18;24698:81;;24764:4;24756:6;24752:17;24742:27;;24698:81;24826:2;24818:6;24815:14;24795:18;24792:38;24789:84;;24845:18;;:::i;:::-;24789:84;24610:269;24559:320;;;:::o;24885:180::-;24933:77;24930:1;24923:88;25030:4;25027:1;25020:15;25054:4;25051:1;25044:15;25071:305;25111:3;25130:20;25148:1;25130:20;:::i;:::-;25125:25;;25164:20;25182:1;25164:20;:::i;:::-;25159:25;;25318:1;25250:66;25246:74;25243:1;25240:81;25237:107;;;25324:18;;:::i;:::-;25237:107;25368:1;25365;25361:9;25354:16;;25071:305;;;;:::o;25382:348::-;25422:7;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25479:20;25497:1;25479:20;:::i;:::-;25474:25;;25667:1;25599:66;25595:74;25592:1;25589:81;25584:1;25577:9;25570:17;25566:105;25563:131;;;25674:18;;:::i;:::-;25563:131;25722:1;25719;25715:9;25704:20;;25382:348;;;;:::o;25736:94::-;25769:8;25817:5;25813:2;25809:14;25788:35;;25736:94;;;:::o;25836:::-;25875:7;25904:20;25918:5;25904:20;:::i;:::-;25893:31;;25836:94;;;:::o;25936:100::-;25975:7;26004:26;26024:5;26004:26;:::i;:::-;25993:37;;25936:100;;;:::o;26042:157::-;26147:45;26167:24;26185:5;26167:24;:::i;:::-;26147:45;:::i;:::-;26142:3;26135:58;26042:157;;:::o;26205:79::-;26244:7;26273:5;26262:16;;26205:79;;;:::o;26290:157::-;26395:45;26415:24;26433:5;26415:24;:::i;:::-;26395:45;:::i;:::-;26390:3;26383:58;26290:157;;:::o;26453:397::-;26593:3;26608:75;26679:3;26670:6;26608:75;:::i;:::-;26708:2;26703:3;26699:12;26692:19;;26721:75;26792:3;26783:6;26721:75;:::i;:::-;26821:2;26816:3;26812:12;26805:19;;26841:3;26834:10;;26453:397;;;;;:::o;26856:225::-;26996:34;26992:1;26984:6;26980:14;26973:58;27065:8;27060:2;27052:6;27048:15;27041:33;26856:225;:::o;27087:366::-;27229:3;27250:67;27314:2;27309:3;27250:67;:::i;:::-;27243:74;;27326:93;27415:3;27326:93;:::i;:::-;27444:2;27439:3;27435:12;27428:19;;27087:366;;;:::o;27459:419::-;27625:4;27663:2;27652:9;27648:18;27640:26;;27712:9;27706:4;27702:20;27698:1;27687:9;27683:17;27676:47;27740:131;27866:4;27740:131;:::i;:::-;27732:139;;27459:419;;;:::o;27884:230::-;28024:34;28020:1;28012:6;28008:14;28001:58;28093:13;28088:2;28080:6;28076:15;28069:38;27884:230;:::o;28120:366::-;28262:3;28283:67;28347:2;28342:3;28283:67;:::i;:::-;28276:74;;28359:93;28448:3;28359:93;:::i;:::-;28477:2;28472:3;28468:12;28461:19;;28120:366;;;:::o;28492:419::-;28658:4;28696:2;28685:9;28681:18;28673:26;;28745:9;28739:4;28735:20;28731:1;28720:9;28716:17;28709:47;28773:131;28899:4;28773:131;:::i;:::-;28765:139;;28492:419;;;:::o;28917:60::-;28945:3;28966:5;28959:12;;28917:60;;;:::o;28983:142::-;29033:9;29066:53;29084:34;29093:24;29111:5;29093:24;:::i;:::-;29084:34;:::i;:::-;29066:53;:::i;:::-;29053:66;;28983:142;;;:::o;29131:126::-;29181:9;29214:37;29245:5;29214:37;:::i;:::-;29201:50;;29131:126;;;:::o;29263:134::-;29321:9;29354:37;29385:5;29354:37;:::i;:::-;29341:50;;29263:134;;;:::o;29403:147::-;29498:45;29537:5;29498:45;:::i;:::-;29493:3;29486:58;29403:147;;:::o;29556:348::-;29685:4;29723:2;29712:9;29708:18;29700:26;;29736:79;29812:1;29801:9;29797:17;29788:6;29736:79;:::i;:::-;29825:72;29893:2;29882:9;29878:18;29869:6;29825:72;:::i;:::-;29556:348;;;;;:::o;29910:165::-;30050:17;30046:1;30038:6;30034:14;30027:41;29910:165;:::o;30081:366::-;30223:3;30244:67;30308:2;30303:3;30244:67;:::i;:::-;30237:74;;30320:93;30409:3;30320:93;:::i;:::-;30438:2;30433:3;30429:12;30422:19;;30081:366;;;:::o;30453:419::-;30619:4;30657:2;30646:9;30642:18;30634:26;;30706:9;30700:4;30696:20;30692:1;30681:9;30677:17;30670:47;30734:131;30860:4;30734:131;:::i;:::-;30726:139;;30453:419;;;:::o;30878:164::-;31018:16;31014:1;31006:6;31002:14;30995:40;30878:164;:::o;31048:366::-;31190:3;31211:67;31275:2;31270:3;31211:67;:::i;:::-;31204:74;;31287:93;31376:3;31287:93;:::i;:::-;31405:2;31400:3;31396:12;31389:19;;31048:366;;;:::o;31420:419::-;31586:4;31624:2;31613:9;31609:18;31601:26;;31673:9;31667:4;31663:20;31659:1;31648:9;31644:17;31637:47;31701:131;31827:4;31701:131;:::i;:::-;31693:139;;31420:419;;;:::o;31845:180::-;31893:77;31890:1;31883:88;31990:4;31987:1;31980:15;32014:4;32011:1;32004:15;32031:191;32071:4;32091:20;32109:1;32091:20;:::i;:::-;32086:25;;32125:20;32143:1;32125:20;:::i;:::-;32120:25;;32164:1;32161;32158:8;32155:34;;;32169:18;;:::i;:::-;32155:34;32214:1;32211;32207:9;32199:17;;32031:191;;;;:::o;32228:634::-;32449:4;32487:2;32476:9;32472:18;32464:26;;32536:9;32530:4;32526:20;32522:1;32511:9;32507:17;32500:47;32564:108;32667:4;32658:6;32564:108;:::i;:::-;32556:116;;32719:9;32713:4;32709:20;32704:2;32693:9;32689:18;32682:48;32747:108;32850:4;32841:6;32747:108;:::i;:::-;32739:116;;32228:634;;;;;:::o;32868:98::-;32919:6;32953:5;32947:12;32937:22;;32868:98;;;:::o;32972:168::-;33055:11;33089:6;33084:3;33077:19;33129:4;33124:3;33120:14;33105:29;;32972:168;;;;:::o;33146:360::-;33232:3;33260:38;33292:5;33260:38;:::i;:::-;33314:70;33377:6;33372:3;33314:70;:::i;:::-;33307:77;;33393:52;33438:6;33433:3;33426:4;33419:5;33415:16;33393:52;:::i;:::-;33470:29;33492:6;33470:29;:::i;:::-;33465:3;33461:39;33454:46;;33236:270;33146:360;;;;:::o;33512:1053::-;33835:4;33873:3;33862:9;33858:19;33850:27;;33887:71;33955:1;33944:9;33940:17;33931:6;33887:71;:::i;:::-;33968:72;34036:2;34025:9;34021:18;34012:6;33968:72;:::i;:::-;34087:9;34081:4;34077:20;34072:2;34061:9;34057:18;34050:48;34115:108;34218:4;34209:6;34115:108;:::i;:::-;34107:116;;34270:9;34264:4;34260:20;34255:2;34244:9;34240:18;34233:48;34298:108;34401:4;34392:6;34298:108;:::i;:::-;34290:116;;34454:9;34448:4;34444:20;34438:3;34427:9;34423:19;34416:49;34482:76;34553:4;34544:6;34482:76;:::i;:::-;34474:84;;33512:1053;;;;;;;;:::o;34571:141::-;34627:5;34658:6;34652:13;34643:22;;34674:32;34700:5;34674:32;:::i;:::-;34571:141;;;;:::o;34718:349::-;34787:6;34836:2;34824:9;34815:7;34811:23;34807:32;34804:119;;;34842:79;;:::i;:::-;34804:119;34962:1;34987:63;35042:7;35033:6;35022:9;35018:22;34987:63;:::i;:::-;34977:73;;34933:127;34718:349;;;;:::o;35073:166::-;35213:18;35209:1;35201:6;35197:14;35190:42;35073:166;:::o;35245:366::-;35387:3;35408:67;35472:2;35467:3;35408:67;:::i;:::-;35401:74;;35484:93;35573:3;35484:93;:::i;:::-;35602:2;35597:3;35593:12;35586:19;;35245:366;;;:::o;35617:419::-;35783:4;35821:2;35810:9;35806:18;35798:26;;35870:9;35864:4;35860:20;35856:1;35845:9;35841:17;35834:47;35898:131;36024:4;35898:131;:::i;:::-;35890:139;;35617:419;;;:::o;36042:143::-;36099:5;36130:6;36124:13;36115:22;;36146:33;36173:5;36146:33;:::i;:::-;36042:143;;;;:::o;36191:351::-;36261:6;36310:2;36298:9;36289:7;36285:23;36281:32;36278:119;;;36316:79;;:::i;:::-;36278:119;36436:1;36461:64;36517:7;36508:6;36497:9;36493:22;36461:64;:::i;:::-;36451:74;;36407:128;36191:351;;;;:::o;36548:332::-;36669:4;36707:2;36696:9;36692:18;36684:26;;36720:71;36788:1;36777:9;36773:17;36764:6;36720:71;:::i;:::-;36801:72;36869:2;36858:9;36854:18;36845:6;36801:72;:::i;:::-;36548:332;;;;;:::o;36886:751::-;37109:4;37147:3;37136:9;37132:19;37124:27;;37161:71;37229:1;37218:9;37214:17;37205:6;37161:71;:::i;:::-;37242:72;37310:2;37299:9;37295:18;37286:6;37242:72;:::i;:::-;37324;37392:2;37381:9;37377:18;37368:6;37324:72;:::i;:::-;37406;37474:2;37463:9;37459:18;37450:6;37406:72;:::i;:::-;37526:9;37520:4;37516:20;37510:3;37499:9;37495:19;37488:49;37554:76;37625:4;37616:6;37554:76;:::i;:::-;37546:84;;36886:751;;;;;;;;:::o;37643:180::-;37691:77;37688:1;37681:88;37788:4;37785:1;37778:15;37812:4;37809:1;37802:15;37829:185;37869:1;37886:20;37904:1;37886:20;:::i;:::-;37881:25;;37920:20;37938:1;37920:20;:::i;:::-;37915:25;;37959:1;37949:35;;37964:18;;:::i;:::-;37949:35;38006:1;38003;37999:9;37994:14;;37829:185;;;;:::o;38020:179::-;38160:31;38156:1;38148:6;38144:14;38137:55;38020:179;:::o;38205:366::-;38347:3;38368:67;38432:2;38427:3;38368:67;:::i;:::-;38361:74;;38444:93;38533:3;38444:93;:::i;:::-;38562:2;38557:3;38553:12;38546:19;;38205:366;;;:::o;38577:419::-;38743:4;38781:2;38770:9;38766:18;38758:26;;38830:9;38824:4;38820:20;38816:1;38805:9;38801:17;38794:47;38858:131;38984:4;38858:131;:::i;:::-;38850:139;;38577:419;;;:::o;39002:147::-;39103:11;39140:3;39125:18;;39002:147;;;;:::o;39155:114::-;;:::o;39275:398::-;39434:3;39455:83;39536:1;39531:3;39455:83;:::i;:::-;39448:90;;39547:93;39636:3;39547:93;:::i;:::-;39665:1;39660:3;39656:11;39649:18;;39275:398;;;:::o;39679:379::-;39863:3;39885:147;40028:3;39885:147;:::i;:::-;39878:154;;40049:3;40042:10;;39679:379;;;:::o;40064:245::-;40204:34;40200:1;40192:6;40188:14;40181:58;40273:28;40268:2;40260:6;40256:15;40249:53;40064:245;:::o;40315:366::-;40457:3;40478:67;40542:2;40537:3;40478:67;:::i;:::-;40471:74;;40554:93;40643:3;40554:93;:::i;:::-;40672:2;40667:3;40663:12;40656:19;;40315:366;;;:::o;40687:419::-;40853:4;40891:2;40880:9;40876:18;40868:26;;40940:9;40934:4;40930:20;40926:1;40915:9;40911:17;40904:47;40968:131;41094:4;40968:131;:::i;:::-;40960:139;;40687:419;;;:::o;41112:79::-;41151:7;41180:5;41169:16;;41112:79;;;:::o;41197:157::-;41302:45;41322:24;41340:5;41322:24;:::i;:::-;41302:45;:::i;:::-;41297:3;41290:58;41197:157;;:::o;41360:397::-;41500:3;41515:75;41586:3;41577:6;41515:75;:::i;:::-;41615:2;41610:3;41606:12;41599:19;;41628:75;41699:3;41690:6;41628:75;:::i;:::-;41728:2;41723:3;41719:12;41712:19;;41748:3;41741:10;;41360:397;;;;;:::o;41763:233::-;41802:3;41825:24;41843:5;41825:24;:::i;:::-;41816:33;;41871:66;41864:5;41861:77;41858:103;;41941:18;;:::i;:::-;41858:103;41988:1;41981:5;41977:13;41970:20;;41763:233;;;:::o;42002:137::-;42056:5;42087:6;42081:13;42072:22;;42103:30;42127:5;42103:30;:::i;:::-;42002:137;;;;:::o;42145:345::-;42212:6;42261:2;42249:9;42240:7;42236:23;42232:32;42229:119;;;42267:79;;:::i;:::-;42229:119;42387:1;42412:61;42465:7;42456:6;42445:9;42441:22;42412:61;:::i;:::-;42402:71;;42358:125;42145:345;;;;:::o;42496:229::-;42636:34;42632:1;42624:6;42620:14;42613:58;42705:12;42700:2;42692:6;42688:15;42681:37;42496:229;:::o;42731:366::-;42873:3;42894:67;42958:2;42953:3;42894:67;:::i;:::-;42887:74;;42970:93;43059:3;42970:93;:::i;:::-;43088:2;43083:3;43079:12;43072:19;;42731:366;;;:::o;43103:419::-;43269:4;43307:2;43296:9;43292:18;43284:26;;43356:9;43350:4;43346:20;43342:1;43331:9;43327:17;43320:47;43384:131;43510:4;43384:131;:::i;:::-;43376:139;;43103:419;;;:::o;43528:225::-;43668:34;43664:1;43656:6;43652:14;43645:58;43737:8;43732:2;43724:6;43720:15;43713:33;43528:225;:::o;43759:366::-;43901:3;43922:67;43986:2;43981:3;43922:67;:::i;:::-;43915:74;;43998:93;44087:3;43998:93;:::i;:::-;44116:2;44111:3;44107:12;44100:19;;43759:366;;;:::o;44131:419::-;44297:4;44335:2;44324:9;44320:18;44312:26;;44384:9;44378:4;44374:20;44370:1;44359:9;44355:17;44348:47;44412:131;44538:4;44412:131;:::i;:::-;44404:139;;44131:419;;;:::o;44556:179::-;44696:31;44692:1;44684:6;44680:14;44673:55;44556:179;:::o;44741:366::-;44883:3;44904:67;44968:2;44963:3;44904:67;:::i;:::-;44897:74;;44980:93;45069:3;44980:93;:::i;:::-;45098:2;45093:3;45089:12;45082:19;;44741:366;;;:::o;45113:419::-;45279:4;45317:2;45306:9;45302:18;45294:26;;45366:9;45360:4;45356:20;45352:1;45341:9;45337:17;45330:47;45394:131;45520:4;45394:131;:::i;:::-;45386:139;;45113:419;;;:::o;45538:373::-;45642:3;45670:38;45702:5;45670:38;:::i;:::-;45724:88;45805:6;45800:3;45724:88;:::i;:::-;45717:95;;45821:52;45866:6;45861:3;45854:4;45847:5;45843:16;45821:52;:::i;:::-;45898:6;45893:3;45889:16;45882:23;;45646:265;45538:373;;;;:::o;45917:271::-;46047:3;46069:93;46158:3;46149:6;46069:93;:::i;:::-;46062:100;;46179:3;46172:10;;45917:271;;;;:::o

Swarm Source

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