Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Base URI | 15452856 | 1289 days ago | IN | 0 ETH | 0.00060734 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ERC1155Rarible
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./ERC1155Base.sol";
import "../IsPrivateCollection.sol";
import "../access/MinterAccessControl.sol";
contract ERC1155Rarible is ERC1155Base, IsPrivateCollection, MinterAccessControl {
event CreateERC1155Rarible(address owner, string name, string symbol);
event CreateERC1155RaribleUser(address owner, string name, string symbol);
function __ERC1155RaribleUser_init(string memory _name, string memory _symbol, string memory baseURI, string memory contractURI, address[] memory operators, address transferProxy, address lazyTransferProxy) external virtual {
__ERC1155Rarible_init_unchained(_name, _symbol, baseURI, contractURI, transferProxy, lazyTransferProxy);
isPrivate = true;
emit CreateERC1155RaribleUser(_msgSender(), _name, _symbol);
}
function __ERC1155Rarible_init(string memory _name, string memory _symbol, string memory baseURI, string memory contractURI, address transferProxy, address lazyTransferProxy) external virtual {
__ERC1155Rarible_init_unchained(_name, _symbol, baseURI, contractURI, transferProxy, lazyTransferProxy);
isPrivate = false;
emit CreateERC1155Rarible(_msgSender(), _name, _symbol);
}
function __ERC1155Rarible_init_unchained(string memory _name, string memory _symbol, string memory baseURI, string memory contractURI, address transferProxy, address lazyTransferProxy) internal initializer {
__Ownable_init_unchained();
__ERC1155Lazy_init_unchained();
__ERC165_init_unchained();
__Context_init_unchained();
__Mint1155Validator_init_unchained();
__ERC1155_init_unchained("");
__HasContractURI_init_unchained(contractURI);
__ERC1155Burnable_init_unchained();
__RoyaltiesV2Upgradeable_init_unchained();
__ERC1155Base_init_unchained(_name, _symbol);
__MinterAccessControl_init_unchained();
_setBaseURI(baseURI);
//setting default approver for transferProxies
_setDefaultApproval(transferProxy, true);
_setDefaultApproval(lazyTransferProxy, true);
}
function mintAndTransfer(LibERC1155LazyMint.Mint1155Data memory data, address to, uint256 _amount) public override {
if (isPrivate){
require(owner() == data.creators[0].account || isMinter(data.creators[0].account), "not owner or minter");
}
super.mintAndTransfer(data, to, _amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./ERC1155BurnableUpgradeable.sol";
import "./ERC1155DefaultApproval.sol";
import "./ERC1155Lazy.sol";
import "../HasContractURI.sol";
abstract contract ERC1155Base is OwnableUpgradeable, ERC1155DefaultApproval, ERC1155BurnableUpgradeable, ERC1155Lazy, HasContractURI {
string public name;
string public symbol;
event BurnLazy(address indexed operator, address indexed account, uint256 id, uint256 amount);
event BurnLazyBatch(address indexed operator, address indexed account, uint256[] ids, uint256[] amounts);
event BaseUriChanged(string newBaseURI);
function isApprovedForAll(address _owner, address _operator) public override(ERC1155Upgradeable, ERC1155DefaultApproval, IERC1155Upgradeable) view returns (bool) {
return ERC1155DefaultApproval.isApprovedForAll(_owner, _operator);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155Lazy, ERC165Upgradeable) returns (bool) {
return super.supportsInterface(interfaceId);
}
function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) public virtual override {
require(ids.length == amounts.length, "ids != amounts");
uint256[] memory leftToBurns = new uint256[](ids.length);
uint256[] memory lazyToBurns = new uint256[](ids.length);
for (uint i = 0; i < ids.length; i++) {
(leftToBurns[i], lazyToBurns[i]) = _burnLazy(ids[i], amounts[i]);
}
ERC1155BurnableUpgradeable.burnBatch(account, ids, leftToBurns);
emit BurnLazyBatch(_msgSender(), account, ids, lazyToBurns);
}
function burn(address account, uint256 id, uint256 amount) public virtual override {
(uint256 leftToBurn, uint256 lazyToBurn) = _burnLazy(id, amount);
if (leftToBurn > 0) {
//token exists, burn Minted
ERC1155BurnableUpgradeable.burn(account, id, leftToBurn);
}
if (lazyToBurn > 0) {
emit BurnLazy(_msgSender(), account, id, lazyToBurn);
}
}
function _burnLazy(uint256 id, uint256 amount) internal returns (uint256 leftToBurn, uint256 lazyToBurn) {
leftToBurn = amount;
lazyToBurn = 0;
address creator = address(id >> 96);
if (creator == _msgSender()) {
lazyToBurn = amount;
uint supply = ERC1155Lazy._getSupply(id);
if (supply != 0) {
//calculate Lazy amount available for burn
uint256 lazyBalance = supply - ERC1155Lazy._getMinted(id);
if (amount > lazyBalance) {//need to burn more than available
lazyToBurn = lazyBalance;
}
}
ERC1155Lazy._addMinted(id, lazyToBurn);
leftToBurn = amount - lazyToBurn;
}
}
function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual override(ERC1155Upgradeable, ERC1155Lazy) {
ERC1155Lazy._mint(account, id, amount, data);
}
function __ERC1155Base_init_unchained(string memory _name, string memory _symbol) internal initializer {
name = _name;
symbol = _symbol;
}
function uri(uint id) external view override(ERC1155BaseURI, ERC1155Upgradeable) virtual returns (string memory) {
return _tokenURI(id);
}
function setBaseURI(string memory newBaseURI) external onlyOwner {
super._setBaseURI(newBaseURI);
emit BaseUriChanged(newBaseURI);
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./ERC1155Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
/**
* @dev Extension of {ERC1155} that allows token holders to destroy both their
* own tokens and those that they have been approved to use.
*
* _Available since v3.1._
*/
abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable {
function __ERC1155Burnable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC1155Burnable_init_unchained();
}
function __ERC1155Burnable_init_unchained() internal initializer {
}
function burn(address account, uint256 id, uint256 value) public virtual {
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"ERC1155: caller is not owner nor approved"
);
_burn(account, id, value);
}
function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
require(
account == _msgSender() || isApprovedForAll(account, _msgSender()),
"ERC1155: caller is not owner nor approved"
);
_burnBatch(account, ids, values);
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155MetadataURIUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155ReceiverUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
/**
*
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable {
using SafeMathUpgradeable for uint256;
using AddressUpgradeable for address;
// Mapping from token ID to account balances
mapping (uint256 => mapping(address => uint256)) internal _balances;
// Mapping from account to operator approvals
mapping (address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/*
* bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
* bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
* bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
* bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
* bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
* bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
*
* => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
* 0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
*/
bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;
/*
* bytes4(keccak256('uri(uint256)')) == 0x0e89341c
*/
bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;
/**
* @dev See {_setURI}.
*/
function __ERC1155_init(string memory uri_) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC1155_init_unchained(uri_);
}
function __ERC1155_init_unchained(string memory uri_) internal initializer {
_setURI(uri_);
// register the supported interfaces to conform to ERC1155 via ERC165
_registerInterface(_INTERFACE_ID_ERC1155);
// register the supported interfaces to conform to ERC1155MetadataURI via ERC165
_registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) external view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: balance query for the zero address");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] memory accounts,
uint256[] memory ids
)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(_msgSender() != operator, "ERC1155: setting approval status for self");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
public
virtual
override
{
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer");
_balances[id][to] = _balances[id][to].add(amount);
emit TransferSingle(operator, from, to, id, amount);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
public
virtual
override
{
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: transfer caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
_balances[id][from] = _balances[id][from].sub(
amount,
"ERC1155: insufficient balance for transfer"
);
_balances[id][to] = _balances[id][to].add(amount);
}
emit TransferBatch(operator, from, to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
require(account != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][account] = _balances[id][account].add(amount);
emit TransferSingle(operator, address(0), account, id, amount);
_doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]);
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `account`
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens of token type `id`.
*/
function _burn(address account, uint256 id, uint256 amount) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");
_balances[id][account] = _balances[id][account].sub(
amount,
"ERC1155: burn amount exceeds balance"
);
emit TransferSingle(operator, account, address(0), id, amount);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), ids, amounts, "");
for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][account] = _balances[ids[i]][account].sub(
amounts[i],
"ERC1155: burn amount exceeds balance"
);
}
emit TransferBatch(operator, account, address(0), ids, amounts);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
internal
virtual
{ }
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
internal
{
if (to.isContract()) {
try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155ReceiverUpgradeable(to).onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
private
{
if (to.isContract()) {
try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
if (response != IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) internal pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
uint256[47] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "./ERC1155Upgradeable.sol";
abstract contract ERC1155DefaultApproval is ERC1155Upgradeable {
mapping(address => bool) private defaultApprovals;
event DefaultApproval(address indexed operator, bool hasApproval);
function _setDefaultApproval(address operator, bool hasApproval) internal {
defaultApprovals[operator] = hasApproval;
emit DefaultApproval(operator, hasApproval);
}
function isApprovedForAll(address _owner, address _operator) public virtual override view returns (bool) {
return defaultApprovals[_operator] || super.isApprovedForAll(_owner, _operator);
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./ERC1155Upgradeable.sol";
import "@rarible/royalties/contracts/impl/RoyaltiesV2Impl.sol";
import "@rarible/royalties-upgradeable/contracts/RoyaltiesV2Upgradeable.sol";
import "@rarible/lazy-mint/contracts/erc-1155/IERC1155LazyMint.sol";
import "./Mint1155Validator.sol";
import "./ERC1155BaseURI.sol";
abstract contract ERC1155Lazy is IERC1155LazyMint, ERC1155BaseURI, Mint1155Validator, RoyaltiesV2Upgradeable, RoyaltiesV2Impl {
using SafeMathUpgradeable for uint;
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;
bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;
mapping(uint256 => LibPart.Part[]) private creators;
mapping(uint => uint) private supply;
mapping(uint => uint) private minted;
function __ERC1155Lazy_init_unchained() internal initializer {
}
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) {
return interfaceId == LibERC1155LazyMint._INTERFACE_ID_MINT_AND_TRANSFER
|| interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES
|| interfaceId == LibRoyalties2981._INTERFACE_ID_ROYALTIES
|| interfaceId == _INTERFACE_ID_ERC165
|| interfaceId == _INTERFACE_ID_ERC1155
|| interfaceId == _INTERFACE_ID_ERC1155_METADATA_URI;
}
function transferFromOrMint(
LibERC1155LazyMint.Mint1155Data memory data,
address from,
address to,
uint256 amount
) override external {
uint balance = balanceOf(from, data.tokenId);
uint left = amount;
if (balance != 0) {
uint transfer = amount;
if (balance < amount) {
transfer = balance;
}
safeTransferFrom(from, to, data.tokenId, transfer, "");
left = amount - transfer;
}
if (left > 0) {
mintAndTransfer(data, to, left);
}
}
function mintAndTransfer(LibERC1155LazyMint.Mint1155Data memory data, address to, uint256 _amount) public override virtual {
address minter = address(data.tokenId >> 96);
address sender = _msgSender();
require(minter == sender || isApprovedForAll(minter, sender), "ERC1155: transfer caller is not approved");
require(_amount > 0, "amount incorrect");
if (supply[data.tokenId] == 0) {
require(minter == data.creators[0].account, "tokenId incorrect");
require(data.supply > 0, "supply incorrect");
require(data.creators.length == data.signatures.length);
bytes32 hash = LibERC1155LazyMint.hash(data);
for (uint i = 0; i < data.creators.length; i++) {
address creator = data.creators[i].account;
if (creator != sender) {
validate(creator, hash, data.signatures[i]);
}
}
_saveSupply(data.tokenId, data.supply);
_saveRoyalties(data.tokenId, data.royalties);
_saveCreators(data.tokenId, data.creators);
_setTokenURI(data.tokenId, data.tokenURI);
}
_mint(to, data.tokenId, _amount, "");
if (minter != to) {
emit TransferSingle(sender, address(0), minter, data.tokenId, _amount);
emit TransferSingle(sender, minter, to, data.tokenId, _amount);
} else {
emit TransferSingle(sender, address(0), to, data.tokenId, _amount);
}
}
function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual override {
uint newMinted = amount.add(minted[id]);
require(newMinted <= supply[id], "more than supply");
minted[id] = newMinted;
require(account != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][account] = _balances[id][account].add(amount);
_doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
}
function _saveSupply(uint tokenId, uint _supply) internal {
require(supply[tokenId] == 0);
supply[tokenId] = _supply;
emit Supply(tokenId, _supply);
}
function _saveCreators(uint tokenId, LibPart.Part[] memory _creators) internal {
LibPart.Part[] storage creatorsOfToken = creators[tokenId];
uint total = 0;
for (uint i = 0; i < _creators.length; i++) {
require(_creators[i].account != address(0x0), "Account should be present");
require(_creators[i].value != 0, "Creator share should be positive");
creatorsOfToken.push(_creators[i]);
total = total.add(_creators[i].value);
}
require(total == 10000, "total amount of creators share should be 10000");
emit Creators(tokenId, _creators);
}
function updateAccount(uint256 _id, address _from, address _to) external {
require(_msgSender() == _from, "not allowed");
super._updateAccount(_id, _from, _to);
}
function getCreators(uint256 _id) external view returns (LibPart.Part[] memory) {
return creators[_id];
}
function _addMinted(uint256 tokenId, uint amount) internal {
minted[tokenId] += amount;
}
function _getMinted(uint256 tokenId) internal view returns (uint) {
return minted[tokenId];
}
function _getSupply(uint256 tokenId) internal view returns (uint) {
return supply[tokenId];
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "../erc-1271/ERC1271Validator.sol";
import "@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol";
contract Mint1155Validator is ERC1271Validator {
function __Mint1155Validator_init_unchained() internal initializer {
__EIP712_init_unchained("Mint1155", "1");
}
function validate(address account, bytes32 hash, bytes memory signature) internal view {
validate1271(account, hash, signature);
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@rarible/lib-signature/contracts/ERC1271.sol";
import "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol";
import "@rarible/lib-signature/contracts/LibSignature.sol";
abstract contract ERC1271Validator is EIP712Upgradeable {
using AddressUpgradeable for address;
using LibSignature for bytes32;
string constant SIGNATURE_ERROR = "signature verification error";
bytes4 constant internal MAGICVALUE = 0x1626ba7e;
function validate1271(address signer, bytes32 structHash, bytes memory signature) internal view {
bytes32 hash = _hashTypedDataV4(structHash);
address signerFromSig;
if (signature.length == 65) {
signerFromSig = hash.recover(signature);
}
if (signerFromSig != signer) {
if (signer.isContract()) {
require(
ERC1271(signer).isValidSignature(hash, signature) == MAGICVALUE,
SIGNATURE_ERROR
);
} else {
revert(SIGNATURE_ERROR);
}
}
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
import "../LibURI.sol";
import "./ERC1155Upgradeable.sol";
contract ERC1155BaseURI is ERC1155Upgradeable {
using StringsUpgradeable for uint;
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
// Base URI
string private _baseURI;
/**
* @dev Returns the base URI set via {_setBaseURI}. This will be
* automatically added as a prefix in {tokenURI} to each token's URI, or
* to the token ID if no specific URI is set for that token ID.
*/
function baseURI() public view virtual returns (string memory) {
return _baseURI;
}
function uri(uint id) external view override virtual returns (string memory) {
return _tokenURI(id);
}
function _tokenURI(uint256 tokenId) internal view virtual returns (string memory) {
string memory __tokenURI = _tokenURIs[tokenId];
string memory base = baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return __tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(__tokenURI).length > 0) {
return LibURI.checkPrefix(base, __tokenURI);
}
// If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
return string(abi.encodePacked(base, tokenId.toString()));
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _uri) internal virtual {
_tokenURIs[tokenId] = _uri;
emit URI(_tokenURI(tokenId), tokenId);
}
/**
* @dev Internal function to set the base URI for all token IDs. It is
* automatically added as a prefix to the value returned in {tokenURI},
* or to the token ID if {tokenURI} is empty.
*/
function _setBaseURI(string memory baseURI_) internal virtual {
_baseURI = baseURI_;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
library LibURI {
/// @dev checks if _tokenURI starts with base. if true returns _tokenURI, else base + _tokenURI
function checkPrefix(string memory base, string memory _tokenURI)
internal
pure
returns (string memory)
{
bytes memory whatBytes = bytes(base);
bytes memory whereBytes = bytes(_tokenURI);
if (whatBytes.length > whereBytes.length) {
return string(abi.encodePacked(base, _tokenURI));
}
for (uint256 j = 0; j < whatBytes.length; j++) {
if (whereBytes[j] != whatBytes[j]) {
return string(abi.encodePacked(base, _tokenURI));
}
}
return _tokenURI;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol";
abstract contract HasContractURI is ERC165Upgradeable {
string public contractURI;
/*
* bytes4(keccak256('contractURI()')) == 0xe8a3d485
*/
bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485;
function __HasContractURI_init_unchained(string memory _contractURI) internal initializer {
contractURI = _contractURI;
_registerInterface(_INTERFACE_ID_CONTRACT_URI);
}
/**
* @dev Internal function to set the contract URI
* @param _contractURI string URI prefix to assign
*/
function _setContractURI(string memory _contractURI) internal {
contractURI = _contractURI;
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
contract IsPrivateCollection {
/// @dev true if collection is private, false if public
bool isPrivate;
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
abstract contract MinterAccessControl is OwnableUpgradeable {
mapping(address => bool) private _minters;
event MinterStatusChanged(address indexed minter, bool indexed status);
function __MinterAccessControl_init() internal initializer {
__Ownable_init_unchained();
__MinterAccessControl_init_unchained();
}
function __MinterAccessControl_init_unchained() internal initializer {
}
/**
* @dev Add `minter` to the list of allowed minters.
*/
function addMinter(address minter) external onlyOwner {
_minters[minter] = true;
emit MinterStatusChanged(minter, true);
}
/**
* @dev Add `minters` to the list of allowed minters.
*/
function addMinters(address[] memory minters) external onlyOwner {
for (uint i = 0; i < minters.length; i++) {
address minter = minters[i];
_minters[minter] = true;
emit MinterStatusChanged(minter, true);
}
}
/**
* @dev Revoke `_minter` from the list of allowed minters.
*/
function removeMinter(address _minter) external onlyOwner {
_minters[_minter] = false;
emit MinterStatusChanged(_minter, false);
}
/**
* @dev Returns `true` if `account` has been granted to minters.
*/
function isMinter(address account) public view returns (bool) {
return _minters[account];
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0;
import "../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155Upgradeable is IERC165Upgradeable {
/**
* @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;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <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 IERC165Upgradeable {
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "./IERC1155Upgradeable.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC1155ReceiverUpgradeable.sol";
import "../../introspection/ERC165Upgradeable.sol";
import "../../proxy/Initializable.sol";
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155ReceiverUpgradeable is Initializable, ERC165Upgradeable, IERC1155ReceiverUpgradeable {
function __ERC1155Receiver_init() internal initializer {
__ERC165_init_unchained();
__ERC1155Receiver_init_unchained();
}
function __ERC1155Receiver_init_unchained() internal initializer {
_registerInterface(
ERC1155ReceiverUpgradeable(address(0)).onERC1155Received.selector ^
ERC1155ReceiverUpgradeable(address(0)).onERC1155BatchReceived.selector
);
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../introspection/IERC165Upgradeable.sol";
/**
* _Available since v3.1._
*/
interface IERC1155ReceiverUpgradeable is IERC165Upgradeable {
/**
@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);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC165Upgradeable.sol";
import "../proxy/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
function __ERC165_init_unchained() internal initializer {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMathUpgradeable {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "./AbstractRoyalties.sol";
import "../RoyaltiesV2.sol";
import "../IERC2981.sol";
import "../LibRoyalties2981.sol";
contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2, IERC2981 {
function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) {
return royalties[id];
}
function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) override internal {
emit RoyaltiesSet(id, _royalties);
}
/*
*Token (ERC721, ERC721Minimal, ERC721MinimalMeta, ERC1155 ) can have a number of different royalties beneficiaries
*calculate sum all royalties, but royalties beneficiary will be only one royalties[0].account, according to rules of IERC2981
*/
function royaltyInfo(uint256 id, uint256 _salePrice) override external view returns (address receiver, uint256 royaltyAmount) {
if (royalties[id].length == 0) {
receiver = address(0);
royaltyAmount = 0;
return(receiver, royaltyAmount);
}
LibPart.Part[] memory _royalties = royalties[id];
receiver = _royalties[0].account;
uint percent;
for (uint i = 0; i < _royalties.length; i++) {
percent += _royalties[i].value;
}
//don`t need require(percent < 10000, "Token royalty > 100%"); here, because check later in calculateRoyalties
royaltyAmount = percent * _salePrice / 10000;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
abstract contract AbstractRoyalties {
mapping (uint256 => LibPart.Part[]) internal royalties;
function _saveRoyalties(uint256 id, LibPart.Part[] memory _royalties) internal {
uint256 totalValue;
for (uint i = 0; i < _royalties.length; i++) {
require(_royalties[i].account != address(0x0), "Recipient should be present");
require(_royalties[i].value != 0, "Royalty value should be positive");
totalValue += _royalties[i].value;
royalties[id].push(_royalties[i]);
}
require(totalValue < 10000, "Royalty total value should be < 10000");
_onRoyaltiesSet(id, _royalties);
}
function _updateAccount(uint256 _id, address _from, address _to) internal {
uint length = royalties[_id].length;
for(uint i = 0; i < length; i++) {
if (royalties[_id][i].account == _from) {
royalties[_id][i].account = payable(address(uint160(_to)));
}
}
}
function _onRoyaltiesSet(uint256 id, LibPart.Part[] memory _royalties) virtual internal;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@rarible/lib-part/contracts/LibPart.sol";
interface RoyaltiesV2 {
event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);
function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
///
/// @dev Interface for the NFT Royalty Standard
///
//interface IERC2981 is IERC165 {
interface IERC2981 {
/// ERC165 bytes to add to interface array - set in parent contract
/// implementing this standard
///
/// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
/// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
/// _registerInterface(_INTERFACE_ID_ERC2981);
/// @notice Called with the sale price to determine how much royalty
// is owed and to whom.
/// @param _tokenId - the NFT asset queried for royalty information
/// @param _salePrice - the sale price of the NFT asset specified by _tokenId
/// @return receiver - address of who should be sent the royalty payment
/// @return royaltyAmount - the royalty payment amount for _salePrice
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibRoyalties2981 {
/*
* https://eips.ethereum.org/EIPS/eip-2981: bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
*/
bytes4 constant _INTERFACE_ID_ROYALTIES = 0x2a55205a;
uint96 constant _WEIGHT_VALUE = 1000000;
/*Method for converting amount to percent and forming LibPart*/
function calculateRoyalties(address to, uint256 amount) internal view returns (LibPart.Part[] memory) {
LibPart.Part[] memory result;
if (amount == 0) {
return result;
}
uint256 percent = amount * 10000 / _WEIGHT_VALUE;
require(percent < 10000, "Royalties 2981 exceeds 100%");
result = new LibPart.Part[](1);
result[0].account = payable(to);
result[0].value = uint96(percent);
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol";
import "@rarible/royalties/contracts/LibRoyaltiesV2.sol";
import "@rarible/royalties/contracts/RoyaltiesV2.sol";
abstract contract RoyaltiesV2Upgradeable is ERC165Upgradeable, RoyaltiesV2 {
function __RoyaltiesV2Upgradeable_init_unchained() internal initializer {
_registerInterface(LibRoyaltiesV2._INTERFACE_ID_ROYALTIES);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
pragma abicoder v2;
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";
import "./LibERC1155LazyMint.sol";
import "@rarible/lib-part/contracts/LibPart.sol";
interface IERC1155LazyMint is IERC1155Upgradeable {
event Supply(
uint256 tokenId,
uint256 value
);
event Creators(
uint256 tokenId,
LibPart.Part[] creators
);
function mintAndTransfer(
LibERC1155LazyMint.Mint1155Data memory data,
address to,
uint256 _amount
) external;
function transferFromOrMint(
LibERC1155LazyMint.Mint1155Data memory data,
address from,
address to,
uint256 amount
) external;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
import "@rarible/lib-part/contracts/LibPart.sol";
library LibERC1155LazyMint {
bytes4 constant public ERC1155_LAZY_ASSET_CLASS = bytes4(keccak256("ERC1155_LAZY"));
bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x6db15a0f;
struct Mint1155Data {
uint tokenId;
string tokenURI;
uint supply;
LibPart.Part[] creators;
LibPart.Part[] royalties;
bytes[] signatures;
}
bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint1155(uint256 tokenId,uint256 supply,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");
function hash(Mint1155Data memory data) internal pure returns (bytes32) {
bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);
for (uint i = 0; i < data.royalties.length; i++) {
royaltiesBytes[i] = LibPart.hash(data.royalties[i]);
}
bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);
for (uint i = 0; i < data.creators.length; i++) {
creatorsBytes[i] = LibPart.hash(data.creators[i]);
}
return keccak256(abi.encode(
MINT_AND_TRANSFER_TYPEHASH,
data.tokenId,
data.supply,
keccak256(bytes(data.tokenURI)),
keccak256(abi.encodePacked(creatorsBytes)),
keccak256(abi.encodePacked(royaltiesBytes))
));
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
abstract contract ERC1271 {
bytes4 constant public ERC1271_INTERFACE_ID = 0xfb855dc9; // this.isValidSignature.selector
bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x1626ba7e;
bytes4 constant public ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000;
/**
* @dev Function must be implemented by deriving contract
* @param _hash Arbitrary length data signed on the behalf of address(this)
* @param _signature Signature byte array associated with _data
* @return A bytes4 magic value 0x1626ba7e if the signature check passes, 0x00000000 if not
*
* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)
* MUST allow external calls
*/
function isValidSignature(bytes32 _hash, bytes memory _signature) public virtual view returns (bytes4);
function returnIsValidSignatureMagicNumber(bool isValid) internal pure returns (bytes4) {
return isValid ? ERC1271_RETURN_VALID_SIGNATURE : ERC1271_RETURN_INVALID_SIGNATURE;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../proxy/Initializable.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712Upgradeable is Initializable {
/* solhint-disable var-name-mixedcase */
bytes32 private _HASHED_NAME;
bytes32 private _HASHED_VERSION;
bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
function __EIP712_init(string memory name, string memory version) internal initializer {
__EIP712_init_unchained(name, version);
}
function __EIP712_init_unchained(string memory name, string memory version) internal initializer {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());
}
function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
return keccak256(
abi.encode(
typeHash,
name,
version,
_getChainId(),
address(this)
)
);
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", _domainSeparatorV4(), structHash));
}
function _getChainId() private view returns (uint256 chainId) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
// solhint-disable-next-line no-inline-assembly
assembly {
chainId := chainid()
}
}
/**
* @dev The hash of the name parameter for the EIP712 domain.
*
* NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
* are a concern.
*/
function _EIP712NameHash() internal virtual view returns (bytes32) {
return _HASHED_NAME;
}
/**
* @dev The hash of the version parameter for the EIP712 domain.
*
* NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
* are a concern.
*/
function _EIP712VersionHash() internal virtual view returns (bytes32) {
return _HASHED_VERSION;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
library LibSignature {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature)
internal
pure
returns (address)
{
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return recover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
require(
uint256(s) <=
0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
"ECDSA: invalid signature 's' value"
);
// If the signature is valid (and not malleable), return the signer address
// v > 30 is a special case, we need to adjust hash with "\x19Ethereum Signed Message:\n32"
// and v = v - 4
address signer;
if (v > 30) {
require(
v - 4 == 27 || v - 4 == 28,
"ECDSA: invalid signature 'v' value"
);
signer = ecrecover(toEthSignedMessageHash(hash), v - 4, r, s);
} else {
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
signer = ecrecover(hash, v, r, s);
}
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
* JSON-RPC method.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash)
internal
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
temp = value;
while (temp != 0) {
buffer[index--] = bytes1(uint8(48 + temp % 10));
temp /= 10;
}
return string(buffer);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
library LibPart {
bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");
struct Part {
address payable account;
uint96 value;
}
function hash(Part memory part) internal pure returns (bytes32) {
return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
library LibRoyaltiesV2 {
/*
* bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca
*/
bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca;
}{
"metadata": {
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseUriChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnLazy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BurnLazyBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"CreateERC1155Rarible","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"CreateERC1155RaribleUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"creators","type":"tuple[]"}],"name":"Creators","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"hasApproval","type":"bool"}],"name":"DefaultApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"MinterStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Supply","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":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"address[]","name":"operators","type":"address[]"},{"internalType":"address","name":"transferProxy","type":"address"},{"internalType":"address","name":"lazyTransferProxy","type":"address"}],"name":"__ERC1155RaribleUser_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"contractURI","type":"string"},{"internalType":"address","name":"transferProxy","type":"address"},{"internalType":"address","name":"lazyTransferProxy","type":"address"}],"name":"__ERC1155Rarible_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"minters","type":"address[]"}],"name":"addMinters","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":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getCreators","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"creators","type":"tuple[]"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"internalType":"struct LibERC1155LazyMint.Mint1155Data","name":"data","type":"tuple"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"creators","type":"tuple[]"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"internalType":"struct LibERC1155LazyMint.Mint1155Data","name":"data","type":"tuple"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromOrMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"updateAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061563c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806371e2a65711610104578063cad96cca116100a2578063f242432a11610071578063f242432a146103f1578063f2fde38b14610404578063f5298aca14610417578063ffc4e0a71461042a576101d9565b8063cad96cca146103b0578063e07f2319146103c3578063e8a3d485146103d6578063e985e9c5146103de576101d9565b806395d89b41116100de57806395d89b411461036f578063983b2d5614610377578063a22cb4651461038a578063aa271e1a1461039d576101d9565b806371e2a65714610327578063891be9741461033a5780638da5cb5b1461035a576101d9565b80632eb2c2d61161017c57806361e054591161014b57806361e05459146102f15780636b20c454146103045780636c0360eb14610317578063715018a61461031f576101d9565b80632eb2c2d6146102985780633092afd5146102ab5780634e1273f4146102be57806355f804b3146102de576101d9565b80630e89341c116101b85780630e89341c1461023c5780630eaead671461024f578063173c43d2146102645780632a55205a14610277576101d9565b8062fdd58e146101de57806301ffc9a71461020757806306fdde0314610227575b600080fd5b6101f16101ec3660046149a7565b61043d565b6040516101fe91906151e8565b60405180910390f35b61021a610215366004614aa0565b6104af565b6040516101fe9190614f64565b61022f6104c2565b6040516101fe9190614f6f565b61022f61024a366004614d6b565b610551565b61026261025d366004614d14565b61055c565b005b610262610272366004614afa565b610600565b61028a610285366004614dc4565b610663565b6040516101fe929190614f00565b6102626102a63660046147f5565b610773565b6102626102b93660046147a1565b610a71565b6102d16102cc366004614a40565b610b21565b6040516101fe9190614f2c565b6102626102ec366004614ac8565b610c0c565b6102626102ff366004614bc1565b610cb1565b610262610312366004614904565b610d18565b61022f610e9e565b610262610f36565b610262610335366004614a06565b610fe2565b61034d610348366004614d6b565b6110cb565b6040516101fe9190614f19565b61036261115b565b6040516101fe9190614eb6565b61022f61116a565b6102626103853660046147a1565b6111c6565b610262610398366004614976565b61127b565b61021a6103ab3660046147a1565b61136a565b61034d6103be366004614d6b565b611389565b6102626103d1366004614d83565b611404565b61022f611447565b61021a6103ec3660046147bd565b6114a3565b6102626103ff36600461489e565b6114b6565b6102626104123660046147a1565b61166f565b6102626104253660046149d2565b611772565b610262610438366004614cad565b6117ee565b60006001600160a01b0383166104845760405162461bcd60e51b815260040180806020018281038252602b815260200180615394602b913960400191505060405180910390fd5b5060008181526097602090815260408083206001600160a01b03861684529091529020545b92915050565b60006104ba82611849565b90505b919050565b610262805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b820191906000526020600020905b81548152906001019060200180831161052c57829003601f168201915b505050505081565b60606104ba826118e8565b6102965460ff16156105f057826060015160008151811061057957fe5b6020026020010151600001516001600160a01b031661059661115b565b6001600160a01b031614806105cb57506105cb83606001516000815181106105ba57fe5b60200260200101516000015161136a565b6105f05760405162461bcd60e51b81526004016105e790614f82565b60405180910390fd5b6105fb838383611a7e565b505050565b61060e868686868686611d7a565b610296805460ff191690557fcc215b7682459c30faa0e854780165d503a7d62d22a9aaaad6334585dc63343e610642611eac565b878760405161065393929190614eca565b60405180910390a1505050505050565b60008281526101fa602052604081205481906106845750600090508061076c565b60008481526101fa6020908152604080832080548251818502810185019093528083529192909190849084015b8282101561070057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b0316818301528252600190920191016106b1565b5050505090508060008151811061071357fe5b60209081029190910101515192506000805b82518110156107605782818151811061073a57fe5b6020026020010151602001516001600160601b0316820191508080600101915050610725565b50612710908502049150505b9250929050565b81518351146107b35760405162461bcd60e51b81526004018080602001828103825260288152602001806155df6028913960400191505060405180910390fd5b6001600160a01b0384166107f85760405162461bcd60e51b81526004018080602001828103825260258152602001806154546025913960400191505060405180910390fd5b610800611eac565b6001600160a01b0316856001600160a01b031614806108265750610826856103ec611eac565b6108615760405162461bcd60e51b81526004018080602001828103825260328152602001806154796032913960400191505060405180910390fd5b600061086b611eac565b905061087b818787878787610a69565b60005b845181101561098157600085828151811061089557fe5b6020026020010151905060008583815181106108ad57fe5b6020026020010151905061091a816040518060600160405280602a815260200161551e602a91396097600086815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611eb09092919063ffffffff16565b60008381526097602090815260408083206001600160a01b038e811685529252808320939093558a16815220546109519082611f47565b60009283526097602090815260408085206001600160a01b038c168652909152909220919091555060010161087e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a075781810151838201526020016109ef565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a46578181015183820152602001610a2e565b5050505090500194505050505060405180910390a4610a69818787878787611fa1565b505050505050565b610a79611eac565b6001600160a01b0316610a8a61115b565b6001600160a01b031614610ad3576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526102c86020526040808220805460ff19169055519091907f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd908390a350565b60608151835114610b635760405162461bcd60e51b81526004018080602001828103825260298152602001806155b66029913960400191505060405180910390fd5b600083516001600160401b0381118015610b7c57600080fd5b50604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50905060005b8451811015610c0457610be5858281518110610bc457fe5b6020026020010151858381518110610bd857fe5b602002602001015161043d565b828281518110610bf157fe5b6020908102919091010152600101610bac565b509392505050565b610c14611eac565b6001600160a01b0316610c2561115b565b6001600160a01b031614610c6e576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b610c7781612217565b7f87cdeaffd8e70903d6ce7cc983fac3b09ca79e83818124c98e47a1d70f8027d681604051610ca69190614f6f565b60405180910390a150565b610cbf878787878686611d7a565b610296805460ff191660011790557f7da6bc204c8c4856a6aff786a6cb81c59477c782191dc51837d644a8ad50f2cc610cf6611eac565b8888604051610d0793929190614eca565b60405180910390a150505050505050565b8051825114610d395760405162461bcd60e51b81526004016105e790615131565b600082516001600160401b0381118015610d5257600080fd5b50604051908082528060200260200182016040528015610d7c578160200160208202803683370190505b509050600083516001600160401b0381118015610d9857600080fd5b50604051908082528060200260200182016040528015610dc2578160200160208202803683370190505b50905060005b8451811015610e3757610e01858281518110610de057fe5b6020026020010151858381518110610df457fe5b602002602001015161222b565b848381518110610e0d57fe5b60200260200101848481518110610e2057fe5b602090810291909101019190915252600101610dc8565b50610e438585846122a0565b846001600160a01b0316610e55611eac565b6001600160a01b03167fcf3391513e21a9d4a0348f8e890080170eba18dc62db35b60d8a518b7088eb3a8684604051610e8f929190614f3f565b60405180910390a35050505050565b61012f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f2b5780601f10610f0057610100808354040283529160200191610f2b565b820191906000526020600020905b815481529060010190602001808311610f0e57829003601f168201915b505050505090505b90565b610f3e611eac565b6001600160a01b0316610f4f61115b565b6001600160a01b031614610f98576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610fea611eac565b6001600160a01b0316610ffb61115b565b6001600160a01b031614611044576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b60005b81518110156110c757600082828151811061105e57fe5b6020908102919091018101516001600160a01b03811660008181526102c89093526040808420805460ff1916600190811790915590519294509290917f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd9190a350600101611047565b5050565b60606101fb6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561115057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611101565b505050509050919050565b6033546001600160a01b031690565b610263805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b6111ce611eac565b6001600160a01b03166111df61115b565b6001600160a01b031614611228576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526102c86020526040808220805460ff1916600190811790915590519092917f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd91a350565b816001600160a01b031661128d611eac565b6001600160a01b031614156112d35760405162461bcd60e51b815260040180806020018281038252602981526020018061558d6029913960400191505060405180910390fd5b80609860006112e0611eac565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611324611eac565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6001600160a01b031660009081526102c8602052604090205460ff1690565b60008181526101fa6020908152604080832080548251818502810185019093528083526060949293919290918401821561115057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611101565b816001600160a01b0316611416611eac565b6001600160a01b03161461143c5760405162461bcd60e51b81526004016105e790615039565b6105fb838383612314565b610230805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b60006114af83836123c0565b9392505050565b6001600160a01b0384166114fb5760405162461bcd60e51b81526004018080602001828103825260258152602001806154546025913960400191505060405180910390fd5b611503611eac565b6001600160a01b0316856001600160a01b031614806115295750611529856103ec611eac565b6115645760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b600061156e611eac565b905061158e81878761157f886123ec565b611588886123ec565b87610a69565b6115d5836040518060600160405280602a815260200161551e602a913960008781526097602090815260408083206001600160a01b038d1684529091529020549190611eb0565b60008581526097602090815260408083206001600160a01b038b8116855292528083209390935587168152205461160c9084611f47565b60008581526097602090815260408083206001600160a01b03808b168086529184529382902094909455805188815291820187905280518a84169386169260008051602061537483398151915292908290030190a4610a69818787878787612431565b611677611eac565b6001600160a01b031661168861115b565b6001600160a01b0316146116d1576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b0381166117165760405162461bcd60e51b81526004018080602001828103825260268152602001806153bf6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60008061177f848461222b565b90925090508115611795576117958585846125a2565b80156117e757846001600160a01b03166117ad611eac565b6001600160a01b03167f5110a21391aa55386de41fe7a3e3dffb40132d38d629a113a7f4afff251b1a018684604051610e8f92919061520a565b5050505050565b60006117fe84866000015161043d565b90508181156118385782808310156118135750815b6118338686896000015184604051806020016040528060008152506114b6565b830390505b8015610a6957610a6986858361055c565b60006001600160e01b03198216636db15a0f60e01b148061187a57506001600160e01b0319821663656cb66560e11b145b8061189557506001600160e01b0319821663152a902d60e11b145b806118b057506001600160e01b031982166301ffc9a760e01b145b806118cb57506001600160e01b03198216636cdb3d1360e11b145b806104ba5750506001600160e01b0319166303a24d0760e21b1490565b600081815261012e6020908152604080832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060949383018282801561197d5780601f106119525761010080835404028352916020019161197d565b820191906000526020600020905b81548152906001019060200180831161196057829003601f168201915b50505050509050600061198e610e9e565b90508051600014156119a2575090506104bd565b8151156119bc576119b38183612616565b925050506104bd565b806119c6856127fb565b6040516020018083805190602001908083835b602083106119f85780518252601f1990920191602091820191016119d9565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310611a405780518252601f199092019160209182019101611a21565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b825160601c6000611a8d611eac565b9050806001600160a01b0316826001600160a01b03161480611ab45750611ab482826114a3565b611ad05760405162461bcd60e51b81526004016105e790615088565b60008311611af05760405162461bcd60e51b81526004016105e79061505e565b845160009081526101fc6020526040902054611c59578460600151600081518110611b1757fe5b6020026020010151600001516001600160a01b0316826001600160a01b031614611b535760405162461bcd60e51b81526004016105e79061500e565b6000856040015111611b775760405162461bcd60e51b81526004016105e790614faf565b8460a001515185606001515114611b8d57600080fd5b6000611b98866128d5565b905060005b866060015151811015611c0e57600087606001518281518110611bbc57fe5b6020026020010151600001519050836001600160a01b0316816001600160a01b031614611c0557611c0581848a60a001518581518110611bf857fe5b6020026020010151612b28565b50600101611b9d565b50611c2186600001518760400151612b33565b611c3386600001518760800151612b9d565b611c4586600001518760600151612d8c565b611c5786600001518760200151612f3b565b505b611c788486600001518560405180602001604052806000815250612fff565b836001600160a01b0316826001600160a01b031614611d2957816001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611cd392919061520a565b60405180910390a4836001600160a01b0316826001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611d1c92919061520a565b60405180910390a46117e7565b836001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611d6b92919061520a565b60405180910390a45050505050565b600054610100900460ff1680611d935750611d93613011565b80611da1575060005460ff16155b611ddc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015611e07576000805460ff1961ff0019909116610100171660011790555b611e0f613022565b611e1761311c565b611e1f6131bd565b611e2761311c565b611e2f61325a565b611e476040518060200160405280600081525061332a565b611e50846133f5565b611e5861311c565b611e606134a7565b611e6a8787613544565b611e7261311c565b611e7b85612217565b611e86836001613611565b611e91826001613611565b8015611ea3576000805461ff00191690555b50505050505050565b3390565b60008184841115611f3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f04578181015183820152602001611eec565b50505050905090810190601f168015611f315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156114af576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611fb3846001600160a01b0316613671565b15610a6957836001600160a01b031663bc197c8187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015612041578181015183820152602001612029565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015612080578181015183820152602001612068565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156120bc5781810151838201526020016120a4565b50505050905090810190601f1680156120e95780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561210e57600080fd5b505af192505050801561213357506040513d602081101561212e57600080fd5b505160015b6121c85761213f61525e565b8061214a5750612191565b60405162461bcd60e51b8152602060048201818152835160248401528351849391928392604401919085019080838360008315611f04578181015183820152602001611eec565b60405162461bcd60e51b81526004018080602001828103825260348152602001806153186034913960400191505060405180910390fd5b6001600160e01b0319811663bc197c8160e01b14611ea35760405162461bcd60e51b815260040180806020018281038252602881526020018061534c6028913960400191505060405180910390fd5b80516110c79061012f9060208401906143e5565b806000606084901c61223b611eac565b6001600160a01b0316816001600160a01b0316141561229857839150600061226286613677565b905080156122875760006122758761368a565b8203905080861115612285578093505b505b612291868461369d565b8285039350505b509250929050565b6122a8611eac565b6001600160a01b0316836001600160a01b031614806122ce57506122ce836103ec611eac565b6123095760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b6105fb8383836136b6565b60008381526101fa6020526040812054905b818110156117e75760008581526101fa6020526040902080546001600160a01b03861691908390811061235557fe5b6000918252602090912001546001600160a01b031614156123b85760008581526101fa6020526040902080548491908390811061238e57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790555b600101612326565b6001600160a01b038116600090815260c9602052604081205460ff16806114af57506114af8383613924565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061242057fe5b602090810291909101015292915050565b612443846001600160a01b0316613671565b15610a6957836001600160a01b031663f23a6e6187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124d25781810151838201526020016124ba565b50505050905090810190601f1680156124ff5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561252257600080fd5b505af192505050801561254757506040513d602081101561254257600080fd5b505160015b6125535761213f61525e565b6001600160e01b0319811663f23a6e6160e01b14611ea35760405162461bcd60e51b815260040180806020018281038252602881526020018061534c6028913960400191505060405180910390fd5b6125aa611eac565b6001600160a01b0316836001600160a01b031614806125d057506125d0836103ec611eac565b61260b5760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b6105fb838383613952565b805182516060918491849110156126e15784846040516020018083805190602001908083835b6020831061265b5780518252601f19909201916020918201910161263c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126a35780518252601f199092019160209182019101612684565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050506104a9565b60005b82518110156127f1578281815181106126f957fe5b602001015160f81c60f81b6001600160f81b03191682828151811061271a57fe5b01602001516001600160f81b031916146127e95785856040516020018083805190602001908083835b602083106127625780518252601f199092019160209182019101612743565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127aa5780518252601f19909201916020918201910161278b565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405293505050506104a9565b6001016126e4565b5092949350505050565b60608161282057506040805180820190915260018152600360fc1b60208201526104bd565b8160005b811561283857600101600a82049150612824565b6000816001600160401b038111801561285057600080fd5b506040519080825280601f01601f19166020018201604052801561287b576020820181803683370190505b50859350905060001982015b83156128cc57600a840660300160f81b828280600190039350815181106128aa57fe5b60200101906001600160f81b031916908160001a905350600a84049350612887565b50949350505050565b6000808260800151516001600160401b03811180156128f357600080fd5b5060405190808252806020026020018201604052801561291d578160200160208202803683370190505b50905060005b83608001515181101561296f576129508460800151828151811061294357fe5b6020026020010151613a73565b82828151811061295c57fe5b6020908102919091010152600101612923565b5060008360600151516001600160401b038111801561298d57600080fd5b506040519080825280602002602001820160405280156129b7578160200160208202803683370190505b50905060005b8460600151518110156129fc576129dd8560600151828151811061294357fe5b8282815181106129e957fe5b60209081029190910101526001016129bd565b507ffb988707ebb338694f318760b0fd5cfe756d00a2ade251fda110b80c336a3c7f846000015185604001518660200151805190602001208460405160200180828051906020019060200280838360005b83811015612a65578181015183820152602001612a4d565b50505050905001915050604051602081830303815290604052805190602001208660405160200180828051906020019060200280838360005b83811015612ab6578181015183820152602001612a9e565b50505050905001915050604051602081830303815290604052805190602001206040516020018087815260200186815260200185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012092505050919050565b6105fb838383613ae0565b60008281526101fc602052604090205415612b4d57600080fd5b60008281526101fc602052604090819020829055517f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c90612b91908490849061520a565b60405180910390a15050565b6000805b8251811015612d415760006001600160a01b0316838281518110612bc157fe5b6020026020010151600001516001600160a01b03161415612c29576040805162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015290519081900360640190fd5b828181518110612c3557fe5b6020026020010151602001516001600160601b031660001415612c9f576040805162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015290519081900360640190fd5b828181518110612cab57fe5b6020026020010151602001516001600160601b0316820191506101fa6000858152602001908152602001600020838281518110612ce457fe5b60209081029190910181015182546001818101855560009485529383902082519101805492909301516001600160601b0316600160a01b026001600160a01b039182166001600160a01b0319909316929092171617905501612ba1565b506127108110612d825760405162461bcd60e51b81526004018080602001828103825260258152602001806155686025913960400191505060405180910390fd5b6105fb8383613d22565b60008281526101fb6020526040812090805b8351811015612eda5760006001600160a01b0316848281518110612dbe57fe5b6020026020010151600001516001600160a01b03161415612df15760405162461bcd60e51b81526004016105e7906150fa565b838181518110612dfd57fe5b6020026020010151602001516001600160601b031660001415612e325760405162461bcd60e51b81526004016105e790614fd9565b82848281518110612e3f57fe5b602090810291909101810151825460018101845560009384529282902081519301805491909201516001600160601b0316600160a01b026001600160a01b039384166001600160a01b0319909216919091179092169190911790558351612ed090859083908110612eac57fe5b6020026020010151602001516001600160601b031683611f4790919063ffffffff16565b9150600101612d9e565b508061271014612efc5760405162461bcd60e51b81526004016105e79061519a565b7f841ffb90d4cabdd1f16034f3fa831d79060febbb8167bdd54a49269365bdf78f8484604051612f2d9291906151f1565b60405180910390a150505050565b600082815261012e602090815260409091208251612f5b928401906143e5565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612f87846118e8565b6040805160208082528351818301528351919283929083019185019080838360005b83811015612fc1578181015183820152602001612fa9565b50505050905090810190601f168015612fee5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61300b84848484613d53565b50505050565b600061301c30613671565b15905090565b600054610100900460ff168061303b575061303b613011565b80613049575060005460ff16155b6130845760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156130af576000805460ff1961ff0019909116610100171660011790555b60006130b9611eac565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015613119576000805461ff00191690555b50565b600054610100900460ff16806131355750613135613011565b80613143575060005460ff16155b61317e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156131a9576000805460ff1961ff0019909116610100171660011790555b8015613119576000805461ff001916905550565b600054610100900460ff16806131d657506131d6613011565b806131e4575060005460ff16155b61321f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff1615801561324a576000805460ff1961ff0019909116610100171660011790555b6131a96301ffc9a760e01b613e65565b600054610100900460ff16806132735750613273613011565b80613281575060005460ff16155b6132bc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156132e7576000805460ff1961ff0019909116610100171660011790555b6131a9604051806040016040528060088152602001674d696e743131353560c01b815250604051806040016040528060018152602001603160f81b815250613ee9565b600054610100900460ff16806133435750613343613011565b80613351575060005460ff16155b61338c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156133b7576000805460ff1961ff0019909116610100171660011790555b6133c082613fab565b6133d0636cdb3d1360e11b613e65565b6133e06303a24d0760e21b613e65565b80156110c7576000805461ff00191690555050565b600054610100900460ff168061340e575061340e613011565b8061341c575060005460ff16155b6134575760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613482576000805460ff1961ff0019909116610100171660011790555b8151613496906102309060208501906143e5565b506133e063e8a3d48560e01b613e65565b600054610100900460ff16806134c057506134c0613011565b806134ce575060005460ff16155b6135095760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613534576000805460ff1961ff0019909116610100171660011790555b6131a963656cb66560e11b613e65565b600054610100900460ff168061355d575061355d613011565b8061356b575060005460ff16155b6135a65760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156135d1576000805460ff1961ff0019909116610100171660011790555b82516135e5906102629060208601906143e5565b5081516135fa906102639060208501906143e5565b5080156105fb576000805461ff0019169055505050565b6001600160a01b038216600081815260c96020908152604091829020805460ff1916851515908117909155825190815291517f270dbb8ba4292910ae92862466486be25c355c837270a3d8824b36a8bc7c653b9281900390910190a25050565b3b151590565b60009081526101fc602052604090205490565b60009081526101fd602052604090205490565b60009182526101fd602052604090912080549091019055565b6001600160a01b0383166136fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806154fb6023913960400191505060405180910390fd5b805182511461373b5760405162461bcd60e51b81526004018080602001828103825260288152602001806155df6028913960400191505060405180910390fd5b6000613745611eac565b905061376581856000868660405180602001604052806000815250610a69565b60005b8351811015613843576137fa83828151811061378057fe5b60200260200101516040518060600160405280602481526020016153e560249139609760008886815181106137b157fe5b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611eb09092919063ffffffff16565b6097600086848151811061380a57fe5b602090810291909101810151825281810192909252604090810160009081206001600160a01b038a168252909252902055600101613768565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156138ca5781810151838201526020016138b2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156139095781810151838201526020016138f1565b5050505090500194505050505060405180910390a450505050565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205460ff1690565b6001600160a01b0383166139975760405162461bcd60e51b81526004018080602001828103825260238152602001806154fb6023913960400191505060405180910390fd5b60006139a1611eac565b90506139d1818560006139b3876123ec565b6139bc876123ec565b60405180602001604052806000815250610a69565b613a18826040518060600160405280602481526020016153e56024913960008681526097602090815260408083206001600160a01b038b1684529091529020549190611eb0565b60008481526097602090815260408083206001600160a01b03808a168086529184528285209590955581518881529283018790528151939490939086169260008051602061537483398151915292908290030190a450505050565b8051602091820151604080517f397e04204c1e1a60ee8724b71f8244e10ab5f2e9009854d80f602bda21b59ebb818601526001600160a01b03909316838201526001600160601b039091166060808401919091528151808403909101815260809092019052805191012090565b6000613aeb83613fbe565b90506000825160411415613b0657613b03828461400a565b90505b846001600160a01b0316816001600160a01b0316146117e757613b31856001600160a01b0316613671565b15613caa5760408051630b135d3f60e11b808252600482018581526024830193845286516044840152865191936001600160a01b038a1693631626ba7e9388938a9390929091606490910190602085019080838360005b83811015613ba0578181015183820152602001613b88565b50505050905090810190601f168015613bcd5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015613beb57600080fd5b505afa158015613bff573d6000803e3d6000fd5b505050506040513d6020811015613c1557600080fd5b505160408051808201909152601c81527f7369676e617475726520766572696669636174696f6e206572726f72000000006020820152916001600160e01b031990911614613ca45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f04578181015183820152602001611eec565b506117e7565b604080518082018252601c81527f7369676e617475726520766572696669636174696f6e206572726f72000000006020808301918252925162461bcd60e51b81526004810193845282516024820152825192939283926044909201919080838360008315611f04578181015183820152602001611eec565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612b919291906151f1565b60008381526101fd6020526040812054613d6e908490611f47565b60008581526101fc6020526040902054909150811115613da05760405162461bcd60e51b81526004016105e7906150d0565b60008481526101fd602052604090208190556001600160a01b038516613dd85760405162461bcd60e51b81526004016105e790615159565b6000613de2611eac565b9050613e0381600088613df4896123ec565b613dfd896123ec565b88610a69565b60008581526097602090815260408083206001600160a01b038a168452909152902054613e309085611f47565b60008681526097602090815260408083206001600160a01b038b168452909152812091909155610a6990829088888888612431565b6001600160e01b03198082161415613ec4576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152606560205260409020805460ff19166001179055565b600054610100900460ff1680613f025750613f02613011565b80613f10575060005460ff16155b613f4b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613f76576000805460ff1961ff0019909116610100171660011790555b8251602080850191909120835191840191909120610162919091556101635580156105fb576000805461ff0019169055505050565b80516110c79060999060208401906143e5565b6000613fc861408a565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60008151604114614062576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a614080868285856140ca565b9695505050505050565b60006140c57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6140b8614320565b6140c0614327565b61432e565b905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561412b5760405162461bcd60e51b81526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b6000601e8560ff161115614205576004850360ff16601b148061415457506004850360ff16601c145b61418f5760405162461bcd60e51b81526004018080602001828103825260228152602001806154d96022913960400191505060405180910390fd5b600161419a87614390565b60048703868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156141f4573d6000803e3d6000fd5b5050506020604051035190506142bc565b8460ff16601b148061421a57508460ff16601c145b6142555760405162461bcd60e51b81526004018080602001828103825260228152602001806154d96022913960400191505060405180910390fd5b60018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156142af573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116614317576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6101625490565b6101635490565b600083838361433b6143e1565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b4690565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261441b5760008555614461565b82601f1061443457805160ff1916838001178555614461565b82800160010185558215614461579182015b82811115614461578251825591602001919060010190614446565b5061446d929150614471565b5090565b5b8082111561446d5760008155600101614472565b80356104bd81615302565b600082601f8301126144a1578081fd5b813560206144b66144b18361523b565b615218565b82815281810190858301838502870184018810156144d2578586fd5b855b858110156144f95781356144e781615302565b845292840192908401906001016144d4565b5090979650505050505050565b600082601f830112614516578081fd5b813560206145266144b18361523b565b82815281810190858301855b858110156144f957614549898684358b0101614670565b84529284019290840190600101614532565b600082601f83011261456b578081fd5b8135602061457b6144b18361523b565b82815281810190858301604080860288018501891015614599578687fd5b865b868110156146085781838b0312156145b1578788fd5b81518281018181106001600160401b03821117156145cb57fe5b835283356145d881615302565b8152838701356001600160601b03811681146145f257898afd5b818801528552938501939181019160010161459b565b509198975050505050505050565b600082601f830112614626578081fd5b813560206146366144b18361523b565b8281528181019085830183850287018401881015614652578586fd5b855b858110156144f957813584529284019290840190600101614654565b600082601f830112614680578081fd5b81356001600160401b0381111561469357fe5b6146a6601f8201601f1916602001615218565b8181528460208386010111156146ba578283fd5b816020850160208301379081016020019190915292915050565b600060c082840312156146e5578081fd5b6146ef60c0615218565b90508135815260208201356001600160401b038082111561470f57600080fd5b61471b85838601614670565b602084015260408401356040840152606084013591508082111561473e57600080fd5b61474a8583860161455b565b6060840152608084013591508082111561476357600080fd5b61476f8583860161455b565b608084015260a084013591508082111561478857600080fd5b5061479584828501614506565b60a08301525092915050565b6000602082840312156147b2578081fd5b81356114af81615302565b600080604083850312156147cf578081fd5b82356147da81615302565b915060208301356147ea81615302565b809150509250929050565b600080600080600060a0868803121561480c578081fd5b853561481781615302565b9450602086013561482781615302565b935060408601356001600160401b0380821115614842578283fd5b61484e89838a01614616565b94506060880135915080821115614863578283fd5b61486f89838a01614616565b93506080880135915080821115614884578283fd5b5061489188828901614670565b9150509295509295909350565b600080600080600060a086880312156148b5578283fd5b85356148c081615302565b945060208601356148d081615302565b9350604086013592506060860135915060808601356001600160401b038111156148f8578182fd5b61489188828901614670565b600080600060608486031215614918578081fd5b833561492381615302565b925060208401356001600160401b038082111561493e578283fd5b61494a87838801614616565b9350604086013591508082111561495f578283fd5b5061496c86828701614616565b9150509250925092565b60008060408385031215614988578182fd5b823561499381615302565b9150602083013580151581146147ea578182fd5b600080604083850312156149b9578182fd5b82356149c481615302565b946020939093013593505050565b6000806000606084860312156149e6578081fd5b83356149f181615302565b95602085013595506040909401359392505050565b600060208284031215614a17578081fd5b81356001600160401b03811115614a2c578182fd5b614a3884828501614491565b949350505050565b60008060408385031215614a52578182fd5b82356001600160401b0380821115614a68578384fd5b614a7486838701614491565b93506020850135915080821115614a89578283fd5b50614a9685828601614616565b9150509250929050565b600060208284031215614ab1578081fd5b81356001600160e01b0319811681146114af578182fd5b600060208284031215614ad9578081fd5b81356001600160401b03811115614aee578182fd5b614a3884828501614670565b60008060008060008060c08789031215614b12578384fd5b86356001600160401b0380821115614b28578586fd5b614b348a838b01614670565b97506020890135915080821115614b49578586fd5b614b558a838b01614670565b96506040890135915080821115614b6a578586fd5b614b768a838b01614670565b95506060890135915080821115614b8b578283fd5b50614b9889828a01614670565b935050614ba760808801614486565b9150614bb560a08801614486565b90509295509295509295565b600080600080600080600060e0888a031215614bdb578485fd5b87356001600160401b0380821115614bf1578687fd5b614bfd8b838c01614670565b985060208a0135915080821115614c12578687fd5b614c1e8b838c01614670565b975060408a0135915080821115614c33578687fd5b614c3f8b838c01614670565b965060608a0135915080821115614c54578283fd5b614c608b838c01614670565b955060808a0135915080821115614c75578283fd5b50614c828a828b01614491565b935050614c9160a08901614486565b9150614c9f60c08901614486565b905092959891949750929550565b60008060008060808587031215614cc2578182fd5b84356001600160401b03811115614cd7578283fd5b614ce3878288016146d4565b9450506020850135614cf481615302565b92506040850135614d0481615302565b9396929550929360600135925050565b600080600060608486031215614d28578081fd5b83356001600160401b03811115614d3d578182fd5b614d49868287016146d4565b9350506020840135614d5a81615302565b929592945050506040919091013590565b600060208284031215614d7c578081fd5b5035919050565b600080600060608486031215614d97578081fd5b833592506020840135614da981615302565b91506040840135614db981615302565b809150509250925092565b60008060408385031215614dd6578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015614e3157815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101614df8565b509495945050505050565b6000815180845260208085019450808401835b83811015614e3157815187529582019590820190600101614e4f565b60008151808452815b81811015614e9057602081850181015186830182015201614e74565b81811115614ea15782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0384168152606060208201819052600090614eee90830185614e6b565b82810360408401526140808185614e6b565b6001600160a01b03929092168252602082015260400190565b6000602082526114af6020830184614de5565b6000602082526114af6020830184614e3c565b600060408252614f526040830185614e3c565b82810360208401526143178185614e3c565b901515815260200190565b6000602082526114af6020830184614e6b565b6020808252601390820152723737ba1037bbb732b91037b91036b4b73a32b960691b604082015260600190565b60208082526010908201526f1cdd5c1c1b1e481a5b98dbdc9c9958dd60821b604082015260600190565b6020808252818101527f43726561746f722073686172652073686f756c6420626520706f736974697665604082015260600190565b6020808252601190820152701d1bdad95b9259081a5b98dbdc9c9958dd607a1b604082015260600190565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b60208082526010908201526f185b5bdd5b9d081a5b98dbdc9c9958dd60821b604082015260600190565b60208082526028908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f7420604082015267185c1c1c9bdd995960c21b606082015260800190565b60208082526010908201526f6d6f7265207468616e20737570706c7960801b604082015260600190565b60208082526019908201527f4163636f756e742073686f756c642062652070726573656e7400000000000000604082015260600190565b6020808252600e908201526d69647320213d20616d6f756e747360901b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602e908201527f746f74616c20616d6f756e74206f662063726561746f7273207368617265207360408201526d0686f756c642062652031303030360941b606082015260800190565b90815260200190565b600083825260406020830152614a386040830184614de5565b918252602082015260400190565b6040518181016001600160401b038111828210171561523357fe5b604052919050565b60006001600160401b0382111561524e57fe5b5060209081020190565b60e01c90565b600060443d101561526e57610f33565b600481823e6308c379a06152828251615258565b1461528c57610f33565b6040513d600319016004823e80513d6001600160401b0381602484011181841117156152bb5750505050610f33565b828401925082519150808211156152d55750505050610f33565b503d830160208284010111156152ed57505050610f33565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461311957600080fdfe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656445434453413a20696e76616c6964207369676e6174757265202773272076616c7565455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565455243313135353a206275726e2066726f6d20746865207a65726f2061646472657373455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665724f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f79616c747920746f74616c2076616c75652073686f756c64206265203c203130303030455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368a2646970667358221220ae797c59fedc2b400b3bf0014d619dcdb93c789ea67bdaaa9bacc1958c1d896e64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101d95760003560e01c806371e2a65711610104578063cad96cca116100a2578063f242432a11610071578063f242432a146103f1578063f2fde38b14610404578063f5298aca14610417578063ffc4e0a71461042a576101d9565b8063cad96cca146103b0578063e07f2319146103c3578063e8a3d485146103d6578063e985e9c5146103de576101d9565b806395d89b41116100de57806395d89b411461036f578063983b2d5614610377578063a22cb4651461038a578063aa271e1a1461039d576101d9565b806371e2a65714610327578063891be9741461033a5780638da5cb5b1461035a576101d9565b80632eb2c2d61161017c57806361e054591161014b57806361e05459146102f15780636b20c454146103045780636c0360eb14610317578063715018a61461031f576101d9565b80632eb2c2d6146102985780633092afd5146102ab5780634e1273f4146102be57806355f804b3146102de576101d9565b80630e89341c116101b85780630e89341c1461023c5780630eaead671461024f578063173c43d2146102645780632a55205a14610277576101d9565b8062fdd58e146101de57806301ffc9a71461020757806306fdde0314610227575b600080fd5b6101f16101ec3660046149a7565b61043d565b6040516101fe91906151e8565b60405180910390f35b61021a610215366004614aa0565b6104af565b6040516101fe9190614f64565b61022f6104c2565b6040516101fe9190614f6f565b61022f61024a366004614d6b565b610551565b61026261025d366004614d14565b61055c565b005b610262610272366004614afa565b610600565b61028a610285366004614dc4565b610663565b6040516101fe929190614f00565b6102626102a63660046147f5565b610773565b6102626102b93660046147a1565b610a71565b6102d16102cc366004614a40565b610b21565b6040516101fe9190614f2c565b6102626102ec366004614ac8565b610c0c565b6102626102ff366004614bc1565b610cb1565b610262610312366004614904565b610d18565b61022f610e9e565b610262610f36565b610262610335366004614a06565b610fe2565b61034d610348366004614d6b565b6110cb565b6040516101fe9190614f19565b61036261115b565b6040516101fe9190614eb6565b61022f61116a565b6102626103853660046147a1565b6111c6565b610262610398366004614976565b61127b565b61021a6103ab3660046147a1565b61136a565b61034d6103be366004614d6b565b611389565b6102626103d1366004614d83565b611404565b61022f611447565b61021a6103ec3660046147bd565b6114a3565b6102626103ff36600461489e565b6114b6565b6102626104123660046147a1565b61166f565b6102626104253660046149d2565b611772565b610262610438366004614cad565b6117ee565b60006001600160a01b0383166104845760405162461bcd60e51b815260040180806020018281038252602b815260200180615394602b913960400191505060405180910390fd5b5060008181526097602090815260408083206001600160a01b03861684529091529020545b92915050565b60006104ba82611849565b90505b919050565b610262805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b820191906000526020600020905b81548152906001019060200180831161052c57829003601f168201915b505050505081565b60606104ba826118e8565b6102965460ff16156105f057826060015160008151811061057957fe5b6020026020010151600001516001600160a01b031661059661115b565b6001600160a01b031614806105cb57506105cb83606001516000815181106105ba57fe5b60200260200101516000015161136a565b6105f05760405162461bcd60e51b81526004016105e790614f82565b60405180910390fd5b6105fb838383611a7e565b505050565b61060e868686868686611d7a565b610296805460ff191690557fcc215b7682459c30faa0e854780165d503a7d62d22a9aaaad6334585dc63343e610642611eac565b878760405161065393929190614eca565b60405180910390a1505050505050565b60008281526101fa602052604081205481906106845750600090508061076c565b60008481526101fa6020908152604080832080548251818502810185019093528083529192909190849084015b8282101561070057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b0316818301528252600190920191016106b1565b5050505090508060008151811061071357fe5b60209081029190910101515192506000805b82518110156107605782818151811061073a57fe5b6020026020010151602001516001600160601b0316820191508080600101915050610725565b50612710908502049150505b9250929050565b81518351146107b35760405162461bcd60e51b81526004018080602001828103825260288152602001806155df6028913960400191505060405180910390fd5b6001600160a01b0384166107f85760405162461bcd60e51b81526004018080602001828103825260258152602001806154546025913960400191505060405180910390fd5b610800611eac565b6001600160a01b0316856001600160a01b031614806108265750610826856103ec611eac565b6108615760405162461bcd60e51b81526004018080602001828103825260328152602001806154796032913960400191505060405180910390fd5b600061086b611eac565b905061087b818787878787610a69565b60005b845181101561098157600085828151811061089557fe5b6020026020010151905060008583815181106108ad57fe5b6020026020010151905061091a816040518060600160405280602a815260200161551e602a91396097600086815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611eb09092919063ffffffff16565b60008381526097602090815260408083206001600160a01b038e811685529252808320939093558a16815220546109519082611f47565b60009283526097602090815260408085206001600160a01b038c168652909152909220919091555060010161087e565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a075781810151838201526020016109ef565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a46578181015183820152602001610a2e565b5050505090500194505050505060405180910390a4610a69818787878787611fa1565b505050505050565b610a79611eac565b6001600160a01b0316610a8a61115b565b6001600160a01b031614610ad3576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526102c86020526040808220805460ff19169055519091907f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd908390a350565b60608151835114610b635760405162461bcd60e51b81526004018080602001828103825260298152602001806155b66029913960400191505060405180910390fd5b600083516001600160401b0381118015610b7c57600080fd5b50604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50905060005b8451811015610c0457610be5858281518110610bc457fe5b6020026020010151858381518110610bd857fe5b602002602001015161043d565b828281518110610bf157fe5b6020908102919091010152600101610bac565b509392505050565b610c14611eac565b6001600160a01b0316610c2561115b565b6001600160a01b031614610c6e576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b610c7781612217565b7f87cdeaffd8e70903d6ce7cc983fac3b09ca79e83818124c98e47a1d70f8027d681604051610ca69190614f6f565b60405180910390a150565b610cbf878787878686611d7a565b610296805460ff191660011790557f7da6bc204c8c4856a6aff786a6cb81c59477c782191dc51837d644a8ad50f2cc610cf6611eac565b8888604051610d0793929190614eca565b60405180910390a150505050505050565b8051825114610d395760405162461bcd60e51b81526004016105e790615131565b600082516001600160401b0381118015610d5257600080fd5b50604051908082528060200260200182016040528015610d7c578160200160208202803683370190505b509050600083516001600160401b0381118015610d9857600080fd5b50604051908082528060200260200182016040528015610dc2578160200160208202803683370190505b50905060005b8451811015610e3757610e01858281518110610de057fe5b6020026020010151858381518110610df457fe5b602002602001015161222b565b848381518110610e0d57fe5b60200260200101848481518110610e2057fe5b602090810291909101019190915252600101610dc8565b50610e438585846122a0565b846001600160a01b0316610e55611eac565b6001600160a01b03167fcf3391513e21a9d4a0348f8e890080170eba18dc62db35b60d8a518b7088eb3a8684604051610e8f929190614f3f565b60405180910390a35050505050565b61012f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f2b5780601f10610f0057610100808354040283529160200191610f2b565b820191906000526020600020905b815481529060010190602001808311610f0e57829003601f168201915b505050505090505b90565b610f3e611eac565b6001600160a01b0316610f4f61115b565b6001600160a01b031614610f98576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610fea611eac565b6001600160a01b0316610ffb61115b565b6001600160a01b031614611044576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b60005b81518110156110c757600082828151811061105e57fe5b6020908102919091018101516001600160a01b03811660008181526102c89093526040808420805460ff1916600190811790915590519294509290917f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd9190a350600101611047565b5050565b60606101fb6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561115057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611101565b505050509050919050565b6033546001600160a01b031690565b610263805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b6111ce611eac565b6001600160a01b03166111df61115b565b6001600160a01b031614611228576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526102c86020526040808220805460ff1916600190811790915590519092917f3042b80e435ae46c334b2cfec51a66d64c9a8a8af4cd0c279a124c35a09e91dd91a350565b816001600160a01b031661128d611eac565b6001600160a01b031614156112d35760405162461bcd60e51b815260040180806020018281038252602981526020018061558d6029913960400191505060405180910390fd5b80609860006112e0611eac565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611324611eac565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6001600160a01b031660009081526102c8602052604090205460ff1690565b60008181526101fa6020908152604080832080548251818502810185019093528083526060949293919290918401821561115057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101611101565b816001600160a01b0316611416611eac565b6001600160a01b03161461143c5760405162461bcd60e51b81526004016105e790615039565b6105fb838383612314565b610230805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105495780601f1061051e57610100808354040283529160200191610549565b60006114af83836123c0565b9392505050565b6001600160a01b0384166114fb5760405162461bcd60e51b81526004018080602001828103825260258152602001806154546025913960400191505060405180910390fd5b611503611eac565b6001600160a01b0316856001600160a01b031614806115295750611529856103ec611eac565b6115645760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b600061156e611eac565b905061158e81878761157f886123ec565b611588886123ec565b87610a69565b6115d5836040518060600160405280602a815260200161551e602a913960008781526097602090815260408083206001600160a01b038d1684529091529020549190611eb0565b60008581526097602090815260408083206001600160a01b038b8116855292528083209390935587168152205461160c9084611f47565b60008581526097602090815260408083206001600160a01b03808b168086529184529382902094909455805188815291820187905280518a84169386169260008051602061537483398151915292908290030190a4610a69818787878787612431565b611677611eac565b6001600160a01b031661168861115b565b6001600160a01b0316146116d1576040805162461bcd60e51b81526020600482018190526024820152600080516020615548833981519152604482015290519081900360640190fd5b6001600160a01b0381166117165760405162461bcd60e51b81526004018080602001828103825260268152602001806153bf6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60008061177f848461222b565b90925090508115611795576117958585846125a2565b80156117e757846001600160a01b03166117ad611eac565b6001600160a01b03167f5110a21391aa55386de41fe7a3e3dffb40132d38d629a113a7f4afff251b1a018684604051610e8f92919061520a565b5050505050565b60006117fe84866000015161043d565b90508181156118385782808310156118135750815b6118338686896000015184604051806020016040528060008152506114b6565b830390505b8015610a6957610a6986858361055c565b60006001600160e01b03198216636db15a0f60e01b148061187a57506001600160e01b0319821663656cb66560e11b145b8061189557506001600160e01b0319821663152a902d60e11b145b806118b057506001600160e01b031982166301ffc9a760e01b145b806118cb57506001600160e01b03198216636cdb3d1360e11b145b806104ba5750506001600160e01b0319166303a24d0760e21b1490565b600081815261012e6020908152604080832080548251601f600260001961010060018616150201909316929092049182018590048502810185019093528083526060949383018282801561197d5780601f106119525761010080835404028352916020019161197d565b820191906000526020600020905b81548152906001019060200180831161196057829003601f168201915b50505050509050600061198e610e9e565b90508051600014156119a2575090506104bd565b8151156119bc576119b38183612616565b925050506104bd565b806119c6856127fb565b6040516020018083805190602001908083835b602083106119f85780518252601f1990920191602091820191016119d9565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310611a405780518252601f199092019160209182019101611a21565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b825160601c6000611a8d611eac565b9050806001600160a01b0316826001600160a01b03161480611ab45750611ab482826114a3565b611ad05760405162461bcd60e51b81526004016105e790615088565b60008311611af05760405162461bcd60e51b81526004016105e79061505e565b845160009081526101fc6020526040902054611c59578460600151600081518110611b1757fe5b6020026020010151600001516001600160a01b0316826001600160a01b031614611b535760405162461bcd60e51b81526004016105e79061500e565b6000856040015111611b775760405162461bcd60e51b81526004016105e790614faf565b8460a001515185606001515114611b8d57600080fd5b6000611b98866128d5565b905060005b866060015151811015611c0e57600087606001518281518110611bbc57fe5b6020026020010151600001519050836001600160a01b0316816001600160a01b031614611c0557611c0581848a60a001518581518110611bf857fe5b6020026020010151612b28565b50600101611b9d565b50611c2186600001518760400151612b33565b611c3386600001518760800151612b9d565b611c4586600001518760600151612d8c565b611c5786600001518760200151612f3b565b505b611c788486600001518560405180602001604052806000815250612fff565b836001600160a01b0316826001600160a01b031614611d2957816001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611cd392919061520a565b60405180910390a4836001600160a01b0316826001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611d1c92919061520a565b60405180910390a46117e7565b836001600160a01b031660006001600160a01b0316826001600160a01b0316600080516020615374833981519152886000015187604051611d6b92919061520a565b60405180910390a45050505050565b600054610100900460ff1680611d935750611d93613011565b80611da1575060005460ff16155b611ddc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015611e07576000805460ff1961ff0019909116610100171660011790555b611e0f613022565b611e1761311c565b611e1f6131bd565b611e2761311c565b611e2f61325a565b611e476040518060200160405280600081525061332a565b611e50846133f5565b611e5861311c565b611e606134a7565b611e6a8787613544565b611e7261311c565b611e7b85612217565b611e86836001613611565b611e91826001613611565b8015611ea3576000805461ff00191690555b50505050505050565b3390565b60008184841115611f3f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f04578181015183820152602001611eec565b50505050905090810190601f168015611f315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156114af576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611fb3846001600160a01b0316613671565b15610a6957836001600160a01b031663bc197c8187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015612041578181015183820152602001612029565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015612080578181015183820152602001612068565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156120bc5781810151838201526020016120a4565b50505050905090810190601f1680156120e95780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561210e57600080fd5b505af192505050801561213357506040513d602081101561212e57600080fd5b505160015b6121c85761213f61525e565b8061214a5750612191565b60405162461bcd60e51b8152602060048201818152835160248401528351849391928392604401919085019080838360008315611f04578181015183820152602001611eec565b60405162461bcd60e51b81526004018080602001828103825260348152602001806153186034913960400191505060405180910390fd5b6001600160e01b0319811663bc197c8160e01b14611ea35760405162461bcd60e51b815260040180806020018281038252602881526020018061534c6028913960400191505060405180910390fd5b80516110c79061012f9060208401906143e5565b806000606084901c61223b611eac565b6001600160a01b0316816001600160a01b0316141561229857839150600061226286613677565b905080156122875760006122758761368a565b8203905080861115612285578093505b505b612291868461369d565b8285039350505b509250929050565b6122a8611eac565b6001600160a01b0316836001600160a01b031614806122ce57506122ce836103ec611eac565b6123095760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b6105fb8383836136b6565b60008381526101fa6020526040812054905b818110156117e75760008581526101fa6020526040902080546001600160a01b03861691908390811061235557fe5b6000918252602090912001546001600160a01b031614156123b85760008581526101fa6020526040902080548491908390811061238e57fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790555b600101612326565b6001600160a01b038116600090815260c9602052604081205460ff16806114af57506114af8383613924565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061242057fe5b602090810291909101015292915050565b612443846001600160a01b0316613671565b15610a6957836001600160a01b031663f23a6e6187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124d25781810151838201526020016124ba565b50505050905090810190601f1680156124ff5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561252257600080fd5b505af192505050801561254757506040513d602081101561254257600080fd5b505160015b6125535761213f61525e565b6001600160e01b0319811663f23a6e6160e01b14611ea35760405162461bcd60e51b815260040180806020018281038252602881526020018061534c6028913960400191505060405180910390fd5b6125aa611eac565b6001600160a01b0316836001600160a01b031614806125d057506125d0836103ec611eac565b61260b5760405162461bcd60e51b81526004018080602001828103825260298152602001806154096029913960400191505060405180910390fd5b6105fb838383613952565b805182516060918491849110156126e15784846040516020018083805190602001908083835b6020831061265b5780518252601f19909201916020918201910161263c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106126a35780518252601f199092019160209182019101612684565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050506104a9565b60005b82518110156127f1578281815181106126f957fe5b602001015160f81c60f81b6001600160f81b03191682828151811061271a57fe5b01602001516001600160f81b031916146127e95785856040516020018083805190602001908083835b602083106127625780518252601f199092019160209182019101612743565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127aa5780518252601f19909201916020918201910161278b565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405293505050506104a9565b6001016126e4565b5092949350505050565b60608161282057506040805180820190915260018152600360fc1b60208201526104bd565b8160005b811561283857600101600a82049150612824565b6000816001600160401b038111801561285057600080fd5b506040519080825280601f01601f19166020018201604052801561287b576020820181803683370190505b50859350905060001982015b83156128cc57600a840660300160f81b828280600190039350815181106128aa57fe5b60200101906001600160f81b031916908160001a905350600a84049350612887565b50949350505050565b6000808260800151516001600160401b03811180156128f357600080fd5b5060405190808252806020026020018201604052801561291d578160200160208202803683370190505b50905060005b83608001515181101561296f576129508460800151828151811061294357fe5b6020026020010151613a73565b82828151811061295c57fe5b6020908102919091010152600101612923565b5060008360600151516001600160401b038111801561298d57600080fd5b506040519080825280602002602001820160405280156129b7578160200160208202803683370190505b50905060005b8460600151518110156129fc576129dd8560600151828151811061294357fe5b8282815181106129e957fe5b60209081029190910101526001016129bd565b507ffb988707ebb338694f318760b0fd5cfe756d00a2ade251fda110b80c336a3c7f846000015185604001518660200151805190602001208460405160200180828051906020019060200280838360005b83811015612a65578181015183820152602001612a4d565b50505050905001915050604051602081830303815290604052805190602001208660405160200180828051906020019060200280838360005b83811015612ab6578181015183820152602001612a9e565b50505050905001915050604051602081830303815290604052805190602001206040516020018087815260200186815260200185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012092505050919050565b6105fb838383613ae0565b60008281526101fc602052604090205415612b4d57600080fd5b60008281526101fc602052604090819020829055517f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c90612b91908490849061520a565b60405180910390a15050565b6000805b8251811015612d415760006001600160a01b0316838281518110612bc157fe5b6020026020010151600001516001600160a01b03161415612c29576040805162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e740000000000604482015290519081900360640190fd5b828181518110612c3557fe5b6020026020010151602001516001600160601b031660001415612c9f576040805162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f736974697665604482015290519081900360640190fd5b828181518110612cab57fe5b6020026020010151602001516001600160601b0316820191506101fa6000858152602001908152602001600020838281518110612ce457fe5b60209081029190910181015182546001818101855560009485529383902082519101805492909301516001600160601b0316600160a01b026001600160a01b039182166001600160a01b0319909316929092171617905501612ba1565b506127108110612d825760405162461bcd60e51b81526004018080602001828103825260258152602001806155686025913960400191505060405180910390fd5b6105fb8383613d22565b60008281526101fb6020526040812090805b8351811015612eda5760006001600160a01b0316848281518110612dbe57fe5b6020026020010151600001516001600160a01b03161415612df15760405162461bcd60e51b81526004016105e7906150fa565b838181518110612dfd57fe5b6020026020010151602001516001600160601b031660001415612e325760405162461bcd60e51b81526004016105e790614fd9565b82848281518110612e3f57fe5b602090810291909101810151825460018101845560009384529282902081519301805491909201516001600160601b0316600160a01b026001600160a01b039384166001600160a01b0319909216919091179092169190911790558351612ed090859083908110612eac57fe5b6020026020010151602001516001600160601b031683611f4790919063ffffffff16565b9150600101612d9e565b508061271014612efc5760405162461bcd60e51b81526004016105e79061519a565b7f841ffb90d4cabdd1f16034f3fa831d79060febbb8167bdd54a49269365bdf78f8484604051612f2d9291906151f1565b60405180910390a150505050565b600082815261012e602090815260409091208251612f5b928401906143e5565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612f87846118e8565b6040805160208082528351818301528351919283929083019185019080838360005b83811015612fc1578181015183820152602001612fa9565b50505050905090810190601f168015612fee5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b61300b84848484613d53565b50505050565b600061301c30613671565b15905090565b600054610100900460ff168061303b575061303b613011565b80613049575060005460ff16155b6130845760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156130af576000805460ff1961ff0019909116610100171660011790555b60006130b9611eac565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015613119576000805461ff00191690555b50565b600054610100900460ff16806131355750613135613011565b80613143575060005460ff16155b61317e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156131a9576000805460ff1961ff0019909116610100171660011790555b8015613119576000805461ff001916905550565b600054610100900460ff16806131d657506131d6613011565b806131e4575060005460ff16155b61321f5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff1615801561324a576000805460ff1961ff0019909116610100171660011790555b6131a96301ffc9a760e01b613e65565b600054610100900460ff16806132735750613273613011565b80613281575060005460ff16155b6132bc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156132e7576000805460ff1961ff0019909116610100171660011790555b6131a9604051806040016040528060088152602001674d696e743131353560c01b815250604051806040016040528060018152602001603160f81b815250613ee9565b600054610100900460ff16806133435750613343613011565b80613351575060005460ff16155b61338c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156133b7576000805460ff1961ff0019909116610100171660011790555b6133c082613fab565b6133d0636cdb3d1360e11b613e65565b6133e06303a24d0760e21b613e65565b80156110c7576000805461ff00191690555050565b600054610100900460ff168061340e575061340e613011565b8061341c575060005460ff16155b6134575760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613482576000805460ff1961ff0019909116610100171660011790555b8151613496906102309060208501906143e5565b506133e063e8a3d48560e01b613e65565b600054610100900460ff16806134c057506134c0613011565b806134ce575060005460ff16155b6135095760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613534576000805460ff1961ff0019909116610100171660011790555b6131a963656cb66560e11b613e65565b600054610100900460ff168061355d575061355d613011565b8061356b575060005460ff16155b6135a65760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff161580156135d1576000805460ff1961ff0019909116610100171660011790555b82516135e5906102629060208601906143e5565b5081516135fa906102639060208501906143e5565b5080156105fb576000805461ff0019169055505050565b6001600160a01b038216600081815260c96020908152604091829020805460ff1916851515908117909155825190815291517f270dbb8ba4292910ae92862466486be25c355c837270a3d8824b36a8bc7c653b9281900390910190a25050565b3b151590565b60009081526101fc602052604090205490565b60009081526101fd602052604090205490565b60009182526101fd602052604090912080549091019055565b6001600160a01b0383166136fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806154fb6023913960400191505060405180910390fd5b805182511461373b5760405162461bcd60e51b81526004018080602001828103825260288152602001806155df6028913960400191505060405180910390fd5b6000613745611eac565b905061376581856000868660405180602001604052806000815250610a69565b60005b8351811015613843576137fa83828151811061378057fe5b60200260200101516040518060600160405280602481526020016153e560249139609760008886815181106137b157fe5b602002602001015181526020019081526020016000206000896001600160a01b03166001600160a01b0316815260200190815260200160002054611eb09092919063ffffffff16565b6097600086848151811061380a57fe5b602090810291909101810151825281810192909252604090810160009081206001600160a01b038a168252909252902055600101613768565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156138ca5781810151838201526020016138b2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156139095781810151838201526020016138f1565b5050505090500194505050505060405180910390a450505050565b6001600160a01b03918216600090815260986020908152604080832093909416825291909152205460ff1690565b6001600160a01b0383166139975760405162461bcd60e51b81526004018080602001828103825260238152602001806154fb6023913960400191505060405180910390fd5b60006139a1611eac565b90506139d1818560006139b3876123ec565b6139bc876123ec565b60405180602001604052806000815250610a69565b613a18826040518060600160405280602481526020016153e56024913960008681526097602090815260408083206001600160a01b038b1684529091529020549190611eb0565b60008481526097602090815260408083206001600160a01b03808a168086529184528285209590955581518881529283018790528151939490939086169260008051602061537483398151915292908290030190a450505050565b8051602091820151604080517f397e04204c1e1a60ee8724b71f8244e10ab5f2e9009854d80f602bda21b59ebb818601526001600160a01b03909316838201526001600160601b039091166060808401919091528151808403909101815260809092019052805191012090565b6000613aeb83613fbe565b90506000825160411415613b0657613b03828461400a565b90505b846001600160a01b0316816001600160a01b0316146117e757613b31856001600160a01b0316613671565b15613caa5760408051630b135d3f60e11b808252600482018581526024830193845286516044840152865191936001600160a01b038a1693631626ba7e9388938a9390929091606490910190602085019080838360005b83811015613ba0578181015183820152602001613b88565b50505050905090810190601f168015613bcd5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015613beb57600080fd5b505afa158015613bff573d6000803e3d6000fd5b505050506040513d6020811015613c1557600080fd5b505160408051808201909152601c81527f7369676e617475726520766572696669636174696f6e206572726f72000000006020820152916001600160e01b031990911614613ca45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f04578181015183820152602001611eec565b506117e7565b604080518082018252601c81527f7369676e617475726520766572696669636174696f6e206572726f72000000006020808301918252925162461bcd60e51b81526004810193845282516024820152825192939283926044909201919080838360008315611f04578181015183820152602001611eec565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612b919291906151f1565b60008381526101fd6020526040812054613d6e908490611f47565b60008581526101fc6020526040902054909150811115613da05760405162461bcd60e51b81526004016105e7906150d0565b60008481526101fd602052604090208190556001600160a01b038516613dd85760405162461bcd60e51b81526004016105e790615159565b6000613de2611eac565b9050613e0381600088613df4896123ec565b613dfd896123ec565b88610a69565b60008581526097602090815260408083206001600160a01b038a168452909152902054613e309085611f47565b60008681526097602090815260408083206001600160a01b038b168452909152812091909155610a6990829088888888612431565b6001600160e01b03198082161415613ec4576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152606560205260409020805460ff19166001179055565b600054610100900460ff1680613f025750613f02613011565b80613f10575060005460ff16155b613f4b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806154ab602e913960400191505060405180910390fd5b600054610100900460ff16158015613f76576000805460ff1961ff0019909116610100171660011790555b8251602080850191909120835191840191909120610162919091556101635580156105fb576000805461ff0019169055505050565b80516110c79060999060208401906143e5565b6000613fc861408a565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60008151604114614062576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a614080868285856140ca565b9695505050505050565b60006140c57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6140b8614320565b6140c0614327565b61432e565b905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561412b5760405162461bcd60e51b81526004018080602001828103825260228152602001806154326022913960400191505060405180910390fd5b6000601e8560ff161115614205576004850360ff16601b148061415457506004850360ff16601c145b61418f5760405162461bcd60e51b81526004018080602001828103825260228152602001806154d96022913960400191505060405180910390fd5b600161419a87614390565b60048703868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156141f4573d6000803e3d6000fd5b5050506020604051035190506142bc565b8460ff16601b148061421a57508460ff16601c145b6142555760405162461bcd60e51b81526004018080602001828103825260228152602001806154d96022913960400191505060405180910390fd5b60018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156142af573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116614317576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6101625490565b6101635490565b600083838361433b6143e1565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b4690565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261441b5760008555614461565b82601f1061443457805160ff1916838001178555614461565b82800160010185558215614461579182015b82811115614461578251825591602001919060010190614446565b5061446d929150614471565b5090565b5b8082111561446d5760008155600101614472565b80356104bd81615302565b600082601f8301126144a1578081fd5b813560206144b66144b18361523b565b615218565b82815281810190858301838502870184018810156144d2578586fd5b855b858110156144f95781356144e781615302565b845292840192908401906001016144d4565b5090979650505050505050565b600082601f830112614516578081fd5b813560206145266144b18361523b565b82815281810190858301855b858110156144f957614549898684358b0101614670565b84529284019290840190600101614532565b600082601f83011261456b578081fd5b8135602061457b6144b18361523b565b82815281810190858301604080860288018501891015614599578687fd5b865b868110156146085781838b0312156145b1578788fd5b81518281018181106001600160401b03821117156145cb57fe5b835283356145d881615302565b8152838701356001600160601b03811681146145f257898afd5b818801528552938501939181019160010161459b565b509198975050505050505050565b600082601f830112614626578081fd5b813560206146366144b18361523b565b8281528181019085830183850287018401881015614652578586fd5b855b858110156144f957813584529284019290840190600101614654565b600082601f830112614680578081fd5b81356001600160401b0381111561469357fe5b6146a6601f8201601f1916602001615218565b8181528460208386010111156146ba578283fd5b816020850160208301379081016020019190915292915050565b600060c082840312156146e5578081fd5b6146ef60c0615218565b90508135815260208201356001600160401b038082111561470f57600080fd5b61471b85838601614670565b602084015260408401356040840152606084013591508082111561473e57600080fd5b61474a8583860161455b565b6060840152608084013591508082111561476357600080fd5b61476f8583860161455b565b608084015260a084013591508082111561478857600080fd5b5061479584828501614506565b60a08301525092915050565b6000602082840312156147b2578081fd5b81356114af81615302565b600080604083850312156147cf578081fd5b82356147da81615302565b915060208301356147ea81615302565b809150509250929050565b600080600080600060a0868803121561480c578081fd5b853561481781615302565b9450602086013561482781615302565b935060408601356001600160401b0380821115614842578283fd5b61484e89838a01614616565b94506060880135915080821115614863578283fd5b61486f89838a01614616565b93506080880135915080821115614884578283fd5b5061489188828901614670565b9150509295509295909350565b600080600080600060a086880312156148b5578283fd5b85356148c081615302565b945060208601356148d081615302565b9350604086013592506060860135915060808601356001600160401b038111156148f8578182fd5b61489188828901614670565b600080600060608486031215614918578081fd5b833561492381615302565b925060208401356001600160401b038082111561493e578283fd5b61494a87838801614616565b9350604086013591508082111561495f578283fd5b5061496c86828701614616565b9150509250925092565b60008060408385031215614988578182fd5b823561499381615302565b9150602083013580151581146147ea578182fd5b600080604083850312156149b9578182fd5b82356149c481615302565b946020939093013593505050565b6000806000606084860312156149e6578081fd5b83356149f181615302565b95602085013595506040909401359392505050565b600060208284031215614a17578081fd5b81356001600160401b03811115614a2c578182fd5b614a3884828501614491565b949350505050565b60008060408385031215614a52578182fd5b82356001600160401b0380821115614a68578384fd5b614a7486838701614491565b93506020850135915080821115614a89578283fd5b50614a9685828601614616565b9150509250929050565b600060208284031215614ab1578081fd5b81356001600160e01b0319811681146114af578182fd5b600060208284031215614ad9578081fd5b81356001600160401b03811115614aee578182fd5b614a3884828501614670565b60008060008060008060c08789031215614b12578384fd5b86356001600160401b0380821115614b28578586fd5b614b348a838b01614670565b97506020890135915080821115614b49578586fd5b614b558a838b01614670565b96506040890135915080821115614b6a578586fd5b614b768a838b01614670565b95506060890135915080821115614b8b578283fd5b50614b9889828a01614670565b935050614ba760808801614486565b9150614bb560a08801614486565b90509295509295509295565b600080600080600080600060e0888a031215614bdb578485fd5b87356001600160401b0380821115614bf1578687fd5b614bfd8b838c01614670565b985060208a0135915080821115614c12578687fd5b614c1e8b838c01614670565b975060408a0135915080821115614c33578687fd5b614c3f8b838c01614670565b965060608a0135915080821115614c54578283fd5b614c608b838c01614670565b955060808a0135915080821115614c75578283fd5b50614c828a828b01614491565b935050614c9160a08901614486565b9150614c9f60c08901614486565b905092959891949750929550565b60008060008060808587031215614cc2578182fd5b84356001600160401b03811115614cd7578283fd5b614ce3878288016146d4565b9450506020850135614cf481615302565b92506040850135614d0481615302565b9396929550929360600135925050565b600080600060608486031215614d28578081fd5b83356001600160401b03811115614d3d578182fd5b614d49868287016146d4565b9350506020840135614d5a81615302565b929592945050506040919091013590565b600060208284031215614d7c578081fd5b5035919050565b600080600060608486031215614d97578081fd5b833592506020840135614da981615302565b91506040840135614db981615302565b809150509250925092565b60008060408385031215614dd6578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015614e3157815180516001600160a01b031688528301516001600160601b03168388015260409096019590820190600101614df8565b509495945050505050565b6000815180845260208085019450808401835b83811015614e3157815187529582019590820190600101614e4f565b60008151808452815b81811015614e9057602081850181015186830182015201614e74565b81811115614ea15782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0384168152606060208201819052600090614eee90830185614e6b565b82810360408401526140808185614e6b565b6001600160a01b03929092168252602082015260400190565b6000602082526114af6020830184614de5565b6000602082526114af6020830184614e3c565b600060408252614f526040830185614e3c565b82810360208401526143178185614e3c565b901515815260200190565b6000602082526114af6020830184614e6b565b6020808252601390820152723737ba1037bbb732b91037b91036b4b73a32b960691b604082015260600190565b60208082526010908201526f1cdd5c1c1b1e481a5b98dbdc9c9958dd60821b604082015260600190565b6020808252818101527f43726561746f722073686172652073686f756c6420626520706f736974697665604082015260600190565b6020808252601190820152701d1bdad95b9259081a5b98dbdc9c9958dd607a1b604082015260600190565b6020808252600b908201526a1b9bdd08185b1b1bddd95960aa1b604082015260600190565b60208082526010908201526f185b5bdd5b9d081a5b98dbdc9c9958dd60821b604082015260600190565b60208082526028908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f7420604082015267185c1c1c9bdd995960c21b606082015260800190565b60208082526010908201526f6d6f7265207468616e20737570706c7960801b604082015260600190565b60208082526019908201527f4163636f756e742073686f756c642062652070726573656e7400000000000000604082015260600190565b6020808252600e908201526d69647320213d20616d6f756e747360901b604082015260600190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252602e908201527f746f74616c20616d6f756e74206f662063726561746f7273207368617265207360408201526d0686f756c642062652031303030360941b606082015260800190565b90815260200190565b600083825260406020830152614a386040830184614de5565b918252602082015260400190565b6040518181016001600160401b038111828210171561523357fe5b604052919050565b60006001600160401b0382111561524e57fe5b5060209081020190565b60e01c90565b600060443d101561526e57610f33565b600481823e6308c379a06152828251615258565b1461528c57610f33565b6040513d600319016004823e80513d6001600160401b0381602484011181841117156152bb5750505050610f33565b828401925082519150808211156152d55750505050610f33565b503d830160208284010111156152ed57505050610f33565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461311957600080fdfe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62455243313135353a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656445434453413a20696e76616c6964207369676e6174757265202773272076616c7565455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565455243313135353a206275726e2066726f6d20746865207a65726f2061646472657373455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e736665724f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f79616c747920746f74616c2076616c75652073686f756c64206265203c203130303030455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368a2646970667358221220ae797c59fedc2b400b3bf0014d619dcdb93c789ea67bdaaa9bacc1958c1d896e64736f6c63430007060033
Deployed Bytecode Sourcemap
187:2327:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3703:228:10;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;991:183:4;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;435:18::-;;;:::i;:::-;;;;;;;:::i;3343:150::-;;;;;;:::i;:::-;;:::i;2189:323:9:-;;;;;;:::i;:::-;;:::i;:::-;;887:405;;;;;;:::i;:::-;;:::i;835:699:37:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6261:1184:10:-;;;;;;:::i;:::-;;:::i;1220:150:3:-;;;;;;:::i;:::-;;:::i;4088:530:10:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3499:153:4:-;;;;;;:::i;:::-;;:::i;429:448:9:-;;;;;;:::i;:::-;;:::i;1180:590:4:-;;;;;;:::i;:::-;;:::i;649:95:5:-;;;:::i;1967:145:13:-;;;:::i;871:264:3:-;;;;;;:::i;:::-;;:::i;5317:117:8:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1335:85:13:-;;;:::i;:::-;;;;;;;:::i;459:20:4:-;;;:::i;649:142:3:-;;;;;;:::i;:::-;;:::i;4686:306:10:-;;;;;;:::i;:::-;;:::i;1461:103:3:-;;;;;;:::i;:::-;;:::i;286:135:37:-;;;;;;:::i;:::-;;:::i;5129:182:8:-;;;;;;:::i;:::-;;:::i;201:25:0:-;;;:::i;741:244:4:-;;;;;;:::i;:::-;;:::i;5292:897:10:-;;;;;;:::i;:::-;;:::i;2261:240:13:-;;;;;;:::i;:::-;;:::i;1776:421:4:-;;;;;;:::i;:::-;;:::i;1497:605:8:-;;;;;;:::i;:::-;;:::i;3703:228:10:-;3789:7;-1:-1:-1;;;;;3816:21:10;;3808:77;;;;-1:-1:-1;;;3808:77:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3902:13:10;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;3902:22:10;;;;;;;;;;3703:228;;;;;:::o;991:183:4:-;1108:4;1131:36;1155:11;1131:23;:36::i;:::-;1124:43;;991:183;;;;:::o;435:18::-;;;;;;;;;;;;;;;-1:-1:-1;;435:18:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3343:150::-;3441:13;3473;3483:2;3473:9;:13::i;2189:323:9:-;2318:9;;;;2314:142;;;2359:4;:13;;;2373:1;2359:16;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;2348:35:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2348:35:9;;:73;;;;2387:34;2396:4;:13;;;2410:1;2396:16;;;;;;;;;;;;;;:24;;;2387:8;:34::i;:::-;2340:105;;;;-1:-1:-1;;;2340:105:9;;;;;;;:::i;:::-;;;;;;;;;2465:40;2487:4;2493:2;2497:7;2465:21;:40::i;:::-;2189:323;;;:::o;887:405::-;1089:103;1121:5;1128:7;1137;1146:11;1159:13;1174:17;1089:31;:103::i;:::-;1203:9;:17;;-1:-1:-1;;1203:17:9;;;1235:50;1256:12;:10;:12::i;:::-;1270:5;1277:7;1235:50;;;;;;;;:::i;:::-;;;;;;;;887:405;;;;;;:::o;835:699:37:-;920:16;975:13;;;:9;:13;;;;;:20;920:16;;971:153;;-1:-1:-1;1035:1:37;;-1:-1:-1;1035:1:37;1082:31;;971:153;1133:32;1168:13;;;:9;:13;;;;;;;;1133:48;;;;;;;;;;;;;;;;;;;1168:13;;1133:48;:32;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1133:48:37;;;;-1:-1:-1;;;1133:48:37;;-1:-1:-1;;;;;1133:48:37;;;;;;;;;;;;;;;;;;;;;;1202:10;1213:1;1202:13;;;;;;;;;;;;;;;;;;:21;;-1:-1:-1;1202:21:37;;1255:100;1276:10;:17;1272:1;:21;1255:100;;;1325:10;1336:1;1325:13;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;;;1314:30:37;;;;;1295:3;;;;;;;1255:100;;;-1:-1:-1;1522:5:37;1499:20;;;:28;;-1:-1:-1;;835:699:37;;;;;;:::o;6261:1184:10:-;6515:7;:14;6501:3;:10;:28;6493:81;;;;-1:-1:-1;;;6493:81:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6592:16:10;;6584:66;;;;-1:-1:-1;;;6584:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6689:12;:10;:12::i;:::-;-1:-1:-1;;;;;6681:20:10;:4;-1:-1:-1;;;;;6681:20:10;;:60;;;;6705:36;6722:4;6728:12;:10;:12::i;6705:36::-;6660:157;;;;-1:-1:-1;;;6660:157:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6828:16;6847:12;:10;:12::i;:::-;6828:31;;6870:60;6891:8;6901:4;6907:2;6911:3;6916:7;6925:4;6870:20;:60::i;:::-;6946:9;6941:349;6965:3;:10;6961:1;:14;6941:349;;;6996:10;7009:3;7013:1;7009:6;;;;;;;;;;;;;;6996:19;;7029:14;7046:7;7054:1;7046:10;;;;;;;;;;;;;;7029:27;;7093:123;7134:6;7093:123;;;;;;;;;;;;;;;;;:9;:13;7103:2;7093:13;;;;;;;;;;;:19;7107:4;-1:-1:-1;;;;;7093:19:10;-1:-1:-1;;;;;7093:19:10;;;;;;;;;;;;;:23;;:123;;;;;:::i;:::-;7071:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7071:19:10;;;;;;;;;;:145;;;;7250:17;;;;;;:29;;7272:6;7250:21;:29::i;:::-;7230:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7230:17:10;;;;;;;;;;:49;;;;-1:-1:-1;6977:3:10;;6941:349;;;;7335:2;-1:-1:-1;;;;;7305:47:10;7329:4;-1:-1:-1;;;;;7305:47:10;7319:8;-1:-1:-1;;;;;7305:47:10;;7339:3;7344:7;7305:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7363:75;7399:8;7409:4;7415:2;7419:3;7424:7;7433:4;7363:35;:75::i;:::-;6261:1184;;;;;;:::o;1220:150:3:-;1558:12:13;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;1288:17:3;::::1;1308:5;1288:17:::0;;;:8:::1;:17;::::0;;;;;:25;;-1:-1:-1;;1288:25:3::1;::::0;;1328:35;1308:5;;1288:17;1328:35:::1;::::0;1308:5;;1328:35:::1;1220:150:::0;:::o;4088:530:10:-;4261:16;4320:3;:10;4301:8;:15;:29;4293:83;;;;-1:-1:-1;;;4293:83:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4387:30;4434:8;:15;-1:-1:-1;;;;;4420:30:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4420:30:10;;4387:63;;4466:9;4461:120;4485:8;:15;4481:1;:19;4461:120;;;4540:30;4550:8;4559:1;4550:11;;;;;;;;;;;;;;4563:3;4567:1;4563:6;;;;;;;;;;;;;;4540:9;:30::i;:::-;4521:13;4535:1;4521:16;;;;;;;;;;;;;;;;;:49;4502:3;;4461:120;;;-1:-1:-1;4598:13:10;4088:530;-1:-1:-1;;;4088:530:10:o;3499:153:4:-;1558:12:13;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;3574:29:4::1;3592:10;3574:17;:29::i;:::-;3619:26;3634:10;3619:26;;;;;;:::i;:::-;;;;;;;;3499:153:::0;:::o;429:448:9:-;663:103;695:5;702:7;711;720:11;733:13;748:17;663:31;:103::i;:::-;785:9;:16;;-1:-1:-1;;785:16:9;797:4;785:16;;;816:54;841:12;:10;:12::i;:::-;855:5;862:7;816:54;;;;;;;;:::i;:::-;;;;;;;;429:448;;;;;;;:::o;1180:590:4:-;1320:7;:14;1306:3;:10;:28;1298:55;;;;-1:-1:-1;;;1298:55:4;;;;;;;:::i;:::-;1363:28;1408:3;:10;-1:-1:-1;;;;;1394:25:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1394:25:4;;1363:56;;1429:28;1474:3;:10;-1:-1:-1;;;;;1460:25:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1460:25:4;;1429:56;;1500:6;1495:127;1516:3;:10;1512:1;:14;1495:127;;;1582:29;1592:3;1596:1;1592:6;;;;;;;;;;;;;;1600:7;1608:1;1600:10;;;;;;;;;;;;;;1582:9;:29::i;:::-;1548:11;1560:1;1548:14;;;;;;;;;;;;;1564:11;1576:1;1564:14;;;;;;;;;;;;;;;;;1547:64;;;;;1528:3;;1495:127;;;;1631:63;1668:7;1677:3;1682:11;1631:36;:63::i;:::-;1737:7;-1:-1:-1;;;;;1709:54:4;1723:12;:10;:12::i;:::-;-1:-1:-1;;;;;1709:54:4;;1746:3;1751:11;1709:54;;;;;;;:::i;:::-;;;;;;;;1180:590;;;;;:::o;649:95:5:-;729:8;722:15;;;;;;;;-1:-1:-1;;722:15:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;697:13;;722:15;;729:8;;722:15;;729:8;722:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;649:95;;:::o;1967:145:13:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:13::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:13::1;::::0;;1967:145::o;871:264:3:-;1558:12:13;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;951:6:3::1;946:183;967:7;:14;963:1;:18;946:183;;;1002:14;1019:7;1027:1;1019:10;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;1043:16:3;::::1;;::::0;;;:8:::1;:16:::0;;;;;;;:23;;-1:-1:-1;;1043:23:3::1;1062:4;1043:23:::0;;::::1;::::0;;;1085:33;;1019:10;;-1:-1:-1;1062:4:3;1043:16;;1085:33:::1;::::0;1043:16;1085:33:::1;-1:-1:-1::0;983:3:3::1;;946:183;;;;871:264:::0;:::o;5317:117:8:-;5374:21;5414:8;:13;5423:3;5414:13;;;;;;;;;;;5407:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5407:20:8;;;;-1:-1:-1;;;5407:20:8;;-1:-1:-1;;;;;5407:20:8;;;;;;;;;;;;;;;;;;;;;;5317:117;;;:::o;1335:85:13:-;1407:6;;-1:-1:-1;;;;;1407:6:13;1335:85;:::o;459:20:4:-;;;;;;;;;;;;;;;-1:-1:-1;;459:20:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;649:142:3;1558:12:13;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;713:16:3;::::1;;::::0;;;:8:::1;:16;::::0;;;;;:23;;-1:-1:-1;;713:23:3::1;732:4;713:23:::0;;::::1;::::0;;;751:33;;732:4;;713:16;751:33:::1;::::0;::::1;649:142:::0;:::o;4686:306:10:-;4804:8;-1:-1:-1;;;;;4788:24:10;:12;:10;:12::i;:::-;-1:-1:-1;;;;;4788:24:10;;;4780:78;;;;-1:-1:-1;;;4780:78:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4914:8;4869:18;:32;4888:12;:10;:12::i;:::-;-1:-1:-1;;;;;4869:32:10;;;;;;;;;;;;;;;;;-1:-1:-1;4869:32:10;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4869:53:10;;;;;;;;;;;4952:12;:10;:12::i;:::-;-1:-1:-1;;;;;4937:48:10;;4976:8;4937:48;;;;;;;;;;;;;;;;;;;;4686:306;;:::o;1461:103:3:-;-1:-1:-1;;;;;1540:17:3;1517:4;1540:17;;;:8;:17;;;;;;;;;1461:103::o;286:135:37:-;401:13;;;;:9;:13;;;;;;;;394:20;;;;;;;;;;;;;;;;;361:21;;394:20;;401:13;;394:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;394:20:37;;;;-1:-1:-1;;;394:20:37;;-1:-1:-1;;;;;394:20:37;;;;;;;;;;;;;;;5129:182:8;5236:5;-1:-1:-1;;;;;5220:21:8;:12;:10;:12::i;:::-;-1:-1:-1;;;;;5220:21:8;;5212:45;;;;-1:-1:-1;;;5212:45:8;;;;;;;:::i;:::-;5267:37;5288:3;5293:5;5300:3;5267:20;:37::i;201:25:0:-;;;;;;;;;;;;;;;-1:-1:-1;;201:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;741:244:4;897:4;920:58;960:6;968:9;920:39;:58::i;:::-;913:65;741:244;-1:-1:-1;;;741:244:4:o;5292:897:10:-;-1:-1:-1;;;;;5507:16:10;;5499:66;;;;-1:-1:-1;;;5499:66:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5604:12;:10;:12::i;:::-;-1:-1:-1;;;;;5596:20:10;:4;-1:-1:-1;;;;;5596:20:10;;:60;;;;5620:36;5637:4;5643:12;:10;:12::i;5620:36::-;5575:148;;;;-1:-1:-1;;;5575:148:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5734:16;5753:12;:10;:12::i;:::-;5734:31;;5776:96;5797:8;5807:4;5813:2;5817:21;5835:2;5817:17;:21::i;:::-;5840:25;5858:6;5840:17;:25::i;:::-;5867:4;5776:20;:96::i;:::-;5905:77;5929:6;5905:77;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5905:19:10;;;;;;;;;;;:77;:23;:77::i;:::-;5883:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5883:19:10;;;;;;;;;;:99;;;;6012:17;;;;;;:29;;6034:6;6012:21;:29::i;:::-;5992:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5992:17:10;;;;;;;;;;;;;:49;;;;6057:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6057:46:10;;;;;;;;6114:68;6145:8;6155:4;6161:2;6165;6169:6;6177:4;6114:30;:68::i;2261:240:13:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:13;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:13;;1539:68;;;;;-1:-1:-1;;;1539:68:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:13;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:13::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:13;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:13::1;-1:-1:-1::0;;;;;2477:17:13;;;::::1;::::0;;;::::1;::::0;;2261:240::o;1776:421:4:-;1870:18;1890;1912:21;1922:2;1926:6;1912:9;:21::i;:::-;1869:64;;-1:-1:-1;1869:64:4;-1:-1:-1;1947:14:4;;1943:141;;2017:56;2049:7;2058:2;2062:10;2017:31;:56::i;:::-;2097:14;;2093:97;;2155:7;-1:-1:-1;;;;;2132:47:4;2141:12;:10;:12::i;:::-;-1:-1:-1;;;;;2132:47:4;;2164:2;2168:10;2132:47;;;;;;;:::i;2093:97::-;1776:421;;;;;:::o;1497:605:8:-;1678:12;1693:29;1703:4;1709;:12;;;1693:9;:29::i;:::-;1678:44;-1:-1:-1;1744:6:8;1764:12;;1760:257;;1808:6;1832:16;;;1828:73;;;-1:-1:-1;1879:7:8;1828:73;1914:54;1931:4;1937:2;1941:4;:12;;;1955:8;1914:54;;;;;;;;;;;;:16;:54::i;:::-;1989:17;;;-1:-1:-1;1760:257:8;2030:8;;2026:70;;2054:31;2070:4;2076:2;2080:4;2054:15;:31::i;984:507::-;1108:4;-1:-1:-1;;;;;;1131:65:8;;-1:-1:-1;;;1131:65:8;;:130;;-1:-1:-1;;;;;;;1208:53:8;;-1:-1:-1;;;1208:53:8;1131:130;:197;;;-1:-1:-1;;;;;;;1273:55:8;;-1:-1:-1;;;1273:55:8;1131:197;:244;;;-1:-1:-1;;;;;;;1340:35:8;;-1:-1:-1;;;1340:35:8;1131:244;:292;;;-1:-1:-1;;;;;;;1387:36:8;;-1:-1:-1;;;1387:36:8;1131:292;:353;;;-1:-1:-1;;;;;;;;1435:49:8;-1:-1:-1;;;1435:49:8;;984:507::o;870:681:5:-;962:24;989:19;;;:10;:19;;;;;;;;962:46;;;;;;-1:-1:-1;;962:46:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:13;;962:24;:46;;989:19;962:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:18;1039:9;:7;:9::i;:::-;1018:30;;1127:4;1121:18;1143:1;1121:23;1117:71;;;-1:-1:-1;1167:10:5;-1:-1:-1;1160:17:5;;1117:71;1290:24;;:28;1286:102;;1341:36;1360:4;1366:10;1341:18;:36::i;:::-;1334:43;;;;;;1286:102;1518:4;1524:18;:7;:16;:18::i;:::-;1501:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1501:42:5;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1501:42:5;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1501:42:5;;;;;;;;;;;;;-1:-1:-1;;1501:42:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1487:57;;;;870:681;;;:::o;2108:1529:8:-;2266:12;;2282:2;2266:18;2241:14;2312:12;:10;:12::i;:::-;2295:29;;2353:6;-1:-1:-1;;;;;2343:16:8;:6;-1:-1:-1;;;;;2343:16:8;;:52;;;;2363:32;2380:6;2388;2363:16;:32::i;:::-;2335:105;;;;-1:-1:-1;;;2335:105:8;;;;;;;:::i;:::-;2468:1;2458:7;:11;2450:40;;;;-1:-1:-1;;;2450:40:8;;;;;;;:::i;:::-;2512:12;;2505:20;;;;:6;:20;;;;;;2501:788;;2564:4;:13;;;2578:1;2564:16;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;2554:34:8;:6;-1:-1:-1;;;;;2554:34:8;;2546:64;;;;-1:-1:-1;;;2546:64:8;;;;;;;:::i;:::-;2646:1;2632:4;:11;;;:15;2624:44;;;;-1:-1:-1;;;2624:44:8;;;;;;;:::i;:::-;2714:4;:15;;;:22;2690:4;:13;;;:20;:46;2682:55;;;;;;2752:12;2767:29;2791:4;2767:23;:29::i;:::-;2752:44;;2815:6;2810:247;2831:4;:13;;;:20;2827:1;:24;2810:247;;;2876:15;2894:4;:13;;;2908:1;2894:16;;;;;;;;;;;;;;:24;;;2876:42;;2951:6;-1:-1:-1;;;;;2940:17:8;:7;-1:-1:-1;;;;;2940:17:8;;2936:107;;2981:43;2990:7;2999:4;3005;:15;;;3021:1;3005:18;;;;;;;;;;;;;;2981:8;:43::i;:::-;-1:-1:-1;2853:3:8;;2810:247;;;;3071:38;3083:4;:12;;;3097:4;:11;;;3071;:38::i;:::-;3123:44;3138:4;:12;;;3152:4;:14;;;3123;:44::i;:::-;3181:42;3195:4;:12;;;3209:4;:13;;;3181;:42::i;:::-;3237:41;3250:4;:12;;;3264:4;:13;;;3237:12;:41::i;:::-;2501:788;;3299:36;3305:2;3309:4;:12;;;3323:7;3299:36;;;;;;;;;;;;:5;:36::i;:::-;3359:2;-1:-1:-1;;;;;3349:12:8;:6;-1:-1:-1;;;;;3349:12:8;;3345:286;;3417:6;-1:-1:-1;;;;;3382:65:8;3413:1;-1:-1:-1;;;;;3382:65:8;3397:6;-1:-1:-1;;;;;3382:65:8;-1:-1:-1;;;;;;;;;;;3425:4:8;:12;;;3439:7;3382:65;;;;;;;:::i;:::-;;;;;;;;3497:2;-1:-1:-1;;;;;3466:57:8;3489:6;-1:-1:-1;;;;;3466:57:8;3481:6;-1:-1:-1;;;;;3466:57:8;-1:-1:-1;;;;;;;;;;;3501:4:8;:12;;;3515:7;3466:57;;;;;;;:::i;:::-;;;;;;;;3345:286;;;3594:2;-1:-1:-1;;;;;3559:61:8;3590:1;-1:-1:-1;;;;;3559:61:8;3574:6;-1:-1:-1;;;;;3559:61:8;-1:-1:-1;;;;;;;;;;;3598:4:8;:12;;;3612:7;3559:61;;;;;;;:::i;:::-;;;;;;;;2108:1529;;;;;:::o;1298:885:9:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;1514:26:9::1;:24;:26::i;:::-;1550:30;:28;:30::i;:::-;1590:25;:23;:25::i;:::-;1625:26;:24;:26::i;:::-;1661:36;:34;:36::i;:::-;1707:28;;;;;;;;;;;;::::0;:24:::1;:28::i;:::-;1745:44;1777:11;1745:31;:44::i;:::-;1799:34;:32;:34::i;:::-;1843:41;:39;:41::i;:::-;1894:44;1923:5;1930:7;1894:28;:44::i;:::-;1948:38;:36;:38::i;:::-;1996:20;2008:7;1996:11;:20::i;:::-;2082:40;2102:13;2117:4;2082:19;:40::i;:::-;2132:44;2152:17;2171:4;2132:19;:44::i;:::-;1794:14:18::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;1790:66;1298:885:9;;;;;;;:::o;828:104:24:-;915:10;828:104;:::o;5443:163:17:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:17;;;5443:163::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:17;;;;;;;;;;;;;;;;;;;;;;;;;;;13990:800:10;14234:15;:2;-1:-1:-1;;;;;14234:13:10;;:15::i;:::-;14230:554;;;14297:2;-1:-1:-1;;;;;14269:54:10;;14324:8;14334:4;14340:3;14345:7;14354:4;14269:90;;;;;;;;;;;;;-1:-1:-1;;;;;14269:90:10;;;;;;-1:-1:-1;;;;;14269:90:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14269:90:10;;;14265:509;;;;:::i;:::-;;;;;;;;14643:14;;-1:-1:-1;;;14643:14:10;;;;;;;;;;;;;;;;;14650:6;;14643:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14265:509;14697:62;;-1:-1:-1;;;14697:62:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14265:509;-1:-1:-1;;;;;;14408:75:10;;-1:-1:-1;;;14408:75:10;14404:172;;14507:50;;-1:-1:-1;;;14507:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2087:98:5;2159:19;;;;:8;;:19;;;;;:::i;2203:765:4:-;2331:6;2268:18;2403:2;2397:8;;;2431:12;:10;:12::i;:::-;-1:-1:-1;;;;;2420:23:4;:7;-1:-1:-1;;;;;2420:23:4;;2416:546;;;2472:6;2459:19;;2492:11;2506:26;2529:2;2506:22;:26::i;:::-;2492:40;-1:-1:-1;2550:11:4;;2546:308;;2640:19;2671:26;2694:2;2671:22;:26::i;:::-;2662:6;:35;2640:57;;2728:11;2719:6;:20;2715:125;;;2810:11;2797:24;;2715:125;2546:308;;2867:38;2890:2;2894:10;2867:22;:38::i;:::-;2941:10;2932:6;:19;2919:32;;2416:546;;2203:765;;;;;;:::o;984:312:6:-;1124:12;:10;:12::i;:::-;-1:-1:-1;;;;;1113:23:6;:7;-1:-1:-1;;;;;1113:23:6;;:66;;;;1140:39;1157:7;1166:12;:10;:12::i;1140:39::-;1092:154;;;;-1:-1:-1;;;1092:154:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1257:32;1268:7;1277:3;1282:6;1257:10;:32::i;792:323:36:-;876:11;890:14;;;:9;:14;;;;;:21;;921:188;941:6;937:1;:10;921:188;;;972:14;;;;:9;:14;;;;;:17;;-1:-1:-1;;;;;972:34:36;;;:14;987:1;;972:17;;;;;;;;;;;;;;;:25;-1:-1:-1;;;;;972:25:36;:34;968:131;;;1026:14;;;;:9;:14;;;;;:17;;1078:3;;1026:14;1041:1;;1026:17;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;1026:58:36;-1:-1:-1;;;;;1026:58:36;;;;;;;;;;968:131;949:3;;921:188;;480:201:7;-1:-1:-1;;;;;602:27:7;;579:4;602:27;;;:16;:27;;;;;;;;;:72;;;633:41;656:6;664:9;633:22;:41::i;14796:194:10:-;14916:16;;;14930:1;14916:16;;;;;;;;;14863;;14891:22;;14916:16;;;;;;;;;;;;-1:-1:-1;14916:16:10;14891:41;;14953:7;14942:5;14948:1;14942:8;;;;;;;;;;;;;;;;;:18;14978:5;14796:194;-1:-1:-1;;14796:194:10:o;13220:764::-;13440:15;:2;-1:-1:-1;;;;;13440:13:10;;:15::i;:::-;13436:542;;;13503:2;-1:-1:-1;;;;;13475:49:10;;13525:8;13535:4;13541:2;13545:6;13553:4;13475:83;;;;;;;;;;;;;-1:-1:-1;;;;;13475:83:10;;;;;;-1:-1:-1;;;;;13475:83:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13475:83:10;;;13471:497;;;;:::i;:::-;-1:-1:-1;;;;;;13607:70:10;;-1:-1:-1;;;13607:70:10;13603:167;;13701:50;;-1:-1:-1;;;13701:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;698:280:6;813:12;:10;:12::i;:::-;-1:-1:-1;;;;;802:23:6;:7;-1:-1:-1;;;;;802:23:6;;:66;;;;829:39;846:7;855:12;:10;:12::i;829:39::-;781:154;;;;-1:-1:-1;;;781:154:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:25;952:7;961:2;965:5;946;:25::i;178:586:2:-;442:17;;423:16;;291:13;;351:4;;398:9;;-1:-1:-1;419:115:2;;;506:4;512:9;489:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;489:33:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;489:33:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;489:33:2;;;;;;;;;;;;;-1:-1:-1;;489:33:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;475:48;;;;;;419:115;549:9;544:187;568:9;:16;564:1;:20;544:187;;;626:9;636:1;626:12;;;;;;;;;;;;;;;;-1:-1:-1;;;;;609:29:2;;:10;620:1;609:13;;;;;;;;;;;;-1:-1:-1;;;;;;609:13:2;:29;605:116;;689:4;695:9;672:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;672:33:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;672:33:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;672:33:2;;;;;;;;;;;;;-1:-1:-1;;672:33:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;658:48;;;;;;;605:116;586:3;;544:187;;;-1:-1:-1;748:9:2;;178:586;-1:-1:-1;;;;178:586:2:o;221:725:25:-;277:13;494:10;490:51;;-1:-1:-1;520:10:25;;;;;;;;;;;;-1:-1:-1;;;520:10:25;;;;;;490:51;565:5;550:12;604:75;611:9;;604:75;;636:8;;666:2;658:10;;;;604:75;;;688:19;720:6;-1:-1:-1;;;;;710:17:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;710:17:25;-1:-1:-1;780:5:25;;-1:-1:-1;688:39:25;-1:-1:-1;;;753:10:25;;795:114;802:9;;795:114;;870:2;863:4;:9;858:2;:14;845:29;;827:6;834:7;;;;;;;827:15;;;;;;;;;;;:47;-1:-1:-1;;;;;827:47:25;;;;;;;;-1:-1:-1;896:2:25;888:10;;;;795:114;;;-1:-1:-1;932:6:25;221:725;-1:-1:-1;;;;221:725:25:o;698:827:27:-;761:7;780:31;828:4;:14;;;:21;-1:-1:-1;;;;;814:36:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;814:36:27;;780:70;;865:6;860:125;881:4;:14;;;:21;877:1;:25;860:125;;;943:31;956:4;:14;;;971:1;956:17;;;;;;;;;;;;;;943:12;:31::i;:::-;923:14;938:1;923:17;;;;;;;;;;;;;;;;;:51;904:3;;860:125;;;;994:30;1041:4;:13;;;:20;-1:-1:-1;;;;;1027:35:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1027:35:27;;994:68;;1077:6;1072:122;1093:4;:13;;;:20;1089:1;:24;1072:122;;;1153:30;1166:4;:13;;;1180:1;1166:16;;;;;;;1153:30;1134:13;1148:1;1134:16;;;;;;;;;;;;;;;;;:49;1115:3;;1072:122;;;;555:136;1292:4;:12;;;1322:4;:11;;;1367:4;:13;;;1351:31;;;;;;1427:13;1410:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1400:42;;;;;;1487:14;1470:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1460:43;;;;;;1220:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1210:308;;;;;;1203:315;;;;698:827;;;:::o;355:142:11:-;452:38;465:7;474:4;480:9;452:12;:38::i;4302:178:8:-;4378:15;;;;:6;:15;;;;;;:20;4370:29;;;;;;4409:15;;;;:6;:15;;;;;;;:25;;;4449:24;;;;;4416:7;;4427;;4449:24;:::i;:::-;;;;;;;;4302:178;;:::o;220:566:36:-;309:18;;337:324;358:10;:17;354:1;:21;337:324;;;437:3;-1:-1:-1;;;;;404:37:36;:10;415:1;404:13;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;404:37:36;;;396:77;;;;;-1:-1:-1;;;396:77:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;495:10;506:1;495:13;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;;;495:24:36;518:1;495:24;;487:69;;;;;-1:-1:-1;;;487:69:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;584:10;595:1;584:13;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;;;570:33:36;;;;;617:9;:13;627:2;617:13;;;;;;;;;;;636:10;647:1;636:13;;;;;;;;;;;;;;;;;;;617:33;;;;;;;;-1:-1:-1;617:33:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;617:33:36;-1:-1:-1;;;617:33:36;-1:-1:-1;;;;;617:33:36;;;-1:-1:-1;;;;;;617:33:36;;;;;;;;;;;377:3;337:324;;;;691:5;678:10;:18;670:68;;;;-1:-1:-1;;;670:68:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;748:31;764:2;768:10;748:15;:31::i;4486:637:8:-;4575:38;4616:17;;;:8;:17;;;;;;4575:38;4667:324;4688:9;:16;4684:1;:20;4667:324;;;4765:3;-1:-1:-1;;;;;4733:36:8;:9;4743:1;4733:12;;;;;;;;;;;;;;:20;;;-1:-1:-1;;;;;4733:36:8;;;4725:74;;;;-1:-1:-1;;;4725:74:8;;;;;;;:::i;:::-;4821:9;4831:1;4821:12;;;;;;;;;;;;;;:18;;;-1:-1:-1;;;;;4821:23:8;4843:1;4821:23;;4813:68;;;;-1:-1:-1;;;4813:68:8;;;;;;;:::i;:::-;4895:15;4916:9;4926:1;4916:12;;;;;;;;;;;;;;;;;;;4895:34;;;;;;;-1:-1:-1;4895:34:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4895:34:8;-1:-1:-1;;;4895:34:8;-1:-1:-1;;;;;4895:34:8;;;-1:-1:-1;;;;;;4895:34:8;;;;;;;;;;;;;;;;4961:12;;4951:29;;4961:9;;4971:1;;4961:12;;;;;;;;;;;;:18;;;-1:-1:-1;;;;;4951:29:8;:5;:9;;:29;;;;:::i;:::-;4943:37;-1:-1:-1;4706:3:8;;4667:324;;;;5008:5;5017;5008:14;5000:73;;;;-1:-1:-1;;;5000:73:8;;;;;;;:::i;:::-;5088:28;5097:7;5106:9;5088:28;;;;;;;:::i;:::-;;;;;;;;4486:637;;;;:::o;1698:166:5:-;1784:19;;;;:10;:19;;;;;;;;:26;;;;;;;;:::i;:::-;;1849:7;1825:32;1829:18;1839:7;1829:9;:18::i;:::-;1825:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1698:166;;:::o;2974:199:4:-;3122:44;3140:7;3149:2;3153:6;3161:4;3122:17;:44::i;:::-;2974:199;;;;:::o;1952:123:18:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;1067:192:13:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:13::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:13::1;-1:-1:-1::0;;;;;1176:18:13;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:13;-1:-1:-1;;1209:43:13::1;::::0;-1:-1:-1;;1209:43:13::1;1778:1:18;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;1790:66;1067:192:13;:::o;909:69:8:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;909:69:8;:::o;777:249:15:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;979:40:15::1;-1:-1:-1::0;;;979:18:15::1;:40::i;225:124:11:-:0;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;302:40:11::1;;;;;;;;;;;;;;-1:-1:-1::0;;;302:40:11::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;302:40:11::1;;::::0;:23:::1;:40::i;2668:389:10:-:0;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;2753:13:10::1;2761:4;2753:7;:13::i;:::-;2855:41;-1:-1:-1::0;;;2855:18:10::1;:41::i;:::-;2996:54;-1:-1:-1::0;;;2996:18:10::1;:54::i;:::-;1794:14:18::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;2668:389:10;;:::o;374:189:0:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;474:26:0;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;510:46:0::1;-1:-1:-1::0;;;510:18:0::1;:46::i;363:147:31:-:0;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;445:58:31::1;-1:-1:-1::0;;;445:18:31::1;:58::i;3179:158:4:-:0;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;3292:12:4;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3314:16:4;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1794:14:18::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;3179:158:4;;;:::o;290:184:7:-;-1:-1:-1;;;;;374:26:7;;;;;;:16;:26;;;;;;;;;:40;;-1:-1:-1;;374:40:7;;;;;;;;;;429:38;;;;;;;;;;;;;;;;;290:184;;:::o;737:413:23:-;1097:20;1135:8;;;737:413::o;5658:105:8:-;5718:4;5741:15;;;:6;:15;;;;;;;5658:105::o;5547:::-;5607:4;5630:15;;;:6;:15;;;;;;;5547:105::o;5440:101::-;5509:15;;;;:6;:15;;;;;;:25;;;;;;;5440:101::o;11340:705:10:-;-1:-1:-1;;;;;11460:21:10;;11452:69;;;;-1:-1:-1;;;11452:69:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11553:7;:14;11539:3;:10;:28;11531:81;;;;-1:-1:-1;;;11531:81:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11623:16;11642:12;:10;:12::i;:::-;11623:31;;11665:69;11686:8;11696:7;11713:1;11717:3;11722:7;11665:69;;;;;;;;;;;;:20;:69::i;:::-;11750:6;11745:220;11766:3;:10;11762:1;:14;11745:220;;;11826:128;11874:7;11882:1;11874:10;;;;;;;;;;;;;;11826:128;;;;;;;;;;;;;;;;;:9;:17;11836:3;11840:1;11836:6;;;;;;;;;;;;;;11826:17;;;;;;;;;;;:26;11844:7;-1:-1:-1;;;;;11826:26:10;-1:-1:-1;;;;;11826:26:10;;;;;;;;;;;;;:30;;:128;;;;;:::i;:::-;11797:9;:17;11807:3;11811:1;11807:6;;;;;;;;;;;;;;;;;;;11797:17;;;;;;;;;;;;;-1:-1:-1;11797:17:10;;;-1:-1:-1;;;;;11797:26:10;;;;;;;;;:157;11778:3;;11745:220;;;;12021:1;-1:-1:-1;;;;;11980:58:10;12004:7;-1:-1:-1;;;;;11980:58:10;11994:8;-1:-1:-1;;;;;11980:58:10;;12025:3;12030:7;11980:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11340:705;;;;:::o;5059:166::-;-1:-1:-1;;;;;5181:27:10;;;5158:4;5181:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;5059:166::o;10608:538::-;-1:-1:-1;;;;;10703:21:10;;10695:69;;;;-1:-1:-1;;;10695:69:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10775:16;10794:12;:10;:12::i;:::-;10775:31;;10817:105;10838:8;10848:7;10865:1;10869:21;10887:2;10869:17;:21::i;:::-;10892:25;10910:6;10892:17;:25::i;:::-;10817:105;;;;;;;;;;;;:20;:105::i;:::-;10958:108;10998:6;10958:108;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;10958:22:10;;;;;;;;;;;:108;:26;:108::i;:::-;10933:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;10933:22:10;;;;;;;;;;;;:133;;;;11082:57;;;;;;;;;;;;;10933:13;;:22;;11082:57;;;;-1:-1:-1;;;;;;;;;;;11082:57:10;;;;;;;;10608:538;;;;:::o;258:146:28:-;371:12;;385:10;;;;;349:47;;;124;349;;;;-1:-1:-1;;;;;349:47:28;;;;;;;-1:-1:-1;;;;;349:47:28;;;;;;;;;;;;;;;;;;;;;;;;;;;339:58;;;;;;258:146::o;514:619:12:-;620:12;635:28;652:10;635:16;:28::i;:::-;620:43;;674:21;709:9;:16;729:2;709:22;705:92;;;763:23;:4;776:9;763:12;:23::i;:::-;747:39;;705:92;828:6;-1:-1:-1;;;;;811:23:12;:13;-1:-1:-1;;;;;811:23:12;;806:321;;854:19;:6;-1:-1:-1;;;;;854:17:12;;:19::i;:::-;850:267;;;922:49;;;-1:-1:-1;;;922:49:12;;;;;;;;;;;;;;;;;;;;;;;975:10;;-1:-1:-1;;;;;922:32:12;;;497:10;;955:4;;961:9;;922:49;;;;;;;;;;;;;;;;-1:-1:-1;922:49:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;922:49:12;1007:15;;;;;;;;;;;;;922:49;1007:15;;;;-1:-1:-1;;;;;;922:63:12;;;;893:147;;;;-1:-1:-1;;;893:147:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:267;;;1086:15;;;;;;;;;;;;;;;;;;;1079:23;;-1:-1:-1;;;1079:23:12;;;;;;;;;;;;;;;;1086:15;;1079:23;;;;;;;;1086:15;1079:23;;1086:15;-1:-1:-1;1079:23:12;;;;;;;;;;;;;;;;427:139:37;531:28;544:2;548:10;531:28;;;;;;;:::i;3643:653:8:-;3758:14;3786:10;;;:6;:10;;;;;;3775:22;;:6;;:10;:22::i;:::-;3828:10;;;;:6;:10;;;;;;3758:39;;-1:-1:-1;3815:23:8;;;3807:52;;;;-1:-1:-1;;;3807:52:8;;;;;;;:::i;:::-;3869:10;;;;:6;:10;;;;;:22;;;-1:-1:-1;;;;;3910:21:8;;3902:67;;;;-1:-1:-1;;;3902:67:8;;;;;;;:::i;:::-;3980:16;3999:12;:10;:12::i;:::-;3980:31;;4022:107;4043:8;4061:1;4065:7;4074:21;4092:2;4074:17;:21::i;:::-;4097:25;4115:6;4097:17;:25::i;:::-;4124:4;4022:20;:107::i;:::-;4165:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;4165:22:8;;;;;;;;;;:34;;4192:6;4165:26;:34::i;:::-;4140:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;4140:22:8;;;;;;;;;:59;;;;4210:79;;4241:8;;4154:7;4150:2;4276:6;4284:4;4210:30;:79::i;1718:198:15:-;-1:-1:-1;;;;;;1801:25:15;;;;;1793:66;;;;;-1:-1:-1;;;1793:66:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1869:33:15;;;;;:20;:33;;;;;:40;;-1:-1:-1;;1869:40:15;1905:4;1869:40;;;1718:198::o;2317:292:14:-;1512:13:18;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:18;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:18;;;;;1738:19;1720:4;1738:19;;;1670:98;2445:22:14;;::::1;::::0;;::::1;::::0;;;;2501:25;;;;::::1;::::0;;;;2536:12:::1;:25:::0;;;;2571:15:::1;:31:::0;1790:66:18;;;;1840:5;1824:21;;-1:-1:-1;;1824:21:18;;;2317:292:14;;;:::o;8268:86:10:-;8334:13;;;;:4;;:13;;;;;:::i;3813:183:14:-;3890:7;3955:20;:18;:20::i;:::-;3977:10;3926:62;;;;;;-1:-1:-1;;;3926:62:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3916:73;;;;;;3909:80;;3813:183;;;:::o;865:768:30:-;967:7;1032:9;:16;1052:2;1032:22;1028:94;;1070:41;;;-1:-1:-1;;;1070:41:30;;;;;;;;;;;;;;;;;;;;;;;;;;;1028:94;1472:4;1457:20;;1451:27;1517:4;1502:20;;1496:27;1570:4;1555:20;;1549:27;1188:9;1541:36;1604:22;1612:4;1541:36;1451:27;1496;1604:7;:22::i;:::-;1597:29;865:768;-1:-1:-1;;;;;;865:768:30:o;2695:160:14:-;2748:7;2774:74;1459:95;2808:17;:15;:17::i;:::-;2827:20;:18;:20::i;:::-;2774:21;:74::i;:::-;2767:81;;2695:160;:::o;1781:1909:30:-;1904:7;2848:66;2818:96;;;2797:177;;;;-1:-1:-1;;;2797:177:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3194:14;3226:2;3222:1;:6;;;3218:374;;;3273:1;3269;:5;:11;;3278:2;3269:11;:26;;;;3288:1;3284;:5;:11;;3293:2;3284:11;3269:26;3244:119;;;;-1:-1:-1;;;3244:119:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3386:52;3396:28;3419:4;3396:22;:28::i;:::-;3430:1;3426;:5;3433:1;3436;3386:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3377:61;;3218:374;;;3477:1;:7;;3482:2;3477:7;:18;;;;3488:1;:7;;3493:2;3488:7;3477:18;3469:65;;;;-1:-1:-1;;;3469:65:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3557:24;3567:4;3573:1;3576;3579;3557:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3548:33;;3218:374;-1:-1:-1;;;;;3610:20:30;;3602:57;;;;;-1:-1:-1;;;3602:57:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;3677:6;1781:1909;-1:-1:-1;;;;;1781:1909:30:o;4558:103:14:-;4642:12;;4558:103;:::o;4900:109::-;4987:15;;4900:109;:::o;2861:327::-;2963:7;3040:8;3066:4;3088:7;3113:13;:11;:13::i;:::-;3152:4;3012:159;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3012:159:14;;;;;;;;;;;;;;;;;;;;;;;;2989:192;;;;;;2982:199;;2861:327;;;;;:::o;3954:335:30:-;4210:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4183:99;;;;;;3954:335::o;4002:320:14:-;4297:9;;4272:44::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:138:38;84:20;;113:33;84:20;113:33;:::i;157:782::-;;270:3;263:4;255:6;251:17;247:27;237:2;;292:5;285;278:20;237:2;332:6;319:20;358:4;382:65;397:49;443:2;397:49;:::i;:::-;382:65;:::i;:::-;481:15;;;512:12;;;;544:15;;;590:11;;;578:24;;574:33;;571:42;-1:-1:-1;568:2:38;;;630:5;623;616:20;568:2;656:5;670:240;684:2;681:1;678:9;670:240;;;755:3;742:17;772:33;799:5;772:33;:::i;:::-;818:18;;856:12;;;;888;;;;702:1;695:9;670:240;;;-1:-1:-1;928:5:38;;227:712;-1:-1:-1;;;;;;;227:712:38:o;944:671::-;;1055:3;1048:4;1040:6;1036:17;1032:27;1022:2;;1077:5;1070;1063:20;1022:2;1117:6;1104:20;1143:4;1167:65;1182:49;1228:2;1182:49;:::i;1167:65::-;1266:15;;;1297:12;;;;1329:15;;;1362:5;1376:210;1390:2;1387:1;1384:9;1376:210;;;1447:64;1507:3;1502:2;1495:3;1482:17;1474:6;1470:30;1466:39;1447:64;:::i;:::-;1435:77;;1532:12;;;;1564;;;;1408:1;1401:9;1376:210;;1620:1318;;1738:3;1731:4;1723:6;1719:17;1715:27;1705:2;;1760:5;1753;1746:20;1705:2;1800:6;1787:20;1826:4;1850:65;1865:49;1911:2;1865:49;:::i;1850:65::-;1949:15;;;1980:12;;;;2012:15;;;2046:4;2081:11;;;2069:24;;2065:33;;2062:42;-1:-1:-1;2059:2:38;;;2121:5;2114;2107:20;2059:2;2147:5;2161:748;2175:2;2172:1;2169:9;2161:748;;;2242:2;2236:3;2231;2227:13;2223:22;2220:2;;;2262:5;2255;2248:20;2220:2;2303;2297:9;2349:2;2341:6;2337:15;2422:6;2410:10;2407:22;-1:-1:-1;;;;;2374:10:38;2371:34;2368:62;2365:2;;;2433:9;2365:2;2457:22;;2505:17;;2535:33;2505:17;2535:33;:::i;:::-;2581:21;;2643:12;;;2630:26;-1:-1:-1;;;;;2691:40:38;;2679:53;;2669:2;;2750:5;2743;2736:20;2669:2;2778:15;;;2771:32;2816:19;;2855:12;;;;2887;;;;2193:1;2186:9;2161:748;;;-1:-1:-1;2927:5:38;;1695:1243;-1:-1:-1;;;;;;;;1695:1243:38:o;2943:705::-;;3056:3;3049:4;3041:6;3037:17;3033:27;3023:2;;3078:5;3071;3064:20;3023:2;3118:6;3105:20;3144:4;3168:65;3183:49;3229:2;3183:49;:::i;3168:65::-;3267:15;;;3298:12;;;;3330:15;;;3376:11;;;3364:24;;3360:33;;3357:42;-1:-1:-1;3354:2:38;;;3416:5;3409;3402:20;3354:2;3442:5;3456:163;3470:2;3467:1;3464:9;3456:163;;;3527:17;;3515:30;;3565:12;;;;3597;;;;3488:1;3481:9;3456:163;;3653:542;;3750:3;3743:4;3735:6;3731:17;3727:27;3717:2;;3772:5;3765;3758:20;3717:2;3812:6;3799:20;-1:-1:-1;;;;;3834:2:38;3831:26;3828:2;;;3860:9;3828:2;3895:54;3937:2;3918:13;;-1:-1:-1;;3914:27:38;3943:4;3910:38;3895:54;:::i;:::-;3974:2;3965:7;3958:19;4020:3;4013:4;4008:2;4000:6;3996:15;3992:26;3989:35;3986:2;;;4041:5;4034;4027:20;3986:2;4110;4103:4;4095:6;4091:17;4084:4;4075:7;4071:18;4058:55;4133:16;;;4151:4;4129:27;4122:42;;;;4137:7;3707:488;-1:-1:-1;;3707:488:38:o;4200:1123::-;;4310:4;4298:9;4293:3;4289:19;4285:30;4282:2;;;4332:5;4325;4318:20;4282:2;4358:20;4373:4;4358:20;:::i;:::-;4349:29;;4414:9;4401:23;4394:5;4387:38;4476:2;4465:9;4461:18;4448:32;-1:-1:-1;;;;;4540:2:38;4532:6;4529:14;4526:2;;;4556:1;4553;4546:12;4526:2;4592:47;4635:3;4626:6;4615:9;4611:22;4592:47;:::i;:::-;4587:2;4580:5;4576:14;4569:71;4700:2;4689:9;4685:18;4672:32;4667:2;4660:5;4656:14;4649:56;4758:2;4747:9;4743:18;4730:32;4714:48;;4787:2;4777:8;4774:16;4771:2;;;4803:1;4800;4793:12;4771:2;4839:70;4905:3;4894:8;4883:9;4879:24;4839:70;:::i;:::-;4834:2;4827:5;4823:14;4816:94;4963:3;4952:9;4948:19;4935:33;4919:49;;4993:2;4983:8;4980:16;4977:2;;;5009:1;5006;4999:12;4977:2;5046:70;5112:3;5101:8;5090:9;5086:24;5046:70;:::i;:::-;5040:3;5033:5;5029:15;5022:95;5170:3;5159:9;5155:19;5142:33;5126:49;;5200:2;5190:8;5187:16;5184:2;;;5216:1;5213;5206:12;5184:2;;5253:63;5312:3;5301:8;5290:9;5286:24;5253:63;:::i;:::-;5247:3;5240:5;5236:15;5229:88;;4272:1051;;;;:::o;5328:259::-;;5440:2;5428:9;5419:7;5415:23;5411:32;5408:2;;;5461:6;5453;5446:22;5408:2;5505:9;5492:23;5524:33;5551:5;5524:33;:::i;5592:402::-;;;5721:2;5709:9;5700:7;5696:23;5692:32;5689:2;;;5742:6;5734;5727:22;5689:2;5786:9;5773:23;5805:33;5832:5;5805:33;:::i;:::-;5857:5;-1:-1:-1;5914:2:38;5899:18;;5886:32;5927:35;5886:32;5927:35;:::i;:::-;5981:7;5971:17;;;5679:315;;;;;:::o;5999:1129::-;;;;;;6238:3;6226:9;6217:7;6213:23;6209:33;6206:2;;;6260:6;6252;6245:22;6206:2;6304:9;6291:23;6323:33;6350:5;6323:33;:::i;:::-;6375:5;-1:-1:-1;6432:2:38;6417:18;;6404:32;6445:35;6404:32;6445:35;:::i;:::-;6499:7;-1:-1:-1;6557:2:38;6542:18;;6529:32;-1:-1:-1;;;;;6610:14:38;;;6607:2;;;6642:6;6634;6627:22;6607:2;6670:67;6729:7;6720:6;6709:9;6705:22;6670:67;:::i;:::-;6660:77;;6790:2;6779:9;6775:18;6762:32;6746:48;;6819:2;6809:8;6806:16;6803:2;;;6840:6;6832;6825:22;6803:2;6868:69;6929:7;6918:8;6907:9;6903:24;6868:69;:::i;:::-;6858:79;;6990:3;6979:9;6975:19;6962:33;6946:49;;7020:2;7010:8;7007:16;7004:2;;;7041:6;7033;7026:22;7004:2;;7069:53;7114:7;7103:8;7092:9;7088:24;7069:53;:::i;:::-;7059:63;;;6196:932;;;;;;;;:::o;7133:760::-;;;;;;7322:3;7310:9;7301:7;7297:23;7293:33;7290:2;;;7344:6;7336;7329:22;7290:2;7388:9;7375:23;7407:33;7434:5;7407:33;:::i;:::-;7459:5;-1:-1:-1;7516:2:38;7501:18;;7488:32;7529:35;7488:32;7529:35;:::i;:::-;7583:7;-1:-1:-1;7637:2:38;7622:18;;7609:32;;-1:-1:-1;7688:2:38;7673:18;;7660:32;;-1:-1:-1;7743:3:38;7728:19;;7715:33;-1:-1:-1;;;;;7760:30:38;;7757:2;;;7808:6;7800;7793:22;7757:2;7836:51;7879:7;7870:6;7859:9;7855:22;7836:51;:::i;7898:774::-;;;;8094:2;8082:9;8073:7;8069:23;8065:32;8062:2;;;8115:6;8107;8100:22;8062:2;8159:9;8146:23;8178:33;8205:5;8178:33;:::i;:::-;8230:5;-1:-1:-1;8286:2:38;8271:18;;8258:32;-1:-1:-1;;;;;8339:14:38;;;8336:2;;;8371:6;8363;8356:22;8336:2;8399:67;8458:7;8449:6;8438:9;8434:22;8399:67;:::i;:::-;8389:77;;8519:2;8508:9;8504:18;8491:32;8475:48;;8548:2;8538:8;8535:16;8532:2;;;8569:6;8561;8554:22;8532:2;;8597:69;8658:7;8647:8;8636:9;8632:24;8597:69;:::i;:::-;8587:79;;;8052:620;;;;;:::o;8677:438::-;;;8803:2;8791:9;8782:7;8778:23;8774:32;8771:2;;;8824:6;8816;8809:22;8771:2;8868:9;8855:23;8887:33;8914:5;8887:33;:::i;:::-;8939:5;-1:-1:-1;8996:2:38;8981:18;;8968:32;9038:15;;9031:23;9019:36;;9009:2;;9074:6;9066;9059:22;9120:327;;;9249:2;9237:9;9228:7;9224:23;9220:32;9217:2;;;9270:6;9262;9255:22;9217:2;9314:9;9301:23;9333:33;9360:5;9333:33;:::i;:::-;9385:5;9437:2;9422:18;;;;9409:32;;-1:-1:-1;;;9207:240:38:o;9452:395::-;;;;9598:2;9586:9;9577:7;9573:23;9569:32;9566:2;;;9619:6;9611;9604:22;9566:2;9663:9;9650:23;9682:33;9709:5;9682:33;:::i;:::-;9734:5;9786:2;9771:18;;9758:32;;-1:-1:-1;9837:2:38;9822:18;;;9809:32;;9556:291;-1:-1:-1;;;9556:291:38:o;9852:374::-;;9989:2;9977:9;9968:7;9964:23;9960:32;9957:2;;;10010:6;10002;9995:22;9957:2;10055:9;10042:23;-1:-1:-1;;;;;10080:6:38;10077:30;10074:2;;;10125:6;10117;10110:22;10074:2;10153:67;10212:7;10203:6;10192:9;10188:22;10153:67;:::i;:::-;10143:77;9947:279;-1:-1:-1;;;;9947:279:38:o;10231:637::-;;;10410:2;10398:9;10389:7;10385:23;10381:32;10378:2;;;10431:6;10423;10416:22;10378:2;10476:9;10463:23;-1:-1:-1;;;;;10546:2:38;10538:6;10535:14;10532:2;;;10567:6;10559;10552:22;10532:2;10595:67;10654:7;10645:6;10634:9;10630:22;10595:67;:::i;:::-;10585:77;;10715:2;10704:9;10700:18;10687:32;10671:48;;10744:2;10734:8;10731:16;10728:2;;;10765:6;10757;10750:22;10728:2;;10793:69;10854:7;10843:8;10832:9;10828:24;10793:69;:::i;:::-;10783:79;;;10368:500;;;;;:::o;10873:306::-;;10984:2;10972:9;10963:7;10959:23;10955:32;10952:2;;;11005:6;10997;10990:22;10952:2;11036:23;;-1:-1:-1;;;;;;11088:32:38;;11078:43;;11068:2;;11140:6;11132;11125:22;11184:343;;11306:2;11294:9;11285:7;11281:23;11277:32;11274:2;;;11327:6;11319;11312:22;11274:2;11372:9;11359:23;-1:-1:-1;;;;;11397:6:38;11394:30;11391:2;;;11442:6;11434;11427:22;11391:2;11470:51;11513:7;11504:6;11493:9;11489:22;11470:51;:::i;11532:1152::-;;;;;;;11769:3;11757:9;11748:7;11744:23;11740:33;11737:2;;;11791:6;11783;11776:22;11737:2;11836:9;11823:23;-1:-1:-1;;;;;11906:2:38;11898:6;11895:14;11892:2;;;11927:6;11919;11912:22;11892:2;11955:51;11998:7;11989:6;11978:9;11974:22;11955:51;:::i;:::-;11945:61;;12059:2;12048:9;12044:18;12031:32;12015:48;;12088:2;12078:8;12075:16;12072:2;;;12109:6;12101;12094:22;12072:2;12137:53;12182:7;12171:8;12160:9;12156:24;12137:53;:::i;:::-;12127:63;;12243:2;12232:9;12228:18;12215:32;12199:48;;12272:2;12262:8;12259:16;12256:2;;;12293:6;12285;12278:22;12256:2;12321:53;12366:7;12355:8;12344:9;12340:24;12321:53;:::i;:::-;12311:63;;12427:2;12416:9;12412:18;12399:32;12383:48;;12456:2;12446:8;12443:16;12440:2;;;12477:6;12469;12462:22;12440:2;;12505:53;12550:7;12539:8;12528:9;12524:24;12505:53;:::i;:::-;12495:63;;;12577:41;12613:3;12602:9;12598:19;12577:41;:::i;:::-;12567:51;;12637:41;12673:3;12662:9;12658:19;12637:41;:::i;:::-;12627:51;;11727:957;;;;;;;;:::o;12689:1395::-;;;;;;;;12968:3;12956:9;12947:7;12943:23;12939:33;12936:2;;;12990:6;12982;12975:22;12936:2;13035:9;13022:23;-1:-1:-1;;;;;13105:2:38;13097:6;13094:14;13091:2;;;13126:6;13118;13111:22;13091:2;13154:51;13197:7;13188:6;13177:9;13173:22;13154:51;:::i;:::-;13144:61;;13258:2;13247:9;13243:18;13230:32;13214:48;;13287:2;13277:8;13274:16;13271:2;;;13308:6;13300;13293:22;13271:2;13336:53;13381:7;13370:8;13359:9;13355:24;13336:53;:::i;:::-;13326:63;;13442:2;13431:9;13427:18;13414:32;13398:48;;13471:2;13461:8;13458:16;13455:2;;;13492:6;13484;13477:22;13455:2;13520:53;13565:7;13554:8;13543:9;13539:24;13520:53;:::i;:::-;13510:63;;13626:2;13615:9;13611:18;13598:32;13582:48;;13655:2;13645:8;13642:16;13639:2;;;13676:6;13668;13661:22;13639:2;13704:53;13749:7;13738:8;13727:9;13723:24;13704:53;:::i;:::-;13694:63;;13810:3;13799:9;13795:19;13782:33;13766:49;;13840:2;13830:8;13827:16;13824:2;;;13861:6;13853;13846:22;13824:2;;13889:69;13950:7;13939:8;13928:9;13924:24;13889:69;:::i;:::-;13879:79;;;13977:41;14013:3;14002:9;13998:19;13977:41;:::i;:::-;13967:51;;14037:41;14073:3;14062:9;14058:19;14037:41;:::i;:::-;14027:51;;12926:1158;;;;;;;;;;:::o;14089:727::-;;;;;14282:3;14270:9;14261:7;14257:23;14253:33;14250:2;;;14304:6;14296;14289:22;14250:2;14349:9;14336:23;-1:-1:-1;;;;;14374:6:38;14371:30;14368:2;;;14419:6;14411;14404:22;14368:2;14447:66;14505:7;14496:6;14485:9;14481:22;14447:66;:::i;:::-;14437:76;;;14563:2;14552:9;14548:18;14535:32;14576:33;14603:5;14576:33;:::i;:::-;14628:5;-1:-1:-1;14685:2:38;14670:18;;14657:32;14698:35;14657:32;14698:35;:::i;:::-;14240:576;;;;-1:-1:-1;14752:7:38;;14806:2;14791:18;14778:32;;-1:-1:-1;;14240:576:38:o;14821:583::-;;;;14997:2;14985:9;14976:7;14972:23;14968:32;14965:2;;;15018:6;15010;15003:22;14965:2;15063:9;15050:23;-1:-1:-1;;;;;15088:6:38;15085:30;15082:2;;;15133:6;15125;15118:22;15082:2;15161:66;15219:7;15210:6;15199:9;15195:22;15161:66;:::i;:::-;15151:76;;;15277:2;15266:9;15262:18;15249:32;15290:33;15317:5;15290:33;:::i;:::-;14955:449;;15342:5;;-1:-1:-1;;;15394:2:38;15379:18;;;;15366:32;;14955:449::o;15409:190::-;;15521:2;15509:9;15500:7;15496:23;15492:32;15489:2;;;15542:6;15534;15527:22;15489:2;-1:-1:-1;15570:23:38;;15479:120;-1:-1:-1;15479:120:38:o;15604:470::-;;;;15750:2;15738:9;15729:7;15725:23;15721:32;15718:2;;;15771:6;15763;15756:22;15718:2;15812:9;15799:23;15789:33;;15872:2;15861:9;15857:18;15844:32;15885:33;15912:5;15885:33;:::i;:::-;15937:5;-1:-1:-1;15994:2:38;15979:18;;15966:32;16007:35;15966:32;16007:35;:::i;:::-;16061:7;16051:17;;;15708:366;;;;;:::o;16079:258::-;;;16208:2;16196:9;16187:7;16183:23;16179:32;16176:2;;;16229:6;16221;16214:22;16176:2;-1:-1:-1;;16257:23:38;;;16327:2;16312:18;;;16299:32;;-1:-1:-1;16166:171:38:o;16342:594::-;;16444:5;16438:12;16471:6;16466:3;16459:19;16497:4;16526:2;16521:3;16517:12;16510:19;;16563:2;16556:5;16552:14;16584:3;16596:315;16610:6;16607:1;16604:13;16596:315;;;16669:13;;16711:9;;-1:-1:-1;;;;;16707:35:38;16695:48;;16787:11;;16781:18;-1:-1:-1;;;;;16777:51:38;16763:12;;;16756:73;16858:4;16849:14;;;;16886:15;;;;16739:1;16625:9;16596:315;;;-1:-1:-1;16927:3:38;;16414:522;-1:-1:-1;;;;;16414:522:38:o;16941:443::-;;17038:5;17032:12;17065:6;17060:3;17053:19;17091:4;17120:2;17115:3;17111:12;17104:19;;17157:2;17150:5;17146:14;17178:3;17190:169;17204:6;17201:1;17198:13;17190:169;;;17265:13;;17253:26;;17299:12;;;;17334:15;;;;17226:1;17219:9;17190:169;;17389:478;;17471:5;17465:12;17498:6;17493:3;17486:19;17523:3;17535:162;17549:6;17546:1;17543:13;17535:162;;;17611:4;17667:13;;;17663:22;;17657:29;17639:11;;;17635:20;;17628:59;17564:12;17535:162;;;17715:6;17712:1;17709:13;17706:2;;;17781:3;17774:4;17765:6;17760:3;17756:16;17752:27;17745:40;17706:2;-1:-1:-1;17849:2:38;17828:15;-1:-1:-1;;17824:29:38;17815:39;;;;17856:4;17811:50;;17441:426;-1:-1:-1;;17441:426:38:o;17872:203::-;-1:-1:-1;;;;;18036:32:38;;;;18018:51;;18006:2;17991:18;;17973:102::o;18080:492::-;-1:-1:-1;;;;;18313:32:38;;18295:51;;18382:2;18377;18362:18;;18355:30;;;18080:492;;18408:47;;18436:18;;18428:6;18408:47;:::i;:::-;18503:9;18495:6;18491:22;18486:2;18475:9;18471:18;18464:50;18531:35;18559:6;18551;18531:35;:::i;18577:274::-;-1:-1:-1;;;;;18769:32:38;;;;18751:51;;18833:2;18818:18;;18811:34;18739:2;18724:18;;18706:145::o;18856:316::-;;19079:2;19068:9;19061:21;19099:67;19162:2;19151:9;19147:18;19139:6;19099:67;:::i;19177:267::-;;19356:2;19345:9;19338:21;19376:62;19434:2;19423:9;19419:18;19411:6;19376:62;:::i;19449:477::-;;19706:2;19695:9;19688:21;19732:62;19790:2;19779:9;19775:18;19767:6;19732:62;:::i;:::-;19842:9;19834:6;19830:22;19825:2;19814:9;19810:18;19803:50;19870;19913:6;19905;19870:50;:::i;19931:187::-;20096:14;;20089:22;20071:41;;20059:2;20044:18;;20026:92::o;20123:222::-;;20272:2;20261:9;20254:21;20292:47;20335:2;20324:9;20320:18;20312:6;20292:47;:::i;20350:343::-;20552:2;20534:21;;;20591:2;20571:18;;;20564:30;-1:-1:-1;;;20625:2:38;20610:18;;20603:49;20684:2;20669:18;;20524:169::o;20698:340::-;20900:2;20882:21;;;20939:2;20919:18;;;20912:30;-1:-1:-1;;;20973:2:38;20958:18;;20951:46;21029:2;21014:18;;20872:166::o;21043:356::-;21245:2;21227:21;;;21264:18;;;21257:30;21323:34;21318:2;21303:18;;21296:62;21390:2;21375:18;;21217:182::o;21404:341::-;21606:2;21588:21;;;21645:2;21625:18;;;21618:30;-1:-1:-1;;;21679:2:38;21664:18;;21657:47;21736:2;21721:18;;21578:167::o;21750:335::-;21952:2;21934:21;;;21991:2;21971:18;;;21964:30;-1:-1:-1;;;22025:2:38;22010:18;;22003:41;22076:2;22061:18;;21924:161::o;22090:340::-;22292:2;22274:21;;;22331:2;22311:18;;;22304:30;-1:-1:-1;;;22365:2:38;22350:18;;22343:46;22421:2;22406:18;;22264:166::o;22435:404::-;22637:2;22619:21;;;22676:2;22656:18;;;22649:30;22715:34;22710:2;22695:18;;22688:62;-1:-1:-1;;;22781:2:38;22766:18;;22759:38;22829:3;22814:19;;22609:230::o;22844:340::-;23046:2;23028:21;;;23085:2;23065:18;;;23058:30;-1:-1:-1;;;23119:2:38;23104:18;;23097:46;23175:2;23160:18;;23018:166::o;23189:349::-;23391:2;23373:21;;;23430:2;23410:18;;;23403:30;23469:27;23464:2;23449:18;;23442:55;23529:2;23514:18;;23363:175::o;23543:338::-;23745:2;23727:21;;;23784:2;23764:18;;;23757:30;-1:-1:-1;;;23818:2:38;23803:18;;23796:44;23872:2;23857:18;;23717:164::o;23886:397::-;24088:2;24070:21;;;24127:2;24107:18;;;24100:30;24166:34;24161:2;24146:18;;24139:62;-1:-1:-1;;;24232:2:38;24217:18;;24210:31;24273:3;24258:19;;24060:223::o;24288:410::-;24490:2;24472:21;;;24529:2;24509:18;;;24502:30;24568:34;24563:2;24548:18;;24541:62;-1:-1:-1;;;24634:2:38;24619:18;;24612:44;24688:3;24673:19;;24462:236::o;24703:177::-;24849:25;;;24837:2;24822:18;;24804:76::o;24885:387::-;;25136:6;25125:9;25118:25;25179:2;25174;25163:9;25159:18;25152:30;25199:67;25262:2;25251:9;25247:18;25239:6;25199:67;:::i;25277:248::-;25451:25;;;25507:2;25492:18;;25485:34;25439:2;25424:18;;25406:119::o;25530:242::-;25600:2;25594:9;25630:17;;;-1:-1:-1;;;;;25662:34:38;;25698:22;;;25659:62;25656:2;;;25724:9;25656:2;25751;25744:22;25574:198;;-1:-1:-1;25574:198:38:o;25777:183::-;;-1:-1:-1;;;;;25868:6:38;25865:30;25862:2;;;25898:9;25862:2;-1:-1:-1;25949:4:38;25930:17;;;25926:28;;25852:108::o;25965:88::-;26040:3;26036:15;;26022:31::o;26058:764::-;;26139:4;26121:16;26118:26;26115:2;;;26147:5;;26115:2;26188:1;26183:3;26178;26163:27;26250:10;26212:36;26243:3;26237:10;26212:36;:::i;:::-;26209:52;26199:2;;26265:5;;26199:2;26299;26293:9;26339:16;-1:-1:-1;;26335:29:38;26332:1;26293:9;26311:54;26394:4;26388:11;26418:16;-1:-1:-1;;;;;26524:2:38;26517:4;26509:6;26505:17;26502:25;26497:2;26489:6;26486:14;26483:45;26480:2;;;26531:5;;;;;;26480:2;26568:6;26562:4;26558:17;26547:28;;26604:3;26598:10;26584:24;;26631:2;26623:6;26620:14;26617:2;;;26637:5;;;;;;26617:2;;26698:16;26692:4;26688:27;26681:4;26672:6;26667:3;26663:16;26659:27;26656:60;26653:2;;;26719:5;;;;;26653:2;26784;26763:15;-1:-1:-1;;26759:29:38;26750:39;;26791:4;26746:50;26742:2;26735:62;26754:3;-1:-1:-1;;26105:717:38;:::o;26827:133::-;-1:-1:-1;;;;;26904:31:38;;26894:42;;26884:2;;26950:1;26947;26940:12
Swarm Source
ipfs://ae797c59fedc2b400b3bf0014d619dcdb93c789ea67bdaaa9bacc1958c1d896e
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.