Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- UpToken
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- default
- Verified at
- 2025-04-07T08:21:24.041162Z
Constructor Arguments
0x000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f58
Arg [0] (address) : 0xca35638a3fddd02fec597d8c1681198c06b23f58
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
interface IERC20 {
function totalSupply() external view returns (uint256);
function symbol() external view returns(string memory);
function name() external view returns(string memory);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function decimals() external view returns (uint8);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface ISwapRouter {
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
function removeLiquidityETH(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapTokensForExactTokens(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
function removeLiquidityETHSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}
interface ITIMEDividend is IERC20 {
function claimableDividendOf(address account) external view returns (uint256);
function claimDividend(address payable recipient, uint256 amount) external returns (uint256);
}
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
if (b > a) {
return 0;
} else {
return a - b;
}
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}
library SafeERC20 {
using Address for address;
using SafeMath for uint256;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
contract LiquidityLock is ReentrancyGuard {
ISwapRouter public constant swapRouter = ISwapRouter(0x165C3410fC91EF562C50559f7d2289fEbed552d9);
IERC20 public immutable token;
constructor (address _token) {
token = IERC20(_token);
}
receive () external payable {
}
// Buy token, then Add token + PLS to PulseX V2 LP
function boost() external nonReentrant() returns (bool success) {
// Get PLS Balance
uint256 plsBalance = address(this).balance;
uint256 halfBalance = plsBalance / 2;
success = (plsBalance > 0);
require(success, "CANNOT_BOOST_ZERO_PLS");
address[] memory path = new address[](2);
path[0] = address(0xA1077a294dDE1B09bB078844df40758a5D0f9a27);
path[1] = address(token);
// Buy token on PulseX V2 with PLS
swapRouter.swapExactETHForTokens{value: halfBalance}(0, path, address(this), block.timestamp + 3 minutes);
// Get PLS & token balances in this contract
uint256 tknBal = token.balanceOf(address(this));
uint256 plsBal = address(this).balance;
// Approve token & PLS for use on the router
token.approve(address(swapRouter), tknBal);
// Add token/PLS Liquidity and burn it
swapRouter.addLiquidityETH{value: plsBal}(address(token), tknBal, 0, 0, address(0), block.timestamp + 3 minutes);
}
}
contract UpToken is IERC20, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 public immutable BaseAsset;
LiquidityLock public liquidityLock;
uint256 private constant precision = 10**18;
uint256 private _total_users;
uint256 private _total_txs;
uint256 private _totalSupply;
// storage
struct User {
uint256 lastEntryPrice; // Ratio at time of last deposit
uint256 deposited; // Deposited BaseAsset, from minting
uint256 withdrawn; // Withdrawn BaseAsset, from redemptions
}
// balances
mapping (address => User) private _stats;
mapping (address => uint8) private _users;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
// 5% mint and redeem Fees
uint256 public mintFee = 95000;
uint256 public sellFee = 95000;
uint256 private constant feeDenominator = 10**5;
// Events
event Burn(address from, uint256 amountBurned);
event GarbageCollected(uint256 amountBurned);
event Minted(address recipient, uint256 amountTKN);
event Redeemed(address seller, uint256 amountTKN, uint256 amountBASE);
event PriceChange(uint256 previousPrice, uint256 currentPrice, uint256 totalSupply);
////////////////////////////
// CONSTRUCTOR & FALLBACK //
////////////////////////////
constructor(address _baseAsset) {
BaseAsset = IERC20(_baseAsset);
liquidityLock = new LiquidityLock(address(this));
}
receive () external payable {
}
////////////////////
// VIEW FUNCTIONS //
////////////////////
// Token Name
function name() public view override returns (string memory) {
string memory tokenName = BaseAsset.name();
return string(abi.encodePacked("Staked ", tokenName));
}
// Token Ticker Symbol
function symbol() public view override returns (string memory) {
string memory tokenSymbol = BaseAsset.symbol();
return string(abi.encodePacked("x", tokenSymbol));
}
// Tokens decimals
function decimals() public pure override returns (uint8) {
return 18;
}
// Returns the total number of tokens in existence
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
// Returns the number of tokens owned by `account`
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
// Returns the number of tokens `spender` can transfer from `holder`
function allowance(address holder, address spender) external view override returns (uint256) {
return _allowances[holder][spender];
}
// Returns the amount of token given numtokens of BaseAsset; accounting for fees
function estimateMinted(uint256 numTokens) public view returns (uint256) {
uint balance = underlyingBalance();
return _totalSupply == 0 ? numTokens.mul(mintFee).div(feeDenominator) : _totalSupply.mul(numTokens).div(balance).mul(mintFee).div(feeDenominator);
}
// Returns the amount of BaseAsset given numtokens of token
function estimateRedeemed(uint256 numTokens) public view returns (uint256) {
return amountOut(numTokens.mul(sellFee).div(feeDenominator));
}
// Amount Of Underlying To Receive For `numTokens` of token
function amountOut(uint256 numTokens) public view returns (uint256) {
return _calculatePrice().mul(numTokens).div(precision);
}
// Returns the value of `holder`'s holdings
function getValueOfHoldings(address holder) public view returns(uint256) {
return amountOut(_balances[holder]);
}
// Underlying BaseAsset balance
function underlyingBalance() public view returns (uint256) {
return BaseAsset.balanceOf(address(this));
}
// Price Of token in BaseAsset
function calculatePrice() public view returns (uint256) {
return _calculatePrice();
}
// Returns basic contract stats
function getInfo() public view returns(uint256 users, uint256 txs, uint256 underlyingSupply, uint256 supply, uint256 price){
users = _total_users;
txs = _total_txs;
underlyingSupply = underlyingBalance();
supply = _totalSupply;
price = _calculatePrice();
}
// Last price a user minted at
function getLastEntryOf(address user) public view returns (uint256) {
return _stats[user].lastEntryPrice;
}
// Total BaseAsset deposited
function getDepositedOf(address user) public view returns (uint256) {
return _stats[user].deposited;
}
// Total BaseAsset withdrawn
function getWithdrawnOf(address user) public view returns (uint256) {
return _stats[user].withdrawn;
}
// Calculate StakedAsset required to redeem for an exact amount of BaseAsset
function getStakedAssetForExactBaseAsset(uint256 _amountOut) public view returns (uint256 _amountIn) {
require(_amountOut > 0, "BaseAsset amount must be greater than 0");
_amountIn = _amountOut.mul(precision).div(_calculatePrice()).mul(feeDenominator).div(sellFee);
}
// Calculate BaseAsset required to deposit for an exact amount of StakedAsset
function getBaseAssetForExactStakedAsset(uint256 _amountIn) public view returns (uint256 _amountOut) {
require(_amountIn > 0, "Token amount must be greater than 0");
_amountOut = _amountIn.mul(_calculatePrice()).div(precision).mul(feeDenominator).div(mintFee);
}
/////////////////////
// WRITE FUNCTIONS //
/////////////////////
// Mint token Tokens For `recipient` By Depositing BaseAsset Into The Contract
function mintWithBacking(uint256 numTokens, address recipient) external nonReentrant returns (uint256) {
_checkGarbageCollector(address(this));
return _mintWithBacking(numTokens, recipient);
}
// Burns Sender's token Tokens and redeems their value in BaseAsset
function redeem(uint256 tokenAmount) external nonReentrant returns (uint256) {
return _sell(msg.sender, tokenAmount, msg.sender);
}
// Burns Sender's token Tokens and redeems their value in BaseAsset for `recipient`
function redeemTo(uint256 tokenAmount, address recipient) external nonReentrant returns (uint256) {
return _sell(msg.sender, tokenAmount, recipient);
}
// Allows A User To Erase Their Holdings From Supply - DOES NOT REDEEM UNDERLYING ASSET FOR USER
function burn(uint256 amount) external nonReentrant {
uint256 bal = _balances[msg.sender];
require(bal >= amount && bal > 0, 'Zero Holdings');
uint256 oldPrice = _calculatePrice();
_burn(msg.sender, amount);
_requirePriceRises(oldPrice);
emit Burn(msg.sender, amount);
}
// Approves `spender` to transfer `amount` tokens from caller
function approve(address spender, uint256 amount) public override returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
// Transfer Function
function transfer(address recipient, uint256 amount) external override nonReentrant returns (bool) {
return _transferFrom(msg.sender, recipient, amount);
}
// Transfer Function
function transferFrom(address sender, address recipient, uint256 amount) external override nonReentrant returns (bool) {
_allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, 'Insufficient Allowance');
return _transferFrom(sender, recipient, amount);
}
////////////////////////
// INTERNAL FUNCTIONS //
////////////////////////
// Internal Transfer
function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
require(recipient != address(0) && sender != address(0), "Transfer To Zero");
require(amount > 0, "Transfer Amt Zero");
uint256 oldPrice = _calculatePrice();
_balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
_balances[recipient] = _balances[recipient].add(amount);
_requirePriceRises(oldPrice);
_total_txs += 1;
emit Transfer(sender, recipient, amount);
return true;
}
// Stake Tokens and Deposits token in Sender's Address, Must Have Prior Approval For BaseAsset
function _mintWithBacking(uint256 amount, address recipient) internal returns (uint256) {
uint256 userTokenBalance = BaseAsset.balanceOf(msg.sender);
require(userTokenBalance > 0 && amount <= userTokenBalance, 'Insufficient Balance');
uint256 oldPrice = _calculatePrice();
uint256 amountUnderlying = underlyingBalance();
uint256 received = _transferIn(amount);
_stats[msg.sender].lastEntryPrice = oldPrice;
_stats[msg.sender].deposited = _stats[msg.sender].deposited.add(amount);
return _mintTo(recipient, received, amountUnderlying, oldPrice);
}
// Burns token Tokens And Deposits BaseAsset Tokens into Recipients's Address
function _sell(address seller, uint256 tokenAmount, address recipient) internal returns (uint256) {
require(tokenAmount > 0 && _balances[seller] >= tokenAmount);
require(seller != address(0) && recipient != address(0));
uint256 oldPrice = _calculatePrice();
uint256 tokensToSwap = tokenAmount.mul(sellFee).div(feeDenominator);
uint256 amountUnderlyingAsset = amountOut(tokensToSwap);
_burn(seller, tokenAmount);
require(BaseAsset.transfer(recipient, amountUnderlyingAsset), 'Underlying Transfer Failure');
_requirePriceRises(oldPrice);
_total_txs += 1;
_stats[recipient].withdrawn = _stats[recipient].withdrawn.add(amountUnderlyingAsset);
emit Redeemed(seller, tokenAmount, amountUnderlyingAsset);
return amountUnderlyingAsset;
}
// Handles Minting Logic To Create New token
function _mintTo(address recipient, uint256 received, uint256 totalBacking, uint256 oldPrice) private returns(uint256) {
uint256 tokensToMintNoTax = _totalSupply == 0 ? received : _totalSupply.mul(received).div(totalBacking);
uint256 tokensToMint = tokensToMintNoTax.mul(mintFee).div(feeDenominator);
require(tokensToMint > 0, 'Zero Amount');
_mint(recipient, tokensToMint);
_requirePriceRises(oldPrice);
_total_txs += 1;
// differentiate purchase
emit Minted(recipient, tokensToMint);
return tokensToMint;
}
// Requires The Price Of token To Rise For The Transaction To Conclude
function _requirePriceRises(uint256 oldPrice) internal {
uint256 newPrice = _calculatePrice();
require(newPrice >= oldPrice, 'Price Cannot Fall');
emit PriceChange(oldPrice, newPrice, _totalSupply);
}
// Transfers `desiredAmount` of `token` in and verifies the transaction success
function _transferIn(uint256 desiredAmount) internal returns (uint256) {
uint256 balBefore = underlyingBalance();
require(BaseAsset.transferFrom(msg.sender, address(this), desiredAmount), 'Failure Transfer From');
uint256 balAfter = underlyingBalance();
require(balAfter > balBefore, 'Zero Received');
return balAfter - balBefore;
}
// Mints Tokens to the Receivers Address
function _mint(address receiver, uint amount) private {
if (_users[receiver] == 0){
_users[receiver] = 1;
_total_users += 1;
}
_balances[receiver] = _balances[receiver].add(amount);
_totalSupply = _totalSupply.add(amount);
emit Transfer(address(0), receiver, amount);
}
// Burns `amount` of tokens from `account`
function _burn(address account, uint amount) private {
_balances[account] = _balances[account].sub(amount, 'Insufficient Balance');
_totalSupply = _totalSupply.sub(amount, 'Negative Supply');
emit Transfer(account, address(0), amount);
}
// Make Sure there's no Native Tokens in contract
function _checkGarbageCollector(address burnLocation) internal {
_claimTimeDividends();
uint256 bal = _balances[burnLocation];
if (bal > 10**3) {
uint256 oldPrice = _calculatePrice();
_burn(burnLocation, bal);
emit GarbageCollected(bal);
emit PriceChange(oldPrice, _calculatePrice(), _totalSupply);
}
}
// Returns the Current Price of 1 Token
function _calculatePrice() internal view returns (uint256) {
return _totalSupply == 0 ? 10**18 : (underlyingBalance().mul(precision)).div(_totalSupply);
}
// Claim PLS from TIME
function _claimTimeDividends() internal {
uint256 divs = ITIMEDividend(address(BaseAsset)).claimableDividendOf(address(this));
if (divs > 0) {
ITIMEDividend(address(BaseAsset)).claimDividend(payable(address(this)), divs);
}
uint256 bal = address(this).balance;
if (bal > 0) {
payable(liquidityLock).transfer(bal);
}
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_baseAsset","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"uint256","name":"amountBurned","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GarbageCollected","inputs":[{"type":"uint256","name":"amountBurned","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"uint256","name":"amountTKN","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PriceChange","inputs":[{"type":"uint256","name":"previousPrice","internalType":"uint256","indexed":false},{"type":"uint256","name":"currentPrice","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalSupply","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Redeemed","inputs":[{"type":"address","name":"seller","internalType":"address","indexed":false},{"type":"uint256","name":"amountTKN","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountBASE","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"BaseAsset","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amountOut","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"calculatePrice","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateMinted","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateRedeemed","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}],"name":"getBaseAssetForExactStakedAsset","inputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDepositedOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"users","internalType":"uint256"},{"type":"uint256","name":"txs","internalType":"uint256"},{"type":"uint256","name":"underlyingSupply","internalType":"uint256"},{"type":"uint256","name":"supply","internalType":"uint256"},{"type":"uint256","name":"price","internalType":"uint256"}],"name":"getInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLastEntryOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}],"name":"getStakedAssetForExactBaseAsset","inputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getValueOfHoldings","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getWithdrawnOf","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract LiquidityLock"}],"name":"liquidityLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintWithBacking","inputs":[{"type":"uint256","name":"numTokens","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeem","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeemTo","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"underlyingBalance","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60a06040526201731860095562017318600a553480156200001e575f80fd5b50604051620047bf380380620047bf83398181016040528101906200004491906200016e565b60015f819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050306040516200008e90620000fb565b6200009a9190620001af565b604051809103905ff080158015620000b4573d5f803e3d5ffd5b5060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001ca565b610e6b806200395483390190565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000138826200010d565b9050919050565b6200014a816200012c565b811462000155575f80fd5b50565b5f8151905062000168816200013f565b92915050565b5f6020828403121562000186576200018562000109565b5b5f620001958482850162000158565b91505092915050565b620001a9816200012c565b82525050565b5f602082019050620001c45f8301846200019e565b92915050565b6080516137396200021b5f395f818161083701528181610d9001528181611035015281816111fa01528181611af901528181611e7f0152818161213b015281816121dd01526122fc01526137395ff3fe6080604052600436106101c4575f3560e01c80636b014f83116100f6578063a9059cbb11610094578063db006a7511610063578063db006a75146106d5578063dd62ed3e14610711578063e8bba4f61461074d578063ed13b25314610789576101cb565b8063a9059cbb14610609578063aeca768b14610645578063cfa3eefa1461066f578063d348b409146106ab576101cb565b80637314f109116100d05780637314f1091461052b57806375fe9fba1461056757806395d89b41146105a35780639d6e6c35146105cd576101cb565b80636b014f83146104775780636ba56b38146104b357806370a08231146104ef576101cb565b806323b872dd1161016357806342966c681161013d57806342966c68146103bb57806352c08bb4146103e357806359356c5c1461041f5780635a9b0b8914610449576101cb565b806323b872dd1461032b5780632b14ca5614610367578063313ce56714610391576101cb565b8063095ea7b31161019f578063095ea7b31461025f57806313966db51461029b57806318160ddd146102c55780631f02a29c146102ef576101cb565b806246516b146101cf57806301dea7711461020b57806306fdde0314610235576101cb565b366101cb57005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f09190612797565b6107c5565b60405161020291906127da565b60405180910390f35b348015610216575f80fd5b5061021f61080d565b60405161022c919061284e565b60405180910390f35b348015610240575f80fd5b50610249610832565b60405161025691906128f1565b60405180910390f35b34801561026a575f80fd5b506102856004803603810190610280919061293b565b6108ed565b6040516102929190612993565b60405180910390f35b3480156102a6575f80fd5b506102af6109da565b6040516102bc91906127da565b60405180910390f35b3480156102d0575f80fd5b506102d96109e0565b6040516102e691906127da565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190612797565b6109e9565b60405161032291906127da565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c91906129ac565b610a37565b60405161035e9190612993565b60405180910390f35b348015610372575f80fd5b5061037b610bdc565b60405161038891906127da565b60405180910390f35b34801561039c575f80fd5b506103a5610be2565b6040516103b29190612a17565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612a30565b610bea565b005b3480156103ee575f80fd5b5061040960048036038101906104049190612a5b565b610d27565b60405161041691906127da565b60405180910390f35b34801561042a575f80fd5b50610433610d8d565b60405161044091906127da565b60405180910390f35b348015610454575f80fd5b5061045d610e2b565b60405161046e959493929190612a99565b60405180910390f35b348015610482575f80fd5b5061049d60048036038101906104989190612a30565b610e5a565b6040516104aa91906127da565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612797565b610ef7565b6040516104e691906127da565b60405180910390f35b3480156104fa575f80fd5b5061051560048036038101906105109190612797565b610f40565b60405161052291906127da565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190612a5b565b610f86565b60405161055e91906127da565b60405180910390f35b348015610572575f80fd5b5061058d60048036038101906105889190612a30565b610ff4565b60405161059a91906127da565b60405180910390f35b3480156105ae575f80fd5b506105b7611030565b6040516105c491906128f1565b60405180910390f35b3480156105d8575f80fd5b506105f360048036038101906105ee9190612a30565b6110eb565b60405161060091906127da565b60405180910390f35b348015610614575f80fd5b5061062f600480360381019061062a919061293b565b611192565b60405161063c9190612993565b60405180910390f35b348015610650575f80fd5b506106596111f8565b6040516106669190612b1b565b60405180910390f35b34801561067a575f80fd5b5061069560048036038101906106909190612a30565b61121c565b6040516106a291906127da565b60405180910390f35b3480156106b6575f80fd5b506106bf6112c3565b6040516106cc91906127da565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a30565b6112d1565b60405161070891906127da565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612b34565b611336565b60405161074491906127da565b60405180910390f35b348015610758575f80fd5b50610773600480360381019061076e9190612797565b6113b8565b60405161078091906127da565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190612a30565b611401565b6040516107bc91906127da565b60405180910390f35b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561089d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108c59190612c90565b9050806040516020016108d89190612d5b565b60405160208183030381529060405291505090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109c891906127da565b60405180910390a36001905092915050565b60095481565b5f600454905090565b5f610a3060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ff4565b9050919050565b5f60025f5403610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390612dc6565b60405180910390fd5b60025f81905550610b45826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e63650000000000000000000081525060085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610bcc84848461149d565b905060015f819055509392505050565b600a5481565b5f6012905090565b60025f5403610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612dc6565b60405180910390fd5b60025f819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110158015610c8557505f81115b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90612e2e565b60405180910390fd5b5f610ccd61177e565b9050610cd933846117d2565b610ce281611955565b7fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca53384604051610d13929190612e5b565b60405180910390a1505060015f8190555050565b5f60025f5403610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390612dc6565b60405180910390fd5b60025f81905550610d7e3384846119e4565b905060015f8190555092915050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610de79190612e82565b602060405180830381865afa158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e269190612eaf565b905090565b5f805f805f60025494506003549350610e42610d8d565b92506004549150610e5161177e565b90509091929394565b5f80610e64610d8d565b90505f60045414610ec457610ebf620186a0610eb1600954610ea385610e9589600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b610eef565b610eee620186a0610ee060095486611cd290919063ffffffff16565b611d4990919063ffffffff16565b5b915050919050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60025f5403610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612dc6565b60405180910390fd5b60025f81905550610fdb30611d92565b610fe58383611e7b565b905060015f8190555092915050565b5f611029670de0b6b3a764000061101b8461100d61177e565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b60605f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561109b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110c39190612c90565b9050806040516020016110d69190612f24565b60405160208183030381529060405291505090565b5f80821161112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590612fb5565b60405180910390fd5b61118b60095461117d620186a061116f670de0b6b3a764000061116161115261177e565b89611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f60025f54036111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612dc6565b60405180910390fd5b60025f819055506111e933848461149d565b905060015f8190555092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80821161125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613043565b60405180910390fd5b6112bc600a546112ae620186a06112a061127761177e565b611292670de0b6b3a764000089611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f6112cc61177e565b905090565b5f60025f5403611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90612dc6565b60405180910390fd5b60025f819055506113283383336119e4565b905060015f81905550919050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b5f61143461142f620186a0611421600a5486611cd290919063ffffffff16565b611d4990919063ffffffff16565b610ff4565b9050919050565b5f838311158290611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147991906128f1565b60405180910390fd5b505f8385611490919061308e565b9050809150509392505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561150657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061310b565b60405180910390fd5b5f8211611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613173565b60405180910390fd5b5f61159061177e565b9050611619836040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116aa8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116f481611955565b600160035f8282546117069190613191565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161176a91906127da565b60405180910390a360019150509392505050565b5f80600454146117c3576117be6004546117b0670de0b6b3a76400006117a2610d8d565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b6117cd565b670de0b6b3a76400005b905090565b611859816040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506118e6816040518060400160405280600f81526020017f4e6567617469766520537570706c79000000000000000000000000000000000081525060045461143b9092919063ffffffff16565b6004819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194991906127da565b60405180910390a35050565b5f61195e61177e565b9050818110156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061320e565b60405180910390fd5b7f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed182826004546040516119d89392919061322c565b60405180910390a15050565b5f8083118015611a3157508260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410155b611a39575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611aa157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611aa9575f80fd5b5f611ab261177e565b90505f611adf620186a0611ad1600a5488611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f611aeb82610ff4565b9050611af787876117d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611b52929190612e5b565b6020604051808303815f875af1158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b92919061328b565b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613300565b60405180910390fd5b611bda83611955565b600160035f828254611bec9190613191565b92505081905550611c468160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461207a90919063ffffffff16565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055507ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262878783604051611cbd9392919061331e565b60405180910390a18093505050509392505050565b5f808303611ce2575f9050611d43565b5f8284611cef9190613353565b9050828482611cfe91906133c1565b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613461565b60405180910390fd5b809150505b92915050565b5f611d8a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120d7565b905092915050565b611d9a612138565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506103e8811115611e77575f611dee61177e565b9050611dfa83836117d2565b7f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e82604051611e2991906127da565b60405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed181611e5b61177e565b600454604051611e6d9392919061322c565b60405180910390a1505b5050565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed69190612e82565b602060405180830381865afa158015611ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f159190612eaf565b90505f81118015611f265750808411155b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c906134c9565b60405180910390fd5b5f611f6e61177e565b90505f611f79610d8d565b90505f611f85876122ee565b90508260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555061201e8760055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461207a90919063ffffffff16565b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001018190555061206e86828486612438565b94505050505092915050565b5f8082846120889190613191565b9050838110156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490613531565b60405180910390fd5b8091505092915050565b5f808311829061211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211491906128f1565b60405180910390fd5b505f838561212b91906133c1565b9050809150509392505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637e1c4273306040518263ffffffff1660e01b81526004016121929190612e82565b602060405180830381865afa1580156121ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d19190612eaf565b90505f811115612278577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635247ab0530836040518363ffffffff1660e01b815260040161223692919061356f565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190612eaf565b505b5f4790505f8111156122ea5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122e8573d5f803e3d5ffd5b505b5050565b5f806122f8610d8d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161235793929190613596565b6020604051808303815f875af1158015612373573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612397919061328b565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613615565b60405180910390fd5b5f6123df610d8d565b9050818111612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a9061367d565b60405180910390fd5b818161242f919061308e565b92505050919050565b5f805f6004541461246f5761246a8461245c87600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b612471565b845b90505f61249e620186a061249060095485611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f81116124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d9906136e5565b60405180910390fd5b6124ec8782612554565b6124f584611955565b600160035f8282546125079190613191565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe878260405161253f929190612e5b565b60405180910390a18092505050949350505050565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff160361261757600160065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff160217905550600160025f82825461260f9190613191565b925050819055505b6126678160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506126bd8160045461207a90919063ffffffff16565b6004819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272091906127da565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127668261273d565b9050919050565b6127768161275c565b8114612780575f80fd5b50565b5f813590506127918161276d565b92915050565b5f602082840312156127ac576127ab612735565b5b5f6127b984828501612783565b91505092915050565b5f819050919050565b6127d4816127c2565b82525050565b5f6020820190506127ed5f8301846127cb565b92915050565b5f819050919050565b5f61281661281161280c8461273d565b6127f3565b61273d565b9050919050565b5f612827826127fc565b9050919050565b5f6128388261281d565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561289e578082015181840152602081019050612883565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128c382612867565b6128cd8185612871565b93506128dd818560208601612881565b6128e6816128a9565b840191505092915050565b5f6020820190508181035f83015261290981846128b9565b905092915050565b61291a816127c2565b8114612924575f80fd5b50565b5f8135905061293581612911565b92915050565b5f806040838503121561295157612950612735565b5b5f61295e85828601612783565b925050602061296f85828601612927565b9150509250929050565b5f8115159050919050565b61298d81612979565b82525050565b5f6020820190506129a65f830184612984565b92915050565b5f805f606084860312156129c3576129c2612735565b5b5f6129d086828701612783565b93505060206129e186828701612783565b92505060406129f286828701612927565b9150509250925092565b5f60ff82169050919050565b612a11816129fc565b82525050565b5f602082019050612a2a5f830184612a08565b92915050565b5f60208284031215612a4557612a44612735565b5b5f612a5284828501612927565b91505092915050565b5f8060408385031215612a7157612a70612735565b5b5f612a7e85828601612927565b9250506020612a8f85828601612783565b9150509250929050565b5f60a082019050612aac5f8301886127cb565b612ab960208301876127cb565b612ac660408301866127cb565b612ad360608301856127cb565b612ae060808301846127cb565b9695505050505050565b5f612af4826127fc565b9050919050565b5f612b0582612aea565b9050919050565b612b1581612afb565b82525050565b5f602082019050612b2e5f830184612b0c565b92915050565b5f8060408385031215612b4a57612b49612735565b5b5f612b5785828601612783565b9250506020612b6885828601612783565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612bb0826128a9565b810181811067ffffffffffffffff82111715612bcf57612bce612b7a565b5b80604052505050565b5f612be161272c565b9050612bed8282612ba7565b919050565b5f67ffffffffffffffff821115612c0c57612c0b612b7a565b5b612c15826128a9565b9050602081019050919050565b5f612c34612c2f84612bf2565b612bd8565b905082815260208101848484011115612c5057612c4f612b76565b5b612c5b848285612881565b509392505050565b5f82601f830112612c7757612c76612b72565b5b8151612c87848260208601612c22565b91505092915050565b5f60208284031215612ca557612ca4612735565b5b5f82015167ffffffffffffffff811115612cc257612cc1612739565b5b612cce84828501612c63565b91505092915050565b5f81905092915050565b7f5374616b656420000000000000000000000000000000000000000000000000005f82015250565b5f612d15600783612cd7565b9150612d2082612ce1565b600782019050919050565b5f612d3582612867565b612d3f8185612cd7565b9350612d4f818560208601612881565b80840191505092915050565b5f612d6582612d09565b9150612d718284612d2b565b915081905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612db0601f83612871565b9150612dbb82612d7c565b602082019050919050565b5f6020820190508181035f830152612ddd81612da4565b9050919050565b7f5a65726f20486f6c64696e6773000000000000000000000000000000000000005f82015250565b5f612e18600d83612871565b9150612e2382612de4565b602082019050919050565b5f6020820190508181035f830152612e4581612e0c565b9050919050565b612e558161275c565b82525050565b5f604082019050612e6e5f830185612e4c565b612e7b60208301846127cb565b9392505050565b5f602082019050612e955f830184612e4c565b92915050565b5f81519050612ea981612911565b92915050565b5f60208284031215612ec457612ec3612735565b5b5f612ed184828501612e9b565b91505092915050565b7f78000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f0e600183612cd7565b9150612f1982612eda565b600182019050919050565b5f612f2e82612f02565b9150612f3a8284612d2b565b915081905092915050565b7f546f6b656e20616d6f756e74206d7573742062652067726561746572207468615f8201527f6e20300000000000000000000000000000000000000000000000000000000000602082015250565b5f612f9f602383612871565b9150612faa82612f45565b604082019050919050565b5f6020820190508181035f830152612fcc81612f93565b9050919050565b7f42617365417373657420616d6f756e74206d75737420626520677265617465725f8201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b5f61302d602783612871565b915061303882612fd3565b604082019050919050565b5f6020820190508181035f83015261305a81613021565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613098826127c2565b91506130a3836127c2565b92508282039050818111156130bb576130ba613061565b5b92915050565b7f5472616e7366657220546f205a65726f000000000000000000000000000000005f82015250565b5f6130f5601083612871565b9150613100826130c1565b602082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f5472616e7366657220416d74205a65726f0000000000000000000000000000005f82015250565b5f61315d601183612871565b915061316882613129565b602082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b5f61319b826127c2565b91506131a6836127c2565b92508282019050808211156131be576131bd613061565b5b92915050565b7f50726963652043616e6e6f742046616c6c0000000000000000000000000000005f82015250565b5f6131f8601183612871565b9150613203826131c4565b602082019050919050565b5f6020820190508181035f830152613225816131ec565b9050919050565b5f60608201905061323f5f8301866127cb565b61324c60208301856127cb565b61325960408301846127cb565b949350505050565b61326a81612979565b8114613274575f80fd5b50565b5f8151905061328581613261565b92915050565b5f602082840312156132a05761329f612735565b5b5f6132ad84828501613277565b91505092915050565b7f556e6465726c79696e67205472616e73666572204661696c75726500000000005f82015250565b5f6132ea601b83612871565b91506132f5826132b6565b602082019050919050565b5f6020820190508181035f830152613317816132de565b9050919050565b5f6060820190506133315f830186612e4c565b61333e60208301856127cb565b61334b60408301846127cb565b949350505050565b5f61335d826127c2565b9150613368836127c2565b9250828202613376816127c2565b9150828204841483151761338d5761338c613061565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133cb826127c2565b91506133d6836127c2565b9250826133e6576133e5613394565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61344b602183612871565b9150613456826133f1565b604082019050919050565b5f6020820190508181035f8301526134788161343f565b9050919050565b7f496e73756666696369656e742042616c616e63650000000000000000000000005f82015250565b5f6134b3601483612871565b91506134be8261347f565b602082019050919050565b5f6020820190508181035f8301526134e0816134a7565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f61351b601b83612871565b9150613526826134e7565b602082019050919050565b5f6020820190508181035f8301526135488161350f565b9050919050565b5f6135598261273d565b9050919050565b6135698161354f565b82525050565b5f6040820190506135825f830185613560565b61358f60208301846127cb565b9392505050565b5f6060820190506135a95f830186612e4c565b6135b66020830185612e4c565b6135c360408301846127cb565b949350505050565b7f4661696c757265205472616e736665722046726f6d00000000000000000000005f82015250565b5f6135ff601583612871565b915061360a826135cb565b602082019050919050565b5f6020820190508181035f83015261362c816135f3565b9050919050565b7f5a65726f205265636569766564000000000000000000000000000000000000005f82015250565b5f613667600d83612871565b915061367282613633565b602082019050919050565b5f6020820190508181035f8301526136948161365b565b9050919050565b7f5a65726f20416d6f756e740000000000000000000000000000000000000000005f82015250565b5f6136cf600b83612871565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b905091905056fea264697066735822122082f68492e8dae00742a39a271e0bfe7aeb257f0523717e5426c49add5aa6edf764736f6c6343000814003360a060405234801561000f575f80fd5b50604051610e6b380380610e6b833981810160405281019061003191906100d0565b60015f819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100fb565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61009f82610076565b9050919050565b6100af81610095565b81146100b9575f80fd5b50565b5f815190506100ca816100a6565b92915050565b5f602082840312156100e5576100e4610072565b5b5f6100f2848285016100bc565b91505092915050565b608051610d3c61012f5f395f81816102160152818161032b015281816103c9015281816104aa01526105680152610d3c5ff3fe608060405260043610610037575f3560e01c8063a66f42c014610042578063c31c9c071461006c578063fc0c546a146100965761003e565b3661003e57005b5f80fd5b34801561004d575f80fd5b506100566100c0565b60405161006391906105a4565b60405180910390f35b348015610077575f80fd5b5061008061054e565b60405161008d9190610637565b60405180910390f35b3480156100a1575f80fd5b506100aa610566565b6040516100b79190610670565b60405180910390f35b5f60025f5403610105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100fc906106e3565b60405180910390fd5b60025f819055505f4790505f60028261011e9190610764565b90505f8211925082610165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015c906107de565b60405180910390fd5b5f600267ffffffffffffffff811115610181576101806107fc565b5b6040519080825280602002602001820160405280156101af5781602001602082028036833780820191505090505b50905073a1077a294dde1b09bb078844df40758a5d0f9a27815f815181106101da576101d9610829565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061024957610248610829565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16637ff36ab5835f843060b4426102c49190610856565b6040518663ffffffff1660e01b81526004016102e394939291906109a8565b5f6040518083038185885af11580156102fe573d5f803e3d5ffd5b50505050506040513d5f823e3d601f19601f820116820180604052508101906103279190610b50565b505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016103829190610b97565b602060405180830381865afa15801561039d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c19190610bb0565b90505f4790507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d9846040518363ffffffff1660e01b8152600401610436929190610bdb565b6020604051808303815f875af1158015610452573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104769190610c2c565b5073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663f305d719827f0000000000000000000000000000000000000000000000000000000000000000855f805f60b4426104da9190610856565b6040518863ffffffff1660e01b81526004016104fb96959493929190610c57565b60606040518083038185885af1158015610517573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061053c9190610cb6565b505050505050505060015f8190555090565b73165c3410fc91ef562c50559f7d2289febed552d981565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8115159050919050565b61059e8161058a565b82525050565b5f6020820190506105b75f830184610595565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6105ff6105fa6105f5846105bd565b6105dc565b6105bd565b9050919050565b5f610610826105e5565b9050919050565b5f61062182610606565b9050919050565b61063181610617565b82525050565b5f60208201905061064a5f830184610628565b92915050565b5f61065a82610606565b9050919050565b61066a81610650565b82525050565b5f6020820190506106835f830184610661565b92915050565b5f82825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6106cd601f83610689565b91506106d882610699565b602082019050919050565b5f6020820190508181035f8301526106fa816106c1565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61076e82610701565b915061077983610701565b9250826107895761078861070a565b5b828204905092915050565b7f43414e4e4f545f424f4f53545f5a45524f5f504c5300000000000000000000005f82015250565b5f6107c8601583610689565b91506107d382610794565b602082019050919050565b5f6020820190508181035f8301526107f5816107bc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61086082610701565b915061086b83610701565b925082820190508082111561088357610882610737565b5b92915050565b5f819050919050565b5f6108ac6108a76108a284610889565b6105dc565b610701565b9050919050565b6108bc81610892565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6108f5826105bd565b9050919050565b610905816108eb565b82525050565b5f61091683836108fc565b60208301905092915050565b5f602082019050919050565b5f610938826108c2565b61094281856108cc565b935061094d836108dc565b805f5b8381101561097d578151610964888261090b565b975061096f83610922565b925050600181019050610950565b5085935050505092915050565b610993816108eb565b82525050565b6109a281610701565b82525050565b5f6080820190506109bb5f8301876108b3565b81810360208301526109cd818661092e565b90506109dc604083018561098a565b6109e96060830184610999565b95945050505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b610a2082610a07565b810181811067ffffffffffffffff82111715610a3f57610a3e6107fc565b5b80604052505050565b5f610a516109f2565b9050610a5d8282610a17565b919050565b5f67ffffffffffffffff821115610a7c57610a7b6107fc565b5b602082029050602081019050919050565b5f80fd5b610a9a81610701565b8114610aa4575f80fd5b50565b5f81519050610ab581610a91565b92915050565b5f610acd610ac884610a62565b610a48565b90508083825260208201905060208402830185811115610af057610aef610a8d565b5b835b81811015610b195780610b058882610aa7565b845260208401935050602081019050610af2565b5050509392505050565b5f82601f830112610b3757610b36610a03565b5b8151610b47848260208601610abb565b91505092915050565b5f60208284031215610b6557610b646109fb565b5b5f82015167ffffffffffffffff811115610b8257610b816109ff565b5b610b8e84828501610b23565b91505092915050565b5f602082019050610baa5f83018461098a565b92915050565b5f60208284031215610bc557610bc46109fb565b5b5f610bd284828501610aa7565b91505092915050565b5f604082019050610bee5f83018561098a565b610bfb6020830184610999565b9392505050565b610c0b8161058a565b8114610c15575f80fd5b50565b5f81519050610c2681610c02565b92915050565b5f60208284031215610c4157610c406109fb565b5b5f610c4e84828501610c18565b91505092915050565b5f60c082019050610c6a5f83018961098a565b610c776020830188610999565b610c8460408301876108b3565b610c9160608301866108b3565b610c9e608083018561098a565b610cab60a0830184610999565b979650505050505050565b5f805f60608486031215610ccd57610ccc6109fb565b5b5f610cda86828701610aa7565b9350506020610ceb86828701610aa7565b9250506040610cfc86828701610aa7565b915050925092509256fea26469706673582212202940eeb7333ad4c14f297fc5a45b6fdfa9908b4b9f4731994c9c3d6a250000dc64736f6c63430008140033000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f58
Deployed ByteCode
0x6080604052600436106101c4575f3560e01c80636b014f83116100f6578063a9059cbb11610094578063db006a7511610063578063db006a75146106d5578063dd62ed3e14610711578063e8bba4f61461074d578063ed13b25314610789576101cb565b8063a9059cbb14610609578063aeca768b14610645578063cfa3eefa1461066f578063d348b409146106ab576101cb565b80637314f109116100d05780637314f1091461052b57806375fe9fba1461056757806395d89b41146105a35780639d6e6c35146105cd576101cb565b80636b014f83146104775780636ba56b38146104b357806370a08231146104ef576101cb565b806323b872dd1161016357806342966c681161013d57806342966c68146103bb57806352c08bb4146103e357806359356c5c1461041f5780635a9b0b8914610449576101cb565b806323b872dd1461032b5780632b14ca5614610367578063313ce56714610391576101cb565b8063095ea7b31161019f578063095ea7b31461025f57806313966db51461029b57806318160ddd146102c55780631f02a29c146102ef576101cb565b806246516b146101cf57806301dea7711461020b57806306fdde0314610235576101cb565b366101cb57005b5f80fd5b3480156101da575f80fd5b506101f560048036038101906101f09190612797565b6107c5565b60405161020291906127da565b60405180910390f35b348015610216575f80fd5b5061021f61080d565b60405161022c919061284e565b60405180910390f35b348015610240575f80fd5b50610249610832565b60405161025691906128f1565b60405180910390f35b34801561026a575f80fd5b506102856004803603810190610280919061293b565b6108ed565b6040516102929190612993565b60405180910390f35b3480156102a6575f80fd5b506102af6109da565b6040516102bc91906127da565b60405180910390f35b3480156102d0575f80fd5b506102d96109e0565b6040516102e691906127da565b60405180910390f35b3480156102fa575f80fd5b5061031560048036038101906103109190612797565b6109e9565b60405161032291906127da565b60405180910390f35b348015610336575f80fd5b50610351600480360381019061034c91906129ac565b610a37565b60405161035e9190612993565b60405180910390f35b348015610372575f80fd5b5061037b610bdc565b60405161038891906127da565b60405180910390f35b34801561039c575f80fd5b506103a5610be2565b6040516103b29190612a17565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc9190612a30565b610bea565b005b3480156103ee575f80fd5b5061040960048036038101906104049190612a5b565b610d27565b60405161041691906127da565b60405180910390f35b34801561042a575f80fd5b50610433610d8d565b60405161044091906127da565b60405180910390f35b348015610454575f80fd5b5061045d610e2b565b60405161046e959493929190612a99565b60405180910390f35b348015610482575f80fd5b5061049d60048036038101906104989190612a30565b610e5a565b6040516104aa91906127da565b60405180910390f35b3480156104be575f80fd5b506104d960048036038101906104d49190612797565b610ef7565b6040516104e691906127da565b60405180910390f35b3480156104fa575f80fd5b5061051560048036038101906105109190612797565b610f40565b60405161052291906127da565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190612a5b565b610f86565b60405161055e91906127da565b60405180910390f35b348015610572575f80fd5b5061058d60048036038101906105889190612a30565b610ff4565b60405161059a91906127da565b60405180910390f35b3480156105ae575f80fd5b506105b7611030565b6040516105c491906128f1565b60405180910390f35b3480156105d8575f80fd5b506105f360048036038101906105ee9190612a30565b6110eb565b60405161060091906127da565b60405180910390f35b348015610614575f80fd5b5061062f600480360381019061062a919061293b565b611192565b60405161063c9190612993565b60405180910390f35b348015610650575f80fd5b506106596111f8565b6040516106669190612b1b565b60405180910390f35b34801561067a575f80fd5b5061069560048036038101906106909190612a30565b61121c565b6040516106a291906127da565b60405180910390f35b3480156106b6575f80fd5b506106bf6112c3565b6040516106cc91906127da565b60405180910390f35b3480156106e0575f80fd5b506106fb60048036038101906106f69190612a30565b6112d1565b60405161070891906127da565b60405180910390f35b34801561071c575f80fd5b5061073760048036038101906107329190612b34565b611336565b60405161074491906127da565b60405180910390f35b348015610758575f80fd5b50610773600480360381019061076e9190612797565b6113b8565b60405161078091906127da565b60405180910390f35b348015610794575f80fd5b506107af60048036038101906107aa9190612a30565b611401565b6040516107bc91906127da565b60405180910390f35b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561089d573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108c59190612c90565b9050806040516020016108d89190612d5b565b60405160208183030381529060405291505090565b5f8160085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109c891906127da565b60405180910390a36001905092915050565b60095481565b5f600454905090565b5f610a3060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610ff4565b9050919050565b5f60025f5403610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390612dc6565b60405180910390fd5b60025f81905550610b45826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e63650000000000000000000081525060085f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610bcc84848461149d565b905060015f819055509392505050565b600a5481565b5f6012905090565b60025f5403610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590612dc6565b60405180910390fd5b60025f819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110158015610c8557505f81115b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90612e2e565b60405180910390fd5b5f610ccd61177e565b9050610cd933846117d2565b610ce281611955565b7fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca53384604051610d13929190612e5b565b60405180910390a1505060015f8190555050565b5f60025f5403610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390612dc6565b60405180910390fd5b60025f81905550610d7e3384846119e4565b905060015f8190555092915050565b5f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610de79190612e82565b602060405180830381865afa158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e269190612eaf565b905090565b5f805f805f60025494506003549350610e42610d8d565b92506004549150610e5161177e565b90509091929394565b5f80610e64610d8d565b90505f60045414610ec457610ebf620186a0610eb1600954610ea385610e9589600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b610eef565b610eee620186a0610ee060095486611cd290919063ffffffff16565b611d4990919063ffffffff16565b5b915050919050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60025f5403610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290612dc6565b60405180910390fd5b60025f81905550610fdb30611d92565b610fe58383611e7b565b905060015f8190555092915050565b5f611029670de0b6b3a764000061101b8461100d61177e565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b60605f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561109b573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906110c39190612c90565b9050806040516020016110d69190612f24565b60405160208183030381529060405291505090565b5f80821161112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590612fb5565b60405180910390fd5b61118b60095461117d620186a061116f670de0b6b3a764000061116161115261177e565b89611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f60025f54036111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612dc6565b60405180910390fd5b60025f819055506111e933848461149d565b905060015f8190555092915050565b7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5881565b5f80821161125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613043565b60405180910390fd5b6112bc600a546112ae620186a06112a061127761177e565b611292670de0b6b3a764000089611cd290919063ffffffff16565b611d4990919063ffffffff16565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b9050919050565b5f6112cc61177e565b905090565b5f60025f5403611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130d90612dc6565b60405180910390fd5b60025f819055506113283383336119e4565b905060015f81905550919050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b5f61143461142f620186a0611421600a5486611cd290919063ffffffff16565b611d4990919063ffffffff16565b610ff4565b9050919050565b5f838311158290611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147991906128f1565b60405180910390fd5b505f8385611490919061308e565b9050809150509392505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561150657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c9061310b565b60405180910390fd5b5f8211611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90613173565b60405180910390fd5b5f61159061177e565b9050611619836040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116aa8360075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506116f481611955565b600160035f8282546117069190613191565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161176a91906127da565b60405180910390a360019150509392505050565b5f80600454146117c3576117be6004546117b0670de0b6b3a76400006117a2610d8d565b611cd290919063ffffffff16565b611d4990919063ffffffff16565b6117cd565b670de0b6b3a76400005b905090565b611859816040518060400160405280601481526020017f496e73756666696369656e742042616c616e636500000000000000000000000081525060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461143b9092919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506118e6816040518060400160405280600f81526020017f4e6567617469766520537570706c79000000000000000000000000000000000081525060045461143b9092919063ffffffff16565b6004819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161194991906127da565b60405180910390a35050565b5f61195e61177e565b9050818110156119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a9061320e565b60405180910390fd5b7f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed182826004546040516119d89392919061322c565b60405180910390a15050565b5f8083118015611a3157508260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410155b611a39575f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611aa157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611aa9575f80fd5b5f611ab261177e565b90505f611adf620186a0611ad1600a5488611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f611aeb82610ff4565b9050611af787876117d2565b7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611b52929190612e5b565b6020604051808303815f875af1158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b92919061328b565b611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890613300565b60405180910390fd5b611bda83611955565b600160035f828254611bec9190613191565b92505081905550611c468160055f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461207a90919063ffffffff16565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201819055507ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262878783604051611cbd9392919061331e565b60405180910390a18093505050509392505050565b5f808303611ce2575f9050611d43565b5f8284611cef9190613353565b9050828482611cfe91906133c1565b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590613461565b60405180910390fd5b809150505b92915050565b5f611d8a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506120d7565b905092915050565b611d9a612138565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506103e8811115611e77575f611dee61177e565b9050611dfa83836117d2565b7f8a1c945864c85a9dee42b8734075761f7a16095a8384ab751f2417c5767e227e82604051611e2991906127da565b60405180910390a17f046aa811b2923fd55b4ca06375b4045117d4584c66fc40880a8ab8ee32d88ed181611e5b61177e565b600454604051611e6d9392919061322c565b60405180910390a1505b5050565b5f807f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed69190612e82565b602060405180830381865afa158015611ef1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f159190612eaf565b90505f81118015611f265750808411155b611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c906134c9565b60405180910390fd5b5f611f6e61177e565b90505f611f79610d8d565b90505f611f85876122ee565b90508260055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555061201e8760055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461207a90919063ffffffff16565b60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001018190555061206e86828486612438565b94505050505092915050565b5f8082846120889190613191565b9050838110156120cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c490613531565b60405180910390fd5b8091505092915050565b5f808311829061211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211491906128f1565b60405180910390fd5b505f838561212b91906133c1565b9050809150509392505050565b5f7f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff16637e1c4273306040518263ffffffff1660e01b81526004016121929190612e82565b602060405180830381865afa1580156121ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d19190612eaf565b90505f811115612278577f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff16635247ab0530836040518363ffffffff1660e01b815260040161223692919061356f565b6020604051808303815f875af1158015612252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122769190612eaf565b505b5f4790505f8111156122ea5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156122e8573d5f803e3d5ffd5b505b5050565b5f806122f8610d8d565b90507f000000000000000000000000ca35638a3fddd02fec597d8c1681198c06b23f5873ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161235793929190613596565b6020604051808303815f875af1158015612373573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612397919061328b565b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613615565b60405180910390fd5b5f6123df610d8d565b9050818111612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a9061367d565b60405180910390fd5b818161242f919061308e565b92505050919050565b5f805f6004541461246f5761246a8461245c87600454611cd290919063ffffffff16565b611d4990919063ffffffff16565b612471565b845b90505f61249e620186a061249060095485611cd290919063ffffffff16565b611d4990919063ffffffff16565b90505f81116124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d9906136e5565b60405180910390fd5b6124ec8782612554565b6124f584611955565b600160035f8282546125079190613191565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe878260405161253f929190612e5b565b60405180910390a18092505050949350505050565b5f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff160361261757600160065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff160217905550600160025f82825461260f9190613191565b925050819055505b6126678160075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461207a90919063ffffffff16565b60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506126bd8160045461207a90919063ffffffff16565b6004819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272091906127da565b60405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6127668261273d565b9050919050565b6127768161275c565b8114612780575f80fd5b50565b5f813590506127918161276d565b92915050565b5f602082840312156127ac576127ab612735565b5b5f6127b984828501612783565b91505092915050565b5f819050919050565b6127d4816127c2565b82525050565b5f6020820190506127ed5f8301846127cb565b92915050565b5f819050919050565b5f61281661281161280c8461273d565b6127f3565b61273d565b9050919050565b5f612827826127fc565b9050919050565b5f6128388261281d565b9050919050565b6128488161282e565b82525050565b5f6020820190506128615f83018461283f565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561289e578082015181840152602081019050612883565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6128c382612867565b6128cd8185612871565b93506128dd818560208601612881565b6128e6816128a9565b840191505092915050565b5f6020820190508181035f83015261290981846128b9565b905092915050565b61291a816127c2565b8114612924575f80fd5b50565b5f8135905061293581612911565b92915050565b5f806040838503121561295157612950612735565b5b5f61295e85828601612783565b925050602061296f85828601612927565b9150509250929050565b5f8115159050919050565b61298d81612979565b82525050565b5f6020820190506129a65f830184612984565b92915050565b5f805f606084860312156129c3576129c2612735565b5b5f6129d086828701612783565b93505060206129e186828701612783565b92505060406129f286828701612927565b9150509250925092565b5f60ff82169050919050565b612a11816129fc565b82525050565b5f602082019050612a2a5f830184612a08565b92915050565b5f60208284031215612a4557612a44612735565b5b5f612a5284828501612927565b91505092915050565b5f8060408385031215612a7157612a70612735565b5b5f612a7e85828601612927565b9250506020612a8f85828601612783565b9150509250929050565b5f60a082019050612aac5f8301886127cb565b612ab960208301876127cb565b612ac660408301866127cb565b612ad360608301856127cb565b612ae060808301846127cb565b9695505050505050565b5f612af4826127fc565b9050919050565b5f612b0582612aea565b9050919050565b612b1581612afb565b82525050565b5f602082019050612b2e5f830184612b0c565b92915050565b5f8060408385031215612b4a57612b49612735565b5b5f612b5785828601612783565b9250506020612b6885828601612783565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612bb0826128a9565b810181811067ffffffffffffffff82111715612bcf57612bce612b7a565b5b80604052505050565b5f612be161272c565b9050612bed8282612ba7565b919050565b5f67ffffffffffffffff821115612c0c57612c0b612b7a565b5b612c15826128a9565b9050602081019050919050565b5f612c34612c2f84612bf2565b612bd8565b905082815260208101848484011115612c5057612c4f612b76565b5b612c5b848285612881565b509392505050565b5f82601f830112612c7757612c76612b72565b5b8151612c87848260208601612c22565b91505092915050565b5f60208284031215612ca557612ca4612735565b5b5f82015167ffffffffffffffff811115612cc257612cc1612739565b5b612cce84828501612c63565b91505092915050565b5f81905092915050565b7f5374616b656420000000000000000000000000000000000000000000000000005f82015250565b5f612d15600783612cd7565b9150612d2082612ce1565b600782019050919050565b5f612d3582612867565b612d3f8185612cd7565b9350612d4f818560208601612881565b80840191505092915050565b5f612d6582612d09565b9150612d718284612d2b565b915081905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612db0601f83612871565b9150612dbb82612d7c565b602082019050919050565b5f6020820190508181035f830152612ddd81612da4565b9050919050565b7f5a65726f20486f6c64696e6773000000000000000000000000000000000000005f82015250565b5f612e18600d83612871565b9150612e2382612de4565b602082019050919050565b5f6020820190508181035f830152612e4581612e0c565b9050919050565b612e558161275c565b82525050565b5f604082019050612e6e5f830185612e4c565b612e7b60208301846127cb565b9392505050565b5f602082019050612e955f830184612e4c565b92915050565b5f81519050612ea981612911565b92915050565b5f60208284031215612ec457612ec3612735565b5b5f612ed184828501612e9b565b91505092915050565b7f78000000000000000000000000000000000000000000000000000000000000005f82015250565b5f612f0e600183612cd7565b9150612f1982612eda565b600182019050919050565b5f612f2e82612f02565b9150612f3a8284612d2b565b915081905092915050565b7f546f6b656e20616d6f756e74206d7573742062652067726561746572207468615f8201527f6e20300000000000000000000000000000000000000000000000000000000000602082015250565b5f612f9f602383612871565b9150612faa82612f45565b604082019050919050565b5f6020820190508181035f830152612fcc81612f93565b9050919050565b7f42617365417373657420616d6f756e74206d75737420626520677265617465725f8201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b5f61302d602783612871565b915061303882612fd3565b604082019050919050565b5f6020820190508181035f83015261305a81613021565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613098826127c2565b91506130a3836127c2565b92508282039050818111156130bb576130ba613061565b5b92915050565b7f5472616e7366657220546f205a65726f000000000000000000000000000000005f82015250565b5f6130f5601083612871565b9150613100826130c1565b602082019050919050565b5f6020820190508181035f830152613122816130e9565b9050919050565b7f5472616e7366657220416d74205a65726f0000000000000000000000000000005f82015250565b5f61315d601183612871565b915061316882613129565b602082019050919050565b5f6020820190508181035f83015261318a81613151565b9050919050565b5f61319b826127c2565b91506131a6836127c2565b92508282019050808211156131be576131bd613061565b5b92915050565b7f50726963652043616e6e6f742046616c6c0000000000000000000000000000005f82015250565b5f6131f8601183612871565b9150613203826131c4565b602082019050919050565b5f6020820190508181035f830152613225816131ec565b9050919050565b5f60608201905061323f5f8301866127cb565b61324c60208301856127cb565b61325960408301846127cb565b949350505050565b61326a81612979565b8114613274575f80fd5b50565b5f8151905061328581613261565b92915050565b5f602082840312156132a05761329f612735565b5b5f6132ad84828501613277565b91505092915050565b7f556e6465726c79696e67205472616e73666572204661696c75726500000000005f82015250565b5f6132ea601b83612871565b91506132f5826132b6565b602082019050919050565b5f6020820190508181035f830152613317816132de565b9050919050565b5f6060820190506133315f830186612e4c565b61333e60208301856127cb565b61334b60408301846127cb565b949350505050565b5f61335d826127c2565b9150613368836127c2565b9250828202613376816127c2565b9150828204841483151761338d5761338c613061565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6133cb826127c2565b91506133d6836127c2565b9250826133e6576133e5613394565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61344b602183612871565b9150613456826133f1565b604082019050919050565b5f6020820190508181035f8301526134788161343f565b9050919050565b7f496e73756666696369656e742042616c616e63650000000000000000000000005f82015250565b5f6134b3601483612871565b91506134be8261347f565b602082019050919050565b5f6020820190508181035f8301526134e0816134a7565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f61351b601b83612871565b9150613526826134e7565b602082019050919050565b5f6020820190508181035f8301526135488161350f565b9050919050565b5f6135598261273d565b9050919050565b6135698161354f565b82525050565b5f6040820190506135825f830185613560565b61358f60208301846127cb565b9392505050565b5f6060820190506135a95f830186612e4c565b6135b66020830185612e4c565b6135c360408301846127cb565b949350505050565b7f4661696c757265205472616e736665722046726f6d00000000000000000000005f82015250565b5f6135ff601583612871565b915061360a826135cb565b602082019050919050565b5f6020820190508181035f83015261362c816135f3565b9050919050565b7f5a65726f205265636569766564000000000000000000000000000000000000005f82015250565b5f613667600d83612871565b915061367282613633565b602082019050919050565b5f6020820190508181035f8301526136948161365b565b9050919050565b7f5a65726f20416d6f756e740000000000000000000000000000000000000000005f82015250565b5f6136cf600b83612871565b91506136da8261369b565b602082019050919050565b5f6020820190508181035f8301526136fc816136c3565b905091905056fea264697066735822122082f68492e8dae00742a39a271e0bfe7aeb257f0523717e5426c49add5aa6edf764736f6c63430008140033