ETH Price: $3,065.35 (+0.92%)
Gas: 3 Gwei

Token

METAKAYS (MK)
 

Overview

Max Total Supply

0 MK

Holders

896

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tomle.eth
Balance
4 MK
0x3d0696f8cb210e3eb8a9c7bd7edeccf4679f07bd
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:
METAKAYS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)

pragma solidity >=0.8.0;

/// @title DynamicBuffer
/// @author David Huber (@cxkoda) and Simon Fremaux (@dievardump). See also
///         https://raw.githubusercontent.com/dievardump/solidity-dynamic-buffer
/// @notice This library is used to allocate a big amount of container memory
//          which will be subsequently filled without needing to reallocate
///         memory.
/// @dev First, allocate memory.
///      Then use `buffer.appendUnchecked(theBytes)` or `appendSafe()` if
///      bounds checking is required.
library DynamicBuffer {
    /// @notice Allocates container space for the DynamicBuffer
    /// @param capacity The intended max amount of bytes in the buffer
    /// @return buffer The memory location of the buffer
    /// @dev Allocates `capacity + 0x60` bytes of space
    ///      The buffer array starts at the first container data position,
    ///      (i.e. `buffer = container + 0x20`)
    function allocate(uint256 capacity) internal pure returns (bytes memory buffer) {
        assembly {
            // Get next-free memory address
            let container := mload(0x40)

            // Allocate memory by setting a new next-free address
            {
                // Add 2 x 32 bytes in size for the two length fields
                // Add 32 bytes safety space for 32B chunked copy
                let size := add(capacity, 0x60)
                let newNextFree := add(container, size)
                mstore(0x40, newNextFree)
            }

            // Set the correct container length
            {
                let length := add(capacity, 0x40)
                mstore(container, length)
            }

            // The buffer starts at idx 1 in the container (0 is length)
            buffer := add(container, 0x20)

            // Init content with length 0
            mstore(buffer, 0)
        }

        return buffer;
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Does not perform out-of-bound checks (container capacity)
    ///      for efficiency.
    function appendUnchecked(bytes memory buffer, bytes memory data) internal pure {
        assembly {
            let length := mload(data)
            for {
                data := add(data, 0x20)
                let dataEnd := add(data, length)
                let copyTo := add(buffer, add(mload(buffer), 0x20))
            } lt(data, dataEnd) {
                data := add(data, 0x20)
                copyTo := add(copyTo, 0x20)
            } {
                // Copy 32B chunks from data to buffer.
                // This may read over data array boundaries and copy invalid
                // bytes, which doesn't matter in the end since we will
                // later set the correct buffer length, and have allocated an
                // additional word to avoid buffer overflow.
                mstore(copyTo, mload(data))
            }

            // Update buffer length
            mstore(buffer, add(mload(buffer), length))
        }
    }

    /// @notice Appends data to buffer, and update buffer length
    /// @param buffer the buffer to append the data to
    /// @param data the data to append
    /// @dev Performs out-of-bound checks and calls `appendUnchecked`.
    function appendSafe(bytes memory buffer, bytes memory data) internal pure {
        uint256 capacity;
        uint256 length;
        assembly {
            capacity := sub(mload(sub(buffer, 0x20)), 0x40)
            length := mload(buffer)
        }

        require(length + data.length <= capacity, "DynamicBuffer: Appending out of bounds.");
        appendUnchecked(buffer, data);
    }
}

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

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

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

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

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

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}

// File: contracts/interfaces/ILayerZeroEndpoint.sol

pragma solidity >=0.5.0;

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}

// File: contracts/interfaces/ILayerZeroReceiver.sol

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}
// File: @openzeppelin/contracts/utils/Strings.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(address(0));
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

        _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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: contracts/NonblockingReceiver.sol

pragma solidity ^0.8.6;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {

    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]),
            "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");

        // handle incoming message
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

// File: contracts/METAKAYS.sol

pragma solidity ^0.8.7;

interface IFeatures1 {
  function readMisc(uint256 _id) external view returns (string memory);
}

contract METAKAYS is Ownable, ERC721, NonblockingReceiver {

    using DynamicBuffer for bytes;
    event Kustomized(uint256 _itemID);

    struct Features {
      uint256 data1;
      uint256 data2;
      uint256[4] colors;
      uint256[3] colorSelectors;
    }

    IFeatures1 features1;
    address public _owner;
    uint256 nextTokenId = 0;
    uint256 MAX_MINT_ETHEREUM = 8888;

    uint gasForDestinationLzReceive = 350000;

    bytes32 public _merkleRoot;

    mapping(uint256 => Features) public features;
    mapping (uint256 => string) public svgData;
    mapping (uint256 => string) public svgBackgroundColor;
    mapping (uint256 => uint256) public svgBackgroundColorSelector;
    mapping (uint256 => bool) public finality;
    mapping (string => bool) public taken;
    mapping (address => bool) public whitelistClaimed;


    constructor() ERC721("METAKAYS", "MK") {
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675);

        svgBackgroundColor[0] = '#800000"/>';
        svgBackgroundColor[1] = '#8B0000"/>';
        svgBackgroundColor[2] = '#A52A2A"/>';
        svgBackgroundColor[3] = '#B22222"/>';
        svgBackgroundColor[4] = '#DC143C"/>';
        svgBackgroundColor[5] = '#FF0000"/>';
        svgBackgroundColor[6] = '#FF6347"/>';
        svgBackgroundColor[7] = '#FF7F50"/>';
        svgBackgroundColor[8] = '#CD5C5C"/>';
        svgBackgroundColor[9] = '#F08080"/>';
        svgBackgroundColor[10] = '#E9967A"/>';
        svgBackgroundColor[11] = '#FA8072"/>';
        svgBackgroundColor[12] = '#FFA07A"/>';
        svgBackgroundColor[13] = '#FF4500"/>';
        svgBackgroundColor[14] = '#FF8C00"/>';
        svgBackgroundColor[15] = '#FFA500"/>';
        svgBackgroundColor[16] = '#FFD700"/>';
        svgBackgroundColor[17] = '#B8860B"/>';
        svgBackgroundColor[18] = '#DAA520"/>';
        svgBackgroundColor[19] = '#EEE8AA"/>';
        svgBackgroundColor[20] = '#BDB76B"/>';
        svgBackgroundColor[21] = '#F0E68C"/>';
        svgBackgroundColor[22] = '#808000"/>';
        svgBackgroundColor[23] = '#FFFF00"/>';
        svgBackgroundColor[24] = '#9ACD32"/>';
        svgBackgroundColor[25] = '#556B2F"/>';
        svgBackgroundColor[26] = '#6B8E23"/>';
        svgBackgroundColor[27] = '#7CFC00"/>';
        svgBackgroundColor[28] = '#7FFF00"/>';
        svgBackgroundColor[29] = '#ADFF2F"/>';
        svgBackgroundColor[30] = '#006400"/>';
        svgBackgroundColor[31] = '#008000"/>';
        svgBackgroundColor[32] = '#228B22"/>';
        svgBackgroundColor[33] = '#00FF00"/>';
        svgBackgroundColor[34] = '#32CD32"/>';
        svgBackgroundColor[35] = '#90EE90"/>';
        svgBackgroundColor[36] = '#98FB98"/>';
        svgBackgroundColor[37] = '#8FBC8F"/>';
        svgBackgroundColor[38] = '#00FA9A"/>';
        svgBackgroundColor[39] = '#00FF7F"/>';
        svgBackgroundColor[40] = '#2E8B57"/>';
        svgBackgroundColor[41] = '#66CDAA"/>';
        svgBackgroundColor[42] = '#3CB371"/>';
        svgBackgroundColor[43] = '#20B2AA"/>';
        svgBackgroundColor[44] = '#2F4F4F"/>';
        svgBackgroundColor[45] = '#008080"/>';
        svgBackgroundColor[46] = '#008B8B"/>';
        svgBackgroundColor[47] = '#00FFFF"/>';
        svgBackgroundColor[48] = '#00FFFF"/>';
        svgBackgroundColor[49] = '#E0FFFF"/>';
        svgBackgroundColor[50] = '#00CED1"/>';
        svgBackgroundColor[51] = '#40E0D0"/>';
        svgBackgroundColor[52] = '#48D1CC"/>';
        svgBackgroundColor[53] = '#AFEEEE"/>';
        svgBackgroundColor[54] = '#7FFFD4"/>';
        svgBackgroundColor[55] = '#B0E0E6"/>';
        svgBackgroundColor[56] = '#5F9EA0"/>';
        svgBackgroundColor[57] = '#4682B4"/>';
        svgBackgroundColor[58] = '#6495ED"/>';
        svgBackgroundColor[59] = '#00BFFF"/>';
        svgBackgroundColor[60] = '#1E90FF"/>';
        svgBackgroundColor[61] = '#ADD8E6"/>';
        svgBackgroundColor[62] = '#87CEEB"/>';
        svgBackgroundColor[63] = '#87CEFA"/>';
        svgBackgroundColor[64] = '#191970"/>';
        svgBackgroundColor[65] = '#000080"/>';
        svgBackgroundColor[66] = '#00008B"/>';
        svgBackgroundColor[67] = '#0000CD"/>';
        svgBackgroundColor[68] = '#0000FF"/>';
        svgBackgroundColor[69] = '#4169E1"/>';
        svgBackgroundColor[70] = '#8A2BE2"/>';
        svgBackgroundColor[71] = '#4B0082"/>';
        svgBackgroundColor[72] = '#483D8B"/>';
        svgBackgroundColor[73] = '#6A5ACD"/>';
        svgBackgroundColor[74] = '#7B68EE"/>';
        svgBackgroundColor[75] = '#9370DB"/>';
        svgBackgroundColor[76] = '#8B008B"/>';
        svgBackgroundColor[77] = '#9400D3"/>';
        svgBackgroundColor[78] = '#9932CC"/>';
        svgBackgroundColor[79] = '#BA55D3"/>';
        svgBackgroundColor[80] = '#800080"/>';
        svgBackgroundColor[81] = '#D8BFD8"/>';
        svgBackgroundColor[82] = '#DDA0DD"/>';
        svgBackgroundColor[83] = '#EE82EE"/>';
        svgBackgroundColor[84] = '#FF00FF"/>';
        svgBackgroundColor[85] = '#DA70D6"/>';
        svgBackgroundColor[86] = '#C71585"/>';
        svgBackgroundColor[87] = '#DB7093"/>';
        svgBackgroundColor[88] = '#FF1493"/>';
        svgBackgroundColor[89] = '#FF69B4"/>';
        svgBackgroundColor[90] = '#FFB6C1"/>';
        svgBackgroundColor[91] = '#FFC0CB"/>';
        svgBackgroundColor[92] = '#FAEBD7"/>';
        svgBackgroundColor[93] = '#F5F5DC"/>';
        svgBackgroundColor[94] = '#FFE4C4"/>';
        svgBackgroundColor[95] = '#FFEBCD"/>';
        svgBackgroundColor[96] = '#F5DEB3"/>';
        svgBackgroundColor[97] = '#FFF8DC"/>';
        svgBackgroundColor[98] = '#FFFACD"/>';
        svgBackgroundColor[99] = '#FAFAD2"/>';
        svgBackgroundColor[100] = '#FFFFE0"/>';
        svgBackgroundColor[101] = '#8B4513"/>';
        svgBackgroundColor[102] = '#A0522D"/>';
        svgBackgroundColor[103] = '#D2691E"/>';
        svgBackgroundColor[104] = '#CD853F"/>';
        svgBackgroundColor[105] = '#F4A460"/>';
        svgBackgroundColor[106] = '#DEB887"/>';
        svgBackgroundColor[107] = '#D2B48C"/>';
        svgBackgroundColor[108] = '#BC8F8F"/>';
        svgBackgroundColor[109] = '#FFE4B5"/>';
        svgBackgroundColor[110] = '#FFDEAD"/>';
        svgBackgroundColor[111] = '#FFDAB9"/>';
        svgBackgroundColor[112] = '#FFE4E1"/>';
        svgBackgroundColor[113] = '#FFF0F5"/>';
        svgBackgroundColor[114] = '#FAF0E6"/>';
        svgBackgroundColor[115] = '#FDF5E6"/>';
        svgBackgroundColor[116] = '#FFEFD5"/>';
        svgBackgroundColor[117] = '#FFF5EE"/>';
        svgBackgroundColor[118] = '#F5FFFA"/>';
        svgBackgroundColor[119] = '#708090"/>';
        svgBackgroundColor[120] = '#778899"/>';
        svgBackgroundColor[121] = '#B0C4DE"/>';
        svgBackgroundColor[122] = '#E6E6FA"/>';
        svgBackgroundColor[123] = '#FFFAF0"/>';
        svgBackgroundColor[124] = '#F0F8FF"/>';
        svgBackgroundColor[125] = '#F8F8FF"/>';
        svgBackgroundColor[126] = '#F0FFF0"/>';
        svgBackgroundColor[127] = '#FFFFF0"/>';
        svgBackgroundColor[128] = '#F0FFFF"/>';
        svgBackgroundColor[129] = '#FFFAFA"/>';
        svgBackgroundColor[130] = '#000000"/>';
        svgBackgroundColor[131] = '#696969"/>';
        svgBackgroundColor[132] = '#808080"/>';
        svgBackgroundColor[133] = '#A9A9A9"/>';
        svgBackgroundColor[134] = '#C0C0C0"/>';
        svgBackgroundColor[135] = '#D3D3D3"/>';
        svgBackgroundColor[136] = '#DCDCDC"/>';
        svgBackgroundColor[137] = '#FFFFFF"/>';

        svgData[0] = '<use xlink:href="#cube" x="487" y="540';
        svgData[1] = '<use xlink:href="#cube" x="543" y="568';
        svgData[2] = '<use xlink:href="#cube" x="599" y="596';
        svgData[3] = '<use xlink:href="#cube" x="655" y="624';
        svgData[4] = '<use xlink:href="#cube" x="711" y="652';
        svgData[5] = '<use xlink:href="#cube" x="767" y="680';
        svgData[6] = '<use xlink:href="#cube" x="823" y="708';
        svgData[7] = '<use xlink:href="#cube" x="879" y="736';
        svgData[8] = '<use xlink:href="#cube" x="487" y="468';
        svgData[9] = '<use xlink:href="#cube" x="543" y="496';
        svgData[10] = '<use xlink:href="#cube" x="599" y="524';
        svgData[11] = '<use xlink:href="#cube" x="655" y="552';
        svgData[12] = '<use xlink:href="#cube" x="711" y="580';
        svgData[13] = '<use xlink:href="#cube" x="767" y="608';
        svgData[14] = '<use xlink:href="#cube" x="823" y="636';
        svgData[15] = '<use xlink:href="#cube" x="879" y="664';
        svgData[16] = '<use xlink:href="#cube" x="487" y="396';
        svgData[17] = '<use xlink:href="#cube" x="543" y="424';
        svgData[18] = '<use xlink:href="#cube" x="599" y="452';
        svgData[19] = '<use xlink:href="#cube" x="655" y="480';
        svgData[20] = '<use xlink:href="#cube" x="711" y="508';
        svgData[21] = '<use xlink:href="#cube" x="767" y="536';
        svgData[22] = '<use xlink:href="#cube" x="823" y="564';
        svgData[23] = '<use xlink:href="#cube" x="879" y="592';
        svgData[24] = '<use xlink:href="#cube" x="487" y="324';
        svgData[25] = '<use xlink:href="#cube" x="543" y="352';
        svgData[26] = '<use xlink:href="#cube" x="599" y="380';
        svgData[27] = '<use xlink:href="#cube" x="655" y="408';
        svgData[28] = '<use xlink:href="#cube" x="711" y="436';
        svgData[29] = '<use xlink:href="#cube" x="767" y="464';
        svgData[30] = '<use xlink:href="#cube" x="823" y="492';
        svgData[31] = '<use xlink:href="#cube" x="879" y="520';
        svgData[32] = '<use xlink:href="#cube" x="487" y="252';
        svgData[33] = '<use xlink:href="#cube" x="543" y="280';
        svgData[34] = '<use xlink:href="#cube" x="599" y="308';
        svgData[35] = '<use xlink:href="#cube" x="655" y="336';
        svgData[36] = '<use xlink:href="#cube" x="711" y="364';
        svgData[37] = '<use xlink:href="#cube" x="767" y="392';
        svgData[38] = '<use xlink:href="#cube" x="823" y="420';
        svgData[39] = '<use xlink:href="#cube" x="879" y="448';
        svgData[40] = '<use xlink:href="#cube" x="487" y="180';
        svgData[41] = '<use xlink:href="#cube" x="543" y="208';
        svgData[42] = '<use xlink:href="#cube" x="599" y="236';
        svgData[43] = '<use xlink:href="#cube" x="655" y="264';
        svgData[44] = '<use xlink:href="#cube" x="711" y="292';
        svgData[45] = '<use xlink:href="#cube" x="767" y="320';
        svgData[46] = '<use xlink:href="#cube" x="823" y="348';
        svgData[47] = '<use xlink:href="#cube" x="879" y="376';
        svgData[48] = '<use xlink:href="#cube" x="487" y="108';
        svgData[49] = '<use xlink:href="#cube" x="543" y="136';
        svgData[50] = '<use xlink:href="#cube" x="599" y="164';
        svgData[51] = '<use xlink:href="#cube" x="655" y="192';
        svgData[52] = '<use xlink:href="#cube" x="711" y="220';
        svgData[53] = '<use xlink:href="#cube" x="767" y="248';
        svgData[54] = '<use xlink:href="#cube" x="823" y="276';
        svgData[55] = '<use xlink:href="#cube" x="879" y="304';
        svgData[56] = '<use xlink:href="#cube" x="487" y="36';
        svgData[57] = '<use xlink:href="#cube" x="543" y="64';
        svgData[58] = '<use xlink:href="#cube" x="599" y="92';
        svgData[59] = '<use xlink:href="#cube" x="655" y="120';
        svgData[60] = '<use xlink:href="#cube" x="711" y="148';
        svgData[61] = '<use xlink:href="#cube" x="767" y="176';
        svgData[62] = '<use xlink:href="#cube" x="823" y="204';
        svgData[63] = '<use xlink:href="#cube" x="879" y="232';
        svgData[64] = '<use xlink:href="#cube" x="431" y="568';
        svgData[65] = '<use xlink:href="#cube" x="487" y="596';
        svgData[66] = '<use xlink:href="#cube" x="543" y="624';
        svgData[67] = '<use xlink:href="#cube" x="599" y="652';
        svgData[68] = '<use xlink:href="#cube" x="655" y="680';
        svgData[69] = '<use xlink:href="#cube" x="711" y="708';
        svgData[70] = '<use xlink:href="#cube" x="767" y="736';
        svgData[71] = '<use xlink:href="#cube" x="823" y="764';
        svgData[72] = '<use xlink:href="#cube" x="431" y="496';
        svgData[73] = '<use xlink:href="#cube" x="487" y="524';
        svgData[74] = '<use xlink:href="#cube" x="543" y="552';
        svgData[75] = '<use xlink:href="#cube" x="599" y="580';
        svgData[76] = '<use xlink:href="#cube" x="655" y="608';
        svgData[77] = '<use xlink:href="#cube" x="711" y="636';
        svgData[78] = '<use xlink:href="#cube" x="767" y="664';
        svgData[79] = '<use xlink:href="#cube" x="823" y="692';
        svgData[80] = '<use xlink:href="#cube" x="431" y="424';
        svgData[81] = '<use xlink:href="#cube" x="487" y="452';
        svgData[82] = '<use xlink:href="#cube" x="543" y="480';
        svgData[83] = '<use xlink:href="#cube" x="599" y="508';
        svgData[84] = '<use xlink:href="#cube" x="655" y="536';
        svgData[85] = '<use xlink:href="#cube" x="711" y="564';
        svgData[86] = '<use xlink:href="#cube" x="767" y="592';
        svgData[87] = '<use xlink:href="#cube" x="823" y="620';
        svgData[88] = '<use xlink:href="#cube" x="431" y="352';
        svgData[89] = '<use xlink:href="#cube" x="487" y="380';
        svgData[90] = '<use xlink:href="#cube" x="543" y="408';
        svgData[91] = '<use xlink:href="#cube" x="599" y="436';
        svgData[92] = '<use xlink:href="#cube" x="655" y="464';
        svgData[93] = '<use xlink:href="#cube" x="711" y="492';
        svgData[94] = '<use xlink:href="#cube" x="767" y="520';
        svgData[95] = '<use xlink:href="#cube" x="823" y="548';
        svgData[96] = '<use xlink:href="#cube" x="431" y="280';
        svgData[97] = '<use xlink:href="#cube" x="487" y="308';
        svgData[98] = '<use xlink:href="#cube" x="543" y="336';
        svgData[99] = '<use xlink:href="#cube" x="599" y="364';
        svgData[100] = '<use xlink:href="#cube" x="655" y="392';
        svgData[101] = '<use xlink:href="#cube" x="711" y="420';
        svgData[102] = '<use xlink:href="#cube" x="767" y="448';
        svgData[103] = '<use xlink:href="#cube" x="823" y="476';
    }

    // this is here for illustrative purposes -- you may ignore the onlyOwner isOwner on the functions
    // keeping in for nostalgic/sentimental reasons
    modifier isOwner(){
        require(_owner == msg.sender, "not the owner");
        _;
    }

    function setFeaturesAddress(address addr) external onlyOwner isOwner {
        features1= IFeatures1(addr);
    }

    function setPresaleMerkleRoot(bytes32 root) external onlyOwner isOwner {
        _merkleRoot = root;
    }

    function getFeatures(uint256 _tokenId) public view returns(uint256 , uint256 , uint256[4] memory, uint256[3] memory) {
        return (features[_tokenId].data1, features[_tokenId].data2, features[_tokenId].colors, features[_tokenId].colorSelectors);
    }

    //minting any unclaimed.
    function devMint(uint256 _amount) external onlyOwner isOwner {
        require(nextTokenId + _amount <= MAX_MINT_ETHEREUM, "MAX SUPPLY!");
        for (uint256 i = 0; i < _amount; i++) {
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    function setFinality(uint256 _itemID) public {
        require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "ALREADY IN FINALITY!");

        Features memory feature = features[_itemID];
        bytes memory output = abi.encodePacked(feature.data1, feature.data2, feature.colors[0], feature.colors[1], feature.colors[2], feature.colors[3]);
        require(taken[string(output)] == false, "THIS IS ALREADY TAKEN!");

        finality[_itemID] = true;
        taken[string(output)] = true;
    }

    function whitelistClaim(uint256 _amount, bytes32[] calldata _merkleProof) external payable {
        require(!whitelistClaimed[msg.sender], "ADDRESS HAS ALREADY CLAIMED!");
        require(_amount > 0, "CAN'T BE ZERO!");
        require(nextTokenId + _amount <= MAX_MINT_ETHEREUM, "MAX SUPPLY!");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, _amount));
        require(MerkleProof.verify(_merkleProof, _merkleRoot, leaf),  "INVALID PROOF!");

        whitelistClaimed[msg.sender] = true;
        for (uint256 i = 0; i < _amount; i++) {
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    // this function transfers the nft from your address on the
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint tokenId) public payable {
        require(msg.sender == ownerOf(tokenId), "You must own the token to traverse");
        require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel");
        require(finality[tokenId] == false, "ONLY NON-FINALITY CAN TRAVERSE!");
        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive);

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);

        require(msg.value >= messageFee, "msg.value not enough to cover messageFee. Send gas for message fees");

        endpoint.send{value: msg.value}(
            _chainId,                           // destination chainId
            trustedRemoteLookup[_chainId],      // destination address of nft contract
            payload,                            // abi.encoded()'ed bytes
            payable(msg.sender),                // refund address
            address(0x0),                       // 'zroPaymentAddress' unused for this
            adapterParams                       // txParameters
        );
    }


    // here for donations or accidents
    function withdraw(uint amt) external onlyOwner isOwner {
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "Failed to withdraw Ether");
    }

    function kustomize(uint256 _data1, uint256 _data2, uint256[4] memory _colors, uint256[3] memory _colorSelectors, uint256 _itemID) public {
        require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "ONLY NON-FINALITY CAN KUSTOMIZE!");
        require((_colorSelectors[0] < 138) && (_colorSelectors[1] < 138) && (_colorSelectors[2] < 138), "NO SUCH COLOR!");

        Features storage feature = features[_itemID];
        feature.data1 = _data1;
        feature.data2 = _data2;
        feature.colors = _colors;
        feature.colorSelectors = _colorSelectors;

        emit Kustomized(_itemID);
    }

    function kustomizeBackground(uint256 _data1, uint256 _itemID) public {
        require(msg.sender == ownerOf(_itemID), "YOU ARE NOT THE OWNER!");
        require(finality[_itemID] == false, "ONLY NON-FINALITY CAN KUSTOMIZE!");
        require(_data1 < 138, "NOT AN AVAILABLE COLOR!");
        svgBackgroundColorSelector[_itemID] = _data1;
    }

    function getSVG(uint256 _tokenId) public view returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        Features memory feature = features[_tokenId];

        bytes memory artData = abi.encodePacked(feature.data1, feature.data2);
        bytes memory colorData = abi.encodePacked(feature.colors[0], feature.colors[1]);
        bytes memory colorData2 = abi.encodePacked(feature.colors[2], feature.colors[3]);

        string memory imageURI = string(abi.encodePacked('<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1100.000000pt" height="1100.000000pt" viewBox="0 0 1100.000000 1100.000000" preserveAspectRatio="xMidYMid meet" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <g id="cube" class="cube-unit" transform="scale(0.25,0.25)"> <polygon style="stroke:#000000;" points="480,112 256,0 32,112 32,400 256,512 480,400 "/> <polygon style="stroke:#000000;" points="256,224 32,112 32,400 256,512 480,400 480,112 "/> <polygon style="stroke:#000000;" points="256,224 256,512 480,400 480,112 "/> </g> </defs> <g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M0 5500 l0 -5500 5500 0 5500 0 0 5500 0 5500 -5500 0 -5500 0 0 -5500z" fill="', svgBackgroundColor[svgBackgroundColorSelector[_tokenId]], '</g>', CREATE(artData, colorData, colorData2, feature.colorSelectors[0], feature.colorSelectors[1], feature.colorSelectors[2]),finality[_tokenId] == false ? '<g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#F5F5F5"> <path d="M9720 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z M10440 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z"/></g></svg>' : '<g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#F5F5F5" stroke="none"> <path d="M9720 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z m200 -20 l0 -110 110 0 110 0 0 -90 0 -90 -110 0 -110 0 0 -220 0 -220 -90 0 -90 0 0 220 0 220 -110 0 -110 0 0 90 0 90 110 0 110 0 0 110 0 110 90 0 90 0 0 -110z M9760 850 l0 -110 -110 0 -110 0 0 -70 0 -70 110 0 110 0 0 -220 0 -220 70 0 70 0 0 220 0 220 110 0 110 0 0 70 0 70 -110 0 -110 0 0 110 0 110 -70 0 -70 0 0 -110z m120 -20 l0 -110 110 0 110 0 0 -50 0 -50 -110 0 -110 0 0 -220 0 -220 -50 0 -50 0 0 220 0 220 -110 0 -110 0 0 50 0 50 110 0 110 0 0 110 0 110 50 0 50 0 0 -110z M9800 810 l0 -110 -110 0 -110 0 0 -30 0 -30 110 0 110 0 0 -220 0 -220 30 0 30 0 0 220 0 220 110 0 110 0 0 30 0 30 -110 0 -110 0 0 110 0 110 -30 0 -30 0 0 -110z m40 -20 l0 -110 110 0 c67 0 110 -4 110 -10 0 -6 -43 -10 -110 -10 l-110 0 0 -220 c0 -140 -4 -220 -10 -220 -6 0 -10 80 -10 220 l0 220 -110 0 c-67 0 -110 4 -110 10 0 6 43 10 110 10 l110 0 0 110 c0 67 4 110 10 110 6 0 10 -43 10 -110z M10440 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z m200 -20 l0 -110 110 0 110 0 0 -90 0 -90 -110 0 -110 0 0 -220 0 -220 -90 0 -90 0 0 220 0 220 -110 0 -110 0 0 90 0 90 110 0 110 0 0 110 0 110 90 0 90 0 0 -110z M10480 850 l0 -110 -110 0 -110 0 0 -70 0 -70 110 0 110 0 0 -220 0 -220 70 0 70 0 0 220 0 220 110 0 110 0 0 70 0 70 -110 0 -110 0 0 110 0 110 -70 0 -70 0 0 -110z m120 -20 l0 -110 110 0 110 0 0 -50 0 -50 -110 0 -110 0 0 -220 0 -220 -50 0 -50 0 0 220 0 220 -110 0 -110 0 0 50 0 50 110 0 110 0 0 110 0 110 50 0 50 0 0 -110z M10520 810 l0 -110 -110 0 -110 0 0 -30 0 -30 110 0 110 0 0 -220 0 -220 30 0 30 0 0 220 0 220 110 0 110 0 0 30 0 30 -110 0 -110 0 0 110 0 110 -30 0 -30 0 0 -110z m40 -20 l0 -110 110 0 c67 0 110 -4 110 -10 0 -6 -43 -10 -110 -10 l-110 0 0 -220 c0 -140 -4 -220 -10 -220 -6 0 -10 80 -10 220 l0 220 -110 0 c-67 0 -110 4 -110 10 0 6 43 10 110 10 l110 0 0 110 c0 67 4 110 10 110 6 0 10 -43 10 -110z"/></g></svg>'));

        return imageURI;
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        Features memory feature = features[_tokenId];

        bytes memory artData = abi.encodePacked(feature.data1, feature.data2);
        bytes memory colorData = abi.encodePacked(feature.colors[0], feature.colors[1]);
        bytes memory colorData2 = abi.encodePacked(feature.colors[2], feature.colors[3]);

        string memory imageURI = string(abi.encodePacked("data:image/svg+xml;base64, ", Base64.encode(bytes(string(abi.encodePacked('<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1100.000000pt" height="1100.000000pt" viewBox="0 0 1100.000000 1100.000000" preserveAspectRatio="xMidYMid meet" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <g id="cube" class="cube-unit" transform="scale(0.25,0.25)"> <polygon style="stroke:#000000;" points="480,112 256,0 32,112 32,400 256,512 480,400 "/> <polygon style="stroke:#000000;" points="256,224 32,112 32,400 256,512 480,400 480,112 "/> <polygon style="stroke:#000000;" points="256,224 256,512 480,400 480,112 "/> </g> </defs> <g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none"> <path d="M0 5500 l0 -5500 5500 0 5500 0 0 5500 0 5500 -5500 0 -5500 0 0 -5500z" fill="', svgBackgroundColor[svgBackgroundColorSelector[_tokenId]], '</g>', CREATE(artData, colorData, colorData2, feature.colorSelectors[0], feature.colorSelectors[1], feature.colorSelectors[2]),finality[_tokenId] == false ? '<g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#F5F5F5"> <path d="M9720 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z M10440 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z"/></g></svg>' : '<g transform="translate(0.000000,1100.000000) scale(0.100000,-0.100000)" fill="#F5F5F5" stroke="none"> <path d="M9720 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z m200 -20 l0 -110 110 0 110 0 0 -90 0 -90 -110 0 -110 0 0 -220 0 -220 -90 0 -90 0 0 220 0 220 -110 0 -110 0 0 90 0 90 110 0 110 0 0 110 0 110 90 0 90 0 0 -110z M9760 850 l0 -110 -110 0 -110 0 0 -70 0 -70 110 0 110 0 0 -220 0 -220 70 0 70 0 0 220 0 220 110 0 110 0 0 70 0 70 -110 0 -110 0 0 110 0 110 -70 0 -70 0 0 -110z m120 -20 l0 -110 110 0 110 0 0 -50 0 -50 -110 0 -110 0 0 -220 0 -220 -50 0 -50 0 0 220 0 220 -110 0 -110 0 0 50 0 50 110 0 110 0 0 110 0 110 50 0 50 0 0 -110z M9800 810 l0 -110 -110 0 -110 0 0 -30 0 -30 110 0 110 0 0 -220 0 -220 30 0 30 0 0 220 0 220 110 0 110 0 0 30 0 30 -110 0 -110 0 0 110 0 110 -30 0 -30 0 0 -110z m40 -20 l0 -110 110 0 c67 0 110 -4 110 -10 0 -6 -43 -10 -110 -10 l-110 0 0 -220 c0 -140 -4 -220 -10 -220 -6 0 -10 80 -10 220 l0 220 -110 0 c-67 0 -110 4 -110 10 0 6 43 10 110 10 l110 0 0 110 c0 67 4 110 10 110 6 0 10 -43 10 -110z M10440 890 l0 -110 -110 0 -110 0 0 -110 0 -110 110 0 110 0 0 -220 0 -220 110 0 110 0 0 220 0 220 110 0 110 0 0 110 0 110 -110 0 -110 0 0 110 0 110 -110 0 -110 0 0 -110z m200 -20 l0 -110 110 0 110 0 0 -90 0 -90 -110 0 -110 0 0 -220 0 -220 -90 0 -90 0 0 220 0 220 -110 0 -110 0 0 90 0 90 110 0 110 0 0 110 0 110 90 0 90 0 0 -110z M10480 850 l0 -110 -110 0 -110 0 0 -70 0 -70 110 0 110 0 0 -220 0 -220 70 0 70 0 0 220 0 220 110 0 110 0 0 70 0 70 -110 0 -110 0 0 110 0 110 -70 0 -70 0 0 -110z m120 -20 l0 -110 110 0 110 0 0 -50 0 -50 -110 0 -110 0 0 -220 0 -220 -50 0 -50 0 0 220 0 220 -110 0 -110 0 0 50 0 50 110 0 110 0 0 110 0 110 50 0 50 0 0 -110z M10520 810 l0 -110 -110 0 -110 0 0 -30 0 -30 110 0 110 0 0 -220 0 -220 30 0 30 0 0 220 0 220 110 0 110 0 0 30 0 30 -110 0 -110 0 0 110 0 110 -30 0 -30 0 0 -110z m40 -20 l0 -110 110 0 c67 0 110 -4 110 -10 0 -6 -43 -10 -110 -10 l-110 0 0 -220 c0 -140 -4 -220 -10 -220 -6 0 -10 80 -10 220 l0 220 -110 0 c-67 0 -110 4 -110 10 0 6 43 10 110 10 l110 0 0 110 c0 67 4 110 10 110 6 0 10 -43 10 -110z"/> </g></svg>'))))));
        string memory finality_ = finality[_tokenId] == false ? 'false' : 'true';

        return string(
            abi.encodePacked(
            "data:application/json;base64,",
            Base64.encode(
                bytes(
                abi.encodePacked(
                    '{"name":"',
                    "METAKUBES-", toString(_tokenId),
                    '", "attributes":[{"trait_type" : "Finality", "value" : "', finality_ ,'"}], "image":"',imageURI,'"}'
                )
                )
            )
            )
        );
    }

// had math here but 30M limit had different plans for us
// please ignore any ugliness
function CREATE(bytes memory artData, bytes memory colorData, bytes memory colorData2, uint256 color1, uint256 color2, uint256 color3) internal view returns (string memory) {
    bytes memory kubes = DynamicBuffer.allocate(2**16);
    uint tempCount;

    for (uint i = 0; i < 512; i+=8) {
        uint8 workingByte = uint8(artData[i/8]);
        uint8 colorByte = uint8(colorData[i/8]);
        uint8 colorByte2 = uint8(colorData2[i/8]);

        for (uint256 ii=0; ii < 8; ii++) {
            tempCount = i+ii;
            if ((workingByte >> (7 - ii)) & 1 == 1) {
                if ((colorByte >> (7 - ii)) & 1 == 1) {
                    kubes.appendSafe(abi.encodePacked( tempCount < 104 ? svgData[tempCount] : features1.readMisc(tempCount),'" fill="', svgBackgroundColor[color1]));
                } else {
                    if ((colorByte2 >> (7 - ii)) & 1 == 1) {
                        kubes.appendSafe(abi.encodePacked(tempCount < 104 ? svgData[tempCount] : features1.readMisc(tempCount),'" fill="', svgBackgroundColor[color2]));
                    } else {
                        kubes.appendSafe(abi.encodePacked(tempCount < 104 ? svgData[tempCount] : features1.readMisc(tempCount),'" fill="', svgBackgroundColor[color3]));
                    }
                }

            }
        }
    }
      return string(kubes);
    }

    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint newVal) external onlyOwner isOwner {
        gasForDestinationLzReceive = newVal;
    }

    function toString(uint256 value) internal pure returns (string memory) {
      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);
    }

    // ------------------
    // Internal Functions
    // ------------------

    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal override {
        // decode
        (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint));

        // mint the tokens back into existence on destination chain
        _safeMint(toAddr, tokenId);
    }
}

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":"_itemID","type":"uint256"}],"name":"Kustomized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"features","outputs":[{"internalType":"uint256","name":"data1","type":"uint256"},{"internalType":"uint256","name":"data2","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"finality","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeatures","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[4]","name":"","type":"uint256[4]"},{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSVG","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":[{"internalType":"uint256","name":"_data1","type":"uint256"},{"internalType":"uint256","name":"_data2","type":"uint256"},{"internalType":"uint256[4]","name":"_colors","type":"uint256[4]"},{"internalType":"uint256[3]","name":"_colorSelectors","type":"uint256[3]"},{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"kustomize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_data1","type":"uint256"},{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"kustomizeBackground","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","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":"address","name":"addr","type":"address"}],"name":"setFeaturesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemID","type":"uint256"}],"name":"setFinality","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setPresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgBackgroundColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgBackgroundColorSelector","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgData","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"taken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c556122b8600d5562055730600e553480156200002357600080fd5b50604051806040016040528060088152602001674d4554414b41595360c01b815250604051806040016040528060028152602001614d4b60f01b8152506200007a62000074620056c360201b60201c565b620056c7565b81516200008f90600190602085019062005717565b508051620000a590600290602084019062005717565b5050600b80546001600160a01b03199081163317909155600780549091167366a71dcef29a0ffbdbe3c6a460a3b5bc225cd6751790555060408051808201909152600a815269119c181818181811179f60b11b60208083019182526000805260129052905162000137917f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b9162005717565b5060408051808201909152600a815269119c211818181811179f60b11b6020808301918252600160005260129052905162000194917f71a67924699a20698523213e55fe499d539379d7769cd5567e2c45d583f815a39162005717565b5060408051808201909152600a81526911a09a9920992091179f60b11b60208083019182526002600052601290529051620001f1917f8e1fee8c88a9e04123b21e90cae2727a7715bf522a1e46eb5934ccd05203a6b29162005717565b5060408051808201909152600a81526911a1191919191911179f60b11b602080830191825260036000526012905290516200024e917f0f36ad39aee03e7108cc48f54934702a5f0d4066f10344cebf8198978d86976a9162005717565b5060408051808201909152600a81526911a221989a19a191179f60b11b60208083019182526004600052601290529051620002ab917fb4fcd034df3d20faa1c133b66d862ce92732727d40916b48ffb4020cb00fe0539162005717565b5060408051808201909152600a81526911a3231818181811179f60b11b6020808301918252600560005260129052905162000308917f45429b9195d4ec5c0cf6c69e9c21a4ca0ea773b702c2de5735f85d2631f267469162005717565b5060408051808201909152600a81526911a3231b199a1b91179f60b11b6020808301918252600660005260129052905162000365917f1223f9031f9dca49a7844c397098ce9a4e80513444d0a8bb59820dff564808e49162005717565b5060408051808201909152600a81526911a3231ba31a9811179f60b11b60208083019182526007600052601290529051620003c2917f724fd36bd271795fe7866d4cc83b61084ef704502b00c2e0b28047123b3c1acc9162005717565b5060408051808201909152600a81526911a1a21aa19aa191179f60b11b602080830191825260086000526012905290516200041f917f855d8d6df66418fea944661cfca175a2245b01f09908f1f662c4fa2b3cbf92999162005717565b5060408051808201909152600a81526911a3181c181c1811179f60b11b602080830191825260096000526012905290516200047c917fb9bfc87ab6d50430c17fad3d76aa4e9fce5cb9f8a8035e5ad64505fa1e31bdb99162005717565b5060408051808201909152600a8082526911a29c9c9b1ba091179f60b11b602080840191825260009290925260129091529051620004dc917f4d862627e71449ad0902e42fb445c6fefb557d066705175da90fdc325bd76e4e9162005717565b5060408051808201909152600a81526911a3209c181b9911179f60b11b6020808301918252600b60005260129052905162000539917f2495f4cb142bcb5be5e6e3ea9aaf4f6b4f9ecc9f26c2c53a2c4a12cbcae156ee9162005717565b5060408051808201909152600a81526911a32320981ba091179f60b11b6020808301918252600c60005260129052905162000596917f102203beef086490b6ace526d3f440341863884040816888f0c1d8918d4daa7a9162005717565b5060408051808201909152600a81526911a3231a1a981811179f60b11b6020808301918252600d600052601290529051620005f3917f08002daeba8533611007c300fe5b0f2097c5e194f0f4087c9468255bee0bf7d99162005717565b5060408051808201909152600a81526911a3231c21981811179f60b11b6020808301918252600e60005260129052905162000650917f8f34c6b109aecf3bfac1757bacc0152b60fcb822751554c6190a91f3c234a2789162005717565b5060408051808201909152600a81526911a323209a981811179f60b11b6020808301918252600f600052601290529051620006ad917f12864ea1602358025af3b40bb8d939272d37cf8b937fccc858336e2eaa450d809162005717565b5060408051808201909152600a81526911a323221b981811179f60b11b602080830191825260106000526012905290516200070a917f47cca4e5cf2ef3d1cf48e381e7c50f235175233c59e08319e054e746d4722a989162005717565b5060408051808201909152600a81526911a11c1c1b182111179f60b11b6020808301918252601160005260129052905162000767917f6b485436b9b234417e59960d9ab1366322cfad1c365f281a05863557ce7f5ce49162005717565b5060408051808201909152600a81526911a220a09a991811179f60b11b60208083019182526012600081905290529051620007c4917f9f06b6a21011ceaf77e412292865f39f3e7ad40a4f4dee40defc38983937e0b79162005717565b5060408051808201909152600a81526911a2a2a29c20a091179f60b11b6020808301918252601360005260129052905162000821917f51bff16c12f072e1c63eaac76d27ed06d041061648bf74844ad006ae6bd44d6e9162005717565b5060408051808201909152600a81526911a122211b9b2111179f60b11b602080830191825260146000526012905290516200087e917f17bb5cf2fc7a6f50cc94c2441aa8b40633d519c366ef1355ea0dd04dd3027f209162005717565b5060408051808201909152600a81526911a318229b1c2191179f60b11b60208083019182526015600052601290529051620008db917fa5769ab4976232a10e433776f09325b00d3bcdda881193f84d5157d906680d179162005717565b5060408051808201909152600a815269119c181c18181811179f60b11b6020808301918252601660005260129052905162000938917fc4f8f7f5ee45326dd80cc2262cf4948c0aa62c4ed9b775cbe9662ca3618994d39162005717565b5060408051808201909152600a81526911a3232323181811179f60b11b6020808301918252601760005260129052905162000995917fafbfd0ac8ae8fb905ca0f4c88b8a1707eac98e507a6ea9cfef95c6c8a61605e29162005717565b5060408051808201909152600a815269119ca0a1a2199911179f60b11b60208083019182526018600052601290529051620009f2917fa33a2de9f35e8e968dcae4e0cc19fddc2553dfbee26765fe58185d6a64f8671f9162005717565b5060408051808201909152600a815269119a9a9b21192311179f60b11b6020808301918252601960005260129052905162000a4f917f799a11cccb7c7d688c679c3a3d7f03e6af337f5bda872b434ee1b298e35f586b9162005717565b5060408051808201909152600a815269119b211c22991991179f60b11b6020808301918252601a60005260129052905162000aac917f8d9e86ecc9cfa3b901ca58331d0593350d9cdcce273b033d26089acd5d7d88e59162005717565b5060408051808201909152600a815269119ba1a321981811179f60b11b6020808301918252601b60005260129052905162000b09917ffe245b8a86dfed39e50e140f946f5f90c9b63f021ac305c5c49c6ec6ae1bd9659162005717565b5060408051808201909152600a815269119ba32323181811179f60b11b6020808301918252601c60005260129052905162000b66917f3affdb785d36316c9fef177f91340fd0f5bb90c89bc8295707f713a205d77f459162005717565b5060408051808201909152600a81526911a0a22323192311179f60b11b6020808301918252601d60005260129052905162000bc3917fb72da517d4eb156f9f42b216ddad816baf88089ca2cb36ef04c955788956d4a19162005717565b5060408051808201909152600a8152691198181b1a181811179f60b11b6020808301918252601e60005260129052905162000c20917f199c10702fca258f95ab9753bf853327fbf122a4162eee7785be8128605a78cf9162005717565b5060408051808201909152600a8152691198181c18181811179f60b11b6020808301918252601f60005260129052905162000c7d917f961118bcd62da87bc22f0cc4bd1b1e975b70e00fd04a08793bfda0486ceac1ff9162005717565b5060408051808201909152600a8152691199191c21191911179f60b11b6020808301918252600081905260129052905162000cda917fa8d458a6980a72f73250fbc8c118acfc7fc38977187b531abf1e3fbf70ce1f059162005717565b5060408051808201909152600a8152691198182323181811179f60b11b6020808301918252602160005260129052905162000d37917f39c1e2f83c04b7a5f78dbd649407d88e8f3b7add5c5ef2a570824616495d1ccf9162005717565b5060408051808201909152600a81526911999921a2199911179f60b11b6020808301918252602260005260129052905162000d94917fb68c6efe9309d69c37dfa4af67479a9c5df214daac0566e0cede6e45a096b4cd9162005717565b5060408051808201909152600a815269119c9822a29c9811179f60b11b6020808301918252602360005260129052905162000df1917f506a6306524c79863166c6c06b84986e9921e6b51a71f1649ad7529b61ee00e29162005717565b5060408051808201909152600a815269119c9c23211c9c11179f60b11b6020808301918252602460005260129052905162000e4e917fdbe3f9ea70dba34eaca51dfd95e30f99a566492c231bb38ba19055a26cf1f5019162005717565b5060408051808201909152600a815269119c2321219c2311179f60b11b6020808301918252602560005260129052905162000eab917fe5a98e0cd18c51d7d40a97599d13240f4bd2bbacd7b9fcdf0fb7ee0ff79157059162005717565b5060408051808201909152600a81526911981823209ca091179f60b11b6020808301918252602660005260129052905162000f08917f30c83640d79aad70669168328b1be70bd0f4b3df0a1cc6fc292a70f0334cfb989162005717565b5060408051808201909152600a81526911981823231ba311179f60b11b6020808301918252602760005260129052905162000f65917f5e663c79306e5f5285719495aca3d01b0e5b9e2467976ce609ca8f4cd94945f09162005717565b5060408051808201909152600a8152691199229c211a9b91179f60b11b6020808301918252602860005260129052905162000fc2917fc38ed7f48d0e69872902a9f32e07d9f5371ed74f6cc8116b562aebe9314fef019162005717565b5060408051808201909152600a815269119b1b21a220a091179f60b11b602080830191825260296000526012905290516200101f917fbe66a88dd6ad117562f6ec4be6921465a7bc7ca2fa965e95103707cbc1e043719162005717565b5060408051808201909152600a8152691199a1a1199b9891179f60b11b6020808301918252602a6000526012905290516200107c917f37999aa733b5c8f47537c148e43b86d45c771a02df322a8328154b45097afd6c9162005717565b5060408051808201909152600a815269119918211920a091179f60b11b6020808301918252602b600052601290529051620010d9917f12ebc326e71680530366b239fe115cd927f8f0d841167273da1604bb835444a69162005717565b5060408051808201909152600a8152691199231a231a2311179f60b11b6020808301918252602c60005260129052905162001136917f58cc871414f652e5ba7f4c4ddaea10b1f093fd976d29c392c0ecc8fcd6ca6fe79162005717565b5060408051808201909152600a8152691198181c181c1811179f60b11b6020808301918252602d60005260129052905162001193917fbddbd5a329a0a78b8507471b4247c2ddc121355a36dd3cdf9b335ab1d2ab69a09162005717565b5060408051808201909152600a8152691198181c211c2111179f60b11b6020808301918252602e600052601290529051620011f0917f71293888fbdfeca92c433b871e071d056ded61090c5356f0ca2a1f0221f5853d9162005717565b5060408051808201909152600a8152691198182323232311179f60b11b6020808301918252602f6000526012905290516200124d917f3583138661b370971bdc3e00051b8a1b1661b2a038150b219308add3cffaf3519162005717565b5060408051808201909152600a8152691198182323232311179f60b11b60208083019182526030600052601290529051620012aa917fbdedd21a6f52dfddc24203cb7b02948caa9f80a636fd62a267a1561f76e726a69162005717565b5060408051808201909152600a81526911a2982323232311179f60b11b6020808301918252603160005260129052905162001307917f9acc3e8630de2a5b0625764ea5ae9be976fa75b454910730b03c7a36b4231bf69162005717565b5060408051808201909152600a81526911981821a2a21891179f60b11b6020808301918252603260005260129052905162001364917f9ae33e557c786052d92d7287419e2369286b7d5286b7ff66e3e29487395254639162005717565b5060408051808201909152600a815269119a182298221811179f60b11b60208083019182526033600052601290529051620013c1917ff4f41c2e15cdd271a98a4b31d9a8357ac2bf25bf1d402acc1c6d429bfbfbf3a39162005717565b5060408051808201909152600a815269119a1c2218a1a191179f60b11b602080830191825260346000526012905290516200141e917f10b83bf55d19ebfae4a1e320aed81048d9d6c5ddedc4e211e966317ea52786cd9162005717565b5060408051808201909152600a81526911a0a322a2a2a291179f60b11b602080830191825260356000526012905290516200147b917fcf8c4efe4bb4412345c4e3a715750adf617224252c0e1246198a13aed5a8bc259162005717565b5060408051808201909152600a815269119ba32323221a11179f60b11b60208083019182526036600052601290529051620014d8917f4270792c5242bb9af31a0ca014789585bac3a2bc36b4e20e1e1163e09d416afc9162005717565b5060408051808201909152600a81526911a1182298229b11179f60b11b6020808301918252603760005260129052905162001535917fea116540bb6c5b7acceccd1764953a76c4fad8a217efbc5957292a6f6549f6bb9162005717565b5060408051808201909152600a815269119aa31ca2a09811179f60b11b6020808301918252603860005260129052905162001592917f52d0aceea21727f3645b59ed2a8e2414ba98aec7326945136bbb6fbd1d1bee809162005717565b5060408051808201909152600a815269119a1b1c19211a11179f60b11b60208083019182526039600052601290529051620015ef917f9f59f72911ca8f47b3e19df7b8d808aa81d8edc8119614c7c316f6c84bb89c8b9162005717565b5060408051808201909152600a815269119b1a1c9aa2a211179f60b11b6020808301918252603a6000526012905290516200164c917f5e6dc1ec65c205e4785800fc7cf7266df7ecc1251284c73df73cc438b1f934989162005717565b5060408051808201909152600a8152691198182123232311179f60b11b6020808301918252603b600052601290529051620016a9917f5fe6cf215b4a13eaa2a7a4f22b2caee36bbae8f63be3ada50ba2209f503bdc769162005717565b5060408051808201909152600a8152691198a29c98232311179f60b11b6020808301918252603c60005260129052905162001706917f1cc964778659cb526f0f4fe148ec03d3f93f444a969aac8d1602a8004b60f6f89162005717565b5060408051808201909152600a81526911a0a2221c229b11179f60b11b6020808301918252603d60005260129052905162001763917f77a856606c58f2afe74bc4d415a981c84b65392fcf7fefc382ded558bb92f4649162005717565b5060408051808201909152600a815269119c1ba1a2a2a111179f60b11b6020808301918252603e600052601290529051620017c0917fe916beb333cde8471a36b6e21a68b3ebdc7e0fe343cee63055523fb231ea11879162005717565b5060408051808201909152600a815269119c1ba1a2a32091179f60b11b6020808301918252603f6000526012905290516200181d917f9717e554f4f1c8f1445175ec6b77439740ea6e0a2d3809501f0e3f3949c19e289162005717565b50604080518082018252600a81526911989c989c9b9811179f60b11b60208083019182526000939093526012909252516200187a917f31c8277a0ccfffea1189152918c4cd07edee7f47b05bce3a4bae62597e6d602e9162005717565b5060408051808201909152600a81526911981818181c1811179f60b11b60208083019182526041600052601290529051620018d7917ff488cbb1c9f248560c55d6af8aff3d1b53d7743aee9b6e9d1423c012423064519162005717565b5060408051808201909152600a81526911981818181c2111179f60b11b6020808301918252604260005260129052905162001934917fa6a9599000f4425e443918d34a69c9234ba73b27460468e6463868ac68d263b89162005717565b5060408051808201909152600a815269119818181821a211179f60b11b6020808301918252604360005260129052905162001991917f5569adf19eac30ccf8587513fc3ca77d3fd01e09ae6c83117a9ed3d3ad8aa3909162005717565b5060408051808201909152600a8152691198181818232311179f60b11b60208083019182526044600052601290529051620019ee917ff0f056b26d892ea957d72c8158c352016ce8622ec4ddcf0d69858198b17581df9162005717565b5060408051808201909152600a815269119a189b1ca29891179f60b11b6020808301918252604560005260129052905162001a4b917f2438ba9a9fcd62a1364c4e295291b48be211763142dce8144a28ac91969f666f9162005717565b5060408051808201909152600a815269119c209921229911179f60b11b6020808301918252604660005260129052905162001aa8917f35f893b72ce0d9e4576e154d39495c618a5a26dd034e3e870883107ad973755f9162005717565b5060408051808201909152600a815269119a2118181c1911179f60b11b6020808301918252604760005260129052905162001b05917fee87dde0514f48bd6bd0b0e3dac21959cd7d59f404342a60877aadf5bf7845e39162005717565b5060408051808201909152600a815269119a1c19a21c2111179f60b11b6020808301918252604860005260129052905162001b62917ff97934ff0faeb4ce7938b49ec2fcc5cf1b0594c4c94fca6267fc1072147b49039162005717565b5060408051808201909152600a815269119b209aa0a1a211179f60b11b6020808301918252604960005260129052905162001bbf917fdcb0f9618f626145e560f7a5e3716c1a9fb14dea082357cc8852dab54fd5109a9162005717565b5060408051808201909152600a815269119ba11b1c22a291179f60b11b6020808301918252604a60005260129052905162001c1c917f76a1239e3e56777a63dd52a96b5da42fe5b867c6b412f2cd2f876825c38e6e109162005717565b5060408051808201909152600a815269119c999b98222111179f60b11b6020808301918252604b60005260129052905162001c79917f9a3dc3e276dfea04f9a05701e8d903ad85f803dc5a45ea0b9c0419775a64c2279162005717565b5060408051808201909152600a815269119c2118181c2111179f60b11b6020808301918252604c60005260129052905162001cd6917fe4907aa622a8f9865c1fbdf546844b201a417e5dc5b47a6ac68894559f84a8259162005717565b5060408051808201909152600a815269119c9a1818221991179f60b11b6020808301918252604d60005260129052905162001d33917f04a179c6e7e580e831560324ed23857f495310711883fbae3881d3a02cf6bbf29162005717565b5060408051808201909152600a815269119c9c999921a191179f60b11b6020808301918252604e60005260129052905162001d90917f696707832afe3ce85e3529e2e32d1b3e488c0dd3481276dbc840363e7b89bc2b9162005717565b5060408051808201909152600a81526911a1209a9aa21991179f60b11b6020808301918252604f60005260129052905162001ded917f6ae090490f9ccb8f8e80dfa26e7495ef6556414c1ddcde4fbf5b7eaacff615299162005717565b5060408051808201909152600a815269119c1818181c1811179f60b11b6020808301918252605060005260129052905162001e4a917f44db61112465246503b617435ee9d25c26f052a70d691688e1f9f27c0ff257249162005717565b5060408051808201909152600a81526911a21c2123221c11179f60b11b6020808301918252605160005260129052905162001ea7917fdc916fc2e5c6d3a4096b0b87c2c5ea7cfc8efbccc4cdbad19a455e91cea60fdd9162005717565b5060408051808201909152600a81526911a2222098222211179f60b11b6020808301918252605260005260129052905162001f04917ffa990a80f7919248d5587649784dda809a199814508b1be53260817afadf3da19162005717565b5060408051808201909152600a81526911a2a29c1922a291179f60b11b6020808301918252605360005260129052905162001f61917f238b51e8b97965f01a3633f9bb1a95e210021b8b0ac265000234cb69fc818c6f9162005717565b5060408051808201909152600a81526911a3231818232311179f60b11b6020808301918252605460005260129052905162001fbe917feefa071071ff8826bf89fb725678fb9dc2515455e9398c36b70145ad32e7bf9a9162005717565b5060408051808201909152600a81526911a2209b98221b11179f60b11b602080830191825260556000526012905290516200201b917f8564426c0af4fdc60566396884d67cf1c048349ae1df1dd7fcd05213bd05d1579162005717565b5060408051808201909152600a81526911a19b989a9c1a91179f60b11b6020808301918252605660005260129052905162002078917f450e9c808ee0544cc9698f87b7ddc3ce6e03d322b579de7b05dabb8c004818389162005717565b5060408051808201909152600a81526911a2211b981c9991179f60b11b60208083019182526057600052601290529051620020d5917f0b702aadbdb0974e26ba0b44050867c189bb70563127cc4294cf97a614b60ee19162005717565b5060408051808201909152600a81526911a323189a1c9991179f60b11b6020808301918252605860005260129052905162002132917fbce7f840a7d126afefd63fe39ba7f072c17f2fadd6a779501b6cdec999b5715a9162005717565b5060408051808201909152600a81526911a3231b1ca11a11179f60b11b602080830191825260596000526012905290516200218f917fb533566164050a7f84947942ad039a781615de8b1a745cb92051a4b7607e7d729162005717565b5060408051808201909152600a81526911a323211b219891179f60b11b6020808301918252605a600052601290529051620021ec917f0e8632040eedb4ab7435cd8040d45c89dc0fc9efd680c91b47d10b122e2804fa9162005717565b5060408051808201909152600a81526911a323219821a111179f60b11b6020808301918252605b60005260129052905162002249917f91dc23975631eaaf2852676d81371cac11afde4bff931cd2f0a86a459ed1166f9162005717565b5060408051808201909152600a81526911a320a2a1221b91179f60b11b6020808301918252605c600052601290529051620022a6917f95b452bea55fc85ff4b712d2e35f2adb4c4e114eba7737e6ef356a39e38be92a9162005717565b5060408051808201909152600a81526911a31aa31aa22191179f60b11b6020808301918252605d60005260129052905162002303917f47def567626933c4fd82ef8e1ebef41d836c4e39bdba66f18c60031a964ae9e39162005717565b5060408051808201909152600a81526911a323229a219a11179f60b11b6020808301918252605e60005260129052905162002360917fd54f1dc0c9f3ce9b94e73520fb55922f5a210994363a4716fc047185ff308a209162005717565b5060408051808201909152600a81526911a32322a121a211179f60b11b6020808301918252605f600052601290529051620023bd917f43e6f855e89265714eab1eb5621488456761a57b4379db4f3e2b52001103d68c9162005717565b5060408051808201909152600a81526911a31aa222a11991179f60b11b602080830191825260606000526012905290516200241a917f41d4b4f97b4d92d90f8c88c412c56b63b7ecf8fd918054bd5b544566d26d1cfd9162005717565b5060408051808201909152600a81526911a323231c222191179f60b11b6020808301918252606160005260129052905162002477917f5972135201e576df1cf34135bbd135193103f24e06bd51689b6210e735b0b1669162005717565b5060408051808201909152600a81526911a3232320a1a211179f60b11b60208083019182526062600052601290529051620024d4917fc2e85667ac1855d0d07d1137649228cab9c80e51ca8c0ae50d82788d4bfbedc39162005717565b5060408051808201909152600a81526911a320a320a21911179f60b11b6020808301918252606360005260129052905162002531917f907aee3c87b885c90bb4405ea9aad979fe7b81637b61079ac98f96ea4e5d83139162005717565b5060408051808201909152600a81526911a3232323229811179f60b11b602080830191825260646000526012905290516200258e917fafdb7d34c0b242fb43217084c074a4c7381ed086dc3b5069e5476d42f69ac1d09162005717565b5060408051808201909152600a815269119c211a1a989991179f60b11b60208083019182526065600052601290529051620025eb917f14f847c80cc70decc79cc04ac569e0754f82a9fdce189c8ac1480a7f7a03cac39162005717565b5060408051808201909152600a81526911a0981a99192211179f60b11b6020808301918252606660005260129052905162002648917fbe4c42bab4eef426ddb1d777cb655476344f6952d1d559dde2ae44a268f954889162005717565b5060408051808201909152600a81526911a2191b1c98a291179f60b11b60208083019182526067600052601290529051620026a5917fe877ecfe9ab67b306ad367781217a3a7a3c9636e279a6ce4291146e2458a675f9162005717565b5060408051808201909152600a81526911a1a21c1a99a311179f60b11b6020808301918252606860005260129052905162002702917fd15187201dad7650e20bbc3eababeabd2bda40ffd8647ad82911dddc902e984b9162005717565b5060408051808201909152600a81526911a31a209a1b1811179f60b11b602080830191825260696000526012905290516200275f917fa10806ae3c36fc88783a27e6f43b7e56ab341a2ae82ee0fd6501ebfc7b3a2f789162005717565b5060408051808201909152600a81526911a222a11c1c1b91179f60b11b6020808301918252606a600052601290529051620027bc917f807566f71fef35efe4088bad83742f017f086b50946c61dde0bfef56b8d2bbc39162005717565b5060408051808201909152600a81526911a219211a1c2191179f60b11b6020808301918252606b60005260129052905162002819917fa4daaada7730ba677e1af1b6ce63e872570989c345fc7889830a861d7edc03f49162005717565b5060408051808201909152600a81526911a1219c231c2311179f60b11b6020808301918252606c60005260129052905162002876917fb2a5c59e9ef73bca01ceced5dda45aa3a9619aeac99129484c969494675460c39162005717565b5060408051808201909152600a81526911a323229a211a91179f60b11b6020808301918252606d600052601290529051620028d3917fc0f4da88ff97f431b563c4191bdb9689eb1a87e263eb2d915c32562d1fcb11639162005717565b5060408051808201909152600a81526911a3232222a0a211179f60b11b6020808301918252606e60005260129052905162002930917fe86835fc10137b06758611a9bd89ad4cf149c58309985138578bc9fdf44d20ac9162005717565b5060408051808201909152600a81526911a3232220a11c91179f60b11b6020808301918252606f6000526012905290516200298d917fcd288f10d02abe3d51448aa0488240f62adc481776b2ce11f706709c1e501d1e9162005717565b5060408051808201909152600a81526911a323229a229891179f60b11b60208083019182526070600052601290529051620029ea917f0bdb8f52afbfe2bb05e25926476f4f0390617c135fb9bf06f1c632effb63dc5c9162005717565b5060408051808201909152600a81526911a3232318231a91179f60b11b6020808301918252607160005260129052905162002a47917f4b6f465c5931eac7d8dce70b21931d5d1a9b39b7f25b53ffef751d68c94a7d329162005717565b5060408051808201909152600a81526911a320a318229b11179f60b11b6020808301918252607260005260129052905162002aa4917f67c828e69bc13b1c7b6a0cb247447cc3c6392c725ba022aab66567a53f4c14169162005717565b5060408051808201909152600a81526911a322231aa29b11179f60b11b6020808301918252607360005260129052905162002b01917ff803dac6fdd10d52fa72cbe2d4e3428bc7e1525869b4621d0c79d47abf7807a59162005717565b5060408051808201909152600a81526911a32322a3221a91179f60b11b6020808301918252607460005260129052905162002b5e917f5b2621e39added8a0b926e0d93e51b6484b7eca6441b90dafcc867f2b616b6809162005717565b5060408051808201909152600a81526911a323231aa2a291179f60b11b6020808301918252607560005260129052905162002bbb917f0eb597a061080b7b4d5bdee0574b432a61bcb54dfa1d8a78875ed46be820d9229162005717565b5060408051808201909152600a81526911a31aa323232091179f60b11b6020808301918252607660005260129052905162002c18917fe0be7ba9cb4a46a2006df6731d50940bfb14196649fa4fc86f78dc5f992047d29162005717565b5060408051808201909152600a815269119b981c181c9811179f60b11b6020808301918252607760005260129052905162002c75917fdc9c2f32767b05ce98c85b287a8179234d08550fa5c1c6967f1733d6cfd044059162005717565b5060408051808201909152600a815269119b9b9c1c1c9c91179f60b11b6020808301918252607860005260129052905162002cd2917fd43bf65cc296265a72286ada1f6592702fb1f53ce0ec526dff3e3696637b205b9162005717565b5060408051808201909152600a81526911a118219a222291179f60b11b6020808301918252607960005260129052905162002d2f917f8f7468947869f96b907a9f16a6eeb767529fe609e5e9ff1c66ba5c97a79317719162005717565b5060408051808201909152600a81526911a29b229b232091179f60b11b6020808301918252607a60005260129052905162002d8c917f8fcd60309ba5e7e476433ed4fb95c5b9d376859a0ffa1fac65cf6e762dd2ed8e9162005717565b5060408051808201909152600a81526911a3232320a31811179f60b11b6020808301918252607b60005260129052905162002de9917feb39b6c57eeb3c4af0a3e9a87430f7deba1ec4326109ddd3b756a8f5dd95e5559162005717565b5060408051808201909152600a81526911a318231c232311179f60b11b6020808301918252607c60005260129052905162002e46917fb5e90ce8a913332356600ff684c761364629c90dd4f08ab2d9bfd76771dd31929162005717565b5060408051808201909152600a81526911a31c231c232311179f60b11b6020808301918252607d60005260129052905162002ea3917f9682450b9157f7da3989fa533fa2ef37acfeba551c730d1b989a56b108acc86e9162005717565b5060408051808201909152600a81526911a3182323231811179f60b11b6020808301918252607e60005260129052905162002f00917f41ba183f36c294cf476c894e01ce10b1b8ef203e91ed8ac7a988ee4fe9e423739162005717565b5060408051808201909152600a81526911a3232323231811179f60b11b6020808301918252607f60005260129052905162002f5d917f55dd03ca521e82b52f35bee112740854534cac2add45adfd36d907d5248064579162005717565b5060408051808201909152600a81526911a3182323232311179f60b11b6020808301918252608060005260129052905162002fba917febc82ce9b5185bd1338b7030398b0c5b0dea9fe4ab4ac3e01f6f73ff1e3b48f59162005717565b5060408051808201909152600a81526911a3232320a32091179f60b11b6020808301918252608160005260129052905162003017917f6eb778a66bf3529a65a397cc4eed945b25774612deac2beb07359afcabccff729162005717565b5060408051808201909152600a8152691198181818181811179f60b11b6020808301918252608260005260129052905162003074917f653f016bf024a0affef3c25f314f3d670aff73e3d4881280b8e443d0bd7fd7e09162005717565b5060408051808201909152600a815269119b1c9b1c9b1c91179f60b11b60208083019182526083600052601290529051620030d1917f16e786f71bb40c4b0a0d1411b4ffe355a08965685839f62996932aa64fc9aea89162005717565b5060408051808201909152600a815269119c181c181c1811179f60b11b602080830191825260846000526012905290516200312e917f14c665dc2d4c19f0b56da061592d0ce109bc2fc788b0414336d589fd74d65ac89162005717565b5060408051808201909152600a81526911a09ca09ca09c91179f60b11b602080830191825260856000526012905290516200318b917fbde72b448adb3d9ce6c2e2b102edab69cb7917959016d1c2c5fd4cd3248968fd9162005717565b5060408051808201909152600a81526911a1982198219811179f60b11b60208083019182526086600052601290529051620031e8917f8931a10b3624efacba5c72481b5c2cefc66c96ec87d1cde107b23d731202dd7f9162005717565b5060408051808201909152600a81526911a219a219a21991179f60b11b6020808301918252608760005260129052905162003245917f7a8742235981090d562caf592a08c90edfef734071eda947867c2a763d961d679162005717565b5060408051808201909152600a81526911a221a221a22191179f60b11b60208083019182526088600052601290529051620032a2917f6271225e77d2d78fdf484d30beeb53aa59aef10996d478644599f93578e5e98e9162005717565b5060408051808201909152600a81526911a3232323232311179f60b11b60208083019182526089600052601290529051620032ff917fd90da99a9b3ea6f59ac5ebeb5be055b7b563db0ca5dcca6e28e8544eb912fa1d9162005717565b506040518060600160405280602681526020016200bc4d602691396000805260116020908152815162003356927f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b792019062005717565b506040518060600160405280602681526020016200bb69602691396001600052601160209081528151620033ae927f17bc176d2408558f6e4111feebc3cab4e16b63e967be91cde721f4c8a488b55292019062005717565b506040518060600160405280602681526020016200bb1d60269139600260005260116020908152815162003406927f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c62892019062005717565b506040518060600160405280602681526020016200b8bd6026913960036000526011602090815281516200345e927f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff92019062005717565b506040518060600160405280602681526020016200b6cf602691396004600052601160209081528151620034b6927f251164fe1d8864fe5e86082eae9c288bc2b58695a4d28538dfe86e9e4f17558592019062005717565b506040518060600160405280602681526020016200bc996026913960056000526011602090815281516200350e927fc550213cee30afd5e67ccba7be3d381bbc169034ae08eb3ec9168caca9fe55e792019062005717565b506040518060600160405280602681526020016200bf6a60269139600660005260116020908152815162003566927ffb9ce45064c7e7d9bf9deb4750ba7c94ab3d6e7418c5d76bf69966d39a9d42f692019062005717565b506040518060600160405280602681526020016200c4c0602691396007600052601160209081528151620035be927f98ae0176de2844d118e1a6decfe92f97691bedbc578c71fc8d5c4374be77e50c92019062005717565b506040518060600160405280602681526020016200b63760269139600860005260116020908152815162003616927f5fae251ae169e8e40026ce4ce85a026bc3adcccdc8459be361195e4cd924077f92019062005717565b506040518060600160405280602681526020016200b5eb6026913960096000526011602090815281516200366e927ff53d7d0eac8d4a28c5e36c803b226f3ef35ce8ff0302108a97c0d862a51c6fa392019062005717565b506040518060600160405280602681526020016200b74160269139600a600052601160209081528151620036c6927f28819bbfa35988de500160af3ee4d060ea4da2d0fc4b680f9032b1bba4c6604b92019062005717565b506040518060600160405280602681526020016200bd3160269139600b6000526011602090815281516200371e927f3bdb0491b8b8ace383492a38767d086d71197664abd044eb755bb1efb02ae78092019062005717565b506040518060600160405280602681526020016200c2d260269139600c60005260116020908152815162003776927fa0a6eb636d5852c675102f73aac3a9fac8e391317bf5bff4efc2293ccb761e8892019062005717565b506040518060600160405280602681526020016200bd0b60269139600d600052601160209081528151620037ce927f582fca367f6c471655fd3d41d20c5fcde67613e662890aa9266c0beff997f69b92019062005717565b506040518060600160405280602681526020016200c50c60269139600e60005260116020908152815162003826927f444b7a2506d19a52c7e5a55b311f0906890fc87938a8da135c8c88b5462efb3392019062005717565b506040518060600160405280602681526020016200c4e660269139600f6000526011602090815281516200387e927f9a9a6d71e29ddaf2585d4fca14f7e63e706374467f30090d88c305be03023ab292019062005717565b506040518060600160405280602681526020016200bcbf602691396010600052601160209081528151620038d6927f74de6ee29ec064d7422ac246d66454f61b9e14a93dbafed176857c31132fc24292019062005717565b506040518060600160405280602681526020016200bce56026913960116000819052602090815281516200392e927fef75f3597c10141d1dc0cbd4612baf062d7e47257f426e9490860d50701a4c8e92019062005717565b506040518060600160405280602681526020016200bb4360269139601260005260116020908152815162003986927f4f6f17d4c19a0fb4496592de6c1ed38b2e6bf8a401cfc93de804cb1abd2317d992019062005717565b506040518060600160405280602681526020016200bf1e602691396013600052601160209081528151620039de927f961c779bd5f9f6183dcb1e452655caeb66a6a52d026763ba1422cc7f93579f6792019062005717565b506040518060600160405280602681526020016200c26060269139601460005260116020908152815162003a36927fcf943896595fc7bd72418bc495b5a9e8a67d0e3728044be2da2e4caa401073b492019062005717565b506040518060600160405280602681526020016200bd7d60269139601560005260116020908152815162003a8e927f9aa99d028b5897b788d87c1b6aff3d3665942a71ae2dcbd32e68e03fddf5d2cd92019062005717565b506040518060600160405280602681526020016200c49a60269139601660005260116020908152815162003ae6927f89f8ac8170d4044b1aaea2ba4302c26bd84c50d2fee910e452dce2e9e6f26e1992019062005717565b506040518060600160405280602681526020016200b95560269139601760005260116020908152815162003b3e927f334b2826a0a650caf13f0e18ec30bca04a7853d23bb513168672b4b45a30dbeb92019062005717565b506040518060600160405280602681526020016200c1ef60269139601860005260116020908152815162003b96927f0e049c8de303710764c13db8816d29010a21aaad28969325532c5e0a9d8ed72292019062005717565b506040518060600160405280602681526020016200c47460269139601960005260116020908152815162003bee927fbd257726630d6fa81014c2a632bd8ba73882fff9da9629e2e56f50f9e7161fcf92019062005717565b506040518060600160405280602681526020016200b6f560269139601a60005260116020908152815162003c46927ff58fef168d338aa9f8788fe3a6f74b7ca6dfa3f8d980b41259bce75b0540f39b92019062005717565b506040518060600160405280602681526020016200b82560269139601b60005260116020908152815162003c9e927fb1f7d7ef4b04e494ab43e0f907c8768fa115e2872ffb403a4b6be42bd4b53a1092019062005717565b506040518060600160405280602681526020016200c3dc60269139601c60005260116020908152815162003cf6927fd6b1603bcf6a04ad3417ce130ef10083c8417e3c388e944cef542045e7b46f0b92019062005717565b506040518060600160405280602681526020016200bed260269139601d60005260116020908152815162003d4e927faf79506b8ea779e423fbad03068cad47ac7b16c4f9d249cdfdf5d0864b3e068c92019062005717565b506040518060600160405280602681526020016200baf760269139601e60005260116020908152815162003da6927fc9bdb7e67178acd8e1feb8317e51cc78f85416b493076e06e28019e01579b8ef92019062005717565b506040518060600160405280602681526020016200bfb660269139601f60005260116020908152815162003dfe927fa6fd41230baee9876b62de64f82aaa5eb16170cda6777193b59ecc5e9d7700bc92019062005717565b506040518060600160405280602681526020016200c286602691396020600081905260118152815162003e55927ff26018484a0a768381af85a7f5f0d4420ca099401ffce15ff68d8cd16975d6d292019062005717565b506040518060600160405280602681526020016200bc0160269139602160005260116020908152815162003ead927f58cc685907b22b2dd9a3048603ce6b9f1feede320775df94fdccbb928308a32a92019062005717565b506040518060600160405280602681526020016200beac60269139602260005260116020908152815162003f05927f3323fcc7213753ad805fc4cdea6f75585df167005983d49f0ff0cff60c95533392019062005717565b506040518060600160405280602681526020016200bbdb60269139602360005260116020908152815162003f5d927f33f30c279cc012e3f13887111304c84977afdf57ee161121826972e49fe8520e92019062005717565b506040518060600160405280602681526020016200bdee60269139602460005260116020908152815162003fb5927f8f86849a44eb0edb0bb8a47fde6e217f9ce37f40263d65baf0b55750dab358da92019062005717565b506040518060600160405280602681526020016200b71b6026913960256000526011602090815281516200400d927f95757451bf2c830ea5bb8396fdbdb9527a9c0ff577ce15a506866f136c608b9b92019062005717565b506040518060600160405280602681526020016200be1460269139602660005260116020908152815162004065927f99707158a48b6637454ab9fdc6f2af8deb0285206e4ba7740d1f27e5ff8fbacc92019062005717565b506040518060600160405280602681526020016200b897602691396027600052601160209081528151620040bd927fc6ebf281a102440b6fbbcb34d802d52ff85bdc0dac52778fd27000a4f55b1a8892019062005717565b506040518060600160405280602681526020016200b92f60269139602860005260116020908152815162004115927f9c75148232dc2d1c2154b2f99361eacdfd0b03627eb8cda0e22ad882545383f092019062005717565b506040518060600160405280602681526020016200c0276026913960296000526011602090815281516200416d927fb21b14714844ddeca6f5862688a6155d500f6960627ede48c9dfb368f5ea502792019062005717565b506040518060600160405280602681526020016200b84b60269139602a600052601160209081528151620041c5927f3197f84bc18dc2010f7be117ae5c38b468b7a78b96ed129304d1d8eaec5a67e492019062005717565b506040518060600160405280602681526020016200c0bf60269139602b6000526011602090815281516200421c927e4a8df52e127081a93bc67175ecbbc1cdae5d5b02d5f70e76418c83b980525d92019062005717565b506040518060600160405280602681526020016200c21560269139602c60005260116020908152815162004274927f0561e9baf6bcdb45512c3ce097fac0f7ba6f23d729568e1d6367c6a08ba9836592019062005717565b506040518060600160405280602681526020016200ba8560269139602d600052601160209081528151620042cc927f633ec6dfc8e260434aa9ce2f014766c5f2952261aa22067b2099b984233dc28e92019062005717565b506040518060600160405280602681526020016200bef860269139602e60005260116020908152815162004324927f14db151af62e730702acdb1e2cba6c0df9e1fcf2285ebdd5c32cf0aefe96208392019062005717565b506040518060600160405280602681526020016200c17d60269139602f6000526011602090815281516200437c927f5e2ae2a99d92bbd7d0429c28fd658bf15f3075da543cf26e6a0091f51c5a2c4592019062005717565b506040518060600160405280602681526020016200ba39602691396030600052601160209081528151620043d4927fc9522c2fd24e3009801b432b8272622fbe95b743ab7a2b40b370ae10797a753d92019062005717565b506040518060600160405280602681526020016200c1316026913960316000526011602090815281516200442c927fa40dd9d5c0a64c1566f7a87241223e157020ec88a2bffcf324a762cba7df2de192019062005717565b506040518060600160405280602681526020016200b97b60269139603260005260116020908152815162004484927f64aad4181f7f304b1692f071f194639366603ec45f5521a69d0bc5b611ad289592019062005717565b506040518060600160405280602681526020016200b65d602691396033600052601160209081528151620044dc927fdb67cb0ad3f11b3cf9f5cc7c1ce3cab83700b802c847aaecf0d5a61b0469df3292019062005717565b506040518060600160405280602681526020016200c31e60269139603460005260116020908152815162004534927f39b19186d9debfe22b7c3b5f9beb739f074784c9c851c7c9a8e880498627b66b92019062005717565b506040518060600160405280602681526020016200c0e56026913960356000526011602090815281516200458c927f84cafb19ece1738625a1bea48f6ec3a32cba71c64967d79ef9c60ad7f545f1b592019062005717565b506040518060600160405280602681526020016200b7b3602691396036600052601160209081528151620045e4927f362b3a9dba59890198282517f87890180a32b37aa0b548f546ad8e22d37a400492019062005717565b506040518060600160405280602681526020016200bf446026913960376000526011602090815281516200463c927f04d52187bcb85aaa22884341e10b1a79325986c688181ee1f237267576b7f05892019062005717565b506040518060600160405280602581526020016200bdc960259139603860005260116020908152815162004694927f1f26d49c3f1b7407271cc57a1e48eea55d4210835daae98381c854f9ba0ab06a92019062005717565b506040518060600160405280602581526020016200c23b602591396039600052601160209081528151620046ec927f4fc24193f2bc23bd42d2f0bbc6504ed791dfceb54cdde26bfcbd3b9055db6a3292019062005717565b506040518060600160405280602581526020016200c00260259139603a60005260116020908152815162004744927f6ca7d2c423cc044c25b1b992932b04654a6e98f53f12b9c7622b53bae1526d1b92019062005717565b506040518060600160405280602681526020016200be6060269139603b6000526011602090815281516200479c927f4a530b9ab7993ddf4dd7d95402d6eb84820d2ce2c79b8615236e3670d5b4505792019062005717565b506040518060600160405280602681526020016200ba5f60269139603c600052601160209081528151620047f4927f3da98cfc6a03b6ed3393a36de5d05f45d189ad6ab4c3d7fa091e80154c82bf4692019062005717565b506040518060600160405280602681526020016200b9a160269139603d6000526011602090815281516200484c927f47b44a084c4a506e171382fd9bf35143f27eafc2230a656438cfb0bba0b6370c92019062005717565b506040518060600160405280602681526020016200be8660269139603e600052601160209081528151620048a4927f4659be135b7295a1ca76c127a563526c4d3eab407e7f2d286db9d307ba0fdeaf92019062005717565b506040518060600160405280602681526020016200baab60269139603f600052601160209081528151620048fc927f4aaf4ab46251269c8489c4ab1604df1d1e5562cce6f800925992636d7e02de9f92019062005717565b506040518060600160405280602681526020016200c07360269139604060005260116020908152815162004954927f80a113b96583c0c2a39bc29dbf5fc1b16c27434ea4fefff91eb49a151366c4f492019062005717565b506040518060600160405280602681526020016200c428602691396041600052601160209081528151620049ac927fb2e8de1eb07d4dae80cabba8953976849ca68569dde5f58522ed6bfeaf71aeeb92019062005717565b506040518060600160405280602681526020016200b90960269139604260005260116020908152815162004a04927f5627d806f4531de2deb1ab4a0fdc16d1ed841428cf9eb42dba90597504d1684c92019062005717565b506040518060600160405280602681526020016200bc2760269139604360005260116020908152815162004a5c927fdb25ab01be6c14388e626128a7495bf8f5ed2329564d691adf83ec898dfeada292019062005717565b506040518060600160405280602681526020016200bbb560269139604460005260116020908152815162004ab4927fe0a01983a3537ff16719920a76dfd3f4fb19879ca05ca5e570f8f68fcc30a5b892019062005717565b506040518060600160405280602681526020016200bf9060269139604560005260116020908152815162004b0c927f15933a82aea9de23cfda88c9343abbdcfbac7cccc68d3c9a5a03b4d2ada06ba892019062005717565b506040518060600160405280602681526020016200bda360269139604660005260116020908152815162004b64927f5b7f6fa27cbdd877c784e5cd6f1e7b2e2ecfccc0fd6ec81e33b8acc96c2c12c992019062005717565b506040518060600160405280602681526020016200b5c560269139604760005260116020908152815162004bbc927f053a04bf9f64a4632803eaccca11b3a8461fe2af9b8f7b362d51866aadece24892019062005717565b506040518060600160405280602681526020016200b8e360269139604860005260116020908152815162004c14927f7ea6ea167064ed1a6dd433a158dcf506639539236dc7744546913c029fc07baa92019062005717565b506040518060600160405280602681526020016200b76760269139604960005260116020908152815162004c6c927f8ee0116d9951c2ff7a2ed45f6d07b5d6c03ea9815caa4dc09b6fea91888d8b9e92019062005717565b506040518060600160405280602681526020016200c44e60269139604a60005260116020908152815162004cc4927f0bf440778c4347ad9948e21492f4032342b92a881c0326a42a19960b0aac0ca492019062005717565b506040518060600160405280602681526020016200c2f860269139604b60005260116020908152815162004d1c927f5d01d1d61e5a16ab62c3d0e86aaa13d6c6401c0dabfca50172a1ecb30bea9e1f92019062005717565b506040518060600160405280602681526020016200c36a60269139604c60005260116020908152815162004d74927f0ca56b74aa128c7c916aebb0720eb9130d851a495ed0e73c34b98a10f53498f692019062005717565b506040518060600160405280602681526020016200ba1360269139604d60005260116020908152815162004dcc927f28e2ae4da2fddf28dc3d462790af63dd81f7ff00fca608c28388ae351955b76592019062005717565b506040518060600160405280602681526020016200c3b660269139604e60005260116020908152815162004e24927f09376120eed8ff25087f1d7e84d4b9128aec16fca0f081401c4686ce37a414eb92019062005717565b506040518060600160405280602681526020016200c1c960269139604f60005260116020908152815162004e7c927f345d559be86b706b8b6d7297497e818865e0dfb9e6c886705f9728a7a006fc6792019062005717565b506040518060600160405280602681526020016200c34460269139605060005260116020908152815162004ed4927fcbc6078916163298736863b87e3f423a96e4d26163d73694f67bded00b9bfe5092019062005717565b506040518060600160405280602681526020016200b7ff60269139605160005260116020908152815162004f2c927f443910a72b540c17087f1afcf54671de280ffeebde08296a1fceaac8e3cf6ed292019062005717565b506040518060600160405280602681526020016200b6a960269139605260005260116020908152815162004f84927f5d5a53a39d0561de084b905763cf7b40085aac6a22d07f3ba0403500a396c61792019062005717565b506040518060600160405280602681526020016200c1a360269139605360005260116020908152815162004fdc927f328b901349e4fdff9eb32a80dbd3f729a2e14abd5e21244d60f22c176b107a0692019062005717565b506040518060600160405280602681526020016200bd5760269139605460005260116020908152815162005034927fdd43c375e087662b741ea76497913235eb3942b793691afa5ff8a848e8fb9f4b92019062005717565b506040518060600160405280602681526020016200c10b6026913960556000526011602090815281516200508c927f22a94757119ee2ed4c05e6cce57e173c3c6017b936eef2242d5994e12131957592019062005717565b506040518060600160405280602681526020016200b683602691396056600052601160209081528151620050e4927f655c307ccfe5a30a8814fc54e415eac3291a89b4fb92bb4b65d4f8d6626391ff92019062005717565b506040518060600160405280602681526020016200b9ed6026913960576000526011602090815281516200513c927f126548a82e2318ca6b4c699586b6a856beeb693f86d382995cf872d915eef94692019062005717565b506040518060600160405280602681526020016200bad160269139605860005260116020908152815162005194927f064499b3b8b8141dc94675c3833d2d14b2999ea2de9a5e394156aa7c1a7e66f792019062005717565b506040518060600160405280602681526020016200c04d602691396059600052601160209081528151620051ec927f39125b326a3df95ff69c9849bb77df35e44a3b5e8750001a9c1fecfb60aab9d592019062005717565b506040518060600160405280602681526020016200c39060269139605a60005260116020908152815162005244927f6190793654b2ff2b60c06e850d9d8dd31e02fbb8c294a5615f98179a2567398d92019062005717565b506040518060600160405280602681526020016200bfdc60269139605b6000526011602090815281516200529c927f240fd2f3bd564d0e2923fe46b3381862362c6d7c1a9a329a64f6c4b508cee88e92019062005717565b506040518060600160405280602681526020016200b87160269139605c600052601160209081528151620052f4927f05b417fa8654c57a142d905366d319ae454b5944e10f5f2d434471f99a03ff1e92019062005717565b506040518060600160405280602681526020016200c2ac60269139605d6000526011602090815281516200534c927f583a55a7878a57a0ed12fbbd266ebbb2962139f3f92aacfba0b506a789a850c092019062005717565b506040518060600160405280602681526020016200b78d60269139605e600052601160209081528151620053a4927f999dbe0d0f11f834771615eef8eecb55c4353d83525c7ce2481c599a5f1fbb5d92019062005717565b506040518060600160405280602681526020016200c40260269139605f600052601160209081528151620053fc927f119a96a16ef4454247166fcb525dace6eda60540e6955473fad6ec49bca672ff92019062005717565b506040518060600160405280602681526020016200be3a60269139606060005260116020908152815162005454927f281eef8635d594c57fffa9f42f6db83f26e90223d302f603ee1fc642739c61d392019062005717565b506040518060600160405280602681526020016200b9c7602691396061600052601160209081528151620054ac927feb0fd7967b63ac14f21b86585e209ae86bbdc08c90331f6d11440d2124d99ffa92019062005717565b506040518060600160405280602681526020016200bb8f60269139606260005260116020908152815162005504927fb271b928e68e4a26d5ee7a0c2a0a4ccf6cd288b4873209bec00000fdd662e94992019062005717565b506040518060600160405280602681526020016200bc736026913960636000526011602090815281516200555c927f20be8aa02041a609abc17bf3634ef8b3ae337c49b1becfcc98e257666421f76692019062005717565b506040518060600160405280602681526020016200c157602691396064600052601160209081528151620055b4927fb71523a03d92faf1035143214e936b8d4e982070aa2f03b2dcb93800dfe59bb092019062005717565b506040518060600160405280602681526020016200c0996026913960656000526011602090815281516200560c927f8ec6142056b2f9aa7ec04e2afaeb673721b02d3ae1d6a5407e5ac2e6058f006e92019062005717565b506040518060600160405280602681526020016200b7d960269139606660005260116020908152815162005664927f6df641cc1bfe38d351daa4084d91aa5b502d1ef6659eb3b2780dd8b7009647a292019062005717565b506040518060600160405280602681526020016200b611602691396067600052601160209081528151620056bc927ff0c579a5e4f4e4bc32d02f5d89987fbedf9a3382eb12041cc305cf99b4c1104992019062005717565b50620057fa565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200572590620057bd565b90600052602060002090601f01602090048101928262005749576000855562005794565b82601f106200576457805160ff191683800117855562005794565b8280016001018555821562005794579182015b828111156200579457825182559160200191906001019062005777565b50620057a2929150620057a6565b5090565b5b80821115620057a25760008155600101620057a7565b600181811c90821680620057d257607f821691505b60208210811415620057f457634e487b7160e01b600052602260045260246000fd5b50919050565b615dbb806200580a6000396000f3fe60806040526004361061025b5760003560e01c806377ce5f6911610144578063bf5cb29a116100b6578063d70eee5a1161007a578063d70eee5a146107aa578063db4bec44146107bd578063e985e9c5146107ed578063ea099f4614610836578063eb8d72b714610856578063f2fde38b1461087657600080fd5b8063bf5cb29a14610724578063bf5de29914610744578063c87b56dd14610764578063cf89fa0314610784578063d1deba1f1461079757600080fd5b806395d89b411161010857806395d89b411461066f578063a22cb46514610684578063b2bdfa7b146106a4578063b3923ece146106c4578063b88d4fde146106e4578063be985ac91461070457600080fd5b806377ce5f69146105625780638da5cb5b146105925780638ede6f9f146105b05780638ee74912146105f9578063943fb8721461064f57600080fd5b80632fc37ab2116101dd5780636352211e116101a15780636352211e1461049d57806369cd7056146104bd57806370a08231146104dd578063715018a6146104fd57806374542f6f146105125780637533d7881461054257600080fd5b80632fc37ab2146103d1578063375a069a146103f55780633779bfde1461041557806342842e0e1461045057806342fc0d1e1461047057600080fd5b80631c37a822116102245780631c37a822146103315780631d792e4d1461035157806323b872dd1461037157806328d7b276146103915780632e1a7d4d146103b157600080fd5b80621d35671461026057806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b314610311575b600080fd5b34801561026c57600080fd5b5061028061027b366004613c0a565b610896565b005b34801561028e57600080fd5b506102a261029d3660046139c4565b610a90565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc610ae2565b6040516102ae9190614483565b3480156102e557600080fd5b506102f96102f43660046139ab565b610b74565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061028061032c36600461397f565b610c09565b34801561033d57600080fd5b5061028061034c366004613c0a565b610d1f565b34801561035d57600080fd5b5061028061036c366004613d62565b610d8e565b34801561037d57600080fd5b5061028061038c3660046138a0565b610efb565b34801561039d57600080fd5b506102806103ac3660046139ab565b610f2c565b3480156103bd57600080fd5b506102806103cc3660046139ab565b610f85565b3480156103dd57600080fd5b506103e7600f5481565b6040519081526020016102ae565b34801561040157600080fd5b506102806104103660046139ab565b611080565b34801561042157600080fd5b506102a26104303660046139fe565b805160208183018101805160158252928201919093012091525460ff1681565b34801561045c57600080fd5b5061028061046b3660046138a0565b61115b565b34801561047c57600080fd5b506103e761048b3660046139ab565b60136020526000908152604090205481565b3480156104a957600080fd5b506102f96104b83660046139ab565b611176565b3480156104c957600080fd5b506102cc6104d83660046139ab565b6111ed565b3480156104e957600080fd5b506103e76104f836600461381c565b611287565b34801561050957600080fd5b5061028061130e565b34801561051e57600080fd5b5061053261052d3660046139ab565b611344565b6040516102ae94939291906147f2565b34801561054e57600080fd5b506102cc61055d366004613abc565b6113e8565b34801561056e57600080fd5b506102a261057d3660046139ab565b60146020526000908152604090205460ff1681565b34801561059e57600080fd5b506000546001600160a01b03166102f9565b3480156105bc57600080fd5b506105e46105cb3660046139ab565b6010602052600090815260409020805460019091015482565b604080519283526020830191909152016102ae565b34801561060557600080fd5b506105e4610614366004613b29565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b34801561065b57600080fd5b5061028061066a3660046139ab565b611401565b34801561067b57600080fd5b506102cc61145a565b34801561069057600080fd5b5061028061069f36600461394c565b611469565b3480156106b057600080fd5b50600b546102f9906001600160a01b031681565b3480156106d057600080fd5b506102806106df36600461381c565b611474565b3480156106f057600080fd5b506102806106ff3660046138e1565b6114ea565b34801561071057600080fd5b506102cc61071f3660046139ab565b61151c565b34801561073057600080fd5b506102cc61073f3660046139ab565b61173a565b34801561075057600080fd5b5061028061075f3660046139ab565b611753565b34801561077057600080fd5b506102cc61077f3660046139ab565b6119bd565b610280610792366004613c82565b611c9e565b6102806107a5366004613b7f565b611fda565b6102806107b8366004613c9e565b612167565b3480156107c957600080fd5b506102a26107d836600461381c565b60166020526000908152604090205460ff1681565b3480156107f957600080fd5b506102a2610808366004613867565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561084257600080fd5b50610280610851366004613d1c565b612362565b34801561086257600080fd5b50610280610871366004613ad7565b61245b565b34801561088257600080fd5b5061028061089136600461381c565b6124a3565b6007546001600160a01b031633146108ad57600080fd5b61ffff8416600090815260096020526040902080546108cb9061496a565b9050835114801561090a575061ffff84166000908152600960205260409081902090516108f89190613edc565b60405180910390208380519060200120145b6109785760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906109a19087908790879087906004016146c9565b600060405180830381600087803b1580156109bb57600080fd5b505af19250505080156109cc575060015b610a8a576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff16815260200190815260200160002084604051610a169190613ec0565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a819086908690869086906146c9565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b1480610ac157506001600160e01b03198216635b5e139f60e01b145b80610adc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610af19061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1d9061496a565b8015610b6a5780601f10610b3f57610100808354040283529160200191610b6a565b820191906000526020600020905b815481529060010190602001808311610b4d57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096f565b506000908152600560205260409020546001600160a01b031690565b6000610c1482611176565b9050806001600160a01b0316836001600160a01b03161415610c825760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096f565b336001600160a01b0382161480610c9e5750610c9e8133610808565b610d105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096f565b610d1a838361253e565b505050565b333014610d825760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161096f565b610a8a848484846125ac565b610d9781611176565b6001600160a01b0316336001600160a01b031614610dc75760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff1615610e265760405162461bcd60e51b815260206004820181905260248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e204b5553544f4d495a4521604482015260640161096f565b8151608a118015610e3b57506020820151608a115b8015610e4b57506040820151608a115b610e885760405162461bcd60e51b815260206004820152600e60248201526d4e4f205355434820434f4c4f522160901b604482015260640161096f565b600081815260106020526040902085815560018101859055610eaf6002820185600461359c565b50610ebf600682018460036135da565b506040518281527f5820ce350c548d23c59482217bea16392feb28eb78e4ffcc4736e0c889a4ae819060200160405180910390a1505050505050565b610f0533826125d9565b610f215760405162461bcd60e51b815260040161096f90614593565b610d1a8383836126d0565b6000546001600160a01b03163314610f565760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b03163314610f805760405162461bcd60e51b815260040161096f90614496565b600f55565b6000546001600160a01b03163314610faf5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b03163314610fd95760405162461bcd60e51b815260040161096f90614496565b600b546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611026576040519150601f19603f3d011682016040523d82523d6000602084013e61102b565b606091505b505090508061107c5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2077697468647261772045746865720000000000000000604482015260640161096f565b5050565b6000546001600160a01b031633146110aa5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146110d45760405162461bcd60e51b815260040161096f90614496565b600d5481600c546110e591906148dc565b11156111215760405162461bcd60e51b815260206004820152600b60248201526a4d415820535550504c592160a81b604482015260640161096f565b60005b8181101561107c5761114933600c6000815461113f906149a5565b9182905550612870565b80611153816149a5565b915050611124565b610d1a838383604051806020016040528060008152506114ea565b6000818152600360205260408120546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096f565b601260205260009081526040902080546112069061496a565b80601f01602080910402602001604051908101604052809291908181526020018280546112329061496a565b801561127f5780601f106112545761010080835404028352916020019161127f565b820191906000526020600020905b81548152906001019060200180831161126257829003601f168201915b505050505081565b60006001600160a01b0382166112f25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096f565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146113385760405162461bcd60e51b815260040161096f9061450f565b611342600061288a565b565b60008061134f613607565b611357613625565b600085815260106020526040908190208054600182015483516080810194859052919390926002810192600690910191839060049082845b81548152602001906001019080831161138f57505060408051606081019182905294965085935060039250905082845b8154815260200190600101908083116113bf575050505050905093509350935093509193509193565b600960205260009081526040902080546112069061496a565b6000546001600160a01b0316331461142b5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146114555760405162461bcd60e51b815260040161096f90614496565b600e55565b606060028054610af19061496a565b61107c3383836128da565b6000546001600160a01b0316331461149e5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146114c85760405162461bcd60e51b815260040161096f90614496565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6114f433836125d9565b6115105760405162461bcd60e51b815260040161096f90614593565b610a8a848484846129a9565b6000818152600360205260409020546060906001600160a01b03166115535760405162461bcd60e51b815260040161096f90614544565b60008281526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b81548152602001906001019080831161159857505050918352505060408051606081019182905260209092019190600684019060039082845b8154815260200190600101908083116115d1575050505050815250509050600081600001518260200151604051602001611615929190918252602082015260400190565b60408051601f198184030181528282528482018051805160209182015182870191909152858501528351808603850181526060808701865292518086015190840151608088019190915260a0808801919091528551808803909101815260c0909601855260008a8152601383528581205481526012835294852092880151805192810151949750909594936116b8928892889288929160025b60200201516129dc565b60008981526014602052604090205460ff16156116f057604051806108c001604052806108978152602001614c17610897913961170d565b604051806101e001604052806101bf8152602001614a586101bf91395b60405160200161171f93929190613fff565b60408051601f19818403018152919052979650505050505050565b601160205260009081526040902080546112069061496a565b61175c81611176565b6001600160a01b0316336001600160a01b03161461178c5760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff16156117e25760405162461bcd60e51b8152602060048201526014602482015273414c524541445920494e2046494e414c4954592160601b604482015260640161096f565b60008181526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b81548152602001906001019080831161182757505050918352505060408051606081019182905260209092019190600684019060039082845b81548152602001906001019080831161186057505050505081525050905060008160000151826020015183604001516000600481106118a1576118a1614a00565b60209081029190910151604086810151808401518183015160609283015184519687019890985292850195909552830191909152608082019290925260a081019190915260c081019190915260e00160405160208183030381529060405290506015816040516119119190613ec0565b9081526040519081900360200190205460ff161561196a5760405162461bcd60e51b81526020600482015260166024820152755448495320495320414c52454144592054414b454e2160501b604482015260640161096f565b60008381526014602052604090819020805460ff191660019081179091559051601590611998908490613ec0565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6000818152600360205260409020546060906001600160a01b03166119f45760405162461bcd60e51b815260040161096f90614544565b60008281526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b815481526020019060010190808311611a3957505050918352505060408051606081019182905260209092019190600684019060039082845b815481526020019060010190808311611a72575050505050815250509050600081600001518260200151604051602001611ab6929190918252602082015260400190565b60408051601f198184030181528282528482018051805160209182015182870191909152858501528351808603850181526060808701865292518086015190840151608088019190915260a0808801919091528551808803909101815260c0909601855260008a815260138352858120548152601283529485209288015180519281015194975090959493611bd59392611b5a9289928992899290919060026116ae565b60008a81526014602052604090205460ff1615611b9257604051806108c0016040528061089881526020016154ae6108989139611baf565b604051806101e001604052806101bf8152602001614a586101bf91395b604051602001611bc193929190613fff565b604051602081830303815290604052612f18565b604051602001611be591906143bc565b60408051601f1981840301815291815260008981526014602052908120549192509060ff1615611c3157604051806040016040528060048152602001637472756560e01b815250611c50565b6040518060400160405280600581526020016466616c736560d81b8152505b9050611c72611c5e8961307d565b8284604051602001611bc193929190613f19565b604051602001611c829190614401565b6040516020818303038152906040529650505050505050919050565b611ca781611176565b6001600160a01b0316336001600160a01b031614611d125760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b606482015260840161096f565b61ffff821660009081526009602052604081208054611d309061496a565b905011611d965760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b606482015260840161096f565b60008181526014602052604090205460ff1615611df55760405162461bcd60e51b815260206004820152601f60248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e2054524156455253452100604482015260640161096f565b611dfe8161317a565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611e81908990309089908790899060a601614614565b604080518083038186803b158015611e9857600080fd5b505afa158015611eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed09190613d3e565b50905080341015611f555760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a40161096f565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611fa0928c928b913391908b90600401614712565b6000604051808303818588803b158015611fb957600080fd5b505af1158015611fcd573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600860205260408082209051611ffb908790613ec0565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506120825760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161096f565b8054821480156120ac5750806001015483836040516120a2929190613eb0565b6040518091039020145b6120f85760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161096f565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061212d9089908990899089908990600401614668565b600060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b50505050505050505050565b3360009081526016602052604090205460ff16156121c75760405162461bcd60e51b815260206004820152601c60248201527f414444524553532048415320414c524541445920434c41494d45442100000000604482015260640161096f565b600083116122085760405162461bcd60e51b815260206004820152600e60248201526d43414e2754204245205a45524f2160901b604482015260640161096f565b600d5483600c5461221991906148dc565b11156122555760405162461bcd60e51b815260206004820152600b60248201526a4d415820535550504c592160a81b604482015260640161096f565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506122d683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f549150849050613215565b6123135760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49442050524f4f462160901b604482015260640161096f565b336000908152601660205260408120805460ff191660011790555b8481101561235b5761234933600c6000815461113f906149a5565b80612353816149a5565b91505061232e565b5050505050565b61236b81611176565b6001600160a01b0316336001600160a01b03161461239b5760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff16156123fa5760405162461bcd60e51b815260206004820181905260248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e204b5553544f4d495a4521604482015260640161096f565b608a821061244a5760405162461bcd60e51b815260206004820152601760248201527f4e4f5420414e20415641494c41424c4520434f4c4f5221000000000000000000604482015260640161096f565b600090815260136020526040902055565b6000546001600160a01b031633146124855760405162461bcd60e51b815260040161096f9061450f565b61ffff83166000908152600960205260409020610a8a908383613643565b6000546001600160a01b031633146124cd5760405162461bcd60e51b815260040161096f9061450f565b6001600160a01b0381166125325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096f565b61253b8161288a565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061257382611176565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906125c39190613839565b915091506125d18282612870565b505050505050565b6000818152600360205260408120546001600160a01b03166126525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096f565b600061265d83611176565b9050806001600160a01b0316846001600160a01b031614806126985750836001600160a01b031661268d84610b74565b6001600160a01b0316145b806126c857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126e382611176565b6001600160a01b03161461274b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096f565b6001600160a01b0382166127ad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096f565b6127b860008261253e565b6001600160a01b03831660009081526004602052604081208054600192906127e1908490614927565b90915550506001600160a01b038216600090815260046020526040812080546001929061280f9084906148dc565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61107c8282604051806020016040528060008152506132c4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316141561293c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096f565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129b48484846126d0565b6129c0848484846132f7565b610a8a5760405162461bcd60e51b815260040161096f906144bd565b6040805162010060810190915262010040815260006020909101818152606091805b610200811015612f0a5760008a612a166008846148f4565b81518110612a2657612a26614a00565b016020015160f81c905060008a612a3e6008856148f4565b81518110612a4e57612a4e614a00565b016020015160f81c905060008a612a666008866148f4565b81518110612a7657612a76614a00565b016020015160f81c905060005b6008811015612ef257612a9681866148dc565b9550612aa3816007614927565b600160ff861690911c81161415612ee057612abf816007614927565b600160ff851690911c81161415612c3457612c2f60688710612b6057600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b5b9190810190613a46565b612bf8565b60008781526011602052604090208054612b799061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ba59061496a565b8015612bf25780601f10612bc757610100808354040283529160200191612bf2565b820191906000526020600020905b815481529060010190602001808311612bd557829003601f168201915b50505050505b60008d8152601260209081526040918290209151612c1893929101613ee8565b60408051601f198184030181529190528890613404565b612ee0565b612c3f816007614927565b600160ff841690911c81161415612d9857612c2f60688710612ce057600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612c9f57600080fd5b505afa158015612cb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cdb9190810190613a46565b612d78565b60008781526011602052604090208054612cf99061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d259061496a565b8015612d725780601f10612d4757610100808354040283529160200191612d72565b820191906000526020600020905b815481529060010190602001808311612d5557829003601f168201915b50505050505b60008c8152601260209081526040918290209151612c1893929101613ee8565b612ee060688710612e2857600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612de757600080fd5b505afa158015612dfb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e239190810190613a46565b612ec0565b60008781526011602052604090208054612e419061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6d9061496a565b8015612eba5780601f10612e8f57610100808354040283529160200191612eba565b820191906000526020600020905b815481529060010190602001808311612e9d57829003601f168201915b50505050505b60008b8152601260209081526040918290209151612c1893929101613ee8565b80612eea816149a5565b915050612a83565b50505050600881612f0391906148dc565b90506129fe565b509098975050505050505050565b6060815160001415612f3857505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d466040913990506000600384516002612f6791906148dc565b612f7191906148f4565b612f7c906004614908565b90506000612f8b8260206148dc565b6001600160401b03811115612fa257612fa2614a16565b6040519080825280601f01601f191660200182016040528015612fcc576020820181803683370190505b509050818152600183018586518101602084015b81831015613038576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612fe0565b60038951066001811461305257600281146130635761306f565b613d3d60f01b60011983015261306f565b603d60f81b6000198301525b509398975050505050505050565b6060816130a15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130cb57806130b5816149a5565b91506130c49050600a836148f4565b91506130a5565b6000816001600160401b038111156130e5576130e5614a16565b6040519080825280601f01601f19166020018201604052801561310f576020820181803683370190505b5090505b84156126c857613124600183614927565b9150613131600a866149c0565b61313c9060306148dc565b60f81b81838151811061315157613151614a00565b60200101906001600160f81b031916908160001a905350613173600a866148f4565b9450613113565b600061318582611176565b905061319260008361253e565b6001600160a01b03811660009081526004602052604081208054600192906131bb908490614927565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b85518110156132b957600086828151811061323757613237614a00565b602002602001015190508083116132795760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506132a6565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806132b1816149a5565b91505061321a565b509092149392505050565b6132ce8383613489565b6132db60008484846132f7565b610d1a5760405162461bcd60e51b815260040161096f906144bd565b60006001600160a01b0384163b156133f957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061333b903390899088908890600401614446565b602060405180830381600087803b15801561335557600080fd5b505af1925050508015613385575060408051601f3d908101601f19168201909252613382918101906139e1565b60015b6133df573d8080156133b3576040519150601f19603f3d011682016040523d82523d6000602084013e6133b8565b606091505b5080516133d75760405162461bcd60e51b815260040161096f906144bd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126c8565b506001949350505050565b601f1982015182518251603f1990920191829061342190836148dc565b111561347f5760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b606482015260840161096f565b610a8a8484613566565b6001600160a01b0382166134df5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096f565b6001600160a01b03821660009081526004602052604081208054600192906135089084906148dc565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8051602082019150808201602084510184015b81841015613591578351815260209384019301613579565b505082510190915250565b82600481019282156135ca579160200282015b828111156135ca5782518255916020019190600101906135af565b506135d69291506136b7565b5090565b82600381019282156135ca57916020028201828111156135ca5782518255916020019190600101906135af565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b82805461364f9061496a565b90600052602060002090601f01602090048101928261367157600085556135ca565b82601f1061368a5782800160ff198235161785556135ca565b828001600101855582156135ca579182015b828111156135ca57823582559160200191906001019061369c565b5b808211156135d657600081556001016136b8565b60006136df6136da846148b5565b614885565b90508281528383830111156136f357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261371b57600080fd5b604051606081018181106001600160401b038211171561373d5761373d614a16565b60405280836060810186101561375257600080fd5b60005b6003811015613774578135835260209283019290910190600101613755565b509195945050505050565b60008083601f84011261379157600080fd5b5081356001600160401b038111156137a857600080fd5b6020830191508360208285010111156137c057600080fd5b9250929050565b600082601f8301126137d857600080fd5b6137e7838335602085016136cc565b9392505050565b803561ffff8116811461380057600080fd5b919050565b80356001600160401b038116811461380057600080fd5b60006020828403121561382e57600080fd5b81356137e781614a2c565b6000806040838503121561384c57600080fd5b825161385781614a2c565b6020939093015192949293505050565b6000806040838503121561387a57600080fd5b823561388581614a2c565b9150602083013561389581614a2c565b809150509250929050565b6000806000606084860312156138b557600080fd5b83356138c081614a2c565b925060208401356138d081614a2c565b929592945050506040919091013590565b600080600080608085870312156138f757600080fd5b843561390281614a2c565b9350602085013561391281614a2c565b92506040850135915060608501356001600160401b0381111561393457600080fd5b613940878288016137c7565b91505092959194509250565b6000806040838503121561395f57600080fd5b823561396a81614a2c565b91506020830135801515811461389557600080fd5b6000806040838503121561399257600080fd5b823561399d81614a2c565b946020939093013593505050565b6000602082840312156139bd57600080fd5b5035919050565b6000602082840312156139d657600080fd5b81356137e781614a41565b6000602082840312156139f357600080fd5b81516137e781614a41565b600060208284031215613a1057600080fd5b81356001600160401b03811115613a2657600080fd5b8201601f81018413613a3757600080fd5b6126c8848235602084016136cc565b600060208284031215613a5857600080fd5b81516001600160401b03811115613a6e57600080fd5b8201601f81018413613a7f57600080fd5b8051613a8d6136da826148b5565b818152856020838501011115613aa257600080fd5b613ab382602083016020860161493e565b95945050505050565b600060208284031215613ace57600080fd5b6137e7826137ee565b600080600060408486031215613aec57600080fd5b613af5846137ee565b925060208401356001600160401b03811115613b1057600080fd5b613b1c8682870161377f565b9497909650939450505050565b600080600060608486031215613b3e57600080fd5b613b47846137ee565b925060208401356001600160401b03811115613b6257600080fd5b613b6e868287016137c7565b925050604084013590509250925092565b600080600080600060808688031215613b9757600080fd5b613ba0866137ee565b945060208601356001600160401b0380821115613bbc57600080fd5b613bc889838a016137c7565b9550613bd660408901613805565b94506060880135915080821115613bec57600080fd5b50613bf98882890161377f565b969995985093965092949392505050565b60008060008060808587031215613c2057600080fd5b613c29856137ee565b935060208501356001600160401b0380821115613c4557600080fd5b613c51888389016137c7565b9450613c5f60408801613805565b93506060870135915080821115613c7557600080fd5b50613940878288016137c7565b60008060408385031215613c9557600080fd5b61399d836137ee565b600080600060408486031215613cb357600080fd5b8335925060208401356001600160401b0380821115613cd157600080fd5b818601915086601f830112613ce557600080fd5b813581811115613cf457600080fd5b8760208260051b8501011115613d0957600080fd5b6020830194508093505050509250925092565b60008060408385031215613d2f57600080fd5b50508035926020909101359150565b60008060408385031215613d5157600080fd5b505080516020909101519092909150565b60008060008060006101408688031215613d7b57600080fd5b85359450602080870135945087605f880112613d9657600080fd5b613d9e61485d565b806040890160c08a018b811115613db457600080fd5b60005b6004811015613dd457823585529385019391850191600101613db7565b50829750613de28c8261370a565b999c989b5096996101200135979650505050505050565b60008151808452613e1181602086016020860161493e565b601f01601f19169290920160200192915050565b60008151613e3781856020860161493e565b9290920192915050565b60008154613e4e8161496a565b60018281168015613e665760018114613e7757613ea6565b60ff19841687528287019450613ea6565b8560005260208060002060005b85811015613e9d5781548a820152908401908201613e84565b50505082870194505b5050505092915050565b8183823760009101908152919050565b60008251613ed281846020870161493e565b9190910192915050565b60006137e78284613e41565b60008351613efa81846020880161493e565b6711103334b6361e9160c11b908301908152613ab36008820185613e41565b683d913730b6b2911d1160b91b8152694d4554414b554245532d60b01b60098201528351600090613f5181601385016020890161493e565b7f222c202261747472696275746573223a5b7b2274726169745f7479706522203a6013918401918201527f202246696e616c697479222c202276616c756522203a2022000000000000000060338201528451613fb481604b84016020890161493e565b6d113eae96101134b6b0b3b2911d1160911b604b92909101918201528351613fe381605984016020880161493e565b61227d60f01b60599290910191820152605b0195945050505050565b7f3c7376672076657273696f6e3d22312e302220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f737667222077696474683d2231313060208201527f302e303030303030707422206865696768743d22313130302e3030303030307060408201527f74222076696577426f783d2230203020313130302e303030303030203131303060608201527f2e30303030303022207072657365727665417370656374526174696f3d22784d60808201527f6964594d6964206d6565742220786d6c6e733a786c696e6b3d22687474703a2f60a08201527f2f7777772e77332e6f72672f313939392f786c696e6b223e203c646566733e2060c08201527f3c672069643d22637562652220636c6173733d22637562652d756e697422207460e08201527f72616e73666f726d3d227363616c6528302e32352c302e323529223e203c706f6101008201527f6c79676f6e207374796c653d227374726f6b653a233030303030303b2220706f6101208201527f696e74733d223438302c313132203235362c302033322c3131322033322c34306101408201527f30203235362c353132203438302c34303020222f3e203c706f6c79676f6e20736101608201527f74796c653d227374726f6b653a233030303030303b2220706f696e74733d22326101808201527f35362c3232342033322c3131322033322c343030203235362c353132203438306101a08201527f2c343030203438302c31313220222f3e203c706f6c79676f6e207374796c653d6101c08201527f227374726f6b653a233030303030303b2220706f696e74733d223235362c32326101e08201527f34203235362c353132203438302c343030203438302c31313220222f3e203c2f6102008201527f673e203c2f646566733e203c67207472616e73666f726d3d227472616e736c616102208201527f746528302e3030303030302c313130302e30303030303029207363616c6528306102408201527f2e3130303030302c2d302e31303030303029222066696c6c3d222330303030306102608201527f3022207374726f6b653d226e6f6e65223e203c7061746820643d224d302035356102808201527f3030206c30202d353530302035353030203020353530302030203020353530306102a08201527f20302035353030202d353530302030202d3535303020302030202d353530307a6102c08201526711103334b6361e9160c11b6102e08201526000613ab36143b66143b06143a06102e8860189613e41565b631e17b39f60e11b815260040190565b86613e25565b84613e25565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c2000000000008152600082516143f481601b85016020870161493e565b91909101601b0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161443981601d85016020870161493e565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061447990830184613df9565b9695505050505050565b6020815260006137e76020830184613df9565b6020808252600d908201526c3737ba103a34329037bbb732b960991b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260169082015275594f5520415245204e4f5420544845204f574e45522160501b604082015260600190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061464290830186613df9565b8415156060840152828103608084015261465c8185613df9565b98975050505050505050565b61ffff861681526080602082015260006146856080830187613df9565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006146e66080830186613df9565b6001600160401b038516604084015282810360608401526147078185613df9565b979650505050505050565b61ffff871681526000602060c081840152600088546147308161496a565b8060c087015260e0600180841660008114614752576001811461476757614795565b60ff1985168984015261010089019550614795565b8d6000528660002060005b8581101561478d5781548b8201860152908301908801614772565b8a0184019650505b505050505083810360408501526147ac8189613df9565b9150506147c460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526147e58185613df9565b9998505050505050505050565b8481526020808201859052610120820190604083018560005b60048110156148285781518352918301919083019060010161480b565b50505060c083018460005b600381101561485057815183529183019190830190600101614833565b5050505095945050505050565b604051608081016001600160401b038111828210171561487f5761487f614a16565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148ad576148ad614a16565b604052919050565b60006001600160401b038211156148ce576148ce614a16565b50601f01601f191660200190565b600082198211156148ef576148ef6149d4565b500190565b600082614903576149036149ea565b500490565b6000816000190483118215151615614922576149226149d4565b500290565b600082821015614939576149396149d4565b500390565b60005b83811015614959578181015183820152602001614941565b83811115610a8a5750506000910152565b600181811c9082168061497e57607f821691505b6020821081141561499f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149b9576149b96149d4565b5060010190565b6000826149cf576149cf6149ea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461253b57600080fd5b6001600160e01b03198116811461253b57600080fdfe3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d2223463546354635223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a222f3e3c2f673e3c2f7376673e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222346354635463522207374726f6b653d226e6f6e65223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d3937363020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d3938303020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d313034383020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d313035323020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a222f3e3c2f673e3c2f7376673e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222346354635463522207374726f6b653d226e6f6e65223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d3937363020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d3938303020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d313034383020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d313035323020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a222f3e203c2f673e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205274fd52c11025a890b9757a58215970929076c5192c6f0e06087fce0310f32a64736f6c634300080700333c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223736343c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223439363c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223437363c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223436383c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223139323c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223539323c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223438303c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223635323c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223338303c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223339323c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223532343c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223532343c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223532303c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223237363c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223434383c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223435323c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223430383c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223233363c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223436343c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223434383c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223632343c75736520786c696e6b3a687265663d2223637562652220783d223433312220793d223439363c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223632343c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223138303c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223539323c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223136343c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223137363c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223330383c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223632303c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223633363c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223130383c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223134383c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223332303c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223233323c75736520786c696e6b3a687265663d2223637562652220783d223433312220793d223335323c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223439323c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223539363c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223435323c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223536383c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223333363c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223638303c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223333363c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223238303c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223635323c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223534303c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223336343c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223638303c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223339363c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223432343c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223630383c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223535323c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223533363c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223533363c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223733363c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d2233363c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223336343c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223432303c75736520786c696e6b3a687265663d2223637562652220783d223433312220793d223238303c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223132303c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223230343c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223330383c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223436343c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223334383c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223438303c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223330343c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223730383c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223730383c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223532303c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223433363c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d2239323c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223230383c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223338303c75736520786c696e6b3a687265663d2223637562652220783d223433312220793d223536383c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223432303c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223236343c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223234383c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223536343c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223133363c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223339323c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223337363c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223530383c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223639323c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223332343c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223239323c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d2236343c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223530383c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223235323c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223439323c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223538303c75736520786c696e6b3a687265663d2223637562652220783d223539392220793d223538303c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223232303c75736520786c696e6b3a687265663d2223637562652220783d223433312220793d223432343c75736520786c696e6b3a687265663d2223637562652220783d223635352220793d223630383c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223430383c75736520786c696e6b3a687265663d2223637562652220783d223736372220793d223636343c75736520786c696e6b3a687265663d2223637562652220783d223731312220793d223433363c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223534383c75736520786c696e6b3a687265663d2223637562652220783d223438372220793d223539363c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223535323c75736520786c696e6b3a687265663d2223637562652220783d223534332220793d223335323c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d223536343c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223733363c75736520786c696e6b3a687265663d2223637562652220783d223837392220793d223636343c75736520786c696e6b3a687265663d2223637562652220783d223832332220793d22363336

Deployed Bytecode

0x60806040526004361061025b5760003560e01c806377ce5f6911610144578063bf5cb29a116100b6578063d70eee5a1161007a578063d70eee5a146107aa578063db4bec44146107bd578063e985e9c5146107ed578063ea099f4614610836578063eb8d72b714610856578063f2fde38b1461087657600080fd5b8063bf5cb29a14610724578063bf5de29914610744578063c87b56dd14610764578063cf89fa0314610784578063d1deba1f1461079757600080fd5b806395d89b411161010857806395d89b411461066f578063a22cb46514610684578063b2bdfa7b146106a4578063b3923ece146106c4578063b88d4fde146106e4578063be985ac91461070457600080fd5b806377ce5f69146105625780638da5cb5b146105925780638ede6f9f146105b05780638ee74912146105f9578063943fb8721461064f57600080fd5b80632fc37ab2116101dd5780636352211e116101a15780636352211e1461049d57806369cd7056146104bd57806370a08231146104dd578063715018a6146104fd57806374542f6f146105125780637533d7881461054257600080fd5b80632fc37ab2146103d1578063375a069a146103f55780633779bfde1461041557806342842e0e1461045057806342fc0d1e1461047057600080fd5b80631c37a822116102245780631c37a822146103315780631d792e4d1461035157806323b872dd1461037157806328d7b276146103915780632e1a7d4d146103b157600080fd5b80621d35671461026057806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b314610311575b600080fd5b34801561026c57600080fd5b5061028061027b366004613c0a565b610896565b005b34801561028e57600080fd5b506102a261029d3660046139c4565b610a90565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc610ae2565b6040516102ae9190614483565b3480156102e557600080fd5b506102f96102f43660046139ab565b610b74565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061028061032c36600461397f565b610c09565b34801561033d57600080fd5b5061028061034c366004613c0a565b610d1f565b34801561035d57600080fd5b5061028061036c366004613d62565b610d8e565b34801561037d57600080fd5b5061028061038c3660046138a0565b610efb565b34801561039d57600080fd5b506102806103ac3660046139ab565b610f2c565b3480156103bd57600080fd5b506102806103cc3660046139ab565b610f85565b3480156103dd57600080fd5b506103e7600f5481565b6040519081526020016102ae565b34801561040157600080fd5b506102806104103660046139ab565b611080565b34801561042157600080fd5b506102a26104303660046139fe565b805160208183018101805160158252928201919093012091525460ff1681565b34801561045c57600080fd5b5061028061046b3660046138a0565b61115b565b34801561047c57600080fd5b506103e761048b3660046139ab565b60136020526000908152604090205481565b3480156104a957600080fd5b506102f96104b83660046139ab565b611176565b3480156104c957600080fd5b506102cc6104d83660046139ab565b6111ed565b3480156104e957600080fd5b506103e76104f836600461381c565b611287565b34801561050957600080fd5b5061028061130e565b34801561051e57600080fd5b5061053261052d3660046139ab565b611344565b6040516102ae94939291906147f2565b34801561054e57600080fd5b506102cc61055d366004613abc565b6113e8565b34801561056e57600080fd5b506102a261057d3660046139ab565b60146020526000908152604090205460ff1681565b34801561059e57600080fd5b506000546001600160a01b03166102f9565b3480156105bc57600080fd5b506105e46105cb3660046139ab565b6010602052600090815260409020805460019091015482565b604080519283526020830191909152016102ae565b34801561060557600080fd5b506105e4610614366004613b29565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b34801561065b57600080fd5b5061028061066a3660046139ab565b611401565b34801561067b57600080fd5b506102cc61145a565b34801561069057600080fd5b5061028061069f36600461394c565b611469565b3480156106b057600080fd5b50600b546102f9906001600160a01b031681565b3480156106d057600080fd5b506102806106df36600461381c565b611474565b3480156106f057600080fd5b506102806106ff3660046138e1565b6114ea565b34801561071057600080fd5b506102cc61071f3660046139ab565b61151c565b34801561073057600080fd5b506102cc61073f3660046139ab565b61173a565b34801561075057600080fd5b5061028061075f3660046139ab565b611753565b34801561077057600080fd5b506102cc61077f3660046139ab565b6119bd565b610280610792366004613c82565b611c9e565b6102806107a5366004613b7f565b611fda565b6102806107b8366004613c9e565b612167565b3480156107c957600080fd5b506102a26107d836600461381c565b60166020526000908152604090205460ff1681565b3480156107f957600080fd5b506102a2610808366004613867565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561084257600080fd5b50610280610851366004613d1c565b612362565b34801561086257600080fd5b50610280610871366004613ad7565b61245b565b34801561088257600080fd5b5061028061089136600461381c565b6124a3565b6007546001600160a01b031633146108ad57600080fd5b61ffff8416600090815260096020526040902080546108cb9061496a565b9050835114801561090a575061ffff84166000908152600960205260409081902090516108f89190613edc565b60405180910390208380519060200120145b6109785760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906109a19087908790879087906004016146c9565b600060405180830381600087803b1580156109bb57600080fd5b505af19250505080156109cc575060015b610a8a576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff16815260200190815260200160002084604051610a169190613ec0565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610a819086908690869086906146c9565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b1480610ac157506001600160e01b03198216635b5e139f60e01b145b80610adc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610af19061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1d9061496a565b8015610b6a5780601f10610b3f57610100808354040283529160200191610b6a565b820191906000526020600020905b815481529060010190602001808311610b4d57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bed5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096f565b506000908152600560205260409020546001600160a01b031690565b6000610c1482611176565b9050806001600160a01b0316836001600160a01b03161415610c825760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161096f565b336001600160a01b0382161480610c9e5750610c9e8133610808565b610d105760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161096f565b610d1a838361253e565b505050565b333014610d825760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b606482015260840161096f565b610a8a848484846125ac565b610d9781611176565b6001600160a01b0316336001600160a01b031614610dc75760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff1615610e265760405162461bcd60e51b815260206004820181905260248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e204b5553544f4d495a4521604482015260640161096f565b8151608a118015610e3b57506020820151608a115b8015610e4b57506040820151608a115b610e885760405162461bcd60e51b815260206004820152600e60248201526d4e4f205355434820434f4c4f522160901b604482015260640161096f565b600081815260106020526040902085815560018101859055610eaf6002820185600461359c565b50610ebf600682018460036135da565b506040518281527f5820ce350c548d23c59482217bea16392feb28eb78e4ffcc4736e0c889a4ae819060200160405180910390a1505050505050565b610f0533826125d9565b610f215760405162461bcd60e51b815260040161096f90614593565b610d1a8383836126d0565b6000546001600160a01b03163314610f565760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b03163314610f805760405162461bcd60e51b815260040161096f90614496565b600f55565b6000546001600160a01b03163314610faf5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b03163314610fd95760405162461bcd60e51b815260040161096f90614496565b600b546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611026576040519150601f19603f3d011682016040523d82523d6000602084013e61102b565b606091505b505090508061107c5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2077697468647261772045746865720000000000000000604482015260640161096f565b5050565b6000546001600160a01b031633146110aa5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146110d45760405162461bcd60e51b815260040161096f90614496565b600d5481600c546110e591906148dc565b11156111215760405162461bcd60e51b815260206004820152600b60248201526a4d415820535550504c592160a81b604482015260640161096f565b60005b8181101561107c5761114933600c6000815461113f906149a5565b9182905550612870565b80611153816149a5565b915050611124565b610d1a838383604051806020016040528060008152506114ea565b6000818152600360205260408120546001600160a01b031680610adc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161096f565b601260205260009081526040902080546112069061496a565b80601f01602080910402602001604051908101604052809291908181526020018280546112329061496a565b801561127f5780601f106112545761010080835404028352916020019161127f565b820191906000526020600020905b81548152906001019060200180831161126257829003601f168201915b505050505081565b60006001600160a01b0382166112f25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161096f565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146113385760405162461bcd60e51b815260040161096f9061450f565b611342600061288a565b565b60008061134f613607565b611357613625565b600085815260106020526040908190208054600182015483516080810194859052919390926002810192600690910191839060049082845b81548152602001906001019080831161138f57505060408051606081019182905294965085935060039250905082845b8154815260200190600101908083116113bf575050505050905093509350935093509193509193565b600960205260009081526040902080546112069061496a565b6000546001600160a01b0316331461142b5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146114555760405162461bcd60e51b815260040161096f90614496565b600e55565b606060028054610af19061496a565b61107c3383836128da565b6000546001600160a01b0316331461149e5760405162461bcd60e51b815260040161096f9061450f565b600b546001600160a01b031633146114c85760405162461bcd60e51b815260040161096f90614496565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6114f433836125d9565b6115105760405162461bcd60e51b815260040161096f90614593565b610a8a848484846129a9565b6000818152600360205260409020546060906001600160a01b03166115535760405162461bcd60e51b815260040161096f90614544565b60008281526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b81548152602001906001019080831161159857505050918352505060408051606081019182905260209092019190600684019060039082845b8154815260200190600101908083116115d1575050505050815250509050600081600001518260200151604051602001611615929190918252602082015260400190565b60408051601f198184030181528282528482018051805160209182015182870191909152858501528351808603850181526060808701865292518086015190840151608088019190915260a0808801919091528551808803909101815260c0909601855260008a8152601383528581205481526012835294852092880151805192810151949750909594936116b8928892889288929160025b60200201516129dc565b60008981526014602052604090205460ff16156116f057604051806108c001604052806108978152602001614c17610897913961170d565b604051806101e001604052806101bf8152602001614a586101bf91395b60405160200161171f93929190613fff565b60408051601f19818403018152919052979650505050505050565b601160205260009081526040902080546112069061496a565b61175c81611176565b6001600160a01b0316336001600160a01b03161461178c5760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff16156117e25760405162461bcd60e51b8152602060048201526014602482015273414c524541445920494e2046494e414c4954592160601b604482015260640161096f565b60008181526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b81548152602001906001019080831161182757505050918352505060408051606081019182905260209092019190600684019060039082845b81548152602001906001019080831161186057505050505081525050905060008160000151826020015183604001516000600481106118a1576118a1614a00565b60209081029190910151604086810151808401518183015160609283015184519687019890985292850195909552830191909152608082019290925260a081019190915260c081019190915260e00160405160208183030381529060405290506015816040516119119190613ec0565b9081526040519081900360200190205460ff161561196a5760405162461bcd60e51b81526020600482015260166024820152755448495320495320414c52454144592054414b454e2160501b604482015260640161096f565b60008381526014602052604090819020805460ff191660019081179091559051601590611998908490613ec0565b908152604051908190036020019020805491151560ff19909216919091179055505050565b6000818152600360205260409020546060906001600160a01b03166119f45760405162461bcd60e51b815260040161096f90614544565b60008281526010602090815260408083208151608080820184528254825260018301549482019490945282519384018084529093919284019190600284019060049082845b815481526020019060010190808311611a3957505050918352505060408051606081019182905260209092019190600684019060039082845b815481526020019060010190808311611a72575050505050815250509050600081600001518260200151604051602001611ab6929190918252602082015260400190565b60408051601f198184030181528282528482018051805160209182015182870191909152858501528351808603850181526060808701865292518086015190840151608088019190915260a0808801919091528551808803909101815260c0909601855260008a815260138352858120548152601283529485209288015180519281015194975090959493611bd59392611b5a9289928992899290919060026116ae565b60008a81526014602052604090205460ff1615611b9257604051806108c0016040528061089881526020016154ae6108989139611baf565b604051806101e001604052806101bf8152602001614a586101bf91395b604051602001611bc193929190613fff565b604051602081830303815290604052612f18565b604051602001611be591906143bc565b60408051601f1981840301815291815260008981526014602052908120549192509060ff1615611c3157604051806040016040528060048152602001637472756560e01b815250611c50565b6040518060400160405280600581526020016466616c736560d81b8152505b9050611c72611c5e8961307d565b8284604051602001611bc193929190613f19565b604051602001611c829190614401565b6040516020818303038152906040529650505050505050919050565b611ca781611176565b6001600160a01b0316336001600160a01b031614611d125760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b606482015260840161096f565b61ffff821660009081526009602052604081208054611d309061496a565b905011611d965760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b606482015260840161096f565b60008181526014602052604090205460ff1615611df55760405162461bcd60e51b815260206004820152601f60248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e2054524156455253452100604482015260640161096f565b611dfe8161317a565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611e81908990309089908790899060a601614614565b604080518083038186803b158015611e9857600080fd5b505afa158015611eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed09190613d3e565b50905080341015611f555760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a40161096f565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c5803100923492611fa0928c928b913391908b90600401614712565b6000604051808303818588803b158015611fb957600080fd5b505af1158015611fcd573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600860205260408082209051611ffb908790613ec0565b90815260408051602092819003830190206001600160401b03871660009081529252902060018101549091506120825760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b606482015260840161096f565b8054821480156120ac5750806001015483836040516120a2929190613eb0565b6040518091039020145b6120f85760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000604482015260640161096f565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061212d9089908990899089908990600401614668565b600060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b50505050505050505050565b3360009081526016602052604090205460ff16156121c75760405162461bcd60e51b815260206004820152601c60248201527f414444524553532048415320414c524541445920434c41494d45442100000000604482015260640161096f565b600083116122085760405162461bcd60e51b815260206004820152600e60248201526d43414e2754204245205a45524f2160901b604482015260640161096f565b600d5483600c5461221991906148dc565b11156122555760405162461bcd60e51b815260206004820152600b60248201526a4d415820535550504c592160a81b604482015260640161096f565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526000906054016040516020818303038152906040528051906020012090506122d683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f549150849050613215565b6123135760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49442050524f4f462160901b604482015260640161096f565b336000908152601660205260408120805460ff191660011790555b8481101561235b5761234933600c6000815461113f906149a5565b80612353816149a5565b91505061232e565b5050505050565b61236b81611176565b6001600160a01b0316336001600160a01b03161461239b5760405162461bcd60e51b815260040161096f906145e4565b60008181526014602052604090205460ff16156123fa5760405162461bcd60e51b815260206004820181905260248201527f4f4e4c59204e4f4e2d46494e414c4954592043414e204b5553544f4d495a4521604482015260640161096f565b608a821061244a5760405162461bcd60e51b815260206004820152601760248201527f4e4f5420414e20415641494c41424c4520434f4c4f5221000000000000000000604482015260640161096f565b600090815260136020526040902055565b6000546001600160a01b031633146124855760405162461bcd60e51b815260040161096f9061450f565b61ffff83166000908152600960205260409020610a8a908383613643565b6000546001600160a01b031633146124cd5760405162461bcd60e51b815260040161096f9061450f565b6001600160a01b0381166125325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161096f565b61253b8161288a565b50565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061257382611176565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906125c39190613839565b915091506125d18282612870565b505050505050565b6000818152600360205260408120546001600160a01b03166126525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161096f565b600061265d83611176565b9050806001600160a01b0316846001600160a01b031614806126985750836001600160a01b031661268d84610b74565b6001600160a01b0316145b806126c857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126e382611176565b6001600160a01b03161461274b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161096f565b6001600160a01b0382166127ad5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161096f565b6127b860008261253e565b6001600160a01b03831660009081526004602052604081208054600192906127e1908490614927565b90915550506001600160a01b038216600090815260046020526040812080546001929061280f9084906148dc565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61107c8282604051806020016040528060008152506132c4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316141561293c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161096f565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129b48484846126d0565b6129c0848484846132f7565b610a8a5760405162461bcd60e51b815260040161096f906144bd565b6040805162010060810190915262010040815260006020909101818152606091805b610200811015612f0a5760008a612a166008846148f4565b81518110612a2657612a26614a00565b016020015160f81c905060008a612a3e6008856148f4565b81518110612a4e57612a4e614a00565b016020015160f81c905060008a612a666008866148f4565b81518110612a7657612a76614a00565b016020015160f81c905060005b6008811015612ef257612a9681866148dc565b9550612aa3816007614927565b600160ff861690911c81161415612ee057612abf816007614927565b600160ff851690911c81161415612c3457612c2f60688710612b6057600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b5b9190810190613a46565b612bf8565b60008781526011602052604090208054612b799061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612ba59061496a565b8015612bf25780601f10612bc757610100808354040283529160200191612bf2565b820191906000526020600020905b815481529060010190602001808311612bd557829003601f168201915b50505050505b60008d8152601260209081526040918290209151612c1893929101613ee8565b60408051601f198184030181529190528890613404565b612ee0565b612c3f816007614927565b600160ff841690911c81161415612d9857612c2f60688710612ce057600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612c9f57600080fd5b505afa158015612cb3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cdb9190810190613a46565b612d78565b60008781526011602052604090208054612cf99061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d259061496a565b8015612d725780601f10612d4757610100808354040283529160200191612d72565b820191906000526020600020905b815481529060010190602001808311612d5557829003601f168201915b50505050505b60008c8152601260209081526040918290209151612c1893929101613ee8565b612ee060688710612e2857600a54604051631411ac3160e31b8152600481018990526001600160a01b039091169063a08d61889060240160006040518083038186803b158015612de757600080fd5b505afa158015612dfb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e239190810190613a46565b612ec0565b60008781526011602052604090208054612e419061496a565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6d9061496a565b8015612eba5780601f10612e8f57610100808354040283529160200191612eba565b820191906000526020600020905b815481529060010190602001808311612e9d57829003601f168201915b50505050505b60008b8152601260209081526040918290209151612c1893929101613ee8565b80612eea816149a5565b915050612a83565b50505050600881612f0391906148dc565b90506129fe565b509098975050505050505050565b6060815160001415612f3857505060408051602081019091526000815290565b6000604051806060016040528060408152602001615d466040913990506000600384516002612f6791906148dc565b612f7191906148f4565b612f7c906004614908565b90506000612f8b8260206148dc565b6001600160401b03811115612fa257612fa2614a16565b6040519080825280601f01601f191660200182016040528015612fcc576020820181803683370190505b509050818152600183018586518101602084015b81831015613038576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101612fe0565b60038951066001811461305257600281146130635761306f565b613d3d60f01b60011983015261306f565b603d60f81b6000198301525b509398975050505050505050565b6060816130a15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130cb57806130b5816149a5565b91506130c49050600a836148f4565b91506130a5565b6000816001600160401b038111156130e5576130e5614a16565b6040519080825280601f01601f19166020018201604052801561310f576020820181803683370190505b5090505b84156126c857613124600183614927565b9150613131600a866149c0565b61313c9060306148dc565b60f81b81838151811061315157613151614a00565b60200101906001600160f81b031916908160001a905350613173600a866148f4565b9450613113565b600061318582611176565b905061319260008361253e565b6001600160a01b03811660009081526004602052604081208054600192906131bb908490614927565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b85518110156132b957600086828151811061323757613237614a00565b602002602001015190508083116132795760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506132a6565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806132b1816149a5565b91505061321a565b509092149392505050565b6132ce8383613489565b6132db60008484846132f7565b610d1a5760405162461bcd60e51b815260040161096f906144bd565b60006001600160a01b0384163b156133f957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061333b903390899088908890600401614446565b602060405180830381600087803b15801561335557600080fd5b505af1925050508015613385575060408051601f3d908101601f19168201909252613382918101906139e1565b60015b6133df573d8080156133b3576040519150601f19603f3d011682016040523d82523d6000602084013e6133b8565b606091505b5080516133d75760405162461bcd60e51b815260040161096f906144bd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126c8565b506001949350505050565b601f1982015182518251603f1990920191829061342190836148dc565b111561347f5760405162461bcd60e51b815260206004820152602760248201527f44796e616d69634275666665723a20417070656e64696e67206f7574206f66206044820152663137bab732399760c91b606482015260840161096f565b610a8a8484613566565b6001600160a01b0382166134df5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161096f565b6001600160a01b03821660009081526004602052604081208054600192906135089084906148dc565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8051602082019150808201602084510184015b81841015613591578351815260209384019301613579565b505082510190915250565b82600481019282156135ca579160200282015b828111156135ca5782518255916020019190600101906135af565b506135d69291506136b7565b5090565b82600381019282156135ca57916020028201828111156135ca5782518255916020019190600101906135af565b60405180608001604052806004906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b82805461364f9061496a565b90600052602060002090601f01602090048101928261367157600085556135ca565b82601f1061368a5782800160ff198235161785556135ca565b828001600101855582156135ca579182015b828111156135ca57823582559160200191906001019061369c565b5b808211156135d657600081556001016136b8565b60006136df6136da846148b5565b614885565b90508281528383830111156136f357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261371b57600080fd5b604051606081018181106001600160401b038211171561373d5761373d614a16565b60405280836060810186101561375257600080fd5b60005b6003811015613774578135835260209283019290910190600101613755565b509195945050505050565b60008083601f84011261379157600080fd5b5081356001600160401b038111156137a857600080fd5b6020830191508360208285010111156137c057600080fd5b9250929050565b600082601f8301126137d857600080fd5b6137e7838335602085016136cc565b9392505050565b803561ffff8116811461380057600080fd5b919050565b80356001600160401b038116811461380057600080fd5b60006020828403121561382e57600080fd5b81356137e781614a2c565b6000806040838503121561384c57600080fd5b825161385781614a2c565b6020939093015192949293505050565b6000806040838503121561387a57600080fd5b823561388581614a2c565b9150602083013561389581614a2c565b809150509250929050565b6000806000606084860312156138b557600080fd5b83356138c081614a2c565b925060208401356138d081614a2c565b929592945050506040919091013590565b600080600080608085870312156138f757600080fd5b843561390281614a2c565b9350602085013561391281614a2c565b92506040850135915060608501356001600160401b0381111561393457600080fd5b613940878288016137c7565b91505092959194509250565b6000806040838503121561395f57600080fd5b823561396a81614a2c565b91506020830135801515811461389557600080fd5b6000806040838503121561399257600080fd5b823561399d81614a2c565b946020939093013593505050565b6000602082840312156139bd57600080fd5b5035919050565b6000602082840312156139d657600080fd5b81356137e781614a41565b6000602082840312156139f357600080fd5b81516137e781614a41565b600060208284031215613a1057600080fd5b81356001600160401b03811115613a2657600080fd5b8201601f81018413613a3757600080fd5b6126c8848235602084016136cc565b600060208284031215613a5857600080fd5b81516001600160401b03811115613a6e57600080fd5b8201601f81018413613a7f57600080fd5b8051613a8d6136da826148b5565b818152856020838501011115613aa257600080fd5b613ab382602083016020860161493e565b95945050505050565b600060208284031215613ace57600080fd5b6137e7826137ee565b600080600060408486031215613aec57600080fd5b613af5846137ee565b925060208401356001600160401b03811115613b1057600080fd5b613b1c8682870161377f565b9497909650939450505050565b600080600060608486031215613b3e57600080fd5b613b47846137ee565b925060208401356001600160401b03811115613b6257600080fd5b613b6e868287016137c7565b925050604084013590509250925092565b600080600080600060808688031215613b9757600080fd5b613ba0866137ee565b945060208601356001600160401b0380821115613bbc57600080fd5b613bc889838a016137c7565b9550613bd660408901613805565b94506060880135915080821115613bec57600080fd5b50613bf98882890161377f565b969995985093965092949392505050565b60008060008060808587031215613c2057600080fd5b613c29856137ee565b935060208501356001600160401b0380821115613c4557600080fd5b613c51888389016137c7565b9450613c5f60408801613805565b93506060870135915080821115613c7557600080fd5b50613940878288016137c7565b60008060408385031215613c9557600080fd5b61399d836137ee565b600080600060408486031215613cb357600080fd5b8335925060208401356001600160401b0380821115613cd157600080fd5b818601915086601f830112613ce557600080fd5b813581811115613cf457600080fd5b8760208260051b8501011115613d0957600080fd5b6020830194508093505050509250925092565b60008060408385031215613d2f57600080fd5b50508035926020909101359150565b60008060408385031215613d5157600080fd5b505080516020909101519092909150565b60008060008060006101408688031215613d7b57600080fd5b85359450602080870135945087605f880112613d9657600080fd5b613d9e61485d565b806040890160c08a018b811115613db457600080fd5b60005b6004811015613dd457823585529385019391850191600101613db7565b50829750613de28c8261370a565b999c989b5096996101200135979650505050505050565b60008151808452613e1181602086016020860161493e565b601f01601f19169290920160200192915050565b60008151613e3781856020860161493e565b9290920192915050565b60008154613e4e8161496a565b60018281168015613e665760018114613e7757613ea6565b60ff19841687528287019450613ea6565b8560005260208060002060005b85811015613e9d5781548a820152908401908201613e84565b50505082870194505b5050505092915050565b8183823760009101908152919050565b60008251613ed281846020870161493e565b9190910192915050565b60006137e78284613e41565b60008351613efa81846020880161493e565b6711103334b6361e9160c11b908301908152613ab36008820185613e41565b683d913730b6b2911d1160b91b8152694d4554414b554245532d60b01b60098201528351600090613f5181601385016020890161493e565b7f222c202261747472696275746573223a5b7b2274726169745f7479706522203a6013918401918201527f202246696e616c697479222c202276616c756522203a2022000000000000000060338201528451613fb481604b84016020890161493e565b6d113eae96101134b6b0b3b2911d1160911b604b92909101918201528351613fe381605984016020880161493e565b61227d60f01b60599290910191820152605b0195945050505050565b7f3c7376672076657273696f6e3d22312e302220786d6c6e733d22687474703a2f81527f2f7777772e77332e6f72672f323030302f737667222077696474683d2231313060208201527f302e303030303030707422206865696768743d22313130302e3030303030307060408201527f74222076696577426f783d2230203020313130302e303030303030203131303060608201527f2e30303030303022207072657365727665417370656374526174696f3d22784d60808201527f6964594d6964206d6565742220786d6c6e733a786c696e6b3d22687474703a2f60a08201527f2f7777772e77332e6f72672f313939392f786c696e6b223e203c646566733e2060c08201527f3c672069643d22637562652220636c6173733d22637562652d756e697422207460e08201527f72616e73666f726d3d227363616c6528302e32352c302e323529223e203c706f6101008201527f6c79676f6e207374796c653d227374726f6b653a233030303030303b2220706f6101208201527f696e74733d223438302c313132203235362c302033322c3131322033322c34306101408201527f30203235362c353132203438302c34303020222f3e203c706f6c79676f6e20736101608201527f74796c653d227374726f6b653a233030303030303b2220706f696e74733d22326101808201527f35362c3232342033322c3131322033322c343030203235362c353132203438306101a08201527f2c343030203438302c31313220222f3e203c706f6c79676f6e207374796c653d6101c08201527f227374726f6b653a233030303030303b2220706f696e74733d223235362c32326101e08201527f34203235362c353132203438302c343030203438302c31313220222f3e203c2f6102008201527f673e203c2f646566733e203c67207472616e73666f726d3d227472616e736c616102208201527f746528302e3030303030302c313130302e30303030303029207363616c6528306102408201527f2e3130303030302c2d302e31303030303029222066696c6c3d222330303030306102608201527f3022207374726f6b653d226e6f6e65223e203c7061746820643d224d302035356102808201527f3030206c30202d353530302035353030203020353530302030203020353530306102a08201527f20302035353030202d353530302030202d3535303020302030202d353530307a6102c08201526711103334b6361e9160c11b6102e08201526000613ab36143b66143b06143a06102e8860189613e41565b631e17b39f60e11b815260040190565b86613e25565b84613e25565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c2000000000008152600082516143f481601b85016020870161493e565b91909101601b0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161443981601d85016020870161493e565b91909101601d0192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061447990830184613df9565b9695505050505050565b6020815260006137e76020830184613df9565b6020808252600d908201526c3737ba103a34329037bbb732b960991b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260169082015275594f5520415245204e4f5420544845204f574e45522160501b604082015260600190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061464290830186613df9565b8415156060840152828103608084015261465c8185613df9565b98975050505050505050565b61ffff861681526080602082015260006146856080830187613df9565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006146e66080830186613df9565b6001600160401b038516604084015282810360608401526147078185613df9565b979650505050505050565b61ffff871681526000602060c081840152600088546147308161496a565b8060c087015260e0600180841660008114614752576001811461476757614795565b60ff1985168984015261010089019550614795565b8d6000528660002060005b8581101561478d5781548b8201860152908301908801614772565b8a0184019650505b505050505083810360408501526147ac8189613df9565b9150506147c460608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526147e58185613df9565b9998505050505050505050565b8481526020808201859052610120820190604083018560005b60048110156148285781518352918301919083019060010161480b565b50505060c083018460005b600381101561485057815183529183019190830190600101614833565b5050505095945050505050565b604051608081016001600160401b038111828210171561487f5761487f614a16565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148ad576148ad614a16565b604052919050565b60006001600160401b038211156148ce576148ce614a16565b50601f01601f191660200190565b600082198211156148ef576148ef6149d4565b500190565b600082614903576149036149ea565b500490565b6000816000190483118215151615614922576149226149d4565b500290565b600082821015614939576149396149d4565b500390565b60005b83811015614959578181015183820152602001614941565b83811115610a8a5750506000910152565b600181811c9082168061497e57607f821691505b6020821081141561499f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156149b9576149b96149d4565b5060010190565b6000826149cf576149cf6149ea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461253b57600080fd5b6001600160e01b03198116811461253b57600080fdfe3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d2223463546354635223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a222f3e3c2f673e3c2f7376673e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222346354635463522207374726f6b653d226e6f6e65223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d3937363020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d3938303020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d313034383020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d313035323020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a222f3e3c2f673e3c2f7376673e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c313130302e30303030303029207363616c6528302e3130303030302c2d302e31303030303029222066696c6c3d222346354635463522207374726f6b653d226e6f6e65223e203c7061746820643d224d3937323020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d3937363020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d3938303020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a204d313034343020383930206c30202d313130202d3131302030202d31313020302030202d3131302030202d3131302031313020302031313020302030202d3232302030202d323230203131302030203131302030203020323230203020323230203131302030203131302030203020313130203020313130202d3131302030202d3131302030203020313130203020313130202d3131302030202d31313020302030202d3131307a206d323030202d3230206c30202d3131302031313020302031313020302030202d39302030202d3930202d3131302030202d31313020302030202d3232302030202d323230202d39302030202d39302030203020323230203020323230202d3131302030202d313130203020302039302030203930203131302030203131302030203020313130203020313130203930203020393020302030202d3131307a204d313034383020383530206c30202d313130202d3131302030202d31313020302030202d37302030202d37302031313020302031313020302030202d3232302030202d3232302037302030203730203020302032323020302032323020313130203020313130203020302037302030203730202d3131302030202d3131302030203020313130203020313130202d37302030202d373020302030202d3131307a206d313230202d3230206c30202d3131302031313020302031313020302030202d35302030202d3530202d3131302030202d31313020302030202d3232302030202d323230202d35302030202d35302030203020323230203020323230202d3131302030202d313130203020302035302030203530203131302030203131302030203020313130203020313130203530203020353020302030202d3131307a204d313035323020383130206c30202d313130202d3131302030202d31313020302030202d33302030202d33302031313020302031313020302030202d3232302030202d3232302033302030203330203020302032323020302032323020313130203020313130203020302033302030203330202d3131302030202d3131302030203020313130203020313130202d33302030202d333020302030202d3131307a206d3430202d3230206c30202d31313020313130203020633637203020313130202d3420313130202d31302030202d36202d3433202d3130202d313130202d3130206c2d31313020302030202d323230206330202d313430202d34202d323230202d3130202d323230202d362030202d3130203830202d313020323230206c3020323230202d313130203020632d36372030202d3131302034202d3131302031302030203620343320313020313130203130206c31313020302030203131302063302036372034203131302031302031313020362030203130202d3433203130202d3131307a222f3e203c2f673e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205274fd52c11025a890b9757a58215970929076c5192c6f0e06087fce0310f32a64736f6c63430008070033

Deployed Bytecode Sourcemap

57701:31420:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54818:948;;;;;;;;;;-1:-1:-1;54818:948:0;;;;;:::i;:::-;;:::i;:::-;;41899:305;;;;;;;;;;-1:-1:-1;41899:305:0;;;;;:::i;:::-;;:::i;:::-;;;23006:14:1;;22999:22;22981:41;;22969:2;22954:18;41899:305:0;;;;;;;;42844:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44403:221::-;;;;;;;;;;-1:-1:-1;44403:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;22014:32:1;;;21996:51;;21984:2;21969:18;44403:221:0;21850:203:1;43926:411:0;;;;;;;;;;-1:-1:-1;43926:411:0;;;;;:::i;:::-;;:::i;55774:356::-;;;;;;;;;;-1:-1:-1;55774:356:0;;;;;:::i;:::-;;:::i;76438:673::-;;;;;;;;;;-1:-1:-1;76438:673:0;;;;;:::i;:::-;;:::i;45153:339::-;;;;;;;;;;-1:-1:-1;45153:339:0;;;;;:::i;:::-;;:::i;72532:108::-;;;;;;;;;;-1:-1:-1;72532:108:0;;;;;:::i;:::-;;:::i;76252:178::-;;;;;;;;;;-1:-1:-1;76252:178:0;;;;;:::i;:::-;;:::i;58157:26::-;;;;;;;;;;;;;;;;;;;23179:25:1;;;23167:2;23152:18;58157:26:0;23033:177:1;72943:257:0;;;;;;;;;;-1:-1:-1;72943:257:0;;;;;:::i;:::-;;:::i;58469:37::-;;;;;;;;;;-1:-1:-1;58469:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45563:185;;;;;;;;;;-1:-1:-1;45563:185:0;;;;;:::i;:::-;;:::i;58352:62::-;;;;;;;;;;-1:-1:-1;58352:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;42538:239;;;;;;;;;;-1:-1:-1;42538:239:0;;;;;:::i;:::-;;:::i;58292:53::-;;;;;;;;;;-1:-1:-1;58292:53:0;;;;;:::i;:::-;;:::i;42268:208::-;;;;;;;;;;-1:-1:-1;42268:208:0;;;;;:::i;:::-;;:::i;21318:103::-;;;;;;;;;;;;;:::i;72648:257::-;;;;;;;;;;-1:-1:-1;72648:257:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;54660:51::-;;;;;;;;;;-1:-1:-1;54660:51:0;;;;;:::i;:::-;;:::i;58421:41::-;;;;;;;;;;-1:-1:-1;58421:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20667:87;;;;;;;;;;-1:-1:-1;20713:7:0;20740:6;-1:-1:-1;;;;;20740:6:0;20667:87;;58192:44;;;;;;;;;;-1:-1:-1;58192:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;41413:25:1;;;41469:2;41454:18;;41447:34;;;;41386:18;58192:44:0;41239:248:1;54563:90:0;;;;;;;;;;-1:-1:-1;54563:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88060:133;;;;;;;;;;-1:-1:-1;88060:133:0;;;;;:::i;:::-;;:::i;43013:104::-;;;;;;;;;;;;;:::i;44696:155::-;;;;;;;;;;-1:-1:-1;44696:155:0;;;;;:::i;:::-;;:::i;58009:21::-;;;;;;;;;;-1:-1:-1;58009:21:0;;;;-1:-1:-1;;;;;58009:21:0;;;72409:115;;;;;;;;;;-1:-1:-1;72409:115:0;;;;;:::i;:::-;;:::i;45819:328::-;;;;;;;;;;-1:-1:-1;45819:328:0;;;;;:::i;:::-;;:::i;77476:4195::-;;;;;;;;;;-1:-1:-1;77476:4195:0;;;;;:::i;:::-;;:::i;58243:42::-;;;;;;;;;;-1:-1:-1;58243:42:0;;;;;:::i;:::-;;:::i;73208:562::-;;;;;;;;;;-1:-1:-1;73208:562:0;;;;;:::i;:::-;;:::i;81679:4831::-;;;;;;;;;;-1:-1:-1;81679:4831:0;;;;;:::i;:::-;;:::i;74548:1654::-;;;;;;:::i;:::-;;:::i;56606:758::-;;;;;;:::i;:::-;;:::i;73778:631::-;;;;;;:::i;:::-;;:::i;58513:49::-;;;;;;;;;;-1:-1:-1;58513:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44922:164;;;;;;;;;;-1:-1:-1;44922:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45043:25:0;;;45019:4;45043:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44922:164;77119:349;;;;;;;;;;-1:-1:-1;77119:349:0;;;;;:::i;:::-;;:::i;57372:158::-;;;;;;;;;;-1:-1:-1;57372:158:0;;;;;:::i;:::-;;:::i;21576:201::-;;;;;;;;;;-1:-1:-1;21576:201:0;;;;;:::i;:::-;;:::i;54818:948::-;54980:8;;-1:-1:-1;;;;;54980:8:0;54958:10;:31;54950:40;;;;;;55101:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;55079:11;:18;:61;:134;;;;-1:-1:-1;55180:32:0;;;;;;;:19;:32;;;;;;;55170:43;;;;55180:32;55170:43;:::i;:::-;;;;;;;;55154:11;55144:22;;;;;;:69;55079:134;55071:212;;;;-1:-1:-1;;;55071:212:0;;32826:2:1;55071:212:0;;;32808:21:1;32865:2;32845:18;;;32838:30;32904:34;32884:18;;;32877:62;-1:-1:-1;;;32955:18:1;;;32948:50;33015:19;;55071:212:0;;;;;;;;;55411:60;;-1:-1:-1;;;55411:60:0;;:4;;:16;;:60;;55428:11;;55441;;55454:6;;55462:8;;55411:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55407:352;;55618:52;;;;;;;;55633:8;:15;55618:52;;;;55660:8;55650:19;;;;;;55618:52;;;55567:14;:27;55582:11;55567:27;;;;;;;;;;;;;;;55595:11;55567:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55567:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;55690:57;;;;55704:11;;55717;;55608:6;;55738:8;;55690:57;:::i;:::-;;;;;;;;55407:352;54818:948;;;;:::o;41899:305::-;42001:4;-1:-1:-1;;;;;;42038:40:0;;-1:-1:-1;;;42038:40:0;;:105;;-1:-1:-1;;;;;;;42095:48:0;;-1:-1:-1;;;42095:48:0;42038:105;:158;;;-1:-1:-1;;;;;;;;;;34799:40:0;;;42160:36;42018:178;41899:305;-1:-1:-1;;41899:305:0:o;42844:100::-;42898:13;42931:5;42924:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42844:100;:::o;44403:221::-;44479:7;47746:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47746:16:0;44499:73;;;;-1:-1:-1;;;44499:73:0;;32052:2:1;44499:73:0;;;32034:21:1;32091:2;32071:18;;;32064:30;32130:34;32110:18;;;32103:62;-1:-1:-1;;;32181:18:1;;;32174:42;32233:19;;44499:73:0;31850:408:1;44499:73:0;-1:-1:-1;44592:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44592:24:0;;44403:221::o;43926:411::-;44007:13;44023:23;44038:7;44023:14;:23::i;:::-;44007:39;;44071:5;-1:-1:-1;;;;;44065:11:0;:2;-1:-1:-1;;;;;44065:11:0;;;44057:57;;;;-1:-1:-1;;;44057:57:0;;34426:2:1;44057:57:0;;;34408:21:1;34465:2;34445:18;;;34438:30;34504:34;34484:18;;;34477:62;-1:-1:-1;;;34555:18:1;;;34548:31;34596:19;;44057:57:0;34224:397:1;44057:57:0;19475:10;-1:-1:-1;;;;;44149:21:0;;;;:62;;-1:-1:-1;44174:37:0;44191:5;19475:10;44922:164;:::i;44174:37::-;44127:168;;;;-1:-1:-1;;;44127:168:0;;28965:2:1;44127:168:0;;;28947:21:1;29004:2;28984:18;;;28977:30;29043:34;29023:18;;;29016:62;29114:26;29094:18;;;29087:54;29158:19;;44127:168:0;28763:420:1;44127:168:0;44308:21;44317:2;44321:7;44308:8;:21::i;:::-;43996:341;43926:411;;:::o;55774:356::-;55943:10;55965:4;55943:27;55935:83;;;;-1:-1:-1;;;55935:83:0;;30571:2:1;55935:83:0;;;30553:21:1;30610:2;30590:18;;;30583:30;30649:34;30629:18;;;30622:62;-1:-1:-1;;;30700:18:1;;;30693:41;30751:19;;55935:83:0;30369:407:1;55935:83:0;56067:55;56079:11;56092;56105:6;56113:8;56067:10;:55::i;76438:673::-;76608:16;76616:7;76608;:16::i;:::-;-1:-1:-1;;;;;76594:30:0;:10;-1:-1:-1;;;;;76594:30:0;;76586:65;;;;-1:-1:-1;;;76586:65:0;;;;;;;:::i;:::-;76670:17;;;;:8;:17;;;;;;;;:26;76662:71;;;;-1:-1:-1;;;76662:71:0;;37391:2:1;76662:71:0;;;37373:21:1;;;37410:18;;;37403:30;37469:34;37449:18;;;37442:62;37521:18;;76662:71:0;37189:356:1;76662:71:0;76753:18;;76774:3;-1:-1:-1;76752:56:0;;;;-1:-1:-1;76783:18:0;;;;76804:3;-1:-1:-1;76752:56:0;:86;;;;-1:-1:-1;76813:18:0;;;;76834:3;-1:-1:-1;76752:86:0;76744:113;;;;-1:-1:-1;;;76744:113:0;;37048:2:1;76744:113:0;;;37030:21:1;37087:2;37067:18;;;37060:30;-1:-1:-1;;;37106:18:1;;;37099:44;37160:18;;76744:113:0;36846:338:1;76744:113:0;76870:24;76897:17;;;:8;:17;;;;;76925:22;;;76958:13;;;:22;;;76991:24;:14;;;77008:7;76991:24;;:::i;:::-;-1:-1:-1;77026:40:0;:22;;;77051:15;77026:40;;:::i;:::-;-1:-1:-1;77084:19:0;;23179:25:1;;;77084:19:0;;23167:2:1;23152:18;77084:19:0;;;;;;;76575:536;76438:673;;;;;:::o;45153:339::-;45348:41;19475:10;45381:7;45348:18;:41::i;:::-;45340:103;;;;-1:-1:-1;;;45340:103:0;;;;;;;:::i;:::-;45456:28;45466:4;45472:2;45476:7;45456:9;:28::i;72532:108::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;72343:6:::1;::::0;-1:-1:-1;;;;;72343:6:0::1;72353:10;72343:20;72335:46;;;;-1:-1:-1::0;;;72335:46:0::1;;;;;;;:::i;:::-;72614:11:::2;:18:::0;72532:108::o;76252:178::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;72343:6:::1;::::0;-1:-1:-1;;;;;72343:6:0::1;72353:10;72343:20;72335:46;;;;-1:-1:-1::0;;;72335:46:0::1;;;;;;;:::i;:::-;76342:6:::2;::::0;76334:36:::2;::::0;76319:9:::2;::::0;-1:-1:-1;;;;;76342:6:0::2;::::0;76362:3;;76319:9;76334:36;76319:9;76334:36;76362:3;76342:6;76334:36:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76318:52;;;76389:4;76381:41;;;::::0;-1:-1:-1;;;76381:41:0;;34073:2:1;76381:41:0::2;::::0;::::2;34055:21:1::0;34112:2;34092:18;;;34085:30;34151:26;34131:18;;;34124:54;34195:18;;76381:41:0::2;33871:348:1::0;76381:41:0::2;76307:123;76252:178:::0;:::o;72943:257::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;72343:6:::1;::::0;-1:-1:-1;;;;;72343:6:0::1;72353:10;72343:20;72335:46;;;;-1:-1:-1::0;;;72335:46:0::1;;;;;;;:::i;:::-;73048:17:::2;;73037:7;73023:11;;:21;;;;:::i;:::-;:42;;73015:66;;;::::0;-1:-1:-1;;;73015:66:0;;28625:2:1;73015:66:0::2;::::0;::::2;28607:21:1::0;28664:2;28644:18;;;28637:30;-1:-1:-1;;;28683:18:1;;;28676:41;28734:18;;73015:66:0::2;28423:335:1::0;73015:66:0::2;73097:9;73092:101;73116:7;73112:1;:11;73092:101;;;73145:36;73155:10;73169:11;;73167:13;;;;;:::i;:::-;::::0;;;;-1:-1:-1;73145:9:0::2;:36::i;:::-;73125:3:::0;::::2;::::0;::::2;:::i;:::-;;;;73092:101;;45563:185:::0;45701:39;45718:4;45724:2;45728:7;45701:39;;;;;;;;;;;;:16;:39::i;42538:239::-;42610:7;42646:16;;;:7;:16;;;;;;-1:-1:-1;;;;;42646:16:0;42681:19;42673:73;;;;-1:-1:-1;;;42673:73:0;;29801:2:1;42673:73:0;;;29783:21:1;29840:2;29820:18;;;29813:30;29879:34;29859:18;;;29852:62;-1:-1:-1;;;29930:18:1;;;29923:39;29979:19;;42673:73:0;29599:405:1;58292:53:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42268:208::-;42340:7;-1:-1:-1;;;;;42368:19:0;;42360:74;;;;-1:-1:-1;;;42360:74:0;;29390:2:1;42360:74:0;;;29372:21:1;29429:2;29409:18;;;29402:30;29468:34;29448:18;;;29441:62;-1:-1:-1;;;29519:18:1;;;29512:40;29569:19;;42360:74:0;29188:406:1;42360:74:0;-1:-1:-1;;;;;;42452:16:0;;;;;:9;:16;;;;;;;42268:208::o;21318:103::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;21383:30:::1;21410:1;21383:18;:30::i;:::-;21318:103::o:0;72648:257::-;72707:7;72717;72727:17;;:::i;:::-;72746;;:::i;:::-;72784:18;;;;:8;:18;;;;;;;:24;;72810;;;;72776:121;;;;;;;;;72784:24;;72810;;72836:25;;;;72863:33;;;;;72836:25;;72776:121;;72836:25;72776:121;;;;;;;;;;;;;;;;;-1:-1:-1;;72776:121:0;;;;;;;;;;;;-1:-1:-1;72776:121:0;;-1:-1:-1;72776:121:0;;-1:-1:-1;72776:121:0;-1:-1:-1;72776:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72648:257;;;;;:::o;54660:51::-;;;;;;;;;;;;;;;;:::i;88060:133::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;72343:6:::1;::::0;-1:-1:-1;;;;;72343:6:0::1;72353:10;72343:20;72335:46;;;;-1:-1:-1::0;;;72335:46:0::1;;;;;;;:::i;:::-;88150:26:::2;:35:::0;88060:133::o;43013:104::-;43069:13;43102:7;43095:14;;;;;:::i;44696:155::-;44791:52;19475:10;44824:8;44834;44791:18;:52::i;72409:115::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;72343:6:::1;::::0;-1:-1:-1;;;;;72343:6:0::1;72353:10;72343:20;72335:46;;;;-1:-1:-1::0;;;72335:46:0::1;;;;;;;:::i;:::-;72489:9:::2;:27:::0;;-1:-1:-1;;;;;;72489:27:0::2;-1:-1:-1::0;;;;;72489:27:0;;;::::2;::::0;;;::::2;::::0;;72409:115::o;45819:328::-;45994:41;19475:10;46027:7;45994:18;:41::i;:::-;45986:103;;;;-1:-1:-1;;;45986:103:0;;;;;;;:::i;:::-;46100:39;46114:4;46120:2;46124:7;46133:5;46100:13;:39::i;77476:4195::-;47722:4;47746:16;;;:7;:16;;;;;;77531:13;;-1:-1:-1;;;;;47746:16:0;77557:77;;;;-1:-1:-1;;;77557:77:0;;;;;;;:::i;:::-;77647:23;77673:18;;;:8;:18;;;;;;;;77647:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77673:18;;77647:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77647:44:0;;;-1:-1:-1;;77647:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77704:20;77744:7;:13;;;77759:7;:13;;;77727:46;;;;;;;;13632:19:1;;;13676:2;13667:12;;13660:28;13713:2;13704:12;;13475:247;77727:46:0;;;;-1:-1:-1;;77727:46:0;;;;;;;;;77826:14;;;;;:17;;;77845;;;;77809:54;;;13632:19:1;;;;13667:12;;;13660:28;77809:54:0;;;;;;;;;13704:12:1;;;;77809:54:0;;77917:14;;:17;;;;77936;;;;77900:54;;;13632:19:1;;;;13667:12;;;;13660:28;;;;77900:54:0;;;;;;;;;;13704:12:1;;;;77900:54:0;;-1:-1:-1;78783:36:0;;;:26;:36;;;;;;78764:56;;:18;:56;;;;;78869:22;;;;:25;;78896;;;;77727:46;;-1:-1:-1;77809:54:0;;77900;-1:-1:-1;78830:119:0;;77727:46;;77809:54;;77900;;78869:25;78946:1;78923:25;;;;;78830:6;:119::i;:::-;78950:18;;;;:8;:18;;;;;;;;:27;:2683;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77999:3635;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77999:3635:0;;;;;;;;;;77476:4195;-1:-1:-1;;;;;;;77476:4195:0:o;58243:42::-;;;;;;;;;;;;;;;;:::i;73208:562::-;73286:16;73294:7;73286;:16::i;:::-;-1:-1:-1;;;;;73272:30:0;:10;-1:-1:-1;;;;;73272:30:0;;73264:65;;;;-1:-1:-1;;;73264:65:0;;;;;;;:::i;:::-;73348:17;;;;:8;:17;;;;;;;;:26;73340:59;;;;-1:-1:-1;;;73340:59:0;;36005:2:1;73340:59:0;;;35987:21:1;36044:2;36024:18;;;36017:30;-1:-1:-1;;;36063:18:1;;;36056:50;36123:18;;73340:59:0;35803:344:1;73340:59:0;73412:23;73438:17;;;:8;:17;;;;;;;;73412:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73438:17;;73412:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73412:43:0;;;-1:-1:-1;;73412:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73466:19;73505:7;:13;;;73520:7;:13;;;73535:7;:14;;;73550:1;73535:17;;;;;;;:::i;:::-;;;;;;;;;;73554:14;;;;;:17;;;;73573;;;;73592;;;;;73488:122;;;;;21604:19:1;;;;21639:12;;;21632:28;;;;21676:12;;21669:28;;;;21713:12;;;21706:28;;;;21750:13;;;21743:29;;;;21788:13;;;21781:29;;;;21826:13;;73488:122:0;;;;;;;;;;;;73466:144;;73629:5;73642:6;73629:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;73621:65;;;;-1:-1:-1;;;73621:65:0;;31344:2:1;73621:65:0;;;31326:21:1;31383:2;31363:18;;;31356:30;-1:-1:-1;;;31402:18:1;;;31395:52;31464:18;;73621:65:0;31142:346:1;73621:65:0;73699:17;;;;:8;:17;;;;;;;:24;;-1:-1:-1;;73699:24:0;73719:4;73699:24;;;;;;73734:21;;:5;;:21;;73747:6;;73734:21;:::i;:::-;;;;;;;;;;;;;;:28;;;;;-1:-1:-1;;73734:28:0;;;;;;;;;-1:-1:-1;;;73208:562:0:o;81679:4831::-;47722:4;47746:16;;;:7;:16;;;;;;81753:13;;-1:-1:-1;;;;;47746:16:0;81779:77;;;;-1:-1:-1;;;81779:77:0;;;;;;;:::i;:::-;81869:23;81895:18;;;:8;:18;;;;;;;;81869:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81895:18;;81869:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;81869:44:0;;;-1:-1:-1;;81869:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81926:20;81966:7;:13;;;81981:7;:13;;;81949:46;;;;;;;;13632:19:1;;;13676:2;13667:12;;13660:28;13713:2;13704:12;;13475:247;81949:46:0;;;;-1:-1:-1;;81949:46:0;;;;;;;;;82048:14;;;;;:17;;;82067;;;;82031:54;;;13632:19:1;;;;13667:12;;;13660:28;82031:54:0;;;;;;;;;13704:12:1;;;;82031:54:0;;82139:14;;:17;;;;82158;;;;82122:54;;;13632:19:1;;;;13667:12;;;;13660:28;;;;82122:54:0;;;;;;;;;;13704:12:1;;;;82122:54:0;;-1:-1:-1;83080:36:0;;;:26;:36;;;;;;83061:56;;:18;:56;;;;;83166:22;;;;:25;;83193;;;;81949:46;;-1:-1:-1;82031:54:0;;82122;-1:-1:-1;82269:3666:0;;83061:56;83127:119;;81949:46;;82031:54;;82122;;83166:25;;83193;83243:1;83220:25;;83127:119;83247:18;;;;:8;:18;;;;;;;;:27;:2684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82296:3636;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82269:13;:3666::i;:::-;82221:3715;;;;;;;;:::i;:::-;;;;-1:-1:-1;;82221:3715:0;;;;;;;;;85948:23;85974:18;;;:8;82221:3715;85974:18;;;;;82221:3715;;-1:-1:-1;85948:23:0;85974:18;;:27;:46;;;;;;;;;;;;;;;-1:-1:-1;;;85974:46:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;85974:46:0;;;;85948:72;;86138:338;86281:18;86290:8;86281;:18::i;:::-;86382:9;86410:8;86194:248;;;;;;;;;;:::i;86138:338::-;86061:430;;;;;;;;:::i;:::-;;;;;;;;;;;;;86033:469;;;;;;;;81679:4831;;;:::o;74548:1654::-;74651:16;74659:7;74651;:16::i;:::-;-1:-1:-1;;;;;74637:30:0;:10;-1:-1:-1;;;;;74637:30:0;;74629:77;;;;-1:-1:-1;;;74629:77:0;;27466:2:1;74629:77:0;;;27448:21:1;27505:2;27485:18;;;27478:30;27544:34;27524:18;;;27517:62;-1:-1:-1;;;27595:18:1;;;27588:32;27637:19;;74629:77:0;27264:398:1;74629:77:0;74725:29;;;74764:1;74725:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;74717:99;;;;-1:-1:-1;;;74717:99:0;;26288:2:1;74717:99:0;;;26270:21:1;26327:2;26307:18;;;26300:30;26366:34;26346:18;;;26339:62;-1:-1:-1;;;26417:18:1;;;26410:44;26471:19;;74717:99:0;26086:410:1;74717:99:0;74835:17;;;;:8;:17;;;;;;;;:26;74827:70;;;;-1:-1:-1;;;74827:70:0;;30211:2:1;74827:70:0;;;30193:21:1;30250:2;30230:18;;;30223:30;30289:33;30269:18;;;30262:61;30340:18;;74827:70:0;30009:355:1;74827:70:0;74975:14;74981:7;74975:5;:14::i;:::-;75086:31;;;75097:10;75086:31;;;22736:51:1;22803:18;;;22796:34;;;75086:31:0;;;;;;;;;22709:18:1;;;75086:31:0;;75287:26;;-1:-1:-1;;;75261:53:0;;;20957:51:1;21024:11;;;;21017:27;;;;75261:53:0;;;;;;;;;;21060:12:1;;;75261:53:0;;;;75490:8;;-1:-1:-1;;;75490:77:0;;;75086:31;;75220:1;;-1:-1:-1;;;;;;;75490:8:0;;:21;;:77;;75512:8;;75530:4;;75086:31;;-1:-1:-1;;75261:53:0;;75490:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75468:99;;;75601:10;75588:9;:23;;75580:103;;;;-1:-1:-1;;;75580:103:0;;23885:2:1;75580:103:0;;;23867:21:1;23924:2;23904:18;;;23897:30;23963:34;23943:18;;;23936:62;24034:34;24014:18;;;24007:62;-1:-1:-1;;;24085:19:1;;;24078:34;24129:19;;75580:103:0;23683:471:1;75580:103:0;75696:8;;75814:29;;;75696:8;75814:29;;;:19;:29;;;;;;75696:498;;-1:-1:-1;;;75696:498:0;;-1:-1:-1;;;;;75696:8:0;;;;:13;;75717:9;;75696:498;;75742:8;;75902:7;;75985:10;;75696:8;76132:13;;75696:498;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74618:1584;;;;74548:1654;;:::o;56606:758::-;56822:27;;;56787:32;56822:27;;;:14;:27;;;;;;:40;;;;56850:11;;56822:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56822:48:0;;;;;;;;;;56889:21;;;;56822:48;;-1:-1:-1;56881:86:0;;;;-1:-1:-1;;;56881:86:0;;35598:2:1;56881:86:0;;;35580:21:1;35637:2;35617:18;;;35610:30;35676:34;35656:18;;;35649:62;-1:-1:-1;;;35727:18:1;;;35720:36;35773:19;;56881:86:0;35396:402:1;56881:86:0;57005:23;;56986:42;;:90;;;;;57055:9;:21;;;57042:8;;57032:19;;;;;;;:::i;:::-;;;;;;;;:44;56986:90;56978:129;;;;-1:-1:-1;;;56978:129:0;;27111:2:1;56978:129:0;;;27093:21:1;27150:2;27130:18;;;27123:30;27189:28;27169:18;;;27162:56;27235:18;;56978:129:0;26909:350:1;56978:129:0;57181:1;57155:27;;;57193:21;;;:34;57296:60;;-1:-1:-1;;;57296:60:0;;:4;;:16;;:60;;57313:11;;57326;;57339:6;;57347:8;;;;57296:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56731:633;56606:758;;;;;:::o;73778:631::-;73906:10;73889:28;;;;:16;:28;;;;;;;;73888:29;73880:70;;;;-1:-1:-1;;;73880:70:0;;31695:2:1;73880:70:0;;;31677:21:1;31734:2;31714:18;;;31707:30;31773;31753:18;;;31746:58;31821:18;;73880:70:0;31493:352:1;73880:70:0;73979:1;73969:7;:11;73961:38;;;;-1:-1:-1;;;73961:38:0;;28282:2:1;73961:38:0;;;28264:21:1;28321:2;28301:18;;;28294:30;-1:-1:-1;;;28340:18:1;;;28333:44;28394:18;;73961:38:0;28080:338:1;73961:38:0;74043:17;;74032:7;74018:11;;:21;;;;:::i;:::-;:42;;74010:66;;;;-1:-1:-1;;;74010:66:0;;28625:2:1;74010:66:0;;;28607:21:1;28664:2;28644:18;;;28637:30;-1:-1:-1;;;28683:18:1;;;28676:41;28734:18;;74010:66:0;28423:335:1;74010:66:0;74114:37;;-1:-1:-1;;74131:10:0;13353:2:1;13349:15;13345:53;74114:37:0;;;13333:66:1;13415:12;;;13408:28;;;74089:12:0;;13452::1;;74114:37:0;;;;;;;;;;;;74104:48;;;;;;74089:63;;74171:51;74190:12;;74171:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;74204:11:0;;;-1:-1:-1;74217:4:0;;-1:-1:-1;74171:18:0;:51::i;:::-;74163:79;;;;-1:-1:-1;;;74163:79:0;;36705:2:1;74163:79:0;;;36687:21:1;36744:2;36724:18;;;36717:30;-1:-1:-1;;;36763:18:1;;;36756:44;36817:18;;74163:79:0;36503:338:1;74163:79:0;74272:10;74255:28;;;;:16;:28;;;;;:35;;-1:-1:-1;;74255:35:0;74286:4;74255:35;;;74301:101;74325:7;74321:1;:11;74301:101;;;74354:36;74364:10;74378:11;;74376:13;;;;;:::i;74354:36::-;74334:3;;;;:::i;:::-;;;;74301:101;;;;73869:540;73778:631;;;:::o;77119:349::-;77221:16;77229:7;77221;:16::i;:::-;-1:-1:-1;;;;;77207:30:0;:10;-1:-1:-1;;;;;77207:30:0;;77199:65;;;;-1:-1:-1;;;77199:65:0;;;;;;;:::i;:::-;77283:17;;;;:8;:17;;;;;;;;:26;77275:71;;;;-1:-1:-1;;;77275:71:0;;37391:2:1;77275:71:0;;;37373:21:1;;;37410:18;;;37403:30;37469:34;37449:18;;;37442:62;37521:18;;77275:71:0;37189:356:1;77275:71:0;77374:3;77365:6;:12;77357:48;;;;-1:-1:-1;;;77357:48:0;;34828:2:1;77357:48:0;;;34810:21:1;34867:2;34847:18;;;34840:30;34906:25;34886:18;;;34879:53;34949:18;;77357:48:0;34626:347:1;77357:48:0;77416:35;;;;:26;:35;;;;;:44;77119:349::o;57372:158::-;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;57476:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;57508:14;;57476:46:::1;:::i;21576:201::-:0;20713:7;20740:6;-1:-1:-1;;;;;20740:6:0;19475:10;20887:23;20879:68;;;;-1:-1:-1;;;20879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21665:22:0;::::1;21657:73;;;::::0;-1:-1:-1;;;21657:73:0;;25122:2:1;21657:73:0::1;::::0;::::1;25104:21:1::0;25161:2;25141:18;;;25134:30;25200:34;25180:18;;;25173:62;-1:-1:-1;;;25251:18:1;;;25244:36;25297:19;;21657:73:0::1;24920:402:1::0;21657:73:0::1;21741:28;21760:8;21741:18;:28::i;:::-;21576:201:::0;:::o;51570:174::-;51645:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;51645:29:0;-1:-1:-1;;;;;51645:29:0;;;;;;;;:24;;51699:23;51645:24;51699:14;:23::i;:::-;-1:-1:-1;;;;;51690:46:0;;;;;;;;;;;51570:174;;:::o;88780:338::-;88933:14;88949:12;88976:8;88965:37;;;;;;;;;;;;:::i;:::-;88932:70;;;;89084:26;89094:6;89102:7;89084:9;:26::i;:::-;88902:216;;88780:338;;;;:::o;47951:348::-;48044:4;47746:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47746:16:0;48061:73;;;;-1:-1:-1;;;48061:73:0;;27869:2:1;48061:73:0;;;27851:21:1;27908:2;27888:18;;;27881:30;27947:34;27927:18;;;27920:62;-1:-1:-1;;;27998:18:1;;;27991:42;28050:19;;48061:73:0;27667:408:1;48061:73:0;48145:13;48161:23;48176:7;48161:14;:23::i;:::-;48145:39;;48214:5;-1:-1:-1;;;;;48203:16:0;:7;-1:-1:-1;;;;;48203:16:0;;:51;;;;48247:7;-1:-1:-1;;;;;48223:31:0;:20;48235:7;48223:11;:20::i;:::-;-1:-1:-1;;;;;48223:31:0;;48203:51;:87;;;-1:-1:-1;;;;;;45043:25:0;;;45019:4;45043:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48258:32;48195:96;47951:348;-1:-1:-1;;;;47951:348:0:o;50874:578::-;51033:4;-1:-1:-1;;;;;51006:31:0;:23;51021:7;51006:14;:23::i;:::-;-1:-1:-1;;;;;51006:31:0;;50998:85;;;;-1:-1:-1;;;50998:85:0;;33247:2:1;50998:85:0;;;33229:21:1;33286:2;33266:18;;;33259:30;33325:34;33305:18;;;33298:62;-1:-1:-1;;;33376:18:1;;;33369:39;33425:19;;50998:85:0;33045:405:1;50998:85:0;-1:-1:-1;;;;;51102:16:0;;51094:65;;;;-1:-1:-1;;;51094:65:0;;25529:2:1;51094:65:0;;;25511:21:1;25568:2;25548:18;;;25541:30;25607:34;25587:18;;;25580:62;-1:-1:-1;;;25658:18:1;;;25651:34;25702:19;;51094:65:0;25327:400:1;51094:65:0;51276:29;51293:1;51297:7;51276:8;:29::i;:::-;-1:-1:-1;;;;;51318:15:0;;;;;;:9;:15;;;;;:20;;51337:1;;51318:15;:20;;51337:1;;51318:20;:::i;:::-;;;;-1:-1:-1;;;;;;;51349:13:0;;;;;;:9;:13;;;;;:18;;51366:1;;51349:13;:18;;51366:1;;51349:18;:::i;:::-;;;;-1:-1:-1;;51378:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;51378:21:0;-1:-1:-1;;;;;51378:21:0;;;;;;;;;51417:27;;51378:16;;51417:27;;;;;;;50874:578;;;:::o;48641:110::-;48717:26;48727:2;48731:7;48717:26;;;;;;;;;;;;:9;:26::i;21937:191::-;22011:16;22030:6;;-1:-1:-1;;;;;22047:17:0;;;-1:-1:-1;;;;;;22047:17:0;;;;;;22080:40;;22030:6;;;;;;;22080:40;;22011:16;22080:40;22000:128;21937:191;:::o;51886:315::-;52041:8;-1:-1:-1;;;;;52032:17:0;:5;-1:-1:-1;;;;;52032:17:0;;;52024:55;;;;-1:-1:-1;;;52024:55:0;;25934:2:1;52024:55:0;;;25916:21:1;25973:2;25953:18;;;25946:30;26012:27;25992:18;;;25985:55;26057:18;;52024:55:0;25732:349:1;52024:55:0;-1:-1:-1;;;;;52090:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;52090:46:0;;;;;;;;;;52152:41;;22981::1;;;52152::0;;22954:18:1;52152:41:0;;;;;;;51886:315;;;:::o;47029:::-;47186:28;47196:4;47202:2;47206:7;47186:9;:28::i;:::-;47233:48;47256:4;47262:2;47266:7;47275:5;47233:22;:48::i;:::-;47225:111;;;;-1:-1:-1;;;47225:111:0;;;;;;;:::i;86604:1372::-;1239:4;1233:11;;1552:20;;;1590:25;;;1728:19;1765:25;;-1:-1:-1;1920:4:0;1905:20;;;1984:17;;;86762:13;;-1:-1:-1;86864:1076:0;86885:3;86881:1;:7;86864:1076;;;86907:17;86933:7;86941:3;86943:1;86941;:3;:::i;:::-;86933:12;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;86957:15:0;86981:9;86991:3;86993:1;86991;:3;:::i;:::-;86981:14;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;87007:16:0;87032:10;87043:3;87045:1;87043;:3;:::i;:::-;87032:15;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;87066:10:0;87061:872;87085:1;87080:2;:6;87061:872;;;87121:4;87123:2;87121:1;:4;:::i;:::-;87109:16;-1:-1:-1;87161:6:0;87165:2;87161:1;:6;:::i;:::-;87172:1;87145:23;;;;;;87144:29;;:34;87140:782;;;87218:6;87222:2;87218:1;:6;:::i;:::-;87229:1;87204:21;;;;;;87203:27;;:32;87199:706;;;87260:144;87307:3;87295:9;:15;:68;;87334:9;;:29;;-1:-1:-1;;;87334:29:0;;;;;23179:25:1;;;-1:-1:-1;;;;;87334:9:0;;;;:18;;23152::1;;87334:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87334:29:0;;;;;;;;;;;;:::i;:::-;87295:68;;;87313:18;;;;:7;:18;;;;;87295:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87376:26;;;;:18;:26;;;;;;;;;87277:126;;;;;87376:26;87277:126;;:::i;:::-;;;;-1:-1:-1;;87277:126:0;;;;;;;;;87260:5;;:16;:144::i;:::-;87199:706;;;87473:6;87477:2;87473:1;:6;:::i;:::-;87484:1;87458:22;;;;;;87457:28;;:33;87453:433;;;87519:143;87565:3;87553:9;:15;:68;;87592:9;;:29;;-1:-1:-1;;;87592:29:0;;;;;23179:25:1;;;-1:-1:-1;;;;;87592:9:0;;;;:18;;23152::1;;87592:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87592:29:0;;;;;;;;;;;;:::i;:::-;87553:68;;;87571:18;;;;:7;:18;;;;;87553:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87634:26;;;;:18;:26;;;;;;;;;87536:125;;;;;87634:26;87536:125;;:::i;87453:433::-;87719:143;87765:3;87753:9;:15;:68;;87792:9;;:29;;-1:-1:-1;;;87792:29:0;;;;;23179:25:1;;;-1:-1:-1;;;;;87792:9:0;;;;:18;;23152::1;;87792:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87792:29:0;;;;;;;;;;;;:::i;:::-;87753:68;;;87771:18;;;;:7;:18;;;;;87753:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87834:26;;;;:18;:26;;;;;;;;;87736:125;;;;;87834:26;87736:125;;:::i;87719:143::-;87088:4;;;;:::i;:::-;;;;87061:872;;;;86896:1044;;;86893:1;86890:4;;;;;:::i;:::-;;;86864:1076;;;-1:-1:-1;87962:5:0;;86604:1372;-1:-1:-1;;;;;;;;86604:1372:0:o;4700:1912::-;4758:13;4788:4;:11;4803:1;4788:16;4784:31;;;-1:-1:-1;;4806:9:0;;;;;;;;;-1:-1:-1;4806:9:0;;;4700:1912::o;4784:31::-;4867:19;4889:12;;;;;;;;;;;;;;;;;4867:34;;4953:18;4999:1;4980:4;:11;4994:1;4980:15;;;;:::i;:::-;4979:21;;;;:::i;:::-;4974:27;;:1;:27;:::i;:::-;4953:48;-1:-1:-1;5084:20:0;5118:15;4953:48;5131:2;5118:15;:::i;:::-;-1:-1:-1;;;;;5107:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5107:27:0;;5084:50;;5231:10;5223:6;5216:26;5326:1;5319:5;5315:13;5385:4;5436;5430:11;5421:7;5417:25;5532:2;5524:6;5520:15;5605:754;5624:6;5615:7;5612:19;5605:754;;;5724:1;5715:7;5711:15;5700:26;;5763:7;5757:14;5889:4;5881:5;5877:2;5873:14;5869:25;5859:8;5855:40;5849:47;5838:9;5830:67;5943:1;5932:9;5928:17;5915:30;;6022:4;6014:5;6010:2;6006:14;6002:25;5992:8;5988:40;5982:47;5971:9;5963:67;6076:1;6065:9;6061:17;6048:30;;6155:4;6147:5;6144:1;6139:14;6135:25;6125:8;6121:40;6115:47;6104:9;6096:67;6209:1;6198:9;6194:17;6181:30;;6288:4;6280:5;6268:25;6258:8;6254:40;6248:47;6237:9;6229:67;-1:-1:-1;6342:1:0;6327:17;5605:754;;;6432:1;6425:4;6419:11;6415:19;6453:1;6448:54;;;;6521:1;6516:52;;;;6408:160;;6448:54;-1:-1:-1;;;;;6464:17:0;;6457:43;6448:54;;6516:52;-1:-1:-1;;;;;6532:17:0;;6525:41;6408:160;-1:-1:-1;6598:6:0;;4700:1912;-1:-1:-1;;;;;;;;4700:1912:0:o;88201:488::-;88257:13;88285:10;88281:47;;-1:-1:-1;;88308:10:0;;;;;;;;;;;;-1:-1:-1;;;88308:10:0;;;;;88201:488::o;88281:47::-;88351:5;88336:12;88388:68;88395:9;;88388:68;;88417:8;;;;:::i;:::-;;-1:-1:-1;88436:10:0;;-1:-1:-1;88444:2:0;88436:10;;:::i;:::-;;;88388:68;;;88464:19;88496:6;-1:-1:-1;;;;;88486:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88486:17:0;;88464:39;;88512:140;88519:10;;88512:140;;88542:11;88552:1;88542:11;;:::i;:::-;;-1:-1:-1;88607:10:0;88615:2;88607:5;:10;:::i;:::-;88594:24;;:2;:24;:::i;:::-;88581:39;;88564:6;88571;88564:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;88564:56:0;;;;;;;;-1:-1:-1;88631:11:0;88640:2;88631:11;;:::i;:::-;;;88512:140;;50177:360;50237:13;50253:23;50268:7;50253:14;:23::i;:::-;50237:39;;50378:29;50395:1;50399:7;50378:8;:29::i;:::-;-1:-1:-1;;;;;50420:16:0;;;;;;:9;:16;;;;;:21;;50440:1;;50420:16;:21;;50440:1;;50420:21;:::i;:::-;;;;-1:-1:-1;;50459:16:0;;;;:7;:16;;;;;;50452:23;;-1:-1:-1;;;;;;50452:23:0;;;50493:36;50467:7;;50459:16;-1:-1:-1;;;;;50493:36:0;;;;;50459:16;;50493:36;50226:311;50177:360;:::o;31046:830::-;31171:4;31211;31171;31228:525;31252:5;:12;31248:1;:16;31228:525;;;31286:20;31309:5;31315:1;31309:8;;;;;;;;:::i;:::-;;;;;;;31286:31;;31354:12;31338;:28;31334:408;;31491:44;;;;;;13632:19:1;;;13667:12;;;13660:28;;;13704:12;;31491:44:0;;;;;;;;;;;;31481:55;;;;;;31466:70;;31334:408;;;31681:44;;;;;;13632:19:1;;;13667:12;;;13660:28;;;13704:12;;31681:44:0;;;;;;;;;;;;31671:55;;;;;;31656:70;;31334:408;-1:-1:-1;31266:3:0;;;;:::i;:::-;;;;31228:525;;;-1:-1:-1;31848:20:0;;;;31046:830;-1:-1:-1;;;31046:830:0:o;48978:321::-;49108:18;49114:2;49118:7;49108:5;:18::i;:::-;49159:54;49190:1;49194:2;49198:7;49207:5;49159:22;:54::i;:::-;49137:154;;;;-1:-1:-1;;;49137:154:0;;;;;;;:::i;52766:799::-;52921:4;-1:-1:-1;;;;;52942:13:0;;23276:20;23324:8;52938:620;;52978:72;;-1:-1:-1;;;52978:72:0;;-1:-1:-1;;;;;52978:36:0;;;;;:72;;19475:10;;53029:4;;53035:7;;53044:5;;52978:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52978:72:0;;;;;;;;-1:-1:-1;;52978:72:0;;;;;;;;;;;;:::i;:::-;;;52974:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53220:13:0;;53216:272;;53263:60;;-1:-1:-1;;;53263:60:0;;;;;;;:::i;53216:272::-;53438:6;53432:13;53423:6;53419:2;53415:15;53408:38;52974:529;-1:-1:-1;;;;;;53101:51:0;-1:-1:-1;;;53101:51:0;;-1:-1:-1;53094:58:0;;52938:620;-1:-1:-1;53542:4:0;52766:799;;;;;;:::o;3537:400::-;-1:-1:-1;;3720:17:0;;3714:24;3769:13;;3822:11;;-1:-1:-1;;3710:35:0;;;;;;3813:20;;3769:13;3813:20;:::i;:::-;:32;;3805:84;;;;-1:-1:-1;;;3805:84:0;;26703:2:1;3805:84:0;;;26685:21:1;26742:2;26722:18;;;26715:30;26781:34;26761:18;;;26754:62;-1:-1:-1;;;26832:18:1;;;26825:37;26879:19;;3805:84:0;26501:403:1;3805:84:0;3900:29;3916:6;3924:4;3900:15;:29::i;49635:313::-;-1:-1:-1;;;;;49715:16:0;;49707:61;;;;-1:-1:-1;;;49707:61:0;;30983:2:1;49707:61:0;;;30965:21:1;;;31002:18;;;30995:30;31061:34;31041:18;;;31034:62;31113:18;;49707:61:0;30781:356:1;49707:61:0;-1:-1:-1;;;;;49839:13:0;;;;;;:9;:13;;;;;:18;;49856:1;;49839:13;:18;;49856:1;;49839:18;:::i;:::-;;;;-1:-1:-1;;49868:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49868:21:0;-1:-1:-1;;;;;49868:21:0;;;;;;;;49907:33;;49868:16;;;49907:33;;49868:16;;49907:33;49635:313;;:::o;2317:978::-;2451:4;2445:11;2511:4;2505;2501:15;2493:23;;2559:6;2553:4;2549:17;2629:4;2620:6;2614:13;2610:24;2602:6;2598:37;2470:712;2660:7;2654:4;2651:17;2470:712;;;3155:11;;3140:27;;2706:4;2696:15;;;;2739:17;2470:712;;;-1:-1:-1;;3254:13:0;;3250:26;3235:42;;;-1:-1:-1;2317:978:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:682::-;405:5;458:3;451:4;443:6;439:17;435:27;425:55;;476:1;473;466:12;425:55;509:2;503:9;551:2;543:6;539:15;620:6;608:10;605:22;-1:-1:-1;;;;;572:10:1;569:34;566:62;563:88;;;631:18;;:::i;:::-;667:2;660:22;702:6;728;761:2;749:15;;746:24;-1:-1:-1;743:44:1;;;783:1;780;773:12;743:44;805:1;815:192;829:4;826:1;823:11;815:192;;;888:17;;876:30;;929:4;953:12;;;;985;;;;849:1;842:9;815:192;;;-1:-1:-1;1025:6:1;;355:682;-1:-1:-1;;;;;355:682:1:o;1042:347::-;1093:8;1103:6;1157:3;1150:4;1142:6;1138:17;1134:27;1124:55;;1175:1;1172;1165:12;1124:55;-1:-1:-1;1198:20:1;;-1:-1:-1;;;;;1230:30:1;;1227:50;;;1273:1;1270;1263:12;1227:50;1310:4;1302:6;1298:17;1286:29;;1362:3;1355:4;1346:6;1338;1334:19;1330:30;1327:39;1324:59;;;1379:1;1376;1369:12;1324:59;1042:347;;;;;:::o;1394:220::-;1436:5;1489:3;1482:4;1474:6;1470:17;1466:27;1456:55;;1507:1;1504;1497:12;1456:55;1529:79;1604:3;1595:6;1582:20;1575:4;1567:6;1563:17;1529:79;:::i;:::-;1520:88;1394:220;-1:-1:-1;;;1394:220:1:o;1619:159::-;1686:20;;1746:6;1735:18;;1725:29;;1715:57;;1768:1;1765;1758:12;1715:57;1619:159;;;:::o;1783:171::-;1850:20;;-1:-1:-1;;;;;1899:30:1;;1889:41;;1879:69;;1944:1;1941;1934:12;1959:247;2018:6;2071:2;2059:9;2050:7;2046:23;2042:32;2039:52;;;2087:1;2084;2077:12;2039:52;2126:9;2113:23;2145:31;2170:5;2145:31;:::i;2211:320::-;2298:6;2306;2359:2;2347:9;2338:7;2334:23;2330:32;2327:52;;;2375:1;2372;2365:12;2327:52;2407:9;2401:16;2426:31;2451:5;2426:31;:::i;:::-;2521:2;2506:18;;;;2500:25;2476:5;;2500:25;;-1:-1:-1;;;2211:320:1:o;2536:388::-;2604:6;2612;2665:2;2653:9;2644:7;2640:23;2636:32;2633:52;;;2681:1;2678;2671:12;2633:52;2720:9;2707:23;2739:31;2764:5;2739:31;:::i;:::-;2789:5;-1:-1:-1;2846:2:1;2831:18;;2818:32;2859:33;2818:32;2859:33;:::i;:::-;2911:7;2901:17;;;2536:388;;;;;:::o;2929:456::-;3006:6;3014;3022;3075:2;3063:9;3054:7;3050:23;3046:32;3043:52;;;3091:1;3088;3081:12;3043:52;3130:9;3117:23;3149:31;3174:5;3149:31;:::i;:::-;3199:5;-1:-1:-1;3256:2:1;3241:18;;3228:32;3269:33;3228:32;3269:33;:::i;:::-;2929:456;;3321:7;;-1:-1:-1;;;3375:2:1;3360:18;;;;3347:32;;2929:456::o;3390:665::-;3485:6;3493;3501;3509;3562:3;3550:9;3541:7;3537:23;3533:33;3530:53;;;3579:1;3576;3569:12;3530:53;3618:9;3605:23;3637:31;3662:5;3637:31;:::i;:::-;3687:5;-1:-1:-1;3744:2:1;3729:18;;3716:32;3757:33;3716:32;3757:33;:::i;:::-;3809:7;-1:-1:-1;3863:2:1;3848:18;;3835:32;;-1:-1:-1;3918:2:1;3903:18;;3890:32;-1:-1:-1;;;;;3934:30:1;;3931:50;;;3977:1;3974;3967:12;3931:50;4000:49;4041:7;4032:6;4021:9;4017:22;4000:49;:::i;:::-;3990:59;;;3390:665;;;;;;;:::o;4060:416::-;4125:6;4133;4186:2;4174:9;4165:7;4161:23;4157:32;4154:52;;;4202:1;4199;4192:12;4154:52;4241:9;4228:23;4260:31;4285:5;4260:31;:::i;:::-;4310:5;-1:-1:-1;4367:2:1;4352:18;;4339:32;4409:15;;4402:23;4390:36;;4380:64;;4440:1;4437;4430:12;4481:315;4549:6;4557;4610:2;4598:9;4589:7;4585:23;4581:32;4578:52;;;4626:1;4623;4616:12;4578:52;4665:9;4652:23;4684:31;4709:5;4684:31;:::i;:::-;4734:5;4786:2;4771:18;;;;4758:32;;-1:-1:-1;;;4481:315:1:o;4801:180::-;4860:6;4913:2;4901:9;4892:7;4888:23;4884:32;4881:52;;;4929:1;4926;4919:12;4881:52;-1:-1:-1;4952:23:1;;4801:180;-1:-1:-1;4801:180:1:o;4986:245::-;5044:6;5097:2;5085:9;5076:7;5072:23;5068:32;5065:52;;;5113:1;5110;5103:12;5065:52;5152:9;5139:23;5171:30;5195:5;5171:30;:::i;5236:249::-;5305:6;5358:2;5346:9;5337:7;5333:23;5329:32;5326:52;;;5374:1;5371;5364:12;5326:52;5406:9;5400:16;5425:30;5449:5;5425:30;:::i;5490:450::-;5559:6;5612:2;5600:9;5591:7;5587:23;5583:32;5580:52;;;5628:1;5625;5618:12;5580:52;5668:9;5655:23;-1:-1:-1;;;;;5693:6:1;5690:30;5687:50;;;5733:1;5730;5723:12;5687:50;5756:22;;5809:4;5801:13;;5797:27;-1:-1:-1;5787:55:1;;5838:1;5835;5828:12;5787:55;5861:73;5926:7;5921:2;5908:16;5903:2;5899;5895:11;5861:73;:::i;5945:635::-;6025:6;6078:2;6066:9;6057:7;6053:23;6049:32;6046:52;;;6094:1;6091;6084:12;6046:52;6127:9;6121:16;-1:-1:-1;;;;;6152:6:1;6149:30;6146:50;;;6192:1;6189;6182:12;6146:50;6215:22;;6268:4;6260:13;;6256:27;-1:-1:-1;6246:55:1;;6297:1;6294;6287:12;6246:55;6326:2;6320:9;6351:48;6367:31;6395:2;6367:31;:::i;6351:48::-;6422:2;6415:5;6408:17;6462:7;6457:2;6452;6448;6444:11;6440:20;6437:33;6434:53;;;6483:1;6480;6473:12;6434:53;6496:54;6547:2;6542;6535:5;6531:14;6526:2;6522;6518:11;6496:54;:::i;:::-;6569:5;5945:635;-1:-1:-1;;;;;5945:635:1:o;6585:184::-;6643:6;6696:2;6684:9;6675:7;6671:23;6667:32;6664:52;;;6712:1;6709;6702:12;6664:52;6735:28;6753:9;6735:28;:::i;6774:481::-;6852:6;6860;6868;6921:2;6909:9;6900:7;6896:23;6892:32;6889:52;;;6937:1;6934;6927:12;6889:52;6960:28;6978:9;6960:28;:::i;:::-;6950:38;;7039:2;7028:9;7024:18;7011:32;-1:-1:-1;;;;;7058:6:1;7055:30;7052:50;;;7098:1;7095;7088:12;7052:50;7137:58;7187:7;7178:6;7167:9;7163:22;7137:58;:::i;:::-;6774:481;;7214:8;;-1:-1:-1;7111:84:1;;-1:-1:-1;;;;6774:481:1:o;7260:460::-;7345:6;7353;7361;7414:2;7402:9;7393:7;7389:23;7385:32;7382:52;;;7430:1;7427;7420:12;7382:52;7453:28;7471:9;7453:28;:::i;:::-;7443:38;;7532:2;7521:9;7517:18;7504:32;-1:-1:-1;;;;;7551:6:1;7548:30;7545:50;;;7591:1;7588;7581:12;7545:50;7614:49;7655:7;7646:6;7635:9;7631:22;7614:49;:::i;:::-;7604:59;;;7710:2;7699:9;7695:18;7682:32;7672:42;;7260:460;;;;;:::o;7725:773::-;7829:6;7837;7845;7853;7861;7914:3;7902:9;7893:7;7889:23;7885:33;7882:53;;;7931:1;7928;7921:12;7882:53;7954:28;7972:9;7954:28;:::i;:::-;7944:38;;8033:2;8022:9;8018:18;8005:32;-1:-1:-1;;;;;8097:2:1;8089:6;8086:14;8083:34;;;8113:1;8110;8103:12;8083:34;8136:49;8177:7;8168:6;8157:9;8153:22;8136:49;:::i;:::-;8126:59;;8204:37;8237:2;8226:9;8222:18;8204:37;:::i;:::-;8194:47;;8294:2;8283:9;8279:18;8266:32;8250:48;;8323:2;8313:8;8310:16;8307:36;;;8339:1;8336;8329:12;8307:36;;8378:60;8430:7;8419:8;8408:9;8404:24;8378:60;:::i;:::-;7725:773;;;;-1:-1:-1;7725:773:1;;-1:-1:-1;8457:8:1;;8352:86;7725:773;-1:-1:-1;;;7725:773:1:o;8503:684::-;8605:6;8613;8621;8629;8682:3;8670:9;8661:7;8657:23;8653:33;8650:53;;;8699:1;8696;8689:12;8650:53;8722:28;8740:9;8722:28;:::i;:::-;8712:38;;8801:2;8790:9;8786:18;8773:32;-1:-1:-1;;;;;8865:2:1;8857:6;8854:14;8851:34;;;8881:1;8878;8871:12;8851:34;8904:49;8945:7;8936:6;8925:9;8921:22;8904:49;:::i;:::-;8894:59;;8972:37;9005:2;8994:9;8990:18;8972:37;:::i;:::-;8962:47;;9062:2;9051:9;9047:18;9034:32;9018:48;;9091:2;9081:8;9078:16;9075:36;;;9107:1;9104;9097:12;9075:36;;9130:51;9173:7;9162:8;9151:9;9147:24;9130:51;:::i;9192:252::-;9259:6;9267;9320:2;9308:9;9299:7;9295:23;9291:32;9288:52;;;9336:1;9333;9326:12;9288:52;9359:28;9377:9;9359:28;:::i;9634:683::-;9729:6;9737;9745;9798:2;9786:9;9777:7;9773:23;9769:32;9766:52;;;9814:1;9811;9804:12;9766:52;9850:9;9837:23;9827:33;;9911:2;9900:9;9896:18;9883:32;-1:-1:-1;;;;;9975:2:1;9967:6;9964:14;9961:34;;;9991:1;9988;9981:12;9961:34;10029:6;10018:9;10014:22;10004:32;;10074:7;10067:4;10063:2;10059:13;10055:27;10045:55;;10096:1;10093;10086:12;10045:55;10136:2;10123:16;10162:2;10154:6;10151:14;10148:34;;;10178:1;10175;10168:12;10148:34;10231:7;10226:2;10216:6;10213:1;10209:14;10205:2;10201:23;10197:32;10194:45;10191:65;;;10252:1;10249;10242:12;10191:65;10283:2;10279;10275:11;10265:21;;10305:6;10295:16;;;;;9634:683;;;;;:::o;10322:248::-;10390:6;10398;10451:2;10439:9;10430:7;10426:23;10422:32;10419:52;;;10467:1;10464;10457:12;10419:52;-1:-1:-1;;10490:23:1;;;10560:2;10545:18;;;10532:32;;-1:-1:-1;10322:248:1:o;10575:245::-;10654:6;10662;10715:2;10703:9;10694:7;10690:23;10686:32;10683:52;;;10731:1;10728;10721:12;10683:52;-1:-1:-1;;10754:16:1;;10810:2;10795:18;;;10789:25;10754:16;;10789:25;;-1:-1:-1;10575:245:1:o;10825:948::-;10966:6;10974;10982;10990;10998;11051:3;11039:9;11030:7;11026:23;11022:33;11019:53;;;11068:1;11065;11058:12;11019:53;11104:9;11091:23;11081:33;;11133:2;11182;11171:9;11167:18;11154:32;11144:42;;11229:7;11224:2;11213:9;11209:18;11205:32;11195:60;;11251:1;11248;11241:12;11195:60;11275:22;;:::i;:::-;11319:3;11357:2;11346:9;11342:18;11394:3;11383:9;11379:19;11417:7;11413:2;11410:15;11407:35;;;11438:1;11435;11428:12;11407:35;11460:1;11470:165;11484:4;11481:1;11478:11;11470:165;;;11543:17;;11531:30;;11581:12;;;;11613;;;;11504:1;11497:9;11470:165;;;11474:3;11654:5;11644:15;;11678:37;11707:7;11703:2;11678:37;:::i;:::-;10825:948;;;;-1:-1:-1;10825:948:1;;11762:3;11747:19;11734:33;;10825:948;-1:-1:-1;;;;;;;10825:948:1:o;11895:268::-;11947:3;11985:5;11979:12;12012:6;12007:3;12000:19;12028:63;12084:6;12077:4;12072:3;12068:14;12061:4;12054:5;12050:16;12028:63;:::i;:::-;12145:2;12124:15;-1:-1:-1;;12120:29:1;12111:39;;;;12152:4;12107:50;;11895:268;-1:-1:-1;;11895:268:1:o;12168:184::-;12209:3;12247:5;12241:12;12262:52;12307:6;12302:3;12295:4;12288:5;12284:16;12262:52;:::i;:::-;12330:16;;;;;12168:184;-1:-1:-1;;12168:184:1:o;12357:692::-;12406:3;12447:5;12441:12;12476:36;12502:9;12476:36;:::i;:::-;12531:1;12548:18;;;12575:104;;;;12693:1;12688:355;;;;12541:502;;12575:104;-1:-1:-1;;12608:24:1;;12596:37;;12653:16;;;;-1:-1:-1;12575:104:1;;12688:355;12719:5;12716:1;12709:16;12748:4;12793:2;12790:1;12780:16;12818:1;12832:165;12846:6;12843:1;12840:13;12832:165;;;12924:14;;12911:11;;;12904:35;12967:16;;;;12861:10;;12832:165;;;12836:3;;;13026:6;13021:3;13017:16;13010:23;;12541:502;;;;;12357:692;;;;:::o;13727:271::-;13910:6;13902;13897:3;13884:33;13866:3;13936:16;;13961:13;;;13936:16;13727:271;-1:-1:-1;13727:271:1:o;14003:274::-;14132:3;14170:6;14164:13;14186:53;14232:6;14227:3;14220:4;14212:6;14208:17;14186:53;:::i;:::-;14255:16;;;;;14003:274;-1:-1:-1;;14003:274:1:o;14282:194::-;14408:3;14433:37;14466:3;14458:6;14433:37;:::i;14762:543::-;15039:3;15077:6;15071:13;15093:53;15139:6;15134:3;15127:4;15119:6;15115:17;15093:53;:::i;:::-;-1:-1:-1;;;15168:16:1;;;15193:43;;;15252:47;15296:1;15285:13;;15277:6;15252:47;:::i;15310:1608::-;-1:-1:-1;;;16060:43:1;;-1:-1:-1;;;16128:1:1;16119:11;;16112:33;16168:13;;-1:-1:-1;;16190:62:1;16168:13;16240:2;16231:12;;16224:4;16212:17;;16190:62;:::i;:::-;16316:66;16311:2;16271:16;;;16303:11;;;16296:87;16412:66;16407:2;16399:11;;16392:87;16504:13;;16526:63;16504:13;16575:2;16567:11;;16560:4;16548:17;;16526:63;:::i;:::-;-1:-1:-1;;;16649:2:1;16608:17;;;;16641:11;;;16634:61;16720:13;;16742:63;16720:13;16791:2;16783:11;;16776:4;16764:17;;16742:63;:::i;:::-;-1:-1:-1;;;16865:2:1;16824:17;;;;16857:11;;;16850:35;16909:2;16901:11;;15310:1608;-1:-1:-1;;;;;15310:1608:1:o;16923:2760::-;17379:66;17367:79;;17476:66;17471:2;17462:12;;17455:88;17573:66;17568:2;17559:12;;17552:88;17670:66;17665:2;17656:12;;17649:88;17768:66;17762:3;17753:13;;17746:89;17866:66;17860:3;17851:13;;17844:89;17964:66;17958:3;17949:13;;17942:89;18062:66;18056:3;18047:13;;18040:89;18160:66;18154:3;18145:13;;18138:89;18258:66;18252:3;18243:13;;18236:89;18356:66;18350:3;18341:13;;18334:89;18454:66;18448:3;18439:13;;18432:89;18552:66;18546:3;18537:13;;18530:89;18650:34;18644:3;18635:13;;18628:57;18716:66;18710:3;18701:13;;18694:89;18814:66;18808:3;18799:13;;18792:89;18912:66;18906:3;18897:13;;18890:89;19010:66;19004:3;18995:13;;18988:89;19108:34;19102:3;19093:13;;19086:57;19174:66;19168:3;19159:13;;19152:89;19272:66;19266:3;19257:13;;19250:89;19370:34;19364:3;19355:13;;19348:57;19436:34;19430:3;19421:13;;19414:57;-1:-1:-1;;;19496:3:1;19487:13;;19480:51;-1:-1:-1;19547:130:1;19572:104;19597:78;19627:47;19669:3;19660:13;;19652:6;19627:47;:::i;:::-;-1:-1:-1;;;13119:19:1;;13163:1;13154:11;;13054:117;19597:78;19589:6;19572:104;:::i;:::-;19564:6;19547:130;:::i;19688:446::-;19950:29;19945:3;19938:42;19920:3;20009:6;20003:13;20025:62;20080:6;20075:2;20070:3;20066:12;20059:4;20051:6;20047:17;20025:62;:::i;:::-;20107:16;;;;20125:2;20103:25;;19688:446;-1:-1:-1;;19688:446:1:o;20139:448::-;20401:31;20396:3;20389:44;20371:3;20462:6;20456:13;20478:62;20533:6;20528:2;20523:3;20519:12;20512:4;20504:6;20500:17;20478:62;:::i;:::-;20560:16;;;;20578:2;20556:25;;20139:448;-1:-1:-1;;20139:448:1:o;22058:499::-;-1:-1:-1;;;;;22327:15:1;;;22309:34;;22379:15;;22374:2;22359:18;;22352:43;22426:2;22411:18;;22404:34;;;22474:3;22469:2;22454:18;;22447:31;;;22252:4;;22495:56;;22531:19;;22523:6;22495:56;:::i;:::-;22487:64;22058:499;-1:-1:-1;;;;;;22058:499:1:o;23215:228::-;23362:2;23351:9;23344:21;23325:4;23382:55;23433:2;23422:9;23418:18;23410:6;23382:55;:::i;24159:337::-;24361:2;24343:21;;;24400:2;24380:18;;;24373:30;-1:-1:-1;;;24434:2:1;24419:18;;24412:43;24487:2;24472:18;;24159:337::o;24501:414::-;24703:2;24685:21;;;24742:2;24722:18;;;24715:30;24781:34;24776:2;24761:18;;24754:62;-1:-1:-1;;;24847:2:1;24832:18;;24825:48;24905:3;24890:19;;24501:414::o;32263:356::-;32465:2;32447:21;;;32484:18;;;32477:30;32543:34;32538:2;32523:18;;32516:62;32610:2;32595:18;;32263:356::o;33455:411::-;33657:2;33639:21;;;33696:2;33676:18;;;33669:30;33735:34;33730:2;33715:18;;33708:62;-1:-1:-1;;;33801:2:1;33786:18;;33779:45;33856:3;33841:19;;33455:411::o;34978:413::-;35180:2;35162:21;;;35219:2;35199:18;;;35192:30;35258:34;35253:2;35238:18;;35231:62;-1:-1:-1;;;35324:2:1;35309:18;;35302:47;35381:3;35366:19;;34978:413::o;36152:346::-;36354:2;36336:21;;;36393:2;36373:18;;;36366:30;-1:-1:-1;;;36427:2:1;36412:18;;36405:52;36489:2;36474:18;;36152:346::o;37550:662::-;37831:6;37819:19;;37801:38;;-1:-1:-1;;;;;37875:32:1;;37870:2;37855:18;;37848:60;37895:3;37939:2;37924:18;;37917:31;;;-1:-1:-1;;37971:56:1;;38007:19;;37999:6;37971:56;:::i;:::-;38077:6;38070:14;38063:22;38058:2;38047:9;38043:18;38036:50;38135:9;38127:6;38123:22;38117:3;38106:9;38102:19;38095:51;38163:43;38199:6;38191;38163:43;:::i;:::-;38155:51;37550:662;-1:-1:-1;;;;;;;;37550:662:1:o;38217:728::-;38484:6;38476;38472:19;38461:9;38454:38;38528:3;38523:2;38512:9;38508:18;38501:31;38435:4;38555:56;38606:3;38595:9;38591:19;38583:6;38555:56;:::i;:::-;-1:-1:-1;;;;;38651:6:1;38647:31;38642:2;38631:9;38627:18;38620:59;38727:9;38719:6;38715:22;38710:2;38699:9;38695:18;38688:50;38762:6;38754;38747:22;38816:6;38808;38803:2;38795:6;38791:15;38778:45;38869:1;38864:2;38855:6;38847;38843:19;38839:28;38832:39;38936:2;38929;38925:7;38920:2;38912:6;38908:15;38904:29;38896:6;38892:42;38888:51;38880:59;;;38217:728;;;;;;;;:::o;38950:577::-;39207:6;39199;39195:19;39184:9;39177:38;39251:3;39246:2;39235:9;39231:18;39224:31;39158:4;39278:56;39329:3;39318:9;39314:19;39306:6;39278:56;:::i;:::-;-1:-1:-1;;;;;39374:6:1;39370:31;39365:2;39354:9;39350:18;39343:59;39450:9;39442:6;39438:22;39433:2;39422:9;39418:18;39411:50;39478:43;39514:6;39506;39478:43;:::i;:::-;39470:51;38950:577;-1:-1:-1;;;;;;;38950:577:1:o;39532:1520::-;39878:6;39870;39866:19;39855:9;39848:38;39829:4;39905:2;39943:3;39938:2;39927:9;39923:18;39916:31;39967:1;40000:6;39994:13;40030:36;40056:9;40030:36;:::i;:::-;40103:6;40097:3;40086:9;40082:19;40075:35;40129:3;40151:1;40183:2;40172:9;40168:18;40200:1;40195:122;;;;40331:1;40326:354;;;;40161:519;;40195:122;-1:-1:-1;;40243:24:1;;40223:18;;;40216:52;40303:3;40288:19;;;-1:-1:-1;40195:122:1;;40326:354;40357:6;40354:1;40347:17;40405:2;40402:1;40392:16;40430:1;40444:180;40458:6;40455:1;40452:13;40444:180;;;40551:14;;40527:17;;;40523:26;;40516:50;40594:16;;;;40473:10;;40444:180;;;40648:17;;40644:26;;;-1:-1:-1;;40161:519:1;;;;;;40725:9;40720:3;40716:19;40711:2;40700:9;40696:18;40689:47;40759:40;40795:3;40787:6;40759:40;:::i;:::-;40745:54;;;40808;40858:2;40847:9;40843:18;40835:6;-1:-1:-1;;;;;11852:31:1;11840:44;;11778:112;40808:54;-1:-1:-1;;;;;11852:31:1;;40921:3;40906:19;;11840:44;40975:9;40967:6;40963:22;40957:3;40946:9;40942:19;40935:51;41003:43;41039:6;41031;41003:43;:::i;:::-;40995:51;39532:1520;-1:-1:-1;;;;;;;;;39532:1520:1:o;41745:1009::-;42068:25;;;42112:2;42130:18;;;42123:34;;;42055:3;42040:19;;;42192:2;42177:18;;42237:6;42013:4;42271:167;42285:4;42282:1;42279:11;42271:167;;;42344:13;;42332:26;;42378:12;;;;42413:15;;;;42305:1;42298:9;42271:167;;;42275:3;;;42475;42464:9;42460:19;42527:6;42553:1;42563:185;42579:4;42574:3;42571:13;42563:185;;;42644:15;;42630:30;;42682:14;;;;42721:17;;;;42603:1;42594:11;42563:185;;;42567:3;;;;41745:1009;;;;;;;:::o;42759:252::-;42831:2;42825:9;42873:3;42861:16;;-1:-1:-1;;;;;42892:34:1;;42928:22;;;42889:62;42886:88;;;42954:18;;:::i;:::-;42990:2;42983:22;42759:252;:::o;43016:275::-;43087:2;43081:9;43152:2;43133:13;;-1:-1:-1;;43129:27:1;43117:40;;-1:-1:-1;;;;;43172:34:1;;43208:22;;;43169:62;43166:88;;;43234:18;;:::i;:::-;43270:2;43263:22;43016:275;;-1:-1:-1;43016:275:1:o;43296:186::-;43344:4;-1:-1:-1;;;;;43369:6:1;43366:30;43363:56;;;43399:18;;:::i;:::-;-1:-1:-1;43465:2:1;43444:15;-1:-1:-1;;43440:29:1;43471:4;43436:40;;43296:186::o;43487:128::-;43527:3;43558:1;43554:6;43551:1;43548:13;43545:39;;;43564:18;;:::i;:::-;-1:-1:-1;43600:9:1;;43487:128::o;43620:120::-;43660:1;43686;43676:35;;43691:18;;:::i;:::-;-1:-1:-1;43725:9:1;;43620:120::o;43745:168::-;43785:7;43851:1;43847;43843:6;43839:14;43836:1;43833:21;43828:1;43821:9;43814:17;43810:45;43807:71;;;43858:18;;:::i;:::-;-1:-1:-1;43898:9:1;;43745:168::o;43918:125::-;43958:4;43986:1;43983;43980:8;43977:34;;;43991:18;;:::i;:::-;-1:-1:-1;44028:9:1;;43918:125::o;44048:258::-;44120:1;44130:113;44144:6;44141:1;44138:13;44130:113;;;44220:11;;;44214:18;44201:11;;;44194:39;44166:2;44159:10;44130:113;;;44261:6;44258:1;44255:13;44252:48;;;-1:-1:-1;;44296:1:1;44278:16;;44271:27;44048:258::o;44311:380::-;44390:1;44386:12;;;;44433;;;44454:61;;44508:4;44500:6;44496:17;44486:27;;44454:61;44561:2;44553:6;44550:14;44530:18;44527:38;44524:161;;;44607:10;44602:3;44598:20;44595:1;44588:31;44642:4;44639:1;44632:15;44670:4;44667:1;44660:15;44524:161;;44311:380;;;:::o;44696:135::-;44735:3;-1:-1:-1;;44756:17:1;;44753:43;;;44776:18;;:::i;:::-;-1:-1:-1;44823:1:1;44812:13;;44696:135::o;44836:112::-;44868:1;44894;44884:35;;44899:18;;:::i;:::-;-1:-1:-1;44933:9:1;;44836:112::o;44953:127::-;45014:10;45009:3;45005:20;45002:1;44995:31;45045:4;45042:1;45035:15;45069:4;45066:1;45059:15;45085:127;45146:10;45141:3;45137:20;45134:1;45127:31;45177:4;45174:1;45167:15;45201:4;45198:1;45191:15;45217:127;45278:10;45273:3;45269:20;45266:1;45259:31;45309:4;45306:1;45299:15;45333:4;45330:1;45323:15;45349:127;45410:10;45405:3;45401:20;45398:1;45391:31;45441:4;45438:1;45431:15;45465:4;45462:1;45455:15;45481:131;-1:-1:-1;;;;;45556:31:1;;45546:42;;45536:70;;45602:1;45599;45592:12;45617:131;-1:-1:-1;;;;;;45691:32:1;;45681:43;;45671:71;;45738:1;45735;45728:12

Swarm Source

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