Contract 0x3ad06145c9ba9e9e089c997694abcde57f32bfb3

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3dbf60abfa3a76f89c4f0056cd2c106e6960c86c39123e43e27ebe20aef42c5eOpen Crates361420402022-11-27 18:56:168 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.012852413552 32.465919844
0x46dd5e5bdeb8f7a1e376fcf2837e13e244cb99dbfc89f70ff256873dbf1c68daOpen Crates361419252022-11-27 18:52:188 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.013022362403 33.47375641
0xa66a83dca06a1299f11a9d8388397de47bc20478dc538606338a309785945314Open Crates361418702022-11-27 18:50:248 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.015241846758 37.263304636
0x999a802a51dad60df234f5ccc356307d18a2ad78f1f7a743fa523ac0ea887349Open Crates361418262022-11-27 18:47:418 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.01292828702 33.419034107
0xcf38f774b6e4e58b3e84880bdb33f4f72c5d549062bca7a2f6260645c0ddb939Open Crates361417372022-11-27 18:44:298 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.013276117548 32.453041892
0x2902c01a05a39a618ab2ab87cb9d5c16bfc5c178f011809a2668bf1f14336327Open Crates361416972022-11-27 18:43:098 days 6 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.045662095927 33.183432829
0x8776037a7d72b61c2dde2ae2f44ee1f7211f8956cc48449c3db80c8a61b287baOpen Crates361416302022-11-27 18:40:478 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.012690400457 32.258836474
0xf73e7b7642434f3f0391d27fc6a25d75ae65045e98b71aba17df7196d78e4dd7Open Crates361415952022-11-27 18:39:368 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.012348360006 32.50903004
0x351fb55b843e42c6698ee7f4dd1063d82fdc5b2197b80ab513d6144170706b7eOpen Crates361415952022-11-27 18:39:368 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.013266089924 32.50903004
0x1cf3e3e7fd97b69c0df1072d4873370967193a51684af800aa8c454979355673Open Crates361415712022-11-27 18:38:488 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.01241766483 32.491155694
0x880bad67e0b0b8aec6866404d3cb1072ebc94dcc0b9c4900b7430b021dbaeb87Open Crates361415292022-11-27 18:37:208 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.022309165219 34.849739389
0xdf39173f784afba4c4c7354ee2edd86847747ee219eb6d4cd0dde9276feb10c7Open Crates361415022022-11-27 18:36:228 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.015185209607 39.072487295
0x999387065742a592e857dc5e54f44f9f1fc5fa5bf24a66d0be52dc7d7e89da93Open Crates361414972022-11-27 18:36:128 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.225427654006 38.053059107
0x6b767f26cd4ab169032e1d59edaf9172bec2e8a70f32aaa8482cffae1ad06effOpen Crates361414702022-11-27 18:35:188 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.014176992537 36.030407518
0xf554fbf53b0bc50e54ec00bba695125d1b33b96d65da71c6b11114ecd4bcbe03Open Crates361414622022-11-27 18:35:028 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.013915471374 35.765616243
0xa56d536736319a4130e93d39976b6d1c1576762f20ed045ea0261b6bf6a7d37dOpen Crates361414572022-11-27 18:34:528 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.040847758579 35.69500599
0xd974884ec6c4cd74f0344856f1ca5ca5f4654be00f0c4a23bde1c8c117e263daOpen Crates361414412022-11-27 18:34:208 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.01262550938 33.011406139
0x8b9b418ff46e0f666f7c8bca48ed4eb78ae37c79a0ebd78efcb151834b21f67aOpen Crates361414412022-11-27 18:34:208 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.012987974619 33.011406139
0x52ffad817346a1fabb35761dca00cca6ec5876341a5c8e9010fca412b2f24b99Open Crates361414122022-11-27 18:33:188 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.086048388479 34.017620896
0x312cd45136f3322f2ec15298f29c57df6b3cd2e277a75605206b44a49b4ed14fOpen Crates361414122022-11-27 18:33:188 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.086251745817 34.017620896
0x36d78ec5b32defcfec6edb5a264877cba97b25e8d14a044a81b9a1f927b00836Open Crates361414122022-11-27 18:33:188 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.046400885342 34.017620896
0xd815e905b91e2d2e28ea44d357b67f28f3f2ff5afcc61445cae427c533ffd216Open Crates361414102022-11-27 18:33:148 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.013230254307 33.597574081
0xaa121d0b52e8dd1316e092e1504c59faf626752a3be27596938e6145dd831f3fOpen Crates361413732022-11-27 18:31:568 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.017062526219 43.343196861
0x3286271289ea8ff082f196d573f617a0ff43b1bd7eb4d83053db7373a2283223Open Crates361413732022-11-27 18:31:568 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.017049696633 43.343196861
0x57f60081bfc87425435f666a5e2839fc3cd9ee989feb88da446a672a5c60383cOpen Crates361413532022-11-27 18:30:368 days 7 hrs ago0x9fe4ccb12ab97015aeab6f8ff5d3bfe08d742f1f IN  0x3ad06145c9ba9e9e089c997694abcde57f32bfb30 MATIC0.01725629402 43.793032268
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AssetManager

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-11-20
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.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);
}

/**
    @author The Calystral Team
    @title The RegistrableContractState's Interface
*/
interface IRegistrableContractState is IERC165 {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /// @dev MUST emit when the contract is set to an active state.
    event Activated();
    /// @dev MUST emit when the contract is set to an inactive state.
    event Inactivated();

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the contract state to active.
        @dev Sets the contract state to active.
    */
    function setActive() external;

    /**
        @notice Sets the contract state to inactive.
        @dev Sets the contract state to inactive.
    */
    function setInactive() external;

    /**
        @dev Sets the registry contract object.
        Reverts if the registryAddress doesn't implement the IRegistry interface.
        @param registryAddress The registry address
    */
    function setRegistry(address registryAddress) external;

    /**
        @notice Returns the current contract state.
        @dev Returns the current contract state.
        @return The current contract state (true == active; false == inactive)
    */
    function getIsActive() external view returns (bool);

    /**
        @notice Returns the Registry address.
        @dev Returns the Registry address.
        @return The Registry address
    */
    function getRegistryAddress() external view returns (address);

    /**
        @notice Returns the current address associated with `key` identifier.
        @dev Look-up in the Registry.
        Returns the current address associated with `key` identifier.
        @return The key identifier
    */
    function getContractAddress(uint256 key) external view returns (address);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

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

/**
    @author The Calystral Team
    @title The Registry's Interface
*/
interface IRegistry is IRegistrableContractState {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /**
        @dev MUST emit when an entry in the Registry is set or updated.
        The `key` argument MUST be the key of the entry which is set or updated.
        The `value` argument MUST be the address of the entry which is set or updated.
    */
    event EntrySet(uint256 indexed key, address value);
    /**
        @dev MUST emit when an entry in the Registry is removed.
        The `key` argument MUST be the key of the entry which is removed.
        The `value` argument MUST be the address of the entry which is removed.
    */
    event EntryRemoved(uint256 indexed key, address value);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the MultiSigAdmin contract as Registry entry 1.
        @dev Sets the MultiSigAdmin contract as Registry entry 1.
        @param msaAddress The contract address of the MultiSigAdmin
    */
    function initializeMultiSigAdmin(address msaAddress) external;

    /**
        @notice Checks if the registry Map contains the key.
        @dev Returns true if the key is in the registry map. O(1).
        @param key  The key to search for
        @return     The boolean result
    */
    function contains(uint256 key) external view returns (bool);

    /**
        @notice Returns the registry map length.
        @dev Returns the number of key-value pairs in the registry map. O(1).
        @return     The registry map length
    */
    function length() external view returns (uint256);

    /**
        @notice Returns the key-value pair stored at position `index` in the registry map.
        @dev Returns the key-value pair stored at position `index` in the registry map. O(1).
        Note that there are no guarantees on the ordering of entries inside the
        array, and it may change when more entries are added or removed.
        Requirements:
        - `index` must be strictly less than {length}.
        @param index    The position in the registry map
        @return         The key-value pair as a tuple
    */
    function at(uint256 index) external view returns (uint256, address);

    /**
        @notice Tries to return the value associated with `key`.
        @dev Tries to return the value associated with `key`.  O(1).
        Does not revert if `key` is not in the registry map.
        @param key    The key to search for
        @return       The key-value pair as a tuple
    */
    function tryGet(uint256 key) external view returns (bool, address);

    /**
        @notice Returns the value associated with `key`.
        @dev Returns the value associated with `key`.  O(1).
        Requirements:
        - `key` must be in the registry map.
        @param key    The key to search for
        @return       The contract address
    */
    function get(uint256 key) external view returns (address);

    /**
        @notice Returns all indices, keys, addresses.
        @dev Returns all indices, keys, addresses as three seperate arrays.
        @return Indices, keys, addresses
    */
    function getAll()
        external
        view
        returns (
            uint256[] memory,
            uint256[] memory,
            address[] memory
        );

    /**
        @notice Adds a key-value pair to a map, or updates the value for an existing
        key.
        @dev Adds a key-value pair to the registry map, or updates the value for an existing
        key. O(1).
        Returns true if the key was added to the registry map, that is if it was not
        already present.
        @param key    The key as an identifier
        @param value  The address of the contract
        @return       Success as a bool
    */
    function set(uint256 key, address value) external returns (bool);

    /**
        @notice Removes a value from the registry map.
        @dev Removes a value from the registry map. O(1).
        Returns true if the key was removed from the registry map, that is if it was present.
        @param key    The key as an identifier
        @return       Success as a bool
    */
    function remove(uint256 key) external returns (bool);

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param key    The key as an identifier
    */
    function setContractActiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param contractAddress The contract's address
    */
    function setContractActiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state active.
        @dev Sets all contracts within the registry to state active.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsActive() external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param key    The key as an identifier
    */
    function setContractInactiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param contractAddress The contract's address
    */
    function setContractInactiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state inactive.
        @dev Sets all contracts within the registry to state inactive.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsInactive() external;
}

/**
    @author The Calystral Team
    @title A helper parent contract: Pausable & Registry
*/
contract RegistrableContractState is IRegistrableContractState, ERC165 {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Current contract state
    bool private _isActive;
    /// @dev Current registry pointer
    address private _registryAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isActive() {
        _isActiveCheck();
        _;
    }

    modifier isAuthorizedAdmin() {
        _isAuthorizedAdmin();
        _;
    }

    modifier isAuthorizedAdminOrRegistry() {
        _isAuthorizedAdminOrRegistry();
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract.
        Registers all implemented interfaces.
        Inheriting contracts are INACTIVE by default.
    */
    constructor(address registryAddress) {
        _registryAddress = registryAddress;

        _registerInterface(type(IRegistrableContractState).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function setActive() external override isAuthorizedAdminOrRegistry {
        _isActive = true;

        emit Activated();
    }

    function setInactive() external override isAuthorizedAdminOrRegistry {
        _isActive = false;

        emit Inactivated();
    }

    function setRegistry(address registryAddress)
        external
        override
        isAuthorizedAdmin
    {
        _registryAddress = registryAddress;

        try
            _registryContract().supportsInterface(type(IRegistry).interfaceId)
        returns (bool supportsInterface) {
            require(
                supportsInterface,
                "The provided contract does not implement the Registry interface"
            );
        } catch {
            revert(
                "The provided contract does not implement the Registry interface"
            );
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function getIsActive() public view override returns (bool) {
        return _isActive;
    }

    function getRegistryAddress() public view override returns (address) {
        return _registryAddress;
    }

    function getContractAddress(uint256 key)
        public
        view
        override
        returns (address)
    {
        return _registryContract().get(key);
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Returns the target Registry object.
        @return The target Registry object
    */
    function _registryContract() internal view returns (IRegistry) {
        return IRegistry(_registryAddress);
    }

    /**
        @dev Checks if the contract is in an active state.
        Reverts if the contract is INACTIVE.
    */
    function _isActiveCheck() internal view {
        require(_isActive == true, "The contract is not active");
    }

    /**
        @dev Checks if the msg.sender is the Admin.
        Reverts if msg.sender is not the Admin.
    */
    function _isAuthorizedAdmin() internal view {
        require(msg.sender == getContractAddress(1), "Unauthorized call");
    }

    /**
        @dev Checks if the msg.sender is the Admin or the Registry.
        Reverts if msg.sender is not the Admin or the Registry.
    */
    function _isAuthorizedAdminOrRegistry() internal view {
        require(
            msg.sender == _registryAddress ||
                msg.sender == getContractAddress(1),
            "Unauthorized call"
        );
    }
}

/**
    @title ERC-1155 Multi Token Standard
    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
    Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    /* is ERC165 */
    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_id` argument MUST be the token type being transferred.
        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _value
    );

    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_ids` argument MUST be the list of tokens being transferred.
        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _values
    );

    /**
        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).
    */
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external;

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id)
        external
        view
        returns (uint256);

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);
}

/**
    @title ERC-1155 Mixed Fungible Token Standard
 */
interface IERC1155MixedFungible {
    /**
        @notice Returns true for non-fungible token id.
        @dev    Returns true for non-fungible token id.
        @param _id  Id of the token
        @return     If a token is non-fungible
     */
    function isNonFungible(uint256 _id) external pure returns (bool);

    /**
        @notice Returns true for fungible token id.
        @dev    Returns true for fungible token id.
        @param _id  Id of the token
        @return     If a token is fungible
     */
    function isFungible(uint256 _id) external pure returns (bool);

    /**
        @notice Returns the mint# of a token type.
        @dev    Returns the mint# of a token type.
        @param _id  Id of the token
        @return     The mint# of a token type.
     */
    function getNonFungibleIndex(uint256 _id) external pure returns (uint256);

    /**
        @notice Returns the base type of a token id.
        @dev    Returns the base type of a token id.
        @param _id  Id of the token
        @return     The base type of a token id.
     */
    function getNonFungibleBaseType(uint256 _id)
        external
        pure
        returns (uint256);

    /**
        @notice Returns true if the base type of the token id is a non-fungible base type.
        @dev    Returns true if the base type of the token id is a non-fungible base type.
        @param _id  Id of the token
        @return     The non-fungible base type info as bool
     */
    function isNonFungibleBaseType(uint256 _id) external pure returns (bool);

    /**
        @notice Returns true if the base type of the token id is a fungible base type.
        @dev    Returns true if the base type of the token id is a fungible base type.
        @param _id  Id of the token
        @return     The fungible base type info as bool
     */
    function isNonFungibleItem(uint256 _id) external pure returns (bool);

    /**
        @notice Returns the owner of a token.
        @dev    Returns the owner of a token.
        @param _id  Id of the token
        @return     The owner address
     */
    function ownerOf(uint256 _id) external view returns (address);
}

/**
    @author The Calystral Team
    @title The ERC1155CalystralMixedFungibleMintable' Interface
*/
interface IERC1155CalystralMixedFungibleMintable {
    /**
        @dev MUST emit when a release timestamp is set or updated.
        The `typeId` argument MUST be the id of a type.
        The `timestamp` argument MUST be the timestamp of the release in seconds.
    */
    event OnReleaseTimestamp(uint256 indexed typeId, uint256 timestamp);

    /**
        @notice Updates the metadata base URI.
        @dev Updates the `_metadataBaseURI`.
        @param uri The metadata base URI
    */
    function updateMetadataBaseURI(string calldata uri) external;

    /**
        @notice Creates a non-fungible type.
        @dev Creates a non-fungible type. This function only creates the type and is not used for minting.
        The type also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Creates a fungible type.
        @dev Creates a fungible type. This function only creates the type and is not used for minting.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Mints a non-fungible type.
        @dev Mints a non-fungible type.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintNonFungible(uint256 typeId, address[] calldata toArr) external;

    /**
        @notice Mints a fungible type.
        @dev Mints a fungible type.
        Reverts if array lengths are unequal.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintFungible(
        uint256 typeId,
        address[] calldata toArr,
        uint256[] calldata quantitiesArr
    ) external;

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if balance of holder for token `_id` is lower than the `_value` sent.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _id          ID of the token type
        @param _value       Transfer amount
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if length of `_ids` is not the same as length of `_values`.
        Reverts if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _ids         IDs of each token type (order and length must match _values array)
        @param _values      Transfer amounts per token type (order and length must match _ids array)
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeBatchTransferFrom(
        bytes memory signature,
        address signer,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Burns fungible and/or non-fungible tokens.
        @dev Sends FTs and/or NFTs to 0x0 address.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        Emits the `TransferBatch` event where the `to` argument is the 0x0 address.
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer The signing account. This SHOULD be the owner of the asset
        @param ids An array of token Ids which should be burned
        @param values An array of amounts which should be burned. The order matches the order in the ids array
        @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaBatchBurn(
        bytes memory signature,
        address signer,
        uint256[] calldata ids,
        uint256[] calldata values,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        @param signature    The signature of the signing account as proof for execution allowance
        @param signer       The signing account. This SHOULD be the owner of the asset
        @param _operator    Address to add to the set of authorized operators
        @param _approved    True if the operator is approved, false to revoke approval
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSetApprovalForAll(
        bytes memory signature,
        address signer,
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Sets a release timestamp.
        @dev Sets a release timestamp.
        Reverts if `timestamp` == 0.
        Reverts if the `typeId` is released already.
        @param typeId       The type which should be set or updated
        @param timestamp    The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function setReleaseTimestamp(uint256 typeId, uint256 timestamp) external;

    /**
        @notice Get the release timestamp of a type.
        @dev Get the release timestamp of a type.
        @return The release timestamp of a type.
    */
    function getReleaseTimestamp(uint256 typeId)
        external
        view
        returns (uint256);

    /**
        @notice Get all existing type Ids.
        @dev Get all existing type Ids.
        @return An array of all existing type Ids.
    */
    function getTypeIds() external view returns (uint256[] memory);

    /**
        @notice Get a specific type Id.
        @dev Get a specific type Id.
        Reverts if `typeNonce` is 0 or if it does not exist.
        @param  typeNonce The type nonce for which the id is requested
        @return A specific type Id.
    */
    function getTypeId(uint256 typeNonce) external view returns (uint256);

    /**
        @notice Get all non-fungible assets for a specific user.
        @dev Get all non-fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
    */
    function getNonFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Get all fungible assets for a specific user.
        @dev Get all fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
                An array for the amount owned of each Id
    */
    function getFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory, uint256[] memory);

    /**
        @notice Get the type nonce.
        @dev Get the type nonce.
        @return The type nonce.
    */
    function getTypeNonce() external view returns (uint256);

    /**
        @notice The amount of tokens that have been minted of a specific type.
        @dev    The amount of tokens that have been minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The minted amount
    */
    function getMintedSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice The amount of tokens that can be minted of a specific type.
        @dev    The amount of tokens that can be minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The maximum mintable amount
    */
    function getMaxSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice Get the burn nonce of a specific user.
        @dev    Get the burn nonce of a specific user / signer.
        @param  signer The requested signer
        @return The burn nonce of a specific user
    */
    function getMetaNonce(address signer) external view returns (uint256);
}

/**
    @author The Calystral Team
    @title The Assets' Interface
*/
interface IAssets is
    IERC1155,
    IERC1155MixedFungible,
    IERC1155CalystralMixedFungibleMintable,
    IRegistrableContractState
{
    /**
        @dev MUST emit when any property type is created.
        The `propertyId` argument MUST be the id of a property.
        The `name` argument MUST be the name of this specific id.
        The `propertyType` argument MUST be the property type.
    */
    event OnCreateProperty(
        uint256 propertyId,
        string name,
        PropertyType indexed propertyType
    );
    /**
        @dev MUST emit when an int type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256 value
    );
    /**
        @dev MUST emit when an string type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateStringProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        string value
    );
    /**
        @dev MUST emit when an address type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address value
    );
    /**
        @dev MUST emit when an byte type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateByteProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        bytes32 value
    );
    /**
        @dev MUST emit when an int array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256[] value
    );
    /**
        @dev MUST emit when an address array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address[] value
    );

    /// @dev Enum representing all existing property types that can be used.
    enum PropertyType {
        INT,
        STRING,
        ADDRESS,
        BYTE,
        INTARRAY,
        ADDRESSARRAY
    }

    /**
        @notice Creates a property of type int.
        @dev Creates a property of type int.
        @param name The name for this property
        @return     The property id
    */
    function createIntProperty(string calldata name) external returns (uint256);

    /**
        @notice Creates a property of type string.
        @dev Creates a property of type string.
        @param name The name for this property
        @return     The property id
    */
    function createStringProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address.
        @dev Creates a property of type address.
        @param name The name for this property
        @return     The property id
    */
    function createAddressProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type byte.
        @dev Creates a property of type byte.
        @param name The name for this property
        @return     The property id
    */
    function createByteProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type int array.
        @dev Creates a property of type int array.
        @param name The name for this property
        @return     The property id
    */
    function createIntArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address array.
        @dev Creates a property of type address array.
        @param name The name for this property
        @return     The property id
    */
    function createAddressArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Updates an existing int property for the passed value.
        @dev Updates an existing int property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256 value
    ) external;

    /**
        @notice Updates an existing string property for the passed value.
        @dev Updates an existing string property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateStringProperty(
        uint256 tokenId,
        uint256 propertyId,
        string calldata value
    ) external;

    /**
        @notice Updates an existing address property for the passed value.
        @dev Updates an existing address property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressProperty(
        uint256 tokenId,
        uint256 propertyId,
        address value
    ) external;

    /**
        @notice Updates an existing byte property for the passed value.
        @dev Updates an existing byte property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateByteProperty(
        uint256 tokenId,
        uint256 propertyId,
        bytes32 value
    ) external;

    /**
        @notice Updates an existing int array property for the passed value.
        @dev Updates an existing int array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256[] calldata value
    ) external;

    /**
        @notice Updates an existing address array property for the passed value.
        @dev Updates an existing address array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        address[] calldata value
    ) external;

    /**
        @notice Get the property type of a property.
        @dev Get the property type of a property.
        @return The property type
    */
    function getPropertyType(uint256 propertyId)
        external
        view
        returns (PropertyType);

    /**
        @notice Get the count of available properties.
        @dev Get the count of available properties.
        @return The property count
    */
    function getPropertyCounter() external view returns (uint256);
}

/**
    @author The Calystral Team
    @title A contract vault that keeps anomalies secured
*/
interface IAnomalyVault is IRegistrableContractState {
    /**
        @notice Frees an anomaly based on chance or guaranteed if mint#0 Helloween crate.
        @dev Frees an anomaly based on chance or guaranteed if mint#0 Helloween crate.
        @param recipient    The original owner of the crate
        @param typeId       Type Id of the crate used to check for mint#0 crate
    */
    function free_an_anomaly(
        address recipient,
        uint256 typeId,
        bytes memory seed
    ) external;

    /**
        @dev Returns the count of discovered anomalies.
        @return Count of anomalies discovered
    */
    function _getdiscoveredSilverAnomaliesCount() external returns (uint256);
}

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(
            uint256(s) <=
                0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
            "ECDSA: invalid signature 's' value"
        );
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }
}

/**
    @author The Calystral Team
    @title A contract for managing the SynergyOfSerraAssets contract
*/
contract AssetManager is RegistrableContractState {
    /*==============================
    =          CONSTANTS           =
    ==============================*/
    /// @dev 1^18 decimals for fungible assets.
    uint256 public constant DECIMALS = 1e18;
    /// @dev The total amount of cards within one booster.
    uint256 public constant CARDS_PER_BOOSTER = 6;
    /// @dev The token type id of the Base Set Crate.
    uint256 public constant BASE_SET_CRATE_TYPEID =
        340282366920938463463374607431768211456;
    /// @dev The token type id of the Transcendent Set Crate.
    uint256 public constant TRANSCENDENT_SET_CRATE_TYPEID =
        680564733841876926926749214863536422912;
    /// @dev The token type id of the Ticket to Serra.
    uint256 public constant TICKET_TO_SERRA_BASETYPEID =
        57896044618658097711785492504343953927655839433583097410118915826251869454336;
    /// @dev The token type id of the Halloween Crate.
    uint256 public constant HALLOWEEN21_CRATE_BASETYPEID =
        57896044618658097711785492504343953927996121800504035873582290433683637665792;
    /// @dev The token type id of the Golden Card Back.
    uint256 public constant GOLDEN_CARD_BACK_BASETYPEID =
        57896044618658097711785492504343954068532739338851621283956003303003908997120;
    /// @dev The token type id of Marbolg in silver quality.
    uint256 public constant MARBOLG_SILVER_BASETYPEID =
        57896044618658097711785492504343954068873021705772559747419377910435677208576;
    /// @dev The token type id of Marbolg in gold quality.
    uint256 public constant MARBOLG_GOLD_BASETYPEID =
        57896044618658097711785492504343954069213304072693498210882752517867445420032;

    /// @dev 1k value.
    uint256 public constant THOUSAND = 1000;
    /// @dev Maximum value for chances.
    uint256 public constant MAX_CHANCE = 100 * THOUSAND;
    /// @dev Chance for cards of type COMMON.
    uint256 public constant COMMON_CHANCE = 70 * THOUSAND;
    /// @dev Chance for cards of type RARE.
    uint256 public constant RARE_CHANCE = 94 * THOUSAND;
    /// @dev Chance for cards of type EPIC.
    uint256 public constant EPIC_CHANCE = 99 * THOUSAND;
    /// @dev Chance for cards of type LEGENDARY.
    uint256 public constant LEGENDARY_CHANCE = 100 * THOUSAND;
    /// @dev Chance for cards of type ARTIFACT.
    uint256 public constant ARTIFACT_CHANCE = 1;
    /// @dev Chance for quality of type METAL.
    uint256 public constant METAL_CHANCE = 84 * THOUSAND;
    /// @dev Chance for quality of type BRONZE.
    uint256 public constant BRONZE_CHANCE = 94 * THOUSAND;
    /// @dev Chance for quality of type SILVER.
    uint256 public constant SILVER_CHANCE = 99 * THOUSAND;
    /// @dev Chance for quality of type GOLD.
    uint256 public constant GOLD_CHANCE = 100 * THOUSAND;

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Array of common card ids.
    uint256[] private _common_card_ids;
    /// @dev Array of rare card ids.
    uint256[] private _rare_card_ids;
    /// @dev Array of epic card ids.
    uint256[] private _epic_card_ids;
    /// @dev Array of legendary card ids.
    uint256[] private _legendary_card_ids;
    /// @dev Array of artifact card ids.
    uint256[] private _artifact_card_ids;
    /// @dev Array of amount of cards available for each price tier.
    uint256[10] public _TOTAL_BOOSTER_AMOUNTS = [
        20000 * DECIMALS,
        50000 * DECIMALS,
        90000 * DECIMALS,
        140000 * DECIMALS,
        200000 * DECIMALS,
        260000 * DECIMALS,
        310000 * DECIMALS,
        350000 * DECIMALS,
        380000 * DECIMALS,
        400000 * DECIMALS
    ];
    /// @dev Array for the price of Cosmetic Expansion in cents for each tier.
    uint256[10] public _BOOSTER_PRICING_BASE = [
        100,
        150,
        200,
        250,
        300,
        350,
        400,
        450,
        500,
        550
    ];
    /// @dev Array for the price of Genesis Expansion in cents for each tier.
    uint256[10] public _BOOSTER_PRICING_TRANSCENDENT = [
        200,
        300,
        400,
        500,
        600,
        700,
        800,
        900,
        1000,
        1100
    ];

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isAuthorizedBOSS() {
        require(msg.sender == getContractAddress(1000), "Unauthorized call");
        _;
    }

    modifier isAuthorizedCrateOpener() {
        require(msg.sender == getContractAddress(1005), "Unauthorized call");
        _;
    }

    modifier isAuthorizedHalloweenCrateOpener() {
        require(getContractAddress(1006) == msg.sender, "Unauthorized call");
        _;
    }

    modifier isReleased(uint256 tokenId) {
        require(
            _assetsContract().getReleaseTimestamp(tokenId) <= block.timestamp,
            "This token is not released yet."
        );
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /** 
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract including the address of the BOSS.
        Creates the first initial two booster types.
        Contract is INACTIVE by default.
        @param registryAddress      Address of the Registry
    */
    constructor(address registryAddress)
        RegistrableContractState(registryAddress)
    {}

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    /**
        @notice Mints the Golden Ticket to Serra.
        @dev Mints the Golden Ticket to Serra.
        @param userAccounts Reward winners!
    */
    function mintTicketToSerra(address[] memory userAccounts)
        external
        isAuthorizedAdmin
    {
        _assetsContract().mintNonFungible(
            TICKET_TO_SERRA_BASETYPEID,
            userAccounts
        );
    }

    /**
        @notice Mints the Halloween Crate.
        @dev Mints the Halloween Crate.
        @param userAccounts Reward winners!
    */
    function mintHalloweenCrate(address[] memory userAccounts)
        external
        isAuthorizedAdmin
    {
        _assetsContract().mintNonFungible(
            HALLOWEEN21_CRATE_BASETYPEID,
            userAccounts
        );
    }

    /**
        @notice Mints the Golden Card Back.
        @dev Mints the Golden Card Back.
        @param userAccounts Serrans interacted with crates before sold out (block number 18717272)
    */
    function mintCardGoldBack(address[] memory userAccounts)
        external
        isAuthorizedAdmin
    {
        _assetsContract().mintNonFungible(
            GOLDEN_CARD_BACK_BASETYPEID,
            userAccounts
        );
    }

    /**
        @notice Mints all the silver and golden version of the Marbolg cards and sends them to the Anomaly Vault.
        @dev Mints all the silver and golden version of the Marbolg cards and sends them to the Anomaly Vault.
    */
    function mintAllMarbolgCards() external isAuthorizedAdmin {
        address anomalyVaultAddress = getContractAddress(9);

        for (uint256 i = 0; i < 12; i++) {
            _mintNonFungible(MARBOLG_SILVER_BASETYPEID, anomalyVaultAddress);
        }
        _mintNonFungible(MARBOLG_GOLD_BASETYPEID, anomalyVaultAddress);
    }

    /**
        @notice Updates the metadata base URI.
        @dev Updates the `_metadataBaseURI`.
        @param uri The metadata base URI
    */
    function updateMetadataBaseURI(string calldata uri)
        external
        isAuthorizedAdmin
    {
        _assetsContract().updateMetadataBaseURI(uri);
    }

    /**
        @notice Buys booster as a batch for a single user.
        @dev Buys booster as a batch for a single user.
        Reverts if array lengths are unequal.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param boosterTypes  Array of booster types that are bought
        @param amounts      Array of amounts for each booster type
        @param to           The receiver
    */
    function buyBoosters(
        uint256[] calldata boosterTypes,
        uint256[] calldata amounts,
        address to
    ) external isAuthorizedBOSS {
        require(
            boosterTypes.length == amounts.length,
            "Array length must match."
        );

        for (uint256 i = 0; i < boosterTypes.length; ++i) {
            _buyBooster(boosterTypes[i], amounts[i], to);
        }
    }

    /**
        @notice Opens transcendent set crates.
        @dev Opens transcendent set crates through meta tx. Burns the crates.
        Reverts if asset is not the transcendent set crate id.
        Reverts if crates with decimals are sent.
        Reverts if there is more than 1 element in types or amounts.
        Emits the `TransferSingle` event for burn and card / artifact creation.
        On-chain randomness:
        A Serran sends the sig (MBBsignature, unique) of his input data. (The increasing nonce makes the sig always unique)
        The CrateOpenerAccount (dev) sends the sig (seedSignature, unique) of the Serran's input data incl. its sig.
        The seedSignature is based on the user input, thus can't be tempered with on the dev side.
        The seedSignature is transparent and can be verified by anyone through signaturePublicKey, thus is used as a unique randomness seed.
        Additionally, the randomness function combines seedSignature with gasleft() so that the opening of multiple crates within one tx is still random.
        @param MBBsignature     Signature for burning the crates (batch)
        @param signer           The signing account (CrateUnlockingAccount)
        @param recipient        The original owner of the crate
        @param typeIds          Array of crate ids
        @param amounts          Array of crate amounts
        @param nonce            Nonce for meta transaction
        @param maxTimestamp     Max duration until the signature is valid
        @param seedSignature    Seed for randomness created through CrateOpenerAccount signature
    */
    function openCrates(
        bytes memory MBBsignature,
        address signer,
        address recipient,
        uint256[] calldata typeIds,
        uint256[] calldata amounts,
        uint256 nonce,
        uint256 maxTimestamp,
        bytes memory seedSignature
    ) external isAuthorizedCrateOpener {
        bytes32 dataHash = _getSeedHash(
            MBBsignature,
            signer,
            recipient,
            typeIds,
            amounts,
            nonce,
            maxTimestamp
        );
        address signaturePublicKey = ECDSA.recover(
            ECDSA.toEthSignedMessageHash(dataHash),
            seedSignature
        );
        require(
            signaturePublicKey == getContractAddress(1005),
            "Invalid randomness seed. Unauthorized signer."
        );
        _assetsContract().metaBatchBurn(
            MBBsignature,
            signer,
            typeIds,
            amounts,
            nonce,
            maxTimestamp
        );
        require(
            typeIds.length == 1 && typeIds[0] == TRANSCENDENT_SET_CRATE_TYPEID,
            "The sent assets are invalid"
        );
        require(amounts[0] % DECIMALS == 0, "Keine halben Sachen");

        uint256 crateAmount = amounts[0] / DECIMALS;
        for (uint256 i = 0; i < crateAmount; i++) {
            uint256[] memory cardsToMint = new uint256[](CARDS_PER_BOOSTER);
            for (uint256 j = 0; j < CARDS_PER_BOOSTER - 1; j++) {
                cardsToMint[j] = _getRandomRarityCard(seedSignature);
            }
            cardsToMint[CARDS_PER_BOOSTER - 1] = _getRandomCard(
                _rare_card_ids,
                seedSignature
            );
            _mintArtifactIfLucky(recipient, seedSignature);
            _mintCards(cardsToMint, recipient);
        }
    }

    /**
        @notice Opens halloween21 crate.
        @dev Opens halloween21 crates through meta tx. Burns the crate.
        Reverts if asset is not the halloween21 crate id.
        Reverts if multiple crates are sent.
        Reverts if there is more than 1 element in types or amounts.
        Emits the `TransferSingle` event for burn and card creation.
        On-chain randomness:
        A Serran sends the sig (MBBsignature, unique) of his input data. (The increasing nonce makes the sig always unique)
        The CrateOpenerAccount (dev) sends the sig (seedSignature, unique) of the Serran's input data incl. its sig.
        The seedSignature is based on the user input, thus can't be tempered with on the dev side.
        The seedSignature is transparent and can be verified by anyone through signaturePublicKey, thus is used as a unique randomness seed.
        Additionally, the randomness function combines seedSignature with gasleft() so that the opening of multiple crates within one tx is still random.
        @param MBBsignature     Signature for burning the crates (batch)
        @param signer           The signing account (equals recipient)
        @param recipient        The original owner of the crate
        @param typeIds          Array of crate ids
        @param amounts          Array of crate amounts
        @param nonce            Nonce for meta transaction
        @param maxTimestamp     Max duration until the signature is valid
        @param seedSignature    Seed for randomness created through HalloweenCrateOpenerAccount signature
    */
    function openHalloweenCrate(
        bytes memory MBBsignature,
        address signer,
        address recipient,
        uint256[] calldata typeIds,
        uint256[] calldata amounts,
        uint256 nonce,
        uint256 maxTimestamp,
        bytes memory seedSignature
    ) external isAuthorizedHalloweenCrateOpener {
        bytes32 dataHash = _getSeedHash(
            MBBsignature,
            signer,
            recipient,
            typeIds,
            amounts,
            nonce,
            maxTimestamp
        );
        address signaturePublicKey = ECDSA.recover(
            ECDSA.toEthSignedMessageHash(dataHash),
            seedSignature
        );
        require(
            signaturePublicKey == getContractAddress(1006),
            "Invalid randomness seed. Unauthorized signer."
        );
        _assetsContract().metaBatchBurn(
            MBBsignature,
            signer,
            typeIds,
            amounts,
            nonce,
            maxTimestamp
        );
        require(
            typeIds.length == 1 &&
                _assetsContract().getNonFungibleBaseType(typeIds[0]) ==
                HALLOWEEN21_CRATE_BASETYPEID,
            "The sent assets are invalid"
        );
        require(amounts[0] == 1, "Keine halben Sachen");

        IAnomalyVault(getContractAddress(9)).free_an_anomaly(
            recipient,
            typeIds[0],
            seedSignature
        );
    }

    /**
        @dev Creates fungible and non-fungible types as a batch. This function only creates the type and is not used for minting.
        NFT types also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param isNF                 Flag array if the creation should be a non-fungible, false for fungible tokens
        @param maxSupply            The maximum amounts that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamps    Array of release timestamps
        @return                     The `typeId`
    */
    function createNewTokenTypes(
        bool[] calldata isNF,
        uint256[] calldata maxSupply,
        uint256[] calldata releaseTimestamps
    ) external isAuthorizedAdmin returns (uint256[] memory) {
        uint256 len = isNF.length;
        require(
            len == maxSupply.length && len == releaseTimestamps.length,
            "Array length must match."
        );

        uint256[] memory results = new uint256[](len);
        for (uint256 i = 0; i < len; ++i) {
            results[i] = _createNewTokenType(
                isNF[i],
                maxSupply[i],
                releaseTimestamps[i]
            );
        }
        return results;
    }

    /**
        @notice Sets a release timestamp for a token type.
        @dev Sets a release timestamp for a token type.
        Reverts if `timestamp` == 0.
        Reverts if the `tokenType` is released already.
        @param tokenType        The type which should be set or updated
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function setReleaseTimestamp(uint256 tokenType, uint256 releaseTimestamp)
        external
        isAuthorizedAdmin
    {
        _assetsContract().setReleaseTimestamp(tokenType, releaseTimestamp);
    }

    /**
        @notice Initializes the token ids of all common cards.
        @dev Initializes the token ids of all common cards.
        Reverts if array is initialized already.
    */
    function init_COMMON_CARDS() external isAuthorizedAdmin {
        require(_common_card_ids.length == 0, "Array is initialized already");
        _common_card_ids = [
            57896044618658097711785492504343953940586569376578759021727150908659061489664,
            57896044618658097711785492504343953941947698844262512875580649338386134335488,
            57896044618658097711785492504343953943308828311946266729434147768113207181312,
            57896044618658097711785492504343953950114475650365035998701639916748571410432,
            57896044618658097711785492504343953955558993521100051414115633635656862793728,
            57896044618658097711785492504343953956920122988783805267969132065383935639552,
            57896044618658097711785492504343953958281252456467559121822630495111008485376,
            57896044618658097711785492504343953963725770327202574537236624214019299868672,
            57896044618658097711785492504343953965086899794886328391090122643746372714496,
            57896044618658097711785492504343953967809158730253836098797119503200518406144,
            57896044618658097711785492504343953971892547133305097660357614792381736943616
        ];
    }

    /**
        @notice Initializes the token ids of all rare cards.
        @dev Initializes the token ids of all rare cards.
        Reverts if array is initialized already.
    */
    function init_RARE_CARDS() external isAuthorizedAdmin {
        require(_rare_card_ids.length == 0, "Array is initialized already");
        _rare_card_ids = [
            57896044618658097711785492504343953931058663102792482044752661900569551568896,
            57896044618658097711785492504343953933780922038159989752459658760023697260544,
            57896044618658097711785492504343953937864310441211251314020154049204915798016,
            57896044618658097711785492504343953944669957779630020583287646197840280027136,
            57896044618658097711785492504343953946031087247313774437141144627567352872960,
            57896044618658097711785492504343953954197864053416297560262135205929789947904,
            57896044618658097711785492504343953959642381924151312975676128924838081331200,
            57896044618658097711785492504343953961003511391835066829529627354565154177024,
            57896044618658097711785492504343953966448029262570082244943621073473445560320,
            57896044618658097711785492504343953970531417665621343806504116362654664097792
        ];
    }

    /**
        @notice Initializes the token ids of all epic cards.
        @dev Initializes the token ids of all epic cards.
        Reverts if array is initialized already.
    */
    function init_EPIC_CARDS() external isAuthorizedAdmin {
        require(_epic_card_ids.length == 0, "Array is initialized already");
        _epic_card_ids = [
            57896044618658097711785492504343953928336404167424974337045665041115405877248,
            57896044618658097711785492504343953935142051505843743606313157189750770106368,
            57896044618658097711785492504343953936503180973527497460166655619477842952192,
            57896044618658097711785492504343953947392216714997528290994643057294425718784,
            57896044618658097711785492504343953951475605118048789852555138346475644256256,
            57896044618658097711785492504343953952836734585732543706408636776202717102080,
            57896044618658097711785492504343953973253676600988851514211113222108809789440
        ];
    }

    /**
        @notice Initializes the token ids of all legendary cards.
        @dev Initializes the token ids of all legendary cards.
        Reverts if array is initialized already.
    */
    function init_LEGENDARY_CARDS() external isAuthorizedAdmin {
        require(
            _legendary_card_ids.length == 0,
            "Array is initialized already"
        );
        _legendary_card_ids = [
            57896044618658097711785492504343953929697533635108728190899163470842478723072,
            57896044618658097711785492504343953932419792570476235898606160330296624414720,
            57896044618658097711785492504343953939225439908895005167873652478931988643840,
            57896044618658097711785492504343953948753346182681282144848141487021498564608,
            57896044618658097711785492504343953962364640859518820683383125784292227022848,
            57896044618658097711785492504343953969170288197937589952650617932927591251968
        ];
    }

    /**
        @notice Initializes the token ids of all artifact cards.
        @dev Initializes the token ids of all artifact cards.
        Reverts if array is initialized already.
    */
    function init_ARTIFACT_CARDS() external isAuthorizedAdmin {
        require(_artifact_card_ids.length == 0, "Array is initialized already");
        _artifact_card_ids = [
            57896044618658097711785492504343953974614806068672605368064611651835882635264,
            57896044618658097711785492504343953974955088435593543831527986259267650846720,
            57896044618658097711785492504343953975295370802514482294991360866699419058176,
            57896044618658097711785492504343953975635653169435420758454735474131187269632,
            57896044618658097711785492504343953975975935536356359221918110081562955481088,
            57896044618658097711785492504343953976316217903277297685381484688994723692544,
            57896044618658097711785492504343953976656500270198236148844859296426491904000,
            57896044618658097711785492504343953976996782637119174612308233903858260115456,
            57896044618658097711785492504343953977337065004040113075771608511290028326912,
            57896044618658097711785492504343953977677347370961051539234983118721796538368,
            57896044618658097711785492504343953978017629737881990002698357726153564749824,
            57896044618658097711785492504343953978357912104802928466161732333585332961280
        ];
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    /**
        @notice Returns a token id where the type id is increased.
        @dev Returns a token id where the type id is increased.
        @param typeId       A valid token id
        @param increment    The increment for the type id
        @return             The token id where the type is increased by `increment`
    */
    function getIncreasedTypeId(uint256 typeId, uint256 increment)
        public
        pure
        returns (uint256)
    {
        return (((typeId >> 128) + increment) << 128);
    }

    /**
        @notice Get the cosmetic booster pricing for each tier.
        @dev Get the cosmetic booster pricing for each tier.
        @return The cosmetic booster pricing for each tier
    */
    function getBoosterPricingOne() public view returns (uint256[] memory) {
        uint256 len = _BOOSTER_PRICING_BASE.length;
        uint256[] memory result = new uint256[](len);
        for (uint256 i = 0; i < len; i++) {
            result[i] = _BOOSTER_PRICING_BASE[i];
        }
        return result;
    }

    /**
        @notice Get the genesis booster pricing for each tier.
        @dev Get the genesis booster pricing for each tier.
        @return The genesis booster pricing for each tier
    */
    function getBoosterPricingTwo() public view returns (uint256[] memory) {
        uint256 len = _BOOSTER_PRICING_TRANSCENDENT.length;
        uint256[] memory result = new uint256[](len);
        for (uint256 i = 0; i < len; i++) {
            result[i] = _BOOSTER_PRICING_TRANSCENDENT[i];
        }
        return result;
    }

    /**
        @notice Get the total price in cents for a specific amount of cosmetic boosters.
        @dev Get the total price in cents for a specific amount of cosmetic boosters.
        @param amount   The requested amount of cosmetic boosters
        @return         The total price in cents for a specific amount of cosmetic boosters
    */
    function getBoosterPriceOne(uint256 amount) public view returns (uint256) {
        uint256 mintedSupply = _assetsContract().getMintedSupply(
            BASE_SET_CRATE_TYPEID
        );
        return _getBaseSetPrice(amount, mintedSupply) / DECIMALS;
    }

    /**
        @notice Get the total price in cents for a specific amount of genesis boosters.
        @dev Get the total price in cents for a specific amount of genesis boosters.
        @param amount   The requested amount of genesis boosters
        @return         The total price in cents for a specific amount of genesis boosters
    */
    function getBoosterPriceTwo(uint256 amount) public view returns (uint256) {
        uint256 mintedSupply = _assetsContract().getMintedSupply(
            TRANSCENDENT_SET_CRATE_TYPEID
        );
        return _getTranscendentSetPrice(amount, mintedSupply) / DECIMALS;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Returns the target Assets Contract object.
        @return The target Assets Contract object
    */
    function _assetsContract() internal view returns (IAssets) {
        IAssets assetsContract = IAssets(getContractAddress(2));
        return assetsContract;
    }

    /**
        @dev Creates fungible and non-fungible types. This function only creates the type and is not used for minting.
        NFT types also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param isNF             Flag if the creation should be a non-fungible, false for fungible tokens
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function _createNewTokenType(
        bool isNF,
        uint256 maxSupply,
        uint256 releaseTimestamp
    ) private returns (uint256) {
        if (isNF) {
            return
                _assetsContract().createNonFungibleType(
                    maxSupply,
                    releaseTimestamp
                );
        } else {
            return
                _assetsContract().createFungibleType(
                    maxSupply,
                    releaseTimestamp
                );
        }
    }

    /**
        @dev Calculates the cosmetic booster price based on the `mintedSupply` argument.
        @param amount       The requested amount of cosmetic boosters.
        @param mintedSupply Indicator for how many cosmetic boosters are minted already.
        @return             The total price in cents for a specific amount of cosmetic boosters.
    */
    function _getBaseSetPrice(uint256 amount, uint256 mintedSupply)
        private
        view
        returns (uint256)
    {
        uint256 result;

        (uint256 level, uint256 levelLeft) = _getTierLeft(mintedSupply);
        mintedSupply += levelLeft;
        if (levelLeft < amount) {
            result += levelLeft * _BOOSTER_PRICING_BASE[level];
            result += _getBaseSetPrice(amount - levelLeft, mintedSupply);
        } else {
            result += amount * _BOOSTER_PRICING_BASE[level];
        }

        return result;
    }

    /**
        @dev Calculates the genesis booster price based on the `mintedSupply` argument.
        @param amount       The requested amount of genesis boosters.
        @param mintedSupply Indicator for how many genesis boosters are minted already.
        @return             The total price in cents for a specific amount of genesis boosters.
    */
    function _getTranscendentSetPrice(uint256 amount, uint256 mintedSupply)
        private
        view
        returns (uint256)
    {
        uint256 result;

        (uint256 level, uint256 levelLeft) = _getTierLeft(mintedSupply);
        mintedSupply += levelLeft;
        if (levelLeft < amount) {
            result += levelLeft * _BOOSTER_PRICING_TRANSCENDENT[level];
            result += _getTranscendentSetPrice(
                amount - levelLeft,
                mintedSupply
            );
        } else {
            result += amount * _BOOSTER_PRICING_TRANSCENDENT[level];
        }

        return result;
    }

    /**
        @dev Calculates how many booster are left at current tier based on the `mintedSupply` argument.
        @param mintedSupply Indicator for how many boosters are minted already
        @return             The tier index, the amount left for this tier
    */
    function _getTierLeft(uint256 mintedSupply)
        private
        view
        returns (uint256, uint256)
    {
        for (uint256 i = 0; i < _TOTAL_BOOSTER_AMOUNTS.length; i++) {
            if (mintedSupply < _TOTAL_BOOSTER_AMOUNTS[i]) {
                return (i, _TOTAL_BOOSTER_AMOUNTS[i] - mintedSupply);
            }
        }
        revert("Out of stock.");
    }

    /**
        @dev Get the data hash required for checking the valid public key.
        @param MBBsignature     Signature for burning the crates (batch)
        @param signer           The signing account (CrateUnlockingAccount)
        @param recipient        The original owner of the crate
        @param typeIds          Array of crate ids
        @param amounts          Array of crate amounts
        @param nonce            Nonce for meta transaction
        @param maxTimestamp     Max duration until the signature is valid
        @return                 The keccak256 hash of the data input
    */
    function _getSeedHash(
        bytes memory MBBsignature,
        address signer,
        address recipient,
        uint256[] calldata typeIds,
        uint256[] calldata amounts,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    MBBsignature,
                    signer,
                    recipient,
                    typeIds,
                    amounts,
                    nonce,
                    maxTimestamp
                )
            );
    }

    /**
        @dev Returns a semi random number between 0 and `maxExcluded` (exluded).
        The randomness is based on the provided seed and gasleft().
        @param  maxExcluded The maximum value (excluded)
        @param  seed        The seed which the randomness is based on
        @return             Semi-Random uint256
    */
    function _getRandomNumber(uint256 maxExcluded, bytes memory seed)
        private
        view
        returns (uint256)
    {
        return
            uint256(keccak256(abi.encodePacked(seed, gasleft()))) % maxExcluded;
    }

    /**
        @dev Returns a random element of an uint256[] array.
        @param  arr     The array to choose a random index from
        @param  seed    The seed which the randomness is based on
        @return         The value of the random index within the array
    */
    function _getRandomArrayElement(uint256[] memory arr, bytes memory seed)
        private
        view
        returns (uint256)
    {
        return arr[_getRandomNumber(arr.length, seed)];
    }

    /**
        @dev Returns the new tokenId of a card dependant on the chance of an upgrade.
        Increases the typeId of the card by 1, 2, 3 for bronze, silver, gold.
        @param cardId   The card ID (token ID) that potentially will be upgraded
        @param  seed    The seed which the randomness is based on
        @return         The new card ID
    */
    function _getRandomUpgrade(uint256 cardId, bytes memory seed)
        private
        view
        returns (uint256)
    {
        uint256 randomNumber = _getRandomNumber(MAX_CHANCE, seed);
        uint256 increment;
        if (randomNumber < METAL_CHANCE) {
            return cardId;
        } else if (randomNumber < BRONZE_CHANCE) {
            increment = 1;
        } else if (randomNumber < SILVER_CHANCE) {
            increment = 2;
        } else if (randomNumber < GOLD_CHANCE) {
            increment = 3;
        } else {
            assert(false);
        }
        return getIncreasedTypeId(cardId, increment);
    }

    /**
        @dev Returns the tokenId of a randomly (based on drop chances) selected card.
        @param  seed    The seed which the randomness is based on
        @return tokenId The tokenId of the card
    */
    function _getRandomRarityCard(bytes memory seed)
        private
        view
        returns (uint256 tokenId)
    {
        uint256 randomNumber = _getRandomNumber(MAX_CHANCE, seed);
        if (randomNumber < COMMON_CHANCE) {
            return _getRandomCard(_common_card_ids, seed);
        } else if (randomNumber < RARE_CHANCE) {
            return _getRandomCard(_rare_card_ids, seed);
        } else if (randomNumber < EPIC_CHANCE) {
            return _getRandomCard(_epic_card_ids, seed);
        } else if (randomNumber < LEGENDARY_CHANCE) {
            return _getRandomCard(_legendary_card_ids, seed);
        }
        assert(false);
    }

    /**
        @dev Returns a random cardId / tokenId based on chances including potential upgrade.
        Includes all scarcity levels (quality & rarity) of cards.
        @param  cardTypesArr    Array of card types
        @param  seed            The seed which the randomness is based on
        @return tokenId         The random cardId / tokenId
    */
    function _getRandomCard(uint256[] memory cardTypesArr, bytes memory seed)
        private
        view
        returns (uint256 tokenId)
    {
        uint256 randomCardId = _getRandomArrayElement(cardTypesArr, seed);
        return _getRandomUpgrade(randomCardId, seed);
    }

    /**
        @dev A check if there is still an undiscovered artifact available.
        @return True if their are yet any artifacts to be discovered
    */
    function _artifactAvailable() private view returns (bool) {
        uint256[] memory artifactsArray = _artifact_card_ids;
        for (uint256 i = 0; i < artifactsArray.length; i++) {
            if (_assetsContract().getMintedSupply(artifactsArray[i]) == 0) {
                return true;
            }
        }
        return false;
    }

    /**
        @dev Buys booster(s) of a single booster type for a single user.
        Reverts if booster is not released yet.
        Reverts if booster type id does not exist.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param boosterType  The booster type which is bought
        @param amount       The amount of boosters
        @param to           The receiver
    */
    function _buyBooster(
        uint256 boosterType,
        uint256 amount,
        address to
    ) private isReleased(boosterType) {
        address[] memory toArr = new address[](1);
        toArr[0] = to;
        uint256[] memory amountArr = new uint256[](1);
        amountArr[0] = amount;
        _assetsContract().mintFungible(boosterType, toArr, amountArr);
    }

    /**
        @dev Mints an artifact card if the 1 / 100,000 chance was hit.
        @param  recipient   The owner of the new artifact asset
        @param  seed        The seed which the randomness is based on
    */
    function _mintArtifactIfLucky(address recipient, bytes memory seed)
        private
    {
        if (_getRandomNumber(MAX_CHANCE, seed) < ARTIFACT_CHANCE) {
            if (_artifactAvailable()) {
                uint256[] memory artifactArray = _artifact_card_ids;
                for (uint256 k = 0; k < artifactArray.length; k++) {
                    if (
                        _assetsContract().getMintedSupply(artifactArray[k]) == 0
                    ) {
                        _mintNonFungible(artifactArray[k], recipient);
                        break;
                    }
                }
            }
        }
    }

    /**
        @notice Mints a single NFT.
        @dev Mints a single NFT.
        Reverts if card type id is not existing.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param to       The receiver
    */
    function _mintNonFungible(uint256 typeId, address to) private {
        address[] memory toArr = new address[](1);
        toArr[0] = to;
        _assetsContract().mintNonFungible(typeId, toArr);
    }

    /**
        @notice Mints a cards as NFTs.
        @dev Mints a cards as NFTs.
        Reverts if card type id is not existing.
        Emits the `TransferSingle` event.
        @param typeIds  The types which should be minted
        @param to       The receiver
    */
    function _mintCards(uint256[] memory typeIds, address to) private {
        address[] memory toArr = new address[](1);
        toArr[0] = to;
        for (uint256 i = 0; i < typeIds.length; i++) {
            _assetsContract().mintNonFungible(typeIds[i], toArr);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[],"name":"Inactivated","type":"event"},{"inputs":[],"name":"ARTIFACT_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_SET_CRATE_TYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BRONZE_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CARDS_PER_BOOSTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMMON_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPIC_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLDEN_CARD_BACK_BASETYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HALLOWEEN21_CRATE_BASETYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARBOLG_GOLD_BASETYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARBOLG_SILVER_BASETYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METAL_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RARE_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILVER_CHANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THOUSAND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TICKET_TO_SERRA_BASETYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSCENDENT_SET_CRATE_TYPEID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BOOSTER_PRICING_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BOOSTER_PRICING_TRANSCENDENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_TOTAL_BOOSTER_AMOUNTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"boosterTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyBoosters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool[]","name":"isNF","type":"bool[]"},{"internalType":"uint256[]","name":"maxSupply","type":"uint256[]"},{"internalType":"uint256[]","name":"releaseTimestamps","type":"uint256[]"}],"name":"createNewTokenTypes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBoosterPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBoosterPriceTwo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBoosterPricingOne","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBoosterPricingTwo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"getIncreasedTypeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"init_ARTIFACT_CARDS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init_COMMON_CARDS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init_EPIC_CARDS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init_LEGENDARY_CARDS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"init_RARE_CARDS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintAllMarbolgCards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAccounts","type":"address[]"}],"name":"mintCardGoldBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAccounts","type":"address[]"}],"name":"mintHalloweenCrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAccounts","type":"address[]"}],"name":"mintTicketToSerra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"MBBsignature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"},{"internalType":"bytes","name":"seedSignature","type":"bytes"}],"name":"openCrates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"MBBsignature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"typeIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"},{"internalType":"bytes","name":"seedSignature","type":"bytes"}],"name":"openHalloweenCrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"setReleaseTimestamp","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":"string","name":"uri","type":"string"}],"name":"updateMetadataBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101c06040526080806200001e670de0b6b3a7640000614e2062000393565b815260200162000039670de0b6b3a764000061c35062000393565b815260200162000055670de0b6b3a764000062015f9062000393565b815260200162000071670de0b6b3a7640000620222e062000393565b81526020016200008d670de0b6b3a764000062030d4062000393565b8152602001620000a9670de0b6b3a76400006203f7a062000393565b8152602001620000c5670de0b6b3a76400006204baf062000393565b8152602001620000e1670de0b6b3a76400006205573062000393565b8152602001620000fd670de0b6b3a76400006205cc6062000393565b815260200162000119670de0b6b3a764000062061a8062000393565b90526200012b90600790600a62000302565b506040805161014081018252606481526096602082015260c89181019190915260fa606082015261012c608082015261015e60a082015261019060c08201526101c260e08201526101f46101008201526102266101208201526200019490601190600a62000345565b50604080516101408101825260c8815261012c6020820152610190918101919091526101f4606082015261025860808201526102bc60a082015261032060c082015261038460e08201526103e861010082015261044c6101208201526200020090601b90600a62000345565b503480156200020e57600080fd5b5060405162003fae38038062003fae8339810160408190526200023191620003c1565b80620002446301ffc9a760e01b6200027e565b60018054610100600160a81b0319166101006001600160a01b03841602179055620002766389edd2db60e01b6200027e565b5050620003f3565b6001600160e01b03198082169003620002dd5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b82600a810192821562000333579160200282015b828111156200033357825182559160200191906001019062000316565b50620003419291506200037c565b5090565b82600a810192821562000333579160200282015b8281111562000333578251829061ffff1690559160200191906001019062000359565b5b808211156200034157600081556001016200037d565b6000816000190483118215151615620003bc57634e487b7160e01b600052601160045260246000fd5b500290565b600060208284031215620003d457600080fd5b81516001600160a01b0381168114620003ec57600080fd5b9392505050565b613bab80620004036000396000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80639498624f116101b2578063c7ce831c116100f9578063f0824aff116100a2578063f29b84a01161007c578063f29b84a014610688578063f3f02b3d14610690578063f9dad08d146106a3578063fba7cc79146106b657600080fd5b8063f0824aff14610662578063f1b9ee241461066a578063f21de1e81461067257600080fd5b8063d8b53038116100d3578063d8b530381461062f578063dda413b614610647578063ef1aaf561461065a57600080fd5b8063c7ce831c146104aa578063c8c8fdf614610604578063d6e1a8ca1461061c57600080fd5b8063aefa7d981161015b578063bf0cc5b711610135578063bf0cc5b7146105d6578063bff2b4b7146105e9578063c2b6a2e1146105fc57600080fd5b8063aefa7d9814610590578063af215f98146105bb578063af758d07146105c357600080fd5b8063a32874881161018c578063a32874881461046b578063a91ee0dc14610556578063ad2859601461056957600080fd5b80639498624f146103f25780639a18afa61461051c578063a05825691461054357600080fd5b80635bd4e40911610281578063760a8c2a1161022a578063851cad9011610204578063851cad90146104f0578063867f1464146104f9578063878e56781461050c5780638ed369c31461051457600080fd5b8063760a8c2a146104c257806378c9adad146104ca5780637d747117146104dd57600080fd5b80636ad654541161025b5780636ad65454146104aa5780636b8b190a146104b257806373c95675146104ba57600080fd5b80635bd4e40914610473578063661ac67a1461047b57806367627904146104a257600080fd5b80632ccd2c84116102e35780633b2baaef116102bd5780633b2baaef1461044357806359431bbf146104565780635a7bd3061461046b57600080fd5b80632ccd2c84146103fa5780632e0f26251461040d57806332f484461461041c57600080fd5b806320b642271161031457806320b64227146103dd57806320e66bd3146103f257806322226f43146103f257600080fd5b806301ffc9a71461033b5780630b32d0ac14610395578063162c2289146103b6575b600080fd5b61038061034936600461320f565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b6103a86103a3366004613251565b6106c1565b60405190815260200161038c565b6103a87f800000000000000000000000000001a20000000000000000000000000000000081565b6103f06103eb3660046132d6565b6106d8565b005b6103a861076a565b6103f0610408366004613388565b61077a565b6103a8670de0b6b3a764000081565b6103a87f800000000000000000000000000000040000000000000000000000000000000081565b6103f0610451366004613466565b61080b565b61045e610c54565b60405161038c919061358e565b6103a8610cd4565b6103f0610ce1565b6103a87f800000000000000000000000000001a30000000000000000000000000000000081565b6103a8610e5f565b6103a8610e6c565b6103a8600181565b6103f0610e79565b6103f061108d565b6103f06104d83660046135a1565b6110cc565b61045e6104eb366004613613565b611109565b6103a86103e881565b6103a8610507366004613251565b61125b565b6103f061126b565b6103f0611459565b6103a87f800000000000000000000000000000030000000000000000000000000000000081565b6103f06105513660046132d6565b611693565b6103f06105643660046136ad565b6116f0565b6103a87f800000000000000000000000000001a10000000000000000000000000000000081565b6105a361059e366004613251565b6118cd565b6040516001600160a01b03909116815260200161038c565b6103a8600681565b6103f06105d13660046132d6565b61195f565b6103a86105e4366004613251565b6119bc565b6103a86105f7366004613251565b611a68565b6103f0611b03565b6103a870020000000000000000000000000000000081565b6103a861062a366004613251565b611b8c565b6103a870010000000000000000000000000000000081565b6103f06106553660046136ca565b611b9c565b6103f0611ca0565b6103a8611df5565b6103f0611e02565b60015461010090046001600160a01b03166105a3565b61045e611e3f565b6103a861069e366004613388565b611eb8565b6103f06106b1366004613466565b611ed1565b60015460ff16610380565b601181600a81106106d157600080fd5b0154905081565b6106e06122a3565b6106e8612303565b6001600160a01b031663f94190887f8000000000000000000000000000000300000000000000000000000000000000836040518363ffffffff1660e01b8152600401610735929190613787565b600060405180830381600087803b15801561074f57600080fd5b505af1158015610763573d6000803e3d6000fd5b5050505050565b6107776103e860646137b6565b81565b6107826122a3565b61078a612303565b6040517f2ccd2c8400000000000000000000000000000000000000000000000000000000815260048101849052602481018390526001600160a01b039190911690632ccd2c84906044015b600060405180830381600087803b1580156107ef57600080fd5b505af1158015610803573d6000803e3d6000fd5b505050505050565b6108166103ed6118cd565b6001600160a01b0316336001600160a01b03161461086f5760405162461bcd60e51b8152602060048201526011602482015270155b985d5d1a1bdc9a5e99590818d85b1b607a1b60448201526064015b60405180910390fd5b60006108828b8b8b8b8b8b8b8b8b612310565b905060006108e66108e0836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84612358565b90506108f36103ed6118cd565b6001600160a01b0316816001600160a01b0316146109795760405162461bcd60e51b815260206004820152602d60248201527f496e76616c69642072616e646f6d6e65737320736565642e20556e617574686f60448201527f72697a6564207369676e65722e000000000000000000000000000000000000006064820152608401610866565b610981612303565b6001600160a01b031663d270acb98d8d8c8c8c8c8c8c6040518963ffffffff1660e01b81526004016109ba98979695949392919061387c565b600060405180830381600087803b1580156109d457600080fd5b505af11580156109e8573d6000803e3d6000fd5b505060018a149150508015610a26575070020000000000000000000000000000000089896000818110610a1d57610a1d6138de565b90506020020135145b610a725760405162461bcd60e51b815260206004820152601b60248201527f5468652073656e74206173736574732061726520696e76616c696400000000006044820152606401610866565b670de0b6b3a764000087876000818110610a8e57610a8e6138de565b90506020020135610a9f919061390a565b15610aec5760405162461bcd60e51b815260206004820152601360248201527f4b65696e652068616c62656e2053616368656e000000000000000000000000006044820152606401610866565b6000670de0b6b3a764000088886000818110610b0a57610b0a6138de565b90506020020135610b1b919061391e565b905060005b81811015610c445760408051600680825260e082019092526000916020820160c08036833701905050905060005b610b5a60016006613932565b811015610b9957610b6a876123d3565b828281518110610b7c57610b7c6138de565b602090810291909101015280610b9181613949565b915050610b4e565b50610bf46003805480602002602001604051908101604052809291908181526020018280548015610be957602002820191906000526020600020905b815481526020019060010190808311610bd5575b5050505050876125ae565b81610c0160016006613932565b81518110610c1157610c116138de565b602002602001018181525050610c278d876125cf565b610c31818e612731565b5080610c3c81613949565b915050610b20565b5050505050505050505050505050565b60408051600a80825261016082019092526060919060009082602082016101408036833701905050905060005b82811015610ccd57601181600a8110610c9c57610c9c6138de565b0154828281518110610cb057610cb06138de565b602090810291909101015280610cc581613949565b915050610c81565b5092915050565b6107776103e8605e6137b6565b610ce96122a3565b60045415610d395760405162461bcd60e51b815260206004820152601c60248201527f417272617920697320696e697469616c697a656420616c7265616479000000006044820152606401610866565b6040518060e001604052807f800000000000000000000000000000050000000000000000000000000000000081526020017f800000000000000000000000000000190000000000000000000000000000000081526020017f8000000000000000000000000000001d0000000000000000000000000000000081526020017f8000000000000000000000000000003d0000000000000000000000000000000081526020017f800000000000000000000000000000490000000000000000000000000000000081526020017f8000000000000000000000000000004d0000000000000000000000000000000081526020017f80000000000000000000000000000089000000000000000000000000000000008152506004906007610e5c9291906131af565b50565b6107776103e860546137b6565b6107776103e860636137b6565b610e816122a3565b60025415610ed15760405162461bcd60e51b815260206004820152601c60248201527f417272617920697320696e697469616c697a656420616c7265616479000000006044820152606401610866565b6040518061016001604052807f800000000000000000000000000000290000000000000000000000000000000081526020017f8000000000000000000000000000002d0000000000000000000000000000000081526020017f800000000000000000000000000000310000000000000000000000000000000081526020017f800000000000000000000000000000450000000000000000000000000000000081526020017f800000000000000000000000000000550000000000000000000000000000000081526020017f800000000000000000000000000000590000000000000000000000000000000081526020017f8000000000000000000000000000005d0000000000000000000000000000000081526020017f8000000000000000000000000000006d0000000000000000000000000000000081526020017f800000000000000000000000000000710000000000000000000000000000000081526020017f800000000000000000000000000000790000000000000000000000000000000081526020017f8000000000000000000000000000008500000000000000000000000000000000815250600290600b610e5c9291906131af565b611095612826565b6001805460ff1916811790556040517fed1cd0670ee0c0017f550451a038818c696d0b6a9d6ce5b369e44275573cf9b090600090a1565b6110d46122a3565b6110dc612303565b6001600160a01b03166378c9adad83836040518363ffffffff1660e01b81526004016107d5929190613962565b60606111136122a3565b85848114801561112257508083145b61116e5760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610866565b60008167ffffffffffffffff8111156111895761118961326a565b6040519080825280602002602001820160405280156111b2578160200160208202803683370190505b50905060005b8281101561124e576112218a8a838181106111d5576111d56138de565b90506020020160208101906111ea919061399f565b8989848181106111fc576111fc6138de565b90506020020135888885818110611215576112156138de565b90506020020135612889565b828281518110611233576112336138de565b602090810291909101015261124781613949565b90506111b8565b5098975050505050505050565b601b81600a81106106d157600080fd5b6112736122a3565b600354156112c35760405162461bcd60e51b815260206004820152601c60248201527f417272617920697320696e697469616c697a656420616c7265616479000000006044820152606401610866565b6040518061014001604052807f8000000000000000000000000000000d0000000000000000000000000000000081526020017f800000000000000000000000000000150000000000000000000000000000000081526020017f800000000000000000000000000000210000000000000000000000000000000081526020017f800000000000000000000000000000350000000000000000000000000000000081526020017f800000000000000000000000000000390000000000000000000000000000000081526020017f800000000000000000000000000000510000000000000000000000000000000081526020017f800000000000000000000000000000610000000000000000000000000000000081526020017f800000000000000000000000000000650000000000000000000000000000000081526020017f800000000000000000000000000000750000000000000000000000000000000081526020017f8000000000000000000000000000008100000000000000000000000000000000815250600390600a610e5c9291906131af565b6114616122a3565b600654156114b15760405162461bcd60e51b815260206004820152601c60248201527f417272617920697320696e697469616c697a656420616c7265616479000000006044820152606401610866565b6040518061018001604052807f8000000000000000000000000000008d0000000000000000000000000000000081526020017f8000000000000000000000000000008e0000000000000000000000000000000081526020017f8000000000000000000000000000008f0000000000000000000000000000000081526020017f800000000000000000000000000000900000000000000000000000000000000081526020017f800000000000000000000000000000910000000000000000000000000000000081526020017f800000000000000000000000000000920000000000000000000000000000000081526020017f800000000000000000000000000000930000000000000000000000000000000081526020017f800000000000000000000000000000940000000000000000000000000000000081526020017f800000000000000000000000000000950000000000000000000000000000000081526020017f800000000000000000000000000000960000000000000000000000000000000081526020017f800000000000000000000000000000970000000000000000000000000000000081526020017f8000000000000000000000000000009800000000000000000000000000000000815250600690600c610e5c9291906131af565b61169b6122a3565b6116a3612303565b6001600160a01b031663f94190887f800000000000000000000000000001a100000000000000000000000000000000836040518363ffffffff1660e01b8152600401610735929190613787565b6116f86122a3565b600180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790556117496001546001600160a01b036101009091041690565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f60e56d110000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391909116906301ffc9a790602401602060405180830381865afa9250505080156117e4575060408051601f3d908101601f191682019092526117e1918101906139bc565b60015b6118565760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610866565b806118c95760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610866565b5050565b6001546040517f9507d39a0000000000000000000000000000000000000000000000000000000081526004810183905260009161010090046001600160a01b031690639507d39a90602401602060405180830381865afa158015611935573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195991906139d9565b92915050565b6119676122a3565b61196f612303565b6001600160a01b031663f94190887f8000000000000000000000000000000400000000000000000000000000000000836040518363ffffffff1660e01b8152600401610735929190613787565b6000806119c7612303565b60405163084e6adf60e01b815270020000000000000000000000000000000060048201526001600160a01b03919091169063084e6adf90602401602060405180830381865afa158015611a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4291906139f6565b9050670de0b6b3a7640000611a578483612985565b611a61919061391e565b9392505050565b600080611a73612303565b60405163084e6adf60e01b815270010000000000000000000000000000000060048201526001600160a01b03919091169063084e6adf90602401602060405180830381865afa158015611aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aee91906139f6565b9050670de0b6b3a7640000611a578483612a32565b611b0b6122a3565b6000611b1760096118cd565b905060005b600c811015611b6157611b4f7f800000000000000000000000000001a20000000000000000000000000000000083612aab565b80611b5981613949565b915050611b1c565b50610e5c7f800000000000000000000000000001a30000000000000000000000000000000082612aab565b600781600a81106106d157600080fd5b611ba76103e86118cd565b6001600160a01b0316336001600160a01b031614611bfb5760405162461bcd60e51b8152602060048201526011602482015270155b985d5d1a1bdc9a5e99590818d85b1b607a1b6044820152606401610866565b838214611c4a5760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610866565b60005b8481101561080357611c90868683818110611c6a57611c6a6138de565b90506020020135858584818110611c8357611c836138de565b9050602002013584612b6d565b611c9981613949565b9050611c4d565b611ca86122a3565b60055415611cf85760405162461bcd60e51b815260206004820152601c60248201527f417272617920697320696e697469616c697a656420616c7265616479000000006044820152606401610866565b6040518060c001604052807f800000000000000000000000000000090000000000000000000000000000000081526020017f800000000000000000000000000000110000000000000000000000000000000081526020017f800000000000000000000000000000250000000000000000000000000000000081526020017f800000000000000000000000000000410000000000000000000000000000000081526020017f800000000000000000000000000000690000000000000000000000000000000081526020017f8000000000000000000000000000007d000000000000000000000000000000008152506005906006610e5c9291906131af565b6107776103e860466137b6565b611e0a612826565b6001805460ff191690556040517f83b03c3d41b5de9902c98822951ff375666c0cd7fd69f8993c0267ad087734d190600090a1565b60408051600a80825261016082019092526060919060009082602082016101408036833701905050905060005b82811015610ccd57601b81600a8110611e8757611e876138de565b0154828281518110611e9b57611e9b6138de565b602090810291909101015280611eb081613949565b915050611e6c565b60006080611ec88385831c613a0f565b901b9392505050565b33611edd6103ee6118cd565b6001600160a01b031614611f275760405162461bcd60e51b8152602060048201526011602482015270155b985d5d1a1bdc9a5e99590818d85b1b607a1b6044820152606401610866565b6000611f3a8b8b8b8b8b8b8b8b8b612310565b90506000611f986108e0836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050611fa56103ee6118cd565b6001600160a01b0316816001600160a01b03161461202b5760405162461bcd60e51b815260206004820152602d60248201527f496e76616c69642072616e646f6d6e65737320736565642e20556e617574686f60448201527f72697a6564207369676e65722e000000000000000000000000000000000000006064820152608401610866565b612033612303565b6001600160a01b031663d270acb98d8d8c8c8c8c8c8c6040518963ffffffff1660e01b815260040161206c98979695949392919061387c565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505060018a14915050801561215c57507f80000000000000000000000000000004000000000000000000000000000000006120d3612303565b6001600160a01b0316636f969c2d8b8b60008181106120f4576120f46138de565b905060200201356040518263ffffffff1660e01b815260040161211991815260200190565b602060405180830381865afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215a91906139f6565b145b6121a85760405162461bcd60e51b815260206004820152601b60248201527f5468652073656e74206173736574732061726520696e76616c696400000000006044820152606401610866565b868660008181106121bb576121bb6138de565b905060200201356001146122115760405162461bcd60e51b815260206004820152601360248201527f4b65696e652068616c62656e2053616368656e000000000000000000000000006044820152606401610866565b61221b60096118cd565b6001600160a01b0316635746d8738b8b8b600081811061223d5761223d6138de565b90506020020135866040518463ffffffff1660e01b815260040161226393929190613a27565b600060405180830381600087803b15801561227d57600080fd5b505af1158015612291573d6000803e3d6000fd5b50505050505050505050505050505050565b6122ad60016118cd565b6001600160a01b0316336001600160a01b0316146123015760405162461bcd60e51b8152602060048201526011602482015270155b985d5d1a1bdc9a5e99590818d85b1b607a1b6044820152606401610866565b565b60008061195960026118cd565b600089898989898989898960405160200161233399989796959493929190613a95565b6040516020818303038152906040528051906020012090509998505050505050505050565b600081516041146123ab5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610866565b60208201516040830151606084015160001a6123c986828585612d37565b9695505050505050565b6000806123ec6123e66103e860646137b6565b84612ee0565b90506123fb6103e860466137b6565b81101561245c57611a61600280548060200260200160405190810160405280929190818152602001828054801561245157602002820191906000526020600020905b81548152602001906001019080831161243d575b5050505050846125ae565b6124696103e8605e6137b6565b8110156124c857611a616003805480602002602001604051908101604052809291908181526020018280548015612451576020028201919060005260206000209081548152602001906001019080831161243d575050505050846125ae565b6124d56103e860636137b6565b81101561253457611a616004805480602002602001604051908101604052809291908181526020018280548015612451576020028201919060005260206000209081548152602001906001019080831161243d575050505050846125ae565b6125416103e860646137b6565b8110156125a057611a616005805480602002602001604051908101604052809291908181526020018280548015612451576020028201919060005260206000209081548152602001906001019080831161243d575050505050846125ae565b6125a8613b12565b50919050565b6000806125bb8484612f19565b90506125c78184612f47565b949350505050565b60016125e76125e16103e860646137b6565b83612ee0565b10156118c9576125f5612fe2565b156118c9576000600680548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020905b815481526020019060010190808311612634575b5050505050905060005b815181101561272b57612663612303565b6001600160a01b031663084e6adf838381518110612683576126836138de565b60200260200101516040518263ffffffff1660e01b81526004016126a991815260200190565b602060405180830381865afa1580156126c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ea91906139f6565b60000361271957612714828281518110612706576127066138de565b602002602001015185612aab565b61272b565b8061272381613949565b915050612652565b50505050565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110612767576127676138de565b60200260200101906001600160a01b031690816001600160a01b03168152505060005b835181101561272b5761279b612303565b6001600160a01b031663f94190888583815181106127bb576127bb6138de565b6020026020010151846040518363ffffffff1660e01b81526004016127e1929190613787565b600060405180830381600087803b1580156127fb57600080fd5b505af115801561280f573d6000803e3d6000fd5b50505050808061281e90613949565b91505061278a565b60015461010090046001600160a01b031633148061284957506122ad60016118cd565b6123015760405162461bcd60e51b8152602060048201526011602482015270155b985d5d1a1bdc9a5e99590818d85b1b607a1b6044820152606401610866565b6000831561292e57612899612303565b6040517f2f817bf800000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b039190911690632f817bf8906044015b6020604051808303816000875af1158015612903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292791906139f6565b9050611a61565b612936612303565b6040517f491078f400000000000000000000000000000000000000000000000000000000815260048101859052602481018490526001600160a01b03919091169063491078f4906044016128e4565b600080600080612994856130fe565b90925090506129a38186613a0f565b9450858110156129fc57601b82600a81106129c0576129c06138de565b01546129cc90826137b6565b6129d69084613a0f565b92506129eb6129e58288613932565b86612985565b6129f59084613a0f565b9250612a28565b601b82600a8110612a0f57612a0f6138de565b0154612a1b90876137b6565b612a259084613a0f565b92505b5090949350505050565b600080600080612a41856130fe565b9092509050612a508186613a0f565b945085811015612a9857601182600a8110612a6d57612a6d6138de565b0154612a7990826137b6565b612a839084613a0f565b92506129eb612a928288613932565b86612a32565b601182600a8110612a0f57612a0f6138de565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110612ae157612ae16138de565b60200260200101906001600160a01b031690816001600160a01b031681525050612b09612303565b6001600160a01b031663f941908884836040518363ffffffff1660e01b8152600401612b36929190613787565b600060405180830381600087803b158015612b5057600080fd5b505af1158015612b64573d6000803e3d6000fd5b50505050505050565b8242612b77612303565b6001600160a01b031663a6203b63836040518263ffffffff1660e01b8152600401612ba491815260200190565b602060405180830381865afa158015612bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be591906139f6565b1115612c335760405162461bcd60e51b815260206004820152601f60248201527f5468697320746f6b656e206973206e6f742072656c6561736564207965742e006044820152606401610866565b604080516001808252818301909252600091602080830190803683370190505090508281600081518110612c6957612c696138de565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508481600081518110612cba57612cba6138de565b602002602001018181525050612cce612303565b6001600160a01b03166378b272218784846040518463ffffffff1660e01b8152600401612cfd93929190613b28565b600060405180830381600087803b158015612d1757600080fd5b505af1158015612d2b573d6000803e3d6000fd5b50505050505050505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612db45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610866565b8360ff16601b1480612dc957508360ff16601c145b612e205760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610866565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015612e74573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ed75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610866565b95945050505050565b600082825a604051602001612ef6929190613b53565b6040516020818303038152906040528051906020012060001c611a61919061390a565b600082612f27845184612ee0565b81518110612f3757612f376138de565b6020026020010151905092915050565b600080612f5a6123e66103e860646137b6565b90506000612f6b6103e860546137b6565b821015612f7c578492505050611959565b612f896103e8605e6137b6565b821015612f9857506001612fd8565b612fa56103e860636137b6565b821015612fb457506002612fd8565b612fc16103e860646137b6565b821015612fd057506003612fd8565b612fd8613b12565b612ed78582611eb8565b600080600680548060200260200160405190810160405280929190818152602001828054801561303157602002820191906000526020600020905b81548152602001906001019080831161301d575b5050505050905060005b81518110156130f55761304c612303565b6001600160a01b031663084e6adf83838151811061306c5761306c6138de565b60200260200101516040518263ffffffff1660e01b815260040161309291815260200190565b602060405180830381865afa1580156130af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d391906139f6565b6000036130e35760019250505090565b806130ed81613949565b91505061303b565b50600091505090565b60008060005b600a81101561316657600781600a8110613120576131206138de565b0154841015613154578084600783600a811061313e5761313e6138de565b015461314a9190613932565b9250925050915091565b8061315e81613949565b915050613104565b5060405162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e000000000000000000000000000000000000006044820152606401610866565b8280548282559060005260206000209081019282156131ea579160200282015b828111156131ea5782518255916020019190600101906131cf565b506131f69291506131fa565b5090565b5b808211156131f657600081556001016131fb565b60006020828403121561322157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611a6157600080fd5b60006020828403121561326357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a9576132a961326a565b604052919050565b6001600160a01b0381168114610e5c57600080fd5b80356132d1816132b1565b919050565b600060208083850312156132e957600080fd5b823567ffffffffffffffff8082111561330157600080fd5b818501915085601f83011261331557600080fd5b8135818111156133275761332761326a565b8060051b9150613338848301613280565b818152918301840191848101908884111561335257600080fd5b938501935b8385101561337c578435925061336c836132b1565b8282529385019390850190613357565b98975050505050505050565b6000806040838503121561339b57600080fd5b50508035926020909101359150565b600082601f8301126133bb57600080fd5b813567ffffffffffffffff8111156133d5576133d561326a565b6133e8601f8201601f1916602001613280565b8181528460208386010111156133fd57600080fd5b816020850160208301376000918101602001919091529392505050565b60008083601f84011261342c57600080fd5b50813567ffffffffffffffff81111561344457600080fd5b6020830191508360208260051b850101111561345f57600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561348657600080fd5b8a3567ffffffffffffffff8082111561349e57600080fd5b6134aa8e838f016133aa565b9b506134b860208e016132c6565b9a506134c660408e016132c6565b995060608d01359150808211156134dc57600080fd5b6134e88e838f0161341a565b909950975060808d013591508082111561350157600080fd5b61350d8e838f0161341a565b909750955060a08d0135945060c08d0135935060e08d013591508082111561353457600080fd5b506135418d828e016133aa565b9150509295989b9194979a5092959850565b600081518084526020808501945080840160005b8381101561358357815187529582019590820190600101613567565b509495945050505050565b602081526000611a616020830184613553565b600080602083850312156135b457600080fd5b823567ffffffffffffffff808211156135cc57600080fd5b818501915085601f8301126135e057600080fd5b8135818111156135ef57600080fd5b86602082850101111561360157600080fd5b60209290920196919550909350505050565b6000806000806000806060878903121561362c57600080fd5b863567ffffffffffffffff8082111561364457600080fd5b6136508a838b0161341a565b9098509650602089013591508082111561366957600080fd5b6136758a838b0161341a565b9096509450604089013591508082111561368e57600080fd5b5061369b89828a0161341a565b979a9699509497509295939492505050565b6000602082840312156136bf57600080fd5b8135611a61816132b1565b6000806000806000606086880312156136e257600080fd5b853567ffffffffffffffff808211156136fa57600080fd5b61370689838a0161341a565b9097509550602088013591508082111561371f57600080fd5b5061372c8882890161341a565b9094509250506040860135613740816132b1565b809150509295509295909350565b600081518084526020808501945080840160005b838110156135835781516001600160a01b031687529582019590820190600101613762565b8281526040602082015260006125c7604083018461374e565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156137d0576137d06137a0565b500290565b60005b838110156137f05781810151838201526020016137d8565b8381111561272b5750506000910152565b600081518084526138198160208601602086016137d5565b601f01601f19169290920160200192915050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561385f57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60c08152600061388f60c083018b613801565b6001600160a01b038a16602084015282810360408401526138b181898b61382d565b905082810360608401526138c681878961382d565b6080840195909552505060a001529695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613919576139196138f4565b500690565b60008261392d5761392d6138f4565b500490565b600082821015613944576139446137a0565b500390565b60006001820161395b5761395b6137a0565b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b8015158114610e5c57600080fd5b6000602082840312156139b157600080fd5b8135611a6181613991565b6000602082840312156139ce57600080fd5b8151611a6181613991565b6000602082840312156139eb57600080fd5b8151611a61816132b1565b600060208284031215613a0857600080fd5b5051919050565b60008219821115613a2257613a226137a0565b500190565b6001600160a01b0384168152826020820152606060408201526000612ed76060830184613801565b60007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a7e57600080fd5b8260051b8083863760009401938452509192915050565b60008a51613aa7818460208f016137d5565b80830190507fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808c60601b168252808b60601b16601483015250613af9613af2602883018a8c613a4f565b8789613a4f565b9485525050506020820152604001979650505050505050565b634e487b7160e01b600052600160045260246000fd5b838152606060208201526000613b41606083018561374e565b82810360408401526123c98185613553565b60008351613b658184602088016137d5565b919091019182525060200191905056fea2646970667358221220d8c1b9e236d2b3e818e76db6b77fda73ea8e4d5a733b272b6a7e85b6089acf9464736f6c634300080e0033000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

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

000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

-----Decoded View---------------
Arg [0] : registryAddress (address): 0x801b308f0213445e070f0d0cc052db38c17eda51

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51


Deployed ByteCode Sourcemap

53845:39383:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3661:183;;;;;;:::i;:::-;3803:33;;3774:4;3803:33;;;;;;;;;;;;;;3661:183;;;;516:14:1;;509:22;491:41;;479:2;464:18;3661:183:0;;;;;;;;57711:190;;;;;;:::i;:::-;;:::i;:::-;;;874:25:1;;;862:2;847:18;57711:190:0;728:177:1;55227:138:0;;55288:77;55227:138;;59884:239;;;;;;:::i;:::-;;:::i;:::-;;55688:51;;;:::i;71276:209::-;;;;;;:::i;:::-;;:::i;54065:39::-;;54100:4;54065:39;;54813:141;;54877:77;54813:141;;64438:1858;;;;;;:::i;:::-;;:::i;78547:318::-;;;:::i;:::-;;;;;;;:::i;55898:51::-;;;:::i;74373:823::-;;;:::i;55432:136::-;;55491:77;55432:136;;56320:52;;;:::i;56537:53::-;;;:::i;56222:43::-;;56264:1;56222:43;;71685:1197;;;:::i;12355:131::-;;;:::i;61721:165::-;;;;;;:::i;:::-;;:::i;70134:691::-;;;;;;:::i;:::-;;:::i;55601:39::-;;55636:4;55601:39;;57987:200;;;;;;:::i;:::-;;:::i;73078:1099::-;;;:::i;76389:1295::-;;;:::i;54611:139::-;;54673:77;54611:139;;60732:239;;;;;;:::i;:::-;;:::i;12638:613::-;;;;;;:::i;:::-;;:::i;55018:140::-;;55081:77;55018:140;;13594:175;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8135:55:1;;;8117:74;;8105:2;8090:18;13594:175:0;7971:226:1;54171:45:0;;54215:1;54171:45;;60278:242;;;;;;:::i;:::-;;:::i;80391:279::-;;;;;;:::i;:::-;;:::i;79770:263::-;;;;;;:::i;:::-;;:::i;61223:337::-;;;:::i;54444:104::-;;54509:39;54444:104;;57296:328;;;;;;:::i;:::-;;:::i;54278:96::-;;54335:39;54278:96;;62376:417;;;;;;:::i;:::-;;:::i;75402:783::-;;;:::i;55793:53::-;;;:::i;12494:136::-;;;:::i;13475:111::-;13562:16;;;;;-1:-1:-1;;;;;13562:16:0;13475:111;;79074:334;;;:::i;78146:189::-;;;;;;:::i;:::-;;:::i;67912:1485::-;;;;;;:::i;:::-;;:::i;13373:94::-;13450:9;;;;13373:94;;57711:190;;;;;;;;;;;;;;;-1:-1:-1;57711:190:0;:::o;59884:239::-;11455:20;:18;:20::i;:::-;60003:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;60003:33:0::1;;54673:77;60092:12;60003:112;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59884:239:::0;:::o;55688:51::-;55725:14;55636:4;55725:3;:14;:::i;:::-;55688:51;:::o;71276:209::-;11455:20;:18;:20::i;:::-;71411:17:::1;:15;:17::i;:::-;:66;::::0;;;;::::1;::::0;::::1;10477:25:1::0;;;10518:18;;;10511:34;;;-1:-1:-1;;;;;71411:37:0;;;::::1;::::0;::::1;::::0;10450:18:1;;71411:66:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;71276:209:::0;;:::o;64438:1858::-;58513:24;58532:4;58513:18;:24::i;:::-;-1:-1:-1;;;;;58499:38:0;:10;-1:-1:-1;;;;;58499:38:0;;58491:68;;;;-1:-1:-1;;;58491:68:0;;10758:2:1;58491:68:0;;;10740:21:1;10797:2;10777:18;;;10770:30;-1:-1:-1;;;10816:18:1;;;10809:47;10873:18;;58491:68:0;;;;;;;;;64764:16:::1;64783:186;64810:12;64837:6;64858:9;64882:7;;64904;;64926:5;64946:12;64783;:186::i;:::-;64764:205;;64980:26;65009:105;65037:38;65066:8;53646:58:::0;;19811:66:1;53646:58:0;;;19799:79:1;19894:12;;;19887:28;;;53477:7:0;;19931:12:1;;53646:58:0;;;;;;;;;;;;53618:101;;;;;;53598:121;;53381:346;;;;65037:38:::1;65090:13;65009;:105::i;:::-;64980:134;;65169:24;65188:4;65169:18;:24::i;:::-;-1:-1:-1::0;;;;;65147:46:0::1;:18;-1:-1:-1::0;;;;;65147:46:0::1;;65125:141;;;::::0;-1:-1:-1;;;65125:141:0;;11104:2:1;65125:141:0::1;::::0;::::1;11086:21:1::0;11143:2;11123:18;;;11116:30;11182:34;11162:18;;;11155:62;11253:15;11233:18;;;11226:43;11286:19;;65125:141:0::1;10902:409:1::0;65125:141:0::1;65277:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;65277:31:0::1;;65323:12;65350:6;65371:7;;65393;;65415:5;65435:12;65277:181;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;65509:1:0::1;65491:19:::0;::::1;::::0;-1:-1:-1;;65491:66:0;::::1;;;;54509:39;65514:7;;65522:1;65514:10;;;;;;;:::i;:::-;;;;;;;:43;65491:66;65469:143;;;::::0;-1:-1:-1;;;65469:143:0;;13600:2:1;65469:143:0::1;::::0;::::1;13582:21:1::0;13639:2;13619:18;;;13612:30;13678:29;13658:18;;;13651:57;13725:18;;65469:143:0::1;13398:351:1::0;65469:143:0::1;54100:4;65631:7;;65639:1;65631:10;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;:26:::0;65623:58:::1;;;::::0;-1:-1:-1;;;65623:58:0;;14262:2:1;65623:58:0::1;::::0;::::1;14244:21:1::0;14301:2;14281:18;;;14274:30;14340:21;14320:18;;;14313:49;14379:18;;65623:58:0::1;14060:343:1::0;65623:58:0::1;65694:19;54100:4;65716:7;;65724:1;65716:10;;;;;;;:::i;:::-;;;;;;;:21;;;;:::i;:::-;65694:43;;65753:9;65748:541;65772:11;65768:1;:15;65748:541;;;65836:32;::::0;;54215:1:::1;65836:32:::0;;;;;::::1;::::0;;;65805:28:::1;::::0;65836:32:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;65836:32:0::1;65805:63;;65888:9;65883:139;65907:21;65927:1;54215;65907:21;:::i;:::-;65903:1;:25;65883:139;;;65971:35;65992:13;65971:20;:35::i;:::-;65954:11;65966:1;65954:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:52;65930:3;::::1;::::0;::::1;:::i;:::-;;;;65883:139;;;;66073:94;66106:14;66073:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66139:13;66073:14;:94::i;:::-;66036:11:::0;66048:21:::1;66068:1;54215;66048:21;:::i;:::-;66036:34;;;;;;;;:::i;:::-;;;;;;:131;;;::::0;::::1;66182:46;66203:9;66214:13;66182:20;:46::i;:::-;66243:34;66254:11;66267:9;66243:10;:34::i;:::-;-1:-1:-1::0;65785:3:0;::::1;::::0;::::1;:::i;:::-;;;;65748:541;;;;64753:1543;;;64438:1858:::0;;;;;;;;;;:::o;78547:318::-;78708:18;;;78643:28;78708:18;;;;;;;;;78600:16;;78643:28;78629:11;;78643:28;78708:18;;;;;;;;;;-1:-1:-1;78708:18:0;78682:44;;78742:9;78737:97;78761:3;78757:1;:7;78737:97;;;78798:21;78820:1;78798:24;;;;;;;:::i;:::-;;;78786:6;78793:1;78786:9;;;;;;;;:::i;:::-;;;;;;;;;;:36;78766:3;;;;:::i;:::-;;;;78737:97;;;-1:-1:-1;78851:6:0;78547:318;-1:-1:-1;;78547:318:0:o;55898:51::-;55936:13;55636:4;55936:2;:13;:::i;74373:823::-;11455:20;:18;:20::i;:::-;74446:14:::1;:21:::0;:26;74438:67:::1;;;::::0;-1:-1:-1;;;74438:67:0;;15005:2:1;74438:67:0::1;::::0;::::1;14987:21:1::0;15044:2;15024:18;;;15017:30;15083;15063:18;;;15056:58;15131:18;;74438:67:0::1;14803:352:1::0;74438:67:0::1;74516:672;;;;;;;;74548:77;74516:672;;;;74640:77;74516:672;;;;74732:77;74516:672;;;;74824:77;74516:672;;;;74916:77;74516:672;;;;75008:77;74516:672;;;;75100:77;74516:672;;::::0;:14:::1;:672;;;;;;;:::i;:::-;;74373:823::o:0;56320:52::-;56359:13;55636:4;56359:2;:13;:::i;56537:53::-;56577:13;55636:4;56577:2;:13;:::i;71685:1197::-;11455:20;:18;:20::i;:::-;71760:16:::1;:23:::0;:28;71752:69:::1;;;::::0;-1:-1:-1;;;71752:69:0;;15005:2:1;71752:69:0::1;::::0;::::1;14987:21:1::0;15044:2;15024:18;;;15017:30;15083;15063:18;;;15056:58;15131:18;;71752:69:0::1;14803:352:1::0;71752:69:0::1;71832:1042;;;;;;;;71866:77;71832:1042;;;;71958:77;71832:1042;;;;72050:77;71832:1042;;;;72142:77;71832:1042;;;;72234:77;71832:1042;;;;72326:77;71832:1042;;;;72418:77;71832:1042;;;;72510:77;71832:1042;;;;72602:77;71832:1042;;;;72694:77;71832:1042;;;;72786:77;71832:1042;;::::0;:16:::1;:1042;;;;;;;:::i;12355:131::-:0;11553:30;:28;:30::i;:::-;12445:4:::1;12433:16:::0;;-1:-1:-1;;12433:16:0::1;::::0;::::1;::::0;;12467:11:::1;::::0;::::1;::::0;12433:9:::1;::::0;12467:11:::1;12355:131::o:0;61721:165::-;11455:20;:18;:20::i;:::-;61834:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;61834:39:0::1;;61874:3;;61834:44;;;;;;;;;;;;;;;;:::i;70134:691::-:0;70323:16;11455:20;:18;:20::i;:::-;70366:4;70410:23;;::::1;:58:::0;::::1;;;-1:-1:-1::0;70437:31:0;;::::1;70410:58;70388:132;;;::::0;-1:-1:-1;;;70388:132:0;;15757:2:1;70388:132:0::1;::::0;::::1;15739:21:1::0;15796:2;15776:18;;;15769:30;15835:26;15815:18;;;15808:54;15879:18;;70388:132:0::1;15555:348:1::0;70388:132:0::1;70533:24;70574:3;70560:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;70560:18:0::1;;70533:45;;70594:9;70589:204;70613:3;70609:1;:7;70589:204;;;70651:130;70689:4;;70694:1;70689:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;70715:9;;70725:1;70715:12;;;;;;;:::i;:::-;;;;;;;70746:17;;70764:1;70746:20;;;;;;;:::i;:::-;;;;;;;70651:19;:130::i;:::-;70638:7;70646:1;70638:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:143;70618:3:::1;::::0;::::1;:::i;:::-;;;70589:204;;;-1:-1:-1::0;70810:7:0;70134:691;-1:-1:-1;;;;;;;;70134:691:0:o;57987:200::-;;;;;;;;;;;73078:1099;11455:20;:18;:20::i;:::-;73151:14:::1;:21:::0;:26;73143:67:::1;;;::::0;-1:-1:-1;;;73143:67:0;;15005:2:1;73143:67:0::1;::::0;::::1;14987:21:1::0;15044:2;15024:18;;;15017:30;15083;15063:18;;;15056:58;15131:18;;73143:67:0::1;14803:352:1::0;73143:67:0::1;73221:948;;;;;;;;73253:77;73221:948;;;;73345:77;73221:948;;;;73437:77;73221:948;;;;73529:77;73221:948;;;;73621:77;73221:948;;;;73713:77;73221:948;;;;73805:77;73221:948;;;;73897:77;73221:948;;;;73989:77;73221:948;;;;74081:77;73221:948;;::::0;:14:::1;:948;;;;;;;:::i;76389:1295::-:0;11455:20;:18;:20::i;:::-;76466:18:::1;:25:::0;:30;76458:71:::1;;;::::0;-1:-1:-1;;;76458:71:0;;15005:2:1;76458:71:0::1;::::0;::::1;14987:21:1::0;15044:2;15024:18;;;15017:30;15083;15063:18;;;15056:58;15131:18;;76458:71:0::1;14803:352:1::0;76458:71:0::1;76540:1136;;;;;;;;76576:77;76540:1136;;;;76668:77;76540:1136;;;;76760:77;76540:1136;;;;76852:77;76540:1136;;;;76944:77;76540:1136;;;;77036:77;76540:1136;;;;77128:77;76540:1136;;;;77220:77;76540:1136;;;;77312:77;76540:1136;;;;77404:77;76540:1136;;;;77496:77;76540:1136;;;;77588:77;76540:1136;;::::0;:18:::1;:1136;;;;;;;:::i;60732:239::-:0;11455:20;:18;:20::i;:::-;60850:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;60850:33:0::1;;55081:77;60940:12;60850:113;;;;;;;;;;;;;;;;:::i;12638:613::-:0;11455:20;:18;:20::i;:::-;12763:16:::1;:34:::0;;-1:-1:-1;;;;;12763:34:0;::::1;;;::::0;;;::::1;;::::0;;12827:19:::1;13562:16:::0;;-1:-1:-1;;;;;13562:16:0;;;;;;13475:111;12827:19:::1;:66;::::0;;;;12865:27:::1;12827:66;::::0;::::1;16421:98:1::0;-1:-1:-1;;;;;12827:37:0;;;::::1;::::0;::::1;::::0;16394:18:1;;12827:66:0::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;12827:66:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;12827:66:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;12810:434;;13127:105;::::0;-1:-1:-1;;;13127:105:0;;16982:2:1;13127:105:0::1;::::0;::::1;16964:21:1::0;17021:2;17001:18;;;16994:30;17060:34;17040:18;;;17033:62;17131:33;17111:18;;;17104:61;17182:19;;13127:105:0::1;16780:427:1::0;12810:434:0::1;12977:17;12951:142;;;::::0;-1:-1:-1;;;12951:142:0;;16982:2:1;12951:142:0::1;::::0;::::1;16964:21:1::0;17021:2;17001:18;;;16994:30;17060:34;17040:18;;;17033:62;17131:33;17111:18;;;17104:61;17182:19;;12951:142:0::1;16780:427:1::0;12951:142:0::1;12903:202;12638:613:::0;:::o;13594:175::-;13562:16;;13733:28;;;;;;;;874:25:1;;;-1:-1:-1;;13562:16:0;;;-1:-1:-1;;;;;13562:16:0;;13733:23;;847:18:1;;13733:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13726:35;13594:175;-1:-1:-1;;13594:175:0:o;60278:242::-;11455:20;:18;:20::i;:::-;60398:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;60398:33:0::1;;54877:77;60489:12;60398:114;;;;;;;;;;;;;;;;:::i;80391:279::-:0;80456:7;80476:20;80499:17;:15;:17::i;:::-;:88;;-1:-1:-1;;;80499:88:0;;54509:39;80499:88;;;874:25:1;-1:-1:-1;;;;;80499:33:0;;;;;;;847:18:1;;80499:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80476:111;;54100:4;80605:46;80630:6;80638:12;80605:24;:46::i;:::-;:57;;;;:::i;:::-;80598:64;80391:279;-1:-1:-1;;;80391:279:0:o;79770:263::-;79835:7;79855:20;79878:17;:15;:17::i;:::-;:80;;-1:-1:-1;;;79878:80:0;;54335:39;79878:80;;;874:25:1;-1:-1:-1;;;;;79878:33:0;;;;;;;847:18:1;;79878:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79855:103;;54100:4;79976:38;79993:6;80001:12;79976:16;:38::i;61223:337::-;11455:20;:18;:20::i;:::-;61292:27:::1;61322:21;61341:1;61322:18;:21::i;:::-;61292:51;;61361:9;61356:124;61380:2;61376:1;:6;61356:124;;;61404:64;55288:77;61448:19;61404:16;:64::i;:::-;61384:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61356:124;;;;61490:62;55491:77;61532:19;61490:16;:62::i;57296:328::-:0;;;;;;;;;;;62376:417;58371:24;58390:4;58371:18;:24::i;:::-;-1:-1:-1;;;;;58357:38:0;:10;-1:-1:-1;;;;;58357:38:0;;58349:68;;;;-1:-1:-1;;;58349:68:0;;10758:2:1;58349:68:0;;;10740:21:1;10797:2;10777:18;;;10770:30;-1:-1:-1;;;10816:18:1;;;10809:47;10873:18;;58349:68:0;10556:341:1;58349:68:0;62563:37;;::::1;62541:111;;;::::0;-1:-1:-1;;;62541:111:0;;15757:2:1;62541:111:0::1;::::0;::::1;15739:21:1::0;15796:2;15776:18;;;15769:30;15835:26;15815:18;;;15808:54;15879:18;;62541:111:0::1;15555:348:1::0;62541:111:0::1;62670:9;62665:121;62685:23:::0;;::::1;62665:121;;;62730:44;62742:12;;62755:1;62742:15;;;;;;;:::i;:::-;;;;;;;62759:7;;62767:1;62759:10;;;;;;;:::i;:::-;;;;;;;62771:2;62730:11;:44::i;:::-;62710:3;::::0;::::1;:::i;:::-;;;62665:121;;75402:783:::0;11455:20;:18;:20::i;:::-;75494:19:::1;:26:::0;:31;75472:109:::1;;;::::0;-1:-1:-1;;;75472:109:0;;15005:2:1;75472:109:0::1;::::0;::::1;14987:21:1::0;15044:2;15024:18;;;15017:30;15083;15063:18;;;15056:58;15131:18;;75472:109:0::1;14803:352:1::0;75472:109:0::1;75592:585;;;;;;;;75629:77;75592:585;;;;75721:77;75592:585;;;;75813:77;75592:585;;;;75905:77;75592:585;;;;75997:77;75592:585;;;;76089:77;75592:585;;::::0;:19:::1;:585;;;;;;;:::i;55793:53::-:0;55833:13;55636:4;55833:2;:13;:::i;12494:136::-;11553:30;:28;:30::i;:::-;12574:9:::1;:17:::0;;-1:-1:-1;;12574:17:0::1;::::0;;12609:13:::1;::::0;::::1;::::0;12586:5:::1;::::0;12609:13:::1;12494:136::o:0;79074:334::-;79243:18;;;79170:36;79243:18;;;;;;;;;79127:16;;79170:36;79156:11;;79170:36;79243:18;;;;;;;;;;-1:-1:-1;79243:18:0;79217:44;;79277:9;79272:105;79296:3;79292:1;:7;79272:105;;;79333:29;79363:1;79333:32;;;;;;;:::i;:::-;;;79321:6;79328:1;79321:9;;;;;;;;:::i;:::-;;;;;;;;;;:44;79301:3;;;;:::i;:::-;;;;79272:105;;78146:189;78257:7;78323:3;78291:27;78309:9;78292:13;;;78291:27;:::i;:::-;78290:36;;;78146:189;-1:-1:-1;;;78146:189:0:o;67912:1485::-;58678:10;58650:24;58669:4;58650:18;:24::i;:::-;-1:-1:-1;;;;;58650:38:0;;58642:68;;;;-1:-1:-1;;;58642:68:0;;10758:2:1;58642:68:0;;;10740:21:1;10797:2;10777:18;;;10770:30;-1:-1:-1;;;10816:18:1;;;10809:47;10873:18;;58642:68:0;10556:341:1;58642:68:0;68255:16:::1;68274:186;68301:12;68328:6;68349:9;68373:7;;68395;;68417:5;68437:12;68274;:186::i;:::-;68255:205;;68471:26;68500:105;68528:38;68557:8;53646:58:::0;;19811:66:1;53646:58:0;;;19799:79:1;19894:12;;;19887:28;;;53477:7:0;;19931:12:1;;53646:58:0;;;;;;;;;;;;53618:101;;;;;;53598:121;;53381:346;;;;68500:105:::1;68471:134;;68660:24;68679:4;68660:18;:24::i;:::-;-1:-1:-1::0;;;;;68638:46:0::1;:18;-1:-1:-1::0;;;;;68638:46:0::1;;68616:141;;;::::0;-1:-1:-1;;;68616:141:0;;11104:2:1;68616:141:0::1;::::0;::::1;11086:21:1::0;11143:2;11123:18;;;11116:30;11182:34;11162:18;;;11155:62;11253:15;11233:18;;;11226:43;11286:19;;68616:141:0::1;10902:409:1::0;68616:141:0::1;68768:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;68768:31:0::1;;68814:12;68841:6;68862:7;;68884;;68906:5;68926:12;68768:181;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;69000:1:0::1;68982:19:::0;::::1;::::0;-1:-1:-1;;68982:141:0;::::1;;;;54877:77;69022:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;69022:40:0::1;;69063:7;;69071:1;69063:10;;;;;;;:::i;:::-;;;;;;;69022:52;;;;;;;;;;;;;874:25:1::0;;862:2;847:18;;728:177;69022:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;68982:141;68960:218;;;::::0;-1:-1:-1;;;68960:218:0;;13600:2:1;68960:218:0::1;::::0;::::1;13582:21:1::0;13639:2;13619:18;;;13612:30;13678:29;13658:18;;;13651:57;13725:18;;68960:218:0::1;13398:351:1::0;68960:218:0::1;69197:7;;69205:1;69197:10;;;;;;;:::i;:::-;;;;;;;69211:1;69197:15;69189:47;;;::::0;-1:-1:-1;;;69189:47:0;;14262:2:1;69189:47:0::1;::::0;::::1;14244:21:1::0;14301:2;14281:18;;;14274:30;14340:21;14320:18;;;14313:49;14379:18;;69189:47:0::1;14060:343:1::0;69189:47:0::1;69263:21;69282:1;69263:18;:21::i;:::-;-1:-1:-1::0;;;;;69249:52:0::1;;69316:9;69340:7;;69348:1;69340:10;;;;;;;:::i;:::-;;;;;;;69365:13;69249:140;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68244:1153;;67912:1485:::0;;;;;;;;;;:::o;14491:128::-;14568:21;14587:1;14568:18;:21::i;:::-;-1:-1:-1;;;;;14554:35:0;:10;-1:-1:-1;;;;;14554:35:0;;14546:65;;;;-1:-1:-1;;;14546:65:0;;10758:2:1;14546:65:0;;;10740:21:1;10797:2;10777:18;;;10770:30;-1:-1:-1;;;10816:18:1;;;10809:47;10873:18;;14546:65:0;10556:341:1;14546:65:0;14491:128::o;80917:165::-;80967:7;80987:22;81020:21;81039:1;81020:18;:21::i;85658:614::-;85927:7;86034:12;86069:6;86098:9;86130:7;;86160;;86190:5;86218:12;85995:254;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85967:297;;;;;;85947:317;;85658:614;;;;;;;;;;;:::o;50631:793::-;50736:7;50804:9;:16;50824:2;50804:22;50800:96;;50843:41;;-1:-1:-1;;;50843:41:0;;20156:2:1;50843:41:0;;;20138:21:1;20195:2;20175:18;;;20168:30;20234:33;20214:18;;;20207:61;20285:18;;50843:41:0;19954:355:1;50800:96:0;51257:4;51242:20;;51236:27;51303:4;51288:20;;51282:27;51357:4;51342:20;;51336:27;50965:9;51328:36;51394:22;51402:4;51328:36;51236:27;51282;51394:7;:22::i;:::-;51387:29;50631:793;-1:-1:-1;;;;;;50631:793:0:o;88613:670::-;88711:15;;88767:34;55725:14;55636:4;55725:3;:14;:::i;:::-;88796:4;88767:16;:34::i;:::-;88744:57;-1:-1:-1;55833:13:0;55636:4;55833:2;:13;:::i;:::-;88816:12;:28;88812:440;;;88868:38;88883:16;88868:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88901:4;88868:14;:38::i;88812:440::-;55936:13;55636:4;55936:2;:13;:::i;:::-;88928:12;:26;88924:328;;;88978:36;88993:14;88978:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89009:4;88978:14;:36::i;88924:328::-;56039:13;55636:4;56039:2;:13;:::i;:::-;89036:12;:26;89032:220;;;89086:36;89101:14;89086:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89117:4;89086:14;:36::i;89032:220::-;56152:14;55636:4;56152:3;:14;:::i;:::-;89144:12;:31;89140:112;;;89199:41;89214:19;89199:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89235:4;89199:14;:41::i;89140:112::-;89262:13;;:::i;:::-;88733:550;88613:670;;;:::o;89658:284::-;89781:15;89814:20;89837:42;89860:12;89874:4;89837:22;:42::i;:::-;89814:65;;89897:37;89915:12;89929:4;89897:17;:37::i;:::-;89890:44;89658:284;-1:-1:-1;;;;89658:284:0:o;91508:653::-;56264:1;91613:34;55725:14;55636:4;55725:3;:14;:::i;:::-;91642:4;91613:16;:34::i;:::-;:52;91609:545;;;91686:20;:18;:20::i;:::-;91682:461;;;91727:30;91760:18;91727:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91802:9;91797:331;91821:13;:20;91817:1;:24;91797:331;;;91901:17;:15;:17::i;:::-;-1:-1:-1;;;;;91901:33:0;;91935:13;91949:1;91935:16;;;;;;;;:::i;:::-;;;;;;;91901:51;;;;;;;;;;;;;874:25:1;;862:2;847:18;;728:177;91901:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91956:1;91901:56;91871:238;;92008:45;92025:13;92039:1;92025:16;;;;;;;;:::i;:::-;;;;;;;92043:9;92008:16;:45::i;:::-;92080:5;;91871:238;91843:3;;;;:::i;:::-;;;;91797:331;;;;91708:435;91508:653;;:::o;92941:284::-;93043:16;;;93057:1;93043:16;;;;;;;;;93018:22;;93043:16;;;;;;;;;;;-1:-1:-1;93043:16:0;93018:41;;93081:2;93070:5;93076:1;93070:8;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;93070:13:0;;;-1:-1:-1;;;;;93070:13:0;;;;;93099:9;93094:124;93118:7;:14;93114:1;:18;93094:124;;;93154:17;:15;:17::i;:::-;-1:-1:-1;;;;;93154:33:0;;93188:7;93196:1;93188:10;;;;;;;;:::i;:::-;;;;;;;93200:5;93154:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93134:3;;;;;:::i;:::-;;;;93094:124;;14778:226;14879:16;;;;;-1:-1:-1;;;;;14879:16:0;14865:10;:30;;:86;;;14930:21;14949:1;14930:18;:21::i;14865:86::-;14843:153;;;;-1:-1:-1;;;14843:153:0;;10758:2:1;14843:153:0;;;10740:21:1;10797:2;10777:18;;;10770:30;-1:-1:-1;;;10816:18:1;;;10809:47;10873:18;;14843:153:0;10556:341:1;81865:536:0;82001:7;82025:4;82021:373;;;82070:17;:15;:17::i;:::-;:129;;;;;;;;10477:25:1;;;10518:18;;;10511:34;;;-1:-1:-1;;;;;82070:39:0;;;;;;;10450:18:1;;82070:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82046:153;;;;82021:373;82256:17;:15;:17::i;:::-;:126;;;;;;;;10477:25:1;;;10518:18;;;10511:34;;;-1:-1:-1;;;;;82256:36:0;;;;;;;10450:18:1;;82256:126:0;10303:248:1;83711:645:0;83832:7;83857:14;83885:13;83900:17;83921:26;83934:12;83921;:26::i;:::-;83884:63;;-1:-1:-1;83884:63:0;-1:-1:-1;83958:25:0;83884:63;83958:25;;:::i;:::-;;;84010:6;83998:9;:18;83994:329;;;84055:29;84085:5;84055:36;;;;;;;:::i;:::-;;;84043:48;;:9;:48;:::i;:::-;84033:58;;;;:::i;:::-;;-1:-1:-1;84116:107:0;84159:18;84168:9;84159:6;:18;:::i;:::-;84196:12;84116:24;:107::i;:::-;84106:117;;;;:::i;:::-;;;83994:329;;;84275:29;84305:5;84275:36;;;;;;;:::i;:::-;;;84266:45;;:6;:45;:::i;:::-;84256:55;;;;:::i;:::-;;;83994:329;-1:-1:-1;84342:6:0;;83711:645;-1:-1:-1;;;;83711:645:0:o;82776:564::-;82889:7;82914:14;82942:13;82957:17;82978:26;82991:12;82978;:26::i;:::-;82941:63;;-1:-1:-1;82941:63:0;-1:-1:-1;83015:25:0;82941:63;83015:25;;:::i;:::-;;;83067:6;83055:9;:18;83051:256;;;83112:21;83134:5;83112:28;;;;;;;:::i;:::-;;;83100:40;;:9;:40;:::i;:::-;83090:50;;;;:::i;:::-;;-1:-1:-1;83165:50:0;83182:18;83191:9;83182:6;:18;:::i;:::-;83202:12;83165:16;:50::i;83051:256::-;83267:21;83289:5;83267:28;;;;;;;:::i;92445:205::-;92543:16;;;92557:1;92543:16;;;;;;;;;92518:22;;92543:16;;;;;;;;;;;-1:-1:-1;92543:16:0;92518:41;;92581:2;92570:5;92576:1;92570:8;;;;;;;;:::i;:::-;;;;;;:13;-1:-1:-1;;;;;92570:13:0;;;-1:-1:-1;;;;;92570:13:0;;;;;92594:17;:15;:17::i;:::-;-1:-1:-1;;;;;92594:33:0;;92628:6;92636:5;92594:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92507:143;92445:205;;:::o;90895:380::-;91018:11;58858:15;58808:17;:15;:17::i;:::-;-1:-1:-1;;;;;58808:37:0;;58846:7;58808:46;;;;;;;;;;;;;874:25:1;;862:2;847:18;;728:177;58808:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;58786:146;;;;-1:-1:-1;;;58786:146:0;;20705:2:1;58786:146:0;;;20687:21:1;20744:2;20724:18;;;20717:30;20783:33;20763:18;;;20756:61;20834:18;;58786:146:0;20503:355:1;58786:146:0;91067:16:::1;::::0;;91081:1:::1;91067:16:::0;;;;;::::1;::::0;;;91042:22:::1;::::0;91067:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;91067:16:0::1;91042:41;;91105:2;91094:5;91100:1;91094:8;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;91094:13:0;;;::::1;:8;::::0;;::::1;::::0;;;;;;;:13;91147:16:::1;::::0;;91161:1:::1;91147:16:::0;;;;;::::1;::::0;;;91118:26:::1;::::0;91147:16:::1;;;;;;;;;;;::::0;-1:-1:-1;91147:16:0::1;91118:45;;91189:6;91174:9;91184:1;91174:12;;;;;;;;:::i;:::-;;;;;;:21;;;::::0;::::1;91206:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;91206:30:0::1;;91237:11;91250:5;91257:9;91206:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;91031:244;;90895:380:::0;;;;:::o;51578:1529::-;51706:7;52662:66;52631:97;;;52609:181;;;;-1:-1:-1;;;52609:181:0;;21606:2:1;52609:181:0;;;21588:21:1;21645:2;21625:18;;;21618:30;21684:34;21664:18;;;21657:62;-1:-1:-1;;;21735:18:1;;;21728:32;21777:19;;52609:181:0;21404:398:1;52609:181:0;52809:1;:7;;52814:2;52809:7;:18;;;;52820:1;:7;;52825:2;52820:7;52809:18;52801:65;;;;-1:-1:-1;;;52801:65:0;;22009:2:1;52801:65:0;;;21991:21:1;22048:2;22028:18;;;22021:30;22087:34;22067:18;;;22060:62;-1:-1:-1;;;22138:18:1;;;22131:32;22180:19;;52801:65:0;21807:398:1;52801:65:0;52981:24;;;52964:14;52981:24;;;;;;;;;22437:25:1;;;22510:4;22498:17;;22478:18;;;22471:45;;;;22532:18;;;22525:34;;;22575:18;;;22568:34;;;52981:24:0;;22409:19:1;;52981:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52981:24:0;;-1:-1:-1;;52981:24:0;;;-1:-1:-1;;;;;;;53024:20:0;;53016:57;;;;-1:-1:-1;;;53016:57:0;;22815:2:1;53016:57:0;;;22797:21:1;22854:2;22834:18;;;22827:30;22893:26;22873:18;;;22866:54;22937:18;;53016:57:0;22613:348:1;53016:57:0;53093:6;51578:1529;-1:-1:-1;;;;;51578:1529:0:o;86626:235::-;86741:7;86842:11;86821:4;86827:9;86804:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;86794:44;;;;;;86786:53;;:67;;;;:::i;87152:201::-;87274:7;87306:3;87310:34;87327:3;:10;87339:4;87310:16;:34::i;:::-;87306:39;;;;;;;;:::i;:::-;;;;;;;87299:46;;87152:201;;;;:::o;87734:651::-;87845:7;;87893:34;55725:14;55636:4;55725:3;:14;:::i;87893:34::-;87870:57;-1:-1:-1;87938:17:0;56359:13;55636:4;56359:2;:13;:::i;:::-;87970:12;:27;87966:357;;;88021:6;88014:13;;;;;;87966:357;56468:13;55636:4;56468:2;:13;:::i;:::-;88049:12;:28;88045:278;;;-1:-1:-1;88106:1:0;88045:278;;;56577:13;55636:4;56577:2;:13;:::i;:::-;88129:12;:28;88125:198;;;-1:-1:-1;88186:1:0;88125:198;;;56682:14;55636:4;56682:3;:14;:::i;:::-;88209:12;:26;88205:118;;;-1:-1:-1;88264:1:0;88205:118;;;88298:13;;:::i;:::-;88340:37;88359:6;88367:9;88340:18;:37::i;90113:349::-;90165:4;90182:31;90216:18;90182:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90250:9;90245:187;90269:14;:21;90265:1;:25;90245:187;;;90316:17;:15;:17::i;:::-;-1:-1:-1;;;;;90316:33:0;;90350:14;90365:1;90350:17;;;;;;;;:::i;:::-;;;;;;;90316:52;;;;;;;;;;;;;874:25:1;;862:2;847:18;;728:177;90316:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90372:1;90316:57;90312:109;;90401:4;90394:11;;;;90113:349;:::o;90312:109::-;90292:3;;;;:::i;:::-;;;;90245:187;;;;90449:5;90442:12;;;90113:349;:::o;84641:387::-;84734:7;84743;84773:9;84768:219;84792:29;84788:1;:33;84768:219;;;84862:22;84885:1;84862:25;;;;;;;:::i;:::-;;;84847:12;:40;84843:133;;;84916:1;84947:12;84919:22;84942:1;84919:25;;;;;;;:::i;:::-;;;:40;;;;:::i;:::-;84908:52;;;;;84641:387;;;:::o;84843:133::-;84823:3;;;;:::i;:::-;;;;84768:219;;;-1:-1:-1;84997:23:0;;-1:-1:-1;;;84997:23:0;;23543:2:1;84997:23:0;;;23525:21:1;23582:2;23562:18;;;23555:30;23621:15;23601:18;;;23594:43;23654:18;;84997:23:0;23341:337:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:332:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;543:180;602:6;655:2;643:9;634:7;630:23;626:32;623:52;;;671:1;668;661:12;623:52;-1:-1:-1;694:23:1;;543:180;-1:-1:-1;543:180:1:o;910:184::-;-1:-1:-1;;;959:1:1;952:88;1059:4;1056:1;1049:15;1083:4;1080:1;1073:15;1099:275;1170:2;1164:9;1235:2;1216:13;;-1:-1:-1;;1212:27:1;1200:40;;1270:18;1255:34;;1291:22;;;1252:62;1249:88;;;1317:18;;:::i;:::-;1353:2;1346:22;1099:275;;-1:-1:-1;1099:275:1:o;1379:154::-;-1:-1:-1;;;;;1458:5:1;1454:54;1447:5;1444:65;1434:93;;1523:1;1520;1513:12;1538:134;1606:20;;1635:31;1606:20;1635:31;:::i;:::-;1538:134;;;:::o;1677:1021::-;1761:6;1792:2;1835;1823:9;1814:7;1810:23;1806:32;1803:52;;;1851:1;1848;1841:12;1803:52;1891:9;1878:23;1920:18;1961:2;1953:6;1950:14;1947:34;;;1977:1;1974;1967:12;1947:34;2015:6;2004:9;2000:22;1990:32;;2060:7;2053:4;2049:2;2045:13;2041:27;2031:55;;2082:1;2079;2072:12;2031:55;2118:2;2105:16;2140:2;2136;2133:10;2130:36;;;2146:18;;:::i;:::-;2192:2;2189:1;2185:10;2175:20;;2215:28;2239:2;2235;2231:11;2215:28;:::i;:::-;2277:15;;;2347:11;;;2343:20;;;2308:12;;;;2375:19;;;2372:39;;;2407:1;2404;2397:12;2372:39;2431:11;;;;2451:217;2467:6;2462:3;2459:15;2451:217;;;2547:3;2534:17;2521:30;;2564:31;2589:5;2564:31;:::i;:::-;2608:18;;;2484:12;;;;2646;;;;2451:217;;;2687:5;1677:1021;-1:-1:-1;;;;;;;;1677:1021:1:o;2703:248::-;2771:6;2779;2832:2;2820:9;2811:7;2807:23;2803:32;2800:52;;;2848:1;2845;2838:12;2800:52;-1:-1:-1;;2871:23:1;;;2941:2;2926:18;;;2913:32;;-1:-1:-1;2703:248:1:o;2956:530::-;2998:5;3051:3;3044:4;3036:6;3032:17;3028:27;3018:55;;3069:1;3066;3059:12;3018:55;3105:6;3092:20;3131:18;3127:2;3124:26;3121:52;;;3153:18;;:::i;:::-;3197:55;3240:2;3221:13;;-1:-1:-1;;3217:27:1;3246:4;3213:38;3197:55;:::i;:::-;3277:2;3268:7;3261:19;3323:3;3316:4;3311:2;3303:6;3299:15;3295:26;3292:35;3289:55;;;3340:1;3337;3330:12;3289:55;3405:2;3398:4;3390:6;3386:17;3379:4;3370:7;3366:18;3353:55;3453:1;3428:16;;;3446:4;3424:27;3417:38;;;;3432:7;2956:530;-1:-1:-1;;;2956:530:1:o;3491:367::-;3554:8;3564:6;3618:3;3611:4;3603:6;3599:17;3595:27;3585:55;;3636:1;3633;3626:12;3585:55;-1:-1:-1;3659:20:1;;3702:18;3691:30;;3688:50;;;3734:1;3731;3724:12;3688:50;3771:4;3763:6;3759:17;3747:29;;3831:3;3824:4;3814:6;3811:1;3807:14;3799:6;3795:27;3791:38;3788:47;3785:67;;;3848:1;3845;3838:12;3785:67;3491:367;;;;;:::o;3863:1458::-;4057:6;4065;4073;4081;4089;4097;4105;4113;4121;4129;4182:3;4170:9;4161:7;4157:23;4153:33;4150:53;;;4199:1;4196;4189:12;4150:53;4239:9;4226:23;4268:18;4309:2;4301:6;4298:14;4295:34;;;4325:1;4322;4315:12;4295:34;4348:49;4389:7;4380:6;4369:9;4365:22;4348:49;:::i;:::-;4338:59;;4416:38;4450:2;4439:9;4435:18;4416:38;:::i;:::-;4406:48;;4473:38;4507:2;4496:9;4492:18;4473:38;:::i;:::-;4463:48;;4564:2;4553:9;4549:18;4536:32;4520:48;;4593:2;4583:8;4580:16;4577:36;;;4609:1;4606;4599:12;4577:36;4648:72;4712:7;4701:8;4690:9;4686:24;4648:72;:::i;:::-;4739:8;;-1:-1:-1;4622:98:1;-1:-1:-1;4827:3:1;4812:19;;4799:33;;-1:-1:-1;4844:16:1;;;4841:36;;;4873:1;4870;4863:12;4841:36;4912:72;4976:7;4965:8;4954:9;4950:24;4912:72;:::i;:::-;5003:8;;-1:-1:-1;4886:98:1;-1:-1:-1;5085:3:1;5070:19;;5057:33;;-1:-1:-1;5137:3:1;5122:19;;5109:33;;-1:-1:-1;5195:3:1;5180:19;;5167:33;;-1:-1:-1;5212:16:1;;;5209:36;;;5241:1;5238;5231:12;5209:36;;5264:51;5307:7;5296:8;5285:9;5281:24;5264:51;:::i;:::-;5254:61;;;3863:1458;;;;;;;;;;;;;:::o;5326:435::-;5379:3;5417:5;5411:12;5444:6;5439:3;5432:19;5470:4;5499:2;5494:3;5490:12;5483:19;;5536:2;5529:5;5525:14;5557:1;5567:169;5581:6;5578:1;5575:13;5567:169;;;5642:13;;5630:26;;5676:12;;;;5711:15;;;;5603:1;5596:9;5567:169;;;-1:-1:-1;5752:3:1;;5326:435;-1:-1:-1;;;;;5326:435:1:o;5766:261::-;5945:2;5934:9;5927:21;5908:4;5965:56;6017:2;6006:9;6002:18;5994:6;5965:56;:::i;6032:592::-;6103:6;6111;6164:2;6152:9;6143:7;6139:23;6135:32;6132:52;;;6180:1;6177;6170:12;6132:52;6220:9;6207:23;6249:18;6290:2;6282:6;6279:14;6276:34;;;6306:1;6303;6296:12;6276:34;6344:6;6333:9;6329:22;6319:32;;6389:7;6382:4;6378:2;6374:13;6370:27;6360:55;;6411:1;6408;6401:12;6360:55;6451:2;6438:16;6477:2;6469:6;6466:14;6463:34;;;6493:1;6490;6483:12;6463:34;6538:7;6533:2;6524:6;6520:2;6516:15;6512:24;6509:37;6506:57;;;6559:1;6556;6549:12;6506:57;6590:2;6582:11;;;;;6612:6;;-1:-1:-1;6032:592:1;;-1:-1:-1;;;;6032:592:1:o;6629:1085::-;6784:6;6792;6800;6808;6816;6824;6877:2;6865:9;6856:7;6852:23;6848:32;6845:52;;;6893:1;6890;6883:12;6845:52;6933:9;6920:23;6962:18;7003:2;6995:6;6992:14;6989:34;;;7019:1;7016;7009:12;6989:34;7058:70;7120:7;7111:6;7100:9;7096:22;7058:70;:::i;:::-;7147:8;;-1:-1:-1;7032:96:1;-1:-1:-1;7235:2:1;7220:18;;7207:32;;-1:-1:-1;7251:16:1;;;7248:36;;;7280:1;7277;7270:12;7248:36;7319:72;7383:7;7372:8;7361:9;7357:24;7319:72;:::i;:::-;7410:8;;-1:-1:-1;7293:98:1;-1:-1:-1;7498:2:1;7483:18;;7470:32;;-1:-1:-1;7514:16:1;;;7511:36;;;7543:1;7540;7533:12;7511:36;;7582:72;7646:7;7635:8;7624:9;7620:24;7582:72;:::i;:::-;6629:1085;;;;-1:-1:-1;6629:1085:1;;-1:-1:-1;6629:1085:1;;7673:8;;6629:1085;-1:-1:-1;;;6629:1085:1:o;7719:247::-;7778:6;7831:2;7819:9;7810:7;7806:23;7802:32;7799:52;;;7847:1;7844;7837:12;7799:52;7886:9;7873:23;7905:31;7930:5;7905:31;:::i;8202:908::-;8333:6;8341;8349;8357;8365;8418:2;8406:9;8397:7;8393:23;8389:32;8386:52;;;8434:1;8431;8424:12;8386:52;8474:9;8461:23;8503:18;8544:2;8536:6;8533:14;8530:34;;;8560:1;8557;8550:12;8530:34;8599:70;8661:7;8652:6;8641:9;8637:22;8599:70;:::i;:::-;8688:8;;-1:-1:-1;8573:96:1;-1:-1:-1;8776:2:1;8761:18;;8748:32;;-1:-1:-1;8792:16:1;;;8789:36;;;8821:1;8818;8811:12;8789:36;;8860:72;8924:7;8913:8;8902:9;8898:24;8860:72;:::i;:::-;8951:8;;-1:-1:-1;8834:98:1;-1:-1:-1;;9036:2:1;9021:18;;9008:32;9049:31;9008:32;9049:31;:::i;:::-;9099:5;9089:15;;;8202:908;;;;;;;;:::o;9115:484::-;9168:3;9206:5;9200:12;9233:6;9228:3;9221:19;9259:4;9288:2;9283:3;9279:12;9272:19;;9325:2;9318:5;9314:14;9346:1;9356:218;9370:6;9367:1;9364:13;9356:218;;;9435:13;;-1:-1:-1;;;;;9431:62:1;9419:75;;9514:12;;;;9549:15;;;;9392:1;9385:9;9356:218;;9604:332;9811:6;9800:9;9793:25;9854:2;9849;9838:9;9834:18;9827:30;9774:4;9874:56;9926:2;9915:9;9911:18;9903:6;9874:56;:::i;9941:184::-;-1:-1:-1;;;9990:1:1;9983:88;10090:4;10087:1;10080:15;10114:4;10111:1;10104:15;10130:168;10170:7;10236:1;10232;10228:6;10224:14;10221:1;10218:21;10213:1;10206:9;10199:17;10195:45;10192:71;;;10243:18;;:::i;:::-;-1:-1:-1;10283:9:1;;10130:168::o;11316:258::-;11388:1;11398:113;11412:6;11409:1;11406:13;11398:113;;;11488:11;;;11482:18;11469:11;;;11462:39;11434:2;11427:10;11398:113;;;11529:6;11526:1;11523:13;11520:48;;;-1:-1:-1;;11564:1:1;11546:16;;11539:27;11316:258::o;11579:257::-;11620:3;11658:5;11652:12;11685:6;11680:3;11673:19;11701:63;11757:6;11750:4;11745:3;11741:14;11734:4;11727:5;11723:16;11701:63;:::i;:::-;11818:2;11797:15;-1:-1:-1;;11793:29:1;11784:39;;;;11825:4;11780:50;;11579:257;-1:-1:-1;;11579:257:1:o;11841:405::-;11945:6;11940:3;11933:19;11915:3;11975:66;11967:6;11964:78;11961:98;;;12055:1;12052;12045:12;11961:98;12091:6;12088:1;12084:14;12143:8;12136:5;12129:4;12124:3;12120:14;12107:45;12220:1;12175:18;;12195:4;12171:29;12209:13;;;-1:-1:-1;12171:29:1;;11841:405;-1:-1:-1;;11841:405:1:o;12251:953::-;12658:3;12647:9;12640:22;12621:4;12685:45;12725:3;12714:9;12710:19;12702:6;12685:45;:::i;:::-;-1:-1:-1;;;;;12770:6:1;12766:55;12761:2;12750:9;12746:18;12739:83;12870:9;12862:6;12858:22;12853:2;12842:9;12838:18;12831:50;12904:65;12962:6;12954;12946;12904:65;:::i;:::-;12890:79;;13017:9;13009:6;13005:22;13000:2;12989:9;12985:18;12978:50;13045:65;13103:6;13095;13087;13045:65;:::i;:::-;13141:3;13126:19;;13119:35;;;;-1:-1:-1;;13185:3:1;13170:19;13163:35;13037:73;12251:953;-1:-1:-1;;;;;;12251:953:1:o;13209:184::-;-1:-1:-1;;;13258:1:1;13251:88;13358:4;13355:1;13348:15;13382:4;13379:1;13372:15;13754:184;-1:-1:-1;;;13803:1:1;13796:88;13903:4;13900:1;13893:15;13927:4;13924:1;13917:15;13943:112;13975:1;14001;13991:35;;14006:18;;:::i;:::-;-1:-1:-1;14040:9:1;;13943:112::o;14408:120::-;14448:1;14474;14464:35;;14479:18;;:::i;:::-;-1:-1:-1;14513:9:1;;14408:120::o;14533:125::-;14573:4;14601:1;14598;14595:8;14592:34;;;14606:18;;:::i;:::-;-1:-1:-1;14643:9:1;;14533:125::o;14663:135::-;14702:3;14723:17;;;14720:43;;14743:18;;:::i;:::-;-1:-1:-1;14790:1:1;14779:13;;14663:135::o;15160:390::-;15319:2;15308:9;15301:21;15358:6;15353:2;15342:9;15338:18;15331:34;15415:6;15407;15402:2;15391:9;15387:18;15374:48;15471:1;15442:22;;;15466:2;15438:31;;;15431:42;;;;15534:2;15513:15;;;-1:-1:-1;;15509:29:1;15494:45;15490:54;;15160:390;-1:-1:-1;15160:390:1:o;15908:118::-;15994:5;15987:13;15980:21;15973:5;15970:32;15960:60;;16016:1;16013;16006:12;16031:241;16087:6;16140:2;16128:9;16119:7;16115:23;16111:32;16108:52;;;16156:1;16153;16146:12;16108:52;16195:9;16182:23;16214:28;16236:5;16214:28;:::i;16530:245::-;16597:6;16650:2;16638:9;16629:7;16625:23;16621:32;16618:52;;;16666:1;16663;16656:12;16618:52;16698:9;16692:16;16717:28;16739:5;16717:28;:::i;17212:251::-;17282:6;17335:2;17323:9;17314:7;17310:23;17306:32;17303:52;;;17351:1;17348;17341:12;17303:52;17383:9;17377:16;17402:31;17427:5;17402:31;:::i;17468:184::-;17538:6;17591:2;17579:9;17570:7;17566:23;17562:32;17559:52;;;17607:1;17604;17597:12;17559:52;-1:-1:-1;17630:16:1;;17468:184;-1:-1:-1;17468:184:1:o;17657:128::-;17697:3;17728:1;17724:6;17721:1;17718:13;17715:39;;;17734:18;;:::i;:::-;-1:-1:-1;17770:9:1;;17657:128::o;17790:408::-;-1:-1:-1;;;;;17997:6:1;17993:55;17982:9;17975:74;18085:6;18080:2;18069:9;18065:18;18058:34;18128:2;18123;18112:9;18108:18;18101:30;17956:4;18148:44;18188:2;18177:9;18173:18;18165:6;18148:44;:::i;18203:351::-;18273:3;18305:66;18297:6;18294:78;18291:98;;;18385:1;18382;18375:12;18291:98;18421:6;18418:1;18414:14;18462:8;18455:5;18450:3;18437:34;18528:1;18490:18;;18517:13;;;-1:-1:-1;18490:18:1;;18203:351;-1:-1:-1;;18203:351:1:o;18559:1005::-;18976:3;19014:6;19008:13;19030:53;19076:6;19071:3;19064:4;19056:6;19052:17;19030:53;:::i;:::-;19114:6;19109:3;19105:16;19092:29;;19140:66;19250:2;19241:6;19237:2;19233:15;19229:24;19222:5;19215:39;19307:2;19298:6;19294:2;19290:15;19286:24;19281:2;19274:5;19270:14;19263:48;;19333:124;19387:69;19452:2;19445:5;19441:14;19433:6;19425;19387:69;:::i;:::-;19379:6;19371;19333:124;:::i;:::-;19466:21;;;-1:-1:-1;;;19514:4:1;19503:16;;19496:32;19555:2;19544:14;;18559:1005;-1:-1:-1;;;;;;;18559:1005:1:o;20314:184::-;-1:-1:-1;;;20363:1:1;20356:88;20463:4;20460:1;20453:15;20487:4;20484:1;20477:15;20863:536;21148:6;21137:9;21130:25;21191:2;21186;21175:9;21171:18;21164:30;21111:4;21217:56;21269:2;21258:9;21254:18;21246:6;21217:56;:::i;:::-;21321:9;21313:6;21309:22;21304:2;21293:9;21289:18;21282:50;21349:44;21386:6;21378;21349:44;:::i;22966:370::-;23123:3;23161:6;23155:13;23177:53;23223:6;23218:3;23211:4;23203:6;23199:17;23177:53;:::i;:::-;23252:16;;;;23277:21;;;-1:-1:-1;23325:4:1;23314:16;;22966:370;-1:-1:-1;22966:370:1:o

Swarm Source

ipfs://d8c1b9e236d2b3e818e76db6b77fda73ea8e4d5a733b272b6a7e85b6089acf94
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.