ETH Price: $3,170.04 (-4.03%)
Gas: 11 Gwei

Contract

0x915A22A152654714FcecA3f4704fCf6bd314624c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Safe Transfer Fr...197984662024-05-04 18:15:2360 days ago1714846523IN
0x915A22A1...bd314624c
0 ETH0.000317914.86912611
Set Approval For...195239852024-03-27 6:45:5999 days ago1711521959IN
0x915A22A1...bd314624c
0 ETH0.0011712625.39109253
Safe Transfer Fr...194344902024-03-14 16:41:23111 days ago1710434483IN
0x915A22A1...bd314624c
0 ETH0.0028162958.70220153
Set Approval For...193478752024-03-02 13:47:23123 days ago1709387243IN
0x915A22A1...bd314624c
0 ETH0.0027579859.78858875
Set Approval For...190499872024-01-20 18:52:23165 days ago1705776743IN
0x915A22A1...bd314624c
0 ETH0.000681814.78032493
Safe Transfer Fr...190257052024-01-17 9:26:47169 days ago1705483607IN
0x915A22A1...bd314624c
0 ETH0.0018467128.31164544
Set Approval For...189690372024-01-09 11:14:11176 days ago1704798851IN
0x915A22A1...bd314624c
0 ETH0.0003633813.8607476
Set Approval For...189690302024-01-09 11:12:47177 days ago1704798767IN
0x915A22A1...bd314624c
0 ETH0.0003117512.87355075
Set Approval For...189690252024-01-09 11:11:47177 days ago1704798707IN
0x915A22A1...bd314624c
0 ETH0.0003176513.07187252
Set Approval For...183626102023-10-16 11:22:59261 days ago1697455379IN
0x915A22A1...bd314624c
0 ETH0.000381068.26093458
Safe Transfer Fr...181053952023-09-10 10:31:35298 days ago1694341895IN
0x915A22A1...bd314624c
0 ETH0.0005562911.46905975
Safe Transfer Fr...181053752023-09-10 10:27:35298 days ago1694341655IN
0x915A22A1...bd314624c
0 ETH0.00077310.96642636
Set Approval For...181053562023-09-10 10:23:47298 days ago1694341427IN
0x915A22A1...bd314624c
0 ETH0.000400948.67603621
Set Approval For...179696792023-08-22 10:32:35317 days ago1692700355IN
0x915A22A1...bd314624c
0 ETH0.0004941720.37564083
Safe Transfer Fr...179696352023-08-22 10:23:47317 days ago1692699827IN
0x915A22A1...bd314624c
0 ETH0.0013969221.24402024
Set Approval For...179696302023-08-22 10:22:47317 days ago1692699767IN
0x915A22A1...bd314624c
0 ETH0.0008455518.3160087
Safe Transfer Fr...177145692023-07-17 17:49:23352 days ago1689616163IN
0x915A22A1...bd314624c
0 ETH0.0012994427.08540316
Transfer From175026452023-06-17 22:56:23382 days ago1687042583IN
0x915A22A1...bd314624c
0 ETH0.0004025317.93117755
Transfer From175025852023-06-17 22:44:23382 days ago1687041863IN
0x915A22A1...bd314624c
0 ETH0.0003331214.83920192
Set Approval For...165510302023-02-03 21:45:35516 days ago1675460735IN
0x915A22A1...bd314624c
0 ETH0.0013748929.80552331
Set Approval For...164028692023-01-14 5:11:35537 days ago1673673095IN
0x915A22A1...bd314624c
0 ETH0.0009324820.17799406
Set Approval For...163987232023-01-13 15:19:59537 days ago1673623199IN
0x915A22A1...bd314624c
0 ETH0.0018295339.66128691
Safe Transfer Fr...156855032022-10-06 0:32:11637 days ago1665016331IN
0x915A22A1...bd314624c
0 ETH0.000388648.95003878
Safe Transfer Fr...156854942022-10-06 0:30:23637 days ago1665016223IN
0x915A22A1...bd314624c
0 ETH0.000426378.85924405
Safe Transfer Fr...156815712022-10-05 11:21:35637 days ago1664968895IN
0x915A22A1...bd314624c
0 ETH0.000315374.83501331
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
130376432021-08-16 17:45:051052 days ago1629135905
0x915A22A1...bd314624c
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ItemMainInterface

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-16
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: contracts\model\IERC1155Views.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;

/**
 * @title IERC1155Views - An optional utility interface to improve the ERC-1155 Standard.
 * @dev This interface introduces some additional capabilities for ERC-1155 Tokens.
 */
interface IERC1155Views {

    /**
     * @dev Returns the total supply of the given token id
     * @param itemId the id of the token whose availability you want to know 
     */
    function totalSupply(uint256 itemId) external view returns (uint256);

    /**
     * @dev Returns the name of the given token id
     * @param itemId the id of the token whose name you want to know 
     */
    function name(uint256 itemId) external view returns (string memory);

    /**
     * @dev Returns the symbol of the given token id
     * @param itemId the id of the token whose symbol you want to know 
     */
    function symbol(uint256 itemId) external view returns (string memory);

    /**
     * @dev Returns the decimals of the given token id
     * @param itemId the id of the token whose decimals you want to know 
     */
    function decimals(uint256 itemId) external view returns (uint256);

    /**
     * @dev Returns the uri of the given token id
     * @param itemId the id of the token whose uri you want to know 
     */
    function uri(uint256 itemId) external view returns (string memory);
}

// File: contracts\model\Item.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;
pragma abicoder v2;



struct Header {
    address host;
    string name;
    string symbol;
    string uri;
}

struct CreateItem {
    Header header;
    bytes32 collectionId;
    uint256 id;
    address[] accounts;
    uint256[] amounts;
}

interface Item is IERC1155, IERC1155Views {

    event CollectionItem(bytes32 indexed fromCollectionId, bytes32 indexed toCollectionId, uint256 indexed itemId);

    function name() external view returns(string memory);
    function symbol() external view returns(string memory);

    function burn(address account, uint256 itemId, uint256 amount) external;
    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) external;

    function burn(address account, uint256 itemId, uint256 amount, bytes calldata data) external;
    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) external;

    function mintItems(CreateItem[] calldata items) external returns(uint256[] memory itemIds);
    function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) external returns(bytes32[] memory oldCollectionIds);
    function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata amounts) external returns(Header[] memory oldValues);

    function interoperableOf(uint256 itemId) external view returns(address);
}

// File: node_modules\@ethereansos\swissknife\contracts\generic\model\ILazyInitCapableElement.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;


interface ILazyInitCapableElement is IERC165 {

    function lazyInit(bytes calldata lazyInitData) external returns(bytes memory initResponse);
    function initializer() external view returns(address);

    event Host(address indexed from, address indexed to);

    function host() external view returns(address);
    function setHost(address newValue) external returns(address oldValue);

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) external view returns(bool);
}

// File: @ethereansos\swissknife\contracts\dynamicMetadata\model\IDynamicMetadataCapableElement.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;


interface IDynamicMetadataCapableElement is ILazyInitCapableElement {

    function uri() external view returns(string memory);
    function plainUri() external view returns(string memory);

    function setUri(string calldata newValue) external returns (string memory oldValue);

    function dynamicUriResolver() external view returns(address);
    function setDynamicUriResolver(address newValue) external returns(address oldValue);
}

// File: contracts\model\IItemMainInterface.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



struct ItemData {
    bytes32 collectionId;
    Header header;
    bytes32 domainSeparator;
    uint256 totalSupply;
    mapping(address => uint256) balanceOf;
    mapping(address => mapping(address => uint256)) allowance;
    mapping(address => uint256) nonces;
}

interface IItemMainInterface is Item, IDynamicMetadataCapableElement {

    event Collection(address indexed from, address indexed to, bytes32 indexed collectionId);

    function interoperableInterfaceModel() external view returns(address);

    function collection(bytes32 collectionId) external view returns(address host, string memory name, string memory symbol, string memory uri);
    function collectionUri(bytes32 collectionId) external view returns(string memory);
    function createCollection(Header calldata _collection, CreateItem[] calldata items) external returns(bytes32 collectionId, uint256[] memory itemIds);
    function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) external returns(Header[] memory oldValues);

    function item(uint256 itemId) external view returns(bytes32 collectionId, Header memory header, bytes32 domainSeparator, uint256 totalSupply);

    function mintTransferOrBurn(bool isMulti, bytes calldata data) external;

    function allowance(address account, address spender, uint256 itemId) external view returns(uint256);
    function approve(address account, address spender, uint256 amount, uint256 itemId) external;
    function TYPEHASH_PERMIT() external view returns (bytes32);
    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory domainSeparatorName, string memory domainSeparatorVersion);
    function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner, uint256 itemId) external view returns(uint256);
}

// File: @openzeppelin\contracts\token\ERC20\IERC20.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin\contracts\token\ERC20\extensions\draft-IERC20Permit.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: contracts\model\IItemInteroperableInterface.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;




interface IItemInteroperableInterface is IERC20, IERC20Metadata, IERC20Permit {

    function init() external;
    function mainInterface() external view returns(address);
    function itemId() external view returns(uint256);
    function emitEvent(bool forApprove, bool isMulti, bytes calldata data) external;
    function burn(uint256 amount) external;
    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory name, string memory version);
}

// File: node_modules\@ethereansos\swissknife\contracts\dynamicMetadata\model\IDynamicUriResolver.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;

interface IDynamicUriResolver {
    function resolve(address subject, string calldata plainUri, bytes calldata inputData, address caller) external view returns(string memory);
}

// File: node_modules\@ethereansos\swissknife\contracts\lib\GeneralUtilities.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;

library BehaviorUtilities {

    function randomKey(uint256 i) internal view returns (bytes32) {
        return keccak256(abi.encode(i, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
    }

    function calculateProjectedArraySizeAndLoopUpperBound(uint256 arraySize, uint256 start, uint256 offset) internal pure returns(uint256 projectedArraySize, uint256 projectedArrayLoopUpperBound) {
        if(arraySize != 0 && start < arraySize && offset != 0) {
            uint256 length = start + offset;
            if(start < (length = length > arraySize ? arraySize : length)) {
                projectedArraySize = (projectedArrayLoopUpperBound = length) - start;
            }
        }
    }
}

library ReflectionUtilities {

    function read(address subject, bytes memory inputData) internal view returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.staticcall(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function submit(address subject, uint256 value, bytes memory inputData) internal returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.call{value : value}(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function isContract(address subject) internal view returns (bool) {
        if(subject == address(0)) {
            return false;
        }
        uint256 codeLength;
        assembly {
            codeLength := extcodesize(subject)
        }
        return codeLength > 0;
    }

    function clone(address originalContract) internal returns(address copyContract) {
        assembly {
            mstore(
                0,
                or(
                    0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                    mul(originalContract, 0x1000000000000000000)
                )
            )
            copyContract := create(0, 0, 32)
            switch extcodesize(copyContract)
                case 0 {
                    invalid()
                }
        }
    }
}

library BytesUtilities {

    bytes private constant ALPHABET = "0123456789abcdef";

    function asAddress(bytes memory b) internal pure returns(address) {
        if(b.length == 0) {
            return address(0);
        }
        if(b.length == 20) {
            address addr;
            assembly {
                addr := mload(add(b, 20))
            }
            return addr;
        }
        return abi.decode(b, (address));
    }

    function asAddressArray(bytes memory b) internal pure returns(address[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (address[]));
        }
    }

    function asBool(bytes memory bs) internal pure returns(bool) {
        return asUint256(bs) != 0;
    }

    function asBoolArray(bytes memory b) internal pure returns(bool[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bool[]));
        }
    }

    function asBytesArray(bytes memory b) internal pure returns(bytes[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bytes[]));
        }
    }

    function asString(bytes memory b) internal pure returns(string memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string));
        }
    }

    function asStringArray(bytes memory b) internal pure returns(string[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string[]));
        }
    }

    function asUint256(bytes memory bs) internal pure returns(uint256 x) {
        if (bs.length >= 32) {
            assembly {
                x := mload(add(bs, add(0x20, 0)))
            }
        }
    }

    function asUint256Array(bytes memory b) internal pure returns(uint256[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (uint256[]));
        }
    }

    function toString(bytes memory data) internal pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = ALPHABET[uint(uint8(data[i] >> 4))];
            str[3+i*2] = ALPHABET[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

library StringUtilities {

    bytes1 private constant CHAR_0 = bytes1('0');
    bytes1 private constant CHAR_A = bytes1('A');
    bytes1 private constant CHAR_a = bytes1('a');
    bytes1 private constant CHAR_f = bytes1('f');

    function isEmpty(string memory test) internal pure returns (bool) {
        return equals(test, "");
    }

    function equals(string memory a, string memory b) internal pure returns(bool) {
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }

    function toLowerCase(string memory str) internal pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }

    function asBytes(string calldata str) internal pure returns(bytes memory toDecode) {
        bytes memory data = abi.encodePacked(str);
        if(data.length == 0 || data[0] != "0" || (data[1] != "x" && data[1] != "X")) {
            return "";
        }
        uint256 start = 2;
        toDecode = new bytes((data.length - 2) / 2);

        for(uint256 i = 0; i < toDecode.length; i++) {
            toDecode[i] = bytes1(_fromHexChar(uint8(data[start++])) + _fromHexChar(uint8(data[start++])) * 16);
        }
    }

    function _fromHexChar(uint8 c) private pure returns (uint8) {
        bytes1 charc = bytes1(c);
        return charc < CHAR_0 || charc > CHAR_f ? 0 : (charc < CHAR_A ? 0 : 10) + c - uint8(charc < CHAR_A ? CHAR_0 : charc < CHAR_a ? CHAR_A : CHAR_a);
    }
}

library Uint256Utilities {
    function asSingletonArray(uint256 n) internal pure returns(uint256[] memory array) {
        array = new uint256[](1);
        array[0] = n;
    }

    function toString(uint256 _i) internal pure returns (string memory) {
        return BytesUtilities.toString(abi.encodePacked(_i));
    }
}

library AddressUtilities {
    function asSingletonArray(address a) internal pure returns(address[] memory array) {
        array = new address[](1);
        array[0] = a;
    }

    function toString(address _addr) internal pure returns (string memory) {
        return _addr == address(0) ? "0x0000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(_addr));
    }
}

library Bytes32Utilities {

    function asSingletonArray(bytes32 a) internal pure returns(bytes32[] memory array) {
        array = new bytes32[](1);
        array[0] = a;
    }

    function toString(bytes32 bt) internal pure returns (string memory) {
        return bt == bytes32(0) ?  "0x0000000000000000000000000000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(bt));
    }
}

// File: node_modules\@ethereansos\swissknife\contracts\generic\impl\LazyInitCapableElement.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



abstract contract LazyInitCapableElement is ILazyInitCapableElement {
    using ReflectionUtilities for address;

    address public override initializer;
    address public override host;

    constructor(bytes memory lazyInitData) {
        if(lazyInitData.length > 0) {
            _privateLazyInit(lazyInitData);
        }
    }

    function lazyInit(bytes calldata lazyInitData) override external returns (bytes memory lazyInitResponse) {
        return _privateLazyInit(lazyInitData);
    }

    function supportsInterface(bytes4 interfaceId) override external view returns(bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == this.supportsInterface.selector ||
            interfaceId == type(ILazyInitCapableElement).interfaceId ||
            interfaceId == this.lazyInit.selector ||
            interfaceId == this.initializer.selector ||
            interfaceId == this.subjectIsAuthorizedFor.selector ||
            interfaceId == this.host.selector ||
            interfaceId == this.setHost.selector ||
            _supportsInterface(interfaceId);
    }

    function setHost(address newValue) external override authorizedOnly returns(address oldValue) {
        emit Host(oldValue = host, host = newValue);
    }

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) public override virtual view returns(bool) {
        (bool chidlElementValidationIsConsistent, bool chidlElementValidationResult) = _subjectIsAuthorizedFor(subject, location, selector, payload, value);
        if(chidlElementValidationIsConsistent) {
            return chidlElementValidationResult;
        }
        if(subject == host) {
            return true;
        }
        if(!host.isContract()) {
            return false;
        }
        (bool result, bytes memory resultData) = host.staticcall(abi.encodeWithSelector(ILazyInitCapableElement(host).subjectIsAuthorizedFor.selector, subject, location, selector, payload, value));
        return result && abi.decode(resultData, (bool));
    }

    function _privateLazyInit(bytes memory lazyInitData) private returns (bytes memory lazyInitResponse) {
        require(initializer == address(0), "init");
        initializer = msg.sender;
        (host, lazyInitResponse) = abi.decode(lazyInitData, (address, bytes));
        emit Host(address(0), host);
        lazyInitResponse = _lazyInit(lazyInitResponse);
    }

    function _lazyInit(bytes memory) internal virtual returns (bytes memory) {
        return "";
    }

    function _supportsInterface(bytes4 selector) internal virtual view returns (bool);

    function _subjectIsAuthorizedFor(address, address, bytes4, bytes calldata, uint256) internal virtual view returns(bool, bool) {
    }

    modifier authorizedOnly {
        require(_authorizedOnly(), "unauthorized");
        _;
    }

    function _authorizedOnly() internal returns(bool) {
        return subjectIsAuthorizedFor(msg.sender, address(this), msg.sig, msg.data, msg.value);
    }
}

// File: @ethereansos\swissknife\contracts\dynamicMetadata\impl\DynamicMetadataCapableElement.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;




abstract contract DynamicMetadataCapableElement is IDynamicMetadataCapableElement, LazyInitCapableElement {

    string public override plainUri;
    address public override dynamicUriResolver;

    constructor(bytes memory lazyInitData) LazyInitCapableElement(lazyInitData) {
    }

    function _lazyInit(bytes memory lazyInitData) internal override returns (bytes memory lazyInitResponse) {
        (plainUri, dynamicUriResolver, lazyInitResponse) = abi.decode(lazyInitData, (string, address, bytes));
        lazyInitResponse = _dynamicMetadataElementLazyInit(lazyInitResponse);
    }

    function _supportsInterface(bytes4 interfaceId) internal override view returns(bool) {
        return
            interfaceId == type(IDynamicMetadataCapableElement).interfaceId ||
            interfaceId == this.plainUri.selector ||
            interfaceId == this.uri.selector ||
            interfaceId == this.dynamicUriResolver.selector ||
            interfaceId == this.setUri.selector ||
            interfaceId == this.setDynamicUriResolver.selector ||
            _dynamicMetadataElementSupportsInterface(interfaceId);
    }

    function uri() external override view returns(string memory) {
        return _uri(plainUri, "");
    }

    function setUri(string calldata newValue) external override authorizedOnly returns (string memory oldValue) {
        oldValue = plainUri;
        plainUri = newValue;
    }

    function setDynamicUriResolver(address newValue) external override authorizedOnly returns(address oldValue) {
        oldValue = dynamicUriResolver;
        dynamicUriResolver = newValue;
    }

    function _uri(string memory _plainUri, bytes memory additionalData) internal view returns(string memory) {
        if(dynamicUriResolver == address(0)) {
            return _plainUri;
        }
        return IDynamicUriResolver(dynamicUriResolver).resolve(address(this), _plainUri, additionalData, msg.sender);
    }

    function _dynamicMetadataElementLazyInit(bytes memory lazyInitData) internal virtual returns(bytes memory);

    function _dynamicMetadataElementSupportsInterface(bytes4 interfaceId) internal virtual view returns(bool);
}

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

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


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

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

// File: contracts\util\ERC1155CommonLibrary.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



library ERC1155CommonLibrary {
    using ReflectionUtilities for address;

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

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

// File: contracts\impl\ItemMainInterface.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;
//pragma abicoder v2;






contract ItemMainInterface is IItemMainInterface, DynamicMetadataCapableElement {
    using ReflectionUtilities for address;

    bytes32 override public constant TYPEHASH_PERMIT = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    address override public interoperableInterfaceModel;
    address private _itemMainInterfaceSupportsInterfaceImplementer;

    mapping(bytes32 => Header) override public collection;
    mapping(uint256 => ItemData) override public item;
    mapping(address => mapping(address => bool)) public override isApprovedForAll;

    uint256 private _keyIndex;

    mapping(uint256 => uint256[]) private _items;
    uint256 private _itemsLength;
    mapping(uint256 => uint256) private _itemsIndexes;

    mapping(bytes32 => uint256[]) private _batchItems;
    mapping(bytes32 => mapping(uint256 => uint256)) private _batchAmounts;
    bytes32[] private _batchKeys;

    constructor(bytes memory lazyInitData) DynamicMetadataCapableElement(lazyInitData) {
    }

    function _dynamicMetadataElementLazyInit(bytes memory lazyInitData) internal override returns(bytes memory) {
        (interoperableInterfaceModel, _itemMainInterfaceSupportsInterfaceImplementer) = abi.decode(lazyInitData, (address, address));
        return "";
    }

    function _dynamicMetadataElementSupportsInterface(bytes4 interfaceId) internal override view returns (bool) {
        return IERC165(_itemMainInterfaceSupportsInterfaceImplementer).supportsInterface(interfaceId);
        /*return 
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).balanceOf.selector ||
            interfaceId == IItemMainInterface(address(0)).balanceOfBatch.selector ||
            interfaceId == IItemMainInterface(address(0)).setApprovalForAll.selector ||
            interfaceId == IItemMainInterface(address(0)).isApprovedForAll.selector ||
            interfaceId == IItemMainInterface(address(0)).safeTransferFrom.selector ||
            interfaceId == IItemMainInterface(address(0)).safeBatchTransferFrom.selector ||
            interfaceId == 0xd9b67a26 ||//OpenSea Standard
            interfaceId == type(IERC1155Views).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).totalSupply.selector ||
            interfaceId == 0x00ad800c ||//name(uint256)
            interfaceId == 0x4e41a1fb ||//symbol(uint256)
            interfaceId == IItemMainInterface(address(0)).decimals.selector ||
            interfaceId == 0x0e89341c ||//uri(uint256)
            interfaceId == type(Item).interfaceId ||
            interfaceId == 0x06fdde03 ||//name()
            interfaceId == 0x95d89b41 ||//symbol()
            interfaceId == 0xf5298aca ||//burn(address,uint256,uint256)
            interfaceId == 0x6b20c454 ||//burnBatch(address,uint256[],uint256[])
            interfaceId == 0x8a94b05f ||//burn(address,uint256,uint256,bytes)
            interfaceId == 0x5473422e ||//burnBatch(address,uint256[],uint256[],bytes)
            interfaceId == IItemMainInterface(address(0)).mintItems.selector ||
            interfaceId == IItemMainInterface(address(0)).setItemsCollection.selector ||
            interfaceId == IItemMainInterface(address(0)).setItemsMetadata.selector ||
            interfaceId == IItemMainInterface(address(0)).interoperableOf.selector ||
            interfaceId == type(IItemMainInterface).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).interoperableInterfaceModel.selector ||
            interfaceId == IItemMainInterface(address(0)).setInteroperableInterfaceModel.selector ||
            interfaceId == IItemMainInterface(address(0)).collection.selector ||
            interfaceId == IItemMainInterface(address(0)).collectionUri.selector ||
            interfaceId == IItemMainInterface(address(0)).createCollection.selector ||
            interfaceId == IItemMainInterface(address(0)).setCollectionsMetadata.selector ||
            interfaceId == IItemMainInterface(address(0)).item.selector ||
            interfaceId == IItemMainInterface(address(0)).mintTransferOrBurn.selector ||
            interfaceId == IItemMainInterface(address(0)).allowance.selector ||
            interfaceId == IItemMainInterface(address(0)).approve.selector ||
            interfaceId == IItemMainInterface(address(0)).TYPEHASH_PERMIT.selector ||
            interfaceId == IItemMainInterface(address(0)).EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION.selector ||
            interfaceId == IItemMainInterface(address(0)).permit.selector ||
            interfaceId == IItemMainInterface(address(0)).nonces.selector;*/
    }

    function name() override external pure returns(string memory) {
        return "Items";
    }

    function name(uint256 itemId) override external view returns(string memory) {
        return item[itemId].header.name;
    }

    function symbol() override external pure returns(string memory) {
        return "I";
    }

    function symbol(uint256 itemId) override external view returns(string memory) {
        return item[itemId].header.symbol;
    }

    function decimals(uint256) override external pure returns(uint256) {
        return 18;
    }

    function collectionUri(bytes32 collectionId) override external view returns(string memory) {
        return _uri(collection[collectionId].uri, abi.encode(collectionId, 0));
    }

    function uri(uint256 itemId) override external view returns(string memory) {
        ItemData storage itemData = item[itemId];
        return _uri(itemData.header.uri, abi.encode(itemData.collectionId, itemId));
    }

    function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) override external returns(Header[] memory oldValues) {
        oldValues = new Header[](values.length);
        for(uint256 i = 0; i < values.length; i++) {
            Header storage oldValue = collection[collectionIds[i]];
            require((oldValues[i] = oldValue).host == msg.sender, "Unauthorized");
            address newHost = (collection[collectionIds[i]] = _validateHeader(values[i], bytes32(0))).host;
            if(newHost != oldValues[i].host) {
                emit Collection(oldValues[i].host, newHost, collectionIds[i]);
            }
        }
    }

    function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) override external returns(bytes32[] memory oldCollectionIds) {
        oldCollectionIds = new bytes32[](itemIds.length);
        for(uint256 i = 0; i < itemIds.length; i++) {
            ItemData storage itemData = item[itemIds[i]];
            require(collection[oldCollectionIds[i] = itemData.collectionId].host == msg.sender, "Unauthorized");
            require(!_stringIsEmpty(collection[itemData.collectionId = collectionIds[i]].name), "collection");
            emit CollectionItem(oldCollectionIds[i], collectionIds[i], itemIds[i]);
        }
    }

    function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata values) override external returns(Header[] memory oldValues) {
        oldValues = new Header[](values.length);
        for(uint256 i = 0; i < values.length; i++) {
            ItemData storage itemData = item[itemIds[i]];
            oldValues[i] = itemData.header;
            require(collection[itemData.collectionId].host == msg.sender, "Unauthorized");
            itemData.header = _validateHeader(values[i], itemData.collectionId);
            if(keccak256(bytes(itemData.header.uri)) != keccak256(bytes(oldValues[i].uri))) {
                emit URI(itemData.header.uri, itemIds[i]);
            }
        }
    }

    function totalSupply(uint256 itemId) override external view returns(uint256) {
        return item[itemId].totalSupply;
    }

    function balanceOf(address account, uint256 id) override external view returns (uint256) {
        return item[id].balanceOf[account];
    }

    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) override external view returns (uint256[] memory balances) {
        balances = new uint256[](ids.length);
        for(uint256 i = 0; i < balances.length; i++) {
            balances[i] = item[ids[i]].balanceOf[accounts[i]];
        }
    }

    function allowance(address owner, address spender, uint256 itemId) override external view returns (uint256) {
        return isApprovedForAll[owner][spender] ? 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff : item[itemId].allowance[owner][spender];
    }

    function setApprovalForAll(address operator, bool approved) override external {
        isApprovedForAll[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function interoperableOf(uint256 itemId) override external view returns(address) {
        return item[itemId].collectionId == bytes32(0) ? address(0) : address(uint160(itemId));
    }

    function safeTransferFrom(address from, address to, uint256 itemId, uint256 amount, bytes calldata data) override external {
        _mintTransferOrBurn(item[itemId], msg.sender, from, to, itemId, amount, true);
        ERC1155CommonLibrary.doSafeTransferAcceptanceCheck(msg.sender, from, to, itemId, amount, data);
    }

    function safeBatchTransferFrom(address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) override external {
        _mintTransferOrBurn(msg.sender, from, to, itemIds, amounts, false, true);
        ERC1155CommonLibrary.doSafeBatchTransferAcceptanceCheck(msg.sender, from, to, itemIds, amounts, data);
    }

    function burn(address account, uint256 itemId, uint256 amount) override external {
        burn(account, itemId, amount, "");
    }

    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) override external {
        burnBatch(account, itemIds, amounts, "");
    }

    function burn(address account, uint256 itemId, uint256 amount, bytes memory) override public {
        _mintTransferOrBurn(item[itemId], msg.sender, account, address(0), itemId, amount, true);
    }

    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes memory) override public {
        _mintTransferOrBurn(msg.sender, account, address(0), itemIds, amounts, false, true);
    }

    function createCollection(Header calldata _collection, CreateItem[] calldata items) override external returns(bytes32 collectionId, uint256[] memory itemIds) {
        Header storage storageCollection = (collection[collectionId = BehaviorUtilities.randomKey(_keyIndex++)] = _validateHeader(_collection, bytes32(0)));
        require(storageCollection.host != address(0) || items.length > 0, "Empty");
        emit Collection(address(0), storageCollection.host, collectionId);
        itemIds = _createOrMintItems(collectionId, items);
    }

    function mintItems(CreateItem[] calldata items) override external returns(uint256[] memory) {
        return _createOrMintItems(bytes32(0), items);
    }

    function approve(address account, address spender, uint256 amount, uint256 itemId) override external {
        ItemData storage itemData = msg.sender == account ? item[itemId] : _checkItemPermissionAndRetrieveData(itemId);
        require(spender != address(0), "approve to the zero address");
        itemData.allowance[account][spender] = amount;
        if(msg.sender != address(uint160(itemId))) {
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(true, false, abi.encode(account, spender, amount));
        }
    }

    function mintTransferOrBurn(bool isMulti, bytes calldata data) override external {
        if(isMulti) {
            _mintTransferOrBurn(data);
            return;
        }
        (address operator, address sender, address recipient, uint256 itemId, uint256 amount) = abi.decode(data, (address, address, address, uint256, uint256));
        _mintTransferOrBurn(_checkItemPermissionAndRetrieveData(itemId), operator, sender, recipient, itemId, amount, true);
    }

    function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) override external {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
        ItemData storage itemData = item[itemId];
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                itemData.domainSeparator,
                keccak256(abi.encode(TYPEHASH_PERMIT, owner, spender, value, itemData.nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'INVALID_SIGNATURE');
        itemData.allowance[owner][spender] = value;
        if(msg.sender != address(uint160(itemId))) {
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(true, false, abi.encode(owner, spender, value));
        }
    }

    function nonces(address owner, uint256 itemId) external override view returns(uint256) {
        return item[itemId].nonces[owner];
    }

    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() public override pure returns(string memory, string memory) {
        return ("Item", "1");
    }

    function _validateHeader(Header memory header, bytes32 collectionId) private view returns(Header memory) {
        require(!_stringIsEmpty(header.name = _stringIsEmpty(header.name) && collectionId != bytes32(0) ? collection[collectionId].name : header.name), "name");
        require(!_stringIsEmpty(header.symbol = _stringIsEmpty(header.symbol) && collectionId != bytes32(0) ? collection[collectionId].symbol : header.symbol), "symbol");
        require(!_stringIsEmpty(header.uri = _stringIsEmpty(header.uri) && collectionId != bytes32(0) ? collection[collectionId].uri : header.uri), "uri");
        header.host = collectionId != bytes32(0) ? address(0) : header.host;
        return header;
    }

    function _createOrMintItems(bytes32 createdCollectionId, CreateItem[] calldata items) private returns(uint256[] memory itemIds) {
        itemIds = new uint256[](items.length);
        for(uint256 i = 0; i < items.length; i++) {
            CreateItem memory itemToCreate = items[i];
            itemIds[i] = createdCollectionId != bytes32(0) ? 0 : itemToCreate.id;
            itemToCreate.collectionId = createdCollectionId != bytes32(0) ? createdCollectionId : itemToCreate.id != 0 ? item[itemToCreate.id].collectionId : itemToCreate.collectionId;
            require(createdCollectionId != bytes32(0) || (itemToCreate.collectionId != bytes32(0) && msg.sender == collection[itemToCreate.collectionId].host), "Unauthorized");
            if(itemIds[i] == 0) {
                address interoperableInterfaceAddress = interoperableInterfaceModel.clone();
                IItemInteroperableInterface(interoperableInterfaceAddress).init();
                ItemData storage newItem = item[itemIds[i] = uint160(interoperableInterfaceAddress)];
                newItem.collectionId = itemToCreate.collectionId;
                newItem.header = _validateHeader(itemToCreate.header, itemToCreate.collectionId);
                (string memory domainSeparatorName, string memory domainSeparatorVersion) = EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION();
                newItem.domainSeparator = keccak256(
                    abi.encode(
                        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                        keccak256(bytes(domainSeparatorName)),
                        keccak256(bytes(domainSeparatorVersion)),
                        block.chainid,
                        address(uint160(itemIds[i]))
                    )
                );
                emit CollectionItem(bytes32(0), newItem.collectionId, itemIds[i]);
                emit URI(newItem.header.uri, itemIds[i]);
            }
            _mint(itemIds[i], itemToCreate.accounts, itemToCreate.amounts);
        }
    }

    function _mint(uint256 itemId, address[] memory accounts, uint256[] memory amounts) private {
        for(uint256 i = 0; i < accounts.length; i++) {
            require(accounts[i] != address(0), "mint to the zero address");
            _mintTransferOrBurn(address(0), address(0), accounts[i], itemId, amounts[i], false);
        }
        _emitMultiEventsAndClear();
    }

    function _mintTransferOrBurn(bytes memory data) private {
        bool batch;
        (batch, data) = abi.decode(data, (bool, bytes));
        if(batch) {
            _mintTransferOrBurnBatch(data);
        } else {
            (address[] memory origins, address[] memory senders, address[] memory recipients, uint256[] memory itemIds, uint256[] memory amounts) = abi.decode(data, (address[], address[], address[], uint256[], uint256[]));
            for(uint256 i = 0; i < itemIds.length; i++) {
                _mintTransferOrBurn(origins[i], senders[i], recipients[i], itemIds[i], amounts[i], true);
            }
        }
        _emitMultiEventsAndClear();
    }

    function _mintTransferOrBurnBatch(bytes memory data) private {
        bytes[] memory batches = abi.decode(data, (bytes[]));
        for(uint256 i = 0; i < batches.length; i++) {
            (address operator, address sender, address recipient, uint256[] memory itemIds, uint256[] memory amounts) = abi.decode(batches[i], (address, address, address, uint256[], uint256[]));
            _mintTransferOrBurn(operator, sender, recipient, itemIds, amounts, true, false);
        }
    }

    function _mintTransferOrBurn(address operator, address sender, address recipient, uint256[] memory itemIds, uint256[] memory amounts, bool check, bool launchEvents) private {
        for(uint256 i = 0; i < itemIds.length; i++) {
            _mintTransferOrBurn(operator, sender, recipient, itemIds[i], amounts[i], check);
        }
        if(launchEvents) {
            _emitMultiEventsAndClear();
        }
    }

    function _mintTransferOrBurn(address operator, address sender, address recipient, uint256 itemId, uint256 amount, bool check) private {
        if(amount == 0) {
            return;
        }
        uint256 tokenIndex = _itemsIndexes[itemId];
        uint256[] storage items = _items[tokenIndex];
        if(items.length == 0 || items[0] != itemId) {
            items = _items[tokenIndex = _itemsIndexes[itemId] = _itemsLength++];
            items.push(itemId);
        }
        items.push(uint160(sender));
        items.push(uint160(recipient));
        items.push(amount);

        bytes32 key = keccak256(abi.encodePacked(operator, sender, recipient));
        items = _batchItems[key];
        if(items.length == 0) {
            _batchKeys.push(key);
            items.push(uint160(operator));
            items.push(uint160(sender));
            items.push(uint160(recipient));
        }
        if(_batchAmounts[key][itemId] == 0) {
            items.push(itemId);
        }
        _batchAmounts[key][itemId] += amount;
        _mintTransferOrBurn(check ? _checkItemPermissionAndRetrieveData(itemId) : item[itemId], operator, sender, recipient, itemId, amount, false);
    }

    function _mintTransferOrBurn(ItemData storage itemData, address operator, address sender, address recipient, uint256 itemId, uint256 amount, bool launchEvent) private {
        if(sender != address(0)) {
            if(operator != sender) {
                require(itemData.allowance[sender][operator] >= amount || isApprovedForAll[sender][operator], "amount exceeds allowance");
                if(itemData.allowance[sender][operator] >= amount) {
                    itemData.allowance[sender][operator] -= amount;
                } else {
                    delete itemData.allowance[sender][operator];
                }
            }
            require(itemData.balanceOf[sender] >= amount, "amount exceeds balance");
            itemData.balanceOf[sender] -= amount;
        } else {
            itemData.totalSupply += amount;
        }
        if(recipient != address(0)) {
            itemData.balanceOf[recipient] += amount;
        } else {
            itemData.totalSupply -= amount;
        }
        if(launchEvent) {
            emit TransferSingle(operator, sender, recipient, itemId, amount);
            if(itemId != uint160(msg.sender)) {
                IItemInteroperableInterface(address(uint160(itemId))).emitEvent(false, false, abi.encode(sender, recipient, amount));
            }
        }
    }

    function _checkItemPermissionAndRetrieveData(uint256 itemId) private view returns (ItemData storage itemData) {
        require(collection[(itemData = item[itemId]).collectionId].host == msg.sender || uint160(msg.sender) == itemId, "Unauthorized");
    }

    function _stringIsEmpty(string memory test) private pure returns(bool) {
        return keccak256(bytes(test)) == keccak256("");
    }

    function _emitMultiEventsAndClear() private {
        for(uint256 i = 0; i < _itemsLength; i++) {
            uint256[] storage items = _items[i];
            uint256 itemId = items[0];
            delete items[0];
            uint256 length = (items.length - 1) / 3;
            address[] memory senders = new address[](length);
            address[] memory receivers = new address[](length);
            uint256[] memory amounts = new uint256[](length);
            uint256 inc = 0;
            for(uint256 z = 1; z < items.length; z += 3) {
                senders[inc] = address(uint160(items[z]));
                delete items[z];
                receivers[inc] = address(uint160(items[z + 1]));
                delete items[z + 1];
                amounts[inc++] = items[z + 2];
                delete items[z + 2];
            }
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(false, true, abi.encode(senders, receivers, amounts));
            delete _itemsIndexes[itemId];
            delete _items[i];
        }
        delete _itemsLength;
        _emitMultiEventsAndClearBatch();
    }

    function _emitMultiEventsAndClearBatch() private {
        for(uint256 i = 0; i < _batchKeys.length; i++) {
            bytes32 key = _batchKeys[i];
            uint256[] storage items = _batchItems[key];
            uint256 length = items.length - 3;
            address operator = address(uint160(items[0]));
            delete items[0];
            address sender = address(uint160(items[1]));
            delete items[1];
            address receiver = address(uint160(items[2]));
            delete items[2];
            uint256 inc = 0;
            uint256[] memory itemIds = new uint256[](length);
            uint256[] memory amounts = new uint256[](length);
            for(uint256 z = 3; z < items.length; z++) {
                amounts[inc] = _batchAmounts[key][itemIds[inc] = items[z]];
                delete items[z];
                delete _batchAmounts[key][inc++];
            }
            emit TransferBatch(operator, sender, receiver, itemIds, amounts);
            delete _batchItems[key];
        }
        delete _batchKeys;
    }

    function _subjectIsAuthorizedFor(address, address location, bytes4 selector, bytes calldata, uint256) internal virtual override view returns(bool, bool) {
        if(location == address(this) && selector == this.setDynamicUriResolver.selector) {
            return (true, false);
        }
        return (false, false);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"name":"Collection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"fromCollectionId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"toCollectionId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"CollectionItem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Host","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"TYPEHASH_PERMIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collection","outputs":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"name":"collectionUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"_collection","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct CreateItem[]","name":"items","type":"tuple[]"}],"name":"createCollection","outputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dynamicUriResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"host","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interoperableInterfaceModel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"interoperableOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"name":"item","outputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"name":"lazyInit","outputs":[{"internalType":"bytes","name":"lazyInitResponse","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct CreateItem[]","name":"items","type":"tuple[]"}],"name":"mintItems","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isMulti","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintTransferOrBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"plainUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"itemIds","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":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"collectionIds","type":"bytes32[]"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"values","type":"tuple[]"}],"name":"setCollectionsMetadata","outputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"oldValues","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setDynamicUriResolver","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setHost","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"collectionIds","type":"bytes32[]"}],"name":"setItemsCollection","outputs":[{"internalType":"bytes32[]","name":"oldCollectionIds","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"values","type":"tuple[]"}],"name":"setItemsMetadata","outputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"oldValues","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newValue","type":"string"}],"name":"setUri","outputs":[{"internalType":"string","name":"oldValue","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"address","name":"location","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"subjectIsAuthorizedFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620064f6380380620064f6833981016040819052620000349162000408565b80806000815111156200004e576200004c8162000057565b505b5050506200052f565b6000546060906001600160a01b031615620000a75760405162461bcd60e51b81526004016200009e906020808252600490820152631a5b9a5d60e21b604082015260600190565b60405180910390fd5b600080546001600160a01b031916331790558151620000d09083016020908101908401620003b4565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a362000128816200012e565b92915050565b60608180602001905181019062000146919062000448565b600380546001600160a01b0319166001600160a01b038416179055825190935083906200017b906002906020860190620001eb565b5050505062000128816200019060201b60201c565b606081806020019051810190620001a891906200037c565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b828054620001f990620004dc565b90600052602060002090601f0160209004810192826200021d576000855562000268565b82601f106200023857805160ff191683800117855562000268565b8280016001018555821562000268579182015b82811115620002685782518255916020019190600101906200024b565b50620002769291506200027a565b5090565b5b808211156200027657600081556001016200027b565b60006001600160401b0380841115620002ae57620002ae62000519565b604051601f8501601f19908116603f01168101908282118183101715620002d957620002d962000519565b81604052809350858152868686011115620002f357600080fd5b600092505b8583101562000318578285015160208483010152602083019250620002f8565b858311156200032b576000602087830101525b5050509392505050565b80516001600160a01b03811681146200034d57600080fd5b919050565b600082601f8301126200036457600080fd5b620003758383516020850162000291565b9392505050565b600080604083850312156200039057600080fd5b6200039b8362000335565b9150620003ab6020840162000335565b90509250929050565b60008060408385031215620003c857600080fd5b620003d38362000335565b60208401519092506001600160401b03811115620003f057600080fd5b620003fe8582860162000352565b9150509250929050565b6000602082840312156200041b57600080fd5b81516001600160401b038111156200043257600080fd5b620004408482850162000352565b949350505050565b6000806000606084860312156200045e57600080fd5b83516001600160401b03808211156200047657600080fd5b818601915086601f8301126200048b57600080fd5b6200049c8783516020850162000291565b9450620004ac6020870162000335565b93506040860151915080821115620004c357600080fd5b50620004d28682870162000352565b9150509250925092565b600181811c90821680620004f157607f821691505b602082108114156200051357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b615fb7806200053f6000396000f3fe608060405234801561001057600080fd5b506004361061027d5760003560e01c80636b20c4541161015c578063c1854355116100ce578063e6daf92411610087578063e6daf92414610662578063e985e9c514610678578063eac989f8146106a6578063f242432a146106ae578063f437bc59146106c1578063f5298aca146106d457600080fd5b8063c1854355146105e7578063c71bf12d146105fa578063c85e0be214610602578063ccfec2fb14610615578063cd6e1d7c14610628578063da95dccf1461063b57600080fd5b80639485fe72116101205780639485fe721461055b57806395d89b411461056e5780639b642de11461058b5780639ce110d71461059e578063a22cb465146105b1578063bd85b039146105c457600080fd5b80636b20c454146104df5780637f7eeb86146104f2578063843d32d914610512578063898e6219146105255780638a94b05f1461054857600080fd5b80633f47e662116101f55780634e41a1fb116101b95780634e41a1fb14610439578063502e1a161461044c5780635473422e146104855780635611d4e914610498578063598af9e7146104b957806359ded0fe146104cc57600080fd5b80633f47e662146103cc57806341607140146103e0578063457f4bcc146104005780634dc5ecb3146104135780634e1273f41461042657600080fd5b80630a193026116102475780630a1930261461033b5780630c32d758146103505780630e89341c146103705780632d7f1d2b146103835780632eb2c2d61461039657806336a6802f146103a957600080fd5b8062ad800c14610282578062fdd58e146102ab57806301ffc9a7146102cc57806303fbd7fd146102ef57806306fdde031461031a575b600080fd5b6102956102903660046153b4565b6106e7565b6040516102a29190615ac8565b60405180910390f35b6102be6102b9366004615060565b61078c565b6040519081526020016102a2565b6102df6102da3660046153cd565b6107b8565b60405190151581526020016102a2565b6103026102fd366004614afb565b61089a565b6040516001600160a01b0390911681526020016102a2565b6040805180820190915260058152644974656d7360d81b6020820152610295565b61034e610349366004615342565b6108ec565b005b61036361035e366004615123565b610974565b6040516102a291906159c6565b61029561037e3660046153b4565b610dda565b600454610302906001600160a01b031681565b61034e6103a4366004614cc9565b610eb6565b6103bc6103b73660046153b4565b610f3a565b6040516102a294939291906158f4565b6102be6103da3660046153b4565b50601290565b6103f36103ee3660046152e4565b611105565b6040516102a29190615a28565b61029561040e366004615407565b611113565b61034e610421366004614e4b565b611154565b6103f3610434366004615123565b6112a4565b6102956104473660046153b4565b61139d565b6102be61045a366004615060565b60009081526007602090815260408083206001600160a01b0394909416835260099093019052205490565b61034e610493366004614f8e565b6113bd565b6104ab6104a63660046154e6565b611439565b6040516102a2929190615a83565b6102be6104c7366004614e0a565b611590565b61034e6104da366004615549565b611603565b61034e6104ed366004614f0c565b6118e1565b610505610500366004615123565b6118fe565b6040516102a29190615982565b6102956105203660046153b4565b611b72565b6105386105333660046153b4565b611c33565b6040516102a29493929190615a9c565b61034e6105563660046150c1565b611e31565b610363610569366004615123565b611e56565b6040805180820190915260018152604960f81b6020820152610295565b610295610599366004615407565b612291565b600054610302906001600160a01b031681565b61034e6105bf366004615032565b61235c565b6102be6105d23660046153b4565b60009081526007602052604090206006015490565b6103026105f53660046153b4565b6123c8565b6102956123ea565b610302610610366004614afb565b612478565b600354610302906001600160a01b031681565b6102df610636366004614d87565b6124ef565b6102be7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61066a612642565b6040516102a2929190615adb565b6102df610686366004614c9b565b600860209081526000928352604080842090915290825290205460ff1681565b610295612678565b61034e6106bc366004614e91565b612722565b600154610302906001600160a01b031681565b61034e6106e236600461508c565b61274f565b600081815260076020526040902060020180546060919061070790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461073390615de5565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b50505050509050919050565b60008181526007602081815260408084206001600160a01b038716855290920190529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e957506001600160e01b031982166301ffc9a760e01b145b8061080457506001600160e01b03198216630a267c7760e21b145b8061081f57506001600160e01b0319821663115fd2f360e21b145b8061083a57506001600160e01b03198216639ce110d760e01b145b8061085557506001600160e01b0319821663335b875f60e21b145b8061087057506001600160e01b0319821663f437bc5960e01b145b8061088b57506001600160e01b0319821663642f05f160e11b145b806107b257506107b28261276a565b60006108a4612816565b6108c95760405162461bcd60e51b81526004016108c090615bf3565b60405180910390fd5b50600380546001600160a01b039283166001600160a01b03198216179091551690565b82156109365761093182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061283392505050565b505050565b60008080808061094886880188614bf0565b9450945094509450945061096a61095e83612944565b86868686866001612998565b5050505050505050565b6060816001600160401b0381111561098e5761098e615e8d565b6040519080825280602002602001820160405280156109c757816020015b6109b46145cb565b8152602001906001900390816109ac5790505b50905060005b82811015610dd1576000600660008888858181106109ed576109ed615e77565b6020908102929092013583525081810192909252604090810160002081516080810190925280546001600160a01b03168252600181018054919450339385929084019190610a3a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690615de5565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600282018054610acc90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615de5565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600382018054610b5e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90615de5565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b505050505081525050848481518110610bf257610bf2615e77565b60200260200101819052600001516001600160a01b031614610c265760405162461bcd60e51b81526004016108c090615bcd565b6000610c5f868685818110610c3d57610c3d615e77565b9050602002810190610c4f9190615c2f565b610c5890615dad565b6000612d13565b600660008a8a87818110610c7557610c75615e77565b6020908102929092013583525081810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781558282015180519192610cc5926001850192909101906145fc565b5060408201518051610ce19160028401916020909101906145fc565b5060608201518051610cfd9160038401916020909101906145fc565b505485516001600160a01b03909116925085915084908110610d2157610d21615e77565b6020026020010151600001516001600160a01b0316816001600160a01b031614610dbc57878784818110610d5757610d57615e77565b90506020020135816001600160a01b0316858581518110610d7a57610d7a615e77565b6020026020010151600001516001600160a01b03167ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae60405160405180910390a45b50508080610dc990615e46565b9150506109cd565b50949350505050565b600081815260076020526040902060048101805460609291610eaf91610dff90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615de5565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b50508554604051610e9b9450909250889150602001918252602082015260400190565b60405160208183030381529060405261304b565b9392505050565b610f2933898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201829052509250600191506130ef9050565b61096a33898989898989898961315c565b600660205260009081526040902080546001820180546001600160a01b039092169291610f6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9290615de5565b8015610fdf5780601f10610fb457610100808354040283529160200191610fdf565b820191906000526020600020905b815481529060010190602001808311610fc257829003601f168201915b505050505090806002018054610ff490615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461102090615de5565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b50505050509080600301805461108290615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546110ae90615de5565b80156110fb5780601f106110d0576101008083540402835291602001916110fb565b820191906000526020600020905b8154815290600101906020018083116110de57829003601f168201915b5050505050905084565b6060610eaf600084846132e0565b6060610eaf83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061371e92505050565b6000336001600160a01b038616146111745761116f82612944565b611183565b60008281526007602052604090205b90506001600160a01b0384166111db5760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f2061646472657373000000000060448201526064016108c0565b6001600160a01b0385811660009081526008830160209081526040808320888516845290915290208490558216331461129d57604080516001600160a01b038781166020830152868116828401526060808301879052835180840390910181526080830193849052636952b02f60e11b90935284169163d2a5605e9161126a9160019160009190608401615a60565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505b5050505050565b6060816001600160401b038111156112be576112be615e8d565b6040519080825280602002602001820160405280156112e7578160200160208202803683370190505b50905060005b8151811015610dd1576007600085858481811061130c5761130c615e77565b905060200201358152602001908152602001600020600701600087878481811061133857611338615e77565b905060200201602081019061134d9190614afb565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061138057611380615e77565b60209081029190910101528061139581615e46565b9150506112ed565b600081815260076020526040902060030180546060919061070790615de5565b6114313387600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201829052509250600191506130ef9050565b505050505050565b600060608161144a610c5887615dad565b6009805460069160009161146b918361146283615e46565b919050556137e0565b8082526020808301939093526040909101600020835181546001600160a01b0319166001600160a01b0390911617815583830151805192975090926114b8926001850192909101906145fc565b50604082015180516114d49160028401916020909101906145fc565b50606082015180516114f09160038401916020909101906145fc565b5080549092506001600160a01b0316151590508061150d57508315155b6115415760405162461bcd60e51b8152602060048201526005602482015264456d70747960d81b60448201526064016108c0565b805460405184916001600160a01b0316906000907ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae908290a46115858386866132e0565b915050935093915050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081205460ff166115f75760008281526007602090815260408083206001600160a01b0380891685526008909101835281842090871684529091529020546115fb565b6000195b949350505050565b834211156116535760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108c0565b600088815260076020908152604080832060058101546001600160a01b038c168552600982019093529083208054919392917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190876116b883615e46565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012060405160200161173192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561179c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117d25750896001600160a01b0316816001600160a01b0316145b6118125760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016108c0565b6001600160a01b038a8116600090815260088501602090815260408083208d8516845290915290208990558b1633146118d457604080516001600160a01b038c811660208301528b81168284015260608083018c9052835180840390910181526080830193849052636952b02f60e11b9093528d169163d2a5605e916118a19160019160009190608401615a60565b600060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050505b5050505050505050505050565b61129d8585858585604051806020016040528060008152506113bd565b6060836001600160401b0381111561191857611918615e8d565b604051908082528060200260200182016040528015611941578160200160208202803683370190505b50905060005b84811015610dd15760006007600088888581811061196757611967615e77565b9050602002013581526020019081526020016000209050336001600160a01b03166006600083600001548686815181106119a3576119a3615e77565b6020908102919091018101829052908252810191909152604001600020546001600160a01b0316146119e75760405162461bcd60e51b81526004016108c090615bcd565b611aad60066000878786818110611a0057611a00615e77565b905060200201358460000181905581526020019081526020016000206001018054611a2a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690615de5565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b5050505050613862565b15611ae75760405162461bcd60e51b815260206004820152600a60248201526931b7b63632b1ba34b7b760b11b60448201526064016108c0565b868683818110611af957611af9615e77565b90506020020135858584818110611b1257611b12615e77565b90506020020135848481518110611b2b57611b2b615e77565b60200260200101517f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a60405160405180910390a45080611b6a81615e46565b915050611947565b600081815260066020526040902060030180546060916107b291611b9590615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc190615de5565b8015611c0e5780601f10611be357610100808354040283529160200191611c0e565b820191906000526020600020905b815481529060010190602001808311611bf157829003601f168201915b5050505050836000604051602001610e9b92919091825260ff16602082015260400190565b60076020908152600091825260409182902080548351608081019094526001820180546001600160a01b0316855260028301805492959394919291840191611c7a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca690615de5565b8015611cf35780601f10611cc857610100808354040283529160200191611cf3565b820191906000526020600020905b815481529060010190602001808311611cd657829003601f168201915b50505050508152602001600282018054611d0c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3890615de5565b8015611d855780601f10611d5a57610100808354040283529160200191611d85565b820191906000526020600020905b815481529060010190602001808311611d6857829003601f168201915b50505050508152602001600382018054611d9e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90615de5565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b505050505081525050908060050154908060060154905084565b6000838152600760205260408120611e50913390879087876001612998565b50505050565b6060816001600160401b03811115611e7057611e70615e8d565b604051908082528060200260200182016040528015611ea957816020015b611e966145cb565b815260200190600190039081611e8e5790505b50905060005b82811015610dd157600060076000888885818110611ecf57611ecf615e77565b9050602002013581526020019081526020016000209050806001016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182018054611f3490615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6090615de5565b8015611fad5780601f10611f8257610100808354040283529160200191611fad565b820191906000526020600020905b815481529060010190602001808311611f9057829003601f168201915b50505050508152602001600282018054611fc690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff290615de5565b801561203f5780601f106120145761010080835404028352916020019161203f565b820191906000526020600020905b81548152906001019060200180831161202257829003601f168201915b5050505050815260200160038201805461205890615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461208490615de5565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b5050505050815250508383815181106120ec576120ec615e77565b60209081029190910181019190915281546000908152600690915260409020546001600160a01b031633146121335760405162461bcd60e51b81526004016108c090615bcd565b61216a85858481811061214857612148615e77565b905060200281019061215a9190615c2f565b61216390615dad565b8254612d13565b80516001830180546001600160a01b0319166001600160a01b0390921691909117815560208083015180516121a592600287019201906145fc565b50604082015180516121c19160028401916020909101906145fc565b50606082015180516121dd9160038401916020909101906145fc565b509050508282815181106121f3576121f3615e77565b602002602001015160600151805190602001208160010160030160405161221a919061573e565b60405180910390201461227e5786868381811061223957612239615e77565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826001016003016040516122759190615b00565b60405180910390a25b508061228981615e46565b915050611eaf565b606061229b612816565b6122b75760405162461bcd60e51b81526004016108c090615bf3565b600280546122c490615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546122f090615de5565b801561233d5780601f106123125761010080835404028352916020019161233d565b820191906000526020600020905b81548152906001019060200180831161232057829003601f168201915b50505050509050828260029190612355929190614680565b5092915050565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260076020526040812054156123e257816107b2565b600092915050565b600280546123f790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461242390615de5565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b505050505081565b6000612482612816565b61249e5760405162461bcd60e51b81526004016108c090615bf3565b50600180546001600160a01b0319166001600160a01b038316908117909155604051819081907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080600061250289898989898961388f565b9150915081156125155791506126389050565b6001546001600160a01b038a81169116141561253657600192505050612638565b60015461254b906001600160a01b03166138dd565b61255a57600092505050612638565b60015460405160009182916001600160a01b039091169063335b875f60e21b90612592908e908e908e908e908e908e90602401615814565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125d09190615722565b600060405180830381855afa9150503d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b50915091508180156126315750808060200190518101906126319190615325565b9450505050505b9695505050505050565b60408051808201825260048152634974656d60e01b602080830191909152825180840190935260018352603160f81b9083015291565b606061271d6002805461268a90615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690615de5565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b50505050506040518060200160405280600081525061304b565b905090565b60008481526007602052604090206127409033888888886001612998565b611431338787878787876138fc565b61093183838360405180602001604052806000815250611e31565b60006001600160e01b03198216633cd9a01960e11b148061279b57506001600160e01b0319821663c71bf12d60e01b145b806127b657506001600160e01b03198216631d59313f60e31b145b806127d157506001600160e01b0319821663ccfec2fb60e01b145b806127ec57506001600160e01b03198216639b642de160e01b145b8061280757506001600160e01b031982166303fbd7fd60e01b145b806107b257506107b2826139cf565b600061271d33306000356001600160e01b031916600036346124ef565b6000818060200190518101906128499190615396565b9250905080156128615761285c82613a55565b612938565b60008060008060008680602001905181019061287d919061518e565b9450945094509450945060005b82518110156129315761291f8682815181106128a8576128a8615e77565b60200260200101518683815181106128c2576128c2615e77565b60200260200101518684815181106128dc576128dc615e77565b60200260200101518685815181106128f6576128f6615e77565b602002602001015186868151811061291057612910615e77565b60200260200101516001613ae1565b8061292981615e46565b91505061288a565b5050505050505b612940613d2e565b5050565b6000818152600760209081526040808320805484526006909252909120546001600160a01b031633148061297757503382145b6129935760405162461bcd60e51b81526004016108c090615bcd565b919050565b6001600160a01b03851615612b9c57846001600160a01b0316866001600160a01b031614612b04576001600160a01b0380861660009081526008890160209081526040808320938a168352929052205482111580612a1b57506001600160a01b038086166000908152600860209081526040808320938a168352929052205460ff165b612a675760405162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320616c6c6f77616e6365000000000000000060448201526064016108c0565b6001600160a01b0380861660009081526008890160209081526040808320938a16835292905220548211612ad9576001600160a01b0380861660009081526008890160209081526040808320938a1683529290529081208054849290612ace908490615cf1565b90915550612b049050565b6001600160a01b0380861660009081526008890160209081526040808320938a168352929052908120555b6001600160a01b0385166000908152600788016020526040902054821115612b675760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108c0565b6001600160a01b038516600090815260078801602052604081208054849290612b91908490615cf1565b90915550612bb69050565b81876006016000828254612bb09190615cb7565b90915550505b6001600160a01b03841615612bfa576001600160a01b038416600090815260078801602052604081208054849290612bef908490615cb7565b90915550612c149050565b81876006016000828254612c0e9190615cf1565b90915550505b8015612d0a57836001600160a01b0316856001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612c72929190918252602082015260400190565b60405180910390a4338314612d0a57604080516001600160a01b038781166020830152868116828401526060808301869052835180840390910181526080830193849052636952b02f60e11b90935285169163d2a5605e91612cdc91600091829190608401615a60565b600060405180830381600087803b158015612cf657600080fd5b505af11580156118d4573d6000803e3d6000fd5b50505050505050565b612d1b6145cb565b612deb612d2b8460200151613862565b8015612d3657508215155b612d44578360200151612ddf565b60008381526006602052604090206001018054612d6090615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8c90615de5565b8015612dd95780601f10612dae57610100808354040283529160200191612dd9565b820191906000526020600020905b815481529060010190602001808311612dbc57829003601f168201915b50505050505b84602001819052613862565b15612e215760405162461bcd60e51b81526004016108c0906020808252600490820152636e616d6560e01b604082015260600190565b612ef1612e318460400151613862565b8015612e3c57508215155b612e4a578360400151612ee5565b60008381526006602052604090206002018054612e6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9290615de5565b8015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b50505050505b84604001819052613862565b15612f275760405162461bcd60e51b81526020600482015260066024820152651cde5b589bdb60d21b60448201526064016108c0565b612ff7612f378460600151613862565b8015612f4257508215155b612f50578360600151612feb565b60008381526006602052604090206003018054612f6c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9890615de5565b8015612fe55780601f10612fba57610100808354040283529160200191612fe5565b820191906000526020600020905b815481529060010190602001808311612fc857829003601f168201915b50505050505b84606001819052613862565b1561302a5760405162461bcd60e51b815260206004820152600360248201526275726960e81b60448201526064016108c0565b81613036578251613039565b60005b6001600160a01b031683525090919050565b6003546060906001600160a01b03166130655750816107b2565b60035460405163f709c9b760e01b81526001600160a01b039091169063f709c9b79061309b9030908790879033906004016158ab565b60006040518083038186803b1580156130b357600080fd5b505afa1580156130c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eaf919081019061543c565b60005b845181101561314d5761313b88888888858151811061311357613113615e77565b602002602001015188868151811061312d5761312d615e77565b602002602001015188613ae1565b8061314581615e46565b9150506130f2565b508015612d0a57612d0a613d2e565b61316e876001600160a01b03166138dd565b156112985760405163bc197c8160e01b81526001600160a01b0388169063bc197c81906131ad908c908c908b908b908b908b908b908b906004016157b0565b602060405180830381600087803b1580156131c757600080fd5b505af19250505080156131f7575060408051601f3d908101601f191682019092526131f4918101906153ea565b60015b6132a457613203615ea3565b806308c379a0141561323d5750613218615ebf565b80613223575061323f565b8060405162461bcd60e51b81526004016108c09190615ac8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108c0565b6001600160e01b0319811663bc197c8160e01b146132d45760405162461bcd60e51b81526004016108c090615b85565b50505050505050505050565b6060816001600160401b038111156132fa576132fa615e8d565b604051908082528060200260200182016040528015613323578160200160208202803683370190505b50905060005b8281101561371657600084848381811061334557613345615e77565b90506020028101906133579190615c19565b61336090615d08565b905085613371578060400151613374565b60005b83838151811061338657613386615e77565b6020908102919091010152856133c05760408101516133a95780602001516133c2565b6040808201516000908152600760205220546133c2565b855b6020820152851515806133ff57506020810151158015906133ff57506020818101516000908152600690915260409020546001600160a01b031633145b61341b5760405162461bcd60e51b81526004016108c090615bcd565b82828151811061342d5761342d615e77565b6020026020010151600014156136d757600454600090613455906001600160a01b03166140cf565b9050806001600160a01b031663e1c7392a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561349257600080fd5b505af11580156134a6573d6000803e3d6000fd5b50505050600060076000836001600160a01b03168787815181106134cc576134cc615e77565b6020026020010181815250815260200190815260200160002090508260200151816000018190555061350683600001518460200151612d13565b80516001830180546001600160a01b0319166001600160a01b03909216919091178155602080830151805161354192600287019201906145fc565b506040820151805161355d9160028401916020909101906145fc565b50606082015180516135799160038401916020909101906145fc565b50905050600080613588612642565b915091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82805190602001208280519060200120468a8a815181106135d0576135d0615e77565b60200260200101516040516020016136139594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405160208183030381529060405280519060200120836005018190555086868151811061364357613643615e77565b602090810291909101015183546040516000907f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a908290a486868151811061368d5761368d615e77565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846001016003016040516136ca9190615b00565b60405180910390a2505050505b6137038383815181106136ec576136ec615e77565b602002602001015182606001518360800151614111565b508061370e81615e46565b915050613329565b509392505050565b6000546060906001600160a01b0316156137635760405162461bcd60e51b81526004016108c0906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b03191633179055815161378a9083016020908101908401614c4b565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a36107b2816141f6565b6000814243323a4144336137f5600587615cf1565b60408051602081019a909a5289019790975260608801959095526001600160a01b03938416608088015260a0870192909252821660c086015260e0850152166101008301524061012082015261014001604051602081830303815290604052805190602001209050919050565b80516020909101207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b6000806001600160a01b038716301480156138ba57506001600160e01b031986166303fbd7fd60e01b145b156138cb57506001905060006138d2565b5060009050805b965096945050505050565b60006001600160a01b0382166138f557506000919050565b503b151590565b61390e856001600160a01b03166138dd565b15612d0a5760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613949908a908a908990899089908990600401615864565b602060405180830381600087803b15801561396357600080fd5b505af1925050508015613993575060408051601f3d908101601f19168201909252613990918101906153ea565b60015b61399f57613203615ea3565b6001600160e01b0319811663f23a6e6160e01b1461096a5760405162461bcd60e51b81526004016108c090615b85565b6005546040516301ffc9a760e01b81526001600160e01b0319831660048201526000916001600160a01b0316906301ffc9a79060240160206040518083038186803b158015613a1d57600080fd5b505afa158015613a31573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b29190615325565b600081806020019051810190613a6b9190615223565b905060005b8151811015610931576000806000806000868681518110613a9357613a93615e77565b6020026020010151806020019051810190613aae9190614b52565b94509450945094509450613ac98585858585600160006130ef565b50505050508080613ad990615e46565b915050613a70565b81613aeb57611431565b6000838152600c6020908152604080832054808452600a90925290912080541580613b3357508481600081548110613b2557613b25615e77565b906000526020600020015414155b15613b8f57600b8054600a916000919082613b4d83615e46565b909155506000888152600c6020908152604080832084905583855284820195909552929093018320805460018101825581855292909320909101879055925090505b805460018082018355600083815260208082206001600160a01b038c81169582019590955585548085018755948b169481019490945584549283019094559101859055604080516bffffffffffffffffffffffff1960608c811b8216838701528b811b821660348401528a901b1660488201528151808203603c018152605c9091018252805190840120808352600d90935290208054909190613c9b57600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201829055825480820184556000848152602090206001600160a01b03808d1692820192909255845480840186558b831690820155845492830185559089169101555b6000818152600e60209081526040808320898452909152902054613ccf578154600181018355600083815260209020018690555b6000818152600e6020908152604080832089845290915281208054879290613cf8908490615cb7565b90915550611298905084613d19576000878152600760205260409020613d22565b613d2287612944565b8a8a8a8a8a6000612998565b60005b600b548110156140bf576000818152600a60205260408120805490919082908290613d5e57613d5e615e77565b9060005260206000200154905081600081548110613d7e57613d7e615e77565b600091825260208220018190558254600390613d9c90600190615cf1565b613da69190615ccf565b90506000816001600160401b03811115613dc257613dc2615e8d565b604051908082528060200260200182016040528015613deb578160200160208202803683370190505b5090506000826001600160401b03811115613e0857613e08615e8d565b604051908082528060200260200182016040528015613e31578160200160208202803683370190505b5090506000836001600160401b03811115613e4e57613e4e615e8d565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050600060015b8754811015613ff557878181548110613e9a57613e9a615e77565b9060005260206000200154858381518110613eb757613eb7615e77565b60200260200101906001600160a01b031690816001600160a01b031681525050878181548110613ee957613ee9615e77565b600091825260208220015587613f00826001615cb7565b81548110613f1057613f10615e77565b9060005260206000200154848381518110613f2d57613f2d615e77565b6001600160a01b039092166020928302919091019091015287613f51826001615cb7565b81548110613f6157613f61615e77565b600091825260208220015587613f78826002615cb7565b81548110613f8857613f88615e77565b9060005260206000200154838380613f9f90615e46565b945081518110613fb157613fb1615e77565b602090810291909101015287613fc8826002615cb7565b81548110613fd857613fd8615e77565b6000918252602082200155613fee600382615cb7565b9050613e7f565b50856001600160a01b031663d2a5605e6000600187878760405160200161401e93929190615949565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161404b93929190615a60565b600060405180830381600087803b15801561406557600080fd5b505af1158015614079573d6000803e3d6000fd5b5050506000878152600c602090815260408083208390558b8352600a90915281206140a59250906146f4565b5050505050505080806140b790615e46565b915050613d31565b506000600b556140cd61424c565b565b60006901000000000000000000820268803b80938091923cf36258807360e81b01176000526020600080f09050803b80156141095761410b565bfe5b50919050565b60005b82518110156141ed5760006001600160a01b031683828151811061413a5761413a615e77565b60200260200101516001600160a01b031614156141995760405162461bcd60e51b815260206004820152601860248201527f6d696e7420746f20746865207a65726f2061646472657373000000000000000060448201526064016108c0565b6141db6000808584815181106141b1576141b1615e77565b6020026020010151878686815181106141cc576141cc615e77565b60200260200101516000613ae1565b806141e581615e46565b915050614114565b50610931613d2e565b60608180602001905181019061420c9190615470565b600380546001600160a01b0319166001600160a01b0384161790558251909350839061423f9060029060208601906145fc565b505050506107b281614572565b60005b600f54811015614565576000600f828154811061426e5761426e615e77565b6000918252602080832090910154808352600d909152604082208054919350919061429b90600390615cf1565b90506000826000815481106142b2576142b2615e77565b90600052602060002001549050826000815481106142d2576142d2615e77565b90600052602060002001600090556000836001815481106142f5576142f5615e77565b906000526020600020015490508360018154811061431557614315615e77565b906000526020600020016000905560008460028154811061433857614338615e77565b906000526020600020015490508460028154811061435857614358615e77565b9060005260206000200160009055600080856001600160401b0381111561438157614381615e8d565b6040519080825280602002602001820160405280156143aa578160200160208202803683370190505b5090506000866001600160401b038111156143c7576143c7615e8d565b6040519080825280602002602001820160405280156143f0578160200160208202803683370190505b50905060035b88548110156144da57600e60008b815260200190815260200160002060008a838154811061442657614426615e77565b906000526020600020015485878151811061444357614443615e77565b602002602001018181525081526020019081526020016000205482858151811061446f5761446f615e77565b60200260200101818152505088818154811061448d5761448d615e77565b600091825260208083209091018290558b8252600e90526040812090856144b381615e46565b965081526020019081526020016000206000905580806144d290615e46565b9150506143f6565b50836001600160a01b0316856001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb858560405161452a929190615a3b565b60405180910390a46000898152600d60205260408120614549916146f4565b505050505050505050808061455d90615e46565b91505061424f565b506140cd600f60006146f4565b6060818060200190518101906145889190614b18565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b82805461460890615de5565b90600052602060002090601f01602090048101928261462a5760008555614670565b82601f1061464357805160ff1916838001178555614670565b82800160010185558215614670579182015b82811115614670578251825591602001919060010190614655565b5061467c929150614715565b5090565b82805461468c90615de5565b90600052602060002090601f0160209004810192826146ae5760008555614670565b82601f106146c75782800160ff19823516178555614670565b82800160010185558215614670579182015b828111156146705782358255916020019190600101906146d9565b50805460008255906000526020600020908101906147129190614715565b50565b5b8082111561467c5760008155600101614716565b803561299381615f48565b60008083601f84011261474757600080fd5b5081356001600160401b0381111561475e57600080fd5b6020830191508360208260051b850101111561477957600080fd5b9250929050565b600082601f83011261479157600080fd5b8135602061479e82615c6d565b6040516147ab8282615e1a565b8381528281019150858301600585901b870184018810156147cb57600080fd5b60005b858110156147f35781356147e181615f48565b845292840192908401906001016147ce565b5090979650505050505050565b600082601f83011261481157600080fd5b8151602061481e82615c6d565b60405161482b8282615e1a565b8381528281019150858301600585901b8701840188101561484b57600080fd5b60005b858110156147f357815161486181615f48565b8452928401929084019060010161484e565b600082601f83011261488457600080fd5b8135602061489182615c6d565b60405161489e8282615e1a565b8381528281019150858301600585901b870184018810156148be57600080fd5b60005b858110156147f3578135845292840192908401906001016148c1565b600082601f8301126148ee57600080fd5b815160206148fb82615c6d565b6040516149088282615e1a565b8381528281019150858301600585901b8701840188101561492857600080fd5b60005b858110156147f35781518452928401929084019060010161492b565b60008083601f84011261495957600080fd5b5081356001600160401b0381111561497057600080fd5b60208301915083602082850101111561477957600080fd5b600082601f83011261499957600080fd5b81356149a481615c90565b6040516149b18282615e1a565b8281528560208487010111156149c657600080fd5b82602086016020830137600092810160200192909252509392505050565b600082601f8301126149f557600080fd5b8151614a0081615c90565b604051614a0d8282615e1a565b828152856020848701011115614a2257600080fd5b614a33836020830160208801615db9565b95945050505050565b600060808284031215614a4e57600080fd5b604051608081016001600160401b038282108183111715614a7157614a71615e8d565b81604052829350614a818561472a565b83526020850135915080821115614a9757600080fd5b614aa386838701614988565b60208401526040850135915080821115614abc57600080fd5b614ac886838701614988565b60408401526060850135915080821115614ae157600080fd5b50614aee85828601614988565b6060830152505092915050565b600060208284031215614b0d57600080fd5b8135610eaf81615f48565b60008060408385031215614b2b57600080fd5b8251614b3681615f48565b6020840151909250614b4781615f48565b809150509250929050565b600080600080600060a08688031215614b6a57600080fd5b8551614b7581615f48565b6020870151909550614b8681615f48565b6040870151909450614b9781615f48565b60608701519093506001600160401b0380821115614bb457600080fd5b614bc089838a016148dd565b93506080880151915080821115614bd657600080fd5b50614be3888289016148dd565b9150509295509295909350565b600080600080600060a08688031215614c0857600080fd5b8535614c1381615f48565b94506020860135614c2381615f48565b93506040860135614c3381615f48565b94979396509394606081013594506080013592915050565b60008060408385031215614c5e57600080fd5b8251614c6981615f48565b60208401519092506001600160401b03811115614c8557600080fd5b614c91858286016149e4565b9150509250929050565b60008060408385031215614cae57600080fd5b8235614cb981615f48565b91506020830135614b4781615f48565b60008060008060008060008060a0898b031215614ce557600080fd5b8835614cf081615f48565b97506020890135614d0081615f48565b965060408901356001600160401b0380821115614d1c57600080fd5b614d288c838d01614735565b909850965060608b0135915080821115614d4157600080fd5b614d4d8c838d01614735565b909650945060808b0135915080821115614d6657600080fd5b50614d738b828c01614947565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215614da057600080fd5b8635614dab81615f48565b95506020870135614dbb81615f48565b94506040870135614dcb81615f6b565b935060608701356001600160401b03811115614de657600080fd5b614df289828a01614947565b979a9699509497949695608090950135949350505050565b600080600060608486031215614e1f57600080fd5b8335614e2a81615f48565b92506020840135614e3a81615f48565b929592945050506040919091013590565b60008060008060808587031215614e6157600080fd5b8435614e6c81615f48565b93506020850135614e7c81615f48565b93969395505050506040820135916060013590565b60008060008060008060a08789031215614eaa57600080fd5b8635614eb581615f48565b95506020870135614ec581615f48565b9450604087013593506060870135925060808701356001600160401b03811115614eee57600080fd5b614efa89828a01614947565b979a9699509497509295939492505050565b600080600080600060608688031215614f2457600080fd5b8535614f2f81615f48565b945060208601356001600160401b0380821115614f4b57600080fd5b614f5789838a01614735565b90965094506040880135915080821115614f7057600080fd5b50614f7d88828901614735565b969995985093965092949392505050565b60008060008060008060808789031215614fa757600080fd5b8635614fb281615f48565b955060208701356001600160401b0380821115614fce57600080fd5b614fda8a838b01614735565b90975095506040890135915080821115614ff357600080fd5b614fff8a838b01614735565b9095509350606089013591508082111561501857600080fd5b5061502589828a01614988565b9150509295509295509295565b6000806040838503121561504557600080fd5b823561505081615f48565b91506020830135614b4781615f5d565b6000806040838503121561507357600080fd5b823561507e81615f48565b946020939093013593505050565b6000806000606084860312156150a157600080fd5b83356150ac81615f48565b95602085013595506040909401359392505050565b600080600080608085870312156150d757600080fd5b84356150e281615f48565b9350602085013592506040850135915060608501356001600160401b0381111561510b57600080fd5b61511787828801614988565b91505092959194509250565b6000806000806040858703121561513957600080fd5b84356001600160401b038082111561515057600080fd5b61515c88838901614735565b9096509450602087013591508082111561517557600080fd5b5061518287828801614735565b95989497509550505050565b600080600080600060a086880312156151a657600080fd5b85516001600160401b03808211156151bd57600080fd5b6151c989838a01614800565b965060208801519150808211156151df57600080fd5b6151eb89838a01614800565b9550604088015191508082111561520157600080fd5b61520d89838a01614800565b94506060880151915080821115614bb457600080fd5b6000602080838503121561523657600080fd5b82516001600160401b038082111561524d57600080fd5b818501915085601f83011261526157600080fd5b815161526c81615c6d565b6040516152798282615e1a565b8281528581019150848601600584901b860187018a101561529957600080fd5b6000805b858110156152d4578251878111156152b3578283fd5b6152c18d8b838c01016149e4565b865250938801939188019160010161529d565b50919a9950505050505050505050565b600080602083850312156152f757600080fd5b82356001600160401b0381111561530d57600080fd5b61531985828601614735565b90969095509350505050565b60006020828403121561533757600080fd5b8151610eaf81615f5d565b60008060006040848603121561535757600080fd5b833561536281615f5d565b925060208401356001600160401b0381111561537d57600080fd5b61538986828701614947565b9497909650939450505050565b600080604083850312156153a957600080fd5b8251614c6981615f5d565b6000602082840312156153c657600080fd5b5035919050565b6000602082840312156153df57600080fd5b8135610eaf81615f6b565b6000602082840312156153fc57600080fd5b8151610eaf81615f6b565b6000806020838503121561541a57600080fd5b82356001600160401b0381111561543057600080fd5b61531985828601614947565b60006020828403121561544e57600080fd5b81516001600160401b0381111561546457600080fd5b6115fb848285016149e4565b60008060006060848603121561548557600080fd5b83516001600160401b038082111561549c57600080fd5b6154a8878388016149e4565b9450602086015191506154ba82615f48565b6040860151919350808211156154cf57600080fd5b506154dc868287016149e4565b9150509250925092565b6000806000604084860312156154fb57600080fd5b83356001600160401b038082111561551257600080fd5b908501906080828803121561552657600080fd5b9093506020850135908082111561553c57600080fd5b5061538986828701614735565b600080600080600080600080610100898b03121561556657600080fd5b88359750602089013561557881615f48565b9650604089013561558881615f48565b9550606089013594506080890135935060a089013560ff811681146155ac57600080fd5b979a969950949793969295929450505060c08201359160e0013590565b600081518084526020808501945080840160005b838110156156025781516001600160a01b0316875295820195908201906001016155dd565b509495945050505050565b81835260006001600160fb1b0383111561562657600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b8381101561560257815187529582019590820190600101615657565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526156b4816020860160208601615db9565b601f01601f19169290920160200192915050565b60018060a01b03815116825260006020820151608060208501526156ef608085018261569c565b905060408301518482036040860152615708828261569c565b91505060608301518482036060860152614a33828261569c565b60008251615734818460208701615db9565b9190910192915050565b600080835461574c81615de5565b600182811680156157645760018114615775576157a4565b60ff198416875282870194506157a4565b8760005260208060002060005b8581101561579b5781548a820152908401908201615782565b50505082870194505b50929695505050505050565b6001600160a01b0389811682528816602082015260a0604082018190526000906157dd908301888a61560d565b82810360608401526157f081878961560d565b90508281036080840152615805818587615673565b9b9a5050505050505050505050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a0606082018190526000906158519083018587615673565b9050826080830152979650505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905260009061589f9083018486615673565b98975050505050505050565b600060018060a01b038087168352608060208401526158cd608084018761569c565b83810360408501526158df818761569c565b92505080841660608401525095945050505050565b6001600160a01b03851681526080602082018190526000906159189083018661569c565b828103604084015261592a818661569c565b9050828103606084015261593e818561569c565b979650505050505050565b60608152600061595c60608301866155c9565b828103602084015261596e81866155c9565b905082810360408401526126388185615643565b6020808252825182820181905260009190848201906040850190845b818110156159ba5783518352928401929184019160010161599e565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615a1b57603f19888603018452615a098583516156c8565b945092850192908501906001016159ed565b5092979650505050505050565b602081526000610eaf6020830184615643565b604081526000615a4e6040830185615643565b8281036020840152614a338185615643565b83151581528215156020820152606060408201526000614a33606083018461569c565b8281526040602082015260006115fb6040830184615643565b848152608060208201526000615ab560808301866156c8565b6040830194909452506060015292915050565b602081526000610eaf602083018461569c565b604081526000615aee604083018561569c565b8281036020840152614a33818561569c565b6000602080835260008454615b1481615de5565b80848701526040600180841660008114615b355760018114615b4957615b77565b60ff19851689840152606089019550615b77565b896000528660002060005b85811015615b6f5781548b8201860152908301908801615b54565b8a0184019650505b509398975050505050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008235609e1983360301811261573457600080fd5b60008235607e1983360301811261573457600080fd5b60405160a081016001600160401b0381118282101715615c6757615c67615e8d565b60405290565b60006001600160401b03821115615c8657615c86615e8d565b5060051b60200190565b60006001600160401b03821115615ca957615ca9615e8d565b50601f01601f191660200190565b60008219821115615cca57615cca615e61565b500190565b600082615cec57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615d0357615d03615e61565b500390565b600060a08236031215615d1a57600080fd5b615d22615c45565b82356001600160401b0380821115615d3957600080fd5b615d4536838701614a3c565b835260208501356020840152604085013560408401526060850135915080821115615d6f57600080fd5b615d7b36838701614780565b60608401526080850135915080821115615d9457600080fd5b50615da136828601614873565b60808301525092915050565b60006107b23683614a3c565b60005b83811015615dd4578181015183820152602001615dbc565b83811115611e505750506000910152565b600181811c90821680615df957607f821691505b6020821081141561410b57634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b0381118282101715615e3f57615e3f615e8d565b6040525050565b6000600019821415615e5a57615e5a615e61565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615ebc5760046000803e5060005160e01c5b90565b600060443d1015615ecd5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615efc57505050505090565b8285019150815181811115615f145750505050505090565b843d8701016020828501011115615f2e5750505050505090565b615f3d60208286010187615e1a565b509095945050505050565b6001600160a01b038116811461471257600080fd5b801515811461471257600080fd5b6001600160e01b03198116811461471257600080fdfea2646970667358221220fad2fb7153eda02e6c43744615766b767dc0efc5caebd9d4d300000cb28e3aeb64736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027d5760003560e01c80636b20c4541161015c578063c1854355116100ce578063e6daf92411610087578063e6daf92414610662578063e985e9c514610678578063eac989f8146106a6578063f242432a146106ae578063f437bc59146106c1578063f5298aca146106d457600080fd5b8063c1854355146105e7578063c71bf12d146105fa578063c85e0be214610602578063ccfec2fb14610615578063cd6e1d7c14610628578063da95dccf1461063b57600080fd5b80639485fe72116101205780639485fe721461055b57806395d89b411461056e5780639b642de11461058b5780639ce110d71461059e578063a22cb465146105b1578063bd85b039146105c457600080fd5b80636b20c454146104df5780637f7eeb86146104f2578063843d32d914610512578063898e6219146105255780638a94b05f1461054857600080fd5b80633f47e662116101f55780634e41a1fb116101b95780634e41a1fb14610439578063502e1a161461044c5780635473422e146104855780635611d4e914610498578063598af9e7146104b957806359ded0fe146104cc57600080fd5b80633f47e662146103cc57806341607140146103e0578063457f4bcc146104005780634dc5ecb3146104135780634e1273f41461042657600080fd5b80630a193026116102475780630a1930261461033b5780630c32d758146103505780630e89341c146103705780632d7f1d2b146103835780632eb2c2d61461039657806336a6802f146103a957600080fd5b8062ad800c14610282578062fdd58e146102ab57806301ffc9a7146102cc57806303fbd7fd146102ef57806306fdde031461031a575b600080fd5b6102956102903660046153b4565b6106e7565b6040516102a29190615ac8565b60405180910390f35b6102be6102b9366004615060565b61078c565b6040519081526020016102a2565b6102df6102da3660046153cd565b6107b8565b60405190151581526020016102a2565b6103026102fd366004614afb565b61089a565b6040516001600160a01b0390911681526020016102a2565b6040805180820190915260058152644974656d7360d81b6020820152610295565b61034e610349366004615342565b6108ec565b005b61036361035e366004615123565b610974565b6040516102a291906159c6565b61029561037e3660046153b4565b610dda565b600454610302906001600160a01b031681565b61034e6103a4366004614cc9565b610eb6565b6103bc6103b73660046153b4565b610f3a565b6040516102a294939291906158f4565b6102be6103da3660046153b4565b50601290565b6103f36103ee3660046152e4565b611105565b6040516102a29190615a28565b61029561040e366004615407565b611113565b61034e610421366004614e4b565b611154565b6103f3610434366004615123565b6112a4565b6102956104473660046153b4565b61139d565b6102be61045a366004615060565b60009081526007602090815260408083206001600160a01b0394909416835260099093019052205490565b61034e610493366004614f8e565b6113bd565b6104ab6104a63660046154e6565b611439565b6040516102a2929190615a83565b6102be6104c7366004614e0a565b611590565b61034e6104da366004615549565b611603565b61034e6104ed366004614f0c565b6118e1565b610505610500366004615123565b6118fe565b6040516102a29190615982565b6102956105203660046153b4565b611b72565b6105386105333660046153b4565b611c33565b6040516102a29493929190615a9c565b61034e6105563660046150c1565b611e31565b610363610569366004615123565b611e56565b6040805180820190915260018152604960f81b6020820152610295565b610295610599366004615407565b612291565b600054610302906001600160a01b031681565b61034e6105bf366004615032565b61235c565b6102be6105d23660046153b4565b60009081526007602052604090206006015490565b6103026105f53660046153b4565b6123c8565b6102956123ea565b610302610610366004614afb565b612478565b600354610302906001600160a01b031681565b6102df610636366004614d87565b6124ef565b6102be7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61066a612642565b6040516102a2929190615adb565b6102df610686366004614c9b565b600860209081526000928352604080842090915290825290205460ff1681565b610295612678565b61034e6106bc366004614e91565b612722565b600154610302906001600160a01b031681565b61034e6106e236600461508c565b61274f565b600081815260076020526040902060020180546060919061070790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461073390615de5565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b50505050509050919050565b60008181526007602081815260408084206001600160a01b038716855290920190529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e957506001600160e01b031982166301ffc9a760e01b145b8061080457506001600160e01b03198216630a267c7760e21b145b8061081f57506001600160e01b0319821663115fd2f360e21b145b8061083a57506001600160e01b03198216639ce110d760e01b145b8061085557506001600160e01b0319821663335b875f60e21b145b8061087057506001600160e01b0319821663f437bc5960e01b145b8061088b57506001600160e01b0319821663642f05f160e11b145b806107b257506107b28261276a565b60006108a4612816565b6108c95760405162461bcd60e51b81526004016108c090615bf3565b60405180910390fd5b50600380546001600160a01b039283166001600160a01b03198216179091551690565b82156109365761093182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061283392505050565b505050565b60008080808061094886880188614bf0565b9450945094509450945061096a61095e83612944565b86868686866001612998565b5050505050505050565b6060816001600160401b0381111561098e5761098e615e8d565b6040519080825280602002602001820160405280156109c757816020015b6109b46145cb565b8152602001906001900390816109ac5790505b50905060005b82811015610dd1576000600660008888858181106109ed576109ed615e77565b6020908102929092013583525081810192909252604090810160002081516080810190925280546001600160a01b03168252600181018054919450339385929084019190610a3a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690615de5565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600282018054610acc90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615de5565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600382018054610b5e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90615de5565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b505050505081525050848481518110610bf257610bf2615e77565b60200260200101819052600001516001600160a01b031614610c265760405162461bcd60e51b81526004016108c090615bcd565b6000610c5f868685818110610c3d57610c3d615e77565b9050602002810190610c4f9190615c2f565b610c5890615dad565b6000612d13565b600660008a8a87818110610c7557610c75615e77565b6020908102929092013583525081810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781558282015180519192610cc5926001850192909101906145fc565b5060408201518051610ce19160028401916020909101906145fc565b5060608201518051610cfd9160038401916020909101906145fc565b505485516001600160a01b03909116925085915084908110610d2157610d21615e77565b6020026020010151600001516001600160a01b0316816001600160a01b031614610dbc57878784818110610d5757610d57615e77565b90506020020135816001600160a01b0316858581518110610d7a57610d7a615e77565b6020026020010151600001516001600160a01b03167ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae60405160405180910390a45b50508080610dc990615e46565b9150506109cd565b50949350505050565b600081815260076020526040902060048101805460609291610eaf91610dff90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615de5565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b50508554604051610e9b9450909250889150602001918252602082015260400190565b60405160208183030381529060405261304b565b9392505050565b610f2933898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201829052509250600191506130ef9050565b61096a33898989898989898961315c565b600660205260009081526040902080546001820180546001600160a01b039092169291610f6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9290615de5565b8015610fdf5780601f10610fb457610100808354040283529160200191610fdf565b820191906000526020600020905b815481529060010190602001808311610fc257829003601f168201915b505050505090806002018054610ff490615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461102090615de5565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b50505050509080600301805461108290615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546110ae90615de5565b80156110fb5780601f106110d0576101008083540402835291602001916110fb565b820191906000526020600020905b8154815290600101906020018083116110de57829003601f168201915b5050505050905084565b6060610eaf600084846132e0565b6060610eaf83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061371e92505050565b6000336001600160a01b038616146111745761116f82612944565b611183565b60008281526007602052604090205b90506001600160a01b0384166111db5760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f2061646472657373000000000060448201526064016108c0565b6001600160a01b0385811660009081526008830160209081526040808320888516845290915290208490558216331461129d57604080516001600160a01b038781166020830152868116828401526060808301879052835180840390910181526080830193849052636952b02f60e11b90935284169163d2a5605e9161126a9160019160009190608401615a60565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505b5050505050565b6060816001600160401b038111156112be576112be615e8d565b6040519080825280602002602001820160405280156112e7578160200160208202803683370190505b50905060005b8151811015610dd1576007600085858481811061130c5761130c615e77565b905060200201358152602001908152602001600020600701600087878481811061133857611338615e77565b905060200201602081019061134d9190614afb565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061138057611380615e77565b60209081029190910101528061139581615e46565b9150506112ed565b600081815260076020526040902060030180546060919061070790615de5565b6114313387600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201829052509250600191506130ef9050565b505050505050565b600060608161144a610c5887615dad565b6009805460069160009161146b918361146283615e46565b919050556137e0565b8082526020808301939093526040909101600020835181546001600160a01b0319166001600160a01b0390911617815583830151805192975090926114b8926001850192909101906145fc565b50604082015180516114d49160028401916020909101906145fc565b50606082015180516114f09160038401916020909101906145fc565b5080549092506001600160a01b0316151590508061150d57508315155b6115415760405162461bcd60e51b8152602060048201526005602482015264456d70747960d81b60448201526064016108c0565b805460405184916001600160a01b0316906000907ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae908290a46115858386866132e0565b915050935093915050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081205460ff166115f75760008281526007602090815260408083206001600160a01b0380891685526008909101835281842090871684529091529020546115fb565b6000195b949350505050565b834211156116535760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108c0565b600088815260076020908152604080832060058101546001600160a01b038c168552600982019093529083208054919392917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190876116b883615e46565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012060405160200161173192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561179c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117d25750896001600160a01b0316816001600160a01b0316145b6118125760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016108c0565b6001600160a01b038a8116600090815260088501602090815260408083208d8516845290915290208990558b1633146118d457604080516001600160a01b038c811660208301528b81168284015260608083018c9052835180840390910181526080830193849052636952b02f60e11b9093528d169163d2a5605e916118a19160019160009190608401615a60565b600060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050505b5050505050505050505050565b61129d8585858585604051806020016040528060008152506113bd565b6060836001600160401b0381111561191857611918615e8d565b604051908082528060200260200182016040528015611941578160200160208202803683370190505b50905060005b84811015610dd15760006007600088888581811061196757611967615e77565b9050602002013581526020019081526020016000209050336001600160a01b03166006600083600001548686815181106119a3576119a3615e77565b6020908102919091018101829052908252810191909152604001600020546001600160a01b0316146119e75760405162461bcd60e51b81526004016108c090615bcd565b611aad60066000878786818110611a0057611a00615e77565b905060200201358460000181905581526020019081526020016000206001018054611a2a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690615de5565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b5050505050613862565b15611ae75760405162461bcd60e51b815260206004820152600a60248201526931b7b63632b1ba34b7b760b11b60448201526064016108c0565b868683818110611af957611af9615e77565b90506020020135858584818110611b1257611b12615e77565b90506020020135848481518110611b2b57611b2b615e77565b60200260200101517f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a60405160405180910390a45080611b6a81615e46565b915050611947565b600081815260066020526040902060030180546060916107b291611b9590615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc190615de5565b8015611c0e5780601f10611be357610100808354040283529160200191611c0e565b820191906000526020600020905b815481529060010190602001808311611bf157829003601f168201915b5050505050836000604051602001610e9b92919091825260ff16602082015260400190565b60076020908152600091825260409182902080548351608081019094526001820180546001600160a01b0316855260028301805492959394919291840191611c7a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca690615de5565b8015611cf35780601f10611cc857610100808354040283529160200191611cf3565b820191906000526020600020905b815481529060010190602001808311611cd657829003601f168201915b50505050508152602001600282018054611d0c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3890615de5565b8015611d855780601f10611d5a57610100808354040283529160200191611d85565b820191906000526020600020905b815481529060010190602001808311611d6857829003601f168201915b50505050508152602001600382018054611d9e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90615de5565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b505050505081525050908060050154908060060154905084565b6000838152600760205260408120611e50913390879087876001612998565b50505050565b6060816001600160401b03811115611e7057611e70615e8d565b604051908082528060200260200182016040528015611ea957816020015b611e966145cb565b815260200190600190039081611e8e5790505b50905060005b82811015610dd157600060076000888885818110611ecf57611ecf615e77565b9050602002013581526020019081526020016000209050806001016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182018054611f3490615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6090615de5565b8015611fad5780601f10611f8257610100808354040283529160200191611fad565b820191906000526020600020905b815481529060010190602001808311611f9057829003601f168201915b50505050508152602001600282018054611fc690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff290615de5565b801561203f5780601f106120145761010080835404028352916020019161203f565b820191906000526020600020905b81548152906001019060200180831161202257829003601f168201915b5050505050815260200160038201805461205890615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461208490615de5565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b5050505050815250508383815181106120ec576120ec615e77565b60209081029190910181019190915281546000908152600690915260409020546001600160a01b031633146121335760405162461bcd60e51b81526004016108c090615bcd565b61216a85858481811061214857612148615e77565b905060200281019061215a9190615c2f565b61216390615dad565b8254612d13565b80516001830180546001600160a01b0319166001600160a01b0390921691909117815560208083015180516121a592600287019201906145fc565b50604082015180516121c19160028401916020909101906145fc565b50606082015180516121dd9160038401916020909101906145fc565b509050508282815181106121f3576121f3615e77565b602002602001015160600151805190602001208160010160030160405161221a919061573e565b60405180910390201461227e5786868381811061223957612239615e77565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826001016003016040516122759190615b00565b60405180910390a25b508061228981615e46565b915050611eaf565b606061229b612816565b6122b75760405162461bcd60e51b81526004016108c090615bf3565b600280546122c490615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546122f090615de5565b801561233d5780601f106123125761010080835404028352916020019161233d565b820191906000526020600020905b81548152906001019060200180831161232057829003601f168201915b50505050509050828260029190612355929190614680565b5092915050565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260076020526040812054156123e257816107b2565b600092915050565b600280546123f790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461242390615de5565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b505050505081565b6000612482612816565b61249e5760405162461bcd60e51b81526004016108c090615bf3565b50600180546001600160a01b0319166001600160a01b038316908117909155604051819081907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080600061250289898989898961388f565b9150915081156125155791506126389050565b6001546001600160a01b038a81169116141561253657600192505050612638565b60015461254b906001600160a01b03166138dd565b61255a57600092505050612638565b60015460405160009182916001600160a01b039091169063335b875f60e21b90612592908e908e908e908e908e908e90602401615814565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125d09190615722565b600060405180830381855afa9150503d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b50915091508180156126315750808060200190518101906126319190615325565b9450505050505b9695505050505050565b60408051808201825260048152634974656d60e01b602080830191909152825180840190935260018352603160f81b9083015291565b606061271d6002805461268a90615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690615de5565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b50505050506040518060200160405280600081525061304b565b905090565b60008481526007602052604090206127409033888888886001612998565b611431338787878787876138fc565b61093183838360405180602001604052806000815250611e31565b60006001600160e01b03198216633cd9a01960e11b148061279b57506001600160e01b0319821663c71bf12d60e01b145b806127b657506001600160e01b03198216631d59313f60e31b145b806127d157506001600160e01b0319821663ccfec2fb60e01b145b806127ec57506001600160e01b03198216639b642de160e01b145b8061280757506001600160e01b031982166303fbd7fd60e01b145b806107b257506107b2826139cf565b600061271d33306000356001600160e01b031916600036346124ef565b6000818060200190518101906128499190615396565b9250905080156128615761285c82613a55565b612938565b60008060008060008680602001905181019061287d919061518e565b9450945094509450945060005b82518110156129315761291f8682815181106128a8576128a8615e77565b60200260200101518683815181106128c2576128c2615e77565b60200260200101518684815181106128dc576128dc615e77565b60200260200101518685815181106128f6576128f6615e77565b602002602001015186868151811061291057612910615e77565b60200260200101516001613ae1565b8061292981615e46565b91505061288a565b5050505050505b612940613d2e565b5050565b6000818152600760209081526040808320805484526006909252909120546001600160a01b031633148061297757503382145b6129935760405162461bcd60e51b81526004016108c090615bcd565b919050565b6001600160a01b03851615612b9c57846001600160a01b0316866001600160a01b031614612b04576001600160a01b0380861660009081526008890160209081526040808320938a168352929052205482111580612a1b57506001600160a01b038086166000908152600860209081526040808320938a168352929052205460ff165b612a675760405162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320616c6c6f77616e6365000000000000000060448201526064016108c0565b6001600160a01b0380861660009081526008890160209081526040808320938a16835292905220548211612ad9576001600160a01b0380861660009081526008890160209081526040808320938a1683529290529081208054849290612ace908490615cf1565b90915550612b049050565b6001600160a01b0380861660009081526008890160209081526040808320938a168352929052908120555b6001600160a01b0385166000908152600788016020526040902054821115612b675760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108c0565b6001600160a01b038516600090815260078801602052604081208054849290612b91908490615cf1565b90915550612bb69050565b81876006016000828254612bb09190615cb7565b90915550505b6001600160a01b03841615612bfa576001600160a01b038416600090815260078801602052604081208054849290612bef908490615cb7565b90915550612c149050565b81876006016000828254612c0e9190615cf1565b90915550505b8015612d0a57836001600160a01b0316856001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612c72929190918252602082015260400190565b60405180910390a4338314612d0a57604080516001600160a01b038781166020830152868116828401526060808301869052835180840390910181526080830193849052636952b02f60e11b90935285169163d2a5605e91612cdc91600091829190608401615a60565b600060405180830381600087803b158015612cf657600080fd5b505af11580156118d4573d6000803e3d6000fd5b50505050505050565b612d1b6145cb565b612deb612d2b8460200151613862565b8015612d3657508215155b612d44578360200151612ddf565b60008381526006602052604090206001018054612d6090615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8c90615de5565b8015612dd95780601f10612dae57610100808354040283529160200191612dd9565b820191906000526020600020905b815481529060010190602001808311612dbc57829003601f168201915b50505050505b84602001819052613862565b15612e215760405162461bcd60e51b81526004016108c0906020808252600490820152636e616d6560e01b604082015260600190565b612ef1612e318460400151613862565b8015612e3c57508215155b612e4a578360400151612ee5565b60008381526006602052604090206002018054612e6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9290615de5565b8015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b50505050505b84604001819052613862565b15612f275760405162461bcd60e51b81526020600482015260066024820152651cde5b589bdb60d21b60448201526064016108c0565b612ff7612f378460600151613862565b8015612f4257508215155b612f50578360600151612feb565b60008381526006602052604090206003018054612f6c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9890615de5565b8015612fe55780601f10612fba57610100808354040283529160200191612fe5565b820191906000526020600020905b815481529060010190602001808311612fc857829003601f168201915b50505050505b84606001819052613862565b1561302a5760405162461bcd60e51b815260206004820152600360248201526275726960e81b60448201526064016108c0565b81613036578251613039565b60005b6001600160a01b031683525090919050565b6003546060906001600160a01b03166130655750816107b2565b60035460405163f709c9b760e01b81526001600160a01b039091169063f709c9b79061309b9030908790879033906004016158ab565b60006040518083038186803b1580156130b357600080fd5b505afa1580156130c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eaf919081019061543c565b60005b845181101561314d5761313b88888888858151811061311357613113615e77565b602002602001015188868151811061312d5761312d615e77565b602002602001015188613ae1565b8061314581615e46565b9150506130f2565b508015612d0a57612d0a613d2e565b61316e876001600160a01b03166138dd565b156112985760405163bc197c8160e01b81526001600160a01b0388169063bc197c81906131ad908c908c908b908b908b908b908b908b906004016157b0565b602060405180830381600087803b1580156131c757600080fd5b505af19250505080156131f7575060408051601f3d908101601f191682019092526131f4918101906153ea565b60015b6132a457613203615ea3565b806308c379a0141561323d5750613218615ebf565b80613223575061323f565b8060405162461bcd60e51b81526004016108c09190615ac8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108c0565b6001600160e01b0319811663bc197c8160e01b146132d45760405162461bcd60e51b81526004016108c090615b85565b50505050505050505050565b6060816001600160401b038111156132fa576132fa615e8d565b604051908082528060200260200182016040528015613323578160200160208202803683370190505b50905060005b8281101561371657600084848381811061334557613345615e77565b90506020028101906133579190615c19565b61336090615d08565b905085613371578060400151613374565b60005b83838151811061338657613386615e77565b6020908102919091010152856133c05760408101516133a95780602001516133c2565b6040808201516000908152600760205220546133c2565b855b6020820152851515806133ff57506020810151158015906133ff57506020818101516000908152600690915260409020546001600160a01b031633145b61341b5760405162461bcd60e51b81526004016108c090615bcd565b82828151811061342d5761342d615e77565b6020026020010151600014156136d757600454600090613455906001600160a01b03166140cf565b9050806001600160a01b031663e1c7392a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561349257600080fd5b505af11580156134a6573d6000803e3d6000fd5b50505050600060076000836001600160a01b03168787815181106134cc576134cc615e77565b6020026020010181815250815260200190815260200160002090508260200151816000018190555061350683600001518460200151612d13565b80516001830180546001600160a01b0319166001600160a01b03909216919091178155602080830151805161354192600287019201906145fc565b506040820151805161355d9160028401916020909101906145fc565b50606082015180516135799160038401916020909101906145fc565b50905050600080613588612642565b915091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82805190602001208280519060200120468a8a815181106135d0576135d0615e77565b60200260200101516040516020016136139594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405160208183030381529060405280519060200120836005018190555086868151811061364357613643615e77565b602090810291909101015183546040516000907f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a908290a486868151811061368d5761368d615e77565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846001016003016040516136ca9190615b00565b60405180910390a2505050505b6137038383815181106136ec576136ec615e77565b602002602001015182606001518360800151614111565b508061370e81615e46565b915050613329565b509392505050565b6000546060906001600160a01b0316156137635760405162461bcd60e51b81526004016108c0906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b03191633179055815161378a9083016020908101908401614c4b565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a36107b2816141f6565b6000814243323a4144336137f5600587615cf1565b60408051602081019a909a5289019790975260608801959095526001600160a01b03938416608088015260a0870192909252821660c086015260e0850152166101008301524061012082015261014001604051602081830303815290604052805190602001209050919050565b80516020909101207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b6000806001600160a01b038716301480156138ba57506001600160e01b031986166303fbd7fd60e01b145b156138cb57506001905060006138d2565b5060009050805b965096945050505050565b60006001600160a01b0382166138f557506000919050565b503b151590565b61390e856001600160a01b03166138dd565b15612d0a5760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613949908a908a908990899089908990600401615864565b602060405180830381600087803b15801561396357600080fd5b505af1925050508015613993575060408051601f3d908101601f19168201909252613990918101906153ea565b60015b61399f57613203615ea3565b6001600160e01b0319811663f23a6e6160e01b1461096a5760405162461bcd60e51b81526004016108c090615b85565b6005546040516301ffc9a760e01b81526001600160e01b0319831660048201526000916001600160a01b0316906301ffc9a79060240160206040518083038186803b158015613a1d57600080fd5b505afa158015613a31573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b29190615325565b600081806020019051810190613a6b9190615223565b905060005b8151811015610931576000806000806000868681518110613a9357613a93615e77565b6020026020010151806020019051810190613aae9190614b52565b94509450945094509450613ac98585858585600160006130ef565b50505050508080613ad990615e46565b915050613a70565b81613aeb57611431565b6000838152600c6020908152604080832054808452600a90925290912080541580613b3357508481600081548110613b2557613b25615e77565b906000526020600020015414155b15613b8f57600b8054600a916000919082613b4d83615e46565b909155506000888152600c6020908152604080832084905583855284820195909552929093018320805460018101825581855292909320909101879055925090505b805460018082018355600083815260208082206001600160a01b038c81169582019590955585548085018755948b169481019490945584549283019094559101859055604080516bffffffffffffffffffffffff1960608c811b8216838701528b811b821660348401528a901b1660488201528151808203603c018152605c9091018252805190840120808352600d90935290208054909190613c9b57600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201829055825480820184556000848152602090206001600160a01b03808d1692820192909255845480840186558b831690820155845492830185559089169101555b6000818152600e60209081526040808320898452909152902054613ccf578154600181018355600083815260209020018690555b6000818152600e6020908152604080832089845290915281208054879290613cf8908490615cb7565b90915550611298905084613d19576000878152600760205260409020613d22565b613d2287612944565b8a8a8a8a8a6000612998565b60005b600b548110156140bf576000818152600a60205260408120805490919082908290613d5e57613d5e615e77565b9060005260206000200154905081600081548110613d7e57613d7e615e77565b600091825260208220018190558254600390613d9c90600190615cf1565b613da69190615ccf565b90506000816001600160401b03811115613dc257613dc2615e8d565b604051908082528060200260200182016040528015613deb578160200160208202803683370190505b5090506000826001600160401b03811115613e0857613e08615e8d565b604051908082528060200260200182016040528015613e31578160200160208202803683370190505b5090506000836001600160401b03811115613e4e57613e4e615e8d565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050600060015b8754811015613ff557878181548110613e9a57613e9a615e77565b9060005260206000200154858381518110613eb757613eb7615e77565b60200260200101906001600160a01b031690816001600160a01b031681525050878181548110613ee957613ee9615e77565b600091825260208220015587613f00826001615cb7565b81548110613f1057613f10615e77565b9060005260206000200154848381518110613f2d57613f2d615e77565b6001600160a01b039092166020928302919091019091015287613f51826001615cb7565b81548110613f6157613f61615e77565b600091825260208220015587613f78826002615cb7565b81548110613f8857613f88615e77565b9060005260206000200154838380613f9f90615e46565b945081518110613fb157613fb1615e77565b602090810291909101015287613fc8826002615cb7565b81548110613fd857613fd8615e77565b6000918252602082200155613fee600382615cb7565b9050613e7f565b50856001600160a01b031663d2a5605e6000600187878760405160200161401e93929190615949565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161404b93929190615a60565b600060405180830381600087803b15801561406557600080fd5b505af1158015614079573d6000803e3d6000fd5b5050506000878152600c602090815260408083208390558b8352600a90915281206140a59250906146f4565b5050505050505080806140b790615e46565b915050613d31565b506000600b556140cd61424c565b565b60006901000000000000000000820268803b80938091923cf36258807360e81b01176000526020600080f09050803b80156141095761410b565bfe5b50919050565b60005b82518110156141ed5760006001600160a01b031683828151811061413a5761413a615e77565b60200260200101516001600160a01b031614156141995760405162461bcd60e51b815260206004820152601860248201527f6d696e7420746f20746865207a65726f2061646472657373000000000000000060448201526064016108c0565b6141db6000808584815181106141b1576141b1615e77565b6020026020010151878686815181106141cc576141cc615e77565b60200260200101516000613ae1565b806141e581615e46565b915050614114565b50610931613d2e565b60608180602001905181019061420c9190615470565b600380546001600160a01b0319166001600160a01b0384161790558251909350839061423f9060029060208601906145fc565b505050506107b281614572565b60005b600f54811015614565576000600f828154811061426e5761426e615e77565b6000918252602080832090910154808352600d909152604082208054919350919061429b90600390615cf1565b90506000826000815481106142b2576142b2615e77565b90600052602060002001549050826000815481106142d2576142d2615e77565b90600052602060002001600090556000836001815481106142f5576142f5615e77565b906000526020600020015490508360018154811061431557614315615e77565b906000526020600020016000905560008460028154811061433857614338615e77565b906000526020600020015490508460028154811061435857614358615e77565b9060005260206000200160009055600080856001600160401b0381111561438157614381615e8d565b6040519080825280602002602001820160405280156143aa578160200160208202803683370190505b5090506000866001600160401b038111156143c7576143c7615e8d565b6040519080825280602002602001820160405280156143f0578160200160208202803683370190505b50905060035b88548110156144da57600e60008b815260200190815260200160002060008a838154811061442657614426615e77565b906000526020600020015485878151811061444357614443615e77565b602002602001018181525081526020019081526020016000205482858151811061446f5761446f615e77565b60200260200101818152505088818154811061448d5761448d615e77565b600091825260208083209091018290558b8252600e90526040812090856144b381615e46565b965081526020019081526020016000206000905580806144d290615e46565b9150506143f6565b50836001600160a01b0316856001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb858560405161452a929190615a3b565b60405180910390a46000898152600d60205260408120614549916146f4565b505050505050505050808061455d90615e46565b91505061424f565b506140cd600f60006146f4565b6060818060200190518101906145889190614b18565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b82805461460890615de5565b90600052602060002090601f01602090048101928261462a5760008555614670565b82601f1061464357805160ff1916838001178555614670565b82800160010185558215614670579182015b82811115614670578251825591602001919060010190614655565b5061467c929150614715565b5090565b82805461468c90615de5565b90600052602060002090601f0160209004810192826146ae5760008555614670565b82601f106146c75782800160ff19823516178555614670565b82800160010185558215614670579182015b828111156146705782358255916020019190600101906146d9565b50805460008255906000526020600020908101906147129190614715565b50565b5b8082111561467c5760008155600101614716565b803561299381615f48565b60008083601f84011261474757600080fd5b5081356001600160401b0381111561475e57600080fd5b6020830191508360208260051b850101111561477957600080fd5b9250929050565b600082601f83011261479157600080fd5b8135602061479e82615c6d565b6040516147ab8282615e1a565b8381528281019150858301600585901b870184018810156147cb57600080fd5b60005b858110156147f35781356147e181615f48565b845292840192908401906001016147ce565b5090979650505050505050565b600082601f83011261481157600080fd5b8151602061481e82615c6d565b60405161482b8282615e1a565b8381528281019150858301600585901b8701840188101561484b57600080fd5b60005b858110156147f357815161486181615f48565b8452928401929084019060010161484e565b600082601f83011261488457600080fd5b8135602061489182615c6d565b60405161489e8282615e1a565b8381528281019150858301600585901b870184018810156148be57600080fd5b60005b858110156147f3578135845292840192908401906001016148c1565b600082601f8301126148ee57600080fd5b815160206148fb82615c6d565b6040516149088282615e1a565b8381528281019150858301600585901b8701840188101561492857600080fd5b60005b858110156147f35781518452928401929084019060010161492b565b60008083601f84011261495957600080fd5b5081356001600160401b0381111561497057600080fd5b60208301915083602082850101111561477957600080fd5b600082601f83011261499957600080fd5b81356149a481615c90565b6040516149b18282615e1a565b8281528560208487010111156149c657600080fd5b82602086016020830137600092810160200192909252509392505050565b600082601f8301126149f557600080fd5b8151614a0081615c90565b604051614a0d8282615e1a565b828152856020848701011115614a2257600080fd5b614a33836020830160208801615db9565b95945050505050565b600060808284031215614a4e57600080fd5b604051608081016001600160401b038282108183111715614a7157614a71615e8d565b81604052829350614a818561472a565b83526020850135915080821115614a9757600080fd5b614aa386838701614988565b60208401526040850135915080821115614abc57600080fd5b614ac886838701614988565b60408401526060850135915080821115614ae157600080fd5b50614aee85828601614988565b6060830152505092915050565b600060208284031215614b0d57600080fd5b8135610eaf81615f48565b60008060408385031215614b2b57600080fd5b8251614b3681615f48565b6020840151909250614b4781615f48565b809150509250929050565b600080600080600060a08688031215614b6a57600080fd5b8551614b7581615f48565b6020870151909550614b8681615f48565b6040870151909450614b9781615f48565b60608701519093506001600160401b0380821115614bb457600080fd5b614bc089838a016148dd565b93506080880151915080821115614bd657600080fd5b50614be3888289016148dd565b9150509295509295909350565b600080600080600060a08688031215614c0857600080fd5b8535614c1381615f48565b94506020860135614c2381615f48565b93506040860135614c3381615f48565b94979396509394606081013594506080013592915050565b60008060408385031215614c5e57600080fd5b8251614c6981615f48565b60208401519092506001600160401b03811115614c8557600080fd5b614c91858286016149e4565b9150509250929050565b60008060408385031215614cae57600080fd5b8235614cb981615f48565b91506020830135614b4781615f48565b60008060008060008060008060a0898b031215614ce557600080fd5b8835614cf081615f48565b97506020890135614d0081615f48565b965060408901356001600160401b0380821115614d1c57600080fd5b614d288c838d01614735565b909850965060608b0135915080821115614d4157600080fd5b614d4d8c838d01614735565b909650945060808b0135915080821115614d6657600080fd5b50614d738b828c01614947565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215614da057600080fd5b8635614dab81615f48565b95506020870135614dbb81615f48565b94506040870135614dcb81615f6b565b935060608701356001600160401b03811115614de657600080fd5b614df289828a01614947565b979a9699509497949695608090950135949350505050565b600080600060608486031215614e1f57600080fd5b8335614e2a81615f48565b92506020840135614e3a81615f48565b929592945050506040919091013590565b60008060008060808587031215614e6157600080fd5b8435614e6c81615f48565b93506020850135614e7c81615f48565b93969395505050506040820135916060013590565b60008060008060008060a08789031215614eaa57600080fd5b8635614eb581615f48565b95506020870135614ec581615f48565b9450604087013593506060870135925060808701356001600160401b03811115614eee57600080fd5b614efa89828a01614947565b979a9699509497509295939492505050565b600080600080600060608688031215614f2457600080fd5b8535614f2f81615f48565b945060208601356001600160401b0380821115614f4b57600080fd5b614f5789838a01614735565b90965094506040880135915080821115614f7057600080fd5b50614f7d88828901614735565b969995985093965092949392505050565b60008060008060008060808789031215614fa757600080fd5b8635614fb281615f48565b955060208701356001600160401b0380821115614fce57600080fd5b614fda8a838b01614735565b90975095506040890135915080821115614ff357600080fd5b614fff8a838b01614735565b9095509350606089013591508082111561501857600080fd5b5061502589828a01614988565b9150509295509295509295565b6000806040838503121561504557600080fd5b823561505081615f48565b91506020830135614b4781615f5d565b6000806040838503121561507357600080fd5b823561507e81615f48565b946020939093013593505050565b6000806000606084860312156150a157600080fd5b83356150ac81615f48565b95602085013595506040909401359392505050565b600080600080608085870312156150d757600080fd5b84356150e281615f48565b9350602085013592506040850135915060608501356001600160401b0381111561510b57600080fd5b61511787828801614988565b91505092959194509250565b6000806000806040858703121561513957600080fd5b84356001600160401b038082111561515057600080fd5b61515c88838901614735565b9096509450602087013591508082111561517557600080fd5b5061518287828801614735565b95989497509550505050565b600080600080600060a086880312156151a657600080fd5b85516001600160401b03808211156151bd57600080fd5b6151c989838a01614800565b965060208801519150808211156151df57600080fd5b6151eb89838a01614800565b9550604088015191508082111561520157600080fd5b61520d89838a01614800565b94506060880151915080821115614bb457600080fd5b6000602080838503121561523657600080fd5b82516001600160401b038082111561524d57600080fd5b818501915085601f83011261526157600080fd5b815161526c81615c6d565b6040516152798282615e1a565b8281528581019150848601600584901b860187018a101561529957600080fd5b6000805b858110156152d4578251878111156152b3578283fd5b6152c18d8b838c01016149e4565b865250938801939188019160010161529d565b50919a9950505050505050505050565b600080602083850312156152f757600080fd5b82356001600160401b0381111561530d57600080fd5b61531985828601614735565b90969095509350505050565b60006020828403121561533757600080fd5b8151610eaf81615f5d565b60008060006040848603121561535757600080fd5b833561536281615f5d565b925060208401356001600160401b0381111561537d57600080fd5b61538986828701614947565b9497909650939450505050565b600080604083850312156153a957600080fd5b8251614c6981615f5d565b6000602082840312156153c657600080fd5b5035919050565b6000602082840312156153df57600080fd5b8135610eaf81615f6b565b6000602082840312156153fc57600080fd5b8151610eaf81615f6b565b6000806020838503121561541a57600080fd5b82356001600160401b0381111561543057600080fd5b61531985828601614947565b60006020828403121561544e57600080fd5b81516001600160401b0381111561546457600080fd5b6115fb848285016149e4565b60008060006060848603121561548557600080fd5b83516001600160401b038082111561549c57600080fd5b6154a8878388016149e4565b9450602086015191506154ba82615f48565b6040860151919350808211156154cf57600080fd5b506154dc868287016149e4565b9150509250925092565b6000806000604084860312156154fb57600080fd5b83356001600160401b038082111561551257600080fd5b908501906080828803121561552657600080fd5b9093506020850135908082111561553c57600080fd5b5061538986828701614735565b600080600080600080600080610100898b03121561556657600080fd5b88359750602089013561557881615f48565b9650604089013561558881615f48565b9550606089013594506080890135935060a089013560ff811681146155ac57600080fd5b979a969950949793969295929450505060c08201359160e0013590565b600081518084526020808501945080840160005b838110156156025781516001600160a01b0316875295820195908201906001016155dd565b509495945050505050565b81835260006001600160fb1b0383111561562657600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b8381101561560257815187529582019590820190600101615657565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526156b4816020860160208601615db9565b601f01601f19169290920160200192915050565b60018060a01b03815116825260006020820151608060208501526156ef608085018261569c565b905060408301518482036040860152615708828261569c565b91505060608301518482036060860152614a33828261569c565b60008251615734818460208701615db9565b9190910192915050565b600080835461574c81615de5565b600182811680156157645760018114615775576157a4565b60ff198416875282870194506157a4565b8760005260208060002060005b8581101561579b5781548a820152908401908201615782565b50505082870194505b50929695505050505050565b6001600160a01b0389811682528816602082015260a0604082018190526000906157dd908301888a61560d565b82810360608401526157f081878961560d565b90508281036080840152615805818587615673565b9b9a5050505050505050505050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a0606082018190526000906158519083018587615673565b9050826080830152979650505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905260009061589f9083018486615673565b98975050505050505050565b600060018060a01b038087168352608060208401526158cd608084018761569c565b83810360408501526158df818761569c565b92505080841660608401525095945050505050565b6001600160a01b03851681526080602082018190526000906159189083018661569c565b828103604084015261592a818661569c565b9050828103606084015261593e818561569c565b979650505050505050565b60608152600061595c60608301866155c9565b828103602084015261596e81866155c9565b905082810360408401526126388185615643565b6020808252825182820181905260009190848201906040850190845b818110156159ba5783518352928401929184019160010161599e565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615a1b57603f19888603018452615a098583516156c8565b945092850192908501906001016159ed565b5092979650505050505050565b602081526000610eaf6020830184615643565b604081526000615a4e6040830185615643565b8281036020840152614a338185615643565b83151581528215156020820152606060408201526000614a33606083018461569c565b8281526040602082015260006115fb6040830184615643565b848152608060208201526000615ab560808301866156c8565b6040830194909452506060015292915050565b602081526000610eaf602083018461569c565b604081526000615aee604083018561569c565b8281036020840152614a33818561569c565b6000602080835260008454615b1481615de5565b80848701526040600180841660008114615b355760018114615b4957615b77565b60ff19851689840152606089019550615b77565b896000528660002060005b85811015615b6f5781548b8201860152908301908801615b54565b8a0184019650505b509398975050505050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008235609e1983360301811261573457600080fd5b60008235607e1983360301811261573457600080fd5b60405160a081016001600160401b0381118282101715615c6757615c67615e8d565b60405290565b60006001600160401b03821115615c8657615c86615e8d565b5060051b60200190565b60006001600160401b03821115615ca957615ca9615e8d565b50601f01601f191660200190565b60008219821115615cca57615cca615e61565b500190565b600082615cec57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615d0357615d03615e61565b500390565b600060a08236031215615d1a57600080fd5b615d22615c45565b82356001600160401b0380821115615d3957600080fd5b615d4536838701614a3c565b835260208501356020840152604085013560408401526060850135915080821115615d6f57600080fd5b615d7b36838701614780565b60608401526080850135915080821115615d9457600080fd5b50615da136828601614873565b60808301525092915050565b60006107b23683614a3c565b60005b83811015615dd4578181015183820152602001615dbc565b83811115611e505750506000910152565b600181811c90821680615df957607f821691505b6020821081141561410b57634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b0381118282101715615e3f57615e3f615e8d565b6040525050565b6000600019821415615e5a57615e5a615e61565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615ebc5760046000803e5060005160e01c5b90565b600060443d1015615ecd5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615efc57505050505090565b8285019150815181811115615f145750505050505090565b843d8701016020828501011115615f2e5750505050505090565b615f3d60208286010187615e1a565b509095945050505050565b6001600160a01b038116811461471257600080fd5b801515811461471257600080fd5b6001600160e01b03198116811461471257600080fdfea2646970667358221220fad2fb7153eda02e6c43744615766b767dc0efc5caebd9d4d300000cb28e3aeb64736f6c63430008060033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

-----Decoded View---------------
Arg [0] : lazyInitData (bytes): 0x000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [6] : 0000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e
Arg [7] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [8] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [9] : 697066733a2f2f697066732f516d64375736396d417779794d75563458433359
Arg [10] : 5167534a366b5156436e537846714b4b46655258335341736a4a000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [12] : 00000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f
Arg [13] : 000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3


Deployed Bytecode Sourcemap

36417:23993:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41281:126;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44363:142;;;;;;:::i;:::-;;:::i;:::-;;;40635:25:1;;;40623:2;40608:18;44363:142:0;40590:76:1;26623:629:0;;;;;;:::i;:::-;;:::i;:::-;;;40078:14:1;;40071:22;40053:41;;40041:2;40026:18;26623:629:0;40008:92:1;30882:196:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;33249:32:1;;;33231:51;;33219:2;33204:18;30882:196:0;33186:102:1;41178:95:0;41251:14;;;;;;;;;;;;-1:-1:-1;;;41251:14:0;;;;41178:95;;48266:472;;;;;;:::i;:::-;;:::i;:::-;;42173:673;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41945:220::-;;;;;;:::i;:::-;;:::i;36705:51::-;;;;;-1:-1:-1;;;;;36705:51:0;;;45869:355;;;;;;:::i;:::-;;:::i;36834:53::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;41654:95::-;;;;;;:::i;:::-;-1:-1:-1;41739:2:0;;41654:95;47543:155;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26454:161::-;;;;;;:::i;:::-;;:::i;47706:552::-;;;;;;:::i;:::-;;:::i;44513:322::-;;;;;;:::i;:::-;;:::i;41516:130::-;;;;;;:::i;:::-;;:::i;49729:139::-;;;;;;:::i;:::-;49807:7;49834:12;;;:4;:12;;;;;;;;-1:-1:-1;;;;;49834:26:0;;;;;;:19;;;;:26;;;;;49729:139;46758:224;;;;;;:::i;:::-;;:::i;46990:545::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;44843:276::-;;;;;;:::i;:::-;;:::i;48746:975::-;;;;;;:::i;:::-;;:::i;46373:169::-;;;;;;:::i;:::-;;:::i;42854:654::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41757:180::-;;;;;;:::i;:::-;;:::i;36894:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;46550:200::-;;;;;;:::i;:::-;;:::i;43516:704::-;;;;;;:::i;:::-;;:::i;41415:93::-;41490:10;;;;;;;;;;;;-1:-1:-1;;;41490:10:0;;;;41415:93;;30698:176;;;;;;:::i;:::-;;:::i;26225:35::-;;;;;-1:-1:-1;;;;;26225:35:0;;;45127:208;;;;;;:::i;:::-;;:::i;44228:127::-;;;;;;:::i;:::-;44296:7;44323:12;;;:4;:12;;;;;:24;;;;44228:127;45343:186;;;;;;:::i;:::-;;:::i;29542:31::-;;;:::i;27260:156::-;;;;;;:::i;:::-;;:::i;29580:42::-;;;;;-1:-1:-1;;;;;29580:42:0;;;27424:840;;;;;;:::i;:::-;;:::i;36550:146::-;;36601:95;36550:146;;49876:156;;;:::i;:::-;;;;;;;;:::i;36950:77::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30585:105;;;:::i;45537:324::-;;;;;;:::i;:::-;;:::i;26267:28::-;;;;;-1:-1:-1;;;;;26267:28:0;;;46232:133;;;;;;:::i;:::-;;:::i;41281:126::-;41375:12;;;;:4;:12;;;;;:24;;41368:31;;41342:13;;41375:24;41368:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41281:126;;;:::o;44363:142::-;44443:7;44470:8;;;:4;:8;;;;;;;;-1:-1:-1;;;;;44470:27:0;;;;:18;;;:27;;;;;44363:142;;;;;:::o;26623:629::-;26701:4;-1:-1:-1;;;;;;26738:40:0;;-1:-1:-1;;;26738:40:0;;:103;;-1:-1:-1;;;;;;;26795:46:0;;-1:-1:-1;;;26795:46:0;26738:103;:176;;;-1:-1:-1;;;;;;;26858:56:0;;-1:-1:-1;;;26858:56:0;26738:176;:230;;;-1:-1:-1;;;;;;;26931:37:0;;-1:-1:-1;;;26931:37:0;26738:230;:287;;;-1:-1:-1;;;;;;;26985:40:0;;-1:-1:-1;;;26985:40:0;26738:287;:355;;;-1:-1:-1;;;;;;;27042:51:0;;-1:-1:-1;;;27042:51:0;26738:355;:405;;;-1:-1:-1;;;;;;;27110:33:0;;-1:-1:-1;;;27110:33:0;26738:405;:458;;;-1:-1:-1;;;;;;;27160:36:0;;-1:-1:-1;;;27160:36:0;26738:458;:506;;;;27213:31;27232:11;27213:18;:31::i;30882:196::-;30972:16;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;31012:18:0::1;::::0;;-1:-1:-1;;;;;31041:29:0;;::::1;-1:-1:-1::0;;;;;;31041:29:0;::::1;;::::0;;;31012:18:::1;::::0;30882:196::o;48266:472::-;48361:7;48358:85;;;48385:25;48405:4;;48385:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48385:19:0;;-1:-1:-1;;;48385:25:0:i;:::-;48266:472;;;:::o;48358:85::-;48454:16;;;;;48541:63;;;;48552:4;48541:63;:::i;:::-;48453:151;;;;;;;;;;48615:115;48635:43;48671:6;48635:35;:43::i;:::-;48680:8;48690:6;48698:9;48709:6;48717;48725:4;48615:19;:115::i;:::-;48347:391;;;;;48266:472;;;:::o;42173:673::-;42291:25;42354:6;-1:-1:-1;;;;;42341:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42329:39;;42383:9;42379:460;42398:17;;;42379:460;;;42437:23;42463:10;:28;42474:13;;42488:1;42474:16;;;;;;;:::i;:::-;;;;;;;;;;42463:28;;-1:-1:-1;42463:28:0;;;;;;;;;;;-1:-1:-1;42463:28:0;42515:23;;;;;;;;;;-1:-1:-1;;;;;42515:23:0;;;;;;;;42463:28;;-1:-1:-1;42548:10:0;;42463:28;;42515:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;42525:1;42515:12;;;;;;;;:::i;:::-;;;;;;:23;;;42514:30;;;-1:-1:-1;;;;;42514:44:0;;42506:69;;;;-1:-1:-1;;;42506:69:0;;;;;;;:::i;:::-;42590:15;42640:38;42656:6;;42663:1;42656:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;42640:38;;;:::i;:::-;42675:1;42640:15;:38::i;:::-;42609:10;:28;42620:13;;42634:1;42620:16;;;;;;;:::i;:::-;;;;;;;;;;42609:28;;-1:-1:-1;42609:28:0;;;;;;;;;-1:-1:-1;42609:28:0;:69;;;;-1:-1:-1;;;;;;42609:69:0;-1:-1:-1;;;;;42609:69:0;;;;;;;;;;;;:28;;:69;;-1:-1:-1;42609:69:0;;;;;;;;:::i;:::-;-1:-1:-1;42609:69:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42609:69:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42608:76:0;42713:12;;-1:-1:-1;;;;;42608:76:0;;;;-1:-1:-1;42713:9:0;;-1:-1:-1;42723:1:0;;42713:12;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;42702:28:0;:7;-1:-1:-1;;;;;42702:28:0;;42699:129;;42795:13;;42809:1;42795:16;;;;;;;:::i;:::-;;;;;;;42786:7;-1:-1:-1;;;;;42756:56:0;42767:9;42777:1;42767:12;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;42756:56:0;;;;;;;;;;;42699:129;42422:417;;42417:3;;;;;:::i;:::-;;;;42379:460;;;;42173:673;;;;;;:::o;41945:220::-;42031:25;42059:12;;;:4;:12;;;;;42094:19;;;42089:68;;42005:13;;42059:12;42089:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42126:21:0;;42115:41;;;;-1:-1:-1;42126:21:0;;-1:-1:-1;42149:6:0;;-1:-1:-1;42115:41:0;;43015:25:1;;;43071:2;43056:18;;43049:34;43003:2;42988:18;;42970:119;42115:41:0;;;;;;;;;;;;;42089:4;:68::i;:::-;42082:75;41945:220;-1:-1:-1;;;41945:220:0:o;45869:355::-;46032:72;46052:10;46064:4;46070:2;46074:7;;46032:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46032:72:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46083:7:0;;-1:-1:-1;46083:7:0;;;;46032:72;;;46083:7;;46032:72;46083:7;46032:72;;;;;;;;-1:-1:-1;46032:72:0;-1:-1:-1;46099:4:0;;-1:-1:-1;46032:19:0;;-1:-1:-1;46032:72:0:i;:::-;46115:101;46171:10;46183:4;46189:2;46193:7;;46202;;46211:4;;46115:55;:101::i;36834:53::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36834:53:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47543:155::-;47617:16;47653:37;47680:1;47684:5;;47653:18;:37::i;26454:161::-;26528:29;26577:30;26594:12;;26577:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26577:16:0;;-1:-1:-1;;;26577:30:0:i;47706:552::-;47818:25;47846:10;-1:-1:-1;;;;;47846:21:0;;;:82;;47885:43;47921:6;47885:35;:43::i;:::-;47846:82;;;47870:12;;;;:4;:12;;;;;47846:82;47818:110;-1:-1:-1;;;;;;47947:21:0;;47939:61;;;;-1:-1:-1;;;47939:61:0;;46850:2:1;47939:61:0;;;46832:21:1;46889:2;46869:18;;;46862:30;46928:29;46908:18;;;46901:57;46975:18;;47939:61:0;46822:177:1;47939:61:0;-1:-1:-1;;;;;48011:27:0;;;;;;;:18;;;:27;;;;;;;;:36;;;;;;;;;;:45;;;48070:38;;:10;:38;48067:184;;48202:36;;;-1:-1:-1;;;;;35080:15:1;;;48202:36:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;48202:36:0;;;;;;;;;;34997:18:1;;;48202:36:0;;;;-1:-1:-1;;;48125:114:0;;;:63;;;;;:114;;48189:4;;-1:-1:-1;;48202:36:0;48125:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48067:184;47807:451;47706:552;;;;:::o;44513:322::-;44622:25;44685:3;-1:-1:-1;;;;;44671:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44671:25:0;;44660:36;;44711:9;44707:121;44730:8;:15;44726:1;:19;44707:121;;;44781:4;:12;44786:3;;44790:1;44786:6;;;;;;;:::i;:::-;;;;;;;44781:12;;;;;;;;;;;:22;;:35;44804:8;;44813:1;44804:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44781:35:0;-1:-1:-1;;;;;44781:35:0;;;;;;;;;;;;;44767:8;44776:1;44767:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;44747:3;;;;:::i;:::-;;;;44707:121;;41516:130;41612:12;;;;:4;:12;;;;;:26;;41605:33;;41579:13;;41612:26;41605:33;;;:::i;46758:224::-;46891:83;46911:10;46923:7;46940:1;46944:7;;46891:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46891:83:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46953:7:0;;-1:-1:-1;46953:7:0;;;;46891:83;;;46953:7;;46891:83;46953:7;46891:83;;;;;;;;-1:-1:-1;46891:83:0;-1:-1:-1;46969:4:0;;-1:-1:-1;46891:19:0;;-1:-1:-1;46891:83:0:i;:::-;46758:224;;;;;;:::o;46990:545::-;47100:20;47122:24;47100:20;47265:40;;47281:11;47265:40;:::i;:::-;47249:9;:11;;47195:10;;:67;;47221:40;;47195:67;47249:11;;;:::i;:::-;;;;;47221:27;:40::i;:::-;47195:67;;;;;;;;;;;;;;;-1:-1:-1;47195:67:0;:110;;;;-1:-1:-1;;;;;;47195:110:0;-1:-1:-1;;;;;47195:110:0;;;;;;;;;;;;:67;;-1:-1:-1;47195:67:0;;:110;;-1:-1:-1;47195:110:0;;;;;;;;:::i;:::-;-1:-1:-1;47195:110:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47195:110:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47325:22:0;;47195:110;;-1:-1:-1;;;;;;47325:22:0;:36;;;-1:-1:-1;47325:36:0;:56;;-1:-1:-1;47365:16:0;;;47325:56;47317:74;;;;-1:-1:-1;;;47317:74:0;;50613:2:1;47317:74:0;;;50595:21:1;50652:1;50632:18;;;50625:29;-1:-1:-1;;;50670:18:1;;;50663:35;50715:18;;47317:74:0;50585:154:1;47317:74:0;47430:22;;47407:60;;47454:12;;-1:-1:-1;;;;;47430:22:0;;;;47407:60;;47430:22;;47407:60;47488:39;47507:12;47521:5;;47488:18;:39::i;:::-;47478:49;;47148:387;46990:545;;;;;;:::o;44843:276::-;-1:-1:-1;;;;;44969:23:0;;;44942:7;44969:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;;;;:142;;45073:12;;;;:4;:12;;;;;;;;-1:-1:-1;;;;;45073:29:0;;;;;:22;;;;:29;;;;;:38;;;;;;;;;;;44969:142;;;-1:-1:-1;;44969:142:0;44962:149;44843:276;-1:-1:-1;;;;44843:276:0:o;48746:975::-;48930:8;48911:15;:27;;48903:69;;;;-1:-1:-1;;;48903:69:0;;48232:2:1;48903:69:0;;;48214:21:1;48271:2;48251:18;;;48244:30;48310:31;48290:18;;;48283:59;48359:18;;48903:69:0;48204:179:1;48903:69:0;48983:25;49011:12;;;:4;:12;;;;;;;;49139:24;;;;-1:-1:-1;;;;;49243:22:0;;;;:15;;;:22;;;;;;:24;;49011:12;;48983:25;49139:24;36601:95;;49220:5;;49227:7;;49236:5;;49243:24;48983:25;49243:24;;;:::i;:::-;;;;-1:-1:-1;49192:86:0;;;;;;40958:25:1;;;;-1:-1:-1;;;;;41057:15:1;;;41037:18;;;41030:43;41109:15;;;;41089:18;;;41082:43;41141:18;;;41134:34;41184:19;;;41177:35;41228:19;;;41221:35;;;40930:19;;49192:86:0;;;;;;;;;;;;49182:97;;;;;;49075:219;;;;;;;;-1:-1:-1;;;32946:27:1;;32998:1;32989:11;;32982:27;;;;33034:2;33025:12;;33018:28;33071:2;33062:12;;32936:144;49075:219:0;;;;-1:-1:-1;;49075:219:0;;;;;;;;;49051:254;;49075:219;49051:254;;;;49316:24;49343:26;;;;;;;;;43321:25:1;;;43394:4;43382:17;;43362:18;;;43355:45;;;;43416:18;;;43409:34;;;43459:18;;;43452:34;;;49051:254:0;;-1:-1:-1;49316:24:0;49343:26;;43293:19:1;;49343:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49343:26:0;;-1:-1:-1;;49343:26:0;;;-1:-1:-1;;;;;;;49388:30:0;;;;;;:59;;;49442:5;-1:-1:-1;;;;;49422:25:0;:16;-1:-1:-1;;;;;49422:25:0;;49388:59;49380:89;;;;-1:-1:-1;;;49380:89:0;;48590:2:1;49380:89:0;;;48572:21:1;48629:2;48609:18;;;48602:30;-1:-1:-1;;;48648:18:1;;;48641:47;48705:18;;49380:89:0;48562:167:1;49380:89:0;-1:-1:-1;;;;;49480:25:0;;;;;;;:18;;;:25;;;;;;;;:34;;;;;;;;;;:42;;;49536:38;;:10;:38;49533:181;;49668:33;;;-1:-1:-1;;;;;35080:15:1;;;49668:33:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;49668:33:0;;;;;;;;;;34997:18:1;;;49668:33:0;;;;-1:-1:-1;;;49591:111:0;;;:63;;;;;:111;;49655:4;;-1:-1:-1;;49668:33:0;49591:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49533:181;48892:829;;;48746:975;;;;;;;;:::o;46373:169::-;46494:40;46504:7;46513;;46522;;46494:40;;;;;;;;;;;;:9;:40::i;42854:654::-;42970:33;43049:7;-1:-1:-1;;;;;43035:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43035:29:0;;43016:48;;43079:9;43075:426;43094:18;;;43075:426;;;43134:25;43162:4;:16;43167:7;;43175:1;43167:10;;;;;;;:::i;:::-;;;;;;;43162:16;;;;;;;;;;;43134:44;;43265:10;-1:-1:-1;;;;;43201:74:0;:10;:55;43234:8;:21;;;43212:16;43229:1;43212:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;;43201:55;;;;;;;;;;;-1:-1:-1;43201:55:0;:60;-1:-1:-1;;;;;43201:60:0;:74;43193:99;;;;-1:-1:-1;;;43193:99:0;;;;;;;:::i;:::-;43316:73;43331:10;:52;43366:13;;43380:1;43366:16;;;;;;;:::i;:::-;;;;;;;43342:8;:21;;:40;;;43331:52;;;;;;;;;;;:57;;43316:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:73::i;:::-;43315:74;43307:97;;;;-1:-1:-1;;;43307:97:0;;49940:2:1;43307:97:0;;;49922:21:1;49979:2;49959:18;;;49952:30;-1:-1:-1;;;49998:18:1;;;49991:40;50048:18;;43307:97:0;49912:160:1;43307:97:0;43478:7;;43486:1;43478:10;;;;;;;:::i;:::-;;;;;;;43460:13;;43474:1;43460:16;;;;;;;:::i;:::-;;;;;;;43439;43456:1;43439:19;;;;;;;;:::i;:::-;;;;;;;43424:65;;;;;;;;;;-1:-1:-1;43114:3:0;;;;:::i;:::-;;;;43075:426;;41757:180;41871:24;;;;:10;:24;;;;;:28;;41866:63;;41833:13;;41866:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41912:12;41926:1;41901:27;;;;;;;;42278:25:1;;;42351:4;42339:17;42334:2;42319:18;;42312:45;42266:2;42251:18;;42233:130;36894:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36894:49:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46550:200::-;46674:12;;;;:4;:12;;;;;46654:88;;46688:10;;46700:7;;46679:6;46729;46737:4;46654:19;:88::i;:::-;46550:200;;;;:::o;43516:704::-;43622:25;43685:6;-1:-1:-1;;;;;43672:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43660:39;;43714:9;43710:503;43729:17;;;43710:503;;;43768:25;43796:4;:16;43801:7;;43809:1;43801:10;;;;;;;:::i;:::-;;;;;;;43796:16;;;;;;;;;;;43768:44;;43842:8;:15;;43827:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43827:30:0;-1:-1:-1;;;;;43827:30:0;-1:-1:-1;;;;;43827:30:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;43837:1;43827:12;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;;43891:21;;43880:33;;;;:10;:33;;;;;;:38;-1:-1:-1;;;;;43880:38:0;43922:10;43880:52;43872:77;;;;-1:-1:-1;;;43872:77:0;;;;;;;:::i;:::-;43982:49;43998:6;;44005:1;43998:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43982:49;;;:::i;:::-;44009:21;;43982:15;:49::i;:::-;43964:67;;:15;;;:67;;-1:-1:-1;;;;;;43964:67:0;-1:-1:-1;;;;;43964:67:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43964:67:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43964:67:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;44106:9;44116:1;44106:12;;;;;;;;:::i;:::-;;;;;;;:16;;;44090:34;;;;;;44065:8;:15;;:19;;44049:37;;;;;;:::i;:::-;;;;;;;;:75;44046:156;;44175:7;;44183:1;44175:10;;;;;;;:::i;:::-;;;;;;;44150:36;44154:8;:15;;:19;;44150:36;;;;;;:::i;:::-;;;;;;;;44046:156;-1:-1:-1;43748:3:0;;;;:::i;:::-;;;;43710:503;;30698:176;30782:22;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;30828:8:::1;30817:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30858:8;;30847;:19;;;;;;;:::i;:::-;;30698:176:::0;;;;:::o;45127:208::-;45233:10;45216:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;45216:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;45216:49:0;;;;;;;;;;45281:46;;40053:41:1;;;45216:38:0;;45233:10;45281:46;;40026:18:1;45281:46:0;;;;;;;45127:208;;:::o;45343:186::-;45415:7;45442:12;;;:4;:12;;;;;:25;:39;:79;;45513:6;45442:79;;;45492:1;45435:86;45343:186;-1:-1:-1;;45343:186:0:o;29542:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27260:156::-;27336:16;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;-1:-1:-1;27392:4:0::1;:15:::0;;-1:-1:-1;;;;;;27392:15:0::1;-1:-1:-1::0;;;;;27392:15:0;::::1;::::0;;::::1;::::0;;;27370:38:::1;::::0;27392:15;;;;27370:38:::1;::::0;-1:-1:-1;;27370:38:0::1;27260:156:::0;;;:::o;27424:840::-;27584:4;27602:39;27643:33;27680:68;27704:7;27713:8;27723;27733:7;;27742:5;27680:23;:68::i;:::-;27601:147;;;;27762:34;27759:101;;;27820:28;-1:-1:-1;27813:35:0;;-1:-1:-1;27813:35:0;27759:101;27884:4;;-1:-1:-1;;;;;27873:15:0;;;27884:4;;27873:15;27870:58;;;27912:4;27905:11;;;;;;27870:58;27942:4;;:17;;-1:-1:-1;;;;;27942:4:0;:15;:17::i;:::-;27938:62;;27983:5;27976:12;;;;;;27938:62;28051:4;;28067:130;;28011:11;;;;-1:-1:-1;;;;;28051:4:0;;;;-1:-1:-1;;;28090:61:0;28067:130;;28153:7;;28162:8;;28172;;28182:7;;;;28191:5;;28067:130;;;:::i;:::-;;;;-1:-1:-1;;28067:130:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28067:130:0;-1:-1:-1;;;;;;28067:130:0;;;;;;;;;;28051:147;;;;28067:130;28051:147;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28010:188;;;;28216:6;:40;;;;;28237:10;28226:30;;;;;;;;;;;;:::i;:::-;28209:47;;;;;;27424:840;;;;;;;;;:::o;49876:156::-;50004:20;;;;;;;;;;;-1:-1:-1;;;50004:20:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50004:20:0;;;;;49876:156::o;30585:105::-;30631:13;30664:18;30669:8;30664:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:18::i;:::-;30657:25;;30585:105;:::o;45537:324::-;45691:12;;;;:4;:12;;;;;45671:77;;45705:10;45717:4;45723:2;45696:6;45735;45743:4;45671:19;:77::i;:::-;45759:94;45810:10;45822:4;45828:2;45832:6;45840;45848:4;;45759:50;:94::i;46232:133::-;46324:33;46329:7;46338:6;46346;46324:33;;;;;;;;;;;;:4;:33::i;30034:543::-;30113:4;-1:-1:-1;;;;;;30150:63:0;;-1:-1:-1;;;30150:63:0;;:117;;-1:-1:-1;;;;;;;30230:37:0;;-1:-1:-1;;;30230:37:0;30150:117;:166;;;-1:-1:-1;;;;;;;30284:32:0;;-1:-1:-1;;;30284:32:0;30150:166;:230;;;-1:-1:-1;;;;;;;30333:47:0;;-1:-1:-1;;;30333:47:0;30150:230;:282;;;-1:-1:-1;;;;;;;30397:35:0;;-1:-1:-1;;;30397:35:0;30150:282;:349;;;-1:-1:-1;;;;;;;30449:50:0;;-1:-1:-1;;;30449:50:0;30150:349;:419;;;;30516:53;30557:11;30516:40;:53::i;29098:155::-;29142:4;29166:79;29189:10;29209:4;29216:7;;-1:-1:-1;;;;;;29216:7:0;29225:8;;29235:9;29166:22;:79::i;53237:680::-;53304:10;53352:4;53341:31;;;;;;;;;;;;:::i;:::-;53325:47;-1:-1:-1;53325:47:0;-1:-1:-1;53383:490:0;;;;53408:30;53433:4;53408:24;:30::i;:::-;53383:490;;;53472:24;53498;53524:27;53553:24;53579;53618:4;53607:73;;;;;;;;;;;;:::i;:::-;53471:209;;;;;;;;;;53699:9;53695:167;53718:7;:14;53714:1;:18;53695:167;;;53758:88;53778:7;53786:1;53778:10;;;;;;;;:::i;:::-;;;;;;;53790:7;53798:1;53790:10;;;;;;;;:::i;:::-;;;;;;;53802;53813:1;53802:13;;;;;;;;:::i;:::-;;;;;;;53817:7;53825:1;53817:10;;;;;;;;:::i;:::-;;;;;;;53829:7;53837:1;53829:10;;;;;;;;:::i;:::-;;;;;;;53841:4;53758:19;:88::i;:::-;53734:3;;;;:::i;:::-;;;;53695:167;;;;53456:417;;;;;53383:490;53883:26;:24;:26::i;:::-;53293:624;53237:680;:::o;57428:256::-;57511:25;57580:12;;;:4;:12;;;;;;;;57568:38;;57557:50;;:10;:50;;;;;;:55;-1:-1:-1;;;;;57557:55:0;57616:10;57557:69;;:102;;-1:-1:-1;57638:10:0;57630:29;;57557:102;57549:127;;;;-1:-1:-1;;;57549:127:0;;;;;;;:::i;:::-;57428:256;;;:::o;56072:1348::-;-1:-1:-1;;;;;56253:20:0;;;56250:680;;56305:6;-1:-1:-1;;;;;56293:18:0;:8;-1:-1:-1;;;;;56293:18:0;;56290:429;;-1:-1:-1;;;;;56340:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;:46;-1:-1:-1;56340:46:0;;:84;;-1:-1:-1;;;;;;56390:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;56340:84;56332:121;;;;-1:-1:-1;;;56332:121:0;;47879:2:1;56332:121:0;;;47861:21:1;47918:2;47898:18;;;47891:30;47957:26;47937:18;;;47930:54;48001:18;;56332:121:0;47851:174:1;56332:121:0;-1:-1:-1;;;;;56475:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;:46;-1:-1:-1;56472:232:0;;-1:-1:-1;;;;;56546:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;;:46;;56586:6;;56546:26;:46;;56586:6;;56546:46;:::i;:::-;;;;-1:-1:-1;56472:232:0;;-1:-1:-1;56472:232:0;;-1:-1:-1;;;;;56648:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;;56641:43;56472:232;-1:-1:-1;;;;;56741:26:0;;;;;;:18;;;:26;;;;;;:36;-1:-1:-1;56741:36:0;56733:71;;;;-1:-1:-1;;;56733:71:0;;46499:2:1;56733:71:0;;;46481:21:1;46538:2;46518:18;;;46511:30;-1:-1:-1;;;46557:18:1;;;46550:52;46619:18;;56733:71:0;46471:172:1;56733:71:0;-1:-1:-1;;;;;56819:26:0;;;;;;:18;;;:26;;;;;:36;;56849:6;;56819:26;:36;;56849:6;;56819:36;:::i;:::-;;;;-1:-1:-1;56250:680:0;;-1:-1:-1;56250:680:0;;56912:6;56888:8;:20;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;56250:680:0;-1:-1:-1;;;;;56943:23:0;;;56940:157;;-1:-1:-1;;;;;56983:29:0;;;;;;:18;;;:29;;;;;:39;;57016:6;;56983:29;:39;;57016:6;;56983:39;:::i;:::-;;;;-1:-1:-1;56940:157:0;;-1:-1:-1;56940:157:0;;57079:6;57055:8;:20;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;56940:157:0;57110:11;57107:306;;;57176:9;-1:-1:-1;;;;;57143:59:0;57168:6;-1:-1:-1;;;;;57143:59:0;57158:8;-1:-1:-1;;;;;57143:59:0;;57187:6;57195;57143:59;;;;;;43015:25:1;;;43071:2;43056:18;;43049:34;43003:2;42988:18;;42970:119;57143:59:0;;;;;;;;57238:10;57220:29;;57217:185;;57348:37;;;-1:-1:-1;;;;;35080:15:1;;;57348:37:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;57348:37:0;;;;;;;;;;34997:18:1;;;57348:37:0;;;;-1:-1:-1;;;57270:116:0;;;:63;;;;;:116;;-1:-1:-1;;;;57348:37:0;57270:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57217:185;56072:1348;;;;;;;:::o;50040:706::-;50130:13;;:::i;:::-;50165:133;50194:27;50209:6;:11;;;50194:14;:27::i;:::-;:57;;;;-1:-1:-1;50225:26:0;;;50194:57;:103;;50286:6;:11;;;50194:103;;;50254:24;;;;:10;:24;;;;;:29;;50194:103;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50180:6;:11;;:117;;;50165:14;:133::i;:::-;50164:134;50156:151;;;;-1:-1:-1;;;50156:151:0;;;;;;47547:2:1;47529:21;;;47586:1;47566:18;;;47559:29;-1:-1:-1;;;47619:2:1;47604:18;;47597:34;47663:2;47648:18;;47519:153;50156:151:0;50327:141;50358:29;50373:6;:13;;;50358:14;:29::i;:::-;:59;;;;-1:-1:-1;50391:26:0;;;50358:59;:109;;50454:6;:13;;;50358:109;;;50420:24;;;;:10;:24;;;;;:31;;50358:109;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50342:6;:13;;:125;;;50327:14;:141::i;:::-;50326:142;50318:161;;;;-1:-1:-1;;;50318:161:0;;50279:2:1;50318:161:0;;;50261:21:1;50318:1;50298:18;;;50291:29;-1:-1:-1;;;50336:18:1;;;50329:36;50382:18;;50318:161:0;50251:155:1;50318:161:0;50499:129;50527:26;50542:6;:10;;;50527:14;:26::i;:::-;:56;;;;-1:-1:-1;50557:26:0;;;50527:56;:100;;50617:6;:10;;;50527:100;;;50586:24;;;;:10;:24;;;;;:28;;50527:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50514:6;:10;;:113;;;50499:14;:129::i;:::-;50498:130;50490:146;;;;-1:-1:-1;;;50490:146:0;;49277:2:1;50490:146:0;;;49259:21:1;49316:1;49296:18;;;49289:29;-1:-1:-1;;;49334:18:1;;;49327:33;49377:18;;50490:146:0;49249:152:1;50490:146:0;50661:26;:53;;50703:11;;50661:53;;;50698:1;50661:53;-1:-1:-1;;;;;50647:67:0;;;-1:-1:-1;50647:67:0;;50040:706;-1:-1:-1;50040:706:0:o;31086:322::-;31205:18;;31176:13;;-1:-1:-1;;;;;31205:18:0;31202:80;;-1:-1:-1;31261:9:0;31254:16;;31202:80;31319:18;;31299:101;;-1:-1:-1;;;31299:101:0;;-1:-1:-1;;;;;31319:18:0;;;;31299:47;;:101;;31355:4;;31362:9;;31373:14;;31389:10;;31299:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31299:101:0;;;;;;;;;;;;:::i;54421:421::-;54609:9;54605:150;54628:7;:14;54624:1;:18;54605:150;;;54664:79;54684:8;54694:6;54702:9;54713:7;54721:1;54713:10;;;;;;;;:::i;:::-;;;;;;;54725:7;54733:1;54725:10;;;;;;;;:::i;:::-;;;;;;;54737:5;54664:19;:79::i;:::-;54644:3;;;;:::i;:::-;;;;54605:150;;;;54768:12;54765:70;;;54797:26;:24;:26::i;35260:1006::-;35506:15;:2;-1:-1:-1;;;;;35506:13:0;;:15::i;:::-;35502:757;;;35559:203;;-1:-1:-1;;;35559:203:0;;-1:-1:-1;;;;;35559:43:0;;;;;:203;;35625:8;;35656:4;;35683:3;;;;35709:7;;;;35739:4;;;;35559:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35559:203:0;;;;;;;;-1:-1:-1;;35559:203:0;;;;;;;;;;;;:::i;:::-;;;35538:710;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36121:6;36114:14;;-1:-1:-1;;;36114:14:0;;;;;;;;:::i;35538:710::-;;;36170:62;;-1:-1:-1;;;36170:62:0;;45669:2:1;36170:62:0;;;45651:21:1;45708:2;45688:18;;;45681:30;45747:34;45727:18;;;45720:62;-1:-1:-1;;;45798:18:1;;;45791:50;45858:19;;36170:62:0;45641:242:1;35538:710:0;-1:-1:-1;;;;;;35847:85:0;;-1:-1:-1;;;35847:85:0;35821:224;;35975:50;;-1:-1:-1;;;35975:50:0;;;;;;;:::i;35821:224::-;35776:284;35260:1006;;;;;;;;;:::o;50754:2088::-;50856:24;50917:5;-1:-1:-1;;;;;50903:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50903:27:0;;50893:37;;50945:9;50941:1894;50960:16;;;50941:1894;;;50998:30;51031:5;;51037:1;51031:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;50998:41;;;:::i;:::-;;-1:-1:-1;51067:33:0;:55;;51107:12;:15;;;51067:55;;;51103:1;51067:55;51054:7;51062:1;51054:10;;;;;;;;:::i;:::-;;;;;;;;;;:68;51165:33;:143;;51223:15;;;;:85;;51283:12;:25;;;51165:143;;51223:85;51251:15;;;;;51246:21;;;;:4;:21;;;:34;51165:143;;;51201:19;51165:143;51137:25;;;:171;51331:33;;;;:138;;-1:-1:-1;51369:25:0;;;;:39;;;;:99;;-1:-1:-1;51437:25:0;;;;;51426:37;;;;:10;:37;;;;;;:42;-1:-1:-1;;;;;51426:42:0;51412:10;:56;51369:99;51323:163;;;;-1:-1:-1;;;51323:163:0;;;;;;;:::i;:::-;51504:7;51512:1;51504:10;;;;;;;;:::i;:::-;;;;;;;51518:1;51504:15;51501:1246;;;51580:27;;51540:37;;51580:35;;-1:-1:-1;;;;;51580:27:0;:33;:35::i;:::-;51540:75;;51662:29;-1:-1:-1;;;;;51634:63:0;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51718:24;51745:4;:57;51771:29;-1:-1:-1;;;;;51750:51:0;:7;51758:1;51750:10;;;;;;;;:::i;:::-;;;;;;:51;;;;51745:57;;;;;;;;;;;51718:84;;51844:12;:25;;;51821:7;:20;;:48;;;;51905:63;51921:12;:19;;;51942:12;:25;;;51905:15;:63::i;:::-;51888:80;;:14;;;:80;;-1:-1:-1;;;;;;51888:80:0;-1:-1:-1;;;;;51888:80:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51888:80:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51888:80:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;51988:33;52023:36;52063:48;:46;:48::i;:::-;51987:124;;;;52225:95;52363:19;52347:37;;;;;;52427:22;52411:40;;;;;;52478:13;52534:7;52542:1;52534:10;;;;;;;;:::i;:::-;;;;;;;52188:381;;;;;;;;;;;41863:25:1;;;41919:2;41904:18;;41897:34;;;;41962:2;41947:18;;41940:34;;;;42005:2;41990:18;;41983:34;-1:-1:-1;;;;;42054:32:1;42048:3;42033:19;;42026:61;41850:3;41835:19;;41817:276;52188:381:0;;;;;;;;;;;;;52156:432;;;;;;52130:7;:23;;:458;;;;52661:7;52669:1;52661:10;;;;;;;;:::i;:::-;;;;;;;;;;;52639:20;;52612:60;;52639:20;;52612:60;;52639:20;;52612:60;52720:7;52728:1;52720:10;;;;;;;;:::i;:::-;;;;;;;52696:35;52700:7;:14;;:18;;52696:35;;;;;;:::i;:::-;;;;;;;;51521:1226;;;;51501:1246;52761:62;52767:7;52775:1;52767:10;;;;;;;;:::i;:::-;;;;;;;52779:12;:21;;;52802:12;:20;;;52761:5;:62::i;:::-;-1:-1:-1;50978:3:0;;;;:::i;:::-;;;;50941:1894;;;;50754:2088;;;;;:::o;28272:372::-;28415:1;28392:11;28342:29;;-1:-1:-1;;;;;28392:11:0;:25;28384:42;;;;-1:-1:-1;;;28384:42:0;;;;;;49608:2:1;49590:21;;;49647:1;49627:18;;;49620:29;-1:-1:-1;;;49680:2:1;49665:18;;49658:34;49724:2;49709:18;;49580:153;28384:42:0;28437:11;:24;;-1:-1:-1;;;;;;28437:24:0;28451:10;28437:24;;;28499:42;;;;;;;;;;;;;;:::i;:::-;28473:4;28472:69;;-1:-1:-1;;;;;28472:69:0;;;-1:-1:-1;;;;;;28472:69:0;;;;;;;28557:22;;28472:69;;-1:-1:-1;28473:4:0;;28557:22;;28473:4;;28557:22;28609:27;28619:16;28609:9;:27::i;18421:242::-;18474:7;18522:1;18525:15;18542:12;18556:9;18567:11;18580:14;18596:16;18614:10;18636:16;18651:1;18542:12;18636:16;:::i;:::-;18511:143;;;;;;51919:25:1;;;;51960:18;;51953:34;;;;52003:18;;;51996:34;;;;-1:-1:-1;;;;;52104:15:1;;;52084:18;;;52077:43;52136:19;;;52129:35;;;;52201:15;;52180:19;;;52173:44;52233:19;;;52226:35;52298:15;52277:19;;;52270:44;18626:27:0;52330:19:1;;;52323:35;51891:19;;18511:143:0;;;;;;;;;;;;18501:154;;;;;;18494:161;;18421:242;;;:::o;57692:136::-;57781:22;;;;;;;57807:13;57781:39;;57692:136::o;60076:331::-;60217:4;;-1:-1:-1;;;;;60243:25:0;;60263:4;60243:25;:76;;;;-1:-1:-1;;;;;;;60272:47:0;;-1:-1:-1;;;60272:47:0;60243:76;60240:128;;;-1:-1:-1;60344:4:0;;-1:-1:-1;60350:5:0;60336:20;;60240:128;-1:-1:-1;60386:5:0;;-1:-1:-1;60386:5:0;60076:331;;;;;;;;;;:::o;19923:289::-;19983:4;-1:-1:-1;;;;;20003:21:0;;20000:65;;-1:-1:-1;20048:5:0;;19923:289;-1:-1:-1;19923:289:0:o;20000:65::-;-1:-1:-1;20142:20:0;20190:14;;;19923:289::o;34308:944::-;34525:15;:2;-1:-1:-1;;;;;34525:13:0;;:15::i;:::-;34521:724;;;34578:196;;-1:-1:-1;;;34578:196:0;;-1:-1:-1;;;;;34578:38:0;;;;;:196;;34639:8;;34670:4;;34697:2;;34722:6;;34751:4;;;;34578:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34578:196:0;;;;;;;;-1:-1:-1;;34578:196:0;;;;;;;;;;;;:::i;:::-;;;34557:677;;;;:::i;:::-;-1:-1:-1;;;;;;34859:59:0;;-1:-1:-1;;;34859:59:0;34833:198;;34961:50;;-1:-1:-1;;;34961:50:0;;;;;;;:::i;37761:3409::-;37895:46;;37887:86;;-1:-1:-1;;;37887:86:0;;-1:-1:-1;;;;;;43659:33:1;;37887:86:0;;;43641:52:1;37863:4:0;;-1:-1:-1;;;;;37895:46:0;;37887:73;;43614:18:1;;37887:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53925:488::-;53997:22;54033:4;54022:27;;;;;;;;;;;;:::i;:::-;53997:52;;54064:9;54060:346;54083:7;:14;54079:1;:18;54060:346;;;54120:16;54138:14;54154:17;54173:24;54199;54238:7;54246:1;54238:10;;;;;;;;:::i;:::-;;;;;;;54227:73;;;;;;;;;;;;:::i;:::-;54119:181;;;;;;;;;;54315:79;54335:8;54345:6;54353:9;54364:7;54373;54382:4;54388:5;54315:19;:79::i;:::-;54104:302;;;;;54099:3;;;;;:::i;:::-;;;;54060:346;;54850:1214;54998:11;54995:49;;55026:7;;54995:49;55054:18;55075:21;;;:13;:21;;;;;;;;;55133:18;;;:6;:18;;;;;;55165:12;;:17;;:39;;;55198:6;55186:5;55192:1;55186:8;;;;;;;;:::i;:::-;;;;;;;;;:18;;55165:39;55162:171;;;55273:12;:14;;55229:6;;:59;;55273:14;55229:59;55273:14;;;:::i;:::-;;;;-1:-1:-1;55249:21:0;;;;:13;:21;;;;;;;;:38;;;55229:59;;;;;;;;;;;;;;;;55303:18;;;;;;;;;;;;;;;;;;;;55249:38;-1:-1:-1;55229:59:0;-1:-1:-1;55162:171:0;55343:27;;;;;;;;-1:-1:-1;55343:27:0;;;;;;;-1:-1:-1;;;;;55343:27:0;;;;;;;;;;55381:30;;;;;;;;;;;;;;;;;55422:18;;;;;;;;;;;;;55477:45;;;-1:-1:-1;;31423:2:1;31419:15;;;31415:24;;55477:45:0;;;31403:37:1;31474:15;;;31470:24;;31456:12;;;31449:46;31529:15;;;31525:24;31511:12;;;31504:46;55477:45:0;;;;;;;;;31566:12:1;;;;55477:45:0;;55467:56;;;;;;55542:16;;;:11;:16;;;;;55572:12;;55542:16;;55467:56;55569:200;;55606:10;:20;;;;;;;;;;;;;;55641:29;;;;;;;-1:-1:-1;55641:29:0;;;55606:20;55641:29;;-1:-1:-1;;;;;55641:29:0;;;;;;;;;;55685:27;;;;;;;;;;;;;;55727:30;;;;;;;;;;;;;55569:200;55782:18;;;;:13;:18;;;;;;;;:26;;;;;;;;;55779:81;;55830:18;;;;;;;-1:-1:-1;55830:18:0;;;;;;;;;;55779:81;55870:18;;;;:13;:18;;;;;;;;:26;;;;;;;;:36;;55900:6;;55870:18;:36;;55900:6;;55870:36;:::i;:::-;;;;-1:-1:-1;55917:139:0;;-1:-1:-1;55937:5:0;:66;;55991:12;;;;:4;:12;;;;;55937:66;;;55945:43;55981:6;55945:35;:43::i;:::-;56005:8;56015:6;56023:9;56034:6;56042;56050:5;55917:19;:139::i;57836:1148::-;57895:9;57891:1014;57914:12;;57910:1;:16;57891:1014;;;57948:23;57974:9;;;:6;:9;;;;;58015:8;;57974:9;;57948:23;57974:9;;57948:23;;58015:8;;;;:::i;:::-;;;;;;;;;57998:25;;58045:5;58051:1;58045:8;;;;;;;;:::i;:::-;;;;;;;;;58038:15;;;58086:12;;58106:1;;58086:16;;58101:1;;58086:16;:::i;:::-;58085:22;;;;:::i;:::-;58068:39;;58122:24;58163:6;-1:-1:-1;;;;;58149:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58149:21:0;;58122:48;;58185:26;58228:6;-1:-1:-1;;;;;58214:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58214:21:0;;58185:50;;58250:24;58291:6;-1:-1:-1;;;;;58277:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58277:21:0;-1:-1:-1;58250:48:0;-1:-1:-1;58313:11:0;58359:1;58343:345;58366:12;;58362:16;;58343:345;;;58438:5;58444:1;58438:8;;;;;;;;:::i;:::-;;;;;;;;;58407:7;58415:3;58407:12;;;;;;;;:::i;:::-;;;;;;:41;-1:-1:-1;;;;;58407:41:0;;;-1:-1:-1;;;;;58407:41:0;;;;;58474:5;58480:1;58474:8;;;;;;;;:::i;:::-;;;;;;;;;58467:15;58534:5;58540;:1;58544;58540:5;:::i;:::-;58534:12;;;;;;;;:::i;:::-;;;;;;;;;58501:9;58511:3;58501:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58501:47:0;;;:14;;;;;;;;;;;:47;58574:5;58580;:1;58584;58580:5;:::i;:::-;58574:12;;;;;;;;:::i;:::-;;;;;;;;;58567:19;58622:5;58628;:1;58632;58628:5;:::i;:::-;58622:12;;;;;;;;:::i;:::-;;;;;;;;;58605:7;58613:5;;;;;:::i;:::-;;;58605:14;;;;;;;;:::i;:::-;;;;;;;;;;:29;58660:5;58666;:1;58670;58666:5;:::i;:::-;58660:12;;;;;;;;:::i;:::-;;;;;;;;;58653:19;58380:6;58385:1;58380:6;;:::i;:::-;;;58343:345;;;;58746:6;-1:-1:-1;;;;;58702:63:0;;58766:5;58773:4;58790:7;58799:9;58810:7;58779:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58702:117;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58841:21:0;;;;:13;:21;;;;;;;;58834:28;;;58884:9;;;:6;:9;;;;;58877:16;;-1:-1:-1;58884:9:0;58877:16;:::i;:::-;57933:972;;;;;;;57928:3;;;;;:::i;:::-;;;;57891:1014;;;-1:-1:-1;58915:19:0;58922:12;58915:19;58945:31;:29;:31::i;:::-;57836:1148::o;20220:538::-;20278:20;20516:21;20498:16;20494:44;-1:-1:-1;;;;;20380:177:0;20360:1;20335:237;20615:2;20612:1;20609;20602:16;20586:32;-1:-1:-1;20639:25:0;;20682:58;;;;20632:108;;20682:58;20712:9;20632:108;;20220:538;;;:::o;52850:379::-;52957:9;52953:232;52976:8;:15;52972:1;:19;52953:232;;;53044:1;-1:-1:-1;;;;;53021:25:0;:8;53030:1;53021:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;53021:25:0;;;53013:62;;;;-1:-1:-1;;;53013:62:0;;50946:2:1;53013:62:0;;;50928:21:1;50985:2;50965:18;;;50958:30;51024:26;51004:18;;;50997:54;51068:18;;53013:62:0;50918:174:1;53013:62:0;53090:83;53118:1;53130;53134:8;53143:1;53134:11;;;;;;;;:::i;:::-;;;;;;;53147:6;53155:7;53163:1;53155:10;;;;;;;;:::i;:::-;;;;;;;53167:5;53090:19;:83::i;:::-;52993:3;;;;:::i;:::-;;;;52953:232;;;;53195:26;:24;:26::i;29723:303::-;29796:29;29900:12;29889:50;;;;;;;;;;;;:::i;:::-;29849:18;29838:101;;-1:-1:-1;;;;;;29838:101:0;-1:-1:-1;;;;;29838:101:0;;;;;;;;;-1:-1:-1;29838:101:0;;;;29839:8;;29838:101;;;;;:::i;:::-;;;;;29969:49;30001:16;29969:31;:49::i;58992:1076::-;59056:9;59052:981;59075:10;:17;59071:21;;59052:981;;;59114:11;59128:10;59139:1;59128:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;59182:16;;;:11;:16;;;;;;59230:12;;59128:13;;-1:-1:-1;59182:16:0;59128:13;59230:16;;59245:1;;59230:16;:::i;:::-;59213:33;;59261:16;59296:5;59302:1;59296:8;;;;;;;;:::i;:::-;;;;;;;;;59261:45;;59328:5;59334:1;59328:8;;;;;;;;:::i;:::-;;;;;;;;59321:15;;;59351:14;59384:5;59390:1;59384:8;;;;;;;;:::i;:::-;;;;;;;;;59351:43;;59416:5;59422:1;59416:8;;;;;;;;:::i;:::-;;;;;;;;59409:15;;;59439:16;59474:5;59480:1;59474:8;;;;;;;;:::i;:::-;;;;;;;;;59439:45;;59506:5;59512:1;59506:8;;;;;;;;:::i;:::-;;;;;;;;59499:15;;;59529:11;59559:24;59600:6;-1:-1:-1;;;;;59586:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59586:21:0;;59559:48;;59622:24;59663:6;-1:-1:-1;;;;;59649:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59649:21:0;-1:-1:-1;59622:48:0;-1:-1:-1;59701:1:0;59685:220;59708:12;;59704:16;;59685:220;;;59761:13;:18;59775:3;59761:18;;;;;;;;;;;:43;59795:5;59801:1;59795:8;;;;;;;;:::i;:::-;;;;;;;;;59780:7;59788:3;59780:12;;;;;;;;:::i;:::-;;;;;;:23;;;;59761:43;;;;;;;;;;;;59746:7;59754:3;59746:12;;;;;;;;:::i;:::-;;;;;;:58;;;;;59830:5;59836:1;59830:8;;;;;;;;:::i;:::-;;;;;;;;;;;;59823:15;;;59864:18;;;:13;:18;;;;;;59883:5;;;;:::i;:::-;;;59864:25;;;;;;;;;;;59857:32;;;59722:3;;;;;:::i;:::-;;;;59685:220;;;;59956:8;-1:-1:-1;;;;;59924:59:0;59948:6;-1:-1:-1;;;;;59924:59:0;59938:8;-1:-1:-1;;;;;59924:59:0;;59966:7;59975;59924:59;;;;;;;:::i;:::-;;;;;;;;60005:16;;;;:11;:16;;;;;59998:23;;;:::i;:::-;59099:934;;;;;;;;;59094:3;;;;;:::i;:::-;;;;59052:981;;;-1:-1:-1;60043:17:0;60050:10;;60043:17;:::i;37482:271::-;37576:12;37692;37681:44;;;;;;;;;;;;:::i;:::-;37631:46;37601:124;;-1:-1:-1;;;;;37601:124:0;;;-1:-1:-1;;;;;;37601:124:0;;;;;;;37602:27;37601:124;;;;;;;;;;;;;;-1:-1:-1;;37736:9:0;;;;;;;;;37602:27;37736:9;;;37482:271::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;298:1;295;288:12;247:2;-1:-1:-1;321:20:1;;-1:-1:-1;;;;;353:30:1;;350:2;;;396:1;393;386:12;350:2;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:2;;;510:1;507;500:12;447:2;237:283;;;;;:::o;525:810::-;579:5;632:3;625:4;617:6;613:17;609:27;599:2;;650:1;647;640:12;599:2;686:6;673:20;712:4;735:43;775:2;735:43;:::i;:::-;807:2;801:9;819:31;847:2;839:6;819:31;:::i;:::-;885:18;;;919:15;;;;-1:-1:-1;954:15:1;;;1004:1;1000:10;;;988:23;;984:32;;981:41;-1:-1:-1;978:2:1;;;1035:1;1032;1025:12;978:2;1057:1;1067:238;1081:2;1078:1;1075:9;1067:238;;;1152:3;1139:17;1169:31;1194:5;1169:31;:::i;:::-;1213:18;;1251:12;;;;1283;;;;1099:1;1092:9;1067:238;;;-1:-1:-1;1323:6:1;;589:746;-1:-1:-1;;;;;;;589:746:1:o;1340:807::-;1405:5;1458:3;1451:4;1443:6;1439:17;1435:27;1425:2;;1476:1;1473;1466:12;1425:2;1505:6;1499:13;1531:4;1554:43;1594:2;1554:43;:::i;:::-;1626:2;1620:9;1638:31;1666:2;1658:6;1638:31;:::i;:::-;1704:18;;;1738:15;;;;-1:-1:-1;1773:15:1;;;1823:1;1819:10;;;1807:23;;1803:32;;1800:41;-1:-1:-1;1797:2:1;;;1854:1;1851;1844:12;1797:2;1876:1;1886:231;1900:2;1897:1;1894:9;1886:231;;;1964:3;1958:10;1981:31;2006:5;1981:31;:::i;:::-;2025:18;;2063:12;;;;2095;;;;1918:1;1911:9;1886:231;;2152:735;2206:5;2259:3;2252:4;2244:6;2240:17;2236:27;2226:2;;2277:1;2274;2267:12;2226:2;2313:6;2300:20;2339:4;2362:43;2402:2;2362:43;:::i;:::-;2434:2;2428:9;2446:31;2474:2;2466:6;2446:31;:::i;:::-;2512:18;;;2546:15;;;;-1:-1:-1;2581:15:1;;;2631:1;2627:10;;;2615:23;;2611:32;;2608:41;-1:-1:-1;2605:2:1;;;2662:1;2659;2652:12;2605:2;2684:1;2694:163;2708:2;2705:1;2702:9;2694:163;;;2765:17;;2753:30;;2803:12;;;;2835;;;;2726:1;2719:9;2694:163;;2892:732;2957:5;3010:3;3003:4;2995:6;2991:17;2987:27;2977:2;;3028:1;3025;3018:12;2977:2;3057:6;3051:13;3083:4;3106:43;3146:2;3106:43;:::i;:::-;3178:2;3172:9;3190:31;3218:2;3210:6;3190:31;:::i;:::-;3256:18;;;3290:15;;;;-1:-1:-1;3325:15:1;;;3375:1;3371:10;;;3359:23;;3355:32;;3352:41;-1:-1:-1;3349:2:1;;;3406:1;3403;3396:12;3349:2;3428:1;3438:156;3452:2;3449:1;3446:9;3438:156;;;3509:10;;3497:23;;3540:12;;;;3572;;;;3470:1;3463:9;3438:156;;3629:347;3680:8;3690:6;3744:3;3737:4;3729:6;3725:17;3721:27;3711:2;;3762:1;3759;3752:12;3711:2;-1:-1:-1;3785:20:1;;-1:-1:-1;;;;;3817:30:1;;3814:2;;;3860:1;3857;3850:12;3814:2;3897:4;3889:6;3885:17;3873:29;;3949:3;3942:4;3933:6;3925;3921:19;3917:30;3914:39;3911:2;;;3966:1;3963;3956:12;3981:508;4023:5;4076:3;4069:4;4061:6;4057:17;4053:27;4043:2;;4094:1;4091;4084:12;4043:2;4130:6;4117:20;4156:31;4184:2;4156:31;:::i;:::-;4216:2;4210:9;4228:31;4256:2;4248:6;4228:31;:::i;:::-;4283:2;4275:6;4268:18;4329:3;4322:4;4317:2;4309:6;4305:15;4301:26;4298:35;4295:2;;;4346:1;4343;4336:12;4295:2;4410;4403:4;4395:6;4391:17;4384:4;4376:6;4372:17;4359:54;4457:1;4433:15;;;4450:4;4429:26;4422:37;;;;-1:-1:-1;4437:6:1;4033:456;-1:-1:-1;;;4033:456:1:o;4494:475::-;4547:5;4600:3;4593:4;4585:6;4581:17;4577:27;4567:2;;4618:1;4615;4608:12;4567:2;4647:6;4641:13;4673:31;4701:2;4673:31;:::i;:::-;4733:2;4727:9;4745:31;4773:2;4765:6;4745:31;:::i;:::-;4800:2;4792:6;4785:18;4846:3;4839:4;4834:2;4826:6;4822:15;4818:26;4815:35;4812:2;;;4863:1;4860;4853:12;4812:2;4876:63;4936:2;4929:4;4921:6;4917:17;4910:4;4902:6;4898:17;4876:63;:::i;:::-;4957:6;4557:412;-1:-1:-1;;;;;4557:412:1:o;4974:975::-;5027:5;5075:4;5063:9;5058:3;5054:19;5050:30;5047:2;;;5093:1;5090;5083:12;5047:2;5126;5120:9;5168:4;5160:6;5156:17;-1:-1:-1;;;;;5260:6:1;5248:10;5245:22;5240:2;5228:10;5225:18;5222:46;5219:2;;;5271:18;;:::i;:::-;5311:10;5307:2;5300:22;5340:6;5331:15;;5370:29;5389:9;5370:29;:::i;:::-;5362:6;5355:45;5451:2;5440:9;5436:18;5423:32;5409:46;;5478:2;5470:6;5467:14;5464:2;;;5494:1;5491;5484:12;5464:2;5531:45;5572:3;5563:6;5552:9;5548:22;5531:45;:::i;:::-;5526:2;5518:6;5514:15;5507:70;5630:2;5619:9;5615:18;5602:32;5586:48;;5659:2;5649:8;5646:16;5643:2;;;5675:1;5672;5665:12;5643:2;5712:47;5755:3;5744:8;5733:9;5729:24;5712:47;:::i;:::-;5707:2;5699:6;5695:15;5688:72;5813:2;5802:9;5798:18;5785:32;5769:48;;5842:2;5832:8;5829:16;5826:2;;;5858:1;5855;5848:12;5826:2;;5895:47;5938:3;5927:8;5916:9;5912:24;5895:47;:::i;:::-;5890:2;5882:6;5878:15;5871:72;;;5037:912;;;;:::o;5954:247::-;6013:6;6066:2;6054:9;6045:7;6041:23;6037:32;6034:2;;;6082:1;6079;6072:12;6034:2;6121:9;6108:23;6140:31;6165:5;6140:31;:::i;6206:401::-;6301:6;6309;6362:2;6350:9;6341:7;6337:23;6333:32;6330:2;;;6378:1;6375;6368:12;6330:2;6410:9;6404:16;6429:31;6454:5;6429:31;:::i;:::-;6529:2;6514:18;;6508:25;6479:5;;-1:-1:-1;6542:33:1;6508:25;6542:33;:::i;:::-;6594:7;6584:17;;;6320:287;;;;;:::o;6612:1036::-;6792:6;6800;6808;6816;6824;6877:3;6865:9;6856:7;6852:23;6848:33;6845:2;;;6894:1;6891;6884:12;6845:2;6926:9;6920:16;6945:31;6970:5;6945:31;:::i;:::-;7045:2;7030:18;;7024:25;6995:5;;-1:-1:-1;7058:33:1;7024:25;7058:33;:::i;:::-;7162:2;7147:18;;7141:25;7110:7;;-1:-1:-1;7175:33:1;7141:25;7175:33;:::i;:::-;7278:2;7263:18;;7257:25;7227:7;;-1:-1:-1;;;;;;7331:14:1;;;7328:2;;;7358:1;7355;7348:12;7328:2;7381:72;7445:7;7436:6;7425:9;7421:22;7381:72;:::i;:::-;7371:82;;7499:3;7488:9;7484:19;7478:26;7462:42;;7529:2;7519:8;7516:16;7513:2;;;7545:1;7542;7535:12;7513:2;;7568:74;7634:7;7623:8;7612:9;7608:24;7568:74;:::i;:::-;7558:84;;;6835:813;;;;;;;;:::o;7653:691::-;7772:6;7780;7788;7796;7804;7857:3;7845:9;7836:7;7832:23;7828:33;7825:2;;;7874:1;7871;7864:12;7825:2;7913:9;7900:23;7932:31;7957:5;7932:31;:::i;:::-;7982:5;-1:-1:-1;8039:2:1;8024:18;;8011:32;8052:33;8011:32;8052:33;:::i;:::-;8104:7;-1:-1:-1;8163:2:1;8148:18;;8135:32;8176:33;8135:32;8176:33;:::i;:::-;7815:529;;;;-1:-1:-1;8228:7:1;;8282:2;8267:18;;8254:32;;-1:-1:-1;8333:3:1;8318:19;8305:33;;7815:529;-1:-1:-1;;7815:529:1:o;8349:471::-;8445:6;8453;8506:2;8494:9;8485:7;8481:23;8477:32;8474:2;;;8522:1;8519;8512:12;8474:2;8554:9;8548:16;8573:31;8598:5;8573:31;:::i;:::-;8672:2;8657:18;;8651:25;8623:5;;-1:-1:-1;;;;;;8688:30:1;;8685:2;;;8731:1;8728;8721:12;8685:2;8754:60;8806:7;8797:6;8786:9;8782:22;8754:60;:::i;:::-;8744:70;;;8464:356;;;;;:::o;8825:388::-;8893:6;8901;8954:2;8942:9;8933:7;8929:23;8925:32;8922:2;;;8970:1;8967;8960:12;8922:2;9009:9;8996:23;9028:31;9053:5;9028:31;:::i;:::-;9078:5;-1:-1:-1;9135:2:1;9120:18;;9107:32;9148:33;9107:32;9148:33;:::i;9218:1338::-;9378:6;9386;9394;9402;9410;9418;9426;9434;9487:3;9475:9;9466:7;9462:23;9458:33;9455:2;;;9504:1;9501;9494:12;9455:2;9543:9;9530:23;9562:31;9587:5;9562:31;:::i;:::-;9612:5;-1:-1:-1;9669:2:1;9654:18;;9641:32;9682:33;9641:32;9682:33;:::i;:::-;9734:7;-1:-1:-1;9792:2:1;9777:18;;9764:32;-1:-1:-1;;;;;9845:14:1;;;9842:2;;;9872:1;9869;9862:12;9842:2;9911:70;9973:7;9964:6;9953:9;9949:22;9911:70;:::i;:::-;10000:8;;-1:-1:-1;9885:96:1;-1:-1:-1;10088:2:1;10073:18;;10060:32;;-1:-1:-1;10104:16:1;;;10101:2;;;10133:1;10130;10123:12;10101:2;10172:72;10236:7;10225:8;10214:9;10210:24;10172:72;:::i;:::-;10263:8;;-1:-1:-1;10146:98:1;-1:-1:-1;10351:3:1;10336:19;;10323:33;;-1:-1:-1;10368:16:1;;;10365:2;;;10397:1;10394;10387:12;10365:2;;10436:60;10488:7;10477:8;10466:9;10462:24;10436:60;:::i;:::-;9445:1111;;;;-1:-1:-1;9445:1111:1;;-1:-1:-1;9445:1111:1;;;;;;10515:8;-1:-1:-1;;;9445:1111:1:o;10561:894::-;10666:6;10674;10682;10690;10698;10706;10759:3;10747:9;10738:7;10734:23;10730:33;10727:2;;;10776:1;10773;10766:12;10727:2;10815:9;10802:23;10834:31;10859:5;10834:31;:::i;:::-;10884:5;-1:-1:-1;10941:2:1;10926:18;;10913:32;10954:33;10913:32;10954:33;:::i;:::-;11006:7;-1:-1:-1;11065:2:1;11050:18;;11037:32;11078;11037;11078;:::i;:::-;11129:7;-1:-1:-1;11187:2:1;11172:18;;11159:32;-1:-1:-1;;;;;11203:30:1;;11200:2;;;11246:1;11243;11236:12;11200:2;11285:58;11335:7;11326:6;11315:9;11311:22;11285:58;:::i;:::-;10717:738;;;;-1:-1:-1;10717:738:1;;;;;11444:3;11429:19;;;11416:33;;10717:738;-1:-1:-1;;;;10717:738:1:o;11460:456::-;11537:6;11545;11553;11606:2;11594:9;11585:7;11581:23;11577:32;11574:2;;;11622:1;11619;11612:12;11574:2;11661:9;11648:23;11680:31;11705:5;11680:31;:::i;:::-;11730:5;-1:-1:-1;11787:2:1;11772:18;;11759:32;11800:33;11759:32;11800:33;:::i;:::-;11564:352;;11852:7;;-1:-1:-1;;;11906:2:1;11891:18;;;;11878:32;;11564:352::o;11921:525::-;12007:6;12015;12023;12031;12084:3;12072:9;12063:7;12059:23;12055:33;12052:2;;;12101:1;12098;12091:12;12052:2;12140:9;12127:23;12159:31;12184:5;12159:31;:::i;:::-;12209:5;-1:-1:-1;12266:2:1;12251:18;;12238:32;12279:33;12238:32;12279:33;:::i;:::-;12042:404;;12331:7;;-1:-1:-1;;;;12385:2:1;12370:18;;12357:32;;12436:2;12421:18;12408:32;;12042:404::o;12451:823::-;12557:6;12565;12573;12581;12589;12597;12650:3;12638:9;12629:7;12625:23;12621:33;12618:2;;;12667:1;12664;12657:12;12618:2;12706:9;12693:23;12725:31;12750:5;12725:31;:::i;:::-;12775:5;-1:-1:-1;12832:2:1;12817:18;;12804:32;12845:33;12804:32;12845:33;:::i;:::-;12897:7;-1:-1:-1;12951:2:1;12936:18;;12923:32;;-1:-1:-1;13002:2:1;12987:18;;12974:32;;-1:-1:-1;13057:3:1;13042:19;;13029:33;-1:-1:-1;;;;;13074:30:1;;13071:2;;;13117:1;13114;13107:12;13071:2;13156:58;13206:7;13197:6;13186:9;13182:22;13156:58;:::i;:::-;12608:666;;;;-1:-1:-1;12608:666:1;;-1:-1:-1;12608:666:1;;13233:8;;12608:666;-1:-1:-1;;;12608:666:1:o;13279:908::-;13410:6;13418;13426;13434;13442;13495:2;13483:9;13474:7;13470:23;13466:32;13463:2;;;13511:1;13508;13501:12;13463:2;13550:9;13537:23;13569:31;13594:5;13569:31;:::i;:::-;13619:5;-1:-1:-1;13675:2:1;13660:18;;13647:32;-1:-1:-1;;;;;13728:14:1;;;13725:2;;;13755:1;13752;13745:12;13725:2;13794:70;13856:7;13847:6;13836:9;13832:22;13794:70;:::i;:::-;13883:8;;-1:-1:-1;13768:96:1;-1:-1:-1;13971:2:1;13956:18;;13943:32;;-1:-1:-1;13987:16:1;;;13984:2;;;14016:1;14013;14006:12;13984:2;;14055:72;14119:7;14108:8;14097:9;14093:24;14055:72;:::i;:::-;13453:734;;;;-1:-1:-1;13453:734:1;;-1:-1:-1;14146:8:1;;14029:98;13453:734;-1:-1:-1;;;13453:734:1:o;14192:1107::-;14341:6;14349;14357;14365;14373;14381;14434:3;14422:9;14413:7;14409:23;14405:33;14402:2;;;14451:1;14448;14441:12;14402:2;14490:9;14477:23;14509:31;14534:5;14509:31;:::i;:::-;14559:5;-1:-1:-1;14615:2:1;14600:18;;14587:32;-1:-1:-1;;;;;14668:14:1;;;14665:2;;;14695:1;14692;14685:12;14665:2;14734:70;14796:7;14787:6;14776:9;14772:22;14734:70;:::i;:::-;14823:8;;-1:-1:-1;14708:96:1;-1:-1:-1;14911:2:1;14896:18;;14883:32;;-1:-1:-1;14927:16:1;;;14924:2;;;14956:1;14953;14946:12;14924:2;14995:72;15059:7;15048:8;15037:9;15033:24;14995:72;:::i;:::-;15086:8;;-1:-1:-1;14969:98:1;-1:-1:-1;15174:2:1;15159:18;;15146:32;;-1:-1:-1;15190:16:1;;;15187:2;;;15219:1;15216;15209:12;15187:2;;15242:51;15285:7;15274:8;15263:9;15259:24;15242:51;:::i;:::-;15232:61;;;14392:907;;;;;;;;:::o;15304:382::-;15369:6;15377;15430:2;15418:9;15409:7;15405:23;15401:32;15398:2;;;15446:1;15443;15436:12;15398:2;15485:9;15472:23;15504:31;15529:5;15504:31;:::i;:::-;15554:5;-1:-1:-1;15611:2:1;15596:18;;15583:32;15624:30;15583:32;15624:30;:::i;15691:315::-;15759:6;15767;15820:2;15808:9;15799:7;15795:23;15791:32;15788:2;;;15836:1;15833;15826:12;15788:2;15875:9;15862:23;15894:31;15919:5;15894:31;:::i;:::-;15944:5;15996:2;15981:18;;;;15968:32;;-1:-1:-1;;;15778:228:1:o;16011:383::-;16088:6;16096;16104;16157:2;16145:9;16136:7;16132:23;16128:32;16125:2;;;16173:1;16170;16163:12;16125:2;16212:9;16199:23;16231:31;16256:5;16231:31;:::i;:::-;16281:5;16333:2;16318:18;;16305:32;;-1:-1:-1;16384:2:1;16369:18;;;16356:32;;16115:279;-1:-1:-1;;;16115:279:1:o;16399:592::-;16494:6;16502;16510;16518;16571:3;16559:9;16550:7;16546:23;16542:33;16539:2;;;16588:1;16585;16578:12;16539:2;16627:9;16614:23;16646:31;16671:5;16646:31;:::i;:::-;16696:5;-1:-1:-1;16748:2:1;16733:18;;16720:32;;-1:-1:-1;16799:2:1;16784:18;;16771:32;;-1:-1:-1;16854:2:1;16839:18;;16826:32;-1:-1:-1;;;;;16870:30:1;;16867:2;;;16913:1;16910;16903:12;16867:2;16936:49;16977:7;16968:6;16957:9;16953:22;16936:49;:::i;:::-;16926:59;;;16529:462;;;;;;;:::o;16996:773::-;17118:6;17126;17134;17142;17195:2;17183:9;17174:7;17170:23;17166:32;17163:2;;;17211:1;17208;17201:12;17163:2;17251:9;17238:23;-1:-1:-1;;;;;17321:2:1;17313:6;17310:14;17307:2;;;17337:1;17334;17327:12;17307:2;17376:70;17438:7;17429:6;17418:9;17414:22;17376:70;:::i;:::-;17465:8;;-1:-1:-1;17350:96:1;-1:-1:-1;17553:2:1;17538:18;;17525:32;;-1:-1:-1;17569:16:1;;;17566:2;;;17598:1;17595;17588:12;17566:2;;17637:72;17701:7;17690:8;17679:9;17675:24;17637:72;:::i;:::-;17153:616;;;;-1:-1:-1;17728:8:1;-1:-1:-1;;;;17153:616:1:o;17774:1306::-;18005:6;18013;18021;18029;18037;18090:3;18078:9;18069:7;18065:23;18061:33;18058:2;;;18107:1;18104;18097:12;18058:2;18140:9;18134:16;-1:-1:-1;;;;;18210:2:1;18202:6;18199:14;18196:2;;;18226:1;18223;18216:12;18196:2;18249:72;18313:7;18304:6;18293:9;18289:22;18249:72;:::i;:::-;18239:82;;18367:2;18356:9;18352:18;18346:25;18330:41;;18396:2;18386:8;18383:16;18380:2;;;18412:1;18409;18402:12;18380:2;18435:74;18501:7;18490:8;18479:9;18475:24;18435:74;:::i;:::-;18425:84;;18555:2;18544:9;18540:18;18534:25;18518:41;;18584:2;18574:8;18571:16;18568:2;;;18600:1;18597;18590:12;18568:2;18623:74;18689:7;18678:8;18667:9;18663:24;18623:74;:::i;:::-;18613:84;;18743:2;18732:9;18728:18;18722:25;18706:41;;18772:2;18762:8;18759:16;18756:2;;;18788:1;18785;18778:12;19888:1162;19992:6;20023:2;20066;20054:9;20045:7;20041:23;20037:32;20034:2;;;20082:1;20079;20072:12;20034:2;20115:9;20109:16;-1:-1:-1;;;;;20185:2:1;20177:6;20174:14;20171:2;;;20201:1;20198;20191:12;20171:2;20239:6;20228:9;20224:22;20214:32;;20284:7;20277:4;20273:2;20269:13;20265:27;20255:2;;20306:1;20303;20296:12;20255:2;20335;20329:9;20357:43;20397:2;20357:43;:::i;:::-;20429:2;20423:9;20441:31;20469:2;20461:6;20441:31;:::i;:::-;20507:18;;;20541:15;;;;-1:-1:-1;20576:11:1;;;20618:1;20614:10;;;20606:19;;20602:28;;20599:41;-1:-1:-1;20596:2:1;;;20653:1;20650;20643:12;20596:2;20675:1;20696;20706:313;20722:2;20717:3;20714:11;20706:313;;;20796:3;20790:10;20832:2;20819:11;20816:19;20813:2;;;20848:1;20845;20838:12;20813:2;20877:67;20936:7;20931:2;20917:11;20913:2;20909:20;20905:29;20877:67;:::i;:::-;20865:80;;-1:-1:-1;20965:12:1;;;;20997;;;;20744:1;20735:11;20706:313;;;-1:-1:-1;21038:6:1;;20003:1047;-1:-1:-1;;;;;;;;;;20003:1047:1:o;21055:466::-;21170:6;21178;21231:2;21219:9;21210:7;21206:23;21202:32;21199:2;;;21247:1;21244;21237:12;21199:2;21287:9;21274:23;-1:-1:-1;;;;;21312:6:1;21309:30;21306:2;;;21352:1;21349;21342:12;21306:2;21391:70;21453:7;21444:6;21433:9;21429:22;21391:70;:::i;:::-;21480:8;;21365:96;;-1:-1:-1;21189:332:1;-1:-1:-1;;;;21189:332:1:o;23107:245::-;23174:6;23227:2;23215:9;23206:7;23202:23;23198:32;23195:2;;;23243:1;23240;23233:12;23195:2;23275:9;23269:16;23294:28;23316:5;23294:28;:::i;23357:538::-;23433:6;23441;23449;23502:2;23490:9;23481:7;23477:23;23473:32;23470:2;;;23518:1;23515;23508:12;23470:2;23557:9;23544:23;23576:28;23598:5;23576:28;:::i;:::-;23623:5;-1:-1:-1;23679:2:1;23664:18;;23651:32;-1:-1:-1;;;;;23695:30:1;;23692:2;;;23738:1;23735;23728:12;23692:2;23777:58;23827:7;23818:6;23807:9;23803:22;23777:58;:::i;:::-;23460:435;;23854:8;;-1:-1:-1;23751:84:1;;-1:-1:-1;;;;23460:435:1:o;23900:457::-;23985:6;23993;24046:2;24034:9;24025:7;24021:23;24017:32;24014:2;;;24062:1;24059;24052:12;24014:2;24094:9;24088:16;24113:28;24135:5;24113:28;:::i;24362:180::-;24421:6;24474:2;24462:9;24453:7;24449:23;24445:32;24442:2;;;24490:1;24487;24480:12;24442:2;-1:-1:-1;24513:23:1;;24432:110;-1:-1:-1;24432:110:1:o;24547:245::-;24605:6;24658:2;24646:9;24637:7;24633:23;24629:32;24626:2;;;24674:1;24671;24664:12;24626:2;24713:9;24700:23;24732:30;24756:5;24732:30;:::i;24797:249::-;24866:6;24919:2;24907:9;24898:7;24894:23;24890:32;24887:2;;;24935:1;24932;24925:12;24887:2;24967:9;24961:16;24986:30;25010:5;24986:30;:::i;25051:409::-;25121:6;25129;25182:2;25170:9;25161:7;25157:23;25153:32;25150:2;;;25198:1;25195;25188:12;25150:2;25238:9;25225:23;-1:-1:-1;;;;;25263:6:1;25260:30;25257:2;;;25303:1;25300;25293:12;25257:2;25342:58;25392:7;25383:6;25372:9;25368:22;25342:58;:::i;25880:336::-;25960:6;26013:2;26001:9;25992:7;25988:23;25984:32;25981:2;;;26029:1;26026;26019:12;25981:2;26062:9;26056:16;-1:-1:-1;;;;;26087:6:1;26084:30;26081:2;;;26127:1;26124;26117:12;26081:2;26150:60;26202:7;26193:6;26182:9;26178:22;26150:60;:::i;26221:695::-;26336:6;26344;26352;26405:2;26393:9;26384:7;26380:23;26376:32;26373:2;;;26421:1;26418;26411:12;26373:2;26454:9;26448:16;-1:-1:-1;;;;;26524:2:1;26516:6;26513:14;26510:2;;;26540:1;26537;26530:12;26510:2;26563:60;26615:7;26606:6;26595:9;26591:22;26563:60;:::i;:::-;26553:70;;26666:2;26655:9;26651:18;26645:25;26632:38;;26679:31;26704:5;26679:31;:::i;:::-;26780:2;26765:18;;26759:25;26729:5;;-1:-1:-1;26796:16:1;;;26793:2;;;26825:1;26822;26815:12;26793:2;;26848:62;26902:7;26891:8;26880:9;26876:24;26848:62;:::i;:::-;26838:72;;;26363:553;;;;;:::o;26921:750::-;27070:6;27078;27086;27139:2;27127:9;27118:7;27114:23;27110:32;27107:2;;;27155:1;27152;27145:12;27107:2;27195:9;27182:23;-1:-1:-1;;;;;27265:2:1;27257:6;27254:14;27251:2;;;27281:1;27278;27271:12;27251:2;27304:22;;;;27360:3;27342:16;;;27338:26;27335:2;;;27377:1;27374;27367:12;27335:2;27400;;-1:-1:-1;27455:2:1;27440:18;;27427:32;;27471:16;;;27468:2;;;27500:1;27497;27490:12;27468:2;;27539:72;27603:7;27592:8;27581:9;27577:24;27539:72;:::i;27861:898::-;27981:6;27989;27997;28005;28013;28021;28029;28037;28090:3;28078:9;28069:7;28065:23;28061:33;28058:2;;;28107:1;28104;28097:12;28058:2;28143:9;28130:23;28120:33;;28203:2;28192:9;28188:18;28175:32;28216:31;28241:5;28216:31;:::i;:::-;28266:5;-1:-1:-1;28323:2:1;28308:18;;28295:32;28336:33;28295:32;28336:33;:::i;:::-;28388:7;-1:-1:-1;28442:2:1;28427:18;;28414:32;;-1:-1:-1;28493:3:1;28478:19;;28465:33;;-1:-1:-1;28550:3:1;28535:19;;28522:33;28599:4;28586:18;;28574:31;;28564:2;;28619:1;28616;28609:12;28564:2;28048:711;;;;-1:-1:-1;28048:711:1;;;;;;28642:7;;-1:-1:-1;;;28696:3:1;28681:19;;28668:33;;28748:3;28733:19;28720:33;;28048:711::o;28764:461::-;28817:3;28855:5;28849:12;28882:6;28877:3;28870:19;28908:4;28937:2;28932:3;28928:12;28921:19;;28974:2;28967:5;28963:14;28995:1;29005:195;29019:6;29016:1;29013:13;29005:195;;;29084:13;;-1:-1:-1;;;;;29080:39:1;29068:52;;29140:12;;;;29175:15;;;;29116:1;29034:9;29005:195;;;-1:-1:-1;29216:3:1;;28825:400;-1:-1:-1;;;;;28825:400:1:o;29230:354::-;29318:19;;;29300:3;-1:-1:-1;;;;;29349:31:1;;29346:2;;;29393:1;29390;29383:12;29346:2;29429:6;29426:1;29422:14;29481:8;29474:5;29467:4;29462:3;29458:14;29445:45;29558:1;29513:18;;29533:4;29509:29;29547:13;;;-1:-1:-1;29509:29:1;;29308:276;-1:-1:-1;;29308:276:1:o;29589:435::-;29642:3;29680:5;29674:12;29707:6;29702:3;29695:19;29733:4;29762:2;29757:3;29753:12;29746:19;;29799:2;29792:5;29788:14;29820:1;29830:169;29844:6;29841:1;29838:13;29830:169;;;29905:13;;29893:26;;29939:12;;;;29974:15;;;;29866:1;29859:9;29830:169;;30029:266;30117:6;30112:3;30105:19;30169:6;30162:5;30155:4;30150:3;30146:14;30133:43;-1:-1:-1;30221:1:1;30196:16;;;30214:4;30192:27;;;30185:38;;;;30277:2;30256:15;;;-1:-1:-1;;30252:29:1;30243:39;;;30239:50;;30095:200::o;30300:257::-;30341:3;30379:5;30373:12;30406:6;30401:3;30394:19;30422:63;30478:6;30471:4;30466:3;30462:14;30455:4;30448:5;30444:16;30422:63;:::i;:::-;30539:2;30518:15;-1:-1:-1;;30514:29:1;30505:39;;;;30546:4;30501:50;;30349:208;-1:-1:-1;;30349:208:1:o;30562:601::-;30676:1;30672;30667:3;30663:11;30659:19;30651:5;30645:12;30641:38;30636:3;30629:51;30611:3;30726:4;30719:5;30715:16;30709:23;30764:4;30757;30752:3;30748:14;30741:28;30790:46;30830:4;30825:3;30821:14;30807:12;30790:46;:::i;:::-;30778:58;;30884:4;30877:5;30873:16;30867:23;30932:3;30926:4;30922:14;30915:4;30910:3;30906:14;30899:38;30960;30993:4;30977:14;30960:38;:::i;:::-;30946:52;;;31046:4;31039:5;31035:16;31029:23;31096:3;31088:6;31084:16;31077:4;31072:3;31068:14;31061:40;31117;31150:6;31134:14;31117:40;:::i;31589:274::-;31718:3;31756:6;31750:13;31772:53;31818:6;31813:3;31806:4;31798:6;31794:17;31772:53;:::i;:::-;31841:16;;;;;31726:137;-1:-1:-1;;31726:137:1:o;31868:815::-;31998:3;32027:1;32060:6;32054:13;32090:36;32116:9;32090:36;:::i;:::-;32145:1;32162:18;;;32189:104;;;;32307:1;32302:356;;;;32155:503;;32189:104;-1:-1:-1;;32222:24:1;;32210:37;;32267:16;;;;-1:-1:-1;32189:104:1;;32302:356;32333:6;32330:1;32323:17;32363:4;32408:2;32405:1;32395:16;32433:1;32447:165;32461:6;32458:1;32455:13;32447:165;;;32539:14;;32526:11;;;32519:35;32582:16;;;;32476:10;;32447:165;;;32451:3;;;32641:6;32636:3;32632:16;32625:23;;32155:503;-1:-1:-1;32674:3:1;;32006:677;-1:-1:-1;;;;;;32006:677:1:o;33293:907::-;-1:-1:-1;;;;;33720:15:1;;;33702:34;;33772:15;;33767:2;33752:18;;33745:43;33682:3;33819:2;33804:18;;33797:31;;;33645:4;;33851:74;;33905:19;;33897:6;33889;33851:74;:::i;:::-;33973:9;33965:6;33961:22;33956:2;33945:9;33941:18;33934:50;34007:61;34061:6;34053;34045;34007:61;:::i;:::-;33993:75;;34117:9;34109:6;34105:22;34099:3;34088:9;34084:19;34077:51;34145:49;34187:6;34179;34171;34145:49;:::i;:::-;34137:57;33654:546;-1:-1:-1;;;;;;;;;;;33654:546:1:o;34205:612::-;-1:-1:-1;;;;;34510:15:1;;;34492:34;;34562:15;;34557:2;34542:18;;34535:43;-1:-1:-1;;;;;;34614:33:1;;34609:2;34594:18;;34587:61;34472:3;34679:2;34664:18;;34657:31;;;34435:4;;34705:62;;34747:19;;34739:6;34731;34705:62;:::i;:::-;34697:70;;34804:6;34798:3;34787:9;34783:19;34776:35;34444:373;;;;;;;;;:::o;35202:587::-;-1:-1:-1;;;;;35509:15:1;;;35491:34;;35561:15;;35556:2;35541:18;;35534:43;35608:2;35593:18;;35586:34;;;35651:2;35636:18;;35629:34;;;35471:3;35694;35679:19;;35672:32;;;35434:4;;35721:62;;35763:19;;35755:6;35747;35721:62;:::i;:::-;35713:70;35443:346;-1:-1:-1;;;;;;;;35443:346:1:o;35794:579::-;36008:4;36054:1;36050;36045:3;36041:11;36037:19;36095:2;36087:6;36083:15;36072:9;36065:34;36135:3;36130:2;36119:9;36115:18;36108:31;36162:45;36202:3;36191:9;36187:19;36179:6;36162:45;:::i;:::-;36255:9;36247:6;36243:22;36238:2;36227:9;36223:18;36216:50;36283:32;36308:6;36300;36283:32;:::i;:::-;36275:40;;;36363:2;36355:6;36351:15;36346:2;36335:9;36331:18;36324:43;;36017:356;;;;;;;:::o;36378:642::-;-1:-1:-1;;;;;36651:32:1;;36633:51;;36720:3;36715:2;36700:18;;36693:31;;;-1:-1:-1;;36747:45:1;;36772:19;;36764:6;36747:45;:::i;:::-;36840:9;36832:6;36828:22;36823:2;36812:9;36808:18;36801:50;36874:32;36899:6;36891;36874:32;:::i;:::-;36860:46;;36954:9;36946:6;36942:22;36937:2;36926:9;36922:18;36915:50;36982:32;37007:6;36999;36982:32;:::i;:::-;36974:40;36623:397;-1:-1:-1;;;;;;;36623:397:1:o;37025:669::-;37360:2;37349:9;37342:21;37323:4;37386:56;37438:2;37427:9;37423:18;37415:6;37386:56;:::i;:::-;37490:9;37482:6;37478:22;37473:2;37462:9;37458:18;37451:50;37524:44;37561:6;37553;37524:44;:::i;:::-;37510:58;;37616:9;37608:6;37604:22;37599:2;37588:9;37584:18;37577:50;37644:44;37681:6;37673;37644:44;:::i;37699:632::-;37870:2;37922:21;;;37992:13;;37895:18;;;38014:22;;;37841:4;;37870:2;38093:15;;;;38067:2;38052:18;;;37841:4;38136:169;38150:6;38147:1;38144:13;38136:169;;;38211:13;;38199:26;;38280:15;;;;38245:12;;;;38172:1;38165:9;38136:169;;;-1:-1:-1;38322:3:1;;37850:481;-1:-1:-1;;;;;;37850:481:1:o;38336:836::-;38524:4;38553:2;38593;38582:9;38578:18;38623:2;38612:9;38605:21;38646:6;38681;38675:13;38712:6;38704;38697:22;38750:2;38739:9;38735:18;38728:25;;38812:2;38802:6;38799:1;38795:14;38784:9;38780:30;38776:39;38762:53;;38850:2;38842:6;38838:15;38871:1;38881:262;38895:6;38892:1;38889:13;38881:262;;;38988:2;38984:7;38972:9;38964:6;38960:22;38956:36;38951:3;38944:49;39016:47;39056:6;39047;39041:13;39016:47;:::i;:::-;39006:57;-1:-1:-1;39121:12:1;;;;39086:15;;;;38917:1;38910:9;38881:262;;;-1:-1:-1;39160:6:1;;38533:639;-1:-1:-1;;;;;;;38533:639:1:o;39177:261::-;39356:2;39345:9;39338:21;39319:4;39376:56;39428:2;39417:9;39413:18;39405:6;39376:56;:::i;39443:465::-;39700:2;39689:9;39682:21;39663:4;39726:56;39778:2;39767:9;39763:18;39755:6;39726:56;:::i;:::-;39830:9;39822:6;39818:22;39813:2;39802:9;39798:18;39791:50;39858:44;39895:6;39887;39858:44;:::i;40105:379::-;40310:6;40303:14;40296:22;40285:9;40278:41;40369:6;40362:14;40355:22;40350:2;40339:9;40335:18;40328:50;40414:2;40409;40398:9;40394:18;40387:30;40259:4;40434:44;40474:2;40463:9;40459:18;40451:6;40434:44;:::i;41267:332::-;41474:6;41463:9;41456:25;41517:2;41512;41501:9;41497:18;41490:30;41437:4;41537:56;41589:2;41578:9;41574:18;41566:6;41537:56;:::i;42368:468::-;42627:6;42616:9;42609:25;42670:3;42665:2;42654:9;42650:18;42643:31;42590:4;42691:53;42739:3;42728:9;42724:19;42716:6;42691:53;:::i;:::-;42775:2;42760:18;;42753:34;;;;-1:-1:-1;42818:2:1;42803:18;42796:34;42683:61;42599:237;-1:-1:-1;;42599:237:1:o;43704:217::-;43851:2;43840:9;43833:21;43814:4;43871:44;43911:2;43900:9;43896:18;43888:6;43871:44;:::i;44150:381::-;44347:2;44336:9;44329:21;44310:4;44373:44;44413:2;44402:9;44398:18;44390:6;44373:44;:::i;:::-;44465:9;44457:6;44453:22;44448:2;44437:9;44433:18;44426:50;44493:32;44518:6;44510;44493:32;:::i;44536:926::-;44645:4;44674:2;44703;44692:9;44685:21;44726:1;44759:6;44753:13;44789:36;44815:9;44789:36;:::i;:::-;44861:6;44856:2;44845:9;44841:18;44834:34;44887:2;44908:1;44940:2;44929:9;44925:18;44957:1;44952:121;;;;45087:1;45082:354;;;;44918:518;;44952:121;-1:-1:-1;;45000:24:1;;44980:18;;;44973:52;45060:2;45045:18;;;-1:-1:-1;44952:121:1;;45082:354;45113:6;45110:1;45103:17;45161:2;45158:1;45148:16;45186:1;45200:180;45214:6;45211:1;45208:13;45200:180;;;45307:14;;45283:17;;;45279:26;;45272:50;45350:16;;;;45229:10;;45200:180;;;45404:17;;45400:26;;;-1:-1:-1;;44918:518:1;-1:-1:-1;45453:3:1;;44654:808;-1:-1:-1;;;;;;;;44654:808:1:o;45888:404::-;46090:2;46072:21;;;46129:2;46109:18;;;46102:30;46168:34;46163:2;46148:18;;46141:62;-1:-1:-1;;;46234:2:1;46219:18;;46212:38;46282:3;46267:19;;46062:230::o;47004:336::-;47206:2;47188:21;;;47245:2;47225:18;;;47218:30;-1:-1:-1;;;47279:2:1;47264:18;;47257:42;47331:2;47316:18;;47178:162::o;48734:336::-;48936:2;48918:21;;;48975:2;48955:18;;;48948:30;-1:-1:-1;;;49009:2:1;48994:18;;48987:42;49061:2;49046:18;;48908:162::o;52369:327::-;52464:4;52522:11;52509:25;52616:3;52612:8;52601;52585:14;52581:29;52577:44;52557:18;52553:69;52543:2;;52636:1;52633;52626:12;52701:323;52792:4;52850:11;52837:25;52944:3;52940:8;52929;52913:14;52909:29;52905:44;52885:18;52881:69;52871:2;;52964:1;52961;52954:12;53029:248;53096:2;53090:9;53138:4;53126:17;;-1:-1:-1;;;;;53158:34:1;;53194:22;;;53155:62;53152:2;;;53220:18;;:::i;:::-;53256:2;53249:22;53070:207;:::o;53282:183::-;53342:4;-1:-1:-1;;;;;53367:6:1;53364:30;53361:2;;;53397:18;;:::i;:::-;-1:-1:-1;53442:1:1;53438:14;53454:4;53434:25;;53351:114::o;53470:186::-;53518:4;-1:-1:-1;;;;;53543:6:1;53540:30;53537:2;;;53573:18;;:::i;:::-;-1:-1:-1;53639:2:1;53618:15;-1:-1:-1;;53614:29:1;53645:4;53610:40;;53527:129::o;53661:128::-;53701:3;53732:1;53728:6;53725:1;53722:13;53719:2;;;53738:18;;:::i;:::-;-1:-1:-1;53774:9:1;;53709:80::o;53794:217::-;53834:1;53860;53850:2;;53904:10;53899:3;53895:20;53892:1;53885:31;53939:4;53936:1;53929:15;53967:4;53964:1;53957:15;53850:2;-1:-1:-1;53996:9:1;;53840:171::o;54016:125::-;54056:4;54084:1;54081;54078:8;54075:2;;;54089:18;;:::i;:::-;-1:-1:-1;54126:9:1;;54065:76::o;54146:997::-;54252:9;54311:4;54303:5;54287:14;54283:26;54279:37;54276:2;;;54329:1;54326;54319:12;54276:2;54357:17;;:::i;:::-;54410:5;54397:19;-1:-1:-1;;;;;54476:2:1;54468:6;54465:14;54462:2;;;54492:1;54489;54482:12;54462:2;54521:60;54566:14;54557:6;54550:5;54546:18;54521:60;:::i;:::-;54512:7;54505:77;54640:2;54633:5;54629:14;54616:28;54611:2;54602:7;54598:16;54591:54;54703:2;54696:5;54692:14;54679:28;54674:2;54665:7;54661:16;54654:54;54757:2;54750:5;54746:14;54733:28;54717:44;;54786:2;54776:8;54773:16;54770:2;;;54802:1;54799;54792:12;54770:2;54840:66;54891:14;54880:8;54873:5;54869:20;54840:66;:::i;:::-;54835:2;54826:7;54822:16;54815:92;54956:3;54949:5;54945:15;54932:29;54916:45;;54986:2;54976:8;54973:16;54970:2;;;55002:1;54999;54992:12;54970:2;;55041:66;55092:14;55081:8;55074:5;55070:20;55041:66;:::i;:::-;55035:3;55022:17;;55015:93;-1:-1:-1;55026:7:1;54266:877;-1:-1:-1;;54266:877:1:o;55148:188::-;55246:9;55283:47;55315:14;55308:5;55283:47;:::i;55341:258::-;55413:1;55423:113;55437:6;55434:1;55431:13;55423:113;;;55513:11;;;55507:18;55494:11;;;55487:39;55459:2;55452:10;55423:113;;;55554:6;55551:1;55548:13;55545:2;;;-1:-1:-1;;55589:1:1;55571:16;;55564:27;55394:205::o;55604:380::-;55683:1;55679:12;;;;55726;;;55747:2;;55801:4;55793:6;55789:17;55779:27;;55747:2;55854;55846:6;55843:14;55823:18;55820:38;55817:2;;;55900:10;55895:3;55891:20;55888:1;55881:31;55935:4;55932:1;55925:15;55963:4;55960:1;55953:15;55989:249;56099:2;56080:13;;-1:-1:-1;;56076:27:1;56064:40;;-1:-1:-1;;;;;56119:34:1;;56155:22;;;56116:62;56113:2;;;56181:18;;:::i;:::-;56217:2;56210:22;-1:-1:-1;;56036:202:1:o;56243:135::-;56282:3;-1:-1:-1;;56303:17:1;;56300:2;;;56323:18;;:::i;:::-;-1:-1:-1;56370:1:1;56359:13;;56290:88::o;56383:127::-;56444:10;56439:3;56435:20;56432:1;56425:31;56475:4;56472:1;56465:15;56499:4;56496:1;56489:15;56515:127;56576:10;56571:3;56567:20;56564:1;56557:31;56607:4;56604:1;56597:15;56631:4;56628:1;56621:15;56647:127;56708:10;56703:3;56699:20;56696:1;56689:31;56739:4;56736:1;56729:15;56763:4;56760:1;56753:15;56779:179;56814:3;56856:1;56838:16;56835:23;56832:2;;;56902:1;56899;56896;56881:23;-1:-1:-1;56939:1:1;56933:8;56928:3;56924:18;56832:2;56822:136;:::o;56963:671::-;57002:3;57044:4;57026:16;57023:26;57020:2;;;57010:624;:::o;57020:2::-;57086;57080:9;-1:-1:-1;;57151:16:1;57147:25;;57144:1;57080:9;57123:50;57202:4;57196:11;57226:16;-1:-1:-1;;;;;57332:2:1;57325:4;57317:6;57313:17;57310:25;57305:2;57297:6;57294:14;57291:45;57288:2;;;57339:5;;;;;57010:624;:::o;57288:2::-;57376:6;57370:4;57366:17;57355:28;;57412:3;57406:10;57439:2;57431:6;57428:14;57425:2;;;57445:5;;;;;;57010:624;:::o;57425:2::-;57529;57510:16;57504:4;57500:27;57496:36;57489:4;57480:6;57475:3;57471:16;57467:27;57464:69;57461:2;;;57536:5;;;;;;57010:624;:::o;57461:2::-;57552:57;57603:4;57594:6;57586;57582:19;57578:30;57572:4;57552:57;:::i;:::-;-1:-1:-1;57625:3:1;;57010:624;-1:-1:-1;;;;;57010:624:1:o;57639:131::-;-1:-1:-1;;;;;57714:31:1;;57704:42;;57694:2;;57760:1;57757;57750:12;57775:118;57861:5;57854:13;57847:21;57840:5;57837:32;57827:2;;57883:1;57880;57873:12;57898:131;-1:-1:-1;;;;;;57972:32:1;;57962:43;;57952:2;;58019:1;58016;58009:12

Swarm Source

ipfs://fad2fb7153eda02e6c43744615766b767dc0efc5caebd9d4d300000cb28e3aeb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.