ETH Price: $3,336.95 (-1.06%)

Token

DigitalaxMaterials (DXM)
 

Overview

Max Total Supply

0 DXM

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x00...dEaD
0x000000000000000000000000000000000000dead
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DigitalaxMaterials

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-24
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol






/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol






/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol






/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

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





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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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






/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
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 () internal {
        // 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;
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol





/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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





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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: contracts/ERC1155/ERC1155.sol

// Contract based from the following:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/aaa5ef81cf75454d1c337dc3de03d12480849ad1/contracts/token/ERC1155/ERC1155.sol



pragma solidity 0.6.12;







/**
 *
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 *
 * @notice Modifications to uri logic made by BlockRocket.tech
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using SafeMath for uint256;
    using Address for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) private _balances;

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

    // Token ID to its URI
    mapping (uint256 => string) internal tokenUris;

    // Token ID to its total supply
    mapping(uint256 => uint256) public tokenTotalSupply;

    /*
     *     bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
     *     bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
     *     bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
     *
     *     => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
     *        0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
     */
    bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;

    /*
     *     bytes4(keccak256('uri(uint256)')) == 0x0e89341c
     */
    bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;

    constructor () public {
        // register the supported interfaces to conform to ERC1155 via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155);

        // register the supported interfaces to conform to ERC1155MetadataURI via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     */
    function uri(uint256 tokenId) external view override returns (string memory) {
        return tokenUris[tokenId];
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
    public
    view
    override
    returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            require(accounts[i] != address(0), "ERC1155: batch balance query for the zero address");
            batchBalances[i] = _balances[ids[i]][accounts[i]];
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) external virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
    external
    virtual
    override
    {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer");
        _balances[id][to] = _balances[id][to].add(amount);

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    external
    virtual
    override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

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

            _balances[id][from] = _balances[id][from].sub(
                amount,
                "ERC1155: insufficient balance for transfer"
            );
            _balances[id][to] = _balances[id][to].add(amount);
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for a given token ID
     */
    function _setURI(uint256 tokenId, string memory newuri) internal virtual {
        tokenUris[tokenId] = newuri;
        emit URI(newuri, tokenId);
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] = _balances[id][account].add(amount);
        tokenTotalSupply[id] = tokenTotalSupply[id].add(amount);
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];
            _balances[id][to] = amount.add(_balances[id][to]);
            tokenTotalSupply[id] = tokenTotalSupply[id].add(amount);
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        _balances[id][account] = _balances[id][account].sub(
            amount,
            "ERC1155: burn amount exceeds balance"
        );

        tokenTotalSupply[id] = tokenTotalSupply[id].sub(amount);

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];
            _balances[id][account] = _balances[id][account].sub(
                amount,
                "ERC1155: burn amount exceeds balance"
            );

            tokenTotalSupply[id] = tokenTotalSupply[id].sub(amount);
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    internal virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
    private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
    private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: contracts/ERC1155/ERC1155Burnable.sol

//imported from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/aaa5ef81cf75454d1c337dc3de03d12480849ad1/contracts/token/ERC1155/ERC1155Burnable.sol



pragma solidity 0.6.12;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(address account, uint256 id, uint256 amount) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, amount);
    }

    function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, amounts);
    }
}

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





/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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








/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    using Address for address;

    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view returns (bool) {
        return _roles[role].members.contains(account);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (_roles[role].members.add(account)) {
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (_roles[role].members.remove(account)) {
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/DigitalaxAccessControls.sol



pragma solidity 0.6.12;


/**
 * @notice Access Controls contract for the Digitalax Platform
 * @author BlockRocket.tech
 */
contract DigitalaxAccessControls is AccessControl {
    /// @notice Role definitions
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant SMART_CONTRACT_ROLE = keccak256("SMART_CONTRACT_ROLE");

    /// @notice Events for adding and removing various roles
    event AdminRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event AdminRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );

    event MinterRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event MinterRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );

    event SmartContractRoleGranted(
        address indexed beneficiary,
        address indexed caller
    );

    event SmartContractRoleRemoved(
        address indexed beneficiary,
        address indexed caller
    );

    /**
     * @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses
     */
    constructor() public {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
    }

    /////////////
    // Lookups //
    /////////////

    /**
     * @notice Used to check whether an address has the admin role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasAdminRole(address _address) external view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, _address);
    }

    /**
     * @notice Used to check whether an address has the minter role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasMinterRole(address _address) external view returns (bool) {
        return hasRole(MINTER_ROLE, _address);
    }

    /**
     * @notice Used to check whether an address has the smart contract role
     * @param _address EOA or contract being checked
     * @return bool True if the account has the role or false if it does not
     */
    function hasSmartContractRole(address _address) external view returns (bool) {
        return hasRole(SMART_CONTRACT_ROLE, _address);
    }

    ///////////////
    // Modifiers //
    ///////////////

    /**
     * @notice Grants the admin role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addAdminRole(address _address) external {
        grantRole(DEFAULT_ADMIN_ROLE, _address);
        emit AdminRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the admin role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeAdminRole(address _address) external {
        revokeRole(DEFAULT_ADMIN_ROLE, _address);
        emit AdminRoleRemoved(_address, _msgSender());
    }

    /**
     * @notice Grants the minter role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addMinterRole(address _address) external {
        grantRole(MINTER_ROLE, _address);
        emit MinterRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the minter role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeMinterRole(address _address) external {
        revokeRole(MINTER_ROLE, _address);
        emit MinterRoleRemoved(_address, _msgSender());
    }

    /**
     * @notice Grants the smart contract role to an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract receiving the new role
     */
    function addSmartContractRole(address _address) external {
        grantRole(SMART_CONTRACT_ROLE, _address);
        emit SmartContractRoleGranted(_address, _msgSender());
    }

    /**
     * @notice Removes the smart contract role from an address
     * @dev The sender must have the admin role
     * @param _address EOA or contract affected
     */
    function removeSmartContractRole(address _address) external {
        revokeRole(SMART_CONTRACT_ROLE, _address);
        emit SmartContractRoleRemoved(_address, _msgSender());
    }
}

// File: contracts/garment/DigitalaxMaterials.sol



pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;



/**
 * @title Digitalax Materials NFT a.k.a. child NFTs
 * @dev Issues ERC-1155 tokens which can be held by the parent ERC-721 contract
 */
contract DigitalaxMaterials is ERC1155Burnable {

    // @notice event emitted on contract creation
    event DigitalaxMaterialsDeployed();

    // @notice a single child has been created
    event ChildCreated(
        uint256 indexed childId
    );

    // @notice a batch of children have been created
    event ChildrenCreated(
        uint256[] childIds
    );

    string public name;
    string public symbol;

    // @notice current token ID pointer
    uint256 public tokenIdPointer;

    // @notice enforcing access controls
    DigitalaxAccessControls public accessControls;

    constructor(
        string memory _name,
        string memory _symbol,
        DigitalaxAccessControls _accessControls
    ) public {
        name = _name;
        symbol = _symbol;
        accessControls = _accessControls;
        emit DigitalaxMaterialsDeployed();
    }

    ///////////////////////////
    // Creating new children //
    ///////////////////////////

    /**
     @notice Creates a single child ERC1155 token
     @dev Only callable with smart contact role
     @return id the generated child Token ID
     */
    function createChild(string calldata _uri) external returns (uint256 id) {
        require(
            accessControls.hasSmartContractRole(_msgSender()),
            "DigitalaxMaterials.createChild: Sender must be smart contract"
        );

        require(bytes(_uri).length > 0, "DigitalaxMaterials.createChild: URI is a blank string");

        tokenIdPointer = tokenIdPointer.add(1);

        id = tokenIdPointer;
        _setURI(id, _uri);

        emit ChildCreated(id);
    }

    /**
     @notice Creates a batch of child ERC1155 tokens
     @dev Only callable with smart contact role
     @return tokenIds the generated child Token IDs
     */
    function batchCreateChildren(string[] calldata _uris) external returns (uint256[] memory tokenIds) {
        require(
            accessControls.hasSmartContractRole(_msgSender()),
            "DigitalaxMaterials.batchCreateChildren: Sender must be smart contract"
        );

        require(_uris.length > 0, "DigitalaxMaterials.batchCreateChildren: No data supplied in array");

        uint256 urisLength = _uris.length;
        tokenIds = new uint256[](urisLength);
        for (uint256 i = 0; i < urisLength; i++) {
            string memory uri = _uris[i];
            require(bytes(uri).length > 0, "DigitalaxMaterials.batchCreateChildren: URI is a blank string");
            tokenIdPointer = tokenIdPointer.add(1);

            _setURI(tokenIdPointer, uri);
            tokenIds[i] = tokenIdPointer;
        }

        // Batched event for GAS savings
        emit ChildrenCreated(tokenIds);
    }

    //////////////////////////////////
    // Minting of existing children //
    //////////////////////////////////

    /**
      @notice Mints a single child ERC1155 tokens, increasing its supply by the _amount specified. msg.data along with the
      parent contract as the recipient can be used to map the created children to a given parent token
      @dev Only callable with smart contact role
     */
    function mintChild(uint256 _childTokenId, uint256 _amount, address _beneficiary, bytes calldata _data) external {
        require(
            accessControls.hasSmartContractRole(_msgSender()),
            "DigitalaxMaterials.mintChild: Sender must be smart contract"
        );

        require(bytes(tokenUris[_childTokenId]).length > 0, "DigitalaxMaterials.mintChild: Strand does not exist");
        require(_amount > 0, "DigitalaxMaterials.mintChild: No amount specified");

        _mint(_beneficiary, _childTokenId, _amount, _data);
    }

    /**
      @notice Mints a batch of child ERC1155 tokens, increasing its supply by the _amounts specified. msg.data along with the
      parent contract as the recipient can be used to map the created children to a given parent token
      @dev Only callable with smart contact role
     */
    function batchMintChildren(
        uint256[] calldata _childTokenIds,
        uint256[] calldata _amounts,
        address _beneficiary,
        bytes calldata _data
    ) external {
        require(
            accessControls.hasSmartContractRole(_msgSender()),
            "DigitalaxMaterials.batchMintChildren: Sender must be smart contract"
        );

        require(_childTokenIds.length == _amounts.length, "DigitalaxMaterials.batchMintChildren: Array lengths are invalid");
        require(_childTokenIds.length > 0, "DigitalaxMaterials.batchMintChildren: No data supplied in arrays");

        // Check the strands exist and no zero amounts
        for (uint256 i = 0; i < _childTokenIds.length; i++) {
            uint256 strandId = _childTokenIds[i];
            require(bytes(tokenUris[strandId]).length > 0, "DigitalaxMaterials.batchMintChildren: Strand does not exist");

            uint256 amount = _amounts[i];
            require(amount > 0, "DigitalaxMaterials.batchMintChildren: Invalid amount");
        }

        _mintBatch(_beneficiary, _childTokenIds, _amounts, _data);
    }

    function updateAccessControls(DigitalaxAccessControls _accessControls) external {
        require(
            accessControls.hasAdminRole(_msgSender()),
            "DigitalaxMaterials.updateAccessControls: Sender must be admin"
        );

        require(
            address(_accessControls) != address(0),
            "DigitalaxMaterials.updateAccessControls: New access controls cannot be ZERO address"
        );

        accessControls = _accessControls;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"childId","type":"uint256"}],"name":"ChildCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"childIds","type":"uint256[]"}],"name":"ChildrenCreated","type":"event"},{"anonymous":false,"inputs":[],"name":"DigitalaxMaterialsDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"accessControls","outputs":[{"internalType":"contract DigitalaxAccessControls","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"batchCreateChildren","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_childTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"batchMintChildren","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"createChild","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_childTokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mintChild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdPointer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract DigitalaxAccessControls","name":"_accessControls","type":"address"}],"name":"updateAccessControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620032d9380380620032d9833981016040819052620000349162000281565b620000466301ffc9a760e01b620000e3565b62000058636cdb3d1360e11b620000e3565b6200006a6303a24d0760e21b620000e3565b82516200007f9060059060208601906200013e565b508151620000959060069060208501906200013e565b50600880546001600160a01b0319166001600160a01b0383161790556040517fcc43afa9b2ceb241f40e3278c67b70fe77e23b19c9c996dfa3d1703f9e40e85590600090a150505062000341565b6001600160e01b03198082161415620001195760405162461bcd60e51b815260040162000110906200030a565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200018157805160ff1916838001178555620001b1565b82800160010185558215620001b1579182015b82811115620001b157825182559160200191906001019062000194565b50620001bf929150620001c3565b5090565b5b80821115620001bf5760008155600101620001c4565b600082601f830112620001eb578081fd5b81516001600160401b038082111562000202578283fd5b6040516020601f8401601f191682018101838111838210171562000224578586fd5b806040525081945083825286818588010111156200024157600080fd5b600092505b8383101562000265578583018101518284018201529182019162000246565b83831115620002775760008185840101525b5050505092915050565b60008060006060848603121562000296578283fd5b83516001600160401b0380821115620002ad578485fd5b620002bb87838801620001da565b94506020860151915080821115620002d1578384fd5b50620002e086828701620001da565b604086015190935090506001600160a01b0381168114620002ff578182fd5b809150509250925092565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b612f8880620003516000396000f3fe608060405234801561001057600080fd5b506004361061012b5760003560e01c80636ef3da94116100ad578063afb05b3911610071578063afb05b391461026d578063e3b619b814610280578063e985e9c514610293578063f242432a146102a6578063f5298aca146102b95761012b565b80636ef3da9414610217578063748365ef1461022a5780639344ef881461023f57806395d89b4114610252578063a22cb4651461025a5761012b565b8063310e2de0116100f4578063310e2de0146101b65780633b3a1a7a146101c95780634e1273f4146101d15780636468e317146101f15780636b20c454146102045761012b565b8062fdd58e1461013057806301ffc9a71461015957806306fdde03146101795780630e89341c1461018e5780632eb2c2d6146101a1575b600080fd5b61014361013e366004611fb7565b6102cc565b6040516101509190612d5e565b60405180910390f35b61016c6101673660046121dd565b610325565b6040516101509190612460565b610181610344565b604051610150919061246b565b61018161019c366004612264565b6103d2565b6101b46101af366004611e09565b610473565b005b6101b46101c4366004612117565b61068d565b6101436108c0565b6101e46101df366004612016565b6108c6565b604051610150919061241f565b6101436101ff366004612264565b610a05565b6101b4610212366004611f18565b610a17565b6101b4610225366004612215565b610a71565b610232610b5a565b6040516101509190612368565b6101e461024d3660046120d8565b610b69565b610181610d6d565b6101b4610268366004611f8a565b610dc8565b61014361027b366004612231565b610e96565b6101b461028e36600461227c565b610fe1565b61016c6102a1366004611dd1565b611129565b6101b46102b4366004611eb2565b611157565b6101b46102c7366004611fe2565b6112eb565b60006001600160a01b0383166102fd5760405162461bcd60e51b81526004016102f4906125de565b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6001600160e01b03191660009081526020819052604090205460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103ca5780601f1061039f576101008083540402835291602001916103ca565b820191906000526020600020905b8154815290600101906020018083116103ad57829003601f168201915b505050505081565b60008181526003602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156104675780601f1061043c57610100808354040283529160200191610467565b820191906000526020600020905b81548152906001019060200180831161044a57829003601f168201915b50505050509050919050565b81518351146104945760405162461bcd60e51b81526004016102f490612cd5565b6001600160a01b0384166104ba5760405162461bcd60e51b81526004016102f490612799565b6104c2611340565b6001600160a01b0316856001600160a01b031614806104e857506104e8856102a1611340565b6105045760405162461bcd60e51b81526004016102f4906127de565b600061050e611340565b905061051e818787878787610685565b60005b845181101561061f57600085828151811061053857fe5b60200260200101519050600085838151811061055057fe5b602002602001015190506105bd816040518060600160405280602a8152602001612f09602a91396001600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546113459092919063ffffffff16565b60008381526001602090815260408083206001600160a01b038e811685529252808320939093558a16815220546105f49082611371565b60009283526001602081815260408086206001600160a01b038d168752909152909320555001610521565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161066f929190612432565b60405180910390a461068581878787878761139d565b505050505050565b6008546001600160a01b031663113b0ab26106a6611340565b6040518263ffffffff1660e01b81526004016106c29190612368565b60206040518083038186803b1580156106da57600080fd5b505afa1580156106ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071291906121c1565b61072e5760405162461bcd60e51b81526004016102f490612a1c565b85841461074d5760405162461bcd60e51b81526004016102f490612923565b8561076a5760405162461bcd60e51b81526004016102f490612c2c565b60005b8681101561081457600088888381811061078357fe5b905060200201359050600060036000838152602001908152602001600020805460018160011615610100020316600290049050116107d35760405162461bcd60e51b81526004016102f490612593565b60008787848181106107e157fe5b9050602002013590506000811161080a5760405162461bcd60e51b81526004016102f4906126b1565b505060010161076d565b506108b78388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506114ab92505050565b50505050505050565b60075481565b606081518351146108e95760405162461bcd60e51b81526004016102f490612be3565b606083516001600160401b038111801561090257600080fd5b5060405190808252806020026020018201604052801561092c578160200160208202803683370190505b50905060005b84518110156109fd5760006001600160a01b031685828151811061095257fe5b60200260200101516001600160a01b031614156109815760405162461bcd60e51b81526004016102f490612629565b6001600085838151811061099157fe5b6020026020010151815260200190815260200160002060008683815181106109b557fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106109ea57fe5b6020908102919091010152600101610932565b509392505050565b60046020526000908152604090205481565b610a1f611340565b6001600160a01b0316836001600160a01b03161480610a455750610a45836102a1611340565b610a615760405162461bcd60e51b81526004016102f4906126f3565b610a6c838383611638565b505050565b6008546001600160a01b031663c395fcb3610a8a611340565b6040518263ffffffff1660e01b8152600401610aa69190612368565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af691906121c1565b610b125760405162461bcd60e51b81526004016102f490612830565b6001600160a01b038116610b385760405162461bcd60e51b81526004016102f4906124d2565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031681565b6008546060906001600160a01b031663113b0ab2610b85611340565b6040518263ffffffff1660e01b8152600401610ba19190612368565b60206040518083038186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf191906121c1565b610c0d5760405162461bcd60e51b81526004016102f490612ada565b81610c2a5760405162461bcd60e51b81526004016102f490612a73565b81806001600160401b0381118015610c4157600080fd5b50604051908082528060200260200182016040528015610c6b578160200160208202803683370190505b50915060005b81811015610d2e576060858583818110610c8757fe5b9050602002810190610c999190612d75565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505050610cee5760405162461bcd60e51b81526004016102f49061296e565b600754610cfc906001611371565b6007819055610d0b90826117e0565b600754848381518110610d1a57fe5b602090810291909101015250600101610c71565b507faad999d58beff0d6c87a9d1fafc57f66aba220298f12b2ed8acded84d0747d2b82604051610d5e919061241f565b60405180910390a15092915050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103ca5780601f1061039f576101008083540402835291602001916103ca565b816001600160a01b0316610dda611340565b6001600160a01b03161415610e015760405162461bcd60e51b81526004016102f490612b9a565b8060026000610e0e611340565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610e52611340565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e8a9190612460565b60405180910390a35050565b6008546000906001600160a01b031663113b0ab2610eb2611340565b6040518263ffffffff1660e01b8152600401610ece9190612368565b60206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906121c1565b610f3a5760405162461bcd60e51b81526004016102f49061273c565b81610f575760405162461bcd60e51b81526004016102f490612b45565b600754610f65906001611371565b6007819055506007549050610fb08184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117e092505050565b60405181907f4a481cf1ce03d2f2700fc83197f32f7c5abac90db8e69cf7f1e1b6ca563c141790600090a292915050565b6008546001600160a01b031663113b0ab2610ffa611340565b6040518263ffffffff1660e01b81526004016110169190612368565b60206040518083038186803b15801561102e57600080fd5b505afa158015611042573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106691906121c1565b6110825760405162461bcd60e51b81526004016102f490612c78565b600085815260036020526040902054600260001961010060018416150201909116046110c05760405162461bcd60e51b81526004016102f49061288d565b600084116110e05760405162461bcd60e51b81526004016102f4906129cb565b61112283868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183c92505050565b5050505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6001600160a01b03841661117d5760405162461bcd60e51b81526004016102f490612799565b611185611340565b6001600160a01b0316856001600160a01b031614806111ab57506111ab856102a1611340565b6111c75760405162461bcd60e51b81526004016102f4906126f3565b60006111d1611340565b90506111f18187876111e288611950565b6111eb88611950565b87610685565b611238836040518060600160405280602a8152602001612f09602a913960008781526001602090815260408083206001600160a01b038d1684529091529020549190611345565b60008581526001602090815260408083206001600160a01b038b8116855292528083209390935587168152205461126f9084611371565b60008581526001602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906112d59089908990612d67565b60405180910390a4610685818787878787611994565b6112f3611340565b6001600160a01b0316836001600160a01b031614806113195750611319836102a1611340565b6113355760405162461bcd60e51b81526004016102f4906126f3565b610a6c838383611a65565b335b90565b600081848411156113695760405162461bcd60e51b81526004016102f4919061246b565b505050900390565b6000828201838110156113965760405162461bcd60e51b81526004016102f49061267a565b9392505050565b6113af846001600160a01b0316611b99565b156106855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906113e8908990899088908890889060040161237c565b602060405180830381600087803b15801561140257600080fd5b505af1925050508015611432575060408051601f3d908101601f1916820190925261142f918101906121f9565b60015b61147b5761143e612e04565b806114495750611463565b8060405162461bcd60e51b81526004016102f4919061246b565b60405162461bcd60e51b81526004016102f49061247e565b6001600160e01b0319811663bc197c8160e01b146108b75760405162461bcd60e51b81526004016102f49061254b565b6001600160a01b0384166114d15760405162461bcd60e51b81526004016102f490612d1d565b81518351146114f25760405162461bcd60e51b81526004016102f490612cd5565b60006114fc611340565b905061150d81600087878787610685565b60005b84518110156115d057600085828151811061152757fe5b60200260200101519050600085838151811061153f57fe5b60209081029190910181015160008481526001835260408082206001600160a01b038d168352909352919091205490915061157b908290611371565b60008381526001602090815260408083206001600160a01b038d1684528252808320939093558482526004905220546115b49082611371565b6000928352600460205260409092209190915550600101611510565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611621929190612432565b60405180910390a46111228160008787878761139d565b6001600160a01b03831661165e5760405162461bcd60e51b81526004016102f4906128e0565b805182511461167f5760405162461bcd60e51b81526004016102f490612cd5565b6000611689611340565b90506116a981856000868660405180602001604052806000815250610685565b60005b83518110156117815760008482815181106116c357fe5b6020026020010151905060008483815181106116db57fe5b6020026020010151905061172c81604051806060016040528060248152602001612ee56024913960008581526001602090815260408083206001600160a01b038e1684529091529020549190611345565b60008381526001602090815260408083206001600160a01b038c1684528252808320939093558482526004905220546117659082611b9f565b60009283526004602052604090922091909155506001016116ac565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516117d2929190612432565b60405180910390a450505050565b600082815260036020908152604090912082516117ff92840190611be1565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051611830919061246b565b60405180910390a25050565b6001600160a01b0384166118625760405162461bcd60e51b81526004016102f490612d1d565b600061186c611340565b905061187e816000876111e288611950565b60008481526001602090815260408083206001600160a01b03891684529091529020546118ab9084611371565b60008581526001602090815260408083206001600160a01b038a1684528252808320939093558682526004905220546118e49084611371565b6000858152600460205260408082209290925590516001600160a01b038088169291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906119399089908990612d67565b60405180910390a461112281600087878787611994565b60408051600180825281830190925260609182919060208083019080368337019050509050828160008151811061198357fe5b602090810291909101015292915050565b6119a6846001600160a01b0316611b99565b156106855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119df90899089908890889088906004016123da565b602060405180830381600087803b1580156119f957600080fd5b505af1925050508015611a29575060408051601f3d908101601f19168201909252611a26918101906121f9565b60015b611a355761143e612e04565b6001600160e01b0319811663f23a6e6160e01b146108b75760405162461bcd60e51b81526004016102f49061254b565b6001600160a01b038316611a8b5760405162461bcd60e51b81526004016102f4906128e0565b6000611a95611340565b9050611ac581856000611aa787611950565b611ab087611950565b60405180602001604052806000815250610685565b611b0c82604051806060016040528060248152602001612ee56024913960008681526001602090815260408083206001600160a01b038b1684529091529020549190611345565b60008481526001602090815260408083206001600160a01b0389168452825280832093909355858252600490522054611b459083611b9f565b6000848152600460205260408082209290925590516001600160a01b0386811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117d29088908890612d67565b3b151590565b600061139683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611345565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c2257805160ff1916838001178555611c4f565b82800160010185558215611c4f579182015b82811115611c4f578251825591602001919060010190611c34565b50611c5b929150611c5f565b5090565b5b80821115611c5b5760008155600101611c60565b60008083601f840112611c85578081fd5b5081356001600160401b03811115611c9b578182fd5b6020830191508360208083028501011115611cb557600080fd5b9250929050565b600082601f830112611ccc578081fd5b8135611cdf611cda82612ddf565b612db9565b818152915060208083019084810181840286018201871015611d0057600080fd5b60005b84811015611d1f57813584529282019290820190600101611d03565b505050505092915050565b60008083601f840112611d3b578182fd5b5081356001600160401b03811115611d51578182fd5b602083019150836020828501011115611cb557600080fd5b600082601f830112611d79578081fd5b81356001600160401b03811115611d8e578182fd5b611da1601f8201601f1916602001612db9565b9150808252836020828501011115611db857600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611de3578182fd5b8235611dee81612ea8565b91506020830135611dfe81612ea8565b809150509250929050565b600080600080600060a08688031215611e20578081fd5b8535611e2b81612ea8565b94506020860135611e3b81612ea8565b935060408601356001600160401b0380821115611e56578283fd5b611e6289838a01611cbc565b94506060880135915080821115611e77578283fd5b611e8389838a01611cbc565b93506080880135915080821115611e98578283fd5b50611ea588828901611d69565b9150509295509295909350565b600080600080600060a08688031215611ec9578081fd5b8535611ed481612ea8565b94506020860135611ee481612ea8565b9350604086013592506060860135915060808601356001600160401b03811115611f0c578182fd5b611ea588828901611d69565b600080600060608486031215611f2c578283fd5b8335611f3781612ea8565b925060208401356001600160401b0380821115611f52578384fd5b611f5e87838801611cbc565b93506040860135915080821115611f73578283fd5b50611f8086828701611cbc565b9150509250925092565b60008060408385031215611f9c578182fd5b8235611fa781612ea8565b91506020830135611dfe81612ec0565b60008060408385031215611fc9578182fd5b8235611fd481612ea8565b946020939093013593505050565b600080600060608486031215611ff6578283fd5b833561200181612ea8565b95602085013595506040909401359392505050565b60008060408385031215612028578182fd5b82356001600160401b038082111561203e578384fd5b818501915085601f830112612051578384fd5b813561205f611cda82612ddf565b80828252602080830192508086018a82838702890101111561207f578889fd5b8896505b848710156120aa57803561209681612ea8565b845260019690960195928101928101612083565b5090965087013593505050808211156120c1578283fd5b506120ce85828601611cbc565b9150509250929050565b600080602083850312156120ea578182fd5b82356001600160401b038111156120ff578283fd5b61210b85828601611c74565b90969095509350505050565b60008060008060008060006080888a031215612131578485fd5b87356001600160401b0380821115612147578687fd5b6121538b838c01611c74565b909950975060208a013591508082111561216b578687fd5b6121778b838c01611c74565b909750955060408a0135915061218c82612ea8565b909350606089013590808211156121a1578384fd5b506121ae8a828b01611d2a565b989b979a50959850939692959293505050565b6000602082840312156121d2578081fd5b815161139681612ec0565b6000602082840312156121ee578081fd5b813561139681612ece565b60006020828403121561220a578081fd5b815161139681612ece565b600060208284031215612226578081fd5b813561139681612ea8565b60008060208385031215612243578182fd5b82356001600160401b03811115612258578283fd5b61210b85828601611d2a565b600060208284031215612275578081fd5b5035919050565b600080600080600060808688031215612293578283fd5b853594506020860135935060408601356122ac81612ea8565b925060608601356001600160401b038111156122c6578182fd5b6122d288828901611d2a565b969995985093965092949392505050565b6000815180845260208085019450808401835b83811015612312578151875295820195908201906001016122f6565b509495945050505050565b60008151808452815b8181101561234257602081850181015186830182015201612326565b818111156123535782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a0604082018190526000906123a8908301866122e3565b82810360608401526123ba81866122e3565b905082810360808401526123ce818561231d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906124149083018461231d565b979650505050505050565b60006020825261139660208301846122e3565b60006040825261244560408301856122e3565b828103602084015261245781856122e3565b95945050505050565b901515815260200190565b600060208252611396602083018461231d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526053908201527f4469676974616c61784d6174657269616c732e7570646174654163636573734360408201527f6f6e74726f6c733a204e65772061636365737320636f6e74726f6c732063616e6060820152726e6f74206265205a45524f206164647265737360681b608082015260a00190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252603b90820152600080516020612f3383398151915260408201527f6472656e3a20537472616e6420646f6573206e6f742065786973740000000000606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603490820152600080516020612f33833981519152604082015273191c995b8e88125b9d985b1a5908185b5bdd5b9d60621b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e6372656174654368696c643a2060408201527f53656e646572206d75737420626520736d61727420636f6e7472616374000000606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e7570646174654163636573734360408201527f6f6e74726f6c733a2053656e646572206d7573742062652061646d696e000000606082015260800190565b60208082526033908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a2053746040820152721c985b9908191bd95cc81b9bdd08195e1a5cdd606a1b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603f90820152600080516020612f3383398151915260408201527f6472656e3a204172726179206c656e677468732061726520696e76616c696400606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a20555249206973206120626c616e6b20737472696e67000000606082015260800190565b60208082526031908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a204e6f60408201527008185b5bdd5b9d081cdc1958da599a5959607a1b606082015260800190565b6020808252604390820152600080516020612f3383398151915260408201527f6472656e3a2053656e646572206d75737420626520736d61727420636f6e74726060820152621858dd60ea1b608082015260a00190565b60208082526041908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a204e6f206461746120737570706c69656420696e20617272616060820152607960f81b608082015260a00190565b60208082526045908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a2053656e646572206d75737420626520736d61727420636f6e6060820152641d1c9858dd60da1b608082015260a00190565b60208082526035908201527f4469676974616c61784d6174657269616c732e6372656174654368696c643a20604082015274555249206973206120626c616e6b20737472696e6760581b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526040908201819052600080516020612f33833981519152908201527f6472656e3a204e6f206461746120737570706c69656420696e20617272617973606082015260800190565b6020808252603b908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a20536560408201527f6e646572206d75737420626520736d61727420636f6e74726163740000000000606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b6000808335601e19843603018112612d8b578283fd5b8301803591506001600160401b03821115612da4578283fd5b602001915036819003821315611cb557600080fd5b6040518181016001600160401b0381118282101715612dd757600080fd5b604052919050565b60006001600160401b03821115612df4578081fd5b5060209081020190565b60e01c90565b600060443d1015612e1457611342565b600481823e6308c379a0612e288251612dfe565b14612e3257611342565b6040513d600319016004823e80513d6001600160401b038160248401118184111715612e615750505050611342565b82840192508251915080821115612e7b5750505050611342565b503d83016020828401011115612e9357505050611342565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114612ebd57600080fd5b50565b8015158114612ebd57600080fd5b6001600160e01b031981168114612ebd57600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665724469676974616c61784d6174657269616c732e62617463684d696e744368696ca2646970667358221220fd08730c783f9c40d1b6ae8680a00785a97612b77d374e11d172af85783c9c8f64736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c00000000000000000000000000000000000000000000000000000000000000124469676974616c61784d6174657269616c730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344584d0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012b5760003560e01c80636ef3da94116100ad578063afb05b3911610071578063afb05b391461026d578063e3b619b814610280578063e985e9c514610293578063f242432a146102a6578063f5298aca146102b95761012b565b80636ef3da9414610217578063748365ef1461022a5780639344ef881461023f57806395d89b4114610252578063a22cb4651461025a5761012b565b8063310e2de0116100f4578063310e2de0146101b65780633b3a1a7a146101c95780634e1273f4146101d15780636468e317146101f15780636b20c454146102045761012b565b8062fdd58e1461013057806301ffc9a71461015957806306fdde03146101795780630e89341c1461018e5780632eb2c2d6146101a1575b600080fd5b61014361013e366004611fb7565b6102cc565b6040516101509190612d5e565b60405180910390f35b61016c6101673660046121dd565b610325565b6040516101509190612460565b610181610344565b604051610150919061246b565b61018161019c366004612264565b6103d2565b6101b46101af366004611e09565b610473565b005b6101b46101c4366004612117565b61068d565b6101436108c0565b6101e46101df366004612016565b6108c6565b604051610150919061241f565b6101436101ff366004612264565b610a05565b6101b4610212366004611f18565b610a17565b6101b4610225366004612215565b610a71565b610232610b5a565b6040516101509190612368565b6101e461024d3660046120d8565b610b69565b610181610d6d565b6101b4610268366004611f8a565b610dc8565b61014361027b366004612231565b610e96565b6101b461028e36600461227c565b610fe1565b61016c6102a1366004611dd1565b611129565b6101b46102b4366004611eb2565b611157565b6101b46102c7366004611fe2565b6112eb565b60006001600160a01b0383166102fd5760405162461bcd60e51b81526004016102f4906125de565b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6001600160e01b03191660009081526020819052604090205460ff1690565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103ca5780601f1061039f576101008083540402835291602001916103ca565b820191906000526020600020905b8154815290600101906020018083116103ad57829003601f168201915b505050505081565b60008181526003602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156104675780601f1061043c57610100808354040283529160200191610467565b820191906000526020600020905b81548152906001019060200180831161044a57829003601f168201915b50505050509050919050565b81518351146104945760405162461bcd60e51b81526004016102f490612cd5565b6001600160a01b0384166104ba5760405162461bcd60e51b81526004016102f490612799565b6104c2611340565b6001600160a01b0316856001600160a01b031614806104e857506104e8856102a1611340565b6105045760405162461bcd60e51b81526004016102f4906127de565b600061050e611340565b905061051e818787878787610685565b60005b845181101561061f57600085828151811061053857fe5b60200260200101519050600085838151811061055057fe5b602002602001015190506105bd816040518060600160405280602a8152602001612f09602a91396001600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546113459092919063ffffffff16565b60008381526001602090815260408083206001600160a01b038e811685529252808320939093558a16815220546105f49082611371565b60009283526001602081815260408086206001600160a01b038d168752909152909320555001610521565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161066f929190612432565b60405180910390a461068581878787878761139d565b505050505050565b6008546001600160a01b031663113b0ab26106a6611340565b6040518263ffffffff1660e01b81526004016106c29190612368565b60206040518083038186803b1580156106da57600080fd5b505afa1580156106ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071291906121c1565b61072e5760405162461bcd60e51b81526004016102f490612a1c565b85841461074d5760405162461bcd60e51b81526004016102f490612923565b8561076a5760405162461bcd60e51b81526004016102f490612c2c565b60005b8681101561081457600088888381811061078357fe5b905060200201359050600060036000838152602001908152602001600020805460018160011615610100020316600290049050116107d35760405162461bcd60e51b81526004016102f490612593565b60008787848181106107e157fe5b9050602002013590506000811161080a5760405162461bcd60e51b81526004016102f4906126b1565b505060010161076d565b506108b78388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8a0181900481028201810190925288815292508891508790819084018382808284376000920191909152506114ab92505050565b50505050505050565b60075481565b606081518351146108e95760405162461bcd60e51b81526004016102f490612be3565b606083516001600160401b038111801561090257600080fd5b5060405190808252806020026020018201604052801561092c578160200160208202803683370190505b50905060005b84518110156109fd5760006001600160a01b031685828151811061095257fe5b60200260200101516001600160a01b031614156109815760405162461bcd60e51b81526004016102f490612629565b6001600085838151811061099157fe5b6020026020010151815260200190815260200160002060008683815181106109b557fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106109ea57fe5b6020908102919091010152600101610932565b509392505050565b60046020526000908152604090205481565b610a1f611340565b6001600160a01b0316836001600160a01b03161480610a455750610a45836102a1611340565b610a615760405162461bcd60e51b81526004016102f4906126f3565b610a6c838383611638565b505050565b6008546001600160a01b031663c395fcb3610a8a611340565b6040518263ffffffff1660e01b8152600401610aa69190612368565b60206040518083038186803b158015610abe57600080fd5b505afa158015610ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af691906121c1565b610b125760405162461bcd60e51b81526004016102f490612830565b6001600160a01b038116610b385760405162461bcd60e51b81526004016102f4906124d2565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031681565b6008546060906001600160a01b031663113b0ab2610b85611340565b6040518263ffffffff1660e01b8152600401610ba19190612368565b60206040518083038186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf191906121c1565b610c0d5760405162461bcd60e51b81526004016102f490612ada565b81610c2a5760405162461bcd60e51b81526004016102f490612a73565b81806001600160401b0381118015610c4157600080fd5b50604051908082528060200260200182016040528015610c6b578160200160208202803683370190505b50915060005b81811015610d2e576060858583818110610c8757fe5b9050602002810190610c999190612d75565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505050610cee5760405162461bcd60e51b81526004016102f49061296e565b600754610cfc906001611371565b6007819055610d0b90826117e0565b600754848381518110610d1a57fe5b602090810291909101015250600101610c71565b507faad999d58beff0d6c87a9d1fafc57f66aba220298f12b2ed8acded84d0747d2b82604051610d5e919061241f565b60405180910390a15092915050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103ca5780601f1061039f576101008083540402835291602001916103ca565b816001600160a01b0316610dda611340565b6001600160a01b03161415610e015760405162461bcd60e51b81526004016102f490612b9a565b8060026000610e0e611340565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610e52611340565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e8a9190612460565b60405180910390a35050565b6008546000906001600160a01b031663113b0ab2610eb2611340565b6040518263ffffffff1660e01b8152600401610ece9190612368565b60206040518083038186803b158015610ee657600080fd5b505afa158015610efa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1e91906121c1565b610f3a5760405162461bcd60e51b81526004016102f49061273c565b81610f575760405162461bcd60e51b81526004016102f490612b45565b600754610f65906001611371565b6007819055506007549050610fb08184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506117e092505050565b60405181907f4a481cf1ce03d2f2700fc83197f32f7c5abac90db8e69cf7f1e1b6ca563c141790600090a292915050565b6008546001600160a01b031663113b0ab2610ffa611340565b6040518263ffffffff1660e01b81526004016110169190612368565b60206040518083038186803b15801561102e57600080fd5b505afa158015611042573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106691906121c1565b6110825760405162461bcd60e51b81526004016102f490612c78565b600085815260036020526040902054600260001961010060018416150201909116046110c05760405162461bcd60e51b81526004016102f49061288d565b600084116110e05760405162461bcd60e51b81526004016102f4906129cb565b61112283868685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183c92505050565b5050505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6001600160a01b03841661117d5760405162461bcd60e51b81526004016102f490612799565b611185611340565b6001600160a01b0316856001600160a01b031614806111ab57506111ab856102a1611340565b6111c75760405162461bcd60e51b81526004016102f4906126f3565b60006111d1611340565b90506111f18187876111e288611950565b6111eb88611950565b87610685565b611238836040518060600160405280602a8152602001612f09602a913960008781526001602090815260408083206001600160a01b038d1684529091529020549190611345565b60008581526001602090815260408083206001600160a01b038b8116855292528083209390935587168152205461126f9084611371565b60008581526001602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906112d59089908990612d67565b60405180910390a4610685818787878787611994565b6112f3611340565b6001600160a01b0316836001600160a01b031614806113195750611319836102a1611340565b6113355760405162461bcd60e51b81526004016102f4906126f3565b610a6c838383611a65565b335b90565b600081848411156113695760405162461bcd60e51b81526004016102f4919061246b565b505050900390565b6000828201838110156113965760405162461bcd60e51b81526004016102f49061267a565b9392505050565b6113af846001600160a01b0316611b99565b156106855760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906113e8908990899088908890889060040161237c565b602060405180830381600087803b15801561140257600080fd5b505af1925050508015611432575060408051601f3d908101601f1916820190925261142f918101906121f9565b60015b61147b5761143e612e04565b806114495750611463565b8060405162461bcd60e51b81526004016102f4919061246b565b60405162461bcd60e51b81526004016102f49061247e565b6001600160e01b0319811663bc197c8160e01b146108b75760405162461bcd60e51b81526004016102f49061254b565b6001600160a01b0384166114d15760405162461bcd60e51b81526004016102f490612d1d565b81518351146114f25760405162461bcd60e51b81526004016102f490612cd5565b60006114fc611340565b905061150d81600087878787610685565b60005b84518110156115d057600085828151811061152757fe5b60200260200101519050600085838151811061153f57fe5b60209081029190910181015160008481526001835260408082206001600160a01b038d168352909352919091205490915061157b908290611371565b60008381526001602090815260408083206001600160a01b038d1684528252808320939093558482526004905220546115b49082611371565b6000928352600460205260409092209190915550600101611510565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611621929190612432565b60405180910390a46111228160008787878761139d565b6001600160a01b03831661165e5760405162461bcd60e51b81526004016102f4906128e0565b805182511461167f5760405162461bcd60e51b81526004016102f490612cd5565b6000611689611340565b90506116a981856000868660405180602001604052806000815250610685565b60005b83518110156117815760008482815181106116c357fe5b6020026020010151905060008483815181106116db57fe5b6020026020010151905061172c81604051806060016040528060248152602001612ee56024913960008581526001602090815260408083206001600160a01b038e1684529091529020549190611345565b60008381526001602090815260408083206001600160a01b038c1684528252808320939093558482526004905220546117659082611b9f565b60009283526004602052604090922091909155506001016116ac565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516117d2929190612432565b60405180910390a450505050565b600082815260036020908152604090912082516117ff92840190611be1565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051611830919061246b565b60405180910390a25050565b6001600160a01b0384166118625760405162461bcd60e51b81526004016102f490612d1d565b600061186c611340565b905061187e816000876111e288611950565b60008481526001602090815260408083206001600160a01b03891684529091529020546118ab9084611371565b60008581526001602090815260408083206001600160a01b038a1684528252808320939093558682526004905220546118e49084611371565b6000858152600460205260408082209290925590516001600160a01b038088169291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906119399089908990612d67565b60405180910390a461112281600087878787611994565b60408051600180825281830190925260609182919060208083019080368337019050509050828160008151811061198357fe5b602090810291909101015292915050565b6119a6846001600160a01b0316611b99565b156106855760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906119df90899089908890889088906004016123da565b602060405180830381600087803b1580156119f957600080fd5b505af1925050508015611a29575060408051601f3d908101601f19168201909252611a26918101906121f9565b60015b611a355761143e612e04565b6001600160e01b0319811663f23a6e6160e01b146108b75760405162461bcd60e51b81526004016102f49061254b565b6001600160a01b038316611a8b5760405162461bcd60e51b81526004016102f4906128e0565b6000611a95611340565b9050611ac581856000611aa787611950565b611ab087611950565b60405180602001604052806000815250610685565b611b0c82604051806060016040528060248152602001612ee56024913960008681526001602090815260408083206001600160a01b038b1684529091529020549190611345565b60008481526001602090815260408083206001600160a01b0389168452825280832093909355858252600490522054611b459083611b9f565b6000848152600460205260408082209290925590516001600160a01b0386811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117d29088908890612d67565b3b151590565b600061139683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611345565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c2257805160ff1916838001178555611c4f565b82800160010185558215611c4f579182015b82811115611c4f578251825591602001919060010190611c34565b50611c5b929150611c5f565b5090565b5b80821115611c5b5760008155600101611c60565b60008083601f840112611c85578081fd5b5081356001600160401b03811115611c9b578182fd5b6020830191508360208083028501011115611cb557600080fd5b9250929050565b600082601f830112611ccc578081fd5b8135611cdf611cda82612ddf565b612db9565b818152915060208083019084810181840286018201871015611d0057600080fd5b60005b84811015611d1f57813584529282019290820190600101611d03565b505050505092915050565b60008083601f840112611d3b578182fd5b5081356001600160401b03811115611d51578182fd5b602083019150836020828501011115611cb557600080fd5b600082601f830112611d79578081fd5b81356001600160401b03811115611d8e578182fd5b611da1601f8201601f1916602001612db9565b9150808252836020828501011115611db857600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611de3578182fd5b8235611dee81612ea8565b91506020830135611dfe81612ea8565b809150509250929050565b600080600080600060a08688031215611e20578081fd5b8535611e2b81612ea8565b94506020860135611e3b81612ea8565b935060408601356001600160401b0380821115611e56578283fd5b611e6289838a01611cbc565b94506060880135915080821115611e77578283fd5b611e8389838a01611cbc565b93506080880135915080821115611e98578283fd5b50611ea588828901611d69565b9150509295509295909350565b600080600080600060a08688031215611ec9578081fd5b8535611ed481612ea8565b94506020860135611ee481612ea8565b9350604086013592506060860135915060808601356001600160401b03811115611f0c578182fd5b611ea588828901611d69565b600080600060608486031215611f2c578283fd5b8335611f3781612ea8565b925060208401356001600160401b0380821115611f52578384fd5b611f5e87838801611cbc565b93506040860135915080821115611f73578283fd5b50611f8086828701611cbc565b9150509250925092565b60008060408385031215611f9c578182fd5b8235611fa781612ea8565b91506020830135611dfe81612ec0565b60008060408385031215611fc9578182fd5b8235611fd481612ea8565b946020939093013593505050565b600080600060608486031215611ff6578283fd5b833561200181612ea8565b95602085013595506040909401359392505050565b60008060408385031215612028578182fd5b82356001600160401b038082111561203e578384fd5b818501915085601f830112612051578384fd5b813561205f611cda82612ddf565b80828252602080830192508086018a82838702890101111561207f578889fd5b8896505b848710156120aa57803561209681612ea8565b845260019690960195928101928101612083565b5090965087013593505050808211156120c1578283fd5b506120ce85828601611cbc565b9150509250929050565b600080602083850312156120ea578182fd5b82356001600160401b038111156120ff578283fd5b61210b85828601611c74565b90969095509350505050565b60008060008060008060006080888a031215612131578485fd5b87356001600160401b0380821115612147578687fd5b6121538b838c01611c74565b909950975060208a013591508082111561216b578687fd5b6121778b838c01611c74565b909750955060408a0135915061218c82612ea8565b909350606089013590808211156121a1578384fd5b506121ae8a828b01611d2a565b989b979a50959850939692959293505050565b6000602082840312156121d2578081fd5b815161139681612ec0565b6000602082840312156121ee578081fd5b813561139681612ece565b60006020828403121561220a578081fd5b815161139681612ece565b600060208284031215612226578081fd5b813561139681612ea8565b60008060208385031215612243578182fd5b82356001600160401b03811115612258578283fd5b61210b85828601611d2a565b600060208284031215612275578081fd5b5035919050565b600080600080600060808688031215612293578283fd5b853594506020860135935060408601356122ac81612ea8565b925060608601356001600160401b038111156122c6578182fd5b6122d288828901611d2a565b969995985093965092949392505050565b6000815180845260208085019450808401835b83811015612312578151875295820195908201906001016122f6565b509495945050505050565b60008151808452815b8181101561234257602081850181015186830182015201612326565b818111156123535782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a0604082018190526000906123a8908301866122e3565b82810360608401526123ba81866122e3565b905082810360808401526123ce818561231d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906124149083018461231d565b979650505050505050565b60006020825261139660208301846122e3565b60006040825261244560408301856122e3565b828103602084015261245781856122e3565b95945050505050565b901515815260200190565b600060208252611396602083018461231d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526053908201527f4469676974616c61784d6174657269616c732e7570646174654163636573734360408201527f6f6e74726f6c733a204e65772061636365737320636f6e74726f6c732063616e6060820152726e6f74206265205a45524f206164647265737360681b608082015260a00190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252603b90820152600080516020612f3383398151915260408201527f6472656e3a20537472616e6420646f6573206e6f742065786973740000000000606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603490820152600080516020612f33833981519152604082015273191c995b8e88125b9d985b1a5908185b5bdd5b9d60621b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e6372656174654368696c643a2060408201527f53656e646572206d75737420626520736d61727420636f6e7472616374000000606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e7570646174654163636573734360408201527f6f6e74726f6c733a2053656e646572206d7573742062652061646d696e000000606082015260800190565b60208082526033908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a2053746040820152721c985b9908191bd95cc81b9bdd08195e1a5cdd606a1b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603f90820152600080516020612f3383398151915260408201527f6472656e3a204172726179206c656e677468732061726520696e76616c696400606082015260800190565b6020808252603d908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a20555249206973206120626c616e6b20737472696e67000000606082015260800190565b60208082526031908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a204e6f60408201527008185b5bdd5b9d081cdc1958da599a5959607a1b606082015260800190565b6020808252604390820152600080516020612f3383398151915260408201527f6472656e3a2053656e646572206d75737420626520736d61727420636f6e74726060820152621858dd60ea1b608082015260a00190565b60208082526041908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a204e6f206461746120737570706c69656420696e20617272616060820152607960f81b608082015260a00190565b60208082526045908201527f4469676974616c61784d6174657269616c732e6261746368437265617465436860408201527f696c6472656e3a2053656e646572206d75737420626520736d61727420636f6e6060820152641d1c9858dd60da1b608082015260a00190565b60208082526035908201527f4469676974616c61784d6174657269616c732e6372656174654368696c643a20604082015274555249206973206120626c616e6b20737472696e6760581b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526040908201819052600080516020612f33833981519152908201527f6472656e3a204e6f206461746120737570706c69656420696e20617272617973606082015260800190565b6020808252603b908201527f4469676974616c61784d6174657269616c732e6d696e744368696c643a20536560408201527f6e646572206d75737420626520736d61727420636f6e74726163740000000000606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b6000808335601e19843603018112612d8b578283fd5b8301803591506001600160401b03821115612da4578283fd5b602001915036819003821315611cb557600080fd5b6040518181016001600160401b0381118282101715612dd757600080fd5b604052919050565b60006001600160401b03821115612df4578081fd5b5060209081020190565b60e01c90565b600060443d1015612e1457611342565b600481823e6308c379a0612e288251612dfe565b14612e3257611342565b6040513d600319016004823e80513d6001600160401b038160248401118184111715612e615750505050611342565b82840192508251915080821115612e7b5750505050611342565b503d83016020828401011115612e9357505050611342565b601f01601f1916810160200160405291505090565b6001600160a01b0381168114612ebd57600080fd5b50565b8015158114612ebd57600080fd5b6001600160e01b031981168114612ebd57600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665724469676974616c61784d6174657269616c732e62617463684d696e744368696ca2646970667358221220fd08730c783f9c40d1b6ae8680a00785a97612b77d374e11d172af85783c9c8f64736f6c634300060c0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c00000000000000000000000000000000000000000000000000000000000000124469676974616c61784d6174657269616c730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344584d0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): DigitalaxMaterials
Arg [1] : _symbol (string): DXM
Arg [2] : _accessControls (address): 0x165Eec91620b7Bb96d02890d8a3F8Cb79a29195c

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000165eec91620b7bb96d02890d8a3f8cb79a29195c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 4469676974616c61784d6174657269616c730000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 44584d0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57574:5684:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24592:223;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9749:142;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57960:18::-;;;:::i;:::-;;;;;;;:::i;24320:121::-;;;;;;:::i;:::-;;:::i;27280:1210::-;;;;;;:::i;:::-;;:::i;:::-;;61641:1126;;;;;;:::i;:::-;;:::i;58055:29::-;;;:::i;24981:618::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22971:51::-;;;;;;:::i;:::-;;:::i;36659:321::-;;;;;;:::i;:::-;;:::i;62775:480::-;;;;;;:::i;:::-;;:::i;58135:45::-;;;:::i;:::-;;;;;;;:::i;59425:928::-;;;;;;:::i;:::-;;:::i;57985:20::-;;;:::i;25672:313::-;;;;;;:::i;:::-;;:::i;58745:498::-;;;;;;:::i;:::-;;:::i;60779:555::-;;;;;;:::i;:::-;;:::i;26057:160::-;;;;;;:::i;:::-;;:::i;26289:914::-;;;;;;:::i;:::-;;:::i;36362:289::-;;;;;;:::i;:::-;;:::i;24592:223::-;24670:7;-1:-1:-1;;;;;24698:21:0;;24690:77;;;;-1:-1:-1;;;24690:77:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;24785:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;24785:22:0;;;;;;;;;;;;24592:223::o;9749:142::-;-1:-1:-1;;;;;;9850:33:0;9826:4;9850:33;;;;;;;;;;;;;;9749:142::o;57960:18::-;;;;;;;;;;;;;;;-1:-1:-1;;57960:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24320:121::-;24415:18;;;;:9;:18;;;;;;;;;24408:25;;;;;;-1:-1:-1;;24408:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24382:13;;24408:25;;;24415:18;24408:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24320:121;;;:::o;27280:1210::-;27535:7;:14;27521:3;:10;:28;27513:81;;;;-1:-1:-1;;;27513:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27613:16:0;;27605:66;;;;-1:-1:-1;;;27605:66:0;;;;;;;:::i;:::-;27712:12;:10;:12::i;:::-;-1:-1:-1;;;;;27704:20:0;:4;-1:-1:-1;;;;;27704:20:0;;:60;;;;27728:36;27745:4;27751:12;:10;:12::i;27728:36::-;27682:160;;;;-1:-1:-1;;;27682:160:0;;;;;;;:::i;:::-;27855:16;27874:12;:10;:12::i;:::-;27855:31;;27899:60;27920:8;27930:4;27936:2;27940:3;27945:7;27954:4;27899:20;:60::i;:::-;27977:9;27972:358;27996:3;:10;27992:1;:14;27972:358;;;28028:10;28041:3;28045:1;28041:6;;;;;;;;;;;;;;28028:19;;28062:14;28079:7;28087:1;28079:10;;;;;;;;;;;;;;28062:27;;28128:126;28170:6;28128:126;;;;;;;;;;;;;;;;;:9;:13;28138:2;28128:13;;;;;;;;;;;:19;28142:4;-1:-1:-1;;;;;28128:19:0;-1:-1:-1;;;;;28128:19:0;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;28106:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28106:19:0;;;;;;;;;;:148;;;;28289:17;;;;;;:29;;28311:6;28289:21;:29::i;:::-;28269:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28269:17:0;;;;;;;;;;:49;-1:-1:-1;28008:3:0;27972:358;;;;28377:2;-1:-1:-1;;;;;28347:47:0;28371:4;-1:-1:-1;;;;;28347:47:0;28361:8;-1:-1:-1;;;;;28347:47:0;;28381:3;28386:7;28347:47;;;;;;;:::i;:::-;;;;;;;;28407:75;28443:8;28453:4;28459:2;28463:3;28468:7;28477:4;28407:35;:75::i;:::-;27280:1210;;;;;;:::o;61641:1126::-;61861:14;;-1:-1:-1;;;;;61861:14:0;:35;61897:12;:10;:12::i;:::-;61861:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61839:166;;;;-1:-1:-1;;;61839:166:0;;;;;;;:::i;:::-;62026:40;;;62018:116;;;;-1:-1:-1;;;62018:116:0;;;;;;;:::i;:::-;62153:25;62145:102;;;;-1:-1:-1;;;62145:102:0;;;;;;;:::i;:::-;62321:9;62316:374;62336:25;;;62316:374;;;62383:16;62402:14;;62417:1;62402:17;;;;;;;;;;;;;62383:36;;62478:1;62448:9;:19;62458:8;62448:19;;;;;;;;;;;62442:33;;;;;;;;;;;;;;;;:37;62434:109;;;;-1:-1:-1;;;62434:109:0;;;;;;;:::i;:::-;62560:14;62577:8;;62586:1;62577:11;;;;;;;;;;;;;62560:28;;62620:1;62611:6;:10;62603:75;;;;-1:-1:-1;;;62603:75:0;;;;;;;:::i;:::-;-1:-1:-1;;62363:3:0;;62316:374;;;;62702:57;62713:12;62727:14;;62702:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62702:57:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62743:8:0;;-1:-1:-1;62743:8:0;;;;62702:57;;;62743:8;;62702:57;62743:8;62702:57;;;;;;;;;-1:-1:-1;;62702:57:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62753:5:0;;-1:-1:-1;62753:5:0;;;;62702:57;;62753:5;;;;62702:57;;;;;;;;;-1:-1:-1;62702:10:0;;-1:-1:-1;;;62702:57:0:i;:::-;61641:1126;;;;;;;:::o;58055:29::-;;;;:::o;24981:618::-;25129:16;25190:3;:10;25171:8;:15;:29;25163:83;;;;-1:-1:-1;;;25163:83:0;;;;;;;:::i;:::-;25259:30;25306:8;:15;-1:-1:-1;;;;;25292:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25292:30:0;;25259:63;;25340:9;25335:224;25359:8;:15;25355:1;:19;25335:224;;;25427:1;-1:-1:-1;;;;;25404:25:0;:8;25413:1;25404:11;;;;;;;;;;;;;;-1:-1:-1;;;;;25404:25:0;;;25396:87;;;;-1:-1:-1;;;25396:87:0;;;;;;;:::i;:::-;25517:9;:17;25527:3;25531:1;25527:6;;;;;;;;;;;;;;25517:17;;;;;;;;;;;:30;25535:8;25544:1;25535:11;;;;;;;;;;;;;;-1:-1:-1;;;;;25517:30:0;-1:-1:-1;;;;;25517:30:0;;;;;;;;;;;;;25498:13;25512:1;25498:16;;;;;;;;;;;;;;;;;:49;25376:3;;25335:224;;;-1:-1:-1;25578:13:0;24981:618;-1:-1:-1;;;24981:618:0:o;22971:51::-;;;;;;;;;;;;;:::o;36659:321::-;36802:12;:10;:12::i;:::-;-1:-1:-1;;;;;36791:23:0;:7;-1:-1:-1;;;;;36791:23:0;;:66;;;;36818:39;36835:7;36844:12;:10;:12::i;36818:39::-;36769:157;;;;-1:-1:-1;;;36769:157:0;;;;;;;:::i;:::-;36939:33;36950:7;36959:3;36964:7;36939:10;:33::i;:::-;36659:321;;;:::o;62775:480::-;62888:14;;-1:-1:-1;;;;;62888:14:0;:27;62916:12;:10;:12::i;:::-;62888:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62866:152;;;;-1:-1:-1;;;62866:152:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63053:38:0;;63031:171;;;;-1:-1:-1;;;63031:171:0;;;;;;;:::i;:::-;63215:14;:32;;-1:-1:-1;;;;;;63215:32:0;-1:-1:-1;;;;;63215:32:0;;;;;;;;;;62775:480::o;58135:45::-;;;-1:-1:-1;;;;;58135:45:0;;:::o;59425:928::-;59557:14;;59497:25;;-1:-1:-1;;;;;59557:14:0;:35;59593:12;:10;:12::i;:::-;59557:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59535:168;;;;-1:-1:-1;;;59535:168:0;;;;;;;:::i;:::-;59724:16;59716:94;;;;-1:-1:-1;;;59716:94:0;;;;;;;:::i;:::-;59844:5;;-1:-1:-1;;;;;59878:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59878:25:0;;59867:36;;59919:9;59914:347;59938:10;59934:1;:14;59914:347;;;59970:17;59990:5;;59996:1;59990:8;;;;;;;;;;;;;;;;;;:::i;:::-;59970:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60021:17:0;;59970:28;;-1:-1:-1;;;60013:95:0;;;;-1:-1:-1;;;60013:95:0;;;;;;;:::i;:::-;60140:14;;:21;;60159:1;60140:18;:21::i;:::-;60123:14;:38;;;60178:28;;60202:3;60178:7;:28::i;:::-;60235:14;;60221:8;60230:1;60221:11;;;;;;;;;;;;;;;;;:28;-1:-1:-1;59950:3:0;;59914:347;;;;60320:25;60336:8;60320:25;;;;;;:::i;:::-;;;;;;;;59425:928;;;;;:::o;57985:20::-;;;;;;;;;;;;;;;-1:-1:-1;;57985:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25672:313;25793:8;-1:-1:-1;;;;;25777:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;25777:24:0;;;25769:78;;;;-1:-1:-1;;;25769:78:0;;;;;;;:::i;:::-;25905:8;25860:18;:32;25879:12;:10;:12::i;:::-;-1:-1:-1;;;;;25860:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25860:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25860:53:0;;;;;;;;;;;25944:12;:10;:12::i;:::-;-1:-1:-1;;;;;25929:48:0;;25968:8;25929:48;;;;;;:::i;:::-;;;;;;;;25672:313;;:::o;58745:498::-;58851:14;;58806:10;;-1:-1:-1;;;;;58851:14:0;:35;58887:12;:10;:12::i;:::-;58851:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58829:160;;;;-1:-1:-1;;;58829:160:0;;;;;;;:::i;:::-;59010:22;59002:88;;;;-1:-1:-1;;;59002:88:0;;;;;;;:::i;:::-;59120:14;;:21;;59139:1;59120:18;:21::i;:::-;59103:14;:38;;;;59159:14;;59154:19;;59184:17;59192:2;59196:4;;59184:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59184:7:0;;-1:-1:-1;;;59184:17:0:i;:::-;59219:16;;59232:2;;59219:16;;;;;58745:498;;;;:::o;60779:555::-;60924:14;;-1:-1:-1;;;;;60924:14:0;:35;60960:12;:10;:12::i;:::-;60924:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60902:158;;;;-1:-1:-1;;;60902:158:0;;;;;;;:::i;:::-;61122:1;61087:24;;;:9;:24;;;;;61081:38;;-1:-1:-1;;61081:38:0;;;;;;;;;;;61073:106;;;;-1:-1:-1;;;61073:106:0;;;;;;;:::i;:::-;61208:1;61198:7;:11;61190:73;;;;-1:-1:-1;;;61190:73:0;;;;;;;:::i;:::-;61276:50;61282:12;61296:13;61311:7;61320:5;;61276:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61276:5:0;;-1:-1:-1;;;61276:50:0:i;:::-;60779:555;;;;;:::o;26057:160::-;-1:-1:-1;;;;;26172:27:0;;;26148:4;26172:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26057:160::o;26289:914::-;-1:-1:-1;;;;;26505:16:0;;26497:66;;;;-1:-1:-1;;;26497:66:0;;;;;;;:::i;:::-;26604:12;:10;:12::i;:::-;-1:-1:-1;;;;;26596:20:0;:4;-1:-1:-1;;;;;26596:20:0;;:60;;;;26620:36;26637:4;26643:12;:10;:12::i;26620:36::-;26574:151;;;;-1:-1:-1;;;26574:151:0;;;;;;;:::i;:::-;26738:16;26757:12;:10;:12::i;:::-;26738:31;;26782:96;26803:8;26813:4;26819:2;26823:21;26841:2;26823:17;:21::i;:::-;26846:25;26864:6;26846:17;:25::i;:::-;26873:4;26782:20;:96::i;:::-;26913:77;26937:6;26913:77;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26913:19:0;;;;;;;;;;;:77;:23;:77::i;:::-;26891:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26891:19:0;;;;;;;;;;:99;;;;27021:17;;;;;;:29;;27043:6;27021:21;:29::i;:::-;27001:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;27001:17:0;;;;;;;;;;;;;;:49;;;;27068:46;;27001:17;;27068:46;;;;;;;;;;;;27011:2;;27107:6;;27068:46;:::i;:::-;;;;;;;;27127:68;27158:8;27168:4;27174:2;27178;27182:6;27190:4;27127:30;:68::i;36362:289::-;36480:12;:10;:12::i;:::-;-1:-1:-1;;;;;36469:23:0;:7;-1:-1:-1;;;;;36469:23:0;;:66;;;;36496:39;36513:7;36522:12;:10;:12::i;36496:39::-;36447:157;;;;-1:-1:-1;;;36447:157:0;;;;;;;:::i;:::-;36617:26;36623:7;36632:2;36636:6;36617:5;:26::i;8431:106::-;8519:10;8431:106;;:::o;12311:192::-;12397:7;12433:12;12425:6;;;;12417:29;;;;-1:-1:-1;;;12417:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;12469:5:0;;;12311:192::o;11408:181::-;11466:7;11498:5;;;11522:6;;;;11514:46;;;;-1:-1:-1;;;11514:46:0;;;;;;;:::i;:::-;11580:1;11408:181;-1:-1:-1;;;11408:181:0:o;34870:795::-;35120:15;:2;-1:-1:-1;;;;;35120:13:0;;:15::i;:::-;35116:542;;;35156:79;;-1:-1:-1;;;35156:79:0;;-1:-1:-1;;;;;35156:43:0;;;;;:79;;35200:8;;35210:4;;35216:3;;35221:7;;35230:4;;35156:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35156:79:0;;;;;;;;-1:-1:-1;;35156:79:0;;;;;;;;;;;;:::i;:::-;;;35152:495;;;;:::i;:::-;;;;;;;;35520:6;35513:14;;-1:-1:-1;;;35513:14:0;;;;;;;;:::i;35152:495::-;35569:62;;-1:-1:-1;;;35569:62:0;;;;;;;:::i;35152:495::-;-1:-1:-1;;;;;;35285:64:0;;-1:-1:-1;;;35285:64:0;35281:163;;35374:50;;-1:-1:-1;;;35374:50:0;;;;;;;:::i;30121:849::-;-1:-1:-1;;;;;30256:16:0;;30248:62;;;;-1:-1:-1;;;30248:62:0;;;;;;;:::i;:::-;30343:7;:14;30329:3;:10;:28;30321:81;;;;-1:-1:-1;;;30321:81:0;;;;;;;:::i;:::-;30415:16;30434:12;:10;:12::i;:::-;30415:31;;30459:66;30480:8;30498:1;30502:2;30506:3;30511:7;30520:4;30459:20;:66::i;:::-;30543:6;30538:260;30559:3;:10;30555:1;:14;30538:260;;;30591:10;30604:3;30608:1;30604:6;;;;;;;;;;;;;;30591:19;;30625:14;30642:7;30650:1;30642:10;;;;;;;;;;;;;;;;;;;30698:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;30698:17:0;;;;;;;;;;;;30642:10;;-1:-1:-1;30687:29:0;;30642:10;;30687;:29::i;:::-;30667:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30667:17:0;;;;;;;;;:49;;;;30754:20;;;:16;:20;;;;:32;;30779:6;30754:24;:32::i;:::-;30731:20;;;;:16;:20;;;;;;:55;;;;-1:-1:-1;30571:3:0;;30538:260;;;;30851:2;-1:-1:-1;;;;;30815:53:0;30847:1;-1:-1:-1;;;;;30815:53:0;30829:8;-1:-1:-1;;;;;30815:53:0;;30855:3;30860:7;30815:53;;;;;;;:::i;:::-;;;;;;;;30881:81;30917:8;30935:1;30939:2;30943:3;30948:7;30957:4;30881:35;:81::i;32051:857::-;-1:-1:-1;;;;;32172:21:0;;32164:69;;;;-1:-1:-1;;;32164:69:0;;;;;;;:::i;:::-;32266:7;:14;32252:3;:10;:28;32244:81;;;;-1:-1:-1;;;32244:81:0;;;;;;;:::i;:::-;32338:16;32357:12;:10;:12::i;:::-;32338:31;;32382:69;32403:8;32413:7;32430:1;32434:3;32439:7;32382:69;;;;;;;;;;;;:20;:69::i;:::-;32469:6;32464:361;32485:3;:10;32481:1;:14;32464:361;;;32517:10;32530:3;32534:1;32530:6;;;;;;;;;;;;;;32517:19;;32551:14;32568:7;32576:1;32568:10;;;;;;;;;;;;;;32551:27;;32618:123;32663:6;32618:123;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32618:22:0;;;;;;;;;;;:123;:26;:123::i;:::-;32593:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32593:22:0;;;;;;;;;:148;;;;32781:20;;;:16;:20;;;;:32;;32806:6;32781:24;:32::i;:::-;32758:20;;;;:16;:20;;;;;;:55;;;;-1:-1:-1;32497:3:0;;32464:361;;;;32883:1;-1:-1:-1;;;;;32842:58:0;32866:7;-1:-1:-1;;;;;32842:58:0;32856:8;-1:-1:-1;;;;;32842:58:0;;32887:3;32892:7;32842:58;;;;;;;:::i;:::-;;;;;;;;32051:857;;;;:::o;28565:155::-;28649:18;;;;:9;:18;;;;;;;;:27;;;;;;;;:::i;:::-;;28704:7;28692:20;28696:6;28692:20;;;;;;:::i;:::-;;;;;;;;28565:155;;:::o;29116:649::-;-1:-1:-1;;;;;29231:21:0;;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;29303:16;29322:12;:10;:12::i;:::-;29303:31;;29347:107;29368:8;29386:1;29390:7;29399:21;29417:2;29399:17;:21::i;29347:107::-;29492:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29492:22:0;;;;;;;;;;:34;;29519:6;29492:26;:34::i;:::-;29467:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;29467:22:0;;;;;;;;;:59;;;;29560:20;;;:16;:20;;;;:32;;29585:6;29560:24;:32::i;:::-;29537:20;;;;:16;:20;;;;;;:55;;;;29608:57;;-1:-1:-1;;;;;29608:57:0;;;;29537:20;29608:57;;;;;;;;29554:2;;29658:6;;29608:57;:::i;:::-;;;;;;;;29678:79;29709:8;29727:1;29731:7;29740:2;29744:6;29752:4;29678:30;:79::i;35673:198::-;35793:16;;;35807:1;35793:16;;;;;;;;;35739;;;;35793;;;;;;;;;;;;-1:-1:-1;35793:16:0;35768:41;;35831:7;35820:5;35826:1;35820:8;;;;;;;;;;;;;;;;;:18;35858:5;35673:198;-1:-1:-1;;35673:198:0:o;34104:758::-;34329:15;:2;-1:-1:-1;;;;;34329:13:0;;:15::i;:::-;34325:530;;;34365:72;;-1:-1:-1;;;34365:72:0;;-1:-1:-1;;;;;34365:38:0;;;;;:72;;34404:8;;34414:4;;34420:2;;34424:6;;34432:4;;34365:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34365:72:0;;;;;;;;-1:-1:-1;;34365:72:0;;;;;;;;;;;;:::i;:::-;;;34361:483;;;;:::i;:::-;-1:-1:-1;;;;;;34487:59:0;;-1:-1:-1;;;34487:59:0;34483:158;;34571:50;;-1:-1:-1;;;34571:50:0;;;;;;;:::i;31229:619::-;-1:-1:-1;;;;;31325:21:0;;31317:69;;;;-1:-1:-1;;;31317:69:0;;;;;;;:::i;:::-;31399:16;31418:12;:10;:12::i;:::-;31399:31;;31443:105;31464:8;31474:7;31491:1;31495:21;31513:2;31495:17;:21::i;:::-;31518:25;31536:6;31518:17;:25::i;:::-;31443:105;;;;;;;;;;;;:20;:105::i;:::-;31586:111;31627:6;31586:111;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31586:22:0;;;;;;;;;;;:111;:26;:111::i;:::-;31561:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31561:22:0;;;;;;;;;:136;;;;31733:20;;;:16;:20;;;;:32;;31758:6;31733:24;:32::i;:::-;31710:20;;;;:16;:20;;;;;;:55;;;;31783:57;;-1:-1:-1;;;;;31783:57:0;;;;;;;;;;;;31727:2;;31833:6;;31783:57;:::i;16611:422::-;16978:20;17017:8;;;16611:422::o;11872:136::-;11930:7;11957:43;11961:1;11964;11957:43;;;;;;;;;;;;;;;;;:3;:43::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;892:364;;;1034:3;1027:4;1019:6;1015:17;1011:27;1001:2;;-1:-1;;1042:12;1001:2;-1:-1;1072:20;;-1:-1;;;;;1101:30;;1098:2;;;-1:-1;;1134:12;1098:2;1178:4;1170:6;1166:17;1154:29;;1229:3;1178:4;;1213:6;1209:17;1170:6;1195:32;;1192:41;1189:2;;;1246:1;;1236:12;1189:2;994:262;;;;;:::o;1660:707::-;;1777:3;1770:4;1762:6;1758:17;1754:27;1744:2;;-1:-1;;1785:12;1744:2;1832:6;1819:20;1854:80;1869:64;1926:6;1869:64;:::i;:::-;1854:80;:::i;:::-;1962:21;;;1845:89;-1:-1;2006:4;2019:14;;;;1994:17;;;2108;;;2099:27;;;;2096:36;-1:-1;2093:2;;;2145:1;;2135:12;2093:2;2170:1;2155:206;2180:6;2177:1;2174:13;2155:206;;;4350:20;;2248:50;;2312:14;;;;2340;;;;2202:1;2195:9;2155:206;;;2159:14;;;;;1737:630;;;;:::o;2929:336::-;;;3043:3;3036:4;3028:6;3024:17;3020:27;3010:2;;-1:-1;;3051:12;3010:2;-1:-1;3081:20;;-1:-1;;;;;3110:30;;3107:2;;;-1:-1;;3143:12;3107:2;3187:4;3179:6;3175:17;3163:29;;3238:3;3187:4;3218:17;3179:6;3204:32;;3201:41;3198:2;;;3255:1;;3245:12;3274:440;;3375:3;3368:4;3360:6;3356:17;3352:27;3342:2;;-1:-1;;3383:12;3342:2;3430:6;3417:20;-1:-1;;;;;44887:6;44884:30;44881:2;;;-1:-1;;44917:12;44881:2;3452:64;44990:9;44971:17;;-1:-1;;44967:33;45058:4;45048:15;3452:64;:::i;:::-;3443:73;;3536:6;3529:5;3522:21;3640:3;45058:4;3631:6;3564;3622:16;;3619:25;3616:2;;;3657:1;;3647:12;3616:2;47762:6;45058:4;3564:6;3560:17;45058:4;3598:5;3594:16;47739:30;47818:1;47800:16;;;45058:4;47800:16;47793:27;3598:5;3335:379;-1:-1;;3335:379::o;4420:366::-;;;4541:2;4529:9;4520:7;4516:23;4512:32;4509:2;;;-1:-1;;4547:12;4509:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4599:63;-1:-1;4699:2;4738:22;;72:20;97:33;72:20;97:33;:::i;:::-;4707:63;;;;4503:283;;;;;:::o;4793:1119::-;;;;;;5024:3;5012:9;5003:7;4999:23;4995:33;4992:2;;;-1:-1;;5031:12;4992:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5083:63;-1:-1;5183:2;5222:22;;72:20;97:33;72:20;97:33;:::i;:::-;5191:63;-1:-1;5319:2;5304:18;;5291:32;-1:-1;;;;;5332:30;;;5329:2;;;-1:-1;;5365:12;5329:2;5395:78;5465:7;5456:6;5445:9;5441:22;5395:78;:::i;:::-;5385:88;;5538:2;5527:9;5523:18;5510:32;5496:46;;5343:18;5554:6;5551:30;5548:2;;;-1:-1;;5584:12;5548:2;5614:78;5684:7;5675:6;5664:9;5660:22;5614:78;:::i;:::-;5604:88;;5757:3;5746:9;5742:19;5729:33;5715:47;;5343:18;5774:6;5771:30;5768:2;;;-1:-1;;5804:12;5768:2;;5834:62;5888:7;5879:6;5868:9;5864:22;5834:62;:::i;:::-;5824:72;;;4986:926;;;;;;;;:::o;5919:847::-;;;;;;6100:3;6088:9;6079:7;6075:23;6071:33;6068:2;;;-1:-1;;6107:12;6068:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6159:63;-1:-1;6259:2;6298:22;;72:20;97:33;72:20;97:33;:::i;:::-;6267:63;-1:-1;6367:2;6406:22;;4350:20;;-1:-1;6475:2;6514:22;;4350:20;;-1:-1;6611:3;6596:19;;6583:33;-1:-1;;;;;6625:30;;6622:2;;;-1:-1;;6658:12;6622:2;6688:62;6742:7;6733:6;6722:9;6718:22;6688:62;:::i;6773:763::-;;;;6961:2;6949:9;6940:7;6936:23;6932:32;6929:2;;;-1:-1;;6967:12;6929:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7019:63;-1:-1;7147:2;7132:18;;7119:32;-1:-1;;;;;7160:30;;;7157:2;;;-1:-1;;7193:12;7157:2;7223:78;7293:7;7284:6;7273:9;7269:22;7223:78;:::i;:::-;7213:88;;7366:2;7355:9;7351:18;7338:32;7324:46;;7171:18;7382:6;7379:30;7376:2;;;-1:-1;;7412:12;7376:2;;7442:78;7512:7;7503:6;7492:9;7488:22;7442:78;:::i;:::-;7432:88;;;6923:613;;;;;:::o;7543:360::-;;;7661:2;7649:9;7640:7;7636:23;7632:32;7629:2;;;-1:-1;;7667:12;7629:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7719:63;-1:-1;7819:2;7855:22;;2439:20;2464:30;2439:20;2464:30;:::i;7910:366::-;;;8031:2;8019:9;8010:7;8006:23;8002:32;7999:2;;;-1:-1;;8037:12;7999:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8089:63;8189:2;8228:22;;;;4350:20;;-1:-1;;;7993:283::o;8283:491::-;;;;8421:2;8409:9;8400:7;8396:23;8392:32;8389:2;;;-1:-1;;8427:12;8389:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8479:63;8579:2;8618:22;;4350:20;;-1:-1;8687:2;8726:22;;;4350:20;;8383:391;-1:-1;;;8383:391::o;8781:638::-;;;8952:2;8940:9;8931:7;8927:23;8923:32;8920:2;;;-1:-1;;8958:12;8920:2;9016:17;9003:31;-1:-1;;;;;9054:18;9046:6;9043:30;9040:2;;;-1:-1;;9076:12;9040:2;9167:6;9156:9;9152:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;9096:88;;-1:-1;9234:18;;9221:32;;-1:-1;;;9262:30;;;9259:2;;;-1:-1;;9295:12;9259:2;;9325:78;9395:7;9386:6;9375:9;9371:22;9325:78;:::i;:::-;9315:88;;;8914:505;;;;;:::o;9426:421::-;;;9577:2;9565:9;9556:7;9552:23;9548:32;9545:2;;;-1:-1;;9583:12;9545:2;9641:17;9628:31;-1:-1;;;;;9671:6;9668:30;9665:2;;;-1:-1;;9701:12;9665:2;9739:92;9823:7;9814:6;9803:9;9799:22;9739:92;:::i;:::-;9721:110;;;;-1:-1;9539:308;-1:-1;;;;9539:308::o;9854:1053::-;;;;;;;;10098:3;10086:9;10077:7;10073:23;10069:33;10066:2;;;-1:-1;;10105:12;10066:2;10163:17;10150:31;-1:-1;;;;;10201:18;10193:6;10190:30;10187:2;;;-1:-1;;10223:12;10187:2;10261:80;10333:7;10324:6;10313:9;10309:22;10261:80;:::i;:::-;10243:98;;-1:-1;10243:98;-1:-1;10406:2;10391:18;;10378:32;;-1:-1;10419:30;;;10416:2;;;-1:-1;;10452:12;10416:2;10490:80;10562:7;10553:6;10542:9;10538:22;10490:80;:::i;:::-;10472:98;;-1:-1;10472:98;-1:-1;10607:2;10646:22;;72:20;;-1:-1;97:33;72:20;97:33;:::i;:::-;10615:63;;-1:-1;10743:2;10728:18;;10715:32;;10756:30;;;10753:2;;;-1:-1;;10789:12;10753:2;;10827:64;10883:7;10874:6;10863:9;10859:22;10827:64;:::i;:::-;10060:847;;;;-1:-1;10060:847;;-1:-1;10060:847;;;;10809:82;;-1:-1;;;10060:847::o;10914:257::-;;11026:2;11014:9;11005:7;11001:23;10997:32;10994:2;;;-1:-1;;11032:12;10994:2;2587:6;2581:13;2599:30;2623:5;2599:30;:::i;11178:239::-;;11281:2;11269:9;11260:7;11256:23;11252:32;11249:2;;;-1:-1;;11287:12;11249:2;2720:6;2707:20;2732:32;2758:5;2732:32;:::i;11424:261::-;;11538:2;11526:9;11517:7;11513:23;11509:32;11506:2;;;-1:-1;;11544:12;11506:2;2859:6;2853:13;2871:32;2897:5;2871:32;:::i;11692:305::-;;11828:2;11816:9;11807:7;11803:23;11799:32;11796:2;;;-1:-1;;11834:12;11796:2;3834:6;3821:20;3846:65;3905:5;3846:65;:::i;12004:367::-;;;12128:2;12116:9;12107:7;12103:23;12099:32;12096:2;;;-1:-1;;12134:12;12096:2;12192:17;12179:31;-1:-1;;;;;12222:6;12219:30;12216:2;;;-1:-1;;12252:12;12216:2;12290:65;12347:7;12338:6;12327:9;12323:22;12290:65;:::i;12378:241::-;;12482:2;12470:9;12461:7;12457:23;12453:32;12450:2;;;-1:-1;;12488:12;12450:2;-1:-1;4350:20;;12444:175;-1:-1;12444:175::o;12626:741::-;;;;;;12800:3;12788:9;12779:7;12775:23;12771:33;12768:2;;;-1:-1;;12807:12;12768:2;12890:22;4350:20;12859:63;;12959:2;13002:9;12998:22;4350:20;12967:63;;13067:2;13110:9;13106:22;72:20;97:33;124:5;97:33;:::i;:::-;13075:63;-1:-1;13203:2;13188:18;;13175:32;-1:-1;;;;;13216:30;;13213:2;;;-1:-1;;13249:12;13213:2;13287:64;13343:7;13334:6;13323:9;13319:22;13287:64;:::i;:::-;12762:605;;;;-1:-1;12762:605;;-1:-1;13269:82;;;12762:605;-1:-1;;;12762:605::o;13856:690::-;;14049:5;45341:12;45885:6;45880:3;45873:19;45922:4;;45917:3;45913:14;14061:93;;45922:4;14225:5;45195:14;-1:-1;14264:260;14289:6;14286:1;14283:13;14264:260;;;14350:13;;26872:37;;13528:14;;;;45728;;;;14311:1;14304:9;14264:260;;;-1:-1;14530:10;;13980:566;-1:-1;;;;;13980:566::o;14665:343::-;;14807:5;45341:12;45885:6;45880:3;45873:19;-1:-1;47907:101;47921:6;47918:1;47915:13;47907:101;;;45922:4;47988:11;;;;;47982:18;47969:11;;;;;47962:39;47936:10;47907:101;;;48023:6;48020:1;48017:13;48014:2;;;-1:-1;45922:4;48079:6;45917:3;48070:16;;48063:27;48014:2;-1:-1;44990:9;48179:14;-1:-1;;48175:28;14964:39;;;;45922:4;14964:39;;14755:253;-1:-1;;14755:253::o;27041:238::-;-1:-1;;;;;46817:54;;;;13635:58;;27176:2;27161:18;;27147:132::o;27286:1048::-;-1:-1;;;;;46817:54;;;13776:37;;46817:54;;27808:2;27793:18;;13776:37;46828:42;27845:2;27830:18;;27823:48;;;27286:1048;;27885:108;;27628:19;;27979:6;27885:108;:::i;:::-;28041:9;28035:4;28031:20;28026:2;28015:9;28011:18;28004:48;28066:108;28169:4;28160:6;28066:108;:::i;:::-;28058:116;;28223:9;28217:4;28213:20;28207:3;28196:9;28192:19;28185:49;28248:76;28319:4;28310:6;28248:76;:::i;:::-;28240:84;27614:720;-1:-1;;;;;;;;27614:720::o;28341:752::-;-1:-1;;;;;46817:54;;;13776:37;;46817:54;;28763:2;28748:18;;13776:37;28846:2;28831:18;;26872:37;;;28929:2;28914:18;;26872:37;;;46828:42;28966:3;28951:19;;28944:49;;;28341:752;;29007:76;;28583:19;;29069:6;29007:76;:::i;:::-;28999:84;28569:524;-1:-1;;;;;;;28569:524::o;29100:370::-;;29277:2;29298:17;29291:47;29352:108;29277:2;29266:9;29262:18;29446:6;29352:108;:::i;29477:629::-;;29732:2;29753:17;29746:47;29807:108;29732:2;29721:9;29717:18;29901:6;29807:108;:::i;:::-;29963:9;29957:4;29953:20;29948:2;29937:9;29933:18;29926:48;29988:108;30091:4;30082:6;29988:108;:::i;:::-;29980:116;29703:403;-1:-1;;;;;29703:403::o;30113:210::-;46448:13;;46441:21;14619:34;;30234:2;30219:18;;30205:118::o;30623:310::-;;30770:2;30791:17;30784:47;30845:78;30770:2;30759:9;30755:18;30909:6;30845:78;:::i;30940:416::-;31140:2;31154:47;;;15791:2;31125:18;;;45873:19;15827:34;45913:14;;;15807:55;-1:-1;;;15882:12;;;15875:44;15938:12;;;31111:245::o;31363:416::-;31563:2;31577:47;;;16189:2;31548:18;;;45873:19;16225:34;45913:14;;;16205:55;16294:34;16280:12;;;16273:56;-1:-1;;;16349:12;;;16342:43;16404:12;;;31534:245::o;31786:416::-;31986:2;32000:47;;;16655:2;31971:18;;;45873:19;16691:34;45913:14;;;16671:55;-1:-1;;;16746:12;;;16739:32;16790:12;;;31957:245::o;32209:416::-;32409:2;32423:47;;;17041:2;32394:18;;;45873:19;-1:-1;;;;;;;;;;;45913:14;;;17057:55;17146:29;17132:12;;;17125:51;17195:12;;;32380:245::o;32632:416::-;32832:2;32846:47;;;17446:2;32817:18;;;45873:19;17482:34;45913:14;;;17462:55;-1:-1;;;17537:12;;;17530:35;17584:12;;;32803:245::o;33055:416::-;33255:2;33269:47;;;17835:2;33240:18;;;45873:19;17871:34;45913:14;;;17851:55;-1:-1;;;17926:12;;;17919:41;17979:12;;;33226:245::o;33478:416::-;33678:2;33692:47;;;18230:2;33663:18;;;45873:19;18266:29;45913:14;;;18246:50;18315:12;;;33649:245::o;33901:416::-;34101:2;34115:47;;;18566:2;34086:18;;;45873:19;-1:-1;;;;;;;;;;;45913:14;;;18582:55;-1:-1;;;18657:12;;;18650:44;18713:12;;;34072:245::o;34324:416::-;34524:2;34538:47;;;18964:2;34509:18;;;45873:19;19000:34;45913:14;;;18980:55;-1:-1;;;19055:12;;;19048:33;19100:12;;;34495:245::o;34747:416::-;34947:2;34961:47;;;19351:2;34932:18;;;45873:19;19387:34;45913:14;;;19367:55;19456:31;19442:12;;;19435:53;19507:12;;;34918:245::o;35170:416::-;35370:2;35384:47;;;19758:2;35355:18;;;45873:19;19794:34;45913:14;;;19774:55;-1:-1;;;19849:12;;;19842:29;19890:12;;;35341:245::o;35593:416::-;35793:2;35807:47;;;20141:2;35778:18;;;45873:19;20177:34;45913:14;;;20157:55;-1:-1;;;20232:12;;;20225:42;20286:12;;;35764:245::o;36016:416::-;36216:2;36230:47;;;20537:2;36201:18;;;45873:19;20573:34;45913:14;;;20553:55;20642:31;20628:12;;;20621:53;20693:12;;;36187:245::o;36439:416::-;36639:2;36653:47;;;20944:2;36624:18;;;45873:19;20980:34;45913:14;;;20960:55;-1:-1;;;21035:12;;;21028:43;21090:12;;;36610:245::o;36862:416::-;37062:2;37076:47;;;21341:2;37047:18;;;45873:19;21377:34;45913:14;;;21357:55;-1:-1;;;21432:12;;;21425:27;21471:12;;;37033:245::o;37285:416::-;37485:2;37499:47;;;21722:2;37470:18;;;45873:19;-1:-1;;;;;;;;;;;45913:14;;;21738:55;21827:33;21813:12;;;21806:55;21880:12;;;37456:245::o;37708:416::-;37908:2;37922:47;;;22131:2;37893:18;;;45873:19;22167:34;45913:14;;;22147:55;22236:31;22222:12;;;22215:53;22287:12;;;37879:245::o;38131:416::-;38331:2;38345:47;;;22538:2;38316:18;;;45873:19;22574:34;45913:14;;;22554:55;-1:-1;;;22629:12;;;22622:41;22682:12;;;38302:245::o;38554:416::-;38754:2;38768:47;;;22933:2;38739:18;;;45873:19;-1:-1;;;;;;;;;;;45913:14;;;22949:55;23038:34;23024:12;;;23017:56;-1:-1;;;23093:12;;;23086:27;23132:12;;;38725:245::o;38977:416::-;39177:2;39191:47;;;23383:2;39162:18;;;45873:19;23419:34;45913:14;;;23399:55;23488:34;23474:12;;;23467:56;-1:-1;;;23543:12;;;23536:25;23580:12;;;39148:245::o;39400:416::-;39600:2;39614:47;;;23831:2;39585:18;;;45873:19;23867:34;45913:14;;;23847:55;23936:34;23922:12;;;23915:56;-1:-1;;;23991:12;;;23984:29;24032:12;;;39571:245::o;39823:416::-;40023:2;40037:47;;;24283:2;40008:18;;;45873:19;24319:34;45913:14;;;24299:55;-1:-1;;;24374:12;;;24367:45;24431:12;;;39994:245::o;40246:416::-;40446:2;40460:47;;;24682:2;40431:18;;;45873:19;24718:34;45913:14;;;24698:55;-1:-1;;;24773:12;;;24766:33;24818:12;;;40417:245::o;40669:416::-;40869:2;40883:47;;;25069:2;40854:18;;;45873:19;25105:34;45913:14;;;25085:55;-1:-1;;;25160:12;;;25153:33;25205:12;;;40840:245::o;41092:416::-;41292:2;41306:47;;;25456:2;41277:18;;;45873:19;;;-1:-1;;;;;;;;;;;45913:14;;;25472:55;25561:34;25547:12;;;25540:56;25615:12;;;41263:245::o;41515:416::-;41715:2;41729:47;;;25866:2;41700:18;;;45873:19;25902:34;45913:14;;;25882:55;25971:29;25957:12;;;25950:51;26020:12;;;41686:245::o;41938:416::-;42138:2;42152:47;;;26271:2;42123:18;;;45873:19;26307:34;45913:14;;;26287:55;-1:-1;;;26362:12;;;26355:32;26406:12;;;42109:245::o;42361:416::-;42561:2;42575:47;;;26657:2;42546:18;;;45873:19;26693:34;45913:14;;;26673:55;-1:-1;;;26748:12;;;26741:25;26785:12;;;42532:245::o;42784:222::-;26872:37;;;42911:2;42896:18;;42882:124::o;43013:333::-;26872:37;;;43332:2;43317:18;;26872:37;43168:2;43153:18;;43139:207::o;43353:507::-;;;43489:11;43476:25;43540:48;;43564:8;43548:14;43544:29;43540:48;43520:18;43516:73;43506:2;;-1:-1;;43593:12;43506:2;43620:33;;43674:18;;;-1:-1;;;;;;43701:30;;43698:2;;;-1:-1;;43734:12;43698:2;43579:4;43762:13;;-1:-1;43548:14;43794:38;;;43784:49;;43781:2;;;43846:1;;43836:12;43867:256;43929:2;43923:9;43955:17;;;-1:-1;;;;;44015:34;;44051:22;;;44012:62;44009:2;;;44087:1;;44077:12;44009:2;43929;44096:22;43907:216;;-1:-1;43907:216::o;44130:304::-;;-1:-1;;;;;44281:6;44278:30;44275:2;;;-1:-1;;44311:12;44275:2;-1:-1;44356:4;44344:17;;;44409:15;;44212:222::o;48216:106::-;48301:3;48297:15;;48269:53::o;48330:739::-;;48403:4;48385:16;48382:26;48379:2;;;48411:5;;48379:2;48445:1;-1:-1;;48424:23;48520:10;48463:34;-1:-1;48488:8;48463:34;:::i;:::-;48512:19;48502:2;;48535:5;;48502:2;48566;48560:9;48602:16;-1:-1;;48598:24;48445:1;48560:9;48574:49;48649:4;48643:11;48730:16;-1:-1;;;;;48730:16;48723:4;48715:6;48711:17;48708:39;48682:18;48674:6;48671:30;48662:91;48659:2;;;48761:5;;;;;;48659:2;48799:6;48793:4;48789:17;48778:28;;48831:3;48825:10;48811:24;;48682:18;48846:6;48843:30;48840:2;;;48876:5;;;;;;48840:2;;48953:16;48947:4;48943:27;48913:4;48920:6;48908:3;48900:27;;48935:36;48932:2;;;48974:5;;;;;48932:2;44990:9;48179:14;-1:-1;;48175:28;48998:50;;48913:4;48998:50;48566:2;48987:62;49006:3;-1:-1;;48373:696;:::o;49076:117::-;-1:-1;;;;;46817:54;;49135:35;;49125:2;;49184:1;;49174:12;49125:2;49119:74;:::o;49200:111::-;49281:5;46448:13;46441:21;49259:5;49256:32;49246:2;;49302:1;;49292:12;49318:115;-1:-1;;;;;;46535:78;;49376:34;;49366:2;;49424:1;;49414:12

Swarm Source

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

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