Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
29.1 BNKLTO
Holders
93
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Balance
0.00000001 BNKLTOValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x00000000...4e6B95A54 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
E741V1Wrapped741
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-03 */ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀ //⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀ //⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇ //⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃ //⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀ //⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀ //⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀ //⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀ //⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀ //⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀ //⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀ //⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀ //⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀ // ███████ █████ ██ ██ ██⣤⣔⡊⣀⠀⠀⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀⠀⠀⠀⠀ // ██ ██ ██ ██ ███⠀⢹⠀⠙⣤⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀ // █████ ██ ███████ ██ ⢸⠀⠀⣿⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ██ ██ ██ ██ ⡇⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ███████ ██ ██ ██⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // A public demonstration in single-contract dual-token implementations // with zero-conflict events, and function overloading. // https://github.com/SJ741/E741-Platform // https://741.gg (Get the token telegram link from 'telegram' variable) // Emerald Token Standard // WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS // no systems have been built with these usecases in mind, and there are a number of // ways that experimental, complex contracts can lead to unforseen consequences. // INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK //SPDX-License-Identifier: MIT pragma solidity ^0.8.24; // libraries to separate ERC20 and ERC721 events, and certain signature-specific functions // ERC20 events library libES20 { event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint256 value); function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); } function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); } } // ERC721 events library libES721 { event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); } function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); } function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); } } // ERC165 https://eips.ethereum.org/EIPS/eip-721 interface IERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); } // ERC20 https://eips.ethereum.org/EIPS/eip-20 interface IERC20 { function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function decimals() external view returns (uint); } // ERC721 https://eips.ethereum.org/EIPS/eip-721 interface IERC721 is IERC165 { function balanceOf(address account) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); // payable removed for erc20 etherscan compatibility function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IE741 is IERC20, IERC721 { // supportsInterface 0x5a46575f // library transfers can not be included in the interface // incorporate them directly with library // libES20.Transfer // libES20.Approval // libES721.Transfer // libES721.Approval // libES721.ApprovalForAll function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256); function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool); function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool); } interface IERC721Metadata { function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function tokenURI(uint256 _tokenId) external view returns (string memory); } interface IERC7572 { function contractURI() external view returns (string memory); event ContractURIUpdated(); } interface IERC20Metadata { function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function tokenURI(uint256 _tokenId) external view returns (string memory); } interface IDevable { function initialize(bytes memory encodedParameters) external returns (address); function dev() external returns (address dev); function setContractURI(string memory newContractURI) external; function setBaseURI(string memory newBaseURI) external; function changeDev(address newDev) external; function toggelNFTinterface() external; function withdraw() external; function setExtension(string memory newExtension) external; function setTelegram(string memory newTelegram) external; function setSkipMintingGlobal(bool newSkipMintingGlobal) external; } // ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721 interface IERC721TokenReceiver { function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4); } contract ERC721TokenReceiver is IERC721TokenReceiver { function onERC721Received(address, address, uint256, bytes memory) external virtual returns(bytes4) { return IERC721TokenReceiver.onERC721Received.selector; } } abstract contract E741V1Base is IDevable, ERC721TokenReceiver, IE741 { address public constant BROKEN_ADDRESS = address(0x5e7ec); address public constant DEPOSIT_ADDRESS = address(0x0); address public constant MINT_ADDRESS = address(0x0); string public baseURI; string internal _contractURI; string public extension; string public telegram; string internal _name; string internal _symbol; uint internal _decimals; uint internal _totalIds; uint internal _totalSupply; uint internal ONE; // 1.0 token(s) uint internal MAXID; // e.g. 1.00000001 : 1.00007777 is the range for NFT IDs uint64 public minted; // number of unique ID mints + ONE address public dev; bool public supportsNFTinterface; bool public skipMintingGlobal = false; mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(address => mapping(address => uint)) internal _allowance; mapping(uint256 tokenId => address) public ownerOf; mapping(uint256 => address) private _nftApprovals; mapping(address => uint) internal _balanceOf; mapping(address => uint64[]) public ownedNFTs; // broken NFTs stored in limbo list are at ownedNFTs[BROKEN_ADDRESS] mapping(uint64 => uint256) internal idToIndex; mapping(address => bool) internal skipMintingUser; error UnsupportedReceiver(); modifier onlyDev() { require(msg.sender == dev, "Not the developer"); _; } constructor() { dev = msg.sender; } function initialize(bytes memory encodedParameters) public override virtual returns (address underlyingToken); function deposit(uint[] memory amounts) public virtual; function withdraw(uint[] memory amounts) public payable virtual; function name() public view virtual returns (string memory) { return _name; } function symbol() public view virtual returns (string memory) { return _symbol; } function decimals() public view virtual returns (uint) { return _decimals; } function totalSupply() public view virtual returns (uint) { return _totalSupply; } function maxSupply() public view virtual returns (uint) { return _totalIds * ONE; } function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; } function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; } function setBaseURI(string memory newBaseURI) public onlyDev override {baseURI = newBaseURI;} function setContractURI(string memory newContractURI) public onlyDev override virtual {_contractURI = newContractURI; emit IERC7572.ContractURIUpdated();} function setExtension(string memory newExtension) public onlyDev override virtual {extension = newExtension;} function setTelegram(string memory newTelegram) public onlyDev virtual {telegram = newTelegram;} function changeDev(address newDev) public onlyDev override {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0)) // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag // don't waste it, as frontends don't typically change classification of contracts // probably never to be used. function toggelNFTinterface() public onlyDev override {supportsNFTinterface = !supportsNFTinterface;} function tokensOfOwner(address owner) public view returns (uint64[] memory){return ownedNFTs[owner];} function nftBalanceOf(address account) public view returns (uint) {return ownedNFTs[account].length;} function contractURI() public view virtual returns (string memory) {return _contractURI;} function setSkipMintingGlobal(bool newSkipMintingGlobal) public override virtual onlyDev { skipMintingGlobal = newSkipMintingGlobal; } function setSkipMinting(bool newSkipMinting) public virtual { skipMintingUser[msg.sender] = newSkipMinting; } function approve(address spender, uint amount) public override returns (bool) { // if the amount is greater than one token, and within range of IDs for NFTs // then set NFT approval for the given ID if(amount >= ONE && amount <= MAXID) { address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("E741: You are not approved"); _nftApprovals[amount] = spender; // calling nft approval for the token and spender libES721.emitApproval(owner, spender, amount); return true; } // else set the ERC20 allowance // the NFT ID range being set within a limited subset of ONE token(s) // allows for non-clashing interactions _allowance[msg.sender][spender] = amount; libES20.emitApproval(msg.sender, spender, amount); return true; } function _transfer741(address from, address to, uint amount) internal virtual { require(_balanceOf[from] >= amount, "E741: transfer amount exceeds balance"); // checking the decimal amount of tokens owned before transaction for both participants uint256 fromDecimalsPre = _balanceOf[from] % ONE; uint256 toDecimalsPre = _balanceOf[to] % ONE; // simple erc20 balance operations _transfer20(from, to, amount); // checking the decimal amount of tokens after transaction for both partcipants uint256 fromDecimalsPost = _balanceOf[from] % ONE; uint256 toDecimalsPost = _balanceOf[to] % ONE; // stores the NFT IDs owned by `from`, enabling NFT management for that address. uint64[] storage ownedNFTsArray = ownedNFTs[from]; // references NFTs marked as "broken", tracking these special state NFTs. uint64[] storage brokenIDsArray = ownedNFTs[BROKEN_ADDRESS]; // if sender has higher decimal count after transaction, then they "roll under" and break an NFT if (fromDecimalsPre < fromDecimalsPost) { if(ownedNFTsArray.length > 0) { // if the sender has an nft to send //pushes the last nft in the owned list into the "broken list" for limbo NFTs _transfer721Pop(from, BROKEN_ADDRESS, ownedNFTsArray); //transfers the NFT ID ownership to BROKEN address for stewardship } } // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft if (toDecimalsPre > toDecimalsPost) { if(brokenIDsArray.length > 0) { // recover an id from broken list _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray); } else { // mint new id _mint(to); } } // amount of tokens - amount of whole tokens being processed in int uint amountInTokens = amount / ONE; uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected if(skipMintingGlobal || from == DEPOSIT_ADDRESS || skipMintingUser[to] || skipMintingUser[from] || from == dev) { // When skipping minting the nft holder can only send out the tokens they hold (reduce gas) amountInTokens = amountInTokens < len ? amountInTokens : len; } if(amountInTokens > 0) { len = amountInTokens < len ? amountInTokens : len; // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers for (uint i = 0; i < len; i++) { _transfer721Pop(from, to, ownedNFTsArray); } amountInTokens -= len; len = brokenIDsArray.length; len = amountInTokens < len ? amountInTokens : len; // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance for (uint i = 0; i < len; i++) { _transfer721Pop(BROKEN_ADDRESS, to, brokenIDsArray); } _mintBatch(to, amountInTokens - len); } } function _mintBatch(address to, uint256 amount) internal virtual { if(amount == 0) return; // Exit if no NFTs to mint if(amount == 1) { // Optimize single mint process _mint(to); return; } uint64 id = minted; // Start ID from last minted value uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to' for(uint i = 0; i < amount;) { unchecked { id++; // Increment ID for each new NFT } ownerOf[id] = to; // Assign new NFT to owner. idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array ownedNFTs[to].push(id); // Add new NFT ID to owner's list libES721.emitTransfer(MINT_ADDRESS, to, id); // Emit NFT transfer event unchecked { ownedLen++; // Increment count of owned NFTs i++; // Move to next NFT } } unchecked { minted += uint64(amount); // Update total minted count } } function _mint(address to) internal virtual returns(uint64 tokenId){ unchecked { minted++; // Increment the total number of minted tokens } tokenId = minted; // Assign the newly minted token ID ownerOf[tokenId] = to; // Set ownership of the new token to 'to' idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens libES721.emitTransfer(MINT_ADDRESS, to, tokenId); // Emit an event for the token transfer } // Updates the mappings and arrays managing ownership and index of NFTs after a transfer function _updateOwnedNFTs(address from, address to, uint64 tokenId) internal { uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list uint64[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from' uint256 len = nftArray.length; // Current number of NFTs owned by 'from' uint64 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from' if(len - 1 != 0){ idToIndex[lastTokenId] = index; // Update the index of the swapped token } ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token } // Executes a simple ERC20 token transfer. function _transfer20(address from, address to, uint256 amount) internal { _balanceOf[from] -= amount; // Deduct the amount from the sender's balance unchecked { _balanceOf[to] += amount; // Add the amount to the recipient's balance } libES20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event } // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission function _transfer721(address from, address to, uint64 tokenId) internal virtual { require(from == ownerOf[tokenId], "E741: Incorrect owner"); // Ensure 'from' is the current owner delete _nftApprovals[tokenId]; // Clear any approvals for this token ownerOf[tokenId] = to; // Transfer ownership of the token to 'to' _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event } // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission function _transfer721Pop(address from, address to, uint64[] storage nftArray) internal virtual { uint64 tokenId = nftArray[nftArray.length - 1]; delete _nftApprovals[tokenId]; // Clear any approvals for this token ownerOf[tokenId] = to; // Transfer ownership of the token to 'to' // update owned nfts pop edition nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from' ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event } // only erc20 calls this // if amount is a token id owned my the caller send as an NFT // else transfer741 function transfer(address to, uint amount) public override returns (bool) { if(ownerOf[amount] == msg.sender) { _transfer721(msg.sender, to, uint64(amount)); _transfer20(msg.sender, to, ONE); return true; } _transfer741(msg.sender, to, amount); return true; } // erc20 and erc721 call this function transferFrom(address from, address to, uint amount) public override returns (bool) { //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE) if(amount >= ONE && amount <= MAXID) { require( //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(amount)); _transfer20(from, to, ONE); return true; } _spendAllowance(from, msg.sender, amount); _transfer741(from, to, amount); return true; } // erc721 function safeTransferFrom(address from, address to, uint256 tokenId) public payable override { require( msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(tokenId)); _transfer20(from, to, ONE); if ( to.code.length != 0 && IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") != IERC721TokenReceiver.onERC721Received.selector ) { revert UnsupportedReceiver(); } } // erc721 function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override { require( msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender), "E741: You don't have the right" ); _transfer721(from, to, uint64(tokenId)); _transfer20(from, to, ONE); if ( to.code.length != 0 && IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) != IERC721TokenReceiver.onERC721Received.selector ) { revert UnsupportedReceiver(); } } function _spendAllowance(address owner, address spender, uint amount) internal virtual { require(_allowance[owner][spender] >= amount, "E741: insufficient allowance"); _allowance[owner][spender] -= amount; } function getApproved(uint256 tokenId) public view override returns (address) { if (ownerOf[tokenId] == address(0)) revert(); return _nftApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public override { _operatorApprovals[msg.sender][operator] = approved; libES721.emitApprovalForAll(msg.sender, operator, approved); } function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } function tokenURI(uint256 tokenId) public view virtual returns (string memory) { require(tokenId <= MAXID, "E741: invalid id"); if (bytes(baseURI).length == 0) {return "";} return string(abi.encodePacked(baseURI, toString(tokenId - ONE), extension)); } function toString(uint256 value) internal pure returns (string memory) { if (value == 0) {return "0";} uint256 temp = value; uint256 digits; while (temp != 0) {digits++; temp /= 10;} bytes memory buffer = new bytes(digits); while (value != 0) {digits -= 1; buffer[digits] = bytes1(uint8(value % 10) + 48); value /= 10;} return string(buffer); } function withdraw() external onlyDev override { (bool success,) = payable(dev).call{value: address(this).balance}(""); require(success); } function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20 // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721 interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165 interfaceId == 0x36372b07 || // ERC165 interface ID for ERC20 interfaceId == 0x150b7a02 || // ERC165 interface ID for IERC721TokenReceiver interfaceId == 0x5a46575f; // ERC165 interface ID for IE741 } } pragma solidity ^0.8.24; contract E741V1Wrapped741 is E741V1Base { event Deposit(address indexed from, uint amount741Out, uint[] amounts741In); event Withdrawal(address indexed to, uint amountUnderlyingOut, uint[] amounts741In); address constant EMERALDS = 0x382EDfe4c6168858C81893fE00fCB7b68914d929; address public underlying741; uint public underlyingWeiPerNft; address public feeRecipient; uint public withdrawalFees; uint internal withdrawalFeesDivisor = 10000; uint constant WITHDRAWAL_FEES_MIN = 5; // 0.05% uint constant WITHDRAWAL_FEES_MAX = 50; // 0.5% function initialize(bytes memory encodedParameters) public virtual override returns (address) { require(_decimals == 0, "Already initialized"); { // to prevent stack to deep error string memory _inputName; string memory _inputSymbol; (withdrawalFees, underlying741, _inputName, _inputSymbol, _decimals, baseURI, _contractURI, _totalIds, underlyingWeiPerNft) = abi.decode(encodedParameters, (uint,address,string,string,uint,string,string,uint,uint)); _name = _inputName; _symbol = _inputSymbol; } { address _token = underlying741; require(_token != address(0), 'E741V1: ZERO_ADDRESS'); try IERC165(_token).supportsInterface(0x5a46575f) returns (bool supports741) { require(_token == EMERALDS || supports741, "The underlying token does not support e741"); } catch { revert("The underlying token does not support ERC165"); } } ONE = 10 ** _decimals; MAXID = ONE + _totalIds - 1; minted = uint64(ONE) - 1; // start minting from ID ONE-1 so you can get id 0 feeRecipient = msg.sender; // our factory is always the fee recipient even if dev of token changes require(_decimals <= 18 && IERC20(underlying741).decimals() <= 18, "Too many decimals"); require(_totalIds > 0, "Need at least 1 nft"); require(withdrawalFees >= WITHDRAWAL_FEES_MIN, "Min fees of 0.05%"); require(withdrawalFees <= WITHDRAWAL_FEES_MAX, "Max fees of 0.5%"); require(ONE > _totalIds, "Not enough decimals for NFT count"); return underlying741; } // deposit amount of underlying741 function deposit(uint[] memory _amountsArray) public virtual override { uint _len = _amountsArray.length; uint _amount741Out; uint _underlyingONE = 10 ** IERC20(underlying741).decimals(); if(_len == 1) { if(IE741(underlying741).ownerOf(_amountsArray[0]) != msg.sender) { // not single nft transfer _amount741Out = (_amountsArray[0] * ONE) / underlyingWeiPerNft; } else { _amount741Out = (_underlyingONE * ONE) / underlyingWeiPerNft; // _len is 1 } // use direct from array to transfer the nft id if used IE741(underlying741).transferFrom(msg.sender, address(this), _amountsArray[0]); } else { for(uint i = 0; i < _len; i++) { // reverts if they deposit unowned or invalid id IE741(underlying741).safeTransferFrom(msg.sender, address(this), _amountsArray[i]); } _amount741Out = ((_len * _underlyingONE) * ONE) / underlyingWeiPerNft; } // spawn raw tokens _balanceOf[DEPOSIT_ADDRESS] += _amount741Out; _totalSupply += _amount741Out; _transfer741(DEPOSIT_ADDRESS, msg.sender, _amount741Out); // use _transfer741 to give user broken nfts if necessary // donating tokens to this wrapper will only make the wrapped token more scarce require(underlyingWeiPerNft * _totalIds >= IERC20(underlying741).balanceOf(address(this)), "NFT capacity reached, wait for someone to withdraw"); emit Deposit(msg.sender, _amount741Out, _amountsArray); } // Two modes // withdraw([amount]) // withdraw([id1, id2, id3]) function withdraw(uint256[] memory _amountsArray741) public virtual override payable { uint _arrayLen = _amountsArray741.length; require(_arrayLen > 0, "Trying to withdraw nothing"); uint _amount741; uint _amount741Sum; uint _underlyingONE = 10 ** IERC20(underlying741).decimals(); if (_arrayLen == 1) { _amount741 = _amountsArray741[0]; if (ownerOf[_amount741] == msg.sender) { _amount741Sum = ONE; // only record ONE for owned transfer } else { _amount741Sum = _amount741; } transfer(DEPOSIT_ADDRESS, _amount741); } else { for(uint i = 0; i < _arrayLen;) { _amount741 = _amountsArray741[i]; require(ownerOf[_amount741] == msg.sender, "Can only withdraw for nfts you own"); transfer(DEPOSIT_ADDRESS, _amount741); unchecked { i++; } } _amount741Sum = _arrayLen * ONE; // only record ONE for owned transfer } // remove raw tokens _balanceOf[DEPOSIT_ADDRESS] -= _amount741Sum; _totalSupply -= _amount741Sum; uint _totalUnderlyingOut = (_amount741Sum * underlyingWeiPerNft) / ONE; // use ONE not _underlyingONE uint _totalUnderlyingFees = (_totalUnderlyingOut * withdrawalFees) / withdrawalFeesDivisor; IE741(underlying741).transfer(feeRecipient, _totalUnderlyingFees); IE741(underlying741).transfer(msg.sender, (_totalUnderlyingOut - _totalUnderlyingFees)); emit Withdrawal(msg.sender, _totalUnderlyingOut, _amountsArray741); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount741Out","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountUnderlyingOut","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"amounts741In","type":"uint256[]"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"BROKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","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":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedParameters","type":"bytes"}],"name":"initialize","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMinting","type":"bool"}],"name":"setSkipMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newSkipMintingGlobal","type":"bool"}],"name":"setSkipMintingGlobal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTelegram","type":"string"}],"name":"setTelegram","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skipMintingGlobal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supportsNFTinterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"telegram","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying741","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"underlyingWeiPerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amountsArray741","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600b805460ff60e81b19169055612710601855348015610022575f80fd5b50600b8054600160401b600160e01b03191633680100000000000000000217905561386e806100505f395ff3fe6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033
Deployed Bytecode
0x6080604052600436106102a5575f3560e01c80636bcef9a61161016f578063a9059cbb116100d8578063d5abeb0111610092578063e8e81fe41161006d578063e8e81fe414610856578063e985e9c514610875578063f835ab0014610894578063ff0d2c26146104c9575f80fd5b8063d5abeb01146107ea578063dd62ed3e146107fe578063e8a3d48514610842575f80fd5b8063a9059cbb14610745578063b3720c3414610764578063b88d4fde14610784578063bb74e1ae14610797578063c87b56dd146107b6578063caf0dcc2146107d5575f80fd5b806391cca3db1161012957806391cca3db1461069a578063938e3d7b146106c057806395d89b41146106df578063983d95ce146106f3578063a22cb46514610706578063a563833b14610725575f80fd5b80636bcef9a6146105d45780636c0360eb146105e857806370a08231146105fc5780637e2285aa146106305780638462151c1461064f57806388a8c95c1461067b575f80fd5b80633ccfd60b116102115780634ee2c4ce116101cb5780634ee2c4ce1461050f5780634f02c4201461052457806355f804b314610543578063598b8e71146105625780636352211e146105815780636a21f8e1146105b5575f80fd5b80633ccfd60b1461048157806342842e0e14610497578063439fab91146104aa578063466c35fc146104c957806346904840146104dc57806347ecb665146104fb575f80fd5b806318160ddd1161026257806318160ddd146103d95780631a72b87d146103ed57806323b872dd146104245780632d5537b0146104435780632ff3a24214610457578063313ce5671461046d575f80fd5b806301ffc9a7146102a957806306fdde03146102dd578063081812fc146102fe578063095ea7b3146103355780630e313e9814610354578063150b7a0214610396575b5f80fd5b3480156102b4575f80fd5b506102c86102c3366004612db5565b6108cd565b60405190151581526020015b60405180910390f35b3480156102e8575f80fd5b506102f161096a565b6040516102d49190612e1d565b348015610309575f80fd5b5061031d610318366004612e2f565b6109fa565b6040516001600160a01b0390911681526020016102d4565b348015610340575f80fd5b506102c861034f366004612e5a565b610a34565b34801561035f575f80fd5b5061038861036e366004612e84565b6001600160a01b03165f9081526011602052604090205490565b6040519081526020016102d4565b3480156103a1575f80fd5b506103c06103b0366004612f62565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016102d4565b3480156103e4575f80fd5b50600854610388565b3480156103f8575f80fd5b5061040c610407366004612e5a565b610b42565b6040516001600160401b0390911681526020016102d4565b34801561042f575f80fd5b506102c861043e366004612fc9565b610b89565b34801561044e575f80fd5b506102f1610c40565b348015610462575f80fd5b5061031d6205e7ec81565b348015610478575f80fd5b50600654610388565b34801561048c575f80fd5b50610495610ccc565b005b6104956104a5366004612fc9565b610d63565b3480156104b5575f80fd5b5061031d6104c4366004613007565b610ea2565b3480156104d4575f80fd5b5061031d5f81565b3480156104e7575f80fd5b5060165461031d906001600160a01b031681565b348015610506575f80fd5b506102f16113a2565b34801561051a575f80fd5b5061038860175481565b34801561052f575f80fd5b50600b5461040c906001600160401b031681565b34801561054e575f80fd5b5061049561055d366004613038565b6113af565b34801561056d575f80fd5b5061049561057c36600461307c565b6113ef565b34801561058c575f80fd5b5061031d61059b366004612e2f565b600e6020525f90815260409020546001600160a01b031681565b3480156105c0575f80fd5b506104956105cf366004613129565b611880565b3480156105df575f80fd5b506104956118cf565b3480156105f3575f80fd5b506102f1611921565b348015610607575f80fd5b50610388610616366004612e84565b6001600160a01b03165f9081526010602052604090205490565b34801561063b575f80fd5b5061049561064a366004613038565b61192d565b34801561065a575f80fd5b5061066e610669366004612e84565b61196a565b6040516102d49190613144565b348015610686575f80fd5b50610495610695366004612e84565b611a04565b3480156106a5575f80fd5b50600b5461031d90600160401b90046001600160a01b031681565b3480156106cb575f80fd5b506104956106da366004613038565b611a66565b3480156106ea575f80fd5b506102f1611acf565b61049561070136600461307c565b611ade565b348015610711575f80fd5b50610495610720366004613190565b611eb8565b348015610730575f80fd5b50600b546102c890600160e01b900460ff1681565b348015610750575f80fd5b506102c861075f366004612e5a565b611ef1565b34801561076f575f80fd5b50600b546102c890600160e81b900460ff1681565b610495610792366004612f62565b611f3b565b3480156107a2575f80fd5b5060145461031d906001600160a01b031681565b3480156107c1575f80fd5b506102f16107d0366004612e2f565b612068565b3480156107e0575f80fd5b5061038860155481565b3480156107f5575f80fd5b50610388612117565b348015610809575f80fd5b506103886108183660046131c7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b34801561084d575f80fd5b506102f161212d565b348015610861575f80fd5b50610495610870366004613038565b61213c565b348015610880575f80fd5b506102c861088f3660046131c7565b612179565b34801561089f575f80fd5b506104956108ae366004613129565b335f908152601360205260409020805460ff1916911515919091179055565b600b545f90600160e01b900460ff1680156108f857506380ac58cd60e01b6001600160e01b03198316145b8061091357506301ffc9a760e01b6001600160e01b03198316145b8061092e57506336372b0760e01b6001600160e01b03198316145b806109495750630a85bd0160e11b6001600160e01b03198316145b806109645750635a46575f60e01b6001600160e01b03198316145b92915050565b606060048054610979906131f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109a5906131f3565b80156109f05780601f106109c7576101008083540402835291602001916109f0565b820191905f5260205f20905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b5f818152600e60205260408120546001600160a01b0316610a19575f80fd5b505f908152600f60205260409020546001600160a01b031690565b5f6009548210158015610a495750600a548211155b15610b09575f828152600e60205260409020546001600160a01b0316338114801590610a7c5750610a7a8133612179565b155b15610ace5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600f6020526040902080546001600160a01b0319166001600160a01b038616179055610aff8185856121a6565b6001915050610964565b335f818152600d602090815260408083206001600160a01b03881684529091529020839055610b399084846121ec565b50600192915050565b6011602052815f5260405f208181548110610b5b575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f6009548210158015610b9e5750600a548211155b15610c1f57336001600160a01b0385161480610bd35750610bbe826109fa565b6001600160a01b0316336001600160a01b0316145b80610be35750610be38433612179565b610bff5760405162461bcd60e51b8152600401610ac59061322b565b610c0a84848461223e565b610c17848460095461230c565b506001610c39565b610c2a843384612360565b610c35848484612414565b5060015b9392505050565b60028054610c4d906131f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c79906131f3565b8015610cc45780601f10610c9b57610100808354040283529160200191610cc4565b820191905f5260205f20905b815481529060010190602001808311610ca757829003601f168201915b505050505081565b600b54600160401b90046001600160a01b03163314610cfd5760405162461bcd60e51b8152600401610ac590613262565b600b546040515f91600160401b90046001600160a01b03169047908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d60575f80fd5b50565b336001600160a01b0384161480610d935750610d7e816109fa565b6001600160a01b0316336001600160a01b0316145b80610da35750610da38333612179565b610dbf5760405162461bcd60e51b8152600401610ac59061322b565b610dca83838361223e565b610dd7838360095461230c565b6001600160a01b0382163b15801590610e7f5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e72919061328d565b6001600160e01b03191614155b15610e9d576040516301d6c93560e61b815260040160405180910390fd5b505050565b5f6006545f14610eea5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610ac5565b60608083806020019051810190610f0191906132f5565b6015819055600782905560175f60148160068180806001610f228c8261341a565b50610f2f90508b8261341a565b508a91905055899d508a9e508b91906101000a8154816001600160a01b0302191690836001600160a01b031602179055508a919050555050505050505050508160049081610f7d919061341a565b506005610f8a828261341a565b50506014546001600160a01b0316905080610fde5760405162461bcd60e51b81526020600482015260146024820152734537343156313a205a45524f5f4144445245535360601b6044820152606401610ac5565b6040516301ffc9a760e01b8152635a46575f60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa925050508015611045575060408051601f3d908101601f19168201909252611042918101906134d9565b60015b6110a65760405162461bcd60e51b815260206004820152602c60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526b70706f72742045524331363560a01b6064820152608401610ac5565b6001600160a01b03821673382edfe4c6168858c81893fe00fcb7b68914d92914806110ce5750805b61112d5760405162461bcd60e51b815260206004820152602a60248201527f54686520756e6465726c79696e6720746f6b656e20646f6573206e6f7420737560448201526970706f7274206537343160b01b6064820152608401610ac5565b505060065461113d90600a6135d9565b600981905560075460019161115291906135e4565b61115c91906135f7565b600a5560095461116e9060019061360a565b600b80546001600160401b039290921667ffffffffffffffff19909216919091179055601680546001600160a01b0319163317905560065460121080159061122057506014546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156111f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121d9190613631565b11155b6112605760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920646563696d616c7360781b6044820152606401610ac5565b5f600754116112a75760405162461bcd60e51b81526020600482015260136024820152721399595908185d081b19585cdd080c481b999d606a1b6044820152606401610ac5565b600560175410156112ee5760405162461bcd60e51b81526020600482015260116024820152704d696e2066656573206f6620302e30352560781b6044820152606401610ac5565b603260175411156113345760405162461bcd60e51b815260206004820152601060248201526f4d61782066656573206f6620302e352560801b6044820152606401610ac5565b600754600954116113915760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610ac5565b50506014546001600160a01b031690565b60038054610c4d906131f3565b600b54600160401b90046001600160a01b031633146113e05760405162461bcd60e51b8152600401610ac590613262565b5f6113eb828261341a565b5050565b80516014546040805163313ce56760e01b815290515f9283926001600160a01b039091169163313ce567916004808201926020929091908290030181865afa15801561143d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190613631565b61146c90600a6135d9565b90508260010361161957601454845133916001600160a01b031690636352211e9087905f9061149d5761149d613648565b60200260200101516040518263ffffffff1660e01b81526004016114c391815260200190565b602060405180830381865afa1580156114de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611502919061365c565b6001600160a01b03161461154b57601554600954855f8151811061152857611528613648565b602002602001015161153a9190613677565b61154491906136a2565b9150611568565b60155460095461155b9083613677565b61156591906136a2565b91505b60145484516001600160a01b03909116906323b872dd903390309088905f9061159357611593613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af11580156115ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161391906134d9565b506116f1565b5f5b838110156116c95760145485516001600160a01b03909116906342842e0e903390309089908690811061165057611650613648565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b1580156116a7575f80fd5b505af11580156116b9573d5f803e3d5ffd5b50506001909201915061161b9050565b506015546009546116da8386613677565b6116e49190613677565b6116ee91906136a2565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01805484929061172b9084906135e4565b925050819055508160085f82825461174391906135e4565b9091555061175490505f3384612414565b6014546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613631565b6007546015546117ce9190613677565b10156118375760405162461bcd60e51b815260206004820152603260248201527f4e465420636170616369747920726561636865642c207761697420666f7220736044820152716f6d656f6e6520746f20776974686472617760701b6064820152608401610ac5565b336001600160a01b03167fe7425730072f5a6ec278ae24c998f6a79299c875cbd84ad35585563a0cb3c66683866040516118729291906136b5565b60405180910390a250505050565b600b54600160401b90046001600160a01b031633146118b15760405162461bcd60e51b8152600401610ac590613262565b600b8054911515600160e81b0260ff60e81b19909216919091179055565b600b54600160401b90046001600160a01b031633146119005760405162461bcd60e51b8152600401610ac590613262565b600b805460ff60e01b198116600160e01b9182900460ff1615909102179055565b5f8054610c4d906131f3565b600b54600160401b90046001600160a01b0316331461195e5760405162461bcd60e51b8152600401610ac590613262565b60026113eb828261341a565b6001600160a01b0381165f908152601160209081526040918290208054835181840281018401909452808452606093928301828280156119f857602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b0316815260200190600801906020826007010492830192600103820291508084116119b55790505b50505050509050919050565b600b54600160401b90046001600160a01b03163314611a355760405162461bcd60e51b8152600401610ac590613262565b600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b600b54600160401b90046001600160a01b03163314611a975760405162461bcd60e51b8152600401610ac590613262565b6001611aa3828261341a565b506040517fa5d4097edda6d87cb9329af83fb3712ef77eeb13738ffe43cc35a4ce305ad962905f90a150565b606060058054610979906131f3565b805180611b2d5760405162461bcd60e51b815260206004820152601a60248201527f547279696e6720746f207769746864726177206e6f7468696e670000000000006044820152606401610ac5565b5f805f60145f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba49190613631565b611baf90600a6135d9565b905083600103611c1857845f81518110611bcb57611bcb613648565b6020908102919091018101515f818152600e909252604090912054909350336001600160a01b0390911603611c04576009549150611c08565b8291505b611c125f84611ef1565b50611cd8565b5f5b84811015611cc757858181518110611c3457611c34613648565b6020908102919091018101515f818152600e9092526040909120549094506001600160a01b03163314611cb45760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920776974686472617720666f72206e66747320796f75206f6044820152613bb760f11b6064820152608401610ac5565b611cbe5f85611ef1565b50600101611c1a565b50600954611cd59085613677565b91505b5f80805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054849290611d129084906135f7565b925050819055508160085f828254611d2a91906135f7565b90915550506009546015545f9190611d429085613677565b611d4c91906136a2565b90505f60185460175483611d609190613677565b611d6a91906136a2565b60145460165460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de291906134d9565b506014546001600160a01b031663a9059cbb33611dff84866135f7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b91906134d9565b50336001600160a01b03167f2384392c42d82ed11db876875a09153a0d3585ff3fc7b9dc12393a232e46b2cf8389604051611ea79291906136b5565b60405180910390a250505050505050565b335f818152600c602090815260408083206001600160a01b03871684529091529020805460ff19168315151790556113eb908383612706565b5f818152600e6020526040812054336001600160a01b0390911603611f3057611f1b33848461223e565b611f28338460095461230c565b506001610964565b610b39338484612414565b336001600160a01b0385161480611f6b5750611f56826109fa565b6001600160a01b0316336001600160a01b0316145b80611f7b5750611f7b8433612179565b611f975760405162461bcd60e51b8152600401610ac59061322b565b611fa284848461223e565b611faf848460095461230c565b6001600160a01b0383163b158015906120445750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290611ff7903390899088908890600401613703565b6020604051808303815f875af1158015612013573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612037919061328d565b6001600160e01b03191614155b15612062576040516301d6c93560e61b815260040160405180910390fd5b50505050565b6060600a548211156120af5760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610ac5565b5f80546120bb906131f3565b90505f036120d657505060408051602081019091525f815290565b5f6120ed600954846120e891906135f7565b61274d565b6002604051602001612101939291906137ae565b6040516020818303038152906040529050919050565b5f6009546007546121289190613677565b905090565b606060018054610979906131f3565b600b54600160401b90046001600160a01b0316331461216d5760405162461bcd60e51b8152600401610ac590613262565b60036113eb828261341a565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161223191815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600e60205260409020546001600160a01b038481169116146122a85760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610ac5565b6001600160401b0381165f908152600f6020908152604080832080546001600160a01b0319908116909155600e90925290912080549091166001600160a01b0384161790556122f8838383612851565b610e9d8383836001600160401b0316612a07565b6001600160a01b0383165f90815260106020526040812080548392906123339084906135f7565b90915550506001600160a01b0382165f908152601060205260409020805482019055610e9d838383612a4d565b6001600160a01b038084165f908152600d60209081526040808320938616835292905220548111156123d45760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610ac5565b6001600160a01b038084165f908152600d602090815260408083209386168352929052908120805483929061240a9084906135f7565b9091555050505050565b6001600160a01b0383165f908152601060205260409020548111156124895760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610ac5565b6009546001600160a01b0384165f9081526010602052604081205490916124af916137e0565b6009546001600160a01b0385165f90815260106020526040812054929350916124d891906137e0565b90506124e585858561230c565b6009546001600160a01b0386165f90815260106020526040812054909161250b916137e0565b6009546001600160a01b0387165f908152601060205260408120549293509161253491906137e0565b6001600160a01b0388165f9081526011602052604081206205e7ec9091529091507f1b6e7c417ed9cfc24ca11cc87b3bdb69a80c713b279159d52af44c081e616a17838610156125935781541561259357612593896205e7ec84612a92565b828511156125c0578054156125b5576125b06205e7ec8983612a92565b6125c0565b6125be88612be2565b505b5f600954886125cf91906136a2565b8354600b5491925090600160e81b900460ff16806125f457506001600160a01b038b16155b8061261657506001600160a01b038a165f9081526013602052604090205460ff165b8061263857506001600160a01b038b165f9081526013602052604090205460ff165b806126575750600b546001600160a01b038c8116600160401b90920416145b1561266e57808210612669578061266b565b815b91505b81156126f9578082106126815780612683565b815b90505f5b818110156126a25761269a8c8c87612a92565b600101612687565b506126ad81836135f7565b835490925090508082106126c157806126c3565b815b90505f5b818110156126e5576126dd6205e7ec8c86612a92565b6001016126c7565b506126f98a6126f483856135f7565b612c8f565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612231911515815260200190565b6060815f036127735750506040805180820190915260018152600360fc1b602082015290565b815f5b811561279c5780612786816137f3565b91506127959050600a836136a2565b9150612776565b5f816001600160401b038111156127b5576127b5612e9f565b6040519080825280601f01601f1916602001820160405280156127df576020820181803683370190505b5090505b8415612849576127f46001836135f7565b9150612801600a866137e0565b61280c90603061380b565b60f81b81838151811061282157612821613648565b60200101906001600160f81b03191690815f1a905350612842600a866136a2565b94506127e3565b949350505050565b6001600160401b0381165f908152601260209081526040808320546001600160a01b03871684526011909252822080549192909190826128926001846135f7565b815481106128a2576128a2613648565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03169050808385815481106128de576128de613648565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b031602179055508280548061292557612925613824565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a0219169055905561295f6001836135f7565b1561297f576001600160401b0381165f9081526012602052604090208490555b6001600160a01b0386165f81815260116020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c16029190911790559290915290546129e391906135f7565b6001600160401b039095165f90815260126020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161223191815260200190565b80545f908290612aa4906001906135f7565b81548110612ab457612ab4613648565b5f918252602080832060048304015460039092166008026101000a9091046001600160401b0316808352600f8252604080842080546001600160a01b0319908116909155600e90935290922080549091166001600160a01b0386161790558254909150829080612b2657612b26613824565b5f828152602080822060045f1990940184810490910180546001600160401b0360086003808616820261010090810a840219909416909455939097556001600160a01b038a16808652601185526040862080546001818101835582895296882098810490980180548b8b169990951690950290920a968702969097021990911694909417905592905254612bba91906135f7565b6001600160401b0382165f818152601260205260409020919091556120629085908590612a07565b600b805467ffffffffffffffff19811660016001600160401b03928316810183169182179093555f818152600e6020908152604080832080546001600160a01b0319166001600160a01b03891690811790915583526011808352818420805486865260128552928520839055908352958101865594825281206004850401805460039095166008026101000a9384021990941692820292909217909255612c8a908383612a07565b919050565b805f03612c9a575050565b80600103612cab57610e9d82612be2565b600b546001600160a01b0383165f908152601160205260408120546001600160401b0390921691905b83811015612d735760019283016001600160401b038181165f818152600e6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560128352818420899055835260118252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093612d6791908790612a07565b60019182019101612cd4565b5050600b805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610d60575f80fd5b5f60208284031215612dc5575f80fd5b8135610c3981612da0565b5f5b83811015612dea578181015183820152602001612dd2565b50505f910152565b5f8151808452612e09816020860160208601612dd0565b601f01601f19169290920160200192915050565b602081525f610c396020830184612df2565b5f60208284031215612e3f575f80fd5b5035919050565b6001600160a01b0381168114610d60575f80fd5b5f8060408385031215612e6b575f80fd5b8235612e7681612e46565b946020939093013593505050565b5f60208284031215612e94575f80fd5b8135610c3981612e46565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715612edb57612edb612e9f565b604052919050565b5f6001600160401b03821115612efb57612efb612e9f565b50601f01601f191660200190565b5f612f1b612f1684612ee3565b612eb3565b9050828152838383011115612f2e575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112612f53575f80fd5b610c3983833560208501612f09565b5f805f8060808587031215612f75575f80fd5b8435612f8081612e46565b93506020850135612f9081612e46565b92506040850135915060608501356001600160401b03811115612fb1575f80fd5b612fbd87828801612f44565b91505092959194509250565b5f805f60608486031215612fdb575f80fd5b8335612fe681612e46565b92506020840135612ff681612e46565b929592945050506040919091013590565b5f60208284031215613017575f80fd5b81356001600160401b0381111561302c575f80fd5b61284984828501612f44565b5f60208284031215613048575f80fd5b81356001600160401b0381111561305d575f80fd5b8201601f8101841361306d575f80fd5b61284984823560208401612f09565b5f602080838503121561308d575f80fd5b82356001600160401b03808211156130a3575f80fd5b818501915085601f8301126130b6575f80fd5b8135818111156130c8576130c8612e9f565b8060051b91506130d9848301612eb3565b81815291830184019184810190888411156130f2575f80fd5b938501935b83851015613110578435825293850193908501906130f7565b98975050505050505050565b8015158114610d60575f80fd5b5f60208284031215613139575f80fd5b8135610c398161311c565b602080825282518282018190525f9190848201906040850190845b818110156131845783516001600160401b03168352928401929184019160010161315f565b50909695505050505050565b5f80604083850312156131a1575f80fd5b82356131ac81612e46565b915060208301356131bc8161311c565b809150509250929050565b5f80604083850312156131d8575f80fd5b82356131e381612e46565b915060208301356131bc81612e46565b600181811c9082168061320757607f821691505b60208210810361322557634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f6020828403121561329d575f80fd5b8151610c3981612da0565b8051612c8a81612e46565b5f82601f8301126132c2575f80fd5b81516132d0612f1682612ee3565b8181528460208386010111156132e4575f80fd5b612849826020830160208701612dd0565b5f805f805f805f805f6101208a8c03121561330e575f80fd5b8951985061331e60208b016132a8565b975060408a01516001600160401b0380821115613339575f80fd5b6133458d838e016132b3565b985060608c015191508082111561335a575f80fd5b6133668d838e016132b3565b975060808c0151965060a08c0151915080821115613382575f80fd5b61338e8d838e016132b3565b955060c08c01519150808211156133a3575f80fd5b506133b08c828d016132b3565b93505060e08a015191506101008a015190509295985092959850929598565b601f821115610e9d57805f5260205f20601f840160051c810160208510156133f45750805b601f840160051c820191505b81811015613413575f8155600101613400565b5050505050565b81516001600160401b0381111561343357613433612e9f565b6134478161344184546131f3565b846133cf565b602080601f83116001811461347a575f84156134635750858301515b5f19600386901b1c1916600185901b1785556134d1565b5f85815260208120601f198616915b828110156134a857888601518255948401946001909101908401613489565b50858210156134c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156134e9575f80fd5b8151610c398161311c565b634e487b7160e01b5f52601160045260245ffd5b600181815b8085111561354257815f1904821115613528576135286134f4565b8085161561353557918102915b93841c939080029061350d565b509250929050565b5f8261355857506001610964565b8161356457505f610964565b8160018114610aff57600281036135915760ff841115613586576135866134f4565b50506001821b610964565b5060208310610133831016604e8410600b84101617156135b4575081810a610964565b6135be8383613508565b805f19048211156135d1576135d16134f4565b029392505050565b5f610c39838361354a565b80820180821115610964576109646134f4565b81810381811115610964576109646134f4565b6001600160401b0382811682821603908082111561362a5761362a6134f4565b5092915050565b5f60208284031215613641575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561366c575f80fd5b8151610c3981612e46565b8082028115828204841417610964576109646134f4565b634e487b7160e01b5f52601260045260245ffd5b5f826136b0576136b061368e565b500490565b5f604082018483526020604060208501528185518084526060860191506020870193505f5b818110156136f6578451835293830193918301916001016136da565b5090979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061373590830184612df2565b9695505050505050565b5f815461374b816131f3565b600182811680156137635760018114613778576137a4565b60ff19841687528215158302870194506137a4565b855f526020805f205f5b8581101561379b5781548a820152908401908201613782565b50505082870194505b5050505092915050565b5f6137b9828661373f565b84516137c9818360208901612dd0565b6137d58183018661373f565b979650505050505050565b5f826137ee576137ee61368e565b500690565b5f60018201613804576138046134f4565b5060010190565b60ff8181168382160190811115610964576109646134f4565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe71664736f6c63430008180033
Deployed Bytecode Sourcemap
28539:5871:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27707:795;;;;;;;;;;-1:-1:-1;27707:795:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27707:795:0;;;;;;;;11357:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26277:180::-;;;;;;;;;;-1:-1:-1;26277:180:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;26277:180:0;1533:203:1;13631:997:0;;;;;;;;;;-1:-1:-1;13631:997:0;;;;;:::i;:::-;;:::i;13171:101::-;;;;;;;;;;-1:-1:-1;13171:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;13245:18:0;13231:4;13245:18;;;:9;:18;;;;;:25;;13171:101;;;;2595:25:1;;;2583:2;2568:18;13171:101:0;2449:177:1;9354:172:0;;;;;;;;;;-1:-1:-1;9354:172:0;;;;;:::i;:::-;-1:-1:-1;;;9354:172:0;;;;;;;;;;-1:-1:-1;;;;;;4632:33:1;;;4614:52;;4602:2;4587:18;9354:172:0;4470:202:1;11609:82:0;;;;;;;;;;-1:-1:-1;11676:12:0;;11609:82;;10678:45;;;;;;;;;;-1:-1:-1;10678:45:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4839:31:1;;;4821:50;;4809:2;4794:18;10678:45:0;4677:200:1;23839:817:0;;;;;;;;;;-1:-1:-1;23839:817:0;;;;;:::i;:::-;;:::i;9860:23::-;;;;;;;;;;;;;:::i;9612:57::-;;;;;;;;;;;;9661:7;9612:57;;11527:76;;;;;;;;;;-1:-1:-1;11591:9:0;;11527:76;;27538:161;;;;;;;;;;;;;:::i;:::-;;24679:654;;;;;;:::i;:::-;;:::i;29139:1769::-;;;;;;;;;;-1:-1:-1;29139:1769:0;;;;;:::i;:::-;;:::i;9737:51::-;;;;;;;;;;;;9784:3;9737:51;;28914:27;;;;;;;;;;-1:-1:-1;28914:27:0;;;;-1:-1:-1;;;;;28914:27:0;;;9890:22;;;;;;;;;;;;;:::i;28948:26::-;;;;;;;;;;;;;;;;10193:20;;;;;;;;;;-1:-1:-1;10193:20:0;;;;-1:-1:-1;;;;;10193:20:0;;;12027:93;;;;;;;;;;-1:-1:-1;12027:93:0;;;;;:::i;:::-;;:::i;30958:1671::-;;;;;;;;;;-1:-1:-1;30958:1671:0;;;;;:::i;:::-;;:::i;10514:50::-;;;;;;;;;;-1:-1:-1;10514:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;10514:50:0;;;13373:134;;;;;;;;;;-1:-1:-1;13373:134:0;;;;;:::i;:::-;;:::i;12957:101::-;;;;;;;;;;;;;:::i;9797:21::-;;;;;;;;;;;;;:::i;11786:104::-;;;;;;;;;;-1:-1:-1;11786:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;11868:19:0;11853:4;11868:19;;;:10;:19;;;;;;;11786:104;12286:109;;;;;;;;;;-1:-1:-1;12286:109:0;;;;;:::i;:::-;;:::i;13064:101::-;;;;;;;;;;-1:-1:-1;13064:101:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12503:75::-;;;;;;;;;;-1:-1:-1;12503:75:0;;;;;:::i;:::-;;:::i;10255:18::-;;;;;;;;;;-1:-1:-1;10255:18:0;;;;-1:-1:-1;;;10255:18:0;;-1:-1:-1;;;;;10255:18:0;;;12126:154;;;;;;;;;;-1:-1:-1;12126:154:0;;;;;:::i;:::-;;:::i;11440:81::-;;;;;;;;;;;;;:::i;32716:1691::-;;;;;;:::i;:::-;;:::i;26465:216::-;;;;;;;;;;-1:-1:-1;26465:216:0;;;;;:::i;:::-;;:::i;10280:32::-;;;;;;;;;;-1:-1:-1;10280:32:0;;;;-1:-1:-1;;;10280:32:0;;;;;;23457:339;;;;;;;;;;-1:-1:-1;23457:339:0;;;;;:::i;:::-;;:::i;10319:37::-;;;;;;;;;;-1:-1:-1;10319:37:0;;;;-1:-1:-1;;;10319:37:0;;;;;;25356:675;;;;;;:::i;:::-;;:::i;28839:28::-;;;;;;;;;;-1:-1:-1;28839:28:0;;;;-1:-1:-1;;;;;28839:28:0;;;26853:284;;;;;;;;;;-1:-1:-1;26853:284:0;;;;;:::i;:::-;;:::i;28874:31::-;;;;;;;;;;;;;;;;11697:83;;;;;;;;;;;;;:::i;11896:125::-;;;;;;;;;;-1:-1:-1;11896:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;11992:17:0;;;11977:4;11992:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;11896:125;13278:89;;;;;;;;;;;;;:::i;12401:96::-;;;;;;;;;;-1:-1:-1;12401:96:0;;;;;:::i;:::-;;:::i;26689:156::-;;;;;;;;;;-1:-1:-1;26689:156:0;;;;;:::i;:::-;;:::i;13514:109::-;;;;;;;;;;-1:-1:-1;13514:109:0;;;;;:::i;:::-;13592:10;13576:27;;;;:15;:27;;;;;:44;;-1:-1:-1;;13576:44:0;;;;;;;;;;13514:109;27707:795;28078:20;;27784:4;;-1:-1:-1;;;28078:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;28102:25:0;;;28078:49;28077:127;;;-1:-1:-1;;;;;;;;;;28179:25:0;;;28077:127;:203;;;-1:-1:-1;;;;;;;;;;28255:25:0;;;28077:203;:278;;;-1:-1:-1;;;;;;;;;;28330:25:0;;;28077:278;:368;;;-1:-1:-1;;;;;;;;;;28420:25:0;;;28077:368;27801:644;27707:795;-1:-1:-1;;27707:795:0:o;11357:77::-;11402:13;11426:5;11419:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11357:77;:::o;26277:180::-;26345:7;26369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26369:16:0;26365:44;;26401:8;;;26365:44;-1:-1:-1;26427:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;26427:22:0;;26277:180::o;13631:997::-;13703:4;13873:3;;13863:6;:13;;:32;;;;;13890:5;;13880:6;:15;;13863:32;13860:449;;;13912:13;13928:15;;;:7;:15;;;;;;-1:-1:-1;;;;;13928:15:0;14018:10;:19;;;;;:59;;;14042:35;14059:5;14066:10;14042:16;:35::i;:::-;14041:36;14018:59;14014:101;;;14079:36;;-1:-1:-1;;;14079:36:0;;9470:2:1;14079:36:0;;;9452:21:1;9509:2;9489:18;;;9482:30;9548:28;9528:18;;;9521:56;9594:18;;14079:36:0;;;;;;;;14014:101;14130:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;14130:31:0;-1:-1:-1;;;;;14130:31:0;;;;;14226:45;14248:5;14130:31;:21;14226;:45::i;:::-;14293:4;14286:11;;;;;13860:449;14509:10;14498:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;14498:31:0;;;;;;;;;:40;;;14549:49;;14521:7;14532:6;14549:20;:49::i;:::-;-1:-1:-1;14616:4:0;13631:997;;;;:::o;10678:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10678:45:0;;:::o;23839:817::-;23925:4;24054:3;;24044:6;:13;;:32;;;;;24071:5;;24061:6;:15;;24044:32;24041:489;;;24233:10;-1:-1:-1;;;;;24233:18:0;;;;:55;;;24269:19;24281:6;24269:11;:19::i;:::-;-1:-1:-1;;;;;24255:33:0;:10;-1:-1:-1;;;;;24255:33:0;;24233:55;:93;;;;24292:34;24309:4;24315:10;24292:16;:34::i;:::-;24093:303;;;;-1:-1:-1;;;24093:303:0;;;;;;;:::i;:::-;24413:38;24426:4;24432:2;24443:6;24413:12;:38::i;:::-;24466:26;24478:4;24484:2;24488:3;;24466:11;:26::i;:::-;-1:-1:-1;24514:4:0;24507:11;;24041:489;24542:41;24558:4;24564:10;24576:6;24542:15;:41::i;:::-;24594:30;24607:4;24613:2;24617:6;24594:12;:30::i;:::-;-1:-1:-1;24642:4:0;23839:817;;;;;;:::o;9860:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27538:161::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;27621:3:::1;::::0;27613:51:::1;::::0;27596:12:::1;::::0;-1:-1:-1;;;27621:3:0;::::1;-1:-1:-1::0;;;;;27621:3:0::1;::::0;27638:21:::1;::::0;27596:12;27613:51;27596:12;27613:51;27638:21;27621:3;27613:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27595:69;;;27683:7;27675:16;;;::::0;::::1;;27584:115;27538:161::o:0;24679:654::-;24809:10;-1:-1:-1;;;;;24809:18:0;;;;:56;;;24845:20;24857:7;24845:11;:20::i;:::-;-1:-1:-1;;;;;24831:34:0;:10;-1:-1:-1;;;;;24831:34:0;;24809:56;:94;;;;24869:34;24886:4;24892:10;24869:16;:34::i;:::-;24783:186;;;;-1:-1:-1;;;24783:186:0;;;;;;;:::i;:::-;24980:39;24993:4;24999:2;25010:7;24980:12;:39::i;:::-;25031:26;25043:4;25049:2;25053:3;;25031:11;:26::i;:::-;-1:-1:-1;;;;;25088:14:0;;;:19;;;;:171;;-1:-1:-1;25124:72:0;;-1:-1:-1;;;25124:72:0;;;25166:10;25124:72;;;10843:34:1;-1:-1:-1;;;;;10913:15:1;;;10893:18;;;10886:43;10945:18;;;10938:34;;;11008:3;10988:18;;;10981:31;-1:-1:-1;11028:19:1;;;11021:30;25213:46:0;;25124:41;;;;25213:46;;11068:19:1;;25124:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25124:135:0;;;25088:171;25070:256;;;25293:21;;-1:-1:-1;;;25293:21:0;;;;;;;;;;;25070:256;24679:654;;;:::o;29139:1769::-;29224:7;29252:9;;29265:1;29252:14;29244:46;;;;-1:-1:-1;;;29244:46:0;;11554:2:1;29244:46:0;;;11536:21:1;11593:2;11573:18;;;11566:30;-1:-1:-1;;;11612:18:1;;;11605:49;11671:18;;29244:46:0;11352:343:1;29244:46:0;29373:24;29413:26;29609:17;29598:88;;;;;;;;;;;;:::i;:::-;29557:19;29454:232;;;29546:9;29454:232;;;29455:14;;29471:13;29455:14;29512:9;29455:14;;;29532:12;29454:232;;29532:12;29454:232;:::i;:::-;-1:-1:-1;29454:232:0;;-1:-1:-1;29454:232:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29454:232:0;;;;;-1:-1:-1;;;;;29454:232:0;;;;;;;;;;;;;;;;;;;;29711:10;29703:5;:18;;;;;;:::i;:::-;-1:-1:-1;29736:7:0;:22;29746:12;29736:7;:22;:::i;:::-;-1:-1:-1;;29814:13:0;;-1:-1:-1;;;;;29814:13:0;;-1:-1:-1;29814:13:0;29842:53;;;;-1:-1:-1;;;29842:53:0;;15996:2:1;29842:53:0;;;15978:21:1;16035:2;16015:18;;;16008:30;-1:-1:-1;;;16054:18:1;;;16047:50;16114:18;;29842:53:0;15794:344:1;29842:53:0;29914:45;;-1:-1:-1;;;29914:45:0;;-1:-1:-1;;;29914:45:0;;;16305:62:1;-1:-1:-1;;;;;29914:33:0;;;;;16278:18:1;;29914:45:0;;;;;;;;;;;;;;;;;;-1:-1:-1;29914:45:0;;;;;;;;-1:-1:-1;;29914:45:0;;;;;;;;;;;;:::i;:::-;;;29910:296;;30136:54;;-1:-1:-1;;;30136:54:0;;16830:2:1;30136:54:0;;;16812:21:1;16869:2;16849:18;;;16842:30;16908:34;16888:18;;;16881:62;-1:-1:-1;;;16959:18:1;;;16952:42;17011:19;;30136:54:0;16628:408:1;29910:296:0;-1:-1:-1;;;;;30014:18:0;;28790:42;30014:18;;:33;;;30036:11;30014:33;30006:88;;;;-1:-1:-1;;;30006:88:0;;17243:2:1;30006:88:0;;;17225:21:1;17282:2;17262:18;;;17255:30;17321:34;17301:18;;;17294:62;-1:-1:-1;;;17372:18:1;;;17365:40;17422:19;;30006:88:0;17041:406:1;30006:88:0;29960:150;-1:-1:-1;30241:9:0;;30235:15;;:2;:15;:::i;:::-;30229:3;:21;;;30275:9;;30287:1;;30269:15;;30275:9;30269:15;:::i;:::-;:19;;;;:::i;:::-;30261:5;:27;30315:3;;30308:15;;30322:1;;30308:15;:::i;:::-;30299:6;:24;;-1:-1:-1;;;;;30299:24:0;;;;-1:-1:-1;;30299:24:0;;;;;;;;;30387:12;:25;;-1:-1:-1;;;;;;30387:25:0;30402:10;30387:25;;;30505:9;;30518:2;-1:-1:-1;30505:15:0;;;:57;;-1:-1:-1;30531:13:0;;30524:32;;;-1:-1:-1;;;30524:32:0;;;;30560:2;;-1:-1:-1;;;;;30531:13:0;;30524:30;;:32;;;;;;;;;;;;;;30531:13;30524:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;30505:57;30497:87;;;;-1:-1:-1;;;30497:87:0;;19794:2:1;30497:87:0;;;19776:21:1;19833:2;19813:18;;;19806:30;-1:-1:-1;;;19852:18:1;;;19845:47;19909:18;;30497:87:0;19592:341:1;30497:87:0;30615:1;30603:9;;:13;30595:45;;;;-1:-1:-1;;;30595:45:0;;20140:2:1;30595:45:0;;;20122:21:1;20179:2;20159:18;;;20152:30;-1:-1:-1;;;20198:18:1;;;20191:49;20257:18;;30595:45:0;19938:343:1;30595:45:0;29067:1;30659:14;;:37;;30651:67;;;;-1:-1:-1;;;30651:67:0;;20488:2:1;30651:67:0;;;20470:21:1;20527:2;20507:18;;;20500:30;-1:-1:-1;;;20546:18:1;;;20539:47;20603:18;;30651:67:0;20286:341:1;30651:67:0;29120:2;30737:14;;:37;;30729:66;;;;-1:-1:-1;;;30729:66:0;;20834:2:1;30729:66:0;;;20816:21:1;20873:2;20853:18;;;20846:30;-1:-1:-1;;;20892:18:1;;;20885:46;20948:18;;30729:66:0;20632:340:1;30729:66:0;30820:9;;30814:3;;:15;30806:61;;;;-1:-1:-1;;;30806:61:0;;21179:2:1;30806:61:0;;;21161:21:1;21218:2;21198:18;;;21191:30;21257:34;21237:18;;;21230:62;-1:-1:-1;;;21308:18:1;;;21301:31;21349:19;;30806:61:0;20977:397:1;30806:61:0;-1:-1:-1;;30887:13:0;;-1:-1:-1;;;;;30887:13:0;;29139:1769::o;9890:22::-;;;;;;;:::i;12027:93::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12098:7:::1;:20;12108:10:::0;12098:7;:20:::1;:::i;:::-;;12027:93:::0;:::o;30958:1671::-;31053:20;;31148:13;;31141:32;;;-1:-1:-1;;;31141:32:0;;;;31041:9;;;;-1:-1:-1;;;;;31148:13:0;;;;31141:30;;:32;;;;;;;;;;;;;;;31148:13;31141:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31135:38;;:2;:38;:::i;:::-;31113:60;;31189:4;31197:1;31189:9;31186:869;;31224:13;;31247:16;;31268:10;;-1:-1:-1;;;;;31224:13:0;;31218:28;;31247:13;;31224;;31247:16;;;;:::i;:::-;;;;;;;31218:46;;;;;;;;;;;;;2595:25:1;;2583:2;2568:18;;2449:177;31218:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31218:60:0;;31215:316;;31369:19;;31362:3;;31343:13;31357:1;31343:16;;;;;;;;:::i;:::-;;;;;;;:22;;;;:::i;:::-;31342:46;;;;:::i;:::-;31326:62;;31215:316;;;31483:19;;31476:3;;31459:20;;:14;:20;:::i;:::-;31458:44;;;;:::i;:::-;31442:60;;31215:316;31632:13;;31687:16;;-1:-1:-1;;;;;31632:13:0;;;;31626:33;;31660:10;;31680:4;;31687:13;;31632;;31687:16;;;;:::i;:::-;;;;;;;;;;;31626:78;;-1:-1:-1;;;;;;31626:78:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31626:78:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31626:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31186:869;;;31750:6;31746:214;31766:4;31762:1;:8;31746:214;;;31868:13;;31927:16;;-1:-1:-1;;;;;31868:13:0;;;;31862:37;;31900:10;;31920:4;;31927:13;;31941:1;;31927:16;;;;;;:::i;:::-;;;;;;;;;;;31862:82;;-1:-1:-1;;;;;;31862:82:0;;;;;;;-1:-1:-1;;;;;22455:15:1;;;31862:82:0;;;22437:34:1;22507:15;;;;22487:18;;;22480:43;22539:18;;;22532:34;22372:18;;31862:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31772:3:0;;;;;-1:-1:-1;31746:214:0;;-1:-1:-1;31746:214:0;;-1:-1:-1;32024:19:0;;32017:3;;31992:21;31999:14;31992:4;:21;:::i;:::-;31991:29;;;;:::i;:::-;31990:53;;;;:::i;:::-;31974:69;;31186:869;32094:27;;;;:10;:27;;;:44;;32125:13;;32094:27;:44;;32125:13;;32094:44;:::i;:::-;;;;;;;;32167:13;32151:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;32193:56:0;;-1:-1:-1;9726:3:0;32223:10;32235:13;32193:12;:56::i;:::-;32460:13;;32453:46;;-1:-1:-1;;;32453:46:0;;32493:4;32453:46;;;1679:51:1;-1:-1:-1;;;;;32460:13:0;;;;32453:31;;1652:18:1;;32453:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32439:9;;32417:19;;:31;;;;:::i;:::-;:82;;32409:145;;;;-1:-1:-1;;;32409:145:0;;22779:2:1;32409:145:0;;;22761:21:1;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;-1:-1:-1;;;22908:18:1;;;22901:48;22966:19;;32409:145:0;22577:414:1;32409:145:0;32580:10;-1:-1:-1;;;;;32572:49:0;;32592:13;32607;32572:49;;;;;;;:::i;:::-;;;;;;;;31028:1601;;;30958:1671;:::o;13373:134::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13464:17:::1;:40:::0;;;::::1;;-1:-1:-1::0;;;13464:40:0::1;-1:-1:-1::0;;;;13464:40:0;;::::1;::::0;;;::::1;::::0;;13373:134::o;12957:101::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;13036:20:::1;::::0;;-1:-1:-1;;;;13012:44:0;::::1;-1:-1:-1::0;;;13036:20:0;;;::::1;;;13035:21;13012:44:::0;;::::1;;::::0;;12957:101::o;9797:21::-;;;;;;;:::i;12286:109::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12369:9:::1;:24;12381:12:::0;12369:9;:24:::1;:::i;13064:101::-:0;-1:-1:-1;;;;;13147:16:0;;;;;;:9;:16;;;;;;;;;13140:23;;;;;;;;;;;;;;;;;13123:15;;13140:23;;;13147:16;13140:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13140:23:0;-1:-1:-1;;;;;13140:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13064:101;;;:::o;12503:75::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12564:3:::1;:12:::0;;-1:-1:-1;;;;;12564:12:0;;::::1;-1:-1:-1::0;;;12564:12:0::1;-1:-1:-1::0;;;;;;12564:12:0;;::::1;::::0;;;::::1;::::0;;12503:75::o;12126:154::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12213:12:::1;:29;12228:14:::0;12213:12;:29:::1;:::i;:::-;-1:-1:-1::0;12249:29:0::1;::::0;::::1;::::0;;;::::1;12126:154:::0;:::o;11440:81::-;11487:13;11511:7;11504:14;;;;;:::i;32716:1691::-;32829:23;;32871:13;32863:52;;;;-1:-1:-1;;;32863:52:0;;23906:2:1;32863:52:0;;;23888:21:1;23945:2;23925:18;;;23918:30;23984:28;23964:18;;;23957:56;24030:18;;32863:52:0;23704:350:1;32863:52:0;32928:15;32945:18;32974:19;33009:13;;;;;;;;;-1:-1:-1;;;;;33009:13:0;-1:-1:-1;;;;;33002:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32996:38;;:2;:38;:::i;:::-;32974:60;;33051:9;33064:1;33051:14;33047:749;;33095:16;33112:1;33095:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33133;;;;:7;:19;;;;;;;;33095;;-1:-1:-1;33156:10:0;-1:-1:-1;;;;;33133:19:0;;;:33;33129:198;;33203:3;;33187:19;;33129:198;;;33301:10;33285:26;;33129:198;33341:37;9726:3;33367:10;33341:8;:37::i;:::-;;33047:749;;;33415:6;33411:290;33431:9;33427:1;:13;33411:290;;;33475:16;33492:1;33475:19;;;;;;;;:::i;:::-;;;;;;;;;;;;33521;;;;:7;:19;;;;;;;;33475;;-1:-1:-1;;;;;;33521:19:0;33544:10;33521:33;33513:80;;;;-1:-1:-1;;;33513:80:0;;24261:2:1;33513:80:0;;;24243:21:1;24300:2;24280:18;;;24273:30;24339:34;24319:18;;;24312:62;-1:-1:-1;;;24390:18:1;;;24383:32;24432:19;;33513:80:0;24059:398:1;33513:80:0;33612:37;9726:3;33638:10;33612:8;:37::i;:::-;-1:-1:-1;33680:3:0;;33411:290;;;-1:-1:-1;33743:3:0;;33731:15;;:9;:15;:::i;:::-;33715:31;;33047:749;33836:27;;;;:10;:27;;;:44;;33867:13;;33836:27;:44;;33867:13;;33836:44;:::i;:::-;;;;;;;;33907:13;33891:12;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;34000:3:0;;33977:19;;33933:24;;34000:3;33961:35;;:13;:35;:::i;:::-;33960:43;;;;:::i;:::-;33933:70;;34044:25;34113:21;;34095:14;;34073:19;:36;;;;:::i;:::-;34072:62;;;;:::i;:::-;34153:13;;34177:12;;34147:65;;-1:-1:-1;;;34147:65:0;;-1:-1:-1;;;;;34177:12:0;;;34147:65;;;24636:51:1;24703:18;;;24696:34;;;34044:90:0;;-1:-1:-1;34153:13:0;;34147:29;;24609:18:1;;34147:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34239:13:0;;-1:-1:-1;;;;;34239:13:0;34233:29;34263:10;34276:42;34298:20;34276:19;:42;:::i;:::-;34233:87;;-1:-1:-1;;;;;;34233:87:0;;;;;;;-1:-1:-1;;;;;24654:32:1;;;34233:87:0;;;24636:51:1;24703:18;;;24696:34;24609:18;;34233:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34349:10;-1:-1:-1;;;;;34338:61:0;;34361:19;34382:16;34338:61;;;;;;;:::i;:::-;;;;;;;;32801:1606;;;;;;32716:1691;:::o;26465:216::-;26571:10;26552:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;26552:40:0;;;;;;;;;:51;;-1:-1:-1;;26552:51:0;;;;;;;26614:59;;26552:40;:51;26614:27;:59::i;23457:339::-;23525:4;23545:15;;;:7;:15;;;;;;23564:10;-1:-1:-1;;;;;23545:15:0;;;:29;23542:178;;23591:44;23604:10;23616:2;23627:6;23591:12;:44::i;:::-;23650:32;23662:10;23674:2;23678:3;;23650:11;:32::i;:::-;-1:-1:-1;23704:4:0;23697:11;;23542:178;23730:36;23743:10;23755:2;23759:6;23730:12;:36::i;25356:675::-;25505:10;-1:-1:-1;;;;;25505:18:0;;;;:56;;;25541:20;25553:7;25541:11;:20::i;:::-;-1:-1:-1;;;;;25527:34:0;:10;-1:-1:-1;;;;;25527:34:0;;25505:56;:94;;;;25565:34;25582:4;25588:10;25565:16;:34::i;:::-;25479:186;;;;-1:-1:-1;;;25479:186:0;;;;;;;:::i;:::-;25676:39;25689:4;25695:2;25706:7;25676:12;:39::i;:::-;25727:26;25739:4;25745:2;25749:3;;25727:11;:26::i;:::-;-1:-1:-1;;;;;25784:14:0;;;:19;;;;:173;;-1:-1:-1;25820:74:0;;-1:-1:-1;;;25820:74:0;;;25911:46;-1:-1:-1;;;;;25820:41:0;;;25911:46;;25820:74;;25862:10;;25874:4;;25880:7;;25889:4;;25820:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25820:137:0;;;25784:173;25766:258;;;25991:21;;-1:-1:-1;;;25991:21:0;;;;;;;;;;;25766:258;25356:675;;;;:::o;26853:284::-;26917:13;26962:5;;26951:7;:16;;26943:45;;;;-1:-1:-1;;;26943:45:0;;25437:2:1;26943:45:0;;;25419:21:1;25476:2;25456:18;;;25449:30;-1:-1:-1;;;25495:18:1;;;25488:46;25551:18;;26943:45:0;25235:340:1;26943:45:0;27009:7;27003:21;;;;;:::i;:::-;;;27028:1;27003:26;26999:44;;-1:-1:-1;;27032:9:0;;;;;;;;;-1:-1:-1;27032:9:0;;;26853:284::o;26999:44::-;27084:7;27093:23;27112:3;;27102:7;:13;;;;:::i;:::-;27093:8;:23::i;:::-;27118:9;27067:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27053:76;;26853:284;;;:::o;11697:83::-;11747:4;11774:3;;11762:9;;:15;;;;:::i;:::-;11755:22;;11697:83;:::o;13278:89::-;13330:13;13353:12;13346:19;;;;;:::i;12401:96::-;10998:3;;-1:-1:-1;;;10998:3:0;;-1:-1:-1;;;;;10998:3:0;10984:10;:17;10976:47;;;;-1:-1:-1;;;10976:47:0;;;;;;;:::i;:::-;12473:8:::1;:22;12484:11:::0;12473:8;:22:::1;:::i;26689:156::-:0;-1:-1:-1;;;;;26802:25:0;;;26778:4;26802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26689:156::o;5201:126::-;5315:8;5305;-1:-1:-1;;;;;5288:36:0;5297:6;-1:-1:-1;;;;;5288:36:0;;;;;;;;;;;5201:126;;;:::o;4633:122::-;4735:8;-1:-1:-1;;;;;4718:34:0;4727:6;-1:-1:-1;;;;;4718:34:0;;4745:6;4718:34;;;;2595:25:1;;2583:2;2568:18;;2449:177;4718:34:0;;;;;;;;4633:122;;;:::o;21926:529::-;-1:-1:-1;;;;;22034:16:0;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;22026:24:0;;;22034:16;;22026:24;22018:58;;;;-1:-1:-1;;;22018:58:0;;26984:2:1;22018:58:0;;;26966:21:1;27023:2;27003:18;;;26996:30;-1:-1:-1;;;27042:18:1;;;27035:51;27103:18;;22018:58:0;26782:345:1;22018:58:0;-1:-1:-1;;;;;22142:22:0;;;;;;:13;:22;;;;;;;;22135:29;;-1:-1:-1;;;;;;22135:29:0;;;;;;22213:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22213:21:0;;;;;22288:35;22305:4;22213:21;22142:22;22288:16;:35::i;:::-;22374:40;22396:4;22402:2;22406:7;-1:-1:-1;;;;;22374:40:0;:21;:40::i;21463:361::-;-1:-1:-1;;;;;21546:16:0;;;;;;:10;:16;;;;;:26;;21566:6;;21546:16;:26;;21566:6;;21546:26;:::i;:::-;;;;-1:-1:-1;;;;;;;21655:14:0;;;;;;:10;:14;;;;;:24;;;;;;21746:38;21767:4;21666:2;21673:6;21746:20;:38::i;26039:230::-;-1:-1:-1;;;;;26145:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;26145:36:0;26137:77;;;;-1:-1:-1;;;26137:77:0;;27334:2:1;26137:77:0;;;27316:21:1;27373:2;27353:18;;;27346:30;27412;27392:18;;;27385:58;27460:18;;26137:77:0;27132:352:1;26137:77:0;-1:-1:-1;;;;;26225:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;26255:6;;26225:17;:36;;26255:6;;26225:36;:::i;:::-;;;;-1:-1:-1;;;;;26039:230:0:o;14636:3875::-;-1:-1:-1;;;;;14743:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;14743:26:0;14735:76;;;;-1:-1:-1;;;14735:76:0;;27691:2:1;14735:76:0;;;27673:21:1;27730:2;27710:18;;;27703:30;27769:34;27749:18;;;27742:62;-1:-1:-1;;;27820:18:1;;;27813:35;27865:19;;14735:76:0;27489:401:1;14735:76:0;14974:3;;-1:-1:-1;;;;;14955:16:0;;14929:23;14955:16;;;:10;:16;;;;;;14929:23;;14955:22;;;:::i;:::-;15029:3;;-1:-1:-1;;;;;15012:14:0;;14988:21;15012:14;;;:10;:14;;;;;;14929:48;;-1:-1:-1;14988:21:0;15012:20;;15029:3;15012:20;:::i;:::-;14988:44;;15097:29;15109:4;15115:2;15119:6;15097:11;:29::i;:::-;15274:3;;-1:-1:-1;;;;;15255:16:0;;15228:24;15255:16;;;:10;:16;;;;;;15228:24;;15255:22;;;:::i;:::-;15330:3;;-1:-1:-1;;;;;15313:14:0;;15288:22;15313:14;;;:10;:14;;;;;;15228:49;;-1:-1:-1;15288:22:0;15313:20;;15330:3;15313:20;:::i;:::-;-1:-1:-1;;;;;15470:15:0;;15436:31;15470:15;;;:9;:15;;;;;9661:7;15615:25;;;15288:45;;-1:-1:-1;15615:25:0;15773:34;;;15769:384;;;15829:21;;:25;15826:316;;16006:53;16022:4;9661:7;16044:14;16006:15;:53::i;:::-;16299:14;16283:13;:30;16279:308;;;16335:21;;:25;16332:230;;16417:51;9661:7;16449:2;16453:14;16417:15;:51::i;:::-;16332:230;;;16537:9;16543:2;16537:5;:9::i;:::-;;16332:230;16684:19;16715:3;;16706:6;:12;;;;:::i;:::-;16742:21;;17157:17;;16684:34;;-1:-1:-1;16742:21:0;-1:-1:-1;;;17157:17:0;;;;;:44;;-1:-1:-1;;;;;;17178:23:0;;;17157:44;:67;;;-1:-1:-1;;;;;;17205:19:0;;;;;;:15;:19;;;;;;;;17157:67;:92;;;-1:-1:-1;;;;;;17228:21:0;;;;;;:15;:21;;;;;;;;17157:92;:107;;;-1:-1:-1;17261:3:0;;-1:-1:-1;;;;;17253:11:0;;;-1:-1:-1;;;17261:3:0;;;;17253:11;17157:107;17154:305;;;17421:3;17404:14;:20;:43;;17444:3;17404:43;;;17427:14;17404:43;17387:60;;17154:305;17474:18;;17471:1033;;17546:3;17529:14;:20;:43;;17569:3;17529:43;;;17552:14;17529:43;17523:49;;17815:6;17810:108;17831:3;17827:1;:7;17810:108;;;17860:41;17876:4;17882:2;17886:14;17860:15;:41::i;:::-;17836:3;;17810:108;;;-1:-1:-1;17932:21:0;17950:3;17932:21;;:::i;:::-;17974;;17932;;-1:-1:-1;17974:21:0;-1:-1:-1;18016:20:0;;;:43;;18056:3;18016:43;;;18039:14;18016:43;18010:49;;18318:6;18313:125;18334:3;18330:1;:7;18313:125;;;18371:51;9661:7;18403:2;18407:14;18371:15;:51::i;:::-;18339:3;;18313:125;;;-1:-1:-1;18454:36:0;18465:2;18469:20;18486:3;18469:14;:20;:::i;:::-;18454:10;:36::i;:::-;14714:3797;;;;;;;;14636:3875;;;:::o;5333:142::-;5451:9;-1:-1:-1;;;;;5428:44:0;5443:6;-1:-1:-1;;;;;5428:44:0;;5462:9;5428:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;27145:385:0;27201:13;27231:5;27240:1;27231:10;27227:29;;-1:-1:-1;;27244:10:0;;;;;;;;;;;;-1:-1:-1;;;27244:10:0;;;;;27145:385::o;27227:29::-;27272:5;27257:12;27304:41;27311:9;;27304:41;;27323:8;;;;:::i;:::-;;-1:-1:-1;27333:10:0;;-1:-1:-1;27341:2:0;27333:10;;:::i;:::-;;;27304:41;;;27346:19;27378:6;-1:-1:-1;;;;;27368:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27368:17:0;;27346:39;;27396:95;27403:10;;27396:95;;27416:11;27426:1;27416:11;;:::i;:::-;;-1:-1:-1;27459:10:0;27467:2;27459:5;:10;:::i;:::-;27453:22;;27473:2;27453:22;:::i;:::-;27446:30;;27429:6;27436;27429:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;27429:47:0;;;;;;;;-1:-1:-1;27478:11:0;27487:2;27478:11;;:::i;:::-;;;27396:95;;;27515:6;27145:385;-1:-1:-1;;;;27145:385:0:o;20362:1045::-;-1:-1:-1;;;;;20467:18:0;;20451:13;20467:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;20578:15:0;;;;:9;:15;;;;;20667;;20467:18;;20578:15;;20667;20578;20765:7;20771:1;20667:15;20765:7;:::i;:::-;20756:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20756:17:0;20735:38;;20877:11;20859:8;20868:5;20859:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;20859:29:0;;;;;-1:-1:-1;;;;;20859:29:0;;;;;;20965:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;20965:14:0;;;;;;;;;-1:-1:-1;;;;;20965:14:0;;;;;;;;;;;;;;21086:7;20965:14;21086:3;:7;:::i;:::-;:12;21083:115;;-1:-1:-1;;;;;21115:22:0;;;;;;:9;:22;;;;;:30;;;21083:115;-1:-1:-1;;;;;21215:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21215:27:0;;;;;;;;;;;;;;;;;21321:13;;;;:20;;:24;;21215:27;21321:24;:::i;:::-;-1:-1:-1;;;;;21300:18:0;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;20362:1045:0:o;5081:114::-;5183:8;5178:3;-1:-1:-1;;;;;5162:30:0;5171:5;-1:-1:-1;;;;;5162:30:0;;;;;;;;;;;5081:114;;;:::o;4515:112::-;4611:3;-1:-1:-1;;;;;4595:29:0;4604:5;-1:-1:-1;;;;;4595:29:0;;4616:7;4595:29;;;;2595:25:1;;2583:2;2568:18;;2449:177;22557:768:0;22689:15;;22663:14;;22680:8;;22689:19;;22707:1;;22689:19;:::i;:::-;22680:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22680:29:0;22737:22;;;:13;:22;;;;;;22730:29;;-1:-1:-1;;;;;;22730:29:0;;;;;;22808:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;22808:21:0;;;;;22935:14;;22680:29;;-1:-1:-1;22935:14:0;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;22935:14:0;;;;;;;;;;;-1:-1:-1;;;;;22935:14:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23047:13:0;;;;;:9;:13;;;;;:27;;22935:14;23047:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:13;;;:20;:24;;22935:14;23153:24;:::i;:::-;-1:-1:-1;;;;;23132:18:0;;;;;;:9;:18;;;;;:45;;;;23244:40;;23266:4;;23272:2;;23244:21;:40::i;19626:632::-;19729:6;:8;;-1:-1:-1;;19729:8:0;;;-1:-1:-1;;;;;19729:8:0;;;;;;;;;;;;;-1:-1:-1;19871:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;19871:21:0;-1:-1:-1;;;;;19871:21:0;;;;;;;;19966:13;;:9;:13;;;;;;:20;;19945:18;;;:9;:18;;;;;:41;;;20054:13;;;:27;;;;;;;;;;;;;;;;;;;;;;19729:8;20054:27;;;;;;;;;;;;;;;;;;20162:48;;19871:21;19729:8;20162:21;:48::i;:::-;19626:632;;;:::o;18519:1097::-;18598:6;18608:1;18598:11;18595:23;;18519:1097;;:::o;18595:23::-;18660:6;18670:1;18660:11;18657:105;;18720:9;18726:2;18720:5;:9::i;18657:105::-;18784:6;;-1:-1:-1;;;;;18855:13:0;;18772:9;18855:13;;;:9;:13;;;;;:20;-1:-1:-1;;;;;18784:6:0;;;;18855:20;18926:583;18946:6;18942:1;:10;18926:583;;;18999:4;;;;-1:-1:-1;;;;;19066:11:0;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;19066:16:0;-1:-1:-1;;;;;19066:16:0;;;;;;;;19125:9;:13;;;;;:24;;;19208:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;19066:16;19208:22;;;;;;;;;;;;;;;;;;18999:4;;19281:43;;19066:11;:16;;19281:21;:43::i;:::-;19397:10;;;;;19459:3;18926:583;;;-1:-1:-1;;19544:6:0;:24;;-1:-1:-1;;19544:24:0;;-1:-1:-1;;;;;19544:24:0;;;;;;;;;;;;;;;-1:-1:-1;;18519:1097:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2197:247::-;2256:6;2309:2;2297:9;2288:7;2284:23;2280:32;2277:52;;;2325:1;2322;2315:12;2277:52;2364:9;2351:23;2383:31;2408:5;2383:31;:::i;2631:127::-;2692:10;2687:3;2683:20;2680:1;2673:31;2723:4;2720:1;2713:15;2747:4;2744:1;2737:15;2763:275;2834:2;2828:9;2899:2;2880:13;;-1:-1:-1;;2876:27:1;2864:40;;-1:-1:-1;;;;;2919:34:1;;2955:22;;;2916:62;2913:88;;;2981:18;;:::i;:::-;3017:2;3010:22;2763:275;;-1:-1:-1;2763:275:1:o;3043:186::-;3091:4;-1:-1:-1;;;;;3116:6:1;3113:30;3110:56;;;3146:18;;:::i;:::-;-1:-1:-1;3212:2:1;3191:15;-1:-1:-1;;3187:29:1;3218:4;3183:40;;3043:186::o;3234:336::-;3298:5;3327:52;3343:35;3371:6;3343:35;:::i;:::-;3327:52;:::i;:::-;3318:61;;3402:6;3395:5;3388:21;3442:3;3433:6;3428:3;3424:16;3421:25;3418:45;;;3459:1;3456;3449:12;3418:45;3508:6;3503:3;3496:4;3489:5;3485:16;3472:43;3562:1;3555:4;3546:6;3539:5;3535:18;3531:29;3524:40;3234:336;;;;;:::o;3575:220::-;3617:5;3670:3;3663:4;3655:6;3651:17;3647:27;3637:55;;3688:1;3685;3678:12;3637:55;3710:79;3785:3;3776:6;3763:20;3756:4;3748:6;3744:17;3710:79;:::i;3800:665::-;3895:6;3903;3911;3919;3972:3;3960:9;3951:7;3947:23;3943:33;3940:53;;;3989:1;3986;3979:12;3940:53;4028:9;4015:23;4047:31;4072:5;4047:31;:::i;:::-;4097:5;-1:-1:-1;4154:2:1;4139:18;;4126:32;4167:33;4126:32;4167:33;:::i;:::-;4219:7;-1:-1:-1;4273:2:1;4258:18;;4245:32;;-1:-1:-1;4328:2:1;4313:18;;4300:32;-1:-1:-1;;;;;4344:30:1;;4341:50;;;4387:1;4384;4377:12;4341:50;4410:49;4451:7;4442:6;4431:9;4427:22;4410:49;:::i;:::-;4400:59;;;3800:665;;;;;;;:::o;4882:456::-;4959:6;4967;4975;5028:2;5016:9;5007:7;5003:23;4999:32;4996:52;;;5044:1;5041;5034:12;4996:52;5083:9;5070:23;5102:31;5127:5;5102:31;:::i;:::-;5152:5;-1:-1:-1;5209:2:1;5194:18;;5181:32;5222:33;5181:32;5222:33;:::i;:::-;4882:456;;5274:7;;-1:-1:-1;;;5328:2:1;5313:18;;;;5300:32;;4882:456::o;5343:320::-;5411:6;5464:2;5452:9;5443:7;5439:23;5435:32;5432:52;;;5480:1;5477;5470:12;5432:52;5520:9;5507:23;-1:-1:-1;;;;;5545:6:1;5542:30;5539:50;;;5585:1;5582;5575:12;5539:50;5608:49;5649:7;5640:6;5629:9;5625:22;5608:49;:::i;5668:450::-;5737:6;5790:2;5778:9;5769:7;5765:23;5761:32;5758:52;;;5806:1;5803;5796:12;5758:52;5846:9;5833:23;-1:-1:-1;;;;;5871:6:1;5868:30;5865:50;;;5911:1;5908;5901:12;5865:50;5934:22;;5987:4;5979:13;;5975:27;-1:-1:-1;5965:55:1;;6016:1;6013;6006:12;5965:55;6039:73;6104:7;6099:2;6086:16;6081:2;6077;6073:11;6039:73;:::i;6123:946::-;6207:6;6238:2;6281;6269:9;6260:7;6256:23;6252:32;6249:52;;;6297:1;6294;6287:12;6249:52;6337:9;6324:23;-1:-1:-1;;;;;6407:2:1;6399:6;6396:14;6393:34;;;6423:1;6420;6413:12;6393:34;6461:6;6450:9;6446:22;6436:32;;6506:7;6499:4;6495:2;6491:13;6487:27;6477:55;;6528:1;6525;6518:12;6477:55;6564:2;6551:16;6586:2;6582;6579:10;6576:36;;;6592:18;;:::i;:::-;6638:2;6635:1;6631:10;6621:20;;6661:28;6685:2;6681;6677:11;6661:28;:::i;:::-;6723:15;;;6793:11;;;6789:20;;;6754:12;;;;6821:19;;;6818:39;;;6853:1;6850;6843:12;6818:39;6877:11;;;;6897:142;6913:6;6908:3;6905:15;6897:142;;;6979:17;;6967:30;;6930:12;;;;7017;;;;6897:142;;;7058:5;6123:946;-1:-1:-1;;;;;;;;6123:946:1:o;7074:118::-;7160:5;7153:13;7146:21;7139:5;7136:32;7126:60;;7182:1;7179;7172:12;7197:241;7253:6;7306:2;7294:9;7285:7;7281:23;7277:32;7274:52;;;7322:1;7319;7312:12;7274:52;7361:9;7348:23;7380:28;7402:5;7380:28;:::i;7443:655::-;7612:2;7664:21;;;7734:13;;7637:18;;;7756:22;;;7583:4;;7612:2;7835:15;;;;7809:2;7794:18;;;7583:4;7878:194;7892:6;7889:1;7886:13;7878:194;;;7957:13;;-1:-1:-1;;;;;7953:38:1;7941:51;;8047:15;;;;8012:12;;;;7914:1;7907:9;7878:194;;;-1:-1:-1;8089:3:1;;7443:655;-1:-1:-1;;;;;;7443:655:1:o;8103:382::-;8168:6;8176;8229:2;8217:9;8208:7;8204:23;8200:32;8197:52;;;8245:1;8242;8235:12;8197:52;8284:9;8271:23;8303:31;8328:5;8303:31;:::i;:::-;8353:5;-1:-1:-1;8410:2:1;8395:18;;8382:32;8423:30;8382:32;8423:30;:::i;:::-;8472:7;8462:17;;;8103:382;;;;;:::o;8490:388::-;8558:6;8566;8619:2;8607:9;8598:7;8594:23;8590:32;8587:52;;;8635:1;8632;8625:12;8587:52;8674:9;8661:23;8693:31;8718:5;8693:31;:::i;:::-;8743:5;-1:-1:-1;8800:2:1;8785:18;;8772:32;8813:33;8772:32;8813:33;:::i;8883:380::-;8962:1;8958:12;;;;9005;;;9026:61;;9080:4;9072:6;9068:17;9058:27;;9026:61;9133:2;9125:6;9122:14;9102:18;9099:38;9096:161;;9179:10;9174:3;9170:20;9167:1;9160:31;9214:4;9211:1;9204:15;9242:4;9239:1;9232:15;9096:161;;8883:380;;;:::o;9623:354::-;9825:2;9807:21;;;9864:2;9844:18;;;9837:30;9903:32;9898:2;9883:18;;9876:60;9968:2;9953:18;;9623:354::o;9982:341::-;10184:2;10166:21;;;10223:2;10203:18;;;10196:30;-1:-1:-1;;;10257:2:1;10242:18;;10235:47;10314:2;10299:18;;9982:341::o;11098:249::-;11167:6;11220:2;11208:9;11199:7;11195:23;11191:32;11188:52;;;11236:1;11233;11226:12;11188:52;11268:9;11262:16;11287:30;11311:5;11287:30;:::i;11700:146::-;11787:13;;11809:31;11787:13;11809:31;:::i;11851:442::-;11905:5;11958:3;11951:4;11943:6;11939:17;11935:27;11925:55;;11976:1;11973;11966:12;11925:55;12005:6;11999:13;12036:48;12052:31;12080:2;12052:31;:::i;12036:48::-;12109:2;12100:7;12093:19;12155:3;12148:4;12143:2;12135:6;12131:15;12127:26;12124:35;12121:55;;;12172:1;12169;12162:12;12121:55;12185:77;12259:2;12252:4;12243:7;12239:18;12232:4;12224:6;12220:17;12185:77;:::i;12298:1321::-;12488:6;12496;12504;12512;12520;12528;12536;12544;12552;12605:3;12593:9;12584:7;12580:23;12576:33;12573:53;;;12622:1;12619;12612:12;12573:53;12651:9;12645:16;12635:26;;12680:57;12733:2;12722:9;12718:18;12680:57;:::i;:::-;12670:67;;12781:2;12770:9;12766:18;12760:25;-1:-1:-1;;;;;12845:2:1;12837:6;12834:14;12831:34;;;12861:1;12858;12851:12;12831:34;12884:61;12937:7;12928:6;12917:9;12913:22;12884:61;:::i;:::-;12874:71;;12991:2;12980:9;12976:18;12970:25;12954:41;;13020:2;13010:8;13007:16;13004:36;;;13036:1;13033;13026:12;13004:36;13059:63;13114:7;13103:8;13092:9;13088:24;13059:63;:::i;:::-;13049:73;;13162:3;13151:9;13147:19;13141:26;13131:36;;13213:3;13202:9;13198:19;13192:26;13176:42;;13243:2;13233:8;13230:16;13227:36;;;13259:1;13256;13249:12;13227:36;13282:63;13337:7;13326:8;13315:9;13311:24;13282:63;:::i;:::-;13272:73;;13391:3;13380:9;13376:19;13370:26;13354:42;;13421:2;13411:8;13408:16;13405:36;;;13437:1;13434;13427:12;13405:36;;13460:63;13515:7;13504:8;13493:9;13489:24;13460:63;:::i;:::-;13450:73;;;13563:3;13552:9;13548:19;13542:26;13532:36;;13608:3;13597:9;13593:19;13587:26;13577:36;;12298:1321;;;;;;;;;;;:::o;13750:518::-;13852:2;13847:3;13844:11;13841:421;;;13888:5;13885:1;13878:16;13932:4;13929:1;13919:18;14002:2;13990:10;13986:19;13983:1;13979:27;13973:4;13969:38;14038:4;14026:10;14023:20;14020:47;;;-1:-1:-1;14061:4:1;14020:47;14116:2;14111:3;14107:12;14104:1;14100:20;14094:4;14090:31;14080:41;;14171:81;14189:2;14182:5;14179:13;14171:81;;;14248:1;14234:16;;14215:1;14204:13;14171:81;;;14175:3;;13750:518;;;:::o;14444:1345::-;14570:3;14564:10;-1:-1:-1;;;;;14589:6:1;14586:30;14583:56;;;14619:18;;:::i;:::-;14648:97;14738:6;14698:38;14730:4;14724:11;14698:38;:::i;:::-;14692:4;14648:97;:::i;:::-;14800:4;;14857:2;14846:14;;14874:1;14869:663;;;;15576:1;15593:6;15590:89;;;-1:-1:-1;15645:19:1;;;15639:26;15590:89;-1:-1:-1;;14401:1:1;14397:11;;;14393:24;14389:29;14379:40;14425:1;14421:11;;;14376:57;15692:81;;14839:944;;14869:663;13697:1;13690:14;;;13734:4;13721:18;;-1:-1:-1;;14905:20:1;;;15023:236;15037:7;15034:1;15031:14;15023:236;;;15126:19;;;15120:26;15105:42;;15218:27;;;;15186:1;15174:14;;;;15053:19;;15023:236;;;15027:3;15287:6;15278:7;15275:19;15272:201;;;15348:19;;;15342:26;-1:-1:-1;;15431:1:1;15427:14;;;15443:3;15423:24;15419:37;15415:42;15400:58;15385:74;;15272:201;;;15519:1;15510:6;15507:1;15503:14;15499:22;15493:4;15486:36;14839:944;;;;;14444:1345;;:::o;16378:245::-;16445:6;16498:2;16486:9;16477:7;16473:23;16469:32;16466:52;;;16514:1;16511;16504:12;16466:52;16546:9;16540:16;16565:28;16587:5;16565:28;:::i;17452:127::-;17513:10;17508:3;17504:20;17501:1;17494:31;17544:4;17541:1;17534:15;17568:4;17565:1;17558:15;17584:416;17673:1;17710:5;17673:1;17724:270;17745:7;17735:8;17732:21;17724:270;;;17804:4;17800:1;17796:6;17792:17;17786:4;17783:27;17780:53;;;17813:18;;:::i;:::-;17863:7;17853:8;17849:22;17846:55;;;17883:16;;;;17846:55;17962:22;;;;17922:15;;;;17724:270;;;17728:3;17584:416;;;;;:::o;18005:806::-;18054:5;18084:8;18074:80;;-1:-1:-1;18125:1:1;18139:5;;18074:80;18173:4;18163:76;;-1:-1:-1;18210:1:1;18224:5;;18163:76;18255:4;18273:1;18268:59;;;;18341:1;18336:130;;18248:218;18336:130;18373:3;18363:8;18360:17;18357:43;;;18380:18;;:::i;:::-;-1:-1:-1;;18436:1:1;18422:16;;18451:5;;18248:218;;18550:2;18540:8;18537:16;18531:3;18525:4;18522:13;18518:36;18512:2;18502:8;18499:16;18494:2;18488:4;18485:12;18481:35;18478:77;18475:159;;;-1:-1:-1;18587:19:1;;;18619:5;;18475:159;18666:34;18691:8;18685:4;18666:34;:::i;:::-;18736:6;18732:1;18728:6;18724:19;18715:7;18712:32;18709:58;;;18747:18;;:::i;:::-;18785:20;;18005:806;-1:-1:-1;;;18005:806:1:o;18816:131::-;18876:5;18905:36;18932:8;18926:4;18905:36;:::i;18952:125::-;19017:9;;;19038:10;;;19035:36;;;19051:18;;:::i;19082:128::-;19149:9;;;19170:11;;;19167:37;;;19184:18;;:::i;19215:183::-;-1:-1:-1;;;;;19334:10:1;;;19322;;;19318:27;;19357:12;;;19354:38;;;19372:18;;:::i;:::-;19354:38;19215:183;;;;:::o;19403:184::-;19473:6;19526:2;19514:9;19505:7;19501:23;19497:32;19494:52;;;19542:1;19539;19532:12;19494:52;-1:-1:-1;19565:16:1;;19403:184;-1:-1:-1;19403:184:1:o;21379:127::-;21440:10;21435:3;21431:20;21428:1;21421:31;21471:4;21468:1;21461:15;21495:4;21492:1;21485:15;21511:251;21581:6;21634:2;21622:9;21613:7;21609:23;21605:32;21602:52;;;21650:1;21647;21640:12;21602:52;21682:9;21676:16;21701:31;21726:5;21701:31;:::i;21767:168::-;21840:9;;;21871;;21888:15;;;21882:22;;21868:37;21858:71;;21909:18;;:::i;21940:127::-;22001:10;21996:3;21992:20;21989:1;21982:31;22032:4;22029:1;22022:15;22056:4;22053:1;22046:15;22072:120;22112:1;22138;22128:35;;22143:18;;:::i;:::-;-1:-1:-1;22177:9:1;;22072:120::o;22996:703::-;23166:4;23214:2;23203:9;23199:18;23244:6;23233:9;23226:25;23270:2;23308;23303;23292:9;23288:18;23281:30;23331:6;23366;23360:13;23397:6;23389;23382:22;23435:2;23424:9;23420:18;23413:25;;23473:2;23465:6;23461:15;23447:29;;23494:1;23504:169;23518:6;23515:1;23512:13;23504:169;;;23579:13;;23567:26;;23648:15;;;;23613:12;;;;23540:1;23533:9;23504:169;;;-1:-1:-1;23690:3:1;;22996:703;-1:-1:-1;;;;;;;22996:703:1:o;24741:489::-;-1:-1:-1;;;;;25010:15:1;;;24992:34;;25062:15;;25057:2;25042:18;;25035:43;25109:2;25094:18;;25087:34;;;25157:3;25152:2;25137:18;;25130:31;;;24935:4;;25178:46;;25204:19;;25196:6;25178:46;:::i;:::-;25170:54;24741:489;-1:-1:-1;;;;;;24741:489:1:o;25580:723::-;25630:3;25671:5;25665:12;25700:36;25726:9;25700:36;:::i;:::-;25755:1;25772:17;;;25798:133;;;;25945:1;25940:357;;;;25765:532;;25798:133;-1:-1:-1;;25831:24:1;;25819:37;;25904:14;;25897:22;25885:35;;25876:45;;;-1:-1:-1;25798:133:1;;25940:357;25971:5;25968:1;25961:16;26000:4;26045;26042:1;26032:18;26072:1;26086:165;26100:6;26097:1;26094:13;26086:165;;;26178:14;;26165:11;;;26158:35;26221:16;;;;26115:10;;26086:165;;;26090:3;;;26280:6;26275:3;26271:16;26264:23;;25765:532;;;;;25580:723;;;;:::o;26308:469::-;26529:3;26557:38;26591:3;26583:6;26557:38;:::i;:::-;26624:6;26618:13;26640:65;26698:6;26694:2;26687:4;26679:6;26675:17;26640:65;:::i;:::-;26721:50;26763:6;26759:2;26755:15;26747:6;26721:50;:::i;:::-;26714:57;26308:469;-1:-1:-1;;;;;;;26308:469:1:o;27895:112::-;27927:1;27953;27943:35;;27958:18;;:::i;:::-;-1:-1:-1;27992:9:1;;27895:112::o;28012:135::-;28051:3;28072:17;;;28069:43;;28092:18;;:::i;:::-;-1:-1:-1;28139:1:1;28128:13;;28012:135::o;28152:148::-;28240:4;28219:12;;;28233;;;28215:31;;28258:13;;28255:39;;;28274:18;;:::i;28305:127::-;28366:10;28361:3;28357:20;28354:1;28347:31;28397:4;28394:1;28387:15;28421:4;28418:1;28411:15
Swarm Source
ipfs://e68db4566750c8448bec0263df669a89d4d5586467cae4dc16b0731ab2ffe716
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.