ETH Price: $2,870.38 (+6.68%)
 

Overview

Max Total Supply

20,687

Holders

1,939

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
rokudaime.eth
0x4d9936b983afD4Cc69415EbA624B34531c6715A4
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:
Transponders

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Transponders.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

import "../lib/TokenizedContract.sol";
import "solmate/src/tokens/ERC1155.sol";
import "@openzeppelin/contracts/utils/Create2.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

struct Signal {
    uint8 status;
    uint8 style;
    uint40 startBlock;
    address sender;
    bytes[37] message;
}
interface IDelegationRegistry {
    function checkDelegateForContract(address delegate, address vault, address contract_) external view returns(bool);
    function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool);

}

interface ICustomAttributes {
    function getCustomAttributes () external view returns (bytes memory);
}

interface ITransponderMetadata {

    function broadcastMetadata (bool signalling, uint peer, uint modelId, uint startBlock, string memory content, string memory handle) external view returns (string memory);
    function propagandaMetadata (uint modelId) external view returns (string memory);
    function signalMetadata(uint peer, Signal memory local, Signal memory peer1, Signal memory peer2) external view returns (string memory);

    function adjustTypeface (address _typefaceAddress, uint256 weight, string memory style) external;

    function uploadModels (uint48 count, bytes memory data) external;
    function uploadPropaganda (string[] calldata messages, string[] calldata handles) external;
    function updatePropaganda (uint[] calldata ids, string[] calldata messages, string[] calldata handles) external;

    function setB64EncodeURI (bool active) external;
}

/*
 * @title Transponders
 * @author Ponderware Ltd
 * @dev Tokenized Chain-Complete ERC1155 Contract
 */
contract Transponders is ERC1155, TokenizedContract, ICustomAttributes {

    event Broadcast (string message, string handle);

    ITransponderMetadata Metadata;

    constructor (uint256 tokenId) TokenizedContract(tokenId) {
        addRole(owner(), Role.Uploader);
        addRole(owner(), Role.Beneficiary);
        addRole(owner(), Role.Transmitter);
        addRole(owner(), Role.Censor);
        addRole(owner(), Role.Jammer);
        addRole(owner(), Role.Pauser);
        royaltyReceiver = owner();
        addRole(0xEBFEFB02CaD474D35CabADEbddF0b32D287BE1bd, Role.CodeLawless);
        addRole(0x3a14b1Cc1210a87AE4B6bf635FBA898628F06357, Role.LowLevelRedactedDrone);
    }

    bool internal initialized = false;

    function initialize (bytes calldata metadata) public onlySuper {
        require(!initialized, "Initialized");
        initialized = true;
        Metadata = ITransponderMetadata(Create2.deploy(0, 0, abi.encodePacked(metadata, abi.encode(address(this), CodexAddress))));
    }

    IDelegationRegistry constant dc = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B);
    bool public delegationEnabled = true;

    uint private constant TRANSPONDER_TYPES = 5;
    uint private constant CHROMA_COUNT = 5;

    Signal[] Signals;

    bool public jammed = true;

    function jam (bool value) public onlyBy(Role.Jammer) {
        jammed = value;
    }

    function signalExists (uint256 signalId) public view returns (bool) {
        return (signalId >= TRANSPONDER_TYPES && signalId - TRANSPONDER_TYPES < Signals.length);
    }

    bool internal breached = false;

    function breachTheNetwork (string calldata breachMessage,
                               address[] calldata lawless,
                               uint8[] calldata transponderTypes,
                               uint8[] calldata chromas,
                               bytes[37][] calldata messages)
        public
        onlyBy(Role.CodeLawless)
    {
        require (breached == false, "we're already in");
        breached = true;
        jammed = false;
        broadcastDuration = 300;
        broadcastInterval = 0;
        broadcast(breachMessage, "code.lawless");
        for (uint i = 0; i < lawless.length; i++) {
            uint signalId = TRANSPONDER_TYPES + Signals.length;
            _mint(lawless[i], signalId, 1, "");
            Signals.push(Signal(0, (chromas[i] << 4) + uint8(transponderTypes[i]), uint40(block.number), lawless[i], messages[i]));
        }
    }

    modifier validSignal (uint signalId) {
        require (signalExists(signalId), "signal not detected");
        _;
    }

    function totalSignals () public view returns (uint) {
        return Signals.length;
    }

    function getSignal (uint256 peer) public view validSignal(peer + TRANSPONDER_TYPES) returns (uint8, uint8, uint40, address, bool, string memory) {
        Signal storage s = Signals[peer];
        bytes[37] storage m = s.message;
        uint length = 0;
        for (; length < 37; length++) {
            if(uint8(bytes1(m[length])) == 0) break;
        }
        bytes memory message = new bytes(length);
        for (uint i = 0; i < length; i++) {
            message[i] = bytes1(m[i]);
        }
        return(s.style & 15, s.style >> 4, s.startBlock, s.sender, (s.status & 1) == 1, string(message));
    }

    function validMessage (bytes[37] memory message) public pure returns (bool) {
        for (uint i = 0; i < 37; i++) {
            uint b = uint8(bytes1(message[i]));
            if ((b >= 97 && b <= 122) || // a-z
                (b == 32) || // " "
                (b >= 45 && b <= 57) || // - . / 0-9
                (b == 39) || // '
                (b == 63) || // ?
                (b == 33)) continue; // !
                if (b == 0) break;
            return false;
        }
        return true;
    }

    modifier validSignalParameters (bytes[37] memory message, uint8 chroma) {
        require(validMessage(message), "unrecoverable uncorrectable error");
        require(chroma < CHROMA_COUNT, "incompatible power source");
        _;
    }

    modifier onlyAuthorized (address lawless, uint256 id) {
        require (lawless == msg.sender
                 || isApprovedForAll[lawless][msg.sender]
                 || (delegationEnabled && (dc.checkDelegateForContract(msg.sender, lawless, address(this))
                                           || dc.checkDelegateForToken(msg.sender, lawless, address(this), id))),


                 "unauthorized access detected");
        _;
    }

    function signal (address lawless, uint256 transponderType, uint8 chroma, bytes[37] memory message) public validSignalParameters(message, chroma) onlyAuthorized(lawless, transponderType) returns (uint256 signalId) {
        require(transponderType < TRANSPONDER_TYPES, "incompatible transponder");
        require(!jammed, "jammed");
        require(balanceOf[lawless][transponderType] > 0, "you'll need to rummage for that");
        signalId = TRANSPONDER_TYPES + Signals.length;
        _burn(lawless, transponderType, 1);
        _mint(lawless, signalId, 1, "");
        Signals.push(Signal(0, (chroma << 4) + uint8(transponderType), uint40(block.number), lawless, message));
    }

    uint public priceOfIndecisionAndRequiredMaterials = 0.1 ether;

    function reevaluate (address lawless, uint signalId, uint8 chroma, bytes[37] memory message) public validSignal(signalId) validSignalParameters(message, chroma) onlyAuthorized(lawless, signalId) payable {
        require(msg.value >= priceOfIndecisionAndRequiredMaterials, "parts aren't free");
        require(balanceOf[lawless][signalId] == 1, "hack thwarted");
        Signal storage s = Signals[signalId - TRANSPONDER_TYPES];
        s.message = message;
        s.sender = lawless;
        s.status = 0;
        s.style = (chroma << 4) + (s.style & 15);
    }

    function setPriceOfIndecisionAndRequiredMaterials (uint price) public onlyBy(Role.Fixer) {
        priceOfIndecisionAndRequiredMaterials = price;
    }

    function setB64EncodeURI (bool value) public onlyBy(Role.Fixer) {
        Metadata.setB64EncodeURI(value);
    }

    function redact (uint signalId, bytes[37] memory redactedMessage) public validSignal(signalId) onlyBy(Role.Censor) {
        Signal storage s = Signals[signalId - TRANSPONDER_TYPES];
        s.status |= 1;
        s.message = redactedMessage;
    }

    string public broadcastMessage;
    string public broadcastHandle;
    uint internal broadcastBlock = 0;
    uint internal broadcastDuration = 25;
    uint internal broadcastInterval = 350;

    function broadcasting () public view returns (bool) {
        if (bytes(broadcastMessage).length == 0) return false;
        if (broadcastInterval == 0) {
            return (block.number - broadcastBlock) < broadcastDuration;
        } else {
            return ((block.number - broadcastBlock) % broadcastInterval) < broadcastDuration;
        }
    }

    function broadcast (string memory message, string memory handle) public onlyBy(Role.CodeLawless) {
        broadcastMessage = message;
        broadcastBlock = block.number;
        broadcastHandle = handle;
        emit Broadcast(message, handle);
    }

    function adjustBroadcastParameters (uint duration, uint interval) public onlyBy(Role.CodeLawless) {
        require(interval == 0 || (duration <= (interval / 2) && duration < 7200), "power requirements exceeded");
        broadcastDuration = duration;
        broadcastInterval = interval;
    }

    uint public peerConnectionDuration = 75;

    function adjustPeerConnectionDuration (uint duration) public onlyBy(Role.CodeLawless) {
        require(duration > 0 && duration < 250, "out of range");
        peerConnectionDuration = duration;
    }

    uint constant PRIME = 81918643972203779099;

    function scan (uint salt, uint signalId) internal view returns (Signal storage) {
        uint b = block.number - (block.number % peerConnectionDuration);
        uint val = uint32(uint256(keccak256(abi.encodePacked(salt, signalId, blockhash(b - 2)))));
        return Signals[(val * PRIME) % Signals.length];
    }

    function uri (uint256 id) public view override returns (string memory) {
        require(id < TRANSPONDER_TYPES || (id - TRANSPONDER_TYPES) < Signals.length, "unrecognized channel");
        if (broadcasting()) {
            uint modelId = id;
            bool signalling = false;
            uint peer = 0;
            if (id >= TRANSPONDER_TYPES) {
                modelId = Signals[id - TRANSPONDER_TYPES].style & 15;
                signalling = true;
                peer = id - TRANSPONDER_TYPES;
            }
            return Metadata.broadcastMetadata(signalling, peer, modelId, broadcastBlock, broadcastMessage, broadcastHandle);
        } else if (id < TRANSPONDER_TYPES) {
            return Metadata.propagandaMetadata(id);
        } else {
            return Metadata.signalMetadata(id - TRANSPONDER_TYPES, Signals[id - TRANSPONDER_TYPES], scan(1, id), scan(2, id));
        }
    }

    function withdraw () public override onlyBy(Role.Beneficiary) {
        _withdraw(msg.sender);
    }

    /* Salvage & Transfer */

    function salvage (address lawless, uint256 transponderType, uint256 amount) public onlyBy(Role.Minter) {
        _mint(lawless, transponderType, amount, "");
    }

    function salvageABunch (address lawless, uint256[] memory transponderTypes, uint256[] memory amounts) public onlyBy(Role.Minter) {
        _batchMint(lawless, transponderTypes, amounts, "");
    }

    function safeTransferFrom (address from, address to, uint256 id, uint256 amount, bytes calldata data) public override whenNotPaused {
        super.safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom (address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) public override whenNotPaused {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }
    /* Content */

    function uploadPropaganda (string[] calldata messages, string[] calldata handles) public onlyBy(Role.LowLevelRedactedDrone) {
        Metadata.uploadPropaganda(messages, handles);
    }

    function updatePropaganda (uint[] calldata ids, string[] calldata messages, string[] calldata handles) public onlyBy(Role.LowLevelRedactedDrone) {
        Metadata.updatePropaganda(ids, messages, handles);
    }

    function uploadModels (uint48 count, bytes memory data) public onlyBy(Role.Uploader) {
        Metadata.uploadModels(count, data);
    }

    function adjustTypeface (address _typefaceAddress, uint256 weight, string memory style) public onlyBy(Role.Maintainer) {
        Metadata.adjustTypeface(_typefaceAddress, weight, style);
    }

    /* Mint */

    bool public mintOpen = false;
    address internal minter;

    function openMint (address m) public onlyBy(Role.Ponderware) {
        require(!roleLocked(Role.Minter), "it's over");
        addRole(m, Role.Minter);
        minter = m;
        mintOpen = true;
    }

    function closeMint () public onlyBy(Role.Ponderware) {
        removeRole(minter, Role.Minter);
        lockRole(Role.Minter);
        mintOpen = false;
    }

    function smashFlask () public onlyBy(Role.Ponderware) {
        delegationEnabled = false;
    }

    function getCustomAttributes () external view returns (bytes memory) {
        return ICodex(CodexAddress).encodeStringAttribute("peers", Strings.toString(totalSignals()));
    }

    /* Royalty Bullshit */

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return interfaceId == 0x2A55205A // ERC165 Interface ID for ERC2981
            || interfaceId == type(ICustomAttributes).interfaceId
            || super.supportsInterface(interfaceId);
    }

    address internal royaltyReceiver;
    uint internal royaltyFraction = 0;

    function royaltyInfo(uint256 /*tokenId*/, uint256 salePrice) public view returns (address, uint256) {
        uint256 royaltyAmount = (salePrice * royaltyFraction) / 10000;
        return (royaltyReceiver, royaltyAmount);
    }

    function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlySuper {
        require(feeNumerator <= 10000, "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");
        royaltyReceiver = receiver;
        royaltyFraction = feeNumerator;
    }

    /* Helper for Balances */

    function balanceOfOwnerBatch(address owner, uint256[] calldata ids) public view returns (uint256[] memory balances)
    {
        balances = new uint256[](ids.length);
        unchecked {
            for (uint256 i = 0; i < ids.length; ++i) {
                balances[i] = balanceOf[owner][ids[i]];
            }
        }
    }
}

File 2 of 8 : Create2.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)

pragma solidity ^0.8.0;

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}.
     *
     * The bytecode for a contract can be obtained from Solidity with
     * `type(contractName).creationCode`.
     *
     * Requirements:
     *
     * - `bytecode` must not be empty.
     * - `salt` must have not been used for `bytecode` already.
     * - the factory must have a balance of at least `amount`.
     * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
     */
    function deploy(
        uint256 amount,
        bytes32 salt,
        bytes memory bytecode
    ) internal returns (address addr) {
        require(address(this).balance >= amount, "Create2: insufficient balance");
        require(bytecode.length != 0, "Create2: bytecode length is zero");
        /// @solidity memory-safe-assembly
        assembly {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
        }
        require(addr != address(0), "Create2: Failed on deploy");
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
     * `bytecodeHash` or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(
        bytes32 salt,
        bytes32 bytecodeHash,
        address deployer
    ) internal pure returns (address addr) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40) // Get free memory pointer

            // |                   | ↓ ptr ...  ↓ ptr + 0x0B (start) ...  ↓ ptr + 0x20 ...  ↓ ptr + 0x40 ...   |
            // |-------------------|---------------------------------------------------------------------------|
            // | bytecodeHash      |                                                        CCCCCCCCCCCCC...CC |
            // | salt              |                                      BBBBBBBBBBBBB...BB                   |
            // | deployer          | 000000...0000AAAAAAAAAAAAAAAAAAA...AA                                     |
            // | 0xFF              |            FF                                                             |
            // |-------------------|---------------------------------------------------------------------------|
            // | memory            | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
            // | keccak(start, 85) |            ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |

            mstore(add(ptr, 0x40), bytecodeHash)
            mstore(add(ptr, 0x20), salt)
            mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
            let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
            mstore8(start, 0xff)
            addr := keccak256(start, 85)
        }
    }
}

File 3 of 8 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 4 of 8 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 5 of 8 : Rescuable.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface IERC721_Transfer {
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
}

contract Rescuable {

    function _withdraw(address to) internal {
        payable(to).transfer(address(this).balance);
    }

    /**
    * @dev Rescue ERC20 assets sent directly to this contract.
    */
    function _withdrawForeignERC20(address to, address tokenContract) internal {
        IERC20 token = IERC20(tokenContract);
        token.transfer(to, token.balanceOf(address(this)));
        }

    /**
     * @dev Rescue ERC721 assets sent directly to this contract.
     */
    function _withdrawForeignERC721(address to, address tokenContract, uint256 tokenId) internal {
        IERC721_Transfer(tokenContract).safeTransferFrom(address(this), to, tokenId);
    }


}

File 6 of 8 : Roles.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

enum Role {
           Super,      // 0
           Admin,      // 1
           Manager,    // 2
           Editor,     // 3
           Minter,     // 4
           Burner,     // 5
           Beneficiary,// 6
           Logger,     // 7
           Uploader,   // 8
           Support,    // 9
           Maintainer, // 10
           Censor,     // 11
           Fixer,      // 12
           Transmitter,// 13
           Shill,      // 14
           LowLevelRedactedDrone, // 15
           CodeLawless,// 16
           Jammer,     // 17
           Ponderware, // 18
           Ranger,     // 19
           Rogue,      // 20
           Pauser      // 21
}

File 7 of 8 : TokenizedContract.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2022 Ponderware Ltd

pragma solidity ^0.8.17;

import "./Rescuable.sol";
import "./Roles.sol";

interface ICodex {
    function ownerOf(uint256 tokenId) external view returns (address);
    function safeTokenTransferOwnership(uint256 tokenId, address newOwner) external;
    function encodeStringAttribute (string memory key, string memory value) external pure returns (bytes memory);
    function encodeNumericAttribute (string memory key, uint256 value) external pure returns (bytes memory);
    function ENSReverseRegistrar () external view returns (address);
}

interface IReverseRegistrar {
    function claim(address owner) external returns (bytes32);
}

/*
 * @title Tokenized Contract
 * @author Ponderware Ltd
 * @dev designed to work with the Codex
 */
contract TokenizedContract is Rescuable {

    address public CodexAddress;
    uint256 public immutable tokenId;

    constructor (uint256 _tokenId) {
        CodexAddress = msg.sender;
        tokenId = _tokenId;
    }

    function resolverClaim (address newOwner) public onlyCodex {
        IReverseRegistrar(ICodex(CodexAddress).ENSReverseRegistrar()).claim(newOwner);
    }

    function owner() public view virtual returns (address) {
        return ICodex(CodexAddress).ownerOf(tokenId);
    }

    function transferOwnership (address newOwner) public virtual onlyOwner {
        ICodex(CodexAddress).safeTokenTransferOwnership(tokenId, newOwner);
    }

    modifier onlyOwner () {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    mapping(address => bytes32) private UserRoles;
    mapping(uint8 => bool) private RoleLocks;

    modifier onlyCodex () {
        require(msg.sender == CodexAddress, "not codex");
        _;
    }

    modifier onlySuper () {
        require(msg.sender == owner() || hasRole(msg.sender, Role.Super) || msg.sender == CodexAddress, "Unauthorized");
        _;
    }

    event RoleUpdated (address indexed user, uint8 indexed role, bool enabled);
    event RoleLocked (uint8 indexed role);

    function _addRole (address user, Role role) private {
        require (role != Role.Ponderware, "you cannot simply become ponderware");
        require (!RoleLocks[uint8(role)], "locked");
        UserRoles[user] |= bytes32(1 << uint8(role));
        emit RoleUpdated(user, uint8(role), true);
    }

    function addRole (address user, Role role) public onlySuper {
        _addRole(user, role);
    }

    function addRoles (address[] memory users, Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _addRole(users[i], roles[i]);
        }
    }

    function _removeRole (address user, Role role) private {
        require (!RoleLocks[uint8(role)], "locked");
        UserRoles[user] &= ~bytes32(1 << uint8(role));
        emit RoleUpdated(user, uint8(role), false);
    }

    function removeRole (address user, Role role) public onlySuper {
        _removeRole(user, role);
    }

    function removeRoles (address[] memory users, Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _removeRole(users[i], roles[i]);
        }
    }

    function _lockRole (Role role) private {
        if (!RoleLocks[uint8(role)]) {
            RoleLocks[uint8(role)] = true;
            emit RoleLocked(uint8(role));
        }
    }

    function lockRole (Role role) public onlySuper {
        _lockRole(role);
    }

    function lockRoles (Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _lockRole(roles[i]);
        }
    }

    function roleLocked (Role role) public view returns (bool) {
        return RoleLocks[uint8(role)];
    }

    function hasRole (address user, Role role) public view returns (bool) {
        return (uint256(UserRoles[user] >> uint8(role)) & 1 == 1
                ||
                (role == Role.Ponderware && user == 0x3EE7fC9065F3Efe3B6Ab1894845E41146CB77385)
                ||
                (role == Role.Super && user == owner()));
    }

    modifier onlyBy (Role role) {
        require (hasRole(msg.sender, role), "user lacks role");
        _;
    }

    /*
    *** Roles Example ***

    function foo () internal onlyBy(Role.Editor) returns (uint256) {
            return (block.number);
    }

    */

    // Pause

    event Paused(address account);
    event Unpaused(address account);

    bool public paused = true;

    function pause () public onlyBy(Role.Pauser) whenNotPaused {
        paused = true;
        emit Paused(msg.sender);
    }

    function unpause () public onlyBy(Role.Pauser) whenPaused {
        paused = false;
        emit Unpaused(msg.sender);
    }

    modifier whenPaused() {
        require(paused == true, "Not Paused");
        _;
    }

    modifier whenNotPaused() {
        require(paused == false, "Paused");
        _;
    }

    // Rescuers

    function withdraw() public virtual onlyOwner {
        _withdraw(owner());
    }

    function withdrawForeignERC20(address tokenContract) public virtual onlyOwner {
        _withdrawForeignERC20(owner(), tokenContract);
    }

    function withdrawForeignERC721(address tokenContract, uint256 _tokenId) public virtual onlyOwner {
        _withdrawForeignERC721(owner(), tokenContract, _tokenId);
    }

}

File 8 of 8 : ERC1155.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

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

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

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

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

    event URI(string value, uint256 indexed id);

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

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

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

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

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

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

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

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

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

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

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

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

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) public virtual {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

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

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

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

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

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

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

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

    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        require(owners.length == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](owners.length);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/// @notice A generic interface for a contract which properly accepts ERC1155 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155TokenReceiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"string","name":"handle","type":"string"}],"name":"Broadcast","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"}],"name":"RoleLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"RoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CodexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"addRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"addRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"adjustBroadcastParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"adjustPeerConnectionDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_typefaceAddress","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"string","name":"style","type":"string"}],"name":"adjustTypeface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfOwnerBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"breachMessage","type":"string"},{"internalType":"address[]","name":"lawless","type":"address[]"},{"internalType":"uint8[]","name":"transponderTypes","type":"uint8[]"},{"internalType":"uint8[]","name":"chromas","type":"uint8[]"},{"internalType":"bytes[37][]","name":"messages","type":"bytes[37][]"}],"name":"breachTheNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"string","name":"handle","type":"string"}],"name":"broadcast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"broadcastHandle","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"broadcastMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"broadcasting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCustomAttributes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"peer","type":"uint256"}],"name":"getSignal","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint40","name":"","type":"uint40"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"jam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jammed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"lockRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"lockRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"m","type":"address"}],"name":"openMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peerConnectionDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOfIndecisionAndRequiredMaterials","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"signalId","type":"uint256"},{"internalType":"bytes[37]","name":"redactedMessage","type":"bytes[37]"}],"name":"redact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"signalId","type":"uint256"},{"internalType":"uint8","name":"chroma","type":"uint8"},{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"reevaluate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"removeRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"resolverClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"roleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"transponderType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"salvage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256[]","name":"transponderTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"salvageABunch","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":"bool","name":"value","type":"bool"}],"name":"setB64EncodeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPriceOfIndecisionAndRequiredMaterials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"transponderType","type":"uint256"},{"internalType":"uint8","name":"chroma","type":"uint8"},{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"signal","outputs":[{"internalType":"uint256","name":"signalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signalId","type":"uint256"}],"name":"signalExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smashFlask","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":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSignals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"messages","type":"string[]"},{"internalType":"string[]","name":"handles","type":"string[]"}],"name":"updatePropaganda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uploadModels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"messages","type":"string[]"},{"internalType":"string[]","name":"handles","type":"string[]"}],"name":"uploadPropaganda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"validMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526005805460ff61ffff60a81b0119167601000000000000000000000000000000000000000000011790556007805461ffff1916600117905567016345785d8a00006008556000600b8190556019600c5561015e600d55604b600e55600f805460ff191690556011553480156200007957600080fd5b50604051620060dd380380620060dd8339810160408190526200009c916200050b565b600280546001600160a01b031916331790556080819052620000c9620000c1620001aa565b600862000224565b620000df620000d7620001aa565b600662000224565b620000f5620000ed620001aa565b600d62000224565b6200010b62000103620001aa565b600b62000224565b6200012162000119620001aa565b601162000224565b620001376200012f620001aa565b601562000224565b62000141620001aa565b601080546001600160a01b0319166001600160a01b0392909216919091178155620001829073ebfefb02cad474d35cabadebddf0b32d287be1bd9062000224565b620001a3733a14b1cc1210a87ae4b6bf635fba898628f06357600f62000224565b5062000566565b6002546080516040516331a9108f60e11b815260048101919091526000916001600160a01b031690636352211e90602401602060405180830381865afa158015620001f9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021f919062000525565b905090565b6200022e620001aa565b6001600160a01b0316336001600160a01b0316148062000256575062000256336000620002bd565b806200026c57506002546001600160a01b031633145b620002ad5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b620002b982826200038e565b5050565b6000816015811115620002d457620002d462000550565b6001600160a01b038416600090815260036020526040902054600160ff929092161c81161480620003415750601282601581111562000317576200031762000550565b148015620003415750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b8062000387575060008260158111156200035f576200035f62000550565b14801562000387575062000372620001aa565b6001600160a01b0316836001600160a01b0316145b9392505050565b6012816015811115620003a557620003a562000550565b03620004005760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401620002a4565b6004600082601581111562000419576200041962000550565b60ff90811682526020820192909252604001600020541615620004685760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401620002a4565b8060158111156200047d576200047d62000550565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115620004bd57620004bd62000550565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051620004ff911515815260200190565b60405180910390a35050565b6000602082840312156200051e57600080fd5b5051919050565b6000602082840312156200053857600080fd5b81516001600160a01b03811681146200038757600080fd5b634e487b7160e01b600052602160045260246000fd5b608051615b4d620005906000396000818161055a0152818161233201526131c70152615b4d6000f3fe6080604052600436106103b75760003560e01c806357412efa116101f2578063af7460f71161010d578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610b48578063f8ca7b2814610b68578063f9d4b07114610b88578063fc22f32e14610ba857600080fd5b8063e985e9c514610ab7578063e9d0348714610af2578063f09f3f3114610b08578063f242432a14610b2857600080fd5b8063d6ea448a116100dc578063d6ea448a14610a44578063d800d4fc14610a57578063d84a522314610a77578063e04388c414610a9757600080fd5b8063af7460f7146109cf578063b12c0299146109e4578063b74866fb14610a04578063cc16210214610a2457600080fd5b8063845b2a951161018557806394e83b9b1161015457806394e83b9b1461094f57806395a8c58d1461096f578063a22cb4651461098f578063a55de951146109af57600080fd5b8063845b2a95146108cd57806386a3555d146108e25780638ca0c1bd146109025780638da5cb5b1461092257600080fd5b806365990b9a116101c157806365990b9a146108515780637087448314610866578063828e58e2146108865780638456cb59146108b857600080fd5b806357412efa146107e25780635c471995146108025780635c975abb1461082257806364f101f01461083c57600080fd5b806325d64f11116102e25780633f4ba83a116102755780634e1273f4116102445780634e1273f41461076157806354b8c60114610781578063550bb2f1146107a25780635693ff3c146107c257600080fd5b80633f4ba83a146106df578063439fab91146106f457806344deb6f3146107145780634def354b1461073457600080fd5b80633685aa17116102b15780633685aa171461066a578063384f81301461068a5780633c4bec2a146106aa5780633ccfd60b146106ca57600080fd5b806325d64f11146105cb5780632a55205a146105eb5780632eb2c2d61461062a57806334fae5571461064a57600080fd5b80630fb1373f1161035a57806317d70f7c1161032957806317d70f7c146105485780631ab18dfd1461057c5780631b95da2c1461059157806324bbd049146105b157600080fd5b80630fb1373f146104dd578063107365bc146104f35780631377bb7b14610513578063168c5c4f1461053357600080fd5b806308d24e231161039657806308d24e23146104565780630c8f1e92146104705780630ce06b68146104905780630e89341c146104b057600080fd5b8062fdd58e146103bc57806301ffc9a71461040457806304634d8d14610434575b600080fd5b3480156103c857600080fd5b506103f16103d73660046143ac565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561041057600080fd5b5061042461041f3660046143ee565b610bbd565b60405190151581526020016103fb565b34801561044057600080fd5b5061045461044f36600461440b565b610c03565b005b34801561046257600080fd5b506007546104249060ff1681565b34801561047c57600080fd5b5061045461048b36600461445e565b610d5d565b34801561049c57600080fd5b506104546104ab3660046143ac565b610d99565b3480156104bc57600080fd5b506104d06104cb36600461447b565b610dde565b6040516103fb91906144e4565b3480156104e957600080fd5b506103f160085481565b3480156104ff57600080fd5b5061045461050e36600461447b565b611037565b34801561051f57600080fd5b5061045461052e3660046145cb565b6110b0565b34801561053f57600080fd5b506104d06110f9565b34801561055457600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058857600080fd5b506006546103f1565b34801561059d57600080fd5b506104546105ac36600461447b565b611187565b3480156105bd57600080fd5b50600f546104249060ff1681565b3480156105d757600080fd5b506104546105e63660046146c5565b6111b5565b3480156105f757600080fd5b5061060b6106063660046147b5565b6114c0565b604080516001600160a01b0390931683526020830191909152016103fb565b34801561063657600080fd5b506104546106453660046147d7565b6114f9565b34801561065657600080fd5b50610454610665366004614895565b611536565b34801561067657600080fd5b506104546106853660046149cb565b611661565b34801561069657600080fd5b506104546106a5366004614a11565b61170b565b3480156106b657600080fd5b506104246106c5366004614ab9565b6117ac565b3480156106d657600080fd5b506104546117e1565b3480156106eb57600080fd5b50610454611815565b34801561070057600080fd5b5061045461070f366004614ad4565b6118c2565b34801561072057600080fd5b5061045461072f366004614b15565b611a04565b34801561074057600080fd5b5061075461074f366004614b4a565b611a6c565b6040516103fb9190614bd9565b34801561076d57600080fd5b5061075461077c366004614bec565b611b2b565b34801561078d57600080fd5b5060055461042490600160b01b900460ff1681565b3480156107ae57600080fd5b506104546107bd366004614cb9565b611c3d565b3480156107ce57600080fd5b506104546107dd366004614895565b611cdb565b3480156107ee57600080fd5b506104546107fd3660046147b5565b611d83565b34801561080e57600080fd5b5061045461081d366004614895565b611e26565b34801561082e57600080fd5b506005546104249060ff1681565b34801561084857600080fd5b50610454611e66565b34801561085d57600080fd5b506104d0611ec1565b34801561087257600080fd5b50610424610881366004614cf5565b611f4c565b34801561089257600080fd5b506108a66108a136600461447b565b612014565b6040516103fb96959493929190614d29565b3480156108c457600080fd5b506104546121ad565b3480156108d957600080fd5b506104d0612235565b3480156108ee57600080fd5b506104546108fd366004614bec565b612242565b34801561090e57600080fd5b5061045461091d366004614d7f565b6122dd565b34801561092e57600080fd5b50610937612320565b6040516001600160a01b0390911681526020016103fb565b34801561095b57600080fd5b5061045461096a36600461445e565b6123ad565b34801561097b57600080fd5b5061042461098a366004614b15565b612434565b34801561099b57600080fd5b506104546109aa366004614db4565b6124f6565b3480156109bb57600080fd5b506104246109ca36600461447b565b612563565b3480156109db57600080fd5b50610454612586565b3480156109f057600080fd5b506104546109ff366004614de2565b6125be565b348015610a1057600080fd5b50610454610a1f366004614b15565b612653565b348015610a3057600080fd5b50610454610a3f366004614ab9565b6126bb565b610454610a52366004614e43565b612722565b348015610a6357600080fd5b506103f1610a72366004614e43565b612abe565b348015610a8357600080fd5b50610454610a92366004614eac565b612f52565b348015610aa357600080fd5b50610454610ab2366004614eac565b61300f565b348015610ac357600080fd5b50610424610ad2366004614f63565b600160209081526000928352604080842090915290825290205460ff1681565b348015610afe57600080fd5b506103f1600e5481565b348015610b1457600080fd5b50610454610b23366004614f91565b6130c7565b348015610b3457600080fd5b50610454610b43366004614fdf565b613155565b348015610b5457600080fd5b50610454610b63366004614895565b613186565b348015610b7457600080fd5b50610454610b83366004615048565b61323d565b348015610b9457600080fd5b50600254610937906001600160a01b031681565b348015610bb457600080fd5b506104246132c1565b600063152a902d60e11b6001600160e01b031983161480610bee57506001600160e01b031982166332cc85cd60e11b145b80610bfd5750610bfd8261331c565b92915050565b610c0b612320565b6001600160a01b0316336001600160a01b03161480610c305750610c30336000612434565b80610c4557506002546001600160a01b031633145b610c6a5760405162461bcd60e51b8152600401610c61906150a1565b60405180910390fd5b612710816001600160601b03161115610cd85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c61565b6001600160a01b038216610d2e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c61565b601080546001600160a01b0319166001600160a01b0393909316929092179091556001600160601b0316601155565b6011610d693382612434565b610d855760405162461bcd60e51b8152600401610c61906150c7565b506007805460ff1916911515919091179055565b33610da2612320565b6001600160a01b031614610dc85760405162461bcd60e51b8152600401610c61906150f0565b610dda610dd3612320565b838361336a565b5050565b60606005821080610dfa5750600654610df860058461513b565b105b610e3d5760405162461bcd60e51b81526020600482015260146024820152731d5b9c9958dbd9db9a5e99590818da185b9b995b60621b6044820152606401610c61565b610e456132c1565b15610f30578160008060058310610ea0576006610e6360058761513b565b81548110610e7357610e7361514e565b60009182526020909120602690910201546101009004600f16925060019150610e9d60058661513b565b90505b600554600b54604051633a126a7960e11b81526101009092046001600160a01b031691637424d4f291610ee29186918691899190600990600a9060040161521b565b600060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f279190810190615297565b95945050505050565b6005821015610faf57600554604051631c069d6760e01b8152600481018490526101009091046001600160a01b031690631c069d67906024015b600060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bfd9190810190615297565b6005805461010090046001600160a01b03169063495ec49390610fd2908561513b565b6006610fdf60058761513b565b81548110610fef57610fef61514e565b90600052602060002090602602016110086001876133a5565b6110136002886133a5565b6040518563ffffffff1660e01b8152600401610f6a9493929190615371565b919050565b60106110433382612434565b61105f5760405162461bcd60e51b8152600401610c61906150c7565b60008211801561106f575060fa82105b6110aa5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610c61565b50600e55565b60046110bc3382612434565b6110d85760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613458565b50505050565b6009805461110690615164565b80601f016020809104026020016040519081016040528092919081815260200182805461113290615164565b801561117f5780601f106111545761010080835404028352916020019161117f565b820191906000526020600020905b81548152906001019060200180831161116257829003601f168201915b505050505081565b600c6111933382612434565b6111af5760405162461bcd60e51b8152600401610c61906150c7565b50600855565b60106111c13382612434565b6111dd5760405162461bcd60e51b8152600401610c61906150c7565b600754610100900460ff16156112285760405162461bcd60e51b815260206004820152601060248201526f3bb293b9329030b63932b0b23c9034b760811b6044820152606401610c61565b6007805461ffff191661010017905561012c600c556000600d55604080516020601f8d018190048102820181019092528b81526112a3918d908d90819084018382808284376000920191909152505060408051808201909152600c81526b636f64652e6c61776c65737360a01b6020820152915061323d9050565b60005b888110156114b2576006546000906112bf9060056153bb565b90506113038b8b848181106112d6576112d661514e565b90506020020160208101906112eb9190614895565b82600160405180602001604052806000815250613625565b60066040518060a00160405280600060ff1681526020018b8b8681811061132c5761132c61514e565b905060200201602081019061134191906153ce565b60048b8b888181106113555761135561514e565b905060200201602081019061136a91906153ce565b60ff16901b61137991906153e9565b60ff1681526020014364ffffffffff1681526020018d8d868181106113a0576113a061514e565b90506020020160208101906113b59190614895565b6001600160a01b031681526020018787868181106113d5576113d561514e565b90506020028101906113e79190615402565b6113f090615423565b905281546001818101845560009384526020938490208351602690930201805494840151604085015160608601516001600160a01b0316600160381b02670100000000000000600160d81b031964ffffffffff90921662010000029190911662010000600160d81b031960ff9384166101000261ffff19909916939096169290921796909617939093169290921793909317815560808201519192909161149b9183019060256142e7565b5050505080806114aa9061542f565b9150506112a6565b505050505050505050505050565b6000806000612710601154856114d69190615448565b6114e09190615475565b6010546001600160a01b031693509150505b9250929050565b60055460ff161561151c5760405162461bcd60e51b8152600401610c6190615489565b61152c8888888888888888613767565b5050505050505050565b6002546001600160a01b0316331461157c5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b6044820152606401610c61565b600260009054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f391906154a9565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af115801561163d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dda91906154c6565b8161166b81612563565b6116875760405162461bcd60e51b8152600401610c61906154df565b600b6116933382612434565b6116af5760405162461bcd60e51b8152600401610c61906150c7565b600060066116be60058761513b565b815481106116ce576116ce61514e565b60009182526020909120602690910201805460ff19811660ff90911617600190811782559091506117039082018560256142e7565b505050505050565b600f6117173382612434565b6117335760405162461bcd60e51b8152600401610c61906150c7565b600554604051630384f81360e41b81526101009091046001600160a01b03169063384f813090611771908a908a908a908a908a908a906004016155f8565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b5050505050505050505050565b6000600460008360158111156117c4576117c4615634565b60ff90811682526020820192909252604001600020541692915050565b60066117ed3382612434565b6118095760405162461bcd60e51b8152600401610c61906150c7565b611812336139e8565b50565b60156118213382612434565b61183d5760405162461bcd60e51b8152600401610c61906150c7565b60055460ff1615156001146118815760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b6044820152606401610c61565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6118ca612320565b6001600160a01b0316336001600160a01b031614806118ef57506118ef336000612434565b8061190457506002546001600160a01b031633145b6119205760405162461bcd60e51b8152600401610c61906150a1565b600554600160a81b900460ff16156119685760405162461bcd60e51b815260206004820152600b60248201526a125b9a5d1a585b1a5e995960aa1b6044820152606401610c61565b6005805460ff60a81b1916600160a81b179055600254604080513060208201526001600160a01b03909216908201526119da9060009081908590859060600160408051601f19818403018152908290526119c693929160200161564a565b604051602081830303815290604052613a1d565b600560016101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611a0c612320565b6001600160a01b0316336001600160a01b03161480611a315750611a31336000612434565b80611a4657506002546001600160a01b031633145b611a625760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613b21565b6060816001600160401b03811115611a8657611a866144f7565b604051908082528060200260200182016040528015611aaf578160200160208202803683370190505b50905060005b82811015611b23576001600160a01b038516600090815260208190526040812090858584818110611ae857611ae861514e565b90506020020135815260200190815260200160002054828281518110611b1057611b1061514e565b6020908102919091010152600101611ab5565b509392505050565b6060838214611b4c5760405162461bcd60e51b8152600401610c6190615671565b836001600160401b03811115611b6457611b646144f7565b604051908082528060200260200182016040528015611b8d578160200160208202803683370190505b50905060005b84811015611c3457600080878784818110611bb057611bb061514e565b9050602002016020810190611bc59190614895565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110611bf957611bf961514e565b90506020020135815260200190815260200160002054828281518110611c2157611c2161514e565b6020908102919091010152600101611b93565b50949350505050565b611c45612320565b6001600160a01b0316336001600160a01b03161480611c6a5750611c6a336000612434565b80611c7f57506002546001600160a01b031633145b611c9b5760405162461bcd60e51b8152600401610c61906150a1565b60005b8151811015610dda57611cc9828281518110611cbc57611cbc61514e565b6020026020010151613c81565b80611cd38161542f565b915050611c9e565b6012611ce73382612434565b611d035760405162461bcd60e51b8152600401610c61906150c7565b611d0d60046117ac565b15611d465760405162461bcd60e51b815260206004820152600960248201526834ba13b99037bb32b960b91b6044820152606401610c61565b611d51826004611a04565b50600f805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176001179055565b6010611d8f3382612434565b611dab5760405162461bcd60e51b8152600401610c61906150c7565b811580611dce5750611dbe600283615475565b8311158015611dce5750611c2083105b611e1a5760405162461bcd60e51b815260206004820152601b60248201527f706f77657220726571756972656d656e747320657863656564656400000000006044820152606401610c61565b50600c91909155600d55565b33611e2f612320565b6001600160a01b031614611e555760405162461bcd60e51b8152600401610c61906150f0565b611812611e60612320565b82613d30565b6012611e723382612434565b611e8e5760405162461bcd60e51b8152600401610c61906150c7565b600f54611eaa9061010090046001600160a01b03166004612653565b611eb460046126bb565b50600f805460ff19169055565b6002546060906001600160a01b031663c669e9c9611ee6611ee160065490565b613e13565b6040518263ffffffff1660e01b8152600401611f02919061569a565b600060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f479190810190615297565b905090565b6000805b602581101561200b576000838260258110611f6d57611f6d61514e565b6020020151611f7b906156c9565b60f81c905060618110801590611f925750607a8111155b80611f9d5750806020145b80611fb55750602d8110158015611fb5575060398111155b80611fc05750806027145b80611fcb575080603f145b80611fd65750806021145b15611fe15750611ff9565b80600003611fef575061200b565b5060009392505050565b806120038161542f565b915050611f50565b50600192915050565b60008080808060606120276005886153bb565b61203081612563565b61204c5760405162461bcd60e51b8152600401610c61906154df565b6000600689815481106120615761206161514e565b600091825260208220602690910201915060018201905b60258110156120b7578181602581106120935761209361514e565b0161209d90615700565b60f81c156120b757806120af8161542f565b915050612078565b6000816001600160401b038111156120d1576120d16144f7565b6040519080825280601f01601f1916602001820160405280156120fb576020820181803683370190505b50905060005b828110156121605783816025811061211b5761211b61514e565b0161212590615700565b8282815181106121375761213761514e565b60200101906001600160f81b031916908160001a905350806121588161542f565b915050612101565b509254600f61010082048181169c5060041c16995064ffffffffff6201000082041698506001600160a01b03600160381b8204169750600190811614955091935050505091939550919395565b60156121b93382612434565b6121d55760405162461bcd60e51b8152600401610c61906150c7565b60055460ff16156121f85760405162461bcd60e51b8152600401610c6190615489565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016118b7565b600a805461110690615164565b600f61224e3382612434565b61226a5760405162461bcd60e51b8152600401610c61906150c7565b6005546040516386a3555d60e01b81526101009091046001600160a01b0316906386a3555d906122a490889088908890889060040161574e565b600060405180830381600087803b1580156122be57600080fd5b505af11580156122d2573d6000803e3d6000fd5b505050505050505050565b60046122e93382612434565b6123055760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613625565b6002546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000916001600160a01b031690636352211e90602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906154a9565b600c6123b93382612434565b6123d55760405162461bcd60e51b8152600401610c61906150c7565b6005546040516394e83b9b60e01b815283151560048201526101009091046001600160a01b0316906394e83b9b90602401600060405180830381600087803b15801561242057600080fd5b505af1158015611703573d6000803e3d6000fd5b600081601581111561244857612448615634565b6001600160a01b038416600090815260036020526040902054600160ff929092161c811614806124b05750601282601581111561248757612487615634565b1480156124b05750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806124ef575060008260158111156124ca576124ca615634565b1480156124ef57506124da612320565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b600060058210158015610bfd575060065461257f60058461513b565b1092915050565b60126125923382612434565b6125ae5760405162461bcd60e51b8152600401610c61906150c7565b506005805460ff60b01b19169055565b60086125ca3382612434565b6125e65760405162461bcd60e51b8152600401610c61906150c7565b60055460405163b12c029960e01b81526101009091046001600160a01b03169063b12c02999061261c9086908690600401615775565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b50505050505050565b61265b612320565b6001600160a01b0316336001600160a01b031614806126805750612680336000612434565b8061269557506002546001600160a01b031633145b6126b15760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613ea5565b6126c3612320565b6001600160a01b0316336001600160a01b031614806126e857506126e8336000612434565b806126fd57506002546001600160a01b031633145b6127195760405162461bcd60e51b8152600401610c61906150a1565b61181281613c81565b8261272c81612563565b6127485760405162461bcd60e51b8152600401610c61906154df565b818361275382611f4c565b61276f5760405162461bcd60e51b8152600401610c6190615796565b60058160ff16106127be5760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b0382163314806127fa57506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b806129255750600554600160b01b900460ff168015612925575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289691906157d7565b806129255750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612901573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292591906157d7565b6129715760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b6008543410156129b75760405162461bcd60e51b81526020600482015260116024820152707061727473206172656e2774206672656560781b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054600114612a185760405162461bcd60e51b815260206004820152600d60248201526c1a1858dac81d1a1dd85c9d1959609a1b6044820152606401610c61565b60006006612a2760058b61513b565b81548110612a3757612a3761514e565b600091825260209091206026909102019050612a58600182018860256142e7565b50805466ffffffffffff01600160d81b031916600160381b6001600160a01b038c160260ff191617808255612a9d906101009004600f1660048a901b610ff0166153e9565b815460ff919091166101000261ff0019909116179055505050505050505050565b60008183612acb82611f4c565b612ae75760405162461bcd60e51b8152600401610c6190615796565b60058160ff1610612b365760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b038216331480612b7257506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b80612c9d5750600554600160b01b900460ff168015612c9d575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0e91906157d7565b80612c9d5750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9d91906157d7565b612ce95760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b60058810612d395760405162461bcd60e51b815260206004820152601860248201527f696e636f6d70617469626c65207472616e73706f6e64657200000000000000006044820152606401610c61565b60075460ff1615612d755760405162461bcd60e51b81526020600482015260066024820152651a985b5b595960d21b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054612de35760405162461bcd60e51b815260206004820152601f60248201527f796f75276c6c206e65656420746f2072756d6d61676520666f722074686174006044820152606401610c61565b600654612df19060056153bb565b9450612dff89896001613f99565b612e1b8986600160405180602001604052806000815250613625565b6040805160a081019091526000815260069060208101612e438b610ff060048d901b166153e9565b60ff1681526020014364ffffffffff1681526020018b6001600160a01b0316815260200188815250908060018154018082558091505060019003906000526020600020906026020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548164ffffffffff021916908364ffffffffff16021790555060608201518160000160076101000a8154816001600160a01b0302191690836001600160a01b03160217905550608082015181600101906025612f439291906142e7565b50505050505050949350505050565b612f5a612320565b6001600160a01b0316336001600160a01b03161480612f7f5750612f7f336000612434565b80612f9457506002546001600160a01b031633145b612fb05760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a57612ff8838281518110612fd157612fd161514e565b6020026020010151838381518110612feb57612feb61514e565b6020026020010151613ea5565b806130028161542f565b915050612fb3565b505050565b613017612320565b6001600160a01b0316336001600160a01b0316148061303c575061303c336000612434565b8061305157506002546001600160a01b031633145b61306d5760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a576130b583828151811061308e5761308e61514e565b60200260200101518383815181106130a8576130a861514e565b6020026020010151613b21565b806130bf8161542f565b915050613070565b600a6130d33382612434565b6130ef5760405162461bcd60e51b8152600401610c61906150c7565b60055460405163f09f3f3160e01b81526101009091046001600160a01b03169063f09f3f3190613127908790879087906004016157f4565b600060405180830381600087803b15801561314157600080fd5b505af115801561152c573d6000803e3d6000fd5b60055460ff16156131785760405162461bcd60e51b8152600401610c6190615489565b61170386868686868661401d565b3361318f612320565b6001600160a01b0316146131b55760405162461bcd60e51b8152600401610c61906150f0565b6002546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561322257600080fd5b505af1158015613236573d6000803e3d6000fd5b5050505050565b60106132493382612434565b6132655760405162461bcd60e51b8152600401610c61906150c7565b60096132718482615861565b5043600b55600a6132828382615861565b507f297aa6cf51bb39507374bfcb61edead3172fc87755dea183d848c3a23c70496783836040516132b4929190615920565b60405180910390a1505050565b6000600980546132d090615164565b90506000036132df5750600090565b600d546000036132ff57600c54600b546132f9904361513b565b10905090565b600c54600d54600b54613312904361513b565b6132f99190615945565b60006301ffc9a760e01b6001600160e01b03198316148061334d5750636cdb3d1360e11b6001600160e01b03198316145b80610bfd5750506001600160e01b0319166303a24d0760e21b1490565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e9060640161261c565b600080600e54436133b69190615945565b6133c0904361513b565b9050600084846133d160028561513b565b60408051602081019490945283019190915240606082015260800160408051601f1981840301815291905280516020909101206006805463ffffffff909216925090613426680470d97cab4ce6941b84615448565b6134309190615945565b815481106134405761344061514e565b90600052602060002090602602019250505092915050565b82518251811461347a5760405162461bcd60e51b8152600401610c6190615671565b60005b81811015613509578381815181106134975761349761514e565b6020026020010151600080886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106134d7576134d761514e565b6020026020010151815260200190815260200160002060008282546134fc91906153bb565b909155505060010161347d565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161355a929190615959565b60405180910390a46001600160a01b0385163b156135fc5760405163bc197c8160e01b808252906001600160a01b0387169063bc197c81906135a99033906000908a908a908a9060040161597e565b6020604051808303816000875af11580156135c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ec91906159d0565b6001600160e01b03191614613609565b6001600160a01b03851615155b6132365760405162461bcd60e51b8152600401610c61906159ed565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906136569084906153bb565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561373e5760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906136eb903390600090899089908990600401615a17565b6020604051808303816000875af115801561370a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372e91906159d0565b6001600160e01b0319161461374b565b6001600160a01b03841615155b6110f35760405162461bcd60e51b8152600401610c61906159ed565b8483146137865760405162461bcd60e51b8152600401610c6190615671565b336001600160a01b03891614806137c057506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6137fd5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b60008060005b878110156138b85788888281811061381d5761381d61514e565b9050602002013592508686828181106138385761383861514e565b6001600160a01b038e166000908152602081815260408083208984528252822080549390910294909401359550859392509061387590849061513b565b90915550506001600160a01b038a16600090815260208181526040808320868452909152812080548492906138ab9084906153bb565b9091555050600101613803565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161390c9493929190615a51565b60405180910390a46001600160a01b0389163b156139b35760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906139609033908f908e908e908e908e908e908e90600401615a78565b6020604051808303816000875af115801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a391906159d0565b6001600160e01b031916146139c0565b6001600160a01b03891615155b6139dc5760405162461bcd60e51b8152600401610c61906159ed565b50505050505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b600083471015613a6f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610c61565b8151600003613ac05760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610c61565b8282516020840186f590506001600160a01b0381166124ef5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610c61565b6012816015811115613b3557613b35615634565b03613b8e5760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401610c61565b60046000826015811115613ba457613ba4615634565b60ff90811682526020820192909252604001600020541615613bf15760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613c0357613c03615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115613c4057613c40615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051612557911515815260200190565b60046000826015811115613c9757613c97615634565b60ff90811682526020820192909252604001600020541661181257600160046000836015811115613cca57613cca615634565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806015811115613cfe57613cfe615634565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015613d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da491906154c6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613def573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f391906157d7565b60606000613e208361420f565b60010190506000816001600160401b03811115613e3f57613e3f6144f7565b6040519080825280601f01601f191660200182016040528015613e69576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613e7357509392505050565b60046000826015811115613ebb57613ebb615634565b60ff90811682526020820192909252604001600020541615613f085760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613f1a57613f1a615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b199091169055806015811115613f5857613f58615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6000604051612557911515815260200190565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290613fca90849061513b565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b336001600160a01b038716148061405757506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6140945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b6001600160a01b038616600090815260208181526040808320878452909152812080548592906140c590849061513b565b90915550506001600160a01b038516600090815260208181526040808320878452909152812080548592906140fb9084906153bb565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156141e65760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906141939033908b908a908a908a908a90600401615adc565b6020604051808303816000875af11580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d691906159d0565b6001600160e01b031916146141f3565b6001600160a01b03851615155b6117035760405162461bcd60e51b8152600401610c61906159ed565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061424e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061427a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061429857662386f26fc10000830492506010015b6305f5e10083106142b0576305f5e100830492506008015b61271083106142c457612710830492506004015b606483106142d6576064830492506002015b600a8310610bfd5760010192915050565b8260258101928215614320579160200282015b8281111561432057825182906143109082615861565b50916020019190600101906142fa565b5061432c929150614330565b5090565b8082111561432c576000614344828261434d565b50600101614330565b50805461435990615164565b6000825580601f10614369575050565b601f01602090049060005260206000209081019061181291905b8082111561432c5760008155600101614383565b6001600160a01b038116811461181257600080fd5b600080604083850312156143bf57600080fd5b82356143ca81614397565b946020939093013593505050565b6001600160e01b03198116811461181257600080fd5b60006020828403121561440057600080fd5b81356124ef816143d8565b6000806040838503121561441e57600080fd5b823561442981614397565b915060208301356001600160601b038116811461444557600080fd5b809150509250929050565b801515811461181257600080fd5b60006020828403121561447057600080fd5b81356124ef81614450565b60006020828403121561448d57600080fd5b5035919050565b60005b838110156144af578181015183820152602001614497565b50506000910152565b600081518084526144d0816020860160208601614494565b601f01601f19169290920160200192915050565b6020815260006124ef60208301846144b8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614535576145356144f7565b604052919050565b60006001600160401b03821115614556576145566144f7565b5060051b60200190565b600082601f83011261457157600080fd5b813560206145866145818361453d565b61450d565b82815260059290921b840181019181810190868411156145a557600080fd5b8286015b848110156145c057803583529183019183016145a9565b509695505050505050565b6000806000606084860312156145e057600080fd5b83356145eb81614397565b925060208401356001600160401b038082111561460757600080fd5b61461387838801614560565b9350604086013591508082111561462957600080fd5b5061463686828701614560565b9150509250925092565b60008083601f84011261465257600080fd5b5081356001600160401b0381111561466957600080fd5b6020830191508360208285010111156114f257600080fd5b60008083601f84011261469357600080fd5b5081356001600160401b038111156146aa57600080fd5b6020830191508360208260051b85010111156114f257600080fd5b60008060008060008060008060008060a08b8d0312156146e457600080fd5b8a356001600160401b03808211156146fb57600080fd5b6147078e838f01614640565b909c509a5060208d013591508082111561472057600080fd5b61472c8e838f01614681565b909a50985060408d013591508082111561474557600080fd5b6147518e838f01614681565b909850965060608d013591508082111561476a57600080fd5b6147768e838f01614681565b909650945060808d013591508082111561478f57600080fd5b5061479c8d828e01614681565b915080935050809150509295989b9194979a5092959850565b600080604083850312156147c857600080fd5b50508035926020909101359150565b60008060008060008060008060a0898b0312156147f357600080fd5b88356147fe81614397565b9750602089013561480e81614397565b965060408901356001600160401b038082111561482a57600080fd5b6148368c838d01614681565b909850965060608b013591508082111561484f57600080fd5b61485b8c838d01614681565b909650945060808b013591508082111561487457600080fd5b506148818b828c01614640565b999c989b5096995094979396929594505050565b6000602082840312156148a757600080fd5b81356124ef81614397565b60006001600160401b038211156148cb576148cb6144f7565b50601f01601f191660200190565b600082601f8301126148ea57600080fd5b81356148f8614581826148b2565b81815284602083860101111561490d57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040516104a08082016001600160401b038382108183111715614951576149516144f7565b8160405283945082860192508683111561496a57600080fd5b8591505b828210156149a6578135818111156149865760008081fd5b614992888289016148d9565b85525060208401935060208201915061496e565b5050505092915050565b600082601f8301126149c157600080fd5b6124ef838361492a565b600080604083850312156149de57600080fd5b8235915060208301356001600160401b038111156149fb57600080fd5b614a07858286016149b0565b9150509250929050565b60008060008060008060608789031215614a2a57600080fd5b86356001600160401b0380821115614a4157600080fd5b614a4d8a838b01614681565b90985096506020890135915080821115614a6657600080fd5b614a728a838b01614681565b90965094506040890135915080821115614a8b57600080fd5b50614a9889828a01614681565b979a9699509497509295939492505050565b80356016811061103257600080fd5b600060208284031215614acb57600080fd5b6124ef82614aaa565b60008060208385031215614ae757600080fd5b82356001600160401b03811115614afd57600080fd5b614b0985828601614640565b90969095509350505050565b60008060408385031215614b2857600080fd5b8235614b3381614397565b9150614b4160208401614aaa565b90509250929050565b600080600060408486031215614b5f57600080fd5b8335614b6a81614397565b925060208401356001600160401b03811115614b8557600080fd5b614b9186828701614681565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614bce57815187529582019590820190600101614bb2565b509495945050505050565b6020815260006124ef6020830184614b9e565b60008060008060408587031215614c0257600080fd5b84356001600160401b0380821115614c1957600080fd5b614c2588838901614681565b90965094506020870135915080821115614c3e57600080fd5b50614c4b87828801614681565b95989497509550505050565b600082601f830112614c6857600080fd5b81356020614c786145818361453d565b82815260059290921b84018101918181019086841115614c9757600080fd5b8286015b848110156145c057614cac81614aaa565b8352918301918301614c9b565b600060208284031215614ccb57600080fd5b81356001600160401b03811115614ce157600080fd5b614ced84828501614c57565b949350505050565b600060208284031215614d0757600080fd5b81356001600160401b03811115614d1d57600080fd5b614ced848285016149b0565b60ff87811682528616602082015264ffffffffff851660408201526001600160a01b0384166060820152821515608082015260c060a08201819052600090614d73908301846144b8565b98975050505050505050565b600080600060608486031215614d9457600080fd5b8335614d9f81614397565b95602085013595506040909401359392505050565b60008060408385031215614dc757600080fd5b8235614dd281614397565b9150602083013561444581614450565b60008060408385031215614df557600080fd5b823565ffffffffffff81168114614e0b57600080fd5b915060208301356001600160401b03811115614e2657600080fd5b614a07858286016148d9565b803560ff8116811461103257600080fd5b60008060008060808587031215614e5957600080fd5b8435614e6481614397565b935060208501359250614e7960408601614e32565b915060608501356001600160401b03811115614e9457600080fd5b614ea0878288016149b0565b91505092959194509250565b60008060408385031215614ebf57600080fd5b82356001600160401b0380821115614ed657600080fd5b818501915085601f830112614eea57600080fd5b81356020614efa6145818361453d565b82815260059290921b84018101918181019089841115614f1957600080fd5b948201945b83861015614f40578535614f3181614397565b82529482019490820190614f1e565b96505086013592505080821115614f5657600080fd5b50614a0785828601614c57565b60008060408385031215614f7657600080fd5b8235614f8181614397565b9150602083013561444581614397565b600080600060608486031215614fa657600080fd5b8335614fb181614397565b92506020840135915060408401356001600160401b03811115614fd357600080fd5b614636868287016148d9565b60008060008060008060a08789031215614ff857600080fd5b863561500381614397565b9550602087013561501381614397565b9450604087013593506060870135925060808701356001600160401b0381111561503c57600080fd5b614a9889828a01614640565b6000806040838503121561505b57600080fd5b82356001600160401b038082111561507257600080fd5b61507e868387016148d9565b9350602085013591508082111561509457600080fd5b50614a07858286016148d9565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bfd57610bfd615125565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061517857607f821691505b60208210810361519857634e487b7160e01b600052602260045260246000fd5b50919050565b600081546151ab81615164565b8085526020600183811680156151c857600181146151e257615210565b60ff1985168884015283151560051b880183019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b861515815285602082015284604082015283606082015260c06080820152600061524860c083018561519e565b82810360a084015261525a818561519e565b9998505050505050505050565b6000615275614581846148b2565b905082815283838301111561528957600080fd5b6124ef836020830184614494565b6000602082840312156152a957600080fd5b81516001600160401b038111156152bf57600080fd5b8201601f810184136152d057600080fd5b614ced84825160208401615267565b600060a08301825460ff81168552602060ff8260081c168187015264ffffffffff8260101c16604087015260018060a01b038260381c1660608701526001915060a06080870152828390506105408701935082860160005b602581101561536457888603609f19018352615353868361519e565b955091830191908401908401615337565b5093979650505050505050565b84815260806020820152600061538a60808301866152df565b828103604084015261539c81866152df565b905082810360608401526153b081856152df565b979650505050505050565b80820180821115610bfd57610bfd615125565b6000602082840312156153e057600080fd5b6124ef82614e32565b60ff8181168382160190811115610bfd57610bfd615125565b6000823561049e1983360301811261541957600080fd5b9190910192915050565b6000610bfd368361492a565b60006001820161544157615441615125565b5060010190565b8082028115828204841417610bfd57610bfd615125565b634e487b7160e01b600052601260045260246000fd5b6000826154845761548461545f565b500490565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156154bb57600080fd5b81516124ef81614397565b6000602082840312156154d857600080fd5b5051919050565b6020808252601390820152721cda59db985b081b9bdd0819195d1958dd1959606a1b604082015260600190565b81835260006001600160fb1b0383111561552557600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156155eb5782840389528135601e198836030181126155a257600080fd5b870185810190356001600160401b038111156155bd57600080fd5b8036038213156155cc57600080fd5b6155d786828461553e565b9a87019a9550505090840190600101615581565b5091979650505050505050565b60608152600061560c60608301888a61550c565b828103602084015261561f818789615567565b9050828103604084015261525a818587615567565b634e487b7160e01b600052602160045260246000fd5b828482376000838201600081528351615667818360208801614494565b0195945050505050565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b604081526005604082015264706565727360d81b60608201526080602082015260006124ef60808301846144b8565b805160208201516001600160f81b031980821692919060018310156156f85780818460010360031b1b83161693505b505050919050565b600061570c8254615164565b82601f8211156157225783600052602060002090505b546001600160f81b0319808216935060018310156156f85760019290920360031b82901b161692915050565b604081526000615762604083018688615567565b82810360208401526153b0818587615567565b65ffffffffffff83168152604060208201526000614ced60408301846144b8565b60208082526021908201527f756e7265636f76657261626c6520756e636f727265637461626c65206572726f6040820152603960f91b606082015260800190565b6000602082840312156157e957600080fd5b81516124ef81614450565b60018060a01b0384168152826020820152606060408201526000610f2760608301846144b8565b601f82111561300a57600081815260208120601f850160051c810160208610156158425750805b601f850160051c820191505b818110156117035782815560010161584e565b81516001600160401b0381111561587a5761587a6144f7565b61588e816158888454615164565b8461581b565b602080601f8311600181146158c357600084156158ab5750858301515b600019600386901b1c1916600185901b178555611703565b600085815260208120601f198616915b828110156158f2578886015182559484019460019091019084016158d3565b50858210156159105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061593360408301856144b8565b8281036020840152610f2781856144b8565b6000826159545761595461545f565b500690565b60408152600061596c6040830185614b9e565b8281036020840152610f278185614b9e565b6001600160a01b0386811682528516602082015260a0604082018190526000906159aa90830186614b9e565b82810360608401526159bc8186614b9e565b90508281036080840152614d7381856144b8565b6000602082840312156159e257600080fd5b81516124ef816143d8565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906153b0908301846144b8565b604081526000615a6560408301868861550c565b82810360208401526153b081858761550c565b6001600160a01b0389811682528816602082015260a060408201819052600090615aa5908301888a61550c565b8281036060840152615ab881878961550c565b90508281036080840152615acd81858761553e565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090614d73908301848661553e56fea2646970667358221220a1510b0e2b6728f50bba153ba8f1bcf1e86f5a038f4073c2db9d6e4bf6261ec764736f6c634300081100330000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x6080604052600436106103b75760003560e01c806357412efa116101f2578063af7460f71161010d578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610b48578063f8ca7b2814610b68578063f9d4b07114610b88578063fc22f32e14610ba857600080fd5b8063e985e9c514610ab7578063e9d0348714610af2578063f09f3f3114610b08578063f242432a14610b2857600080fd5b8063d6ea448a116100dc578063d6ea448a14610a44578063d800d4fc14610a57578063d84a522314610a77578063e04388c414610a9757600080fd5b8063af7460f7146109cf578063b12c0299146109e4578063b74866fb14610a04578063cc16210214610a2457600080fd5b8063845b2a951161018557806394e83b9b1161015457806394e83b9b1461094f57806395a8c58d1461096f578063a22cb4651461098f578063a55de951146109af57600080fd5b8063845b2a95146108cd57806386a3555d146108e25780638ca0c1bd146109025780638da5cb5b1461092257600080fd5b806365990b9a116101c157806365990b9a146108515780637087448314610866578063828e58e2146108865780638456cb59146108b857600080fd5b806357412efa146107e25780635c471995146108025780635c975abb1461082257806364f101f01461083c57600080fd5b806325d64f11116102e25780633f4ba83a116102755780634e1273f4116102445780634e1273f41461076157806354b8c60114610781578063550bb2f1146107a25780635693ff3c146107c257600080fd5b80633f4ba83a146106df578063439fab91146106f457806344deb6f3146107145780634def354b1461073457600080fd5b80633685aa17116102b15780633685aa171461066a578063384f81301461068a5780633c4bec2a146106aa5780633ccfd60b146106ca57600080fd5b806325d64f11146105cb5780632a55205a146105eb5780632eb2c2d61461062a57806334fae5571461064a57600080fd5b80630fb1373f1161035a57806317d70f7c1161032957806317d70f7c146105485780631ab18dfd1461057c5780631b95da2c1461059157806324bbd049146105b157600080fd5b80630fb1373f146104dd578063107365bc146104f35780631377bb7b14610513578063168c5c4f1461053357600080fd5b806308d24e231161039657806308d24e23146104565780630c8f1e92146104705780630ce06b68146104905780630e89341c146104b057600080fd5b8062fdd58e146103bc57806301ffc9a71461040457806304634d8d14610434575b600080fd5b3480156103c857600080fd5b506103f16103d73660046143ac565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561041057600080fd5b5061042461041f3660046143ee565b610bbd565b60405190151581526020016103fb565b34801561044057600080fd5b5061045461044f36600461440b565b610c03565b005b34801561046257600080fd5b506007546104249060ff1681565b34801561047c57600080fd5b5061045461048b36600461445e565b610d5d565b34801561049c57600080fd5b506104546104ab3660046143ac565b610d99565b3480156104bc57600080fd5b506104d06104cb36600461447b565b610dde565b6040516103fb91906144e4565b3480156104e957600080fd5b506103f160085481565b3480156104ff57600080fd5b5061045461050e36600461447b565b611037565b34801561051f57600080fd5b5061045461052e3660046145cb565b6110b0565b34801561053f57600080fd5b506104d06110f9565b34801561055457600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000181565b34801561058857600080fd5b506006546103f1565b34801561059d57600080fd5b506104546105ac36600461447b565b611187565b3480156105bd57600080fd5b50600f546104249060ff1681565b3480156105d757600080fd5b506104546105e63660046146c5565b6111b5565b3480156105f757600080fd5b5061060b6106063660046147b5565b6114c0565b604080516001600160a01b0390931683526020830191909152016103fb565b34801561063657600080fd5b506104546106453660046147d7565b6114f9565b34801561065657600080fd5b50610454610665366004614895565b611536565b34801561067657600080fd5b506104546106853660046149cb565b611661565b34801561069657600080fd5b506104546106a5366004614a11565b61170b565b3480156106b657600080fd5b506104246106c5366004614ab9565b6117ac565b3480156106d657600080fd5b506104546117e1565b3480156106eb57600080fd5b50610454611815565b34801561070057600080fd5b5061045461070f366004614ad4565b6118c2565b34801561072057600080fd5b5061045461072f366004614b15565b611a04565b34801561074057600080fd5b5061075461074f366004614b4a565b611a6c565b6040516103fb9190614bd9565b34801561076d57600080fd5b5061075461077c366004614bec565b611b2b565b34801561078d57600080fd5b5060055461042490600160b01b900460ff1681565b3480156107ae57600080fd5b506104546107bd366004614cb9565b611c3d565b3480156107ce57600080fd5b506104546107dd366004614895565b611cdb565b3480156107ee57600080fd5b506104546107fd3660046147b5565b611d83565b34801561080e57600080fd5b5061045461081d366004614895565b611e26565b34801561082e57600080fd5b506005546104249060ff1681565b34801561084857600080fd5b50610454611e66565b34801561085d57600080fd5b506104d0611ec1565b34801561087257600080fd5b50610424610881366004614cf5565b611f4c565b34801561089257600080fd5b506108a66108a136600461447b565b612014565b6040516103fb96959493929190614d29565b3480156108c457600080fd5b506104546121ad565b3480156108d957600080fd5b506104d0612235565b3480156108ee57600080fd5b506104546108fd366004614bec565b612242565b34801561090e57600080fd5b5061045461091d366004614d7f565b6122dd565b34801561092e57600080fd5b50610937612320565b6040516001600160a01b0390911681526020016103fb565b34801561095b57600080fd5b5061045461096a36600461445e565b6123ad565b34801561097b57600080fd5b5061042461098a366004614b15565b612434565b34801561099b57600080fd5b506104546109aa366004614db4565b6124f6565b3480156109bb57600080fd5b506104246109ca36600461447b565b612563565b3480156109db57600080fd5b50610454612586565b3480156109f057600080fd5b506104546109ff366004614de2565b6125be565b348015610a1057600080fd5b50610454610a1f366004614b15565b612653565b348015610a3057600080fd5b50610454610a3f366004614ab9565b6126bb565b610454610a52366004614e43565b612722565b348015610a6357600080fd5b506103f1610a72366004614e43565b612abe565b348015610a8357600080fd5b50610454610a92366004614eac565b612f52565b348015610aa357600080fd5b50610454610ab2366004614eac565b61300f565b348015610ac357600080fd5b50610424610ad2366004614f63565b600160209081526000928352604080842090915290825290205460ff1681565b348015610afe57600080fd5b506103f1600e5481565b348015610b1457600080fd5b50610454610b23366004614f91565b6130c7565b348015610b3457600080fd5b50610454610b43366004614fdf565b613155565b348015610b5457600080fd5b50610454610b63366004614895565b613186565b348015610b7457600080fd5b50610454610b83366004615048565b61323d565b348015610b9457600080fd5b50600254610937906001600160a01b031681565b348015610bb457600080fd5b506104246132c1565b600063152a902d60e11b6001600160e01b031983161480610bee57506001600160e01b031982166332cc85cd60e11b145b80610bfd5750610bfd8261331c565b92915050565b610c0b612320565b6001600160a01b0316336001600160a01b03161480610c305750610c30336000612434565b80610c4557506002546001600160a01b031633145b610c6a5760405162461bcd60e51b8152600401610c61906150a1565b60405180910390fd5b612710816001600160601b03161115610cd85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c61565b6001600160a01b038216610d2e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c61565b601080546001600160a01b0319166001600160a01b0393909316929092179091556001600160601b0316601155565b6011610d693382612434565b610d855760405162461bcd60e51b8152600401610c61906150c7565b506007805460ff1916911515919091179055565b33610da2612320565b6001600160a01b031614610dc85760405162461bcd60e51b8152600401610c61906150f0565b610dda610dd3612320565b838361336a565b5050565b60606005821080610dfa5750600654610df860058461513b565b105b610e3d5760405162461bcd60e51b81526020600482015260146024820152731d5b9c9958dbd9db9a5e99590818da185b9b995b60621b6044820152606401610c61565b610e456132c1565b15610f30578160008060058310610ea0576006610e6360058761513b565b81548110610e7357610e7361514e565b60009182526020909120602690910201546101009004600f16925060019150610e9d60058661513b565b90505b600554600b54604051633a126a7960e11b81526101009092046001600160a01b031691637424d4f291610ee29186918691899190600990600a9060040161521b565b600060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f279190810190615297565b95945050505050565b6005821015610faf57600554604051631c069d6760e01b8152600481018490526101009091046001600160a01b031690631c069d67906024015b600060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bfd9190810190615297565b6005805461010090046001600160a01b03169063495ec49390610fd2908561513b565b6006610fdf60058761513b565b81548110610fef57610fef61514e565b90600052602060002090602602016110086001876133a5565b6110136002886133a5565b6040518563ffffffff1660e01b8152600401610f6a9493929190615371565b919050565b60106110433382612434565b61105f5760405162461bcd60e51b8152600401610c61906150c7565b60008211801561106f575060fa82105b6110aa5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610c61565b50600e55565b60046110bc3382612434565b6110d85760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613458565b50505050565b6009805461110690615164565b80601f016020809104026020016040519081016040528092919081815260200182805461113290615164565b801561117f5780601f106111545761010080835404028352916020019161117f565b820191906000526020600020905b81548152906001019060200180831161116257829003601f168201915b505050505081565b600c6111933382612434565b6111af5760405162461bcd60e51b8152600401610c61906150c7565b50600855565b60106111c13382612434565b6111dd5760405162461bcd60e51b8152600401610c61906150c7565b600754610100900460ff16156112285760405162461bcd60e51b815260206004820152601060248201526f3bb293b9329030b63932b0b23c9034b760811b6044820152606401610c61565b6007805461ffff191661010017905561012c600c556000600d55604080516020601f8d018190048102820181019092528b81526112a3918d908d90819084018382808284376000920191909152505060408051808201909152600c81526b636f64652e6c61776c65737360a01b6020820152915061323d9050565b60005b888110156114b2576006546000906112bf9060056153bb565b90506113038b8b848181106112d6576112d661514e565b90506020020160208101906112eb9190614895565b82600160405180602001604052806000815250613625565b60066040518060a00160405280600060ff1681526020018b8b8681811061132c5761132c61514e565b905060200201602081019061134191906153ce565b60048b8b888181106113555761135561514e565b905060200201602081019061136a91906153ce565b60ff16901b61137991906153e9565b60ff1681526020014364ffffffffff1681526020018d8d868181106113a0576113a061514e565b90506020020160208101906113b59190614895565b6001600160a01b031681526020018787868181106113d5576113d561514e565b90506020028101906113e79190615402565b6113f090615423565b905281546001818101845560009384526020938490208351602690930201805494840151604085015160608601516001600160a01b0316600160381b02670100000000000000600160d81b031964ffffffffff90921662010000029190911662010000600160d81b031960ff9384166101000261ffff19909916939096169290921796909617939093169290921793909317815560808201519192909161149b9183019060256142e7565b5050505080806114aa9061542f565b9150506112a6565b505050505050505050505050565b6000806000612710601154856114d69190615448565b6114e09190615475565b6010546001600160a01b031693509150505b9250929050565b60055460ff161561151c5760405162461bcd60e51b8152600401610c6190615489565b61152c8888888888888888613767565b5050505050505050565b6002546001600160a01b0316331461157c5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b6044820152606401610c61565b600260009054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f391906154a9565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af115801561163d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dda91906154c6565b8161166b81612563565b6116875760405162461bcd60e51b8152600401610c61906154df565b600b6116933382612434565b6116af5760405162461bcd60e51b8152600401610c61906150c7565b600060066116be60058761513b565b815481106116ce576116ce61514e565b60009182526020909120602690910201805460ff19811660ff90911617600190811782559091506117039082018560256142e7565b505050505050565b600f6117173382612434565b6117335760405162461bcd60e51b8152600401610c61906150c7565b600554604051630384f81360e41b81526101009091046001600160a01b03169063384f813090611771908a908a908a908a908a908a906004016155f8565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b5050505050505050505050565b6000600460008360158111156117c4576117c4615634565b60ff90811682526020820192909252604001600020541692915050565b60066117ed3382612434565b6118095760405162461bcd60e51b8152600401610c61906150c7565b611812336139e8565b50565b60156118213382612434565b61183d5760405162461bcd60e51b8152600401610c61906150c7565b60055460ff1615156001146118815760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b6044820152606401610c61565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6118ca612320565b6001600160a01b0316336001600160a01b031614806118ef57506118ef336000612434565b8061190457506002546001600160a01b031633145b6119205760405162461bcd60e51b8152600401610c61906150a1565b600554600160a81b900460ff16156119685760405162461bcd60e51b815260206004820152600b60248201526a125b9a5d1a585b1a5e995960aa1b6044820152606401610c61565b6005805460ff60a81b1916600160a81b179055600254604080513060208201526001600160a01b03909216908201526119da9060009081908590859060600160408051601f19818403018152908290526119c693929160200161564a565b604051602081830303815290604052613a1d565b600560016101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611a0c612320565b6001600160a01b0316336001600160a01b03161480611a315750611a31336000612434565b80611a4657506002546001600160a01b031633145b611a625760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613b21565b6060816001600160401b03811115611a8657611a866144f7565b604051908082528060200260200182016040528015611aaf578160200160208202803683370190505b50905060005b82811015611b23576001600160a01b038516600090815260208190526040812090858584818110611ae857611ae861514e565b90506020020135815260200190815260200160002054828281518110611b1057611b1061514e565b6020908102919091010152600101611ab5565b509392505050565b6060838214611b4c5760405162461bcd60e51b8152600401610c6190615671565b836001600160401b03811115611b6457611b646144f7565b604051908082528060200260200182016040528015611b8d578160200160208202803683370190505b50905060005b84811015611c3457600080878784818110611bb057611bb061514e565b9050602002016020810190611bc59190614895565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110611bf957611bf961514e565b90506020020135815260200190815260200160002054828281518110611c2157611c2161514e565b6020908102919091010152600101611b93565b50949350505050565b611c45612320565b6001600160a01b0316336001600160a01b03161480611c6a5750611c6a336000612434565b80611c7f57506002546001600160a01b031633145b611c9b5760405162461bcd60e51b8152600401610c61906150a1565b60005b8151811015610dda57611cc9828281518110611cbc57611cbc61514e565b6020026020010151613c81565b80611cd38161542f565b915050611c9e565b6012611ce73382612434565b611d035760405162461bcd60e51b8152600401610c61906150c7565b611d0d60046117ac565b15611d465760405162461bcd60e51b815260206004820152600960248201526834ba13b99037bb32b960b91b6044820152606401610c61565b611d51826004611a04565b50600f805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176001179055565b6010611d8f3382612434565b611dab5760405162461bcd60e51b8152600401610c61906150c7565b811580611dce5750611dbe600283615475565b8311158015611dce5750611c2083105b611e1a5760405162461bcd60e51b815260206004820152601b60248201527f706f77657220726571756972656d656e747320657863656564656400000000006044820152606401610c61565b50600c91909155600d55565b33611e2f612320565b6001600160a01b031614611e555760405162461bcd60e51b8152600401610c61906150f0565b611812611e60612320565b82613d30565b6012611e723382612434565b611e8e5760405162461bcd60e51b8152600401610c61906150c7565b600f54611eaa9061010090046001600160a01b03166004612653565b611eb460046126bb565b50600f805460ff19169055565b6002546060906001600160a01b031663c669e9c9611ee6611ee160065490565b613e13565b6040518263ffffffff1660e01b8152600401611f02919061569a565b600060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f479190810190615297565b905090565b6000805b602581101561200b576000838260258110611f6d57611f6d61514e565b6020020151611f7b906156c9565b60f81c905060618110801590611f925750607a8111155b80611f9d5750806020145b80611fb55750602d8110158015611fb5575060398111155b80611fc05750806027145b80611fcb575080603f145b80611fd65750806021145b15611fe15750611ff9565b80600003611fef575061200b565b5060009392505050565b806120038161542f565b915050611f50565b50600192915050565b60008080808060606120276005886153bb565b61203081612563565b61204c5760405162461bcd60e51b8152600401610c61906154df565b6000600689815481106120615761206161514e565b600091825260208220602690910201915060018201905b60258110156120b7578181602581106120935761209361514e565b0161209d90615700565b60f81c156120b757806120af8161542f565b915050612078565b6000816001600160401b038111156120d1576120d16144f7565b6040519080825280601f01601f1916602001820160405280156120fb576020820181803683370190505b50905060005b828110156121605783816025811061211b5761211b61514e565b0161212590615700565b8282815181106121375761213761514e565b60200101906001600160f81b031916908160001a905350806121588161542f565b915050612101565b509254600f61010082048181169c5060041c16995064ffffffffff6201000082041698506001600160a01b03600160381b8204169750600190811614955091935050505091939550919395565b60156121b93382612434565b6121d55760405162461bcd60e51b8152600401610c61906150c7565b60055460ff16156121f85760405162461bcd60e51b8152600401610c6190615489565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016118b7565b600a805461110690615164565b600f61224e3382612434565b61226a5760405162461bcd60e51b8152600401610c61906150c7565b6005546040516386a3555d60e01b81526101009091046001600160a01b0316906386a3555d906122a490889088908890889060040161574e565b600060405180830381600087803b1580156122be57600080fd5b505af11580156122d2573d6000803e3d6000fd5b505050505050505050565b60046122e93382612434565b6123055760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613625565b6002546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000160048201526000916001600160a01b031690636352211e90602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906154a9565b600c6123b93382612434565b6123d55760405162461bcd60e51b8152600401610c61906150c7565b6005546040516394e83b9b60e01b815283151560048201526101009091046001600160a01b0316906394e83b9b90602401600060405180830381600087803b15801561242057600080fd5b505af1158015611703573d6000803e3d6000fd5b600081601581111561244857612448615634565b6001600160a01b038416600090815260036020526040902054600160ff929092161c811614806124b05750601282601581111561248757612487615634565b1480156124b05750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806124ef575060008260158111156124ca576124ca615634565b1480156124ef57506124da612320565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b600060058210158015610bfd575060065461257f60058461513b565b1092915050565b60126125923382612434565b6125ae5760405162461bcd60e51b8152600401610c61906150c7565b506005805460ff60b01b19169055565b60086125ca3382612434565b6125e65760405162461bcd60e51b8152600401610c61906150c7565b60055460405163b12c029960e01b81526101009091046001600160a01b03169063b12c02999061261c9086908690600401615775565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b50505050505050565b61265b612320565b6001600160a01b0316336001600160a01b031614806126805750612680336000612434565b8061269557506002546001600160a01b031633145b6126b15760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613ea5565b6126c3612320565b6001600160a01b0316336001600160a01b031614806126e857506126e8336000612434565b806126fd57506002546001600160a01b031633145b6127195760405162461bcd60e51b8152600401610c61906150a1565b61181281613c81565b8261272c81612563565b6127485760405162461bcd60e51b8152600401610c61906154df565b818361275382611f4c565b61276f5760405162461bcd60e51b8152600401610c6190615796565b60058160ff16106127be5760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b0382163314806127fa57506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b806129255750600554600160b01b900460ff168015612925575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289691906157d7565b806129255750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612901573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292591906157d7565b6129715760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b6008543410156129b75760405162461bcd60e51b81526020600482015260116024820152707061727473206172656e2774206672656560781b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054600114612a185760405162461bcd60e51b815260206004820152600d60248201526c1a1858dac81d1a1dd85c9d1959609a1b6044820152606401610c61565b60006006612a2760058b61513b565b81548110612a3757612a3761514e565b600091825260209091206026909102019050612a58600182018860256142e7565b50805466ffffffffffff01600160d81b031916600160381b6001600160a01b038c160260ff191617808255612a9d906101009004600f1660048a901b610ff0166153e9565b815460ff919091166101000261ff0019909116179055505050505050505050565b60008183612acb82611f4c565b612ae75760405162461bcd60e51b8152600401610c6190615796565b60058160ff1610612b365760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b038216331480612b7257506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b80612c9d5750600554600160b01b900460ff168015612c9d575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0e91906157d7565b80612c9d5750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9d91906157d7565b612ce95760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b60058810612d395760405162461bcd60e51b815260206004820152601860248201527f696e636f6d70617469626c65207472616e73706f6e64657200000000000000006044820152606401610c61565b60075460ff1615612d755760405162461bcd60e51b81526020600482015260066024820152651a985b5b595960d21b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054612de35760405162461bcd60e51b815260206004820152601f60248201527f796f75276c6c206e65656420746f2072756d6d61676520666f722074686174006044820152606401610c61565b600654612df19060056153bb565b9450612dff89896001613f99565b612e1b8986600160405180602001604052806000815250613625565b6040805160a081019091526000815260069060208101612e438b610ff060048d901b166153e9565b60ff1681526020014364ffffffffff1681526020018b6001600160a01b0316815260200188815250908060018154018082558091505060019003906000526020600020906026020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548164ffffffffff021916908364ffffffffff16021790555060608201518160000160076101000a8154816001600160a01b0302191690836001600160a01b03160217905550608082015181600101906025612f439291906142e7565b50505050505050949350505050565b612f5a612320565b6001600160a01b0316336001600160a01b03161480612f7f5750612f7f336000612434565b80612f9457506002546001600160a01b031633145b612fb05760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a57612ff8838281518110612fd157612fd161514e565b6020026020010151838381518110612feb57612feb61514e565b6020026020010151613ea5565b806130028161542f565b915050612fb3565b505050565b613017612320565b6001600160a01b0316336001600160a01b0316148061303c575061303c336000612434565b8061305157506002546001600160a01b031633145b61306d5760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a576130b583828151811061308e5761308e61514e565b60200260200101518383815181106130a8576130a861514e565b6020026020010151613b21565b806130bf8161542f565b915050613070565b600a6130d33382612434565b6130ef5760405162461bcd60e51b8152600401610c61906150c7565b60055460405163f09f3f3160e01b81526101009091046001600160a01b03169063f09f3f3190613127908790879087906004016157f4565b600060405180830381600087803b15801561314157600080fd5b505af115801561152c573d6000803e3d6000fd5b60055460ff16156131785760405162461bcd60e51b8152600401610c6190615489565b61170386868686868661401d565b3361318f612320565b6001600160a01b0316146131b55760405162461bcd60e51b8152600401610c61906150f0565b6002546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000160048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561322257600080fd5b505af1158015613236573d6000803e3d6000fd5b5050505050565b60106132493382612434565b6132655760405162461bcd60e51b8152600401610c61906150c7565b60096132718482615861565b5043600b55600a6132828382615861565b507f297aa6cf51bb39507374bfcb61edead3172fc87755dea183d848c3a23c70496783836040516132b4929190615920565b60405180910390a1505050565b6000600980546132d090615164565b90506000036132df5750600090565b600d546000036132ff57600c54600b546132f9904361513b565b10905090565b600c54600d54600b54613312904361513b565b6132f99190615945565b60006301ffc9a760e01b6001600160e01b03198316148061334d5750636cdb3d1360e11b6001600160e01b03198316145b80610bfd5750506001600160e01b0319166303a24d0760e21b1490565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e9060640161261c565b600080600e54436133b69190615945565b6133c0904361513b565b9050600084846133d160028561513b565b60408051602081019490945283019190915240606082015260800160408051601f1981840301815291905280516020909101206006805463ffffffff909216925090613426680470d97cab4ce6941b84615448565b6134309190615945565b815481106134405761344061514e565b90600052602060002090602602019250505092915050565b82518251811461347a5760405162461bcd60e51b8152600401610c6190615671565b60005b81811015613509578381815181106134975761349761514e565b6020026020010151600080886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106134d7576134d761514e565b6020026020010151815260200190815260200160002060008282546134fc91906153bb565b909155505060010161347d565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161355a929190615959565b60405180910390a46001600160a01b0385163b156135fc5760405163bc197c8160e01b808252906001600160a01b0387169063bc197c81906135a99033906000908a908a908a9060040161597e565b6020604051808303816000875af11580156135c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ec91906159d0565b6001600160e01b03191614613609565b6001600160a01b03851615155b6132365760405162461bcd60e51b8152600401610c61906159ed565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906136569084906153bb565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561373e5760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906136eb903390600090899089908990600401615a17565b6020604051808303816000875af115801561370a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372e91906159d0565b6001600160e01b0319161461374b565b6001600160a01b03841615155b6110f35760405162461bcd60e51b8152600401610c61906159ed565b8483146137865760405162461bcd60e51b8152600401610c6190615671565b336001600160a01b03891614806137c057506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6137fd5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b60008060005b878110156138b85788888281811061381d5761381d61514e565b9050602002013592508686828181106138385761383861514e565b6001600160a01b038e166000908152602081815260408083208984528252822080549390910294909401359550859392509061387590849061513b565b90915550506001600160a01b038a16600090815260208181526040808320868452909152812080548492906138ab9084906153bb565b9091555050600101613803565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161390c9493929190615a51565b60405180910390a46001600160a01b0389163b156139b35760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906139609033908f908e908e908e908e908e908e90600401615a78565b6020604051808303816000875af115801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a391906159d0565b6001600160e01b031916146139c0565b6001600160a01b03891615155b6139dc5760405162461bcd60e51b8152600401610c61906159ed565b50505050505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b600083471015613a6f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610c61565b8151600003613ac05760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610c61565b8282516020840186f590506001600160a01b0381166124ef5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610c61565b6012816015811115613b3557613b35615634565b03613b8e5760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401610c61565b60046000826015811115613ba457613ba4615634565b60ff90811682526020820192909252604001600020541615613bf15760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613c0357613c03615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115613c4057613c40615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051612557911515815260200190565b60046000826015811115613c9757613c97615634565b60ff90811682526020820192909252604001600020541661181257600160046000836015811115613cca57613cca615634565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806015811115613cfe57613cfe615634565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015613d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da491906154c6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613def573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f391906157d7565b60606000613e208361420f565b60010190506000816001600160401b03811115613e3f57613e3f6144f7565b6040519080825280601f01601f191660200182016040528015613e69576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613e7357509392505050565b60046000826015811115613ebb57613ebb615634565b60ff90811682526020820192909252604001600020541615613f085760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613f1a57613f1a615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b199091169055806015811115613f5857613f58615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6000604051612557911515815260200190565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290613fca90849061513b565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b336001600160a01b038716148061405757506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6140945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b6001600160a01b038616600090815260208181526040808320878452909152812080548592906140c590849061513b565b90915550506001600160a01b038516600090815260208181526040808320878452909152812080548592906140fb9084906153bb565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156141e65760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906141939033908b908a908a908a908a90600401615adc565b6020604051808303816000875af11580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d691906159d0565b6001600160e01b031916146141f3565b6001600160a01b03851615155b6117035760405162461bcd60e51b8152600401610c61906159ed565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061424e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061427a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061429857662386f26fc10000830492506010015b6305f5e10083106142b0576305f5e100830492506008015b61271083106142c457612710830492506004015b606483106142d6576064830492506002015b600a8310610bfd5760010192915050565b8260258101928215614320579160200282015b8281111561432057825182906143109082615861565b50916020019190600101906142fa565b5061432c929150614330565b5090565b8082111561432c576000614344828261434d565b50600101614330565b50805461435990615164565b6000825580601f10614369575050565b601f01602090049060005260206000209081019061181291905b8082111561432c5760008155600101614383565b6001600160a01b038116811461181257600080fd5b600080604083850312156143bf57600080fd5b82356143ca81614397565b946020939093013593505050565b6001600160e01b03198116811461181257600080fd5b60006020828403121561440057600080fd5b81356124ef816143d8565b6000806040838503121561441e57600080fd5b823561442981614397565b915060208301356001600160601b038116811461444557600080fd5b809150509250929050565b801515811461181257600080fd5b60006020828403121561447057600080fd5b81356124ef81614450565b60006020828403121561448d57600080fd5b5035919050565b60005b838110156144af578181015183820152602001614497565b50506000910152565b600081518084526144d0816020860160208601614494565b601f01601f19169290920160200192915050565b6020815260006124ef60208301846144b8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614535576145356144f7565b604052919050565b60006001600160401b03821115614556576145566144f7565b5060051b60200190565b600082601f83011261457157600080fd5b813560206145866145818361453d565b61450d565b82815260059290921b840181019181810190868411156145a557600080fd5b8286015b848110156145c057803583529183019183016145a9565b509695505050505050565b6000806000606084860312156145e057600080fd5b83356145eb81614397565b925060208401356001600160401b038082111561460757600080fd5b61461387838801614560565b9350604086013591508082111561462957600080fd5b5061463686828701614560565b9150509250925092565b60008083601f84011261465257600080fd5b5081356001600160401b0381111561466957600080fd5b6020830191508360208285010111156114f257600080fd5b60008083601f84011261469357600080fd5b5081356001600160401b038111156146aa57600080fd5b6020830191508360208260051b85010111156114f257600080fd5b60008060008060008060008060008060a08b8d0312156146e457600080fd5b8a356001600160401b03808211156146fb57600080fd5b6147078e838f01614640565b909c509a5060208d013591508082111561472057600080fd5b61472c8e838f01614681565b909a50985060408d013591508082111561474557600080fd5b6147518e838f01614681565b909850965060608d013591508082111561476a57600080fd5b6147768e838f01614681565b909650945060808d013591508082111561478f57600080fd5b5061479c8d828e01614681565b915080935050809150509295989b9194979a5092959850565b600080604083850312156147c857600080fd5b50508035926020909101359150565b60008060008060008060008060a0898b0312156147f357600080fd5b88356147fe81614397565b9750602089013561480e81614397565b965060408901356001600160401b038082111561482a57600080fd5b6148368c838d01614681565b909850965060608b013591508082111561484f57600080fd5b61485b8c838d01614681565b909650945060808b013591508082111561487457600080fd5b506148818b828c01614640565b999c989b5096995094979396929594505050565b6000602082840312156148a757600080fd5b81356124ef81614397565b60006001600160401b038211156148cb576148cb6144f7565b50601f01601f191660200190565b600082601f8301126148ea57600080fd5b81356148f8614581826148b2565b81815284602083860101111561490d57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040516104a08082016001600160401b038382108183111715614951576149516144f7565b8160405283945082860192508683111561496a57600080fd5b8591505b828210156149a6578135818111156149865760008081fd5b614992888289016148d9565b85525060208401935060208201915061496e565b5050505092915050565b600082601f8301126149c157600080fd5b6124ef838361492a565b600080604083850312156149de57600080fd5b8235915060208301356001600160401b038111156149fb57600080fd5b614a07858286016149b0565b9150509250929050565b60008060008060008060608789031215614a2a57600080fd5b86356001600160401b0380821115614a4157600080fd5b614a4d8a838b01614681565b90985096506020890135915080821115614a6657600080fd5b614a728a838b01614681565b90965094506040890135915080821115614a8b57600080fd5b50614a9889828a01614681565b979a9699509497509295939492505050565b80356016811061103257600080fd5b600060208284031215614acb57600080fd5b6124ef82614aaa565b60008060208385031215614ae757600080fd5b82356001600160401b03811115614afd57600080fd5b614b0985828601614640565b90969095509350505050565b60008060408385031215614b2857600080fd5b8235614b3381614397565b9150614b4160208401614aaa565b90509250929050565b600080600060408486031215614b5f57600080fd5b8335614b6a81614397565b925060208401356001600160401b03811115614b8557600080fd5b614b9186828701614681565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614bce57815187529582019590820190600101614bb2565b509495945050505050565b6020815260006124ef6020830184614b9e565b60008060008060408587031215614c0257600080fd5b84356001600160401b0380821115614c1957600080fd5b614c2588838901614681565b90965094506020870135915080821115614c3e57600080fd5b50614c4b87828801614681565b95989497509550505050565b600082601f830112614c6857600080fd5b81356020614c786145818361453d565b82815260059290921b84018101918181019086841115614c9757600080fd5b8286015b848110156145c057614cac81614aaa565b8352918301918301614c9b565b600060208284031215614ccb57600080fd5b81356001600160401b03811115614ce157600080fd5b614ced84828501614c57565b949350505050565b600060208284031215614d0757600080fd5b81356001600160401b03811115614d1d57600080fd5b614ced848285016149b0565b60ff87811682528616602082015264ffffffffff851660408201526001600160a01b0384166060820152821515608082015260c060a08201819052600090614d73908301846144b8565b98975050505050505050565b600080600060608486031215614d9457600080fd5b8335614d9f81614397565b95602085013595506040909401359392505050565b60008060408385031215614dc757600080fd5b8235614dd281614397565b9150602083013561444581614450565b60008060408385031215614df557600080fd5b823565ffffffffffff81168114614e0b57600080fd5b915060208301356001600160401b03811115614e2657600080fd5b614a07858286016148d9565b803560ff8116811461103257600080fd5b60008060008060808587031215614e5957600080fd5b8435614e6481614397565b935060208501359250614e7960408601614e32565b915060608501356001600160401b03811115614e9457600080fd5b614ea0878288016149b0565b91505092959194509250565b60008060408385031215614ebf57600080fd5b82356001600160401b0380821115614ed657600080fd5b818501915085601f830112614eea57600080fd5b81356020614efa6145818361453d565b82815260059290921b84018101918181019089841115614f1957600080fd5b948201945b83861015614f40578535614f3181614397565b82529482019490820190614f1e565b96505086013592505080821115614f5657600080fd5b50614a0785828601614c57565b60008060408385031215614f7657600080fd5b8235614f8181614397565b9150602083013561444581614397565b600080600060608486031215614fa657600080fd5b8335614fb181614397565b92506020840135915060408401356001600160401b03811115614fd357600080fd5b614636868287016148d9565b60008060008060008060a08789031215614ff857600080fd5b863561500381614397565b9550602087013561501381614397565b9450604087013593506060870135925060808701356001600160401b0381111561503c57600080fd5b614a9889828a01614640565b6000806040838503121561505b57600080fd5b82356001600160401b038082111561507257600080fd5b61507e868387016148d9565b9350602085013591508082111561509457600080fd5b50614a07858286016148d9565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bfd57610bfd615125565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061517857607f821691505b60208210810361519857634e487b7160e01b600052602260045260246000fd5b50919050565b600081546151ab81615164565b8085526020600183811680156151c857600181146151e257615210565b60ff1985168884015283151560051b880183019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b861515815285602082015284604082015283606082015260c06080820152600061524860c083018561519e565b82810360a084015261525a818561519e565b9998505050505050505050565b6000615275614581846148b2565b905082815283838301111561528957600080fd5b6124ef836020830184614494565b6000602082840312156152a957600080fd5b81516001600160401b038111156152bf57600080fd5b8201601f810184136152d057600080fd5b614ced84825160208401615267565b600060a08301825460ff81168552602060ff8260081c168187015264ffffffffff8260101c16604087015260018060a01b038260381c1660608701526001915060a06080870152828390506105408701935082860160005b602581101561536457888603609f19018352615353868361519e565b955091830191908401908401615337565b5093979650505050505050565b84815260806020820152600061538a60808301866152df565b828103604084015261539c81866152df565b905082810360608401526153b081856152df565b979650505050505050565b80820180821115610bfd57610bfd615125565b6000602082840312156153e057600080fd5b6124ef82614e32565b60ff8181168382160190811115610bfd57610bfd615125565b6000823561049e1983360301811261541957600080fd5b9190910192915050565b6000610bfd368361492a565b60006001820161544157615441615125565b5060010190565b8082028115828204841417610bfd57610bfd615125565b634e487b7160e01b600052601260045260246000fd5b6000826154845761548461545f565b500490565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156154bb57600080fd5b81516124ef81614397565b6000602082840312156154d857600080fd5b5051919050565b6020808252601390820152721cda59db985b081b9bdd0819195d1958dd1959606a1b604082015260600190565b81835260006001600160fb1b0383111561552557600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156155eb5782840389528135601e198836030181126155a257600080fd5b870185810190356001600160401b038111156155bd57600080fd5b8036038213156155cc57600080fd5b6155d786828461553e565b9a87019a9550505090840190600101615581565b5091979650505050505050565b60608152600061560c60608301888a61550c565b828103602084015261561f818789615567565b9050828103604084015261525a818587615567565b634e487b7160e01b600052602160045260246000fd5b828482376000838201600081528351615667818360208801614494565b0195945050505050565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b604081526005604082015264706565727360d81b60608201526080602082015260006124ef60808301846144b8565b805160208201516001600160f81b031980821692919060018310156156f85780818460010360031b1b83161693505b505050919050565b600061570c8254615164565b82601f8211156157225783600052602060002090505b546001600160f81b0319808216935060018310156156f85760019290920360031b82901b161692915050565b604081526000615762604083018688615567565b82810360208401526153b0818587615567565b65ffffffffffff83168152604060208201526000614ced60408301846144b8565b60208082526021908201527f756e7265636f76657261626c6520756e636f727265637461626c65206572726f6040820152603960f91b606082015260800190565b6000602082840312156157e957600080fd5b81516124ef81614450565b60018060a01b0384168152826020820152606060408201526000610f2760608301846144b8565b601f82111561300a57600081815260208120601f850160051c810160208610156158425750805b601f850160051c820191505b818110156117035782815560010161584e565b81516001600160401b0381111561587a5761587a6144f7565b61588e816158888454615164565b8461581b565b602080601f8311600181146158c357600084156158ab5750858301515b600019600386901b1c1916600185901b178555611703565b600085815260208120601f198616915b828110156158f2578886015182559484019460019091019084016158d3565b50858210156159105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061593360408301856144b8565b8281036020840152610f2781856144b8565b6000826159545761595461545f565b500690565b60408152600061596c6040830185614b9e565b8281036020840152610f278185614b9e565b6001600160a01b0386811682528516602082015260a0604082018190526000906159aa90830186614b9e565b82810360608401526159bc8186614b9e565b90508281036080840152614d7381856144b8565b6000602082840312156159e257600080fd5b81516124ef816143d8565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906153b0908301846144b8565b604081526000615a6560408301868861550c565b82810360208401526153b081858761550c565b6001600160a01b0389811682528816602082015260a060408201819052600090615aa5908301888a61550c565b8281036060840152615ab881878961550c565b90508281036080840152615acd81858761553e565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090614d73908301848661553e56fea2646970667358221220a1510b0e2b6728f50bba153ba8f1bcf1e86f5a038f4073c2db9d6e4bf6261ec764736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : tokenId (uint256): 1

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


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.