ETH Price: $3,294.89 (-3.82%)
Gas: 6 Gwei

Token

Loot Weapon (LWEAPON)
 

Overview

Max Total Supply

2,486 LWEAPON

Holders

587

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
aiqiyi.eth
Balance
1 LWEAPON
0x0813e1b0a5b1d0d67ceac68696591f5aecc613c7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LootWeapon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-03
*/

// SPDX-License-Identifier: NONE

pragma solidity 0.8.0;



// Part: Base64

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

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

// Part: ILoot

interface ILoot{
    function ownerOf(uint256 tokenId) external view returns(address);
    function getWeapon(uint256 tokenId) external view returns (string memory);
}

// Part: OpenZeppelin/[email protected]/Address

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// Part: OpenZeppelin/[email protected]/Context

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// Part: OpenZeppelin/[email protected]/IERC165

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

// Part: OpenZeppelin/[email protected]/IERC20

/**
 * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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);
}

// Part: OpenZeppelin/[email protected]/IERC721Receiver

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

// Part: OpenZeppelin/[email protected]/ReentrancyGuard

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// Part: OpenZeppelin/[email protected]/Strings

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

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

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

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

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

}

// Part: OpenZeppelin/[email protected]/ERC165

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

// Part: OpenZeppelin/[email protected]/IERC721

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

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

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

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

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

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

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

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

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

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

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

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

// Part: OpenZeppelin/[email protected]/Ownable

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// Part: OpenZeppelin/[email protected]/SafeERC20

/**
 * @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'
        // solhint-disable-next-line max-line-length
        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
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// Part: OpenZeppelin/[email protected]/IERC721Enumerable

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// Part: OpenZeppelin/[email protected]/IERC721Metadata

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// Part: OpenZeppelin/[email protected]/ERC721

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// Part: OpenZeppelin/[email protected]/ERC721Enumerable

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: LootWeapon.sol

/**
 * @title  LootWeapon
 * @author kjr217
 * @notice Looters! Come and collect your arms! War is upon us, we must fight!
 *         The Weaponsmith is open. Looters will be able to mint their weapons and reveal their underlying powers
 *         - attack, defense, durability, weight and magic. Mint your weapon, reveal your stats.
 */
contract LootWeapon is ERC721Enumerable, ReentrancyGuard, Ownable {
    using SafeERC20 for IERC20;
    // OG loot contract
    ILoot loot = ILoot(0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7);
    // Token used as the trade in for the weaponSmith
    IERC20 public token;
    // Mapping containing the weaponSmith's records on upgraded weapons
    mapping(uint256 => uint256) public boosts;
    // Mapping containing the base stats on all weapon classes
    mapping(uint8 => uint16[5]) public bases;
    // coefficient applied to weaponSmith
    uint256 boostCoefficient;
    // weapon smith opening
    bool weaponSmithOpen;

    event TokenUpdated(address oldToken, address newToken);
    event Upgrade(uint256 tokenId, uint256 upgradeAmount);
    event BoostCoefficientUpdated(uint256 oldBoostCoefficient, uint256 newBoostCoefficient);
    event WeaponSmithOpen(bool open);

    string[] private weapons = [
        "Warhammer",
        "Quarterstaff",
        "Maul",
        "Mace",
        "Club",
        "Katana",
        "Falchion",
        "Scimitar",
        "Long Sword",
        "Short Sword",
        "Ghost Wand",
        "Grave Wand",
        "Bone Wand",
        "Wand",
        "Grimoire",
        "Chronicle",
        "Tome",
        "Book"
    ];
    string[] private namePrefixes = [
        "Agony", "Apocalypse", "Armageddon", "Beast", "Behemoth", "Blight", "Blood", "Bramble",
        "Brimstone", "Brood", "Carrion", "Cataclysm", "Chimeric", "Corpse", "Corruption", "Damnation",
        "Death", "Demon", "Dire", "Dragon", "Dread", "Doom", "Dusk", "Eagle", "Empyrean", "Fate", "Foe",
        "Gale", "Ghoul", "Gloom", "Glyph", "Golem", "Grim", "Hate", "Havoc", "Honour", "Horror", "Hypnotic",
        "Kraken", "Loath", "Maelstrom", "Mind", "Miracle", "Morbid", "Oblivion", "Onslaught", "Pain",
        "Pandemonium", "Phoenix", "Plague", "Rage", "Rapture", "Rune", "Skull", "Sol", "Soul", "Sorrow",
        "Spirit", "Storm", "Tempest", "Torment", "Vengeance", "Victory", "Viper", "Vortex", "Woe", "Wrath",
        "Light's", "Shimmering"
    ];
    string[] private nameSuffixes = [
        "Bane",
        "Root",
        "Bite",
        "Song",
        "Roar",
        "Grasp",
        "Instrument",
        "Glow",
        "Bender",
        "Shadow",
        "Whisper",
        "Shout",
        "Growl",
        "Tear",
        "Peak",
        "Form",
        "Sun",
        "Moon"
    ];
    string[] private suffixes = [
        "of Power",
        "of Giants",
        "of Titans",
        "of Skill",
        "of Perfection",
        "of Brilliance",
        "of Enlightenment",
        "of Protection",
        "of Anger",
        "of Rage",
        "of Fury",
        "of Vitriol",
        "of the Fox",
        "of Detection",
        "of Reflection",
        "of the Twins"
    ];

    /**
     * @notice allow the owners to set the tokens used as pay-in for the weaponSmith
     * @param  _token address of the new token
     */
    function setToken(address _token) external onlyOwner {
        emit TokenUpdated(address(token), _token);
        token = IERC20(_token);
    }

    /**
     * @notice allow the owners to set the coefficient used for the upgrade boost
     * @param  _boostCoefficient coefficient used to modify the upgrade amount
     */
    function setBoostCoefficient(uint256 _boostCoefficient) external onlyOwner {
        emit BoostCoefficientUpdated(boostCoefficient, _boostCoefficient);
        boostCoefficient = _boostCoefficient;
    }

    /**
     * @notice allow the owners to open the weapon smith
     * @param  _weaponSmithOpen bool to open or close the weapon smith
     */
    function setWeaponSmithOpen(bool _weaponSmithOpen) external onlyOwner {
        emit WeaponSmithOpen(_weaponSmithOpen);
        weaponSmithOpen = _weaponSmithOpen;
    }

    /**
     * @notice allow the owners to sweep any erc20 tokens sent to the contract
     * @param  _token address of the token to be swept
     * @param  _amount amount to be swept
     */
    function sweep(address _token, uint256 _amount) external onlyOwner {
        IERC20(_token).safeTransfer(msg.sender, _amount);
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getWeaponDetails(uint256 tokenId) public view returns (string memory) {
        return loot.getWeapon(tokenId);
    }

    function getAttack(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Attack", weapons, 0);
    }
    
    function getDefense(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Defense", weapons, 1);
    }

    function getDurability(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Durability", weapons, 2);
    }

    function getWeight(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Weight", weapons, 3);
    }

    function getMagic(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Magic", weapons, 4);
    }

    /**
     * @notice score calculator
     * @param  base the base amount taken from bases for the weapon class
     * @param  tokenId id of the token being scored
     * @param  output weapon class or description
     */
    function getScore(uint256 base, uint256 tokenId, string memory output) public pure returns (uint256){
        uint256 rando = uint(keccak256(abi.encodePacked(output, toString(tokenId)))) % 100;
        uint256 score;
        if (rando <= 10) {
            score += 10;
        } else if (rando > 10 && rando <= 25 ) {
            score += 50;
        } else if (rando > 25 && rando <= 75 ) {
            score += 100;
        } else if (rando > 75 && rando <= 90 ) {
            score += 150;
        } else if (rando > 90 && rando <= 100 ) {
            score += 250;
        }
        score += base;
        return score;
    }

    /**
     * @notice the weaponSmith, where you can upgrade your weapons send in the compatible erc20 token to upgrade
     * @param  tokenId id of the token being upgraded
     * @param  amount amount of token to be sent to the weaponSmith to be upgraded
     */
    function weaponSmith(uint256 tokenId, uint256 amount) external {
        require(weaponSmithOpen, "!open");
        require(ownerOf(tokenId) == msg.sender, "!owner");
        token.safeTransferFrom(msg.sender, address(this), amount);
        boosts[tokenId] += amount / boostCoefficient;
        emit Upgrade(tokenId, amount / boostCoefficient);
    }

    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, uint256 baseIndex) internal view returns (string memory) {
        // get the actual weapon class and greatness
        uint256 rand = random(string(abi.encodePacked("WEAPON", toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        uint256 stat;
        if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Warhammer")))) {
            stat = getScore(bases[0][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Quarterstaff")))) {
            stat = getScore(bases[1][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Maul")))) {
            stat = getScore(bases[2][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Mace")))) {
            stat = getScore(bases[3][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Club")))) {
            stat = getScore(bases[4][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Katana")))) {
            stat = getScore(bases[5][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Falchion")))) {
            stat = getScore(bases[6][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Scimitar")))) {
            stat = getScore(bases[7][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Long Sword")))) {
            stat = getScore(bases[8][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Short Sword")))) {
            stat = getScore(bases[9][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Ghost Wand")))) {
            stat = getScore(bases[10][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Grave Wand")))) {
            stat = getScore(bases[11][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Bone Wand")))) {
            stat = getScore(bases[12][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Wand")))) {
            stat = getScore(bases[13][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Grimoire")))) {
            stat = getScore(bases[14][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Chronicle")))) {
            stat = getScore(bases[15][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Tome")))) {
            stat = getScore(bases[16][baseIndex], tokenId, keyPrefix);
        } else if (keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Book")))) {
            stat = getScore(bases[17][baseIndex], tokenId, keyPrefix);
        }
        if (baseIndex == 3){
            output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));
            return output;
        }
        if (greatness > 14){
            stat += getScore(0, tokenId, suffixes[rand % suffixes.length]);
        }
        if (greatness >= 19){
            if (greatness == 19){
                stat += getScore(0, tokenId, string(abi.encodePacked(namePrefixes[rand % namePrefixes.length], nameSuffixes[rand % nameSuffixes.length])));
            } else {
                stat += 300;
            }
        }
        stat += boosts[tokenId];
        output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[13] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = loot.getWeapon(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getAttack(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getDefense(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getDurability(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getWeight(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getMagic(tokenId);

        parts[12] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Weapon #', toString(tokenId), '", "description": "The Weaponsmith is open. Looters will be able to mint their weapons and reveal their underlying powers - attack, defense, durability, weight and magic. Mint your weapon, reveal your stats.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }
    
    function claimForLoot(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8001, "Token ID invalid");
        require(loot.ownerOf(tokenId) == msg.sender, "Not Loot owner");
        _safeMint(_msgSender(), tokenId);
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 8000 && tokenId < 9576, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 9575 && tokenId < 10001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
    constructor() ERC721("Loot Weapon", "LWEAPON") Ownable() {
        bases[0] = [800,350,850,800,0];
        bases[1] = [200,400,350,200,0];
        bases[2] = [400,250,550,400,0];
        bases[3] = [500,250,550,400,0];
        bases[4] = [300,150,400,300,0];
        bases[5] = [950,250,700,150,0];
        bases[6] = [650,150,400,150,0];
        bases[7] = [700,200,500,200,0];
        bases[8] = [750,250,600,250,0];
        bases[9] = [400,150,400,150,0];
        bases[10] = [50,50,550,50,800];
        bases[11] = [50,50,400,50,700];
        bases[12] = [50,50,350,50,650];
        bases[13] = [50,50,400,50,600];
        bases[14] = [50,50,50,25,850];
        bases[15] = [15,50,50,15,0];
        bases[16] = [100,100,50,50,0];
        bases[17] = [50,50,50,25,0];
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBoostCoefficient","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBoostCoefficient","type":"uint256"}],"name":"BoostCoefficientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"upgradeAmount","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"open","type":"bool"}],"name":"WeaponSmithOpen","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bases","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boosts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttack","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDefense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDurability","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMagic","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"output","type":"string"}],"name":"getScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeaponDetails","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boostCoefficient","type":"uint256"}],"name":"setBoostCoefficient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_weaponSmithOpen","type":"bool"}],"name":"setWeaponSmithOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"weaponSmith","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600c80546001600160a01b03191673ff9c1b15b16263c61d017ee9f65c50e4ae0113d717815560096102c0818152682bb0b93430b6b6b2b960b91b6102e05260809081526103009283526b28bab0b93a32b939ba30b33360a11b6103205260a09290925260046103408181526313585d5b60e21b6103605260c052610380818152634d61636560e01b6103a05260e0526103c08181526321b63ab160e11b6103e052610100526006610400908152654b6174616e6160d01b61042052610120526008610440818152672330b631b434b7b760c11b61046052610140526104808181526729b1b4b6b4ba30b960c11b6104a05261016052600a6104c081815269131bdb99c814dddbdc9960b21b6104e05261018052600b6105009081526a14da1bdc9d0814dddbdc9960aa1b610520526101a0526105408181526911da1bdcdd0815d85b9960b21b610560526101c0526105809081526911dc985d994815d85b9960b21b6105a0526101e0526105c083815268109bdb994815d85b9960ba1b6105e052610200526106008281526315d85b9960e21b6106205261022052610640908152674772696d6f69726560c01b6106605261024052610680918252684368726f6e69636c6560b81b6106a052610260919091526106c081815263546f6d6560e01b6106e0526102805261074060405261070090815263426f6f6b60e01b610720526102a0526200021490601290816200175c565b50604080516108e08101825260056108a082018181526441676f6e7960d81b6108c0840152825282518084018452600a8082526941706f63616c7970736560b01b60208381019190915280850192909252845180860186528181526920b936b0b3b2b23237b760b11b818401528486015284518086018652838152641099585cdd60da1b81840152606085015284518086018652600880825267084cad0cadadee8d60c31b82850152608086019190915285518087018752600680825265109b1a59da1d60d21b8286015260a08701919091528651808801885285815264109b1bdbd960da1b8186015260c0870152865180880188526007808252664272616d626c6560c81b8287015260e0880191909152875180890189526009808252684272696d73746f6e6560b81b828801526101008901919091528851808a018a5287815264109c9bdbd960da1b818801526101208901528851808a018a528281526621b0b93934b7b760c91b818801526101408901528851808a018a528181526843617461636c79736d60b81b818801526101608901528851808a018a52848152674368696d6572696360c01b818801526101808901528851808a018a5283815265436f7270736560d01b818801526101a08901528851808a018a528581526921b7b9393ab83a34b7b760b11b818801526101c08901528851808a018a52818152682230b6b730ba34b7b760b91b818801526101e08901528851808a018a5287815264088cac2e8d60db1b818801526102008901528851808a018a52878152642232b6b7b760d91b818801526102208901528851808a018a526004808252634469726560e01b828901526102408a01919091528951808b018b5284815265223930b3b7b760d11b818901526102608a01528951808b018b5288815264111c99585960da1b818901526102808a01528951808b018b5281815263446f6f6d60e01b818901526102a08a01528951808b018b52818152634475736b60e01b818901526102c08a01528951808b018b52888152644561676c6560d81b818901526102e08a01528951808b018b528581526722b6b83cb932b0b760c11b818901526103008a01528951808b018b52818152634661746560e01b818901526103208a01528951808b018b52600380825262466f6560e81b828a01526103408b01919091528a51808c018c528281526347616c6560e01b818a01526103608b01528a51808c018c528981526411da1bdd5b60da1b818a01526103808b01528a51808c018c5289815264476c6f6f6d60d81b818a01526103a08b01528a51808c018c528981526408ed8f2e0d60db1b818a01526103c08b01528a51808c018c5289815264476f6c656d60d81b818a01526103e08b01528a51808c018c52828152634772696d60e01b818a01526104008b01528a51808c018c52828152634861746560e01b818a01526104208b01528a51808c018c52898152644861766f6360d81b818a01526104408b01528a51808c018c52858152652437b737bab960d11b818a01526104608b01528a51808c018c52858152652437b93937b960d11b818a01526104808b01528a51808c018c52868152674879706e6f74696360c01b818a01526104a08b01528a51808c018c528581526525b930b5b2b760d11b818a01526104c08b01528a51808c018c5289815264098dec2e8d60db1b818a01526104e08b01528a51808c018c52838152684d61656c7374726f6d60b81b818a01526105008b01528a51808c018c5282815263135a5b9960e21b818a01526105208b01528a51808c018c52848152664d697261636c6560c81b818a01526105408b01528a51808c018c5285815265135bdc989a5960d21b818a01526105608b01528a51808c018c529586526727b13634bb34b7b760c11b868901526105808a01959095528951808b018b528281526813db9cdb185d59da1d60ba1b818901526105a08a01528951808b018b52818152632830b4b760e11b818901526105c08a01528951808b018b52600b81526a50616e64656d6f6e69756d60a81b818901526105e08a01528951808b018b52838152660a0d0decadcd2f60cb1b818901526106008a01528951808b018b5284815265506c6167756560d01b818901526106208a01528951808b018b52818152635261676560e01b818901526106408a01528951808b018b52838152665261707475726560c81b818901526106608a01528951808b018b528181526352756e6560e01b818901526106808a01528951808b018b528881526414dadd5b1b60da1b818901526106a08a01528951808b018b528581526214dbdb60ea1b818901526106c08a01528951808b018b529081526314dbdd5b60e21b818801526106e08901528851808a018a5283815265536f72726f7760d01b818801526107008901528851808a018a528381526514dc1a5c9a5d60d21b818801526107208901528851808a018a528781526453746f726d60d81b818801526107408901528851808a018a528281526615195b5c195cdd60ca1b818801526107608901528851808a018a5282815266151bdc9b595b9d60ca1b818801526107808901528851808a018a529081526856656e6765616e636560b81b818701526107a08801528751808901895281815266566963746f727960c81b818701526107c088015287518089018952868152642b34b832b960d91b818701526107e088015287518089018952918252650acdee4e8caf60d31b828601526108008701919091528651808801885291825262576f6560e81b8285015261082086019190915285518087018752938452640aee4c2e8d60db1b8484015261084085019390935284518086018652928352664c69676874277360c81b838301526108608401929092528351808501909452908352695368696d6d6572696e6760b01b9083015261088081019190915262000a7e906013906045620017c0565b506040805161028081018252600461024082018181526342616e6560e01b61026084015282528251808401845281815263149bdbdd60e21b6020828101919091528084019190915283518085018552828152634269746560e01b81830152838501528351808501855282815263536f6e6760e01b81830152606084015283518085018552828152632937b0b960e11b81830152608084015283518085018552600580825264047726173760dc1b8284015260a085019190915284518086018652600a815269125b9cdd1c9d5b595b9d60b21b8184015260c08501528451808601865283815263476c6f7760e01b8184015260e0850152845180860186526006808252652132b73232b960d11b828501526101008601919091528551808701875290815265536861646f7760d01b818401526101208501528451808601865260078152662bb434b9b832b960c91b81840152610140850152845180860186528181526414da1bdd5d60da1b81840152610160850152845180860186529081526411dc9bdddb60da1b8183015261018084015283518085018552828152632a32b0b960e11b818301526101a084015283518085018552828152635065616b60e01b818301526101c08401528351808501855282815263466f726d60e01b818301526101e084015283518085018552600381526229bab760e91b8183015261020084015283518085019094529083526326b7b7b760e11b9083015261022081019190915262000caf9060149060126200175c565b506040805161024081018252600861020082018181526737b3102837bbb2b960c11b6102208401528252825180840184526009808252686f66204769616e747360b81b6020838101919091528085019290925284518086018652908152686f6620546974616e7360b81b818301528385015283518085018552828152671bd98814dada5b1b60c21b81830152606084015283518085018552600d8082526c37b3102832b93332b1ba34b7b760991b828401526080850191909152845180860186528181526c6f66204272696c6c69616e636560981b8184015260a08501528451808601865260108082526f1bd988115b9b1a59da1d195b9b595b9d60821b8285015260c0860191909152855180870187528281526c37b310283937ba32b1ba34b7b760991b8185015260e0860152855180870187529384526737b31020b733b2b960c11b84840152610100850193909352845180860186526007808252666f66205261676560c81b8285015261012086019190915285518087018752908152666f66204675727960c81b8184015261014085015284518086018652600a808252691bd988159a5d1c9a5bdb60b21b8285015261016086019190915285518087018752908152690decc40e8d0ca408cdef60b31b8184015261018085015284518086018652600c8082526b37b3102232ba32b1ba34b7b760a11b828501526101a0860191909152855180870187529182526c37b3102932b33632b1ba34b7b760991b828401526101c0850191909152845180860190955284526b6f6620746865205477696e7360a01b908401526101e082019290925262000f13916015919062001812565b5034801562000f2157600080fd5b50604080518082018252600b81526a2637b7ba102bb2b0b837b760a91b602080830191825283518085019094526007845266262ba2a0a827a760c91b90840152815191929162000f749160009162001864565b50805162000f8a90600190602084019062001864565b50506001600a5550600062000f9e62001758565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805160a08101825261032080825261015e6020808401919091526103529383019390935260608201526000608082018190528052600f90915262001056907ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375906005620018ef565b506040805160a08101825260c880825261019060208084019190915261015e93830193909352606082015260006080820181905260019052600f909152620010c2907f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f906005620018ef565b506040805160a08101825261019080825260fa60208084019190915261022693830193909352606082015260006080820181905260029052600f9091526200112e907fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead906005620018ef565b506040805160a0810182526101f4815260fa60208083019190915261022692820192909252610190606082015260006080820181905260039052600f9091526200119c907f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc8296828906005620018ef565b506040805160a08101825261012c808252609660208084019190915261019093830193909352606082015260006080820181905260049052600f90915262001208907f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd906005620018ef565b506040805160a0810182526103b6815260fa6020808301919091526102bc9282019290925260966060820152600060808201819052600590819052600f90925262001276917f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162049190620018ef565b506040805160a08101825261028a81526096602080830182905261019093830193909352606082015260006080820181905260069052600f909152620012e0907fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff618906005620018ef565b506040805160a0810182526102bc815260c860208083018290526101f493830193909352606082015260006080820181905260079052600f9091526200134a907f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb40254906005620018ef565b506040805160a0810182526102ee815260fa602080830182905261025893830193909352606082015260006080820181905260089052600f909152620013b4907f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb68906005620018ef565b506040805160a0810182526101908082526096602080840182905293830191909152606082015260006080820181905260099052600f9091526200141c907f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc76039906005620018ef565b506040805160a081018252603280825260208083018290526102269383019390935260608201526103206080820152600a600052600f90915262001484907fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad906005620018ef565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102bc6080820152600b600052600f909152620014ec907f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c5906005620018ef565b506040805160a0810182526032808252602080830182905261015e93830193909352606082015261028a6080820152600c600052600f90915262001554907faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b7729906005620018ef565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102586080820152600d600052600f909152620015bc907fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc5906005620018ef565b506040805160a0810182526032808252602080830182905292820152601960608201526103526080820152600e600052600f90915262001620907f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f906005620018ef565b506040805160a081018252600f80825260326020808401829052938301526060820181905260006080830181905281905290915262001683907f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb090600562001987565b506040805160a08101825260648082526020808301919091526032928201839052606082019290925260006080820181905260109052600f909152620016ed907f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15990600562001987565b506040805160a08101825260328082526020808301829052928201526019606082015260006080820181905260119052600f90915262001751907f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe90600562001987565b5062001a99565b3390565b828054828255906000526020600020908101928215620017ae579160200282015b82811115620017ae57825180516200179d91849160209091019062001864565b50916020019190600101906200177d565b50620017bc929150620019df565b5090565b828054828255906000526020600020908101928215620017ae579160200282015b82811115620017ae57825180516200180191849160209091019062001864565b5091602001919060010190620017e1565b828054828255906000526020600020908101928215620017ae579160200282015b82811115620017ae57825180516200185391849160209091019062001864565b509160200191906001019062001833565b828054620018729062001a5c565b90600052602060002090601f016020900481019282620018965760008555620018e1565b82601f10620018b157805160ff1916838001178555620018e1565b82800160010185558215620018e1579182015b82811115620018e1578251825591602001919060010190620018c4565b50620017bc92915062001a00565b600183019183908215620018e15791602002820160005b838211156200194857835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001906565b8015620019785782816101000a81549061ffff021916905560020160208160010104928301926001030262001948565b5050620017bc92915062001a00565b600183019183908215620018e15791602002820160005b838211156200194857835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200199e565b80821115620017bc576000620019f6828262001a17565b50600101620019df565b5b80821115620017bc576000815560010162001a01565b50805462001a259062001a5c565b6000825580601f1062001a39575062001a59565b601f01602090049060005260206000209081019062001a59919062001a00565b50565b60028104600182168062001a7157607f821691505b6020821081141562001a9357634e487b7160e01b600052602260045260246000fd5b50919050565b61487d8062001aa96000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80635bc0a62311610130578063b88d4fde116100b8578063d851fdfd1161007c578063d851fdfd146104a1578063e985e9c5146104b4578063eb22daa3146104c7578063f2fde38b146104da578063fc0c546a146104ed57610227565b8063b88d4fde14610442578063c87b56dd14610455578063ca0056e014610468578063cff840f01461047b578063d7d0a45a1461048e57610227565b8063715018a6116100ff578063715018a6146104045780638da5cb5b1461040c578063951ca9321461041457806395d89b4114610427578063a22cb4651461042f57610227565b80635bc0a623146103b85780636352211e146103cb5780636ea056a9146103de57806370a08231146103f157610227565b8063379607f5116101b3578063434f48c411610182578063434f48c41461035957806347d8636a1461036c5780634afd82e71461037f5780634f6ccce714610392578063509d2927146103a557610227565b8063379607f51461030d57806341bc680f1461032057806342842e0e1461033357806342a2561f1461034657610227565b8063144fa6d7116101fa578063144fa6d71461029f57806318160ddd146102b257806323b872dd146102c75780632914f8e9146102da5780632f745c59146102fa57610227565b806301ffc9a71461022c57806306fdde0314610255578063081812fc1461026a578063095ea7b31461028a575b600080fd5b61023f61023a3660046135f1565b6104f5565b60405161024c9190613deb565b60405180910390f35b61025d610522565b60405161024c9190613df6565b61027d61027836600461369c565b6105b4565b60405161024c9190613d43565b61029d61029836600461358e565b610600565b005b61029d6102ad366004613434565b610698565b6102ba610740565b60405161024c9190614455565b61029d6102d53660046134a4565b610746565b6102ed6102e8366004613736565b61077e565b60405161024c9190614446565b6102ba61030836600461358e565b6107bb565b61029d61031b36600461369c565b61080d565b61029d61032e3660046136b4565b61087c565b61029d6103413660046134a4565b610961565b61025d61035436600461369c565b61097c565b61029d61036736600461369c565b610a01565b61029d61037a36600461369c565b610aa1565b6102ba61038d36600461369c565b610b9b565b6102ba6103a036600461369c565b610bad565b61025d6103b336600461369c565b610c08565b61025d6103c636600461369c565b610d0a565b61027d6103d936600461369c565b610e07565b61029d6103ec36600461358e565b610e3c565b6102ba6103ff366004613434565b610e93565b61029d610ed7565b61027d610f60565b61029d61042236600461369c565b610f6f565b61025d610fee565b61029d61043d366004613561565b610ffd565b61029d6104503660046134e4565b6110cb565b61025d61046336600461369c565b61110a565b61029d6104763660046135b9565b6113bb565b61025d61048936600461369c565b611444565b6102ba61049c3660046136d5565b611542565b61025d6104af36600461369c565b611640565b61023f6104c236600461346c565b61173e565b61025d6104d536600461369c565b61176c565b61029d6104e8366004613434565b61186b565b61027d61192c565b60006001600160e01b0319821663780e9d6360e01b148061051a575061051a8261193b565b90505b919050565b60606000805461053190614558565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90614558565b80156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b5050505050905090565b60006105bf8261197b565b6105e45760405162461bcd60e51b81526004016105db9061417d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061060b82610e07565b9050806001600160a01b0316836001600160a01b0316141561063f5760405162461bcd60e51b81526004016105db90614271565b806001600160a01b0316610651611998565b6001600160a01b0316148061066d575061066d816104c2611998565b6106895760405162461bcd60e51b81526004016105db90614058565b610693838361199c565b505050565b6106a0611998565b6001600160a01b03166106b1610f60565b6001600160a01b0316146106d75760405162461bcd60e51b81526004016105db906141c9565b600d546040517f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac11791610716916001600160a01b03909116908490613d57565b60405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60085490565b610757610751611998565b82611a0a565b6107735760405162461bcd60e51b81526004016105db906142b2565b610693838383611a8f565b600f602052816000526040600020816005811061079a57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b60006107c683610e93565b82106107e45760405162461bcd60e51b81526004016105db90613e09565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156108305760405162461bcd60e51b81526004016105db906143ef565b6002600a55611f4081118015610847575061256881105b6108635760405162461bcd60e51b81526004016105db906141fe565b61087461086e611998565b82611bbc565b506001600a55565b60115460ff1661089e5760405162461bcd60e51b81526004016105db906143d0565b336108a883610e07565b6001600160a01b0316146108ce5760405162461bcd60e51b81526004016105db90614426565b600d546108e6906001600160a01b0316333084611bd6565b6010546108f390826144e2565b6000838152600e6020526040812080549091906109119084906144ca565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e990839061094790846144e2565b60405161095592919061445e565b60405180910390a15050565b610693838383604051806020016040528060008152506110cb565b600c54604051639e41b73f60e01b81526060916001600160a01b031690639e41b73f906109ad908590600401614455565b60006040518083038186803b1580156109c557600080fd5b505afa1580156109d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051a9190810190613629565b6002600a541415610a245760405162461bcd60e51b81526004016105db906143ef565b6002600a55610a31611998565b6001600160a01b0316610a42610f60565b6001600160a01b031614610a685760405162461bcd60e51b81526004016105db906141c9565b61256781118015610a7a575061271181105b610a965760405162461bcd60e51b81526004016105db906141fe565b61087461086e610f60565b6002600a541415610ac45760405162461bcd60e51b81526004016105db906143ef565b6002600a558015801590610ad95750611f4181105b610af55760405162461bcd60e51b81526004016105db906141fe565b600c546040516331a9108f60e11b815233916001600160a01b031690636352211e90610b25908590600401614455565b60206040518083038186803b158015610b3d57600080fd5b505afa158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b759190613450565b6001600160a01b0316146108635760405162461bcd60e51b81526004016105db90613f23565b600e6020526000908152604090205481565b6000610bb7610740565b8210610bd55760405162461bcd60e51b81526004016105db9061433a565b60088281548110610bf657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b606061051a826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610cff578382906000526020600020018054610c7290614558565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9e90614558565b8015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b505050505081526020019060010190610c53565b505050506002611c2e565b606061051a82604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610dfc578382906000526020600020018054610d6f90614558565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9b90614558565b8015610de85780601f10610dbd57610100808354040283529160200191610de8565b820191906000526020600020905b815481529060010190602001808311610dcb57829003601f168201915b505050505081526020019060010190610d50565b505050506004611c2e565b6000818152600260205260408120546001600160a01b03168061051a5760405162461bcd60e51b81526004016105db906140ff565b610e44611998565b6001600160a01b0316610e55610f60565b6001600160a01b031614610e7b5760405162461bcd60e51b81526004016105db906141c9565b610e8f6001600160a01b0383163383612a55565b5050565b60006001600160a01b038216610ebb5760405162461bcd60e51b81526004016105db906140b5565b506001600160a01b031660009081526003602052604090205490565b610edf611998565b6001600160a01b0316610ef0610f60565b6001600160a01b031614610f165760405162461bcd60e51b81526004016105db906141c9565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b600b546001600160a01b031690565b610f77611998565b6001600160a01b0316610f88610f60565b6001600160a01b031614610fae5760405162461bcd60e51b81526004016105db906141c9565b7f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb6360105482604051610fe192919061445e565b60405180910390a1601055565b60606001805461053190614558565b611005611998565b6001600160a01b0316826001600160a01b031614156110365760405162461bcd60e51b81526004016105db90613f8f565b8060056000611043611998565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611087611998565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110bf9190613deb565b60405180910390a35050565b6110dc6110d6611998565b83611a0a565b6110f85760405162461bcd60e51b81526004016105db906142b2565b61110484848484612a74565b50505050565b60606111146133ce565b60405180610120016040528060fd81526020016146e360fd91398152600c54604051639e41b73f60e01b81526001600160a01b0390911690639e41b73f90611160908690600401614455565b60006040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b49190810190613629565b81600160200201819052506040518060600160405280602881526020016148206028913960408201526111e683611444565b6060808301919091526040805191820190526028808252614641602083013960808201526112138361176c565b60a082015260408051606081019091526028808252614692602083013960c082015261123e83610c08565b60e0820152604080516060810190915260298082526146ba602083013961010082015261126a83611640565b61012082015260408051606081019091526029808252614669602083013961014082015261129783610d0a565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113079a9091016138e0565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061134294869490602001613875565b6040516020818303038152906040529050600061138f61136186612aa7565b61136a84612bc2565b60405160200161137b929190613af4565b604051602081830303815290604052612bc2565b9050806040516020016113a29190613c87565b60408051808303601f1901815291905295945050505050565b6113c3611998565b6001600160a01b03166113d4610f60565b6001600160a01b0316146113fa5760405162461bcd60e51b81526004016105db906141c9565b7feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea2816040516114299190613deb565b60405180910390a16011805460ff1916911515919091179055565b606061051a826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156115375783829060005260206000200180546114aa90614558565b80601f01602080910402602001604051908101604052809291908181526020018280546114d690614558565b80156115235780601f106114f857610100808354040283529160200191611523565b820191906000526020600020905b81548152906001019060200180831161150657829003601f168201915b50505050508152602001906001019061148b565b505050506000611c2e565b60008060648361155186612aa7565b604051602001611562929190613846565b6040516020818303038152906040528051906020012060001c61158591906145ae565b90506000600a82116115a35761159c600a826144ca565b905061162a565b600a821180156115b4575060198211155b156115c45761159c6032826144ca565b6019821180156115d55750604b8211155b156115e55761159c6064826144ca565b604b821180156115f65750605a8211155b156116065761159c6096826144ca565b605a82118015611617575060648211155b1561162a5761162760fa826144ca565b90505b61163486826144ca565b925050505b9392505050565b606061051a826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156117335783829060005260206000200180546116a690614558565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290614558565b801561171f5780601f106116f45761010080835404028352916020019161171f565b820191906000526020600020905b81548152906001019060200180831161170257829003601f168201915b505050505081526020019060010190611687565b505050506003611c2e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b606061051a8260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156118605783829060005260206000200180546117d390614558565b80601f01602080910402602001604051908101604052809291908181526020018280546117ff90614558565b801561184c5780601f106118215761010080835404028352916020019161184c565b820191906000526020600020905b81548152906001019060200180831161182f57829003601f168201915b5050505050815260200190600101906117b4565b505050506001611c2e565b611873611998565b6001600160a01b0316611884610f60565b6001600160a01b0316146118aa5760405162461bcd60e51b81526004016105db906141c9565b6001600160a01b0381166118d05760405162461bcd60e51b81526004016105db90613ea6565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061196c57506001600160e01b03198216635b5e139f60e01b145b8061051a575061051a82612d36565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119d182610e07565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a158261197b565b611a315760405162461bcd60e51b81526004016105db9061400c565b6000611a3c83610e07565b9050806001600160a01b0316846001600160a01b03161480611a775750836001600160a01b0316611a6c846105b4565b6001600160a01b0316145b80611a875750611a87818561173e565b949350505050565b826001600160a01b0316611aa282610e07565b6001600160a01b031614611ac85760405162461bcd60e51b81526004016105db90614228565b6001600160a01b038216611aee5760405162461bcd60e51b81526004016105db90613f4b565b611af9838383612d4f565b611b0460008261199c565b6001600160a01b0383166000908152600360205260408120805460019290611b2d908490614515565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b5b9084906144ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e8f828260405180602001604052806000815250612dd8565b611104846323b872dd60e01b858585604051602401611bf793929190613d71565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e0b565b60606000611c62611c3e87612aa7565b604051602001611c4e9190613a87565b604051602081830303815290604052612e9a565b9050600084855183611c7491906145ae565b81518110611c9257634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611cab91906145ae565b90506000604051602001611cbe90613ab5565b6040516020818303038152906040528051906020012083604051602001611ce5919061382a565b604051602081830303815290604052805190602001201415611d795760008052600f602052611d727ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3758760058110611d4d57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a611542565b905061280e565b604051602001611d8890613ce1565b6040516020818303038152906040528051906020012083604051602001611daf919061382a565b604051602081830303815290604052805190602001201415611e18576001600052600f602052611d727f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611e2790613d1d565b6040516020818303038152906040528051906020012083604051602001611e4e919061382a565b604051602081830303815290604052805190602001201415611eb7576002600052600f602052611d727fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611ec690613a2d565b6040516020818303038152906040528051906020012083604051602001611eed919061382a565b604051602081830303815290604052805190602001201415611f56576003600052600f602052611d727f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc82968288760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611f6590613a0b565b6040516020818303038152906040528051906020012083604051602001611f8c919061382a565b604051602081830303815290604052805190602001201415611ff5576004600052600f602052611d727f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161200490613a1b565b604051602081830303815290604052805190602001208360405160200161202b919061382a565b6040516020818303038152906040528051906020012014156120975760056000819052600f602052611d72907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162049088908110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016120a690613cf9565b60405160208183030381529060405280519060200120836040516020016120cd919061382a565b604051602081830303815290604052805190602001201415612136576006600052600f602052611d727fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff6188760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161214590613ae0565b604051602081830303815290604052805190602001208360405160200161216c919061382a565b6040516020818303038152906040528051906020012014156121d5576007600052600f602052611d727f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb402548760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016121e490613aca565b604051602081830303815290604052805190602001208360405160200161220b919061382a565b604051602081830303815290604052805190602001201415612274576008600052600f602052611d727f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb688760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001612283906139f4565b60405160208183030381529060405280519060200120836040516020016122aa919061382a565b604051602081830303815290604052805190602001201415612313576009600052600f602052611d727f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161232290613a71565b6040516020818303038152906040528051906020012083604051602001612349919061382a565b6040516020818303038152906040528051906020012014156123b257600a600052600f602052611d727fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016123c190613d2d565b60405160208183030381529060405280519060200120836040516020016123e8919061382a565b60405160208183030381529060405280519060200120141561245157600b600052600f602052611d727f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c58760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161246090613c72565b6040516020818303038152906040528051906020012083604051602001612487919061382a565b6040516020818303038152906040528051906020012014156124f057600c600052600f602052611d727faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b77298760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016124ff90613d0d565b6040516020818303038152906040528051906020012083604051602001612526919061382a565b60405160208183030381529060405280519060200120141561258f57600d600052600f602052611d727fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc58760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161259e90613a5d565b60405160208183030381529060405280519060200120836040516020016125c5919061382a565b60405160208183030381529060405280519060200120141561262e57600e600052600f602052611d727f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161263d90613ccc565b6040516020818303038152906040528051906020012083604051602001612664919061382a565b6040516020818303038152906040528051906020012014156126cd57600f6000819052602052611d727f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb08760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016126dc90613a4d565b6040516020818303038152906040528051906020012083604051602001612703919061382a565b60405160208183030381529060405280519060200120141561276c576010600052600f602052611d727f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a1598760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161277b90613a3d565b60405160208183030381529060405280519060200120836040516020016127a2919061382a565b60405160208183030381529060405280519060200120141561280e576011600052600f60205261280b7f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b90505b856003141561284e578761282182612aa7565b6040516020016128329291906139a2565b60408051601f198184030181529190529450611a879350505050565b600e8211156129325761292560008a601580805490508861286f91906145ae565b8154811061288d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546128a290614558565b80601f01602080910402602001604051908101604052809291908181526020018280546128ce90614558565b801561291b5780601f106128f05761010080835404028352916020019161291b565b820191906000526020600020905b8154815290600101906020018083116128fe57829003601f168201915b5050505050611542565b61292f90826144ca565b90505b60138210612a025781601314156129f3576129e260008a601380805490508861295b91906145ae565b8154811061297957634e487b7160e01b600052603260045260246000fd5b90600052602060002001601480805490508961299591906145ae565b815481106129b357634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516020016129ce9291906139df565b604051602081830303815290604052611542565b6129ec90826144ca565b9050612a02565b6129ff61012c826144ca565b90505b6000898152600e6020526040902054612a1b90826144ca565b905087612a2782612aa7565b604051602001612a389291906139a2565b60408051808303601f190181529190529998505050505050505050565b6106938363a9059cbb60e01b8484604051602401611bf7929190613dd2565b612a7f848484611a8f565b612a8b84848484612ecb565b6111045760405162461bcd60e51b81526004016105db90613e54565b606081612acc57506040805180820190915260018152600360fc1b602082015261051d565b8160005b8115612af65780612ae081614593565b9150612aef9050600a836144e2565b9150612ad0565b60008167ffffffffffffffff811115612b1f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b49576020820181803683370190505b5090505b8415611a8757612b5e600183614515565b9150612b6b600a866145ae565b612b769060306144ca565b60f81b818381518110612b9957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612bbb600a866144e2565b9450612b4d565b805160609080612be257505060408051602081019091526000815261051d565b60006003612bf18360026144ca565b612bfb91906144e2565b612c069060046144f6565b90506000612c158260206144ca565b67ffffffffffffffff811115612c3b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c65576020820181803683370190505b50905060006040518060600160405280604081526020016147e0604091399050600181016020830160005b86811015612cf1576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612c90565b506003860660018114612d0b5760028114612d1c57612d28565b613d3d60f01b600119830152612d28565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612d5a838383610693565b6001600160a01b038316612d7657612d7181612fe3565b612d99565b816001600160a01b0316836001600160a01b031614612d9957612d998382613027565b6001600160a01b038216612db557612db0816130c4565b610693565b826001600160a01b0316826001600160a01b03161461069357610693828261319d565b612de283836131e1565b612def6000848484612ecb565b6106935760405162461bcd60e51b81526004016105db90613e54565b6000612e60826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132c09092919063ffffffff16565b8051909150156106935780806020019051810190612e7e91906135d5565b6106935760405162461bcd60e51b81526004016105db90614386565b600081604051602001612ead919061382a565b60408051601f19818403018152919052805160209091012092915050565b6000612edf846001600160a01b03166132cf565b15612fdb57836001600160a01b031663150b7a02612efb611998565b8786866040518563ffffffff1660e01b8152600401612f1d9493929190613d95565b602060405180830381600087803b158015612f3757600080fd5b505af1925050508015612f67575060408051601f3d908101601f19168201909252612f649181019061360d565b60015b612fc1573d808015612f95576040519150601f19603f3d011682016040523d82523d6000602084013e612f9a565b606091505b508051612fb95760405162461bcd60e51b81526004016105db90613e54565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a87565b506001611a87565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161303484610e93565b61303e9190614515565b600083815260076020526040902054909150808214613091576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906130d690600190614515565b6000838152600960205260408120546008805493945090928490811061310c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061313b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061318157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131a883610e93565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166132075760405162461bcd60e51b81526004016105db90614148565b6132108161197b565b1561322d5760405162461bcd60e51b81526004016105db90613eec565b61323960008383612d4f565b6001600160a01b03821660009081526003602052604081208054600192906132629084906144ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611a8784846000856132d5565b3b151590565b6060824710156132f75760405162461bcd60e51b81526004016105db90613fc6565b613300856132cf565b61331c5760405162461bcd60e51b81526004016105db90614303565b600080866001600160a01b03168587604051613338919061382a565b60006040518083038185875af1925050503d8060008114613375576040519150601f19603f3d011682016040523d82523d6000602084013e61337a565b606091505b509150915061338a828286613395565b979650505050505050565b606083156133a4575081611639565b8251156133b45782518084602001fd5b8160405162461bcd60e51b81526004016105db9190613df6565b604051806101a00160405280600d905b60608152602001906001900390816133de5790505090565b600061340961340484614496565b61446c565b905082815283838301111561341d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613445578081fd5b813561163981614604565b600060208284031215613461578081fd5b815161163981614604565b6000806040838503121561347e578081fd5b823561348981614604565b9150602083013561349981614604565b809150509250929050565b6000806000606084860312156134b8578081fd5b83356134c381614604565b925060208401356134d381614604565b929592945050506040919091013590565b600080600080608085870312156134f9578081fd5b843561350481614604565b9350602085013561351481614604565b925060408501359150606085013567ffffffffffffffff811115613536578182fd5b8501601f81018713613546578182fd5b613555878235602084016133f6565b91505092959194509250565b60008060408385031215613573578182fd5b823561357e81614604565b915060208301356134998161461c565b600080604083850312156135a0578182fd5b82356135ab81614604565b946020939093013593505050565b6000602082840312156135ca578081fd5b81356116398161461c565b6000602082840312156135e6578081fd5b81516116398161461c565b600060208284031215613602578081fd5b81356116398161462a565b60006020828403121561361e578081fd5b81516116398161462a565b60006020828403121561363a578081fd5b815167ffffffffffffffff811115613650578182fd5b8201601f81018413613660578182fd5b805161366e61340482614496565b818152856020838501011115613682578384fd5b61369382602083016020860161452c565b95945050505050565b6000602082840312156136ad578081fd5b5035919050565b600080604083850312156136c6578182fd5b50508035926020909101359150565b6000806000606084860312156136e9578081fd5b8335925060208401359150604084013567ffffffffffffffff81111561370d578182fd5b8401601f8101861361371d578182fd5b61372c868235602084016133f6565b9150509250925092565b60008060408385031215613748578182fd5b823560ff811681146135ab578283fd5b6000815180845261377081602086016020860161452c565b601f01601f19169290920160200192915050565b80546000906002810460018083168061379e57607f831692505b60208084108214156137be57634e487b7160e01b86526022600452602486fd5b8180156137d257600181146137e357613810565b60ff19861689528489019650613810565b6137ec886144be565b60005b868110156138085781548b8201529085019083016137ef565b505084890196505b50505050505092915050565b61227d60f01b815260020190565b6000825161383c81846020870161452c565b9190910192915050565b6000835161385881846020880161452c565b83519083019061386c81836020880161452c565b01949350505050565b60008651613887818460208b0161452c565b86519083019061389b818360208b0161452c565b86519101906138ae818360208a0161452c565b85519101906138c181836020890161452c565b84519101906138d481836020880161452c565b01979650505050505050565b60008a516138f2818460208f0161452c565b8a5190830190613906818360208f0161452c565b8a516139188183850160208f0161452c565b8a5192909101019061392e818360208d0161452c565b88516139408183850160208d0161452c565b8851929091010190613956818360208b0161452c565b86516139688183850160208b0161452c565b865192909101019061397e81836020890161452c565b8451613990818385016020890161452c565b9101019b9a5050505050505050505050565b600083516139b481846020880161452c565b6101d160f51b90830190815283516139d381600284016020880161452c565b01600201949350505050565b6000611a876139ee8386613784565b84613784565b6a14da1bdc9d0814dddbdc9960aa1b8152600b0190565b6321b63ab160e11b815260040190565b654b6174616e6160d01b815260060190565b634d61636560e01b815260040190565b63426f6f6b60e01b815260040190565b63546f6d6560e01b815260040190565b674772696d6f69726560c01b815260080190565b6911da1bdcdd0815d85b9960b21b8152600a0190565b6000652ba2a0a827a760d11b82528251613aa881600685016020870161452c565b9190910160060192915050565b682bb0b93430b6b6b2b960b91b815260090190565b69131bdb99c814dddbdc9960b21b8152600a0190565b6729b1b4b6b4ba30b960c11b815260080190565b717b226e616d65223a2022576561706f6e202360701b81528251600090613b2281601285016020880161452c565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204c6f6f746572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f28201526101088451613c65818385016020890161452c565b61338a828285010161381c565b68109bdb994815d85b9960ba1b815260090190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000082528251613cbf81601d85016020870161452c565b91909101601d0192915050565b684368726f6e69636c6560b81b815260090190565b6b28bab0b93a32b939ba30b33360a11b8152600c0190565b672330b631b434b7b760c11b815260080190565b6315d85b9960e21b815260040190565b6313585d5b60e21b815260040190565b6911dc985d994815d85b9960b21b8152600a0190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613dc890830184613758565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526116396020830184613758565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600e908201526d2737ba102637b7ba1037bbb732b960911b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526005908201526410b7b832b760d91b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561448e5761448e6145ee565b604052919050565b600067ffffffffffffffff8211156144b0576144b06145ee565b50601f01601f191660200190565b60009081526020902090565b600082198211156144dd576144dd6145c2565b500190565b6000826144f1576144f16145d8565b500490565b6000816000190483118215151615614510576145106145c2565b500290565b600082821015614527576145276145c2565b500390565b60005b8381101561454757818101518382015260200161452f565b838111156111045750506000910152565b60028104600182168061456c57607f821691505b6020821081141561458d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145a7576145a76145c2565b5060010190565b6000826145bd576145bd6145d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461461957600080fd5b50565b801515811461461957600080fd5b6001600160e01b03198116811461461957600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212205a06c5b008c1535dfee5799d8ce18339bda0e6992601446791455bb1bbec732c64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80635bc0a62311610130578063b88d4fde116100b8578063d851fdfd1161007c578063d851fdfd146104a1578063e985e9c5146104b4578063eb22daa3146104c7578063f2fde38b146104da578063fc0c546a146104ed57610227565b8063b88d4fde14610442578063c87b56dd14610455578063ca0056e014610468578063cff840f01461047b578063d7d0a45a1461048e57610227565b8063715018a6116100ff578063715018a6146104045780638da5cb5b1461040c578063951ca9321461041457806395d89b4114610427578063a22cb4651461042f57610227565b80635bc0a623146103b85780636352211e146103cb5780636ea056a9146103de57806370a08231146103f157610227565b8063379607f5116101b3578063434f48c411610182578063434f48c41461035957806347d8636a1461036c5780634afd82e71461037f5780634f6ccce714610392578063509d2927146103a557610227565b8063379607f51461030d57806341bc680f1461032057806342842e0e1461033357806342a2561f1461034657610227565b8063144fa6d7116101fa578063144fa6d71461029f57806318160ddd146102b257806323b872dd146102c75780632914f8e9146102da5780632f745c59146102fa57610227565b806301ffc9a71461022c57806306fdde0314610255578063081812fc1461026a578063095ea7b31461028a575b600080fd5b61023f61023a3660046135f1565b6104f5565b60405161024c9190613deb565b60405180910390f35b61025d610522565b60405161024c9190613df6565b61027d61027836600461369c565b6105b4565b60405161024c9190613d43565b61029d61029836600461358e565b610600565b005b61029d6102ad366004613434565b610698565b6102ba610740565b60405161024c9190614455565b61029d6102d53660046134a4565b610746565b6102ed6102e8366004613736565b61077e565b60405161024c9190614446565b6102ba61030836600461358e565b6107bb565b61029d61031b36600461369c565b61080d565b61029d61032e3660046136b4565b61087c565b61029d6103413660046134a4565b610961565b61025d61035436600461369c565b61097c565b61029d61036736600461369c565b610a01565b61029d61037a36600461369c565b610aa1565b6102ba61038d36600461369c565b610b9b565b6102ba6103a036600461369c565b610bad565b61025d6103b336600461369c565b610c08565b61025d6103c636600461369c565b610d0a565b61027d6103d936600461369c565b610e07565b61029d6103ec36600461358e565b610e3c565b6102ba6103ff366004613434565b610e93565b61029d610ed7565b61027d610f60565b61029d61042236600461369c565b610f6f565b61025d610fee565b61029d61043d366004613561565b610ffd565b61029d6104503660046134e4565b6110cb565b61025d61046336600461369c565b61110a565b61029d6104763660046135b9565b6113bb565b61025d61048936600461369c565b611444565b6102ba61049c3660046136d5565b611542565b61025d6104af36600461369c565b611640565b61023f6104c236600461346c565b61173e565b61025d6104d536600461369c565b61176c565b61029d6104e8366004613434565b61186b565b61027d61192c565b60006001600160e01b0319821663780e9d6360e01b148061051a575061051a8261193b565b90505b919050565b60606000805461053190614558565b80601f016020809104026020016040519081016040528092919081815260200182805461055d90614558565b80156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b5050505050905090565b60006105bf8261197b565b6105e45760405162461bcd60e51b81526004016105db9061417d565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061060b82610e07565b9050806001600160a01b0316836001600160a01b0316141561063f5760405162461bcd60e51b81526004016105db90614271565b806001600160a01b0316610651611998565b6001600160a01b0316148061066d575061066d816104c2611998565b6106895760405162461bcd60e51b81526004016105db90614058565b610693838361199c565b505050565b6106a0611998565b6001600160a01b03166106b1610f60565b6001600160a01b0316146106d75760405162461bcd60e51b81526004016105db906141c9565b600d546040517f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac11791610716916001600160a01b03909116908490613d57565b60405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60085490565b610757610751611998565b82611a0a565b6107735760405162461bcd60e51b81526004016105db906142b2565b610693838383611a8f565b600f602052816000526040600020816005811061079a57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b60006107c683610e93565b82106107e45760405162461bcd60e51b81526004016105db90613e09565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156108305760405162461bcd60e51b81526004016105db906143ef565b6002600a55611f4081118015610847575061256881105b6108635760405162461bcd60e51b81526004016105db906141fe565b61087461086e611998565b82611bbc565b506001600a55565b60115460ff1661089e5760405162461bcd60e51b81526004016105db906143d0565b336108a883610e07565b6001600160a01b0316146108ce5760405162461bcd60e51b81526004016105db90614426565b600d546108e6906001600160a01b0316333084611bd6565b6010546108f390826144e2565b6000838152600e6020526040812080549091906109119084906144ca565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e990839061094790846144e2565b60405161095592919061445e565b60405180910390a15050565b610693838383604051806020016040528060008152506110cb565b600c54604051639e41b73f60e01b81526060916001600160a01b031690639e41b73f906109ad908590600401614455565b60006040518083038186803b1580156109c557600080fd5b505afa1580156109d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261051a9190810190613629565b6002600a541415610a245760405162461bcd60e51b81526004016105db906143ef565b6002600a55610a31611998565b6001600160a01b0316610a42610f60565b6001600160a01b031614610a685760405162461bcd60e51b81526004016105db906141c9565b61256781118015610a7a575061271181105b610a965760405162461bcd60e51b81526004016105db906141fe565b61087461086e610f60565b6002600a541415610ac45760405162461bcd60e51b81526004016105db906143ef565b6002600a558015801590610ad95750611f4181105b610af55760405162461bcd60e51b81526004016105db906141fe565b600c546040516331a9108f60e11b815233916001600160a01b031690636352211e90610b25908590600401614455565b60206040518083038186803b158015610b3d57600080fd5b505afa158015610b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b759190613450565b6001600160a01b0316146108635760405162461bcd60e51b81526004016105db90613f23565b600e6020526000908152604090205481565b6000610bb7610740565b8210610bd55760405162461bcd60e51b81526004016105db9061433a565b60088281548110610bf657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b606061051a826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610cff578382906000526020600020018054610c7290614558565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9e90614558565b8015610ceb5780601f10610cc057610100808354040283529160200191610ceb565b820191906000526020600020905b815481529060010190602001808311610cce57829003601f168201915b505050505081526020019060010190610c53565b505050506002611c2e565b606061051a82604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610dfc578382906000526020600020018054610d6f90614558565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9b90614558565b8015610de85780601f10610dbd57610100808354040283529160200191610de8565b820191906000526020600020905b815481529060010190602001808311610dcb57829003601f168201915b505050505081526020019060010190610d50565b505050506004611c2e565b6000818152600260205260408120546001600160a01b03168061051a5760405162461bcd60e51b81526004016105db906140ff565b610e44611998565b6001600160a01b0316610e55610f60565b6001600160a01b031614610e7b5760405162461bcd60e51b81526004016105db906141c9565b610e8f6001600160a01b0383163383612a55565b5050565b60006001600160a01b038216610ebb5760405162461bcd60e51b81526004016105db906140b5565b506001600160a01b031660009081526003602052604090205490565b610edf611998565b6001600160a01b0316610ef0610f60565b6001600160a01b031614610f165760405162461bcd60e51b81526004016105db906141c9565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b600b546001600160a01b031690565b610f77611998565b6001600160a01b0316610f88610f60565b6001600160a01b031614610fae5760405162461bcd60e51b81526004016105db906141c9565b7f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb6360105482604051610fe192919061445e565b60405180910390a1601055565b60606001805461053190614558565b611005611998565b6001600160a01b0316826001600160a01b031614156110365760405162461bcd60e51b81526004016105db90613f8f565b8060056000611043611998565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611087611998565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110bf9190613deb565b60405180910390a35050565b6110dc6110d6611998565b83611a0a565b6110f85760405162461bcd60e51b81526004016105db906142b2565b61110484848484612a74565b50505050565b60606111146133ce565b60405180610120016040528060fd81526020016146e360fd91398152600c54604051639e41b73f60e01b81526001600160a01b0390911690639e41b73f90611160908690600401614455565b60006040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111b49190810190613629565b81600160200201819052506040518060600160405280602881526020016148206028913960408201526111e683611444565b6060808301919091526040805191820190526028808252614641602083013960808201526112138361176c565b60a082015260408051606081019091526028808252614692602083013960c082015261123e83610c08565b60e0820152604080516060810190915260298082526146ba602083013961010082015261126a83611640565b61012082015260408051606081019091526029808252614669602083013961014082015261129783610d0a565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6113079a9091016138e0565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061134294869490602001613875565b6040516020818303038152906040529050600061138f61136186612aa7565b61136a84612bc2565b60405160200161137b929190613af4565b604051602081830303815290604052612bc2565b9050806040516020016113a29190613c87565b60408051808303601f1901815291905295945050505050565b6113c3611998565b6001600160a01b03166113d4610f60565b6001600160a01b0316146113fa5760405162461bcd60e51b81526004016105db906141c9565b7feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea2816040516114299190613deb565b60405180910390a16011805460ff1916911515919091179055565b606061051a826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156115375783829060005260206000200180546114aa90614558565b80601f01602080910402602001604051908101604052809291908181526020018280546114d690614558565b80156115235780601f106114f857610100808354040283529160200191611523565b820191906000526020600020905b81548152906001019060200180831161150657829003601f168201915b50505050508152602001906001019061148b565b505050506000611c2e565b60008060648361155186612aa7565b604051602001611562929190613846565b6040516020818303038152906040528051906020012060001c61158591906145ae565b90506000600a82116115a35761159c600a826144ca565b905061162a565b600a821180156115b4575060198211155b156115c45761159c6032826144ca565b6019821180156115d55750604b8211155b156115e55761159c6064826144ca565b604b821180156115f65750605a8211155b156116065761159c6096826144ca565b605a82118015611617575060648211155b1561162a5761162760fa826144ca565b90505b61163486826144ca565b925050505b9392505050565b606061051a826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156117335783829060005260206000200180546116a690614558565b80601f01602080910402602001604051908101604052809291908181526020018280546116d290614558565b801561171f5780601f106116f45761010080835404028352916020019161171f565b820191906000526020600020905b81548152906001019060200180831161170257829003601f168201915b505050505081526020019060010190611687565b505050506003611c2e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b606061051a8260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156118605783829060005260206000200180546117d390614558565b80601f01602080910402602001604051908101604052809291908181526020018280546117ff90614558565b801561184c5780601f106118215761010080835404028352916020019161184c565b820191906000526020600020905b81548152906001019060200180831161182f57829003601f168201915b5050505050815260200190600101906117b4565b505050506001611c2e565b611873611998565b6001600160a01b0316611884610f60565b6001600160a01b0316146118aa5760405162461bcd60e51b81526004016105db906141c9565b6001600160a01b0381166118d05760405162461bcd60e51b81526004016105db90613ea6565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061196c57506001600160e01b03198216635b5e139f60e01b145b8061051a575061051a82612d36565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119d182610e07565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a158261197b565b611a315760405162461bcd60e51b81526004016105db9061400c565b6000611a3c83610e07565b9050806001600160a01b0316846001600160a01b03161480611a775750836001600160a01b0316611a6c846105b4565b6001600160a01b0316145b80611a875750611a87818561173e565b949350505050565b826001600160a01b0316611aa282610e07565b6001600160a01b031614611ac85760405162461bcd60e51b81526004016105db90614228565b6001600160a01b038216611aee5760405162461bcd60e51b81526004016105db90613f4b565b611af9838383612d4f565b611b0460008261199c565b6001600160a01b0383166000908152600360205260408120805460019290611b2d908490614515565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b5b9084906144ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e8f828260405180602001604052806000815250612dd8565b611104846323b872dd60e01b858585604051602401611bf793929190613d71565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e0b565b60606000611c62611c3e87612aa7565b604051602001611c4e9190613a87565b604051602081830303815290604052612e9a565b9050600084855183611c7491906145ae565b81518110611c9257634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611cab91906145ae565b90506000604051602001611cbe90613ab5565b6040516020818303038152906040528051906020012083604051602001611ce5919061382a565b604051602081830303815290604052805190602001201415611d795760008052600f602052611d727ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3758760058110611d4d57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a611542565b905061280e565b604051602001611d8890613ce1565b6040516020818303038152906040528051906020012083604051602001611daf919061382a565b604051602081830303815290604052805190602001201415611e18576001600052600f602052611d727f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611e2790613d1d565b6040516020818303038152906040528051906020012083604051602001611e4e919061382a565b604051602081830303815290604052805190602001201415611eb7576002600052600f602052611d727fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611ec690613a2d565b6040516020818303038152906040528051906020012083604051602001611eed919061382a565b604051602081830303815290604052805190602001201415611f56576003600052600f602052611d727f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc82968288760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001611f6590613a0b565b6040516020818303038152906040528051906020012083604051602001611f8c919061382a565b604051602081830303815290604052805190602001201415611ff5576004600052600f602052611d727f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161200490613a1b565b604051602081830303815290604052805190602001208360405160200161202b919061382a565b6040516020818303038152906040528051906020012014156120975760056000819052600f602052611d72907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162049088908110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016120a690613cf9565b60405160208183030381529060405280519060200120836040516020016120cd919061382a565b604051602081830303815290604052805190602001201415612136576006600052600f602052611d727fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff6188760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161214590613ae0565b604051602081830303815290604052805190602001208360405160200161216c919061382a565b6040516020818303038152906040528051906020012014156121d5576007600052600f602052611d727f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb402548760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016121e490613aca565b604051602081830303815290604052805190602001208360405160200161220b919061382a565b604051602081830303815290604052805190602001201415612274576008600052600f602052611d727f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb688760058110611d4d57634e487b7160e01b600052603260045260246000fd5b604051602001612283906139f4565b60405160208183030381529060405280519060200120836040516020016122aa919061382a565b604051602081830303815290604052805190602001201415612313576009600052600f602052611d727f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc760398760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161232290613a71565b6040516020818303038152906040528051906020012083604051602001612349919061382a565b6040516020818303038152906040528051906020012014156123b257600a600052600f602052611d727fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016123c190613d2d565b60405160208183030381529060405280519060200120836040516020016123e8919061382a565b60405160208183030381529060405280519060200120141561245157600b600052600f602052611d727f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c58760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161246090613c72565b6040516020818303038152906040528051906020012083604051602001612487919061382a565b6040516020818303038152906040528051906020012014156124f057600c600052600f602052611d727faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b77298760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016124ff90613d0d565b6040516020818303038152906040528051906020012083604051602001612526919061382a565b60405160208183030381529060405280519060200120141561258f57600d600052600f602052611d727fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc58760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161259e90613a5d565b60405160208183030381529060405280519060200120836040516020016125c5919061382a565b60405160208183030381529060405280519060200120141561262e57600e600052600f602052611d727f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161263d90613ccc565b6040516020818303038152906040528051906020012083604051602001612664919061382a565b6040516020818303038152906040528051906020012014156126cd57600f6000819052602052611d727f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb08760058110611d4d57634e487b7160e01b600052603260045260246000fd5b6040516020016126dc90613a4d565b6040516020818303038152906040528051906020012083604051602001612703919061382a565b60405160208183030381529060405280519060200120141561276c576010600052600f602052611d727f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a1598760058110611d4d57634e487b7160e01b600052603260045260246000fd5b60405160200161277b90613a3d565b60405160208183030381529060405280519060200120836040516020016127a2919061382a565b60405160208183030381529060405280519060200120141561280e576011600052600f60205261280b7f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe8760058110611d4d57634e487b7160e01b600052603260045260246000fd5b90505b856003141561284e578761282182612aa7565b6040516020016128329291906139a2565b60408051601f198184030181529190529450611a879350505050565b600e8211156129325761292560008a601580805490508861286f91906145ae565b8154811061288d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546128a290614558565b80601f01602080910402602001604051908101604052809291908181526020018280546128ce90614558565b801561291b5780601f106128f05761010080835404028352916020019161291b565b820191906000526020600020905b8154815290600101906020018083116128fe57829003601f168201915b5050505050611542565b61292f90826144ca565b90505b60138210612a025781601314156129f3576129e260008a601380805490508861295b91906145ae565b8154811061297957634e487b7160e01b600052603260045260246000fd5b90600052602060002001601480805490508961299591906145ae565b815481106129b357634e487b7160e01b600052603260045260246000fd5b906000526020600020016040516020016129ce9291906139df565b604051602081830303815290604052611542565b6129ec90826144ca565b9050612a02565b6129ff61012c826144ca565b90505b6000898152600e6020526040902054612a1b90826144ca565b905087612a2782612aa7565b604051602001612a389291906139a2565b60408051808303601f190181529190529998505050505050505050565b6106938363a9059cbb60e01b8484604051602401611bf7929190613dd2565b612a7f848484611a8f565b612a8b84848484612ecb565b6111045760405162461bcd60e51b81526004016105db90613e54565b606081612acc57506040805180820190915260018152600360fc1b602082015261051d565b8160005b8115612af65780612ae081614593565b9150612aef9050600a836144e2565b9150612ad0565b60008167ffffffffffffffff811115612b1f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b49576020820181803683370190505b5090505b8415611a8757612b5e600183614515565b9150612b6b600a866145ae565b612b769060306144ca565b60f81b818381518110612b9957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612bbb600a866144e2565b9450612b4d565b805160609080612be257505060408051602081019091526000815261051d565b60006003612bf18360026144ca565b612bfb91906144e2565b612c069060046144f6565b90506000612c158260206144ca565b67ffffffffffffffff811115612c3b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c65576020820181803683370190505b50905060006040518060600160405280604081526020016147e0604091399050600181016020830160005b86811015612cf1576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612c90565b506003860660018114612d0b5760028114612d1c57612d28565b613d3d60f01b600119830152612d28565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b612d5a838383610693565b6001600160a01b038316612d7657612d7181612fe3565b612d99565b816001600160a01b0316836001600160a01b031614612d9957612d998382613027565b6001600160a01b038216612db557612db0816130c4565b610693565b826001600160a01b0316826001600160a01b03161461069357610693828261319d565b612de283836131e1565b612def6000848484612ecb565b6106935760405162461bcd60e51b81526004016105db90613e54565b6000612e60826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132c09092919063ffffffff16565b8051909150156106935780806020019051810190612e7e91906135d5565b6106935760405162461bcd60e51b81526004016105db90614386565b600081604051602001612ead919061382a565b60408051601f19818403018152919052805160209091012092915050565b6000612edf846001600160a01b03166132cf565b15612fdb57836001600160a01b031663150b7a02612efb611998565b8786866040518563ffffffff1660e01b8152600401612f1d9493929190613d95565b602060405180830381600087803b158015612f3757600080fd5b505af1925050508015612f67575060408051601f3d908101601f19168201909252612f649181019061360d565b60015b612fc1573d808015612f95576040519150601f19603f3d011682016040523d82523d6000602084013e612f9a565b606091505b508051612fb95760405162461bcd60e51b81526004016105db90613e54565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a87565b506001611a87565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161303484610e93565b61303e9190614515565b600083815260076020526040902054909150808214613091576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906130d690600190614515565b6000838152600960205260408120546008805493945090928490811061310c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061313b57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061318157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131a883610e93565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166132075760405162461bcd60e51b81526004016105db90614148565b6132108161197b565b1561322d5760405162461bcd60e51b81526004016105db90613eec565b61323960008383612d4f565b6001600160a01b03821660009081526003602052604081208054600192906132629084906144ca565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611a8784846000856132d5565b3b151590565b6060824710156132f75760405162461bcd60e51b81526004016105db90613fc6565b613300856132cf565b61331c5760405162461bcd60e51b81526004016105db90614303565b600080866001600160a01b03168587604051613338919061382a565b60006040518083038185875af1925050503d8060008114613375576040519150601f19603f3d011682016040523d82523d6000602084013e61337a565b606091505b509150915061338a828286613395565b979650505050505050565b606083156133a4575081611639565b8251156133b45782518084602001fd5b8160405162461bcd60e51b81526004016105db9190613df6565b604051806101a00160405280600d905b60608152602001906001900390816133de5790505090565b600061340961340484614496565b61446c565b905082815283838301111561341d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613445578081fd5b813561163981614604565b600060208284031215613461578081fd5b815161163981614604565b6000806040838503121561347e578081fd5b823561348981614604565b9150602083013561349981614604565b809150509250929050565b6000806000606084860312156134b8578081fd5b83356134c381614604565b925060208401356134d381614604565b929592945050506040919091013590565b600080600080608085870312156134f9578081fd5b843561350481614604565b9350602085013561351481614604565b925060408501359150606085013567ffffffffffffffff811115613536578182fd5b8501601f81018713613546578182fd5b613555878235602084016133f6565b91505092959194509250565b60008060408385031215613573578182fd5b823561357e81614604565b915060208301356134998161461c565b600080604083850312156135a0578182fd5b82356135ab81614604565b946020939093013593505050565b6000602082840312156135ca578081fd5b81356116398161461c565b6000602082840312156135e6578081fd5b81516116398161461c565b600060208284031215613602578081fd5b81356116398161462a565b60006020828403121561361e578081fd5b81516116398161462a565b60006020828403121561363a578081fd5b815167ffffffffffffffff811115613650578182fd5b8201601f81018413613660578182fd5b805161366e61340482614496565b818152856020838501011115613682578384fd5b61369382602083016020860161452c565b95945050505050565b6000602082840312156136ad578081fd5b5035919050565b600080604083850312156136c6578182fd5b50508035926020909101359150565b6000806000606084860312156136e9578081fd5b8335925060208401359150604084013567ffffffffffffffff81111561370d578182fd5b8401601f8101861361371d578182fd5b61372c868235602084016133f6565b9150509250925092565b60008060408385031215613748578182fd5b823560ff811681146135ab578283fd5b6000815180845261377081602086016020860161452c565b601f01601f19169290920160200192915050565b80546000906002810460018083168061379e57607f831692505b60208084108214156137be57634e487b7160e01b86526022600452602486fd5b8180156137d257600181146137e357613810565b60ff19861689528489019650613810565b6137ec886144be565b60005b868110156138085781548b8201529085019083016137ef565b505084890196505b50505050505092915050565b61227d60f01b815260020190565b6000825161383c81846020870161452c565b9190910192915050565b6000835161385881846020880161452c565b83519083019061386c81836020880161452c565b01949350505050565b60008651613887818460208b0161452c565b86519083019061389b818360208b0161452c565b86519101906138ae818360208a0161452c565b85519101906138c181836020890161452c565b84519101906138d481836020880161452c565b01979650505050505050565b60008a516138f2818460208f0161452c565b8a5190830190613906818360208f0161452c565b8a516139188183850160208f0161452c565b8a5192909101019061392e818360208d0161452c565b88516139408183850160208d0161452c565b8851929091010190613956818360208b0161452c565b86516139688183850160208b0161452c565b865192909101019061397e81836020890161452c565b8451613990818385016020890161452c565b9101019b9a5050505050505050505050565b600083516139b481846020880161452c565b6101d160f51b90830190815283516139d381600284016020880161452c565b01600201949350505050565b6000611a876139ee8386613784565b84613784565b6a14da1bdc9d0814dddbdc9960aa1b8152600b0190565b6321b63ab160e11b815260040190565b654b6174616e6160d01b815260060190565b634d61636560e01b815260040190565b63426f6f6b60e01b815260040190565b63546f6d6560e01b815260040190565b674772696d6f69726560c01b815260080190565b6911da1bdcdd0815d85b9960b21b8152600a0190565b6000652ba2a0a827a760d11b82528251613aa881600685016020870161452c565b9190910160060192915050565b682bb0b93430b6b6b2b960b91b815260090190565b69131bdb99c814dddbdc9960b21b8152600a0190565b6729b1b4b6b4ba30b960c11b815260080190565b717b226e616d65223a2022576561706f6e202360701b81528251600090613b2281601285016020880161452c565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204c6f6f746572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f28201526101088451613c65818385016020890161452c565b61338a828285010161381c565b68109bdb994815d85b9960ba1b815260090190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000082528251613cbf81601d85016020870161452c565b91909101601d0192915050565b684368726f6e69636c6560b81b815260090190565b6b28bab0b93a32b939ba30b33360a11b8152600c0190565b672330b631b434b7b760c11b815260080190565b6315d85b9960e21b815260040190565b6313585d5b60e21b815260040190565b6911dc985d994815d85b9960b21b8152600a0190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613dc890830184613758565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526116396020830184613758565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600e908201526d2737ba102637b7ba1037bbb732b960911b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526005908201526410b7b832b760d91b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b61ffff91909116815260200190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561448e5761448e6145ee565b604052919050565b600067ffffffffffffffff8211156144b0576144b06145ee565b50601f01601f191660200190565b60009081526020902090565b600082198211156144dd576144dd6145c2565b500190565b6000826144f1576144f16145d8565b500490565b6000816000190483118215151615614510576145106145c2565b500290565b600082821015614527576145276145c2565b500390565b60005b8381101561454757818101518382015260200161452f565b838111156111045750506000910152565b60028104600182168061456c57607f821691505b6020821081141561458d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145a7576145a76145c2565b5060010190565b6000826145bd576145bd6145d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461461957600080fd5b50565b801515811461461957600080fd5b6001600160e01b03198116811461461957600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212205a06c5b008c1535dfee5799d8ce18339bda0e6992601446791455bb1bbec732c64736f6c63430008000033

Deployed Bytecode Sourcemap

54170:15109:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47671:237;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35900:100;;;:::i;:::-;;;;;;;:::i;37367:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36897:404::-;;;;;;:::i;:::-;;:::i;:::-;;57234:146;;;;;;:::i;:::-;;:::i;48324:113::-;;;:::i;:::-;;;;;;;:::i;38257:305::-;;;;;;:::i;:::-;;:::i;54636:40::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47992:256::-;;;;;;:::i;:::-;;:::i;67375:175::-;;;;;;:::i;:::-;;:::i;60608:357::-;;;;;;:::i;:::-;;:::i;38633:151::-;;;;;;:::i;:::-;;:::i;58596:128::-;;;;;;:::i;:::-;;:::i;67558:186::-;;;;;;:::i;:::-;;:::i;67115:252::-;;;;;;:::i;:::-;;:::i;54524:41::-;;;;;;:::i;:::-;;:::i;48514:233::-;;;;;;:::i;:::-;;:::i;59022:142::-;;;;;;:::i;:::-;;:::i;59314:132::-;;;;;;:::i;:::-;;:::i;35594:239::-;;;;;;:::i;:::-;;:::i;58308:134::-;;;;;;:::i;:::-;;:::i;35324:208::-;;;;;;:::i;:::-;;:::i;27686:148::-;;;:::i;27035:87::-;;;:::i;57569:206::-;;;;;;:::i;:::-;;:::i;36069:104::-;;;:::i;37660:295::-;;;;;;:::i;:::-;;:::i;38855:285::-;;;;;;:::i;:::-;;:::i;65300:1803::-;;;;;;:::i;:::-;;:::i;57931:172::-;;;;;;:::i;:::-;;:::i;58732:134::-;;;;;;:::i;:::-;;:::i;59684:645::-;;;;;;:::i;:::-;;:::i;59172:134::-;;;;;;:::i;:::-;;:::i;38026:164::-;;;;;;:::i;:::-;;:::i;58878:136::-;;;;;;:::i;:::-;;:::i;27989:244::-;;;;;;:::i;:::-;;:::i;54425:19::-;;;:::i;47671:237::-;47773:4;-1:-1:-1;;;;;;47797:50:0;;-1:-1:-1;;;47797:50:0;;:103;;;47864:36;47888:11;47864:23;:36::i;:::-;47790:110;;47671:237;;;;:::o;35900:100::-;35954:13;35987:5;35980:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35900:100;:::o;37367:221::-;37443:7;37471:16;37479:7;37471;:16::i;:::-;37463:73;;;;-1:-1:-1;;;37463:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;37556:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37556:24:0;;37367:221::o;36897:404::-;36978:13;36994:23;37009:7;36994:14;:23::i;:::-;36978:39;;37042:5;-1:-1:-1;;;;;37036:11:0;:2;-1:-1:-1;;;;;37036:11:0;;;37028:57;;;;-1:-1:-1;;;37028:57:0;;;;;;;:::i;:::-;37122:5;-1:-1:-1;;;;;37106:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;37106:21:0;;:69;;;;37131:44;37155:5;37162:12;:10;:12::i;37131:44::-;37098:161;;;;-1:-1:-1;;;37098:161:0;;;;;;;:::i;:::-;37272:21;37281:2;37285:7;37272:8;:21::i;:::-;36897:404;;;:::o;57234:146::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;57324:5:::1;::::0;57303:36:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;57324:5:0;;::::1;::::0;57332:6;;57303:36:::1;:::i;:::-;;;;;;;;57350:5;:22:::0;;-1:-1:-1;;;;;;57350:22:0::1;-1:-1:-1::0;;;;;57350:22:0;;;::::1;::::0;;;::::1;::::0;;57234:146::o;48324:113::-;48412:10;:17;48324:113;:::o;38257:305::-;38418:41;38437:12;:10;:12::i;:::-;38451:7;38418:18;:41::i;:::-;38410:103;;;;-1:-1:-1;;;38410:103:0;;;;;;;:::i;:::-;38526:28;38536:4;38542:2;38546:7;38526:9;:28::i;54636:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47992:256::-;48089:7;48125:23;48142:5;48125:16;:23::i;:::-;48117:5;:31;48109:87;;;;-1:-1:-1;;;48109:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;48214:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;47992:256::o;67375:175::-;17385:1;17982:7;;:19;;17974:63;;;;-1:-1:-1;;;17974:63:0;;;;;;;:::i;:::-;17385:1;18115:7;:18;67456:4:::1;67446:14:::0;::::1;:32:::0;::::1;;;;67474:4;67464:7;:14;67446:32;67438:61;;;;-1:-1:-1::0;;;67438:61:0::1;;;;;;;:::i;:::-;67510:32;67520:12;:10;:12::i;:::-;67534:7;67510:9;:32::i;:::-;-1:-1:-1::0;17341:1:0;18294:7;:22;67375:175::o;60608:357::-;60690:15;;;;60682:33;;;;-1:-1:-1;;;60682:33:0;;;;;;;:::i;:::-;60754:10;60734:16;60742:7;60734;:16::i;:::-;-1:-1:-1;;;;;60734:30:0;;60726:49;;;;-1:-1:-1;;;60726:49:0;;;;;;;:::i;:::-;60786:5;;:57;;-1:-1:-1;;;;;60786:5:0;60809:10;60829:4;60836:6;60786:22;:57::i;:::-;60882:16;;60873:25;;:6;:25;:::i;:::-;60854:15;;;;:6;:15;;;;;:44;;:15;;;:44;;;;;:::i;:::-;;;;-1:-1:-1;;60940:16:0;;60914:43;;60922:7;;60931:25;;:6;:25;:::i;:::-;60914:43;;;;;;;:::i;:::-;;;;;;;;60608:357;;:::o;38633:151::-;38737:39;38754:4;38760:2;38764:7;38737:39;;;;;;;;;;;;:16;:39::i;58596:128::-;58693:4;;:23;;-1:-1:-1;;;58693:23:0;;58660:13;;-1:-1:-1;;;;;58693:4:0;;:14;;:23;;58708:7;;58693:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58693:23:0;;;;;;;;;;;;:::i;67558:186::-;17385:1;17982:7;;:19;;17974:63;;;;-1:-1:-1;;;17974:63:0;;;;;;;:::i;:::-;17385:1;18115:7;:18;27266:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;27255:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;27255:23:0::1;;27247:68;;;;-1:-1:-1::0;;;27247:68:0::1;;;;;;;:::i;:::-;67654:4:::2;67644:7;:14;:33;;;;;67672:5;67662:7;:15;67644:33;67636:62;;;;-1:-1:-1::0;;;67636:62:0::2;;;;;;;:::i;:::-;67709:27;67719:7;:5;:7::i;67115:252::-:0;17385:1;17982:7;;:19;;17974:63;;;;-1:-1:-1;;;17974:63:0;;;;;;;:::i;:::-;17385:1;18115:7;:18;67193:11;;;;;:29:::1;;;67218:4;67208:7;:14;67193:29;67185:58;;;;-1:-1:-1::0;;;67185:58:0::1;;;;;;;:::i;:::-;67262:4;::::0;:21:::1;::::0;-1:-1:-1;;;67262:21:0;;67287:10:::1;::::0;-1:-1:-1;;;;;67262:4:0::1;::::0;:12:::1;::::0;:21:::1;::::0;67275:7;;67262:21:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;67262:35:0::1;;67254:62;;;;-1:-1:-1::0;;;67254:62:0::1;;;;;;;:::i;54524:41::-:0;;;;;;;;;;;;;:::o;48514:233::-;48589:7;48625:30;:28;:30::i;:::-;48617:5;:38;48609:95;;;;-1:-1:-1;;;48609:95:0;;;;;;;:::i;:::-;48722:10;48733:5;48722:17;;;;;;-1:-1:-1;;;48722:17:0;;;;;;;;;;;;;;;;;48715:24;;48514:233;;;:::o;59022:142::-;59083:13;59116:40;59122:7;59116:40;;;;;;;;;;;;;-1:-1:-1;;;59116:40:0;;;59145:7;59116:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59154:1;59116:5;:40::i;59314:132::-;59370:13;59403:35;59409:7;59403:35;;;;;;;;;;;;;-1:-1:-1;;;59403:35:0;;;59427:7;59403:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59436:1;59403:5;:35::i;35594:239::-;35666:7;35702:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35702:16:0;35737:19;35729:73;;;;-1:-1:-1;;;35729:73:0;;;;;;;:::i;58308:134::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;58386:48:::1;-1:-1:-1::0;;;;;58386:27:0;::::1;58414:10;58426:7:::0;58386:27:::1;:48::i;:::-;58308:134:::0;;:::o;35324:208::-;35396:7;-1:-1:-1;;;;;35424:19:0;;35416:74;;;;-1:-1:-1;;;35416:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;35508:16:0;;;;;:9;:16;;;;;;;35324:208::o;27686:148::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;27777:6:::1;::::0;27756:40:::1;::::0;27793:1:::1;::::0;-1:-1:-1;;;;;27777:6:0::1;::::0;27756:40:::1;::::0;27793:1;;27756:40:::1;27807:6;:19:::0;;-1:-1:-1;;;;;;27807:19:0::1;::::0;;27686:148::o;27035:87::-;27108:6;;-1:-1:-1;;;;;27108:6:0;27035:87;:::o;57569:206::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;57660:60:::1;57684:16;;57702:17;57660:60;;;;;;;:::i;:::-;;;;;;;;57731:16;:36:::0;57569:206::o;36069:104::-;36125:13;36158:7;36151:14;;;;;:::i;37660:295::-;37775:12;:10;:12::i;:::-;-1:-1:-1;;;;;37763:24:0;:8;-1:-1:-1;;;;;37763:24:0;;;37755:62;;;;-1:-1:-1;;;37755:62:0;;;;;;;:::i;:::-;37875:8;37830:18;:32;37849:12;:10;:12::i;:::-;-1:-1:-1;;;;;37830:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;37830:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;37830:53:0;;;;;;;;;;;37914:12;:10;:12::i;:::-;-1:-1:-1;;;;;37899:48:0;;37938:8;37899:48;;;;;;:::i;:::-;;;;;;;;37660:295;;:::o;38855:285::-;38987:41;39006:12;:10;:12::i;:::-;39020:7;38987:18;:41::i;:::-;38979:103;;;;-1:-1:-1;;;38979:103:0;;;;;;;:::i;:::-;39093:39;39107:4;39113:2;39117:7;39126:5;39093:13;:39::i;:::-;38855:285;;;;:::o;65300:1803::-;65365:13;65391:23;;:::i;:::-;65425:266;;;;;;;;;;;;;;;;;;;65715:4;;:23;;-1:-1:-1;;;65715:23:0;;-1:-1:-1;;;;;65715:4:0;;;;:14;;:23;;65730:7;;65715:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65715:23:0;;;;;;;;;;;;:::i;:::-;65704:5;65710:1;65704:8;;;:34;;;;65751:53;;;;;;;;;;;;;;;;;:8;;;:53;65828:18;65838:7;65828:9;:18::i;:::-;65817:8;;;;:29;;;;65859:53;;;;;;;;;;;;;65817:8;65859:53;;;:8;;;:53;65936:19;65947:7;65936:10;:19::i;:::-;65925:8;;;:30;65968:53;;;;;;;;;;;;;;65925:8;65968:53;;;:8;;;:53;66045:22;66059:7;66045:13;:22::i;:::-;66034:8;;;:33;66080:54;;;;;;;;;;;;;;66034:8;66080:54;;;:8;;;:54;66158:18;66168:7;66158:9;:18::i;:::-;66147:8;;;:29;66189:55;;;;;;;;;;;;;;66147:8;66189:55;;;:9;;;:55;66269:17;66278:7;66269:8;:17::i;:::-;66257:9;;;:29;66299:27;;;;;;;;;;;-1:-1:-1;;;66257:9:0;66299:27;;;;;;;:9;;;:27;;;;66386:8;;66396;;;;66406;;;;66416;;;;66426;;;;66436;;;;66446;;;;66456;;;;66466;;;;66369:106;;-1:-1:-1;;66369:106:0;;66466:8;;66369:106;;:::i;:::-;;;;;;;-1:-1:-1;;66369:106:0;;;;;;;66528:8;;;;66538:9;;;;66549;;;;66560;;;;66369:106;;-1:-1:-1;66503:67:0;;66369:106;;66560:9;66528:8;66503:67;;:::i;:::-;;;;;;;;;;;;;66487:84;;66592:18;66613:373;66679:17;66688:7;66679:8;:17::i;:::-;66948:28;66968:6;66948:13;:28::i;:::-;66640:343;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66613:13;:373::i;:::-;66592:394;;67063:4;67013:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;67013:55:0;;;;;;;65300:1803;-1:-1:-1;;;;;65300:1803:0:o;57931:172::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;58017:33:::1;58033:16;58017:33;;;;;;:::i;:::-;;;;;;;;58061:15;:34:::0;;-1:-1:-1;;58061:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57931:172::o;58732:134::-;58789:13;58822:36;58828:7;58822:36;;;;;;;;;;;;;-1:-1:-1;;;58822:36:0;;;58847:7;58822:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58856:1;58822:5;:36::i;59684:645::-;59776:7;59795:13;59874:3;59843:6;59851:17;59860:7;59851:8;:17::i;:::-;59826:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59816:54;;;;;;59811:60;;:66;;;;:::i;:::-;59795:82;;59888:13;59925:2;59916:5;:11;59912:363;;59944:11;59953:2;59944:11;;:::i;:::-;;;59912:363;;;59985:2;59977:5;:10;:25;;;;;60000:2;59991:5;:11;;59977:25;59973:302;;;60020:11;60029:2;60020:11;;:::i;59973:302::-;60061:2;60053:5;:10;:25;;;;;60076:2;60067:5;:11;;60053:25;60049:226;;;60096:12;60105:3;60096:12;;:::i;60049:226::-;60138:2;60130:5;:10;:25;;;;;60153:2;60144:5;:11;;60130:25;60126:149;;;60173:12;60182:3;60173:12;;:::i;60126:149::-;60215:2;60207:5;:10;:26;;;;;60230:3;60221:5;:12;;60207:26;60203:72;;;60251:12;60260:3;60251:12;;:::i;:::-;;;60203:72;60285:13;60294:4;60285:13;;:::i;:::-;;-1:-1:-1;;;59684:645:0;;;;;;:::o;59172:134::-;59229:13;59262:36;59268:7;59262:36;;;;;;;;;;;;;-1:-1:-1;;;59262:36:0;;;59287:7;59262:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59296:1;59262:5;:36::i;38026:164::-;-1:-1:-1;;;;;38147:25:0;;;38123:4;38147:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38026:164::o;58878:136::-;58936:13;58969:37;58975:7;58969:37;;;;;;;;;;;;;-1:-1:-1;;;58969:37:0;;;58995:7;58969:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59004:1;58969:5;:37::i;27989:244::-;27266:12;:10;:12::i;:::-;-1:-1:-1;;;;;27255:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;27255:23:0;;27247:68;;;;-1:-1:-1;;;27247:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28078:22:0;::::1;28070:73;;;;-1:-1:-1::0;;;28070:73:0::1;;;;;;;:::i;:::-;28180:6;::::0;28159:38:::1;::::0;-1:-1:-1;;;;;28159:38:0;;::::1;::::0;28180:6:::1;::::0;28159:38:::1;::::0;28180:6:::1;::::0;28159:38:::1;28208:6;:17:::0;;-1:-1:-1;;;;;;28208:17:0::1;-1:-1:-1::0;;;;;28208:17:0;;;::::1;::::0;;;::::1;::::0;;27989:244::o;54425:19::-;;;-1:-1:-1;;;;;54425:19:0;;:::o;34968:292::-;35070:4;-1:-1:-1;;;;;;35094:40:0;;-1:-1:-1;;;35094:40:0;;:105;;-1:-1:-1;;;;;;;35151:48:0;;-1:-1:-1;;;35151:48:0;35094:105;:158;;;;35216:36;35240:11;35216:23;:36::i;40607:127::-;40672:4;40696:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40696:16:0;:30;;;40607:127::o;10841:98::-;10921:10;10841:98;:::o;44491:174::-;44566:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44566:29:0;-1:-1:-1;;;;;44566:29:0;;;;;;;;:24;;44620:23;44566:24;44620:14;:23::i;:::-;-1:-1:-1;;;;;44611:46:0;;;;;;;;;;;44491:174;;:::o;40901:355::-;40994:4;41019:16;41027:7;41019;:16::i;:::-;41011:73;;;;-1:-1:-1;;;41011:73:0;;;;;;;:::i;:::-;41095:13;41111:23;41126:7;41111:14;:23::i;:::-;41095:39;;41164:5;-1:-1:-1;;;;;41153:16:0;:7;-1:-1:-1;;;;;41153:16:0;;:51;;;;41197:7;-1:-1:-1;;;;;41173:31:0;:20;41185:7;41173:11;:20::i;:::-;-1:-1:-1;;;;;41173:31:0;;41153:51;:94;;;;41208:39;41232:5;41239:7;41208:23;:39::i;:::-;41145:103;40901:355;-1:-1:-1;;;;40901:355:0:o;43829:544::-;43954:4;-1:-1:-1;;;;;43927:31:0;:23;43942:7;43927:14;:23::i;:::-;-1:-1:-1;;;;;43927:31:0;;43919:85;;;;-1:-1:-1;;;43919:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44023:16:0;;44015:65;;;;-1:-1:-1;;;44015:65:0;;;;;;;:::i;:::-;44093:39;44114:4;44120:2;44124:7;44093:20;:39::i;:::-;44197:29;44214:1;44218:7;44197:8;:29::i;:::-;-1:-1:-1;;;;;44239:15:0;;;;;;:9;:15;;;;;:20;;44258:1;;44239:15;:20;;44258:1;;44239:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44270:13:0;;;;;;:9;:13;;;;;:18;;44287:1;;44270:13;:18;;44287:1;;44270:18;:::i;:::-;;;;-1:-1:-1;;44299:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44299:21:0;-1:-1:-1;;;;;44299:21:0;;;;;;;;;44338:27;;44299:16;;44338:27;;;;;;;43829:544;;;:::o;41598:110::-;41674:26;41684:2;41688:7;41674:26;;;;;;;;;;;;:9;:26::i;29015:205::-;29116:96;29136:5;29166:27;;;29195:4;29201:2;29205:5;29143:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29143:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29143:68:0;-1:-1:-1;;;;;;29143:68:0;;;;;;;;;;29116:19;:96::i;60973:4319::-;61101:13;61181:12;61196:61;61237:17;61246:7;61237:8;:17::i;:::-;61210:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;61196:6;:61::i;:::-;61181:76;;61268:20;61291:11;61310;:18;61303:4;:25;;;;:::i;:::-;61291:38;;;;;;-1:-1:-1;;;61291:38:0;;;;;;;;;;;;;;;61268:61;;61340:17;61367:2;61360:4;:9;;;;:::i;:::-;61340:29;;61380:12;61458:31;;;;;;;:::i;:::-;;;;;;;;;;;;;61448:42;;;;;;61435:6;61417:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61407:37;;;;;;:83;61403:3178;;;61523:8;;;:5;:8;;61514:49;61523:8;61532:9;61523:19;;;;;-1:-1:-1;;;61523:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61514:49;;61544:7;61553:9;61514:8;:49::i;:::-;61507:56;;61403:3178;;;61636:34;;;;;;;:::i;:::-;;;;;;;;;;;;;61626:45;;;;;;61613:6;61595:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61585:37;;;;;;:86;61581:3000;;;61710:1;61704:8;;:5;:8;;61695:49;61704:8;61713:9;61704:19;;;;;-1:-1:-1;;;61704:19:0;;;;;;;;61581:3000;61817:26;;;;;;;:::i;:::-;;;;;;;;;;;;;61807:37;;;;;;61794:6;61776:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61766:37;;;;;;:78;61762:2819;;;61883:1;61877:8;;:5;:8;;61868:49;61877:8;61886:9;61877:19;;;;;-1:-1:-1;;;61877:19:0;;;;;;;;61762:2819;61990:26;;;;;;;:::i;:::-;;;;;;;;;;;;;61980:37;;;;;;61967:6;61949:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;61939:37;;;;;;:78;61935:2646;;;62056:1;62050:8;;:5;:8;;62041:49;62050:8;62059:9;62050:19;;;;;-1:-1:-1;;;62050:19:0;;;;;;;;61935:2646;62163:26;;;;;;;:::i;:::-;;;;;;;;;;;;;62153:37;;;;;;62140:6;62122:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62112:37;;;;;;:78;62108:2473;;;62229:1;62223:8;;:5;:8;;62214:49;62223:8;62232:9;62223:19;;;;;-1:-1:-1;;;62223:19:0;;;;;;;;62108:2473;62336:28;;;;;;;:::i;:::-;;;;;;;;;;;;;62326:39;;;;;;62313:6;62295:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62285:37;;;;;;:80;62281:2300;;;62404:1;62398:8;;;;:5;:8;;62389:49;;62398:8;;62407:9;;62398:19;;;;-1:-1:-1;;;62398:19:0;;;;;;;;62281:2300;62511:30;;;;;;;:::i;:::-;;;;;;;;;;;;;62501:41;;;;;;62488:6;62470:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62460:37;;;;;;:82;62456:2125;;;62581:1;62575:8;;:5;:8;;62566:49;62575:8;62584:9;62575:19;;;;;-1:-1:-1;;;62575:19:0;;;;;;;;62456:2125;62688:30;;;;;;;:::i;:::-;;;;;;;;;;;;;62678:41;;;;;;62665:6;62647:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62637:37;;;;;;:82;62633:1948;;;62758:1;62752:8;;:5;:8;;62743:49;62752:8;62761:9;62752:19;;;;;-1:-1:-1;;;62752:19:0;;;;;;;;62633:1948;62865:32;;;;;;;:::i;:::-;;;;;;;;;;;;;62855:43;;;;;;62842:6;62824:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62814:37;;;;;;:84;62810:1771;;;62937:1;62931:8;;:5;:8;;62922:49;62931:8;62940:9;62931:19;;;;;-1:-1:-1;;;62931:19:0;;;;;;;;62810:1771;63044:33;;;;;;;:::i;:::-;;;;;;;;;;;;;63034:44;;;;;;63021:6;63003:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62993:37;;;;;;:85;62989:1592;;;63117:1;63111:8;;:5;:8;;63102:49;63111:8;63120:9;63111:19;;;;;-1:-1:-1;;;63111:19:0;;;;;;;;62989:1592;63224:32;;;;;;;:::i;:::-;;;;;;;;;;;;;63214:43;;;;;;63201:6;63183:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63173:37;;;;;;:84;63169:1412;;;63296:2;63290:9;;:5;:9;;63281:50;63290:9;63300;63290:20;;;;;-1:-1:-1;;;63290:20:0;;;;;;;;63169:1412;63404:32;;;;;;;:::i;:::-;;;;;;;;;;;;;63394:43;;;;;;63381:6;63363:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63353:37;;;;;;:84;63349:1232;;;63476:2;63470:9;;:5;:9;;63461:50;63470:9;63480;63470:20;;;;;-1:-1:-1;;;63470:20:0;;;;;;;;63349:1232;63584:31;;;;;;;:::i;:::-;;;;;;;;;;;;;63574:42;;;;;;63561:6;63543:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63533:37;;;;;;:83;63529:1052;;;63655:2;63649:9;;:5;:9;;63640:50;63649:9;63659;63649:20;;;;;-1:-1:-1;;;63649:20:0;;;;;;;;63529:1052;63763:26;;;;;;;:::i;:::-;;;;;;;;;;;;;63753:37;;;;;;63740:6;63722:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63712:37;;;;;;:78;63708:873;;;63829:2;63823:9;;:5;:9;;63814:50;63823:9;63833;63823:20;;;;;-1:-1:-1;;;63823:20:0;;;;;;;;63708:873;63937:30;;;;;;;:::i;:::-;;;;;;;;;;;;;63927:41;;;;;;63914:6;63896:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63886:37;;;;;;:82;63882:699;;;64007:2;64001:9;;:5;:9;;63992:50;64001:9;64011;64001:20;;;;;-1:-1:-1;;;64001:20:0;;;;;;;;63882:699;64115:31;;;;;;;:::i;:::-;;;;;;;;;;;;;64105:42;;;;;;64092:6;64074:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64064:37;;;;;;:83;64060:521;;;64180:5;:9;;;;;;64171:50;64180:9;64190;64180:20;;;;;-1:-1:-1;;;64180:20:0;;;;;;;;64060:521;64294:26;;;;;;;:::i;:::-;;;;;;;;;;;;;64284:37;;;;;;64271:6;64253:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64243:37;;;;;;:78;64239:342;;;64360:2;64354:9;;:5;:9;;64345:50;64354:9;64364;64354:20;;;;;-1:-1:-1;;;64354:20:0;;;;;;;;64239:342;64468:26;;;;;;;:::i;:::-;;;;;;;;;;;;;64458:37;;;;;;64445:6;64427:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64417:37;;;;;;:78;64413:168;;;64534:2;64528:9;;:5;:9;;64519:50;64528:9;64538;64528:20;;;;;-1:-1:-1;;;64528:20:0;;;;;;;;64519:50;64512:57;;64413:168;64595:9;64608:1;64595:14;64591:140;;;64658:9;64675:14;64684:4;64675:8;:14::i;:::-;64641:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;64641:49:0;;;;;;;;;;-1:-1:-1;64706:13:0;;-1:-1:-1;;;;64706:13:0;64591:140;64757:2;64745:9;:14;64741:108;;;64783:54;64792:1;64795:7;64804:8;64820;:15;;;;64813:4;:22;;;;:::i;:::-;64804:32;;;;;;-1:-1:-1;;;64804:32:0;;;;;;;;;;;;;;;;64783:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:54::i;:::-;64775:62;;;;:::i;:::-;;;64741:108;64876:2;64863:9;:15;64859:291;;64898:9;64911:2;64898:15;64894:245;;;64941:130;64950:1;64953:7;64986:12;65006;:19;;;;64999:4;:26;;;;:::i;:::-;64986:40;;;;;;-1:-1:-1;;;64986:40:0;;;;;;;;;;;;;;;;65028:12;65048;:19;;;;65041:4;:26;;;;:::i;:::-;65028:40;;;;;;-1:-1:-1;;;65028:40:0;;;;;;;;;;;;;;;;64969:100;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64941:8;:130::i;:::-;64933:138;;;;:::i;:::-;;;64894:245;;;65112:11;65120:3;65112:11;;:::i;:::-;;;64894:245;65168:15;;;;:6;:15;;;;;;65160:23;;;;:::i;:::-;;;65227:9;65244:14;65253:4;65244:8;:14::i;:::-;65210:49;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;65210:49:0;;;;;;;60973:4319;-1:-1:-1;;;;;;;;;60973:4319:0:o;28830:177::-;28913:86;28933:5;28963:23;;;28988:2;28992:5;28940:58;;;;;;;;;:::i;40022:272::-;40136:28;40146:4;40152:2;40156:7;40136:9;:28::i;:::-;40183:48;40206:4;40212:2;40216:7;40225:5;40183:22;:48::i;:::-;40175:111;;;;-1:-1:-1;;;40175:111:0;;;;;;;:::i;67752:715::-;67808:13;68021:10;68017:53;;-1:-1:-1;68048:10:0;;;;;;;;;;;;-1:-1:-1;;;68048:10:0;;;;;;68017:53;68095:5;68080:12;68136:78;68143:9;;68136:78;;68169:8;;;;:::i;:::-;;-1:-1:-1;68192:10:0;;-1:-1:-1;68200:2:0;68192:10;;:::i;:::-;;;68136:78;;;68224:19;68256:6;68246:17;;;;;;-1:-1:-1;;;68246:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68246:17:0;;68224:39;;68274:154;68281:10;;68274:154;;68308:11;68318:1;68308:11;;:::i;:::-;;-1:-1:-1;68377:10:0;68385:2;68377:5;:10;:::i;:::-;68364:24;;:2;:24;:::i;:::-;68351:39;;68334:6;68341;68334:14;;;;;;-1:-1:-1;;;68334:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;68334:56:0;;;;;;;;-1:-1:-1;68405:11:0;68414:2;68405:11;;:::i;:::-;;;68274:154;;432:1607;530:11;;490:13;;556:8;552:23;;-1:-1:-1;;566:9:0;;;;;;;;;-1:-1:-1;566:9:0;;;;552:23;627:18;665:1;654:7;:3;660:1;654:7;:::i;:::-;653:13;;;;:::i;:::-;648:19;;:1;:19;:::i;:::-;627:40;-1:-1:-1;725:19:0;757:15;627:40;770:2;757:15;:::i;:::-;747:26;;;;;;-1:-1:-1;;;747:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;747:26:0;;725:48;;786:18;807:5;;;;;;;;;;;;;;;;;786:26;;876:1;869:5;865:13;921:2;913:6;909:15;972:1;940:777;995:3;992:1;989:10;940:777;;;1050:1;1093:12;;;;;1087:19;1188:4;1176:2;1172:14;;;;;1154:40;;1148:47;1297:2;1293:14;;;1289:25;;1275:40;;1269:47;1426:1;1422:13;;;1418:24;;1404:39;;1398:46;1546:16;;;;1532:31;;1526:38;1224:1;1220:11;;;1318:4;1265:58;;;1256:68;1349:11;;1394:57;;;1385:67;;;;1477:11;;1522:49;;1513:59;1601:3;1597:13;1630:22;;1700:1;1685:17;;;;1043:9;940:777;;;944:44;1749:1;1744:3;1740:11;1770:1;1765:84;;;;1868:1;1863:82;;;;1733:212;;1765:84;-1:-1:-1;;;;;1798:17:0;;1791:43;1765:84;;1863:82;-1:-1:-1;;;;;1896:17:0;;1889:41;1733:212;-1:-1:-1;;;1961:26:0;;;;432:1607;-1:-1:-1;;;;432:1607:0:o;21131:157::-;-1:-1:-1;;;;;;21240:40:0;;-1:-1:-1;;;21240:40:0;21131:157;;;:::o;49360:555::-;49470:45;49497:4;49503:2;49507:7;49470:26;:45::i;:::-;-1:-1:-1;;;;;49532:18:0;;49528:187;;49567:40;49599:7;49567:31;:40::i;:::-;49528:187;;;49637:2;-1:-1:-1;;;;;49629:10:0;:4;-1:-1:-1;;;;;49629:10:0;;49625:90;;49656:47;49689:4;49695:7;49656:32;:47::i;:::-;-1:-1:-1;;;;;49729:16:0;;49725:183;;49762:45;49799:7;49762:36;:45::i;:::-;49725:183;;;49835:4;-1:-1:-1;;;;;49829:10:0;:2;-1:-1:-1;;;;;49829:10:0;;49825:83;;49856:40;49884:2;49888:7;49856:27;:40::i;41935:250::-;42031:18;42037:2;42041:7;42031:5;:18::i;:::-;42068:54;42099:1;42103:2;42107:7;42116:5;42068:22;:54::i;:::-;42060:117;;;;-1:-1:-1;;;42060:117:0;;;;;;;:::i;31264:761::-;31688:23;31714:69;31742:4;31714:69;;;;;;;;;;;;;;;;;31722:5;-1:-1:-1;;;;;31714:27:0;;;:69;;;;;:::i;:::-;31798:17;;31688:95;;-1:-1:-1;31798:21:0;31794:224;;31940:10;31929:30;;;;;;;;;;;;:::i;:::-;31921:85;;;;-1:-1:-1;;;31921:85:0;;;;;;;:::i;58450:138::-;58510:7;58572:5;58555:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58555:23:0;;;;;;;;;58545:34;;58555:23;58545:34;;;;;58450:138;-1:-1:-1;;58450:138:0:o;45230:843::-;45351:4;45377:15;:2;-1:-1:-1;;;;;45377:13:0;;:15::i;:::-;45373:693;;;45429:2;-1:-1:-1;;;;;45413:36:0;;45450:12;:10;:12::i;:::-;45464:4;45470:7;45479:5;45413:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45413:72:0;;;;;;;;-1:-1:-1;;45413:72:0;;;;;;;;;;;;:::i;:::-;;;45409:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45659:13:0;;45655:341;;45702:60;;-1:-1:-1;;;45702:60:0;;;;;;;:::i;45655:341::-;45946:6;45940:13;45931:6;45927:2;45923:15;45916:38;45409:602;-1:-1:-1;;;;;;45536:55:0;-1:-1:-1;;;45536:55:0;;-1:-1:-1;45529:62:0;;45373:693;-1:-1:-1;46050:4:0;46043:11;;50638:164;50742:10;:17;;50715:24;;;;:15;:24;;;;;:44;;;50770:24;;;;;;;;;;;;50638:164::o;51429:988::-;51695:22;51745:1;51720:22;51737:4;51720:16;:22::i;:::-;:26;;;;:::i;:::-;51757:18;51778:26;;;:17;:26;;;;;;51695:51;;-1:-1:-1;51911:28:0;;;51907:328;;-1:-1:-1;;;;;51978:18:0;;51956:19;51978:18;;;:12;:18;;;;;;;;:34;;;;;;;;;52029:30;;;;;;:44;;;52146:30;;:17;:30;;;;;:43;;;51907:328;-1:-1:-1;52331:26:0;;;;:17;:26;;;;;;;;52324:33;;;-1:-1:-1;;;;;52375:18:0;;;;;:12;:18;;;;;:34;;;;;;;52368:41;51429:988::o;52712:1079::-;52990:10;:17;52965:22;;52990:21;;53010:1;;52990:21;:::i;:::-;53022:18;53043:24;;;:15;:24;;;;;;53416:10;:26;;52965:46;;-1:-1:-1;53043:24:0;;52965:46;;53416:26;;;;-1:-1:-1;;;53416:26:0;;;;;;;;;;;;;;;;;53394:48;;53480:11;53455:10;53466;53455:22;;;;;;-1:-1:-1;;;53455:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;53560:28;;;:15;:28;;;;;;;:41;;;53732:24;;;;;53725:31;53767:10;:16;;;;;-1:-1:-1;;;53767:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;52712:1079;;;;:::o;50216:221::-;50301:14;50318:20;50335:2;50318:16;:20::i;:::-;-1:-1:-1;;;;;50349:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;50394:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;50216:221:0:o;42521:382::-;-1:-1:-1;;;;;42601:16:0;;42593:61;;;;-1:-1:-1;;;42593:61:0;;;;;;;:::i;:::-;42674:16;42682:7;42674;:16::i;:::-;42673:17;42665:58;;;;-1:-1:-1;;;42665:58:0;;;;;;;:::i;:::-;42736:45;42765:1;42769:2;42773:7;42736:20;:45::i;:::-;-1:-1:-1;;;;;42794:13:0;;;;;;:9;:13;;;;;:18;;42811:1;;42794:13;:18;;42811:1;;42794:18;:::i;:::-;;;;-1:-1:-1;;42823:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42823:21:0;-1:-1:-1;;;;;42823:21:0;;;;;;;;42862:33;;42823:16;;;42862:33;;42823:16;;42862:33;42521:382;;:::o;5899:195::-;6002:12;6034:52;6056:6;6064:4;6070:1;6073:12;6034:21;:52::i;2981:422::-;3348:20;3387:8;;;2981:422::o;6951:530::-;7078:12;7136:5;7111:21;:30;;7103:81;;;;-1:-1:-1;;;7103:81:0;;;;;;;:::i;:::-;7203:18;7214:6;7203:10;:18::i;:::-;7195:60;;;;-1:-1:-1;;;7195:60:0;;;;;;;:::i;:::-;7329:12;7343:23;7370:6;-1:-1:-1;;;;;7370:11:0;7390:5;7398:4;7370:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7328:75;;;;7421:52;7439:7;7448:10;7460:12;7421:17;:52::i;:::-;7414:59;6951:530;-1:-1:-1;;;;;;;6951:530:0:o;9491:742::-;9606:12;9635:7;9631:595;;;-1:-1:-1;9666:10:0;9659:17;;9631:595;9780:17;;:21;9776:439;;10043:10;10037:17;10104:15;10091:10;10087:2;10083:19;10076:44;9991:148;10186:12;10179:20;;-1:-1:-1;;;10179:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:339:1:-;;109:53;124:37;154:6;124:37;:::i;:::-;109:53;:::i;:::-;100:62;;185:6;178:5;171:21;225:3;216:6;211:3;207:16;204:25;201:2;;;242:1;239;232:12;201:2;291:6;286:3;279:4;272:5;268:16;255:43;345:1;338:4;329:6;322:5;318:18;314:29;307:40;90:263;;;;;:::o;358:259::-;;470:2;458:9;449:7;445:23;441:32;438:2;;;491:6;483;476:22;438:2;535:9;522:23;554:33;581:5;554:33;:::i;622:263::-;;745:2;733:9;724:7;720:23;716:32;713:2;;;766:6;758;751:22;713:2;803:9;797:16;822:33;849:5;822:33;:::i;890:402::-;;;1019:2;1007:9;998:7;994:23;990:32;987:2;;;1040:6;1032;1025:22;987:2;1084:9;1071:23;1103:33;1130:5;1103:33;:::i;:::-;1155:5;-1:-1:-1;1212:2:1;1197:18;;1184:32;1225:35;1184:32;1225:35;:::i;:::-;1279:7;1269:17;;;977:315;;;;;:::o;1297:470::-;;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;1464:6;1456;1449:22;1411:2;1508:9;1495:23;1527:33;1554:5;1527:33;:::i;:::-;1579:5;-1:-1:-1;1636:2:1;1621:18;;1608:32;1649:35;1608:32;1649:35;:::i;:::-;1401:366;;1703:7;;-1:-1:-1;;;1757:2:1;1742:18;;;;1729:32;;1401:366::o;1772:830::-;;;;;1944:3;1932:9;1923:7;1919:23;1915:33;1912:2;;;1966:6;1958;1951:22;1912:2;2010:9;1997:23;2029:33;2056:5;2029:33;:::i;:::-;2081:5;-1:-1:-1;2138:2:1;2123:18;;2110:32;2151:35;2110:32;2151:35;:::i;:::-;2205:7;-1:-1:-1;2259:2:1;2244:18;;2231:32;;-1:-1:-1;2314:2:1;2299:18;;2286:32;2341:18;2330:30;;2327:2;;;2378:6;2370;2363:22;2327:2;2406:22;;2459:4;2451:13;;2447:27;-1:-1:-1;2437:2:1;;2493:6;2485;2478:22;2437:2;2521:75;2588:7;2583:2;2570:16;2565:2;2561;2557:11;2521:75;:::i;:::-;2511:85;;;1902:700;;;;;;;:::o;2607:396::-;;;2733:2;2721:9;2712:7;2708:23;2704:32;2701:2;;;2754:6;2746;2739:22;2701:2;2798:9;2785:23;2817:33;2844:5;2817:33;:::i;:::-;2869:5;-1:-1:-1;2926:2:1;2911:18;;2898:32;2939;2898;2939;:::i;3008:327::-;;;3137:2;3125:9;3116:7;3112:23;3108:32;3105:2;;;3158:6;3150;3143:22;3105:2;3202:9;3189:23;3221:33;3248:5;3221:33;:::i;:::-;3273:5;3325:2;3310:18;;;;3297:32;;-1:-1:-1;;;3095:240:1:o;3340:253::-;;3449:2;3437:9;3428:7;3424:23;3420:32;3417:2;;;3470:6;3462;3455:22;3417:2;3514:9;3501:23;3533:30;3557:5;3533:30;:::i;3598:257::-;;3718:2;3706:9;3697:7;3693:23;3689:32;3686:2;;;3739:6;3731;3724:22;3686:2;3776:9;3770:16;3795:30;3819:5;3795:30;:::i;3860:257::-;;3971:2;3959:9;3950:7;3946:23;3942:32;3939:2;;;3992:6;3984;3977:22;3939:2;4036:9;4023:23;4055:32;4081:5;4055:32;:::i;4122:261::-;;4244:2;4232:9;4223:7;4219:23;4215:32;4212:2;;;4265:6;4257;4250:22;4212:2;4302:9;4296:16;4321:32;4347:5;4321:32;:::i;4388:676::-;;4521:2;4509:9;4500:7;4496:23;4492:32;4489:2;;;4542:6;4534;4527:22;4489:2;4580:9;4574:16;4613:18;4605:6;4602:30;4599:2;;;4650:6;4642;4635:22;4599:2;4678:22;;4731:4;4723:13;;4719:27;-1:-1:-1;4709:2:1;;4765:6;4757;4750:22;4709:2;4799;4793:9;4824:49;4839:33;4869:2;4839:33;:::i;4824:49::-;4896:2;4889:5;4882:17;4936:7;4931:2;4926;4922;4918:11;4914:20;4911:33;4908:2;;;4962:6;4954;4947:22;4908:2;4980:54;5031:2;5026;5019:5;5015:14;5010:2;5006;5002:11;4980:54;:::i;:::-;5053:5;4479:585;-1:-1:-1;;;;;4479:585:1:o;5069:190::-;;5181:2;5169:9;5160:7;5156:23;5152:32;5149:2;;;5202:6;5194;5187:22;5149:2;-1:-1:-1;5230:23:1;;5139:120;-1:-1:-1;5139:120:1:o;5264:258::-;;;5393:2;5381:9;5372:7;5368:23;5364:32;5361:2;;;5414:6;5406;5399:22;5361:2;-1:-1:-1;;5442:23:1;;;5512:2;5497:18;;;5484:32;;-1:-1:-1;5351:171:1:o;5527:618::-;;;;5683:2;5671:9;5662:7;5658:23;5654:32;5651:2;;;5704:6;5696;5689:22;5651:2;5745:9;5732:23;5722:33;;5802:2;5791:9;5787:18;5774:32;5764:42;;5857:2;5846:9;5842:18;5829:32;5884:18;5876:6;5873:30;5870:2;;;5921:6;5913;5906:22;5870:2;5949:22;;6002:4;5994:13;;5990:27;-1:-1:-1;5980:2:1;;6036:6;6028;6021:22;5980:2;6064:75;6131:7;6126:2;6113:16;6108:2;6104;6100:11;6064:75;:::i;:::-;6054:85;;;5641:504;;;;;:::o;6150:357::-;;;6277:2;6265:9;6256:7;6252:23;6248:32;6245:2;;;6298:6;6290;6283:22;6245:2;6342:9;6329:23;6392:4;6385:5;6381:16;6374:5;6371:27;6361:2;;6417:6;6409;6402:22;6512:259;;6593:5;6587:12;6620:6;6615:3;6608:19;6636:63;6692:6;6685:4;6680:3;6676:14;6669:4;6662:5;6658:16;6636:63;:::i;:::-;6753:2;6732:15;-1:-1:-1;;6728:29:1;6719:39;;;;6760:4;6715:50;;6563:208;-1:-1:-1;;6563:208:1:o;6776:982::-;6863:12;;6776:982;;6935:1;6920:17;;6956:1;6992:18;;;;7019:2;;7073:4;7065:6;7061:17;7051:27;;7019:2;7099;7147;7139:6;7136:14;7116:18;7113:38;7110:2;;;-1:-1:-1;;;7174:33:1;;7230:4;7227:1;7220:15;7260:4;7181:3;7248:17;7110:2;7291:18;7318:104;;;;7436:1;7431:321;;;;7284:468;;7318:104;-1:-1:-1;;7351:24:1;;7339:37;;7396:16;;;;-1:-1:-1;7318:104:1;;7431:321;7467:38;7499:5;7467:38;:::i;:::-;7527:1;7541:165;7555:6;7552:1;7549:13;7541:165;;;7633:14;;7620:11;;;7613:35;7676:16;;;;7570:10;;7541:165;;;7545:3;;7735:6;7730:3;7726:16;7719:23;;7284:468;;;;;;;6836:922;;;;:::o;7763:127::-;-1:-1:-1;;;7830:27:1;;7882:1;7873:11;;7820:70::o;7895:274::-;;8062:6;8056:13;8078:53;8124:6;8119:3;8112:4;8104:6;8100:17;8078:53;:::i;:::-;8147:16;;;;;8032:137;-1:-1:-1;;8032:137:1:o;8455:470::-;;8672:6;8666:13;8688:53;8734:6;8729:3;8722:4;8714:6;8710:17;8688:53;:::i;:::-;8804:13;;8763:16;;;;8826:57;8804:13;8763:16;8860:4;8848:17;;8826:57;:::i;:::-;8899:20;;8642:283;-1:-1:-1;;;;8642:283:1:o;8930:1052::-;;9291:6;9285:13;9307:53;9353:6;9348:3;9341:4;9333:6;9329:17;9307:53;:::i;:::-;9423:13;;9382:16;;;;9445:57;9423:13;9382:16;9479:4;9467:17;;9445:57;:::i;:::-;9569:13;;9524:20;;;9591:57;9569:13;9524:20;9625:4;9613:17;;9591:57;:::i;:::-;9715:13;;9670:20;;;9737:57;9715:13;9670:20;9771:4;9759:17;;9737:57;:::i;:::-;9861:13;;9816:20;;;9883:57;9861:13;9816:20;9917:4;9905:17;;9883:57;:::i;:::-;9956:20;;9261:721;-1:-1:-1;;;;;;;9261:721:1:o;9987:1780::-;;10540:6;10534:13;10556:53;10602:6;10597:3;10590:4;10582:6;10578:17;10556:53;:::i;:::-;10672:13;;10631:16;;;;10694:57;10672:13;10631:16;10728:4;10716:17;;10694:57;:::i;:::-;10782:6;10776:13;10798:72;10861:8;10850;10843:5;10839:20;10832:4;10824:6;10820:17;10798:72;:::i;:::-;10952:13;;10896:20;;;;10892:35;;10974:57;10952:13;10892:35;11008:4;10996:17;;10974:57;:::i;:::-;11062:6;11056:13;11078:72;11141:8;11130;11123:5;11119:20;11112:4;11104:6;11100:17;11078:72;:::i;:::-;11232:13;;11176:20;;;;11172:35;;11254:57;11232:13;11172:35;11288:4;11276:17;;11254:57;:::i;:::-;11342:6;11336:13;11358:72;11421:8;11410;11403:5;11399:20;11392:4;11384:6;11380:17;11358:72;:::i;:::-;11512:13;;11456:20;;;;11452:35;;11534:57;11512:13;11452:35;11568:4;11556:17;;11534:57;:::i;:::-;11622:6;11616:13;11638:72;11701:8;11690;11683:5;11679:20;11672:4;11664:6;11660:17;11638:72;:::i;:::-;11730:20;;11726:35;;10510:1257;-1:-1:-1;;;;;;;;;;;10510:1257:1:o;11772:615::-;;12090:6;12084:13;12106:53;12152:6;12147:3;12140:4;12132:6;12128:17;12106:53;:::i;:::-;-1:-1:-1;;;12181:16:1;;;12206:19;;;12250:13;;12272:65;12250:13;12324:1;12313:13;;12306:4;12294:17;;12272:65;:::i;:::-;12357:20;12379:1;12353:28;;12060:327;-1:-1:-1;;;;12060:327:1:o;12392:281::-;;12590:77;12626:40;12662:3;12654:6;12626:40;:::i;:::-;12618:6;12590:77;:::i;12678:262::-;-1:-1:-1;;;12880:26:1;;12931:2;12922:12;;12870:70::o;12945:254::-;-1:-1:-1;;;13147:19:1;;13191:1;13182:11;;13137:62::o;13204:256::-;-1:-1:-1;;;13406:21:1;;13452:1;13443:11;;13396:64::o;13465:254::-;-1:-1:-1;;;13667:19:1;;13711:1;13702:11;;13657:62::o;13724:254::-;-1:-1:-1;;;13926:19:1;;13970:1;13961:11;;13916:62::o;13983:254::-;-1:-1:-1;;;14185:19:1;;14229:1;14220:11;;14175:62::o;14242:258::-;-1:-1:-1;;;14444:23:1;;14492:1;14483:11;;14434:66::o;14505:261::-;-1:-1:-1;;;14707:25:1;;14757:2;14748:12;;14697:69::o;14771:423::-;;-1:-1:-1;;;15028:3:1;15021:21;15071:6;15065:13;15087:61;15141:6;15137:1;15132:3;15128:11;15121:4;15113:6;15109:17;15087:61;:::i;:::-;15168:16;;;;15186:1;15164:24;;15011:183;-1:-1:-1;;15011:183:1:o;15199:259::-;-1:-1:-1;;;15401:24:1;;15450:1;15441:11;;15391:67::o;15463:261::-;-1:-1:-1;;;15665:25:1;;15715:2;15706:12;;15655:69::o;15729:258::-;-1:-1:-1;;;15931:23:1;;15979:1;15970:11;;15921:66::o;15992:1487::-;-1:-1:-1;;;16492:61:1;;16576:13;;15992:1487;;16598:62;16576:13;16648:2;16639:12;;16632:4;16620:17;;16598:62;:::i;:::-;16688:6;16683:3;16679:16;16669:26;;16724:66;16719:2;16715;16711:11;16704:87;16820:34;16815:2;16811;16807:11;16800:55;16884:34;16879:2;16875;16871:11;16864:55;16949:34;16943:3;16939:2;16935:12;16928:56;17014:34;17008:3;17004:2;17000:12;16993:56;17079:34;17073:3;17069:2;17065:12;17058:56;17144:66;17138:3;17134:2;17130:12;17123:88;-1:-1:-1;;;17235:3:1;17231:2;17227:12;17220:46;17285:3;17319:6;17313:13;17335:63;17389:8;17384:2;17380;17376:11;17369:4;17361:6;17357:17;17335:63;:::i;:::-;17414:59;17469:2;17458:8;17454:2;17450:17;17446:26;17414:59;:::i;17484:259::-;-1:-1:-1;;;17686:24:1;;17735:1;17726:11;;17676:67::o;17748:448::-;;18010:31;18005:3;17998:44;18071:6;18065:13;18087:62;18142:6;18137:2;18132:3;18128:12;18121:4;18113:6;18109:17;18087:62;:::i;:::-;18169:16;;;;18187:2;18165:25;;17988:208;-1:-1:-1;;17988:208:1:o;18201:259::-;-1:-1:-1;;;18403:24:1;;18452:1;18443:11;;18393:67::o;18465:263::-;-1:-1:-1;;;18667:27:1;;18719:2;18710:12;;18657:71::o;18733:258::-;-1:-1:-1;;;18935:23:1;;18983:1;18974:11;;18925:66::o;18996:254::-;-1:-1:-1;;;19198:19:1;;19242:1;19233:11;;19188:62::o;19255:254::-;-1:-1:-1;;;19457:19:1;;19501:1;19492:11;;19447:62::o;19514:261::-;-1:-1:-1;;;19716:25:1;;19766:2;19757:12;;19706:69::o;19780:203::-;-1:-1:-1;;;;;19944:32:1;;;;19926:51;;19914:2;19899:18;;19881:102::o;19988:304::-;-1:-1:-1;;;;;20218:15:1;;;20200:34;;20270:15;;20265:2;20250:18;;20243:43;20150:2;20135:18;;20117:175::o;20297:375::-;-1:-1:-1;;;;;20555:15:1;;;20537:34;;20607:15;;;;20602:2;20587:18;;20580:43;20654:2;20639:18;;20632:34;;;;20487:2;20472:18;;20454:218::o;20677:490::-;-1:-1:-1;;;;;20946:15:1;;;20928:34;;20998:15;;20993:2;20978:18;;20971:43;21045:2;21030:18;;21023:34;;;21093:3;21088:2;21073:18;;21066:31;;;20677:490;;21114:47;;21141:19;;21133:6;21114:47;:::i;:::-;21106:55;20880:287;-1:-1:-1;;;;;;20880:287:1:o;21172:274::-;-1:-1:-1;;;;;21364:32:1;;;;21346:51;;21428:2;21413:18;;21406:34;21334:2;21319:18;;21301:145::o;21451:187::-;21616:14;;21609:22;21591:41;;21579:2;21564:18;;21546:92::o;21865:221::-;;22014:2;22003:9;21996:21;22034:46;22076:2;22065:9;22061:18;22053:6;22034:46;:::i;22091:407::-;22293:2;22275:21;;;22332:2;22312:18;;;22305:30;22371:34;22366:2;22351:18;;22344:62;-1:-1:-1;;;22437:2:1;22422:18;;22415:41;22488:3;22473:19;;22265:233::o;22503:414::-;22705:2;22687:21;;;22744:2;22724:18;;;22717:30;22783:34;22778:2;22763:18;;22756:62;-1:-1:-1;;;22849:2:1;22834:18;;22827:48;22907:3;22892:19;;22677:240::o;22922:402::-;23124:2;23106:21;;;23163:2;23143:18;;;23136:30;23202:34;23197:2;23182:18;;23175:62;-1:-1:-1;;;23268:2:1;23253:18;;23246:36;23314:3;23299:19;;23096:228::o;23329:352::-;23531:2;23513:21;;;23570:2;23550:18;;;23543:30;23609;23604:2;23589:18;;23582:58;23672:2;23657:18;;23503:178::o;23686:338::-;23888:2;23870:21;;;23927:2;23907:18;;;23900:30;-1:-1:-1;;;23961:2:1;23946:18;;23939:44;24015:2;24000:18;;23860:164::o;24029:400::-;24231:2;24213:21;;;24270:2;24250:18;;;24243:30;24309:34;24304:2;24289:18;;24282:62;-1:-1:-1;;;24375:2:1;24360:18;;24353:34;24419:3;24404:19;;24203:226::o;24434:349::-;24636:2;24618:21;;;24675:2;24655:18;;;24648:30;24714:27;24709:2;24694:18;;24687:55;24774:2;24759:18;;24608:175::o;24788:402::-;24990:2;24972:21;;;25029:2;25009:18;;;25002:30;25068:34;25063:2;25048:18;;25041:62;-1:-1:-1;;;25134:2:1;25119:18;;25112:36;25180:3;25165:19;;24962:228::o;25195:408::-;25397:2;25379:21;;;25436:2;25416:18;;;25409:30;25475:34;25470:2;25455:18;;25448:62;-1:-1:-1;;;25541:2:1;25526:18;;25519:42;25593:3;25578:19;;25369:234::o;25608:420::-;25810:2;25792:21;;;25849:2;25829:18;;;25822:30;25888:34;25883:2;25868:18;;25861:62;25959:26;25954:2;25939:18;;25932:54;26018:3;26003:19;;25782:246::o;26033:406::-;26235:2;26217:21;;;26274:2;26254:18;;;26247:30;26313:34;26308:2;26293:18;;26286:62;-1:-1:-1;;;26379:2:1;26364:18;;26357:40;26429:3;26414:19;;26207:232::o;26444:405::-;26646:2;26628:21;;;26685:2;26665:18;;;26658:30;26724:34;26719:2;26704:18;;26697:62;-1:-1:-1;;;26790:2:1;26775:18;;26768:39;26839:3;26824:19;;26618:231::o;26854:356::-;27056:2;27038:21;;;27075:18;;;27068:30;27134:34;27129:2;27114:18;;27107:62;27201:2;27186:18;;27028:182::o;27215:408::-;27417:2;27399:21;;;27456:2;27436:18;;;27429:30;27495:34;27490:2;27475:18;;27468:62;-1:-1:-1;;;27561:2:1;27546:18;;27539:42;27613:3;27598:19;;27389:234::o;27628:356::-;27830:2;27812:21;;;27849:18;;;27842:30;27908:34;27903:2;27888:18;;27881:62;27975:2;27960:18;;27802:182::o;27989:340::-;28191:2;28173:21;;;28230:2;28210:18;;;28203:30;-1:-1:-1;;;28264:2:1;28249:18;;28242:46;28320:2;28305:18;;28163:166::o;28334:405::-;28536:2;28518:21;;;28575:2;28555:18;;;28548:30;28614:34;28609:2;28594:18;;28587:62;-1:-1:-1;;;28680:2:1;28665:18;;28658:39;28729:3;28714:19;;28508:231::o;28744:397::-;28946:2;28928:21;;;28985:2;28965:18;;;28958:30;29024:34;29019:2;29004:18;;28997:62;-1:-1:-1;;;29090:2:1;29075:18;;29068:31;29131:3;29116:19;;28918:223::o;29146:413::-;29348:2;29330:21;;;29387:2;29367:18;;;29360:30;29426:34;29421:2;29406:18;;29399:62;-1:-1:-1;;;29492:2:1;29477:18;;29470:47;29549:3;29534:19;;29320:239::o;29564:353::-;29766:2;29748:21;;;29805:2;29785:18;;;29778:30;29844:31;29839:2;29824:18;;29817:59;29908:2;29893:18;;29738:179::o;29922:408::-;30124:2;30106:21;;;30163:2;30143:18;;;30136:30;30202:34;30197:2;30182:18;;30175:62;-1:-1:-1;;;30268:2:1;30253:18;;30246:42;30320:3;30305:19;;30096:234::o;30335:406::-;30537:2;30519:21;;;30576:2;30556:18;;;30549:30;30615:34;30610:2;30595:18;;30588:62;-1:-1:-1;;;30681:2:1;30666:18;;30659:40;30731:3;30716:19;;30509:232::o;30746:328::-;30948:2;30930:21;;;30987:1;30967:18;;;30960:29;-1:-1:-1;;;31020:2:1;31005:18;;30998:35;31065:2;31050:18;;30920:154::o;31079:355::-;31281:2;31263:21;;;31320:2;31300:18;;;31293:30;31359:33;31354:2;31339:18;;31332:61;31425:2;31410:18;;31253:181::o;31439:329::-;31641:2;31623:21;;;31680:1;31660:18;;;31653:29;-1:-1:-1;;;31713:2:1;31698:18;;31691:36;31759:2;31744:18;;31613:155::o;31773:188::-;31947:6;31935:19;;;;31917:38;;31905:2;31890:18;;31872:89::o;31966:177::-;32112:25;;;32100:2;32085:18;;32067:76::o;32148:248::-;32322:25;;;32378:2;32363:18;;32356:34;32310:2;32295:18;;32277:119::o;32401:251::-;32471:2;32465:9;32501:17;;;32548:18;32533:34;;32569:22;;;32530:62;32527:2;;;32595:18;;:::i;:::-;32631:2;32624:22;32445:207;;-1:-1:-1;32445:207:1:o;32657:190::-;;32740:18;32732:6;32729:30;32726:2;;;32762:18;;:::i;:::-;-1:-1:-1;32830:2:1;32807:17;-1:-1:-1;;32803:31:1;32836:4;32799:42;;32716:131::o;32852:129::-;;32920:17;;;32970:4;32954:21;;;32910:71::o;32986:128::-;;33057:1;33053:6;33050:1;33047:13;33044:2;;;33063:18;;:::i;:::-;-1:-1:-1;33099:9:1;;33034:80::o;33119:120::-;;33185:1;33175:2;;33190:18;;:::i;:::-;-1:-1:-1;33224:9:1;;33165:74::o;33244:168::-;;33350:1;33346;33342:6;33338:14;33335:1;33332:21;33327:1;33320:9;33313:17;33309:45;33306:2;;;33357:18;;:::i;:::-;-1:-1:-1;33397:9:1;;33296:116::o;33417:125::-;;33485:1;33482;33479:8;33476:2;;;33490:18;;:::i;:::-;-1:-1:-1;33527:9:1;;33466:76::o;33547:258::-;33619:1;33629:113;33643:6;33640:1;33637:13;33629:113;;;33719:11;;;33713:18;33700:11;;;33693:39;33665:2;33658:10;33629:113;;;33760:6;33757:1;33754:13;33751:2;;;-1:-1:-1;;33795:1:1;33777:16;;33770:27;33600:205::o;33810:380::-;33895:1;33885:12;;33942:1;33932:12;;;33953:2;;34007:4;33999:6;33995:17;33985:27;;33953:2;34060;34052:6;34049:14;34029:18;34026:38;34023:2;;;34106:10;34101:3;34097:20;34094:1;34087:31;34141:4;34138:1;34131:15;34169:4;34166:1;34159:15;34023:2;;33865:325;;;:::o;34195:135::-;;-1:-1:-1;;34255:17:1;;34252:2;;;34275:18;;:::i;:::-;-1:-1:-1;34322:1:1;34311:13;;34242:88::o;34335:112::-;;34393:1;34383:2;;34398:18;;:::i;:::-;-1:-1:-1;34432:9:1;;34373:74::o;34452:127::-;34513:10;34508:3;34504:20;34501:1;34494:31;34544:4;34541:1;34534:15;34568:4;34565:1;34558:15;34584:127;34645:10;34640:3;34636:20;34633:1;34626:31;34676:4;34673:1;34666:15;34700:4;34697:1;34690:15;34716:127;34777:10;34772:3;34768:20;34765:1;34758:31;34808:4;34805:1;34798:15;34832:4;34829:1;34822:15;34848:133;-1:-1:-1;;;;;34925:31:1;;34915:42;;34905:2;;34971:1;34968;34961:12;34905:2;34895:86;:::o;34986:120::-;35074:5;35067:13;35060:21;35053:5;35050:32;35040:2;;35096:1;35093;35086:12;35111:133;-1:-1:-1;;;;;;35187:32:1;;35177:43;;35167:2;;35234:1;35231;35224:12

Swarm Source

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