Token Kenshi
Polygon Sponsored slots available. Book your slot here!
Overview ERC-20
Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
10,000,000,000,000 KENSHI
Holders:
2 addresses
Transfers:
-
Contract:
Decimals:
18
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Kenshi
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-24 */ //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.11; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165. * * Implementers can declare support of contract interfaces, which can then be * queried by others. * * For an implementation, see {ERC165}. * * Note: Name adjusted to BSC network. */ interface IBEP165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /* @source https://github.com/binance-chain/bsc-genesis-contract/blob/master/contracts/bep20_template/BEP20Token.template CHANGES: - formatted with Prettier. - Updated syntax to 0.8.10 */ /** * @dev Interface of the ERC1363 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-1363. * * Standard functions a token contract and contracts working with tokens * can implement to make a token Payable. * * For an implementation, see https://github.com/vittominacori/erc1363-payable-token. * * Note: Name adjusted to BSC network. */ interface IBEP1363 is IBEP20, IBEP165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver * @param to address The address which you want to transfer to * @param value uint256 The amount of tokens to be transferred * @return true unless throwing */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @notice Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver * @param to address The address which you want to transfer to * @param value uint256 The amount of tokens to be transferred * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ function transferAndCall( address to, uint256 value, bytes memory data ) external returns (bool); /** * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 The amount of tokens to be transferred * @return true unless throwing */ function transferFromAndCall( address from, address to, uint256 value ) external returns (bool); /** * @notice Transfer tokens from one address to another and then call `onTransferReceived` on receiver * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 The amount of tokens to be transferred * @param data bytes Additional data with no specified format, sent in call to `to` * @return true unless throwing */ function transferFromAndCall( address from, address to, uint256 value, bytes memory data ) external returns (bool); /** * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender * and then call `onApprovalReceived` on spender. * @param spender address The address which will spend the funds * @param value uint256 The amount of tokens to be spent */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender * and then call `onApprovalReceived` on spender. * @param spender address The address which will spend the funds * @param value uint256 The amount of tokens to be spent * @param data bytes Additional data with no specified format, sent in call to `spender` */ function approveAndCall( address spender, uint256 value, bytes memory data ) external returns (bool); } /** * @title ERC1363Receiver interface * @dev Interface for any contract that wants to support `transferAndCall` or `transferFromAndCall` * from ERC1363 token contracts. */ interface IBEP1363Receiver { /* * Note: the ERC-165 identifier for this interface is 0x88a7ca5c. * 0x88a7ca5c === bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)")) */ /** * @notice Handle the receipt of ERC1363 tokens * @dev Any ERC1363 smart contract calls this function on the recipient * after a `transfer` or a `transferFrom`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the token contract address is always the message sender. * @param operator address The address which called `transferAndCall` or `transferFromAndCall` function * @param from address The address which are token transferred from * @param value uint256 The amount of tokens transferred * @param data bytes Additional data with no specified format * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` * unless throwing */ function onTransferReceived( address operator, address from, uint256 value, bytes memory data ) external returns (bytes4); } /** * @title ERC1363Spender interface * @dev Interface for any contract that wants to support `approveAndCall` * from ERC1363 token contracts. */ interface IBEP1363Spender { /* * Note: the ERC-165 identifier for this interface is 0x7b04a2d0. * 0x7b04a2d0 === bytes4(keccak256("onApprovalReceived(address,uint256,bytes)")) */ /** * @notice Handle the approval of ERC1363 tokens * @dev Any ERC1363 smart contract calls this function on the recipient * after an `approve`. This function MAY throw to revert and reject the * approval. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the token contract address is always the message sender. * @param owner address The address which called `approveAndCall` function * @param value uint256 The amount of tokens to be spent * @param data bytes Additional data with no specified format * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` * unless throwing */ function onApprovalReceived( address owner, uint256 value, bytes memory data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) // Note: Stripped the library from unused functions /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} function _msgSender() internal view returns (address) { return msg.sender; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() external onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract Kenshi is Context, IBEP20, IBEP165, IBEP1363, Ownable { using Address for address; /* BEP20 related */ mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; uint8 private _decimals; string private _symbol; string private _name; /* Kenshi related */ /* Reward calculation */ uint256 private _totalExcluded; uint256 private _circulation; uint256 private _balanceCoeff; uint256 private _minBalanceCoeff; /* Treasury */ address private _treasuryAddr; /* Special addresses (lockers, reserve, liquidity pools...) */ mapping(address => bool) private _excludedFromTax; mapping(address => bool) private _excludedFromFines; mapping(address => bool) private _excludedFromReflects; mapping(address => bool) private _excludedFromMaxBalance; mapping(address => bool) private _excludedFromFineAndTaxDestinations; /** * Admins can exclude or include addresses from tax, reflections or * maximum balance. An example is a Deployer creating a Kenshi Locker. */ mapping(address => bool) private _adminAddrs; /* Tokenomics */ mapping(address => uint256) private _purchaseTimes; address private _burnAddr; uint8 private _baseTax; uint8 private _burnPercentage; uint8 private _investPercentage; uint256 private _minMaxBalance; uint256 private _burnThreshold; /** * Instead of implementing log functions and calculating the fine * amount on-demand, we decided to use pre-calculated values for it. * Just a bit less accurate, but saves a lot of gas. */ uint8[30] private _earlySaleFines = [ 49, 39, 33, 29, 26, 23, 21, 19, 17, 16, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 5, 4, 4, 3, 3, 2, 2, 1, 0, 0 ]; /* Security / Anti-bot measures */ bool private _tradeOpen; constructor() { _name = "Kenshi"; _symbol = "KENSHI"; /** * Large supply and large decimal places are to help with * the accuracy loss caused by the reward system. */ _decimals = 18; _totalSupply = 10e12 * 1e18; _balances[msg.sender] = _totalSupply; emit Transfer(address(0), msg.sender, _totalSupply); /* Kenshi related */ _baseTax = 5; _burnPercentage = 1; _investPercentage = 50; /* Give the required privileges to the owner */ _adminAddrs[msg.sender] = true; _excludedFromTax[msg.sender] = true; _excludedFromFines[msg.sender] = true; _excludedFromReflects[msg.sender] = true; _excludedFromMaxBalance[msg.sender] = true; _excludedFromFineAndTaxDestinations[msg.sender] = true; /* Burning */ _burnAddr = address(0xdead); _burnThreshold = _totalSupply / 2; _excludedFromReflects[_burnAddr] = true; _excludedFromMaxBalance[_burnAddr] = true; _excludedFromFineAndTaxDestinations[_burnAddr] = true; /* Treasury */ _treasuryAddr = address(0); /* Set initial max balance, this amount increases over time */ _minMaxBalance = _totalSupply / 100; /** * This value gives us maximum precision without facing overflows * or underflows. Be careful when updating the _totalSupply or * the value below. */ _balanceCoeff = (~uint256(0)) / _totalSupply; _minBalanceCoeff = 1e18; /* Other initial variable values */ _totalExcluded = _totalSupply; } /** * @dev Throws if called by any account other than the admins. */ modifier onlyAdmins() { require(_adminAddrs[_msgSender()], "Kenshi: Caller is not an admin"); _; } /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address) { return owner(); } /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8) { return _decimals; } /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns the token name. */ function name() external view returns (string memory) { return _name; } /** * @dev See {BEP20-totalSupply}. */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * @dev See {BEP20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { if (isExcluded(account)) { return _balances[account]; } return _balances[account] / _balanceCoeff; } /** * @dev See {BEP20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {BEP20-allowance}. */ function allowance(address addr, address spender) external view returns (uint256) { return _allowances[addr][spender]; } /** * @dev See {BEP20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {BEP20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {BEP20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public returns (bool) { require( _allowances[sender][_msgSender()] > amount, "BEP20: transfer amount exceeds allowance" ); _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()] - amount ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { require( _allowances[_msgSender()][spender] > subtractedValue, "BEP20: decreased allowance below zero" ); _approve( _msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue ); return true; } event Reflect(uint256 amount); /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * Emits a {Reflect} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - `amount` should not exceed the maximum allowed * - `amount` should not cause the recipient balance to get bigger than the maximum allowed - trading should be open */ function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), "BEP20: transfer from the zero address"); require(recipient != address(0), "BEP20: transfer to the zero address"); require(amount > 0, "Kenshi: Transfer amount should be bigger than 0"); if ( (isTaxless(sender) && isFineFree(sender)) || isTaxlessDestination(recipient) ) { uint256 rOutgoing = _getTransferAmount(sender, amount); uint256 rIncoming = _getTransferAmount(recipient, amount); require( rOutgoing <= _balances[sender], "Kenshi: Balance is lower than the requested amount" ); /* Required for migrations and making a liquidity pool */ if (_tradeOpen || sender != owner()) { require( _checkMaxBalance(recipient, rIncoming), "Kenshi: Resulting balance more than the maximum allowed" ); } _balances[sender] = _balances[sender] - rOutgoing; _balances[recipient] = _balances[recipient] + rIncoming; if (isExcluded(sender) && !isExcluded(recipient)) { _totalExcluded = _totalExcluded - amount; } else if (!isExcluded(sender) && isExcluded(recipient)) { _totalExcluded = _totalExcluded + amount; } emit Transfer(sender, recipient, amount); return; } require(_tradeOpen, "Kenshi: Trading is not open yet"); uint256 burn = _getBurnAmount(amount); uint256 rawTax = _getTax(sender, amount); uint256 tax = rawTax > burn ? rawTax - burn : 0; /* Split the tax */ uint256 invest = (tax * _investPercentage) / 100; uint256 reward = tax - invest; uint256 remainingAmount = amount - tax - burn; uint256 outgoing = _getTransferAmount(sender, amount); uint256 incoming = _getTransferAmount(recipient, remainingAmount); require( outgoing <= _balances[sender], "Kenshi: Balance is lower than the requested amount" ); require( _checkMaxBalance(recipient, incoming), "Kenshi: Resulting balance more than the maximum allowed" ); if (invest > 0) { if (_treasuryAddr != address(0)) { _balances[_treasuryAddr] = _balances[_treasuryAddr] + invest; _totalExcluded = _totalExcluded + invest; emit Transfer(sender, _treasuryAddr, invest); } else { reward = reward + invest; } } if (burn > 0) { _balances[_burnAddr] = _balances[_burnAddr] + burn; _totalExcluded = _totalExcluded + burn; emit Transfer(sender, _burnAddr, burn); } _balances[sender] = _balances[sender] - outgoing; _balances[recipient] = _balances[recipient] + incoming; emit Transfer(sender, recipient, remainingAmount); if (isExcluded(sender)) { _totalExcluded = _totalExcluded - amount; } if (isExcluded(recipient)) { _totalExcluded = _totalExcluded + remainingAmount; } _circulation = _totalSupply - _totalExcluded; uint256 delta = (_balanceCoeff * reward) / _circulation; bool shouldReflect = _balanceCoeff - delta > _minBalanceCoeff; if (reward > 0 && !shouldReflect && _treasuryAddr != address(0)) { _balances[_treasuryAddr] = _balances[_treasuryAddr] + reward; _totalExcluded = _totalExcluded + reward; emit Transfer(sender, _treasuryAddr, reward); } else if (shouldReflect && delta < _balanceCoeff) { _balanceCoeff = _balanceCoeff - delta; emit Reflect(reward); } else if (reward > 0) { _balances[_burnAddr] = _balances[_burnAddr] + reward; _totalExcluded = _totalExcluded + reward; emit Transfer(sender, _burnAddr, reward); } _recordPurchase(recipient, incoming); } /** * @dev Sets `amount` as the allowance of `spender` over the `addr`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `addr` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address addr, address spender, uint256 amount ) internal { require(addr != address(0), "BEP20: approve from the zero address"); require(spender != address(0), "BEP20: approve to the zero address"); _allowances[addr][spender] = amount; emit Approval(addr, spender, amount); } /* ERC165 methods */ /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) external pure returns (bool) { return interfaceId == type(IBEP1363).interfaceId; } /* BEP1363 methods */ /** * @dev Transfer tokens to a specified address and then execute a callback on recipient. * @param recipient The address to transfer to. * @param amount The amount to be transferred. * @return A boolean that indicates if the operation was successful. */ function transferAndCall(address recipient, uint256 amount) external returns (bool) { return transferAndCall(recipient, amount, ""); } /** * @dev Transfer tokens to a specified address and then execute a callback on recipient. * @param recipient The address to transfer to * @param amount The amount to be transferred * @param data Additional data with no specified format * @return A boolean that indicates if the operation was successful. */ function transferAndCall( address recipient, uint256 amount, bytes memory data ) public returns (bool) { transfer(recipient, amount); require( _checkAndCallTransfer(_msgSender(), recipient, amount, data), "BEP1363: _checkAndCallTransfer reverts" ); return true; } /** * @dev Transfer tokens from one address to another and then execute a callback on recipient. * @param sender The address which you want to send tokens from * @param recipient The address which you want to transfer to * @param amount The amount of tokens to be transferred * @return A boolean that indicates if the operation was successful. */ function transferFromAndCall( address sender, address recipient, uint256 amount ) external returns (bool) { return transferFromAndCall(sender, recipient, amount, ""); } /** * @dev Transfer tokens from one address to another and then execute a callback on recipient. * @param sender The address which you want to send tokens from * @param recipient The address which you want to transfer to * @param amount The amount of tokens to be transferred * @param data Additional data with no specified format * @return A boolean that indicates if the operation was successful. */ function transferFromAndCall( address sender, address recipient, uint256 amount, bytes memory data ) public returns (bool) { transferFrom(sender, recipient, amount); require( _checkAndCallTransfer(sender, recipient, amount, data), "BEP1363: _checkAndCallTransfer reverts" ); return true; } /** * @dev Approve spender to transfer tokens and then execute a callback on recipient. * @param spender The address allowed to transfer to * @param amount The amount allowed to be transferred * @return A boolean that indicates if the operation was successful. */ function approveAndCall(address spender, uint256 amount) external returns (bool) { return approveAndCall(spender, amount, ""); } /** * @dev Approve spender to transfer tokens and then execute a callback on recipient. * @param spender The address allowed to transfer to. * @param amount The amount allowed to be transferred. * @param data Additional data with no specified format. * @return A boolean that indicates if the operation was successful. */ function approveAndCall( address spender, uint256 amount, bytes memory data ) public returns (bool) { approve(spender, amount); require( _checkAndCallApprove(spender, amount, data), "BEP1363: _checkAndCallApprove reverts" ); return true; } /** * @dev Internal function to invoke `onTransferReceived` on a target address * The call is not executed if the target address is not a contract * @param sender address Representing the previous owner of the given token value * @param recipient address Target address that will receive the tokens * @param amount uint256 The amount mount of tokens to be transferred * @param data bytes Optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function _checkAndCallTransfer( address sender, address recipient, uint256 amount, bytes memory data ) internal returns (bool) { if (!recipient.isContract()) { return false; } bytes4 retval = IBEP1363Receiver(recipient).onTransferReceived( _msgSender(), sender, amount, data ); return (retval == IBEP1363Receiver(recipient).onTransferReceived.selector); } /** * @dev Internal function to invoke `onApprovalReceived` on a target address * The call is not executed if the target address is not a contract * @param spender address The address which will spend the funds * @param amount uint256 The amount of tokens to be spent * @param data bytes Optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function _checkAndCallApprove( address spender, uint256 amount, bytes memory data ) internal returns (bool) { if (!spender.isContract()) { return false; } bytes4 retval = IBEP1363Spender(spender).onApprovalReceived( _msgSender(), amount, data ); return (retval == IBEP1363Spender(spender).onApprovalReceived.selector); } /* Kenshi methods */ /** * @dev Records weighted purchase times for fine calculation. */ function _recordPurchase(address addr, uint256 amount) private { uint256 current = _purchaseTimes[addr] * _decoeff(addr, _balances[addr] - amount); _purchaseTimes[addr] = (current + block.timestamp * _decoeff(addr, amount)) / balanceOf(addr); } /** * @dev Removes the coefficient factor from `addr` is not excluded. */ function _decoeff(address addr, uint256 amount) private view returns (uint256) { if (isExcluded(addr)) { return amount; } return amount / _balanceCoeff; } /** * @dev Check if `addr` is excluded from tax. */ function isTaxlessDestination(address addr) public view returns (bool) { return _excludedFromFineAndTaxDestinations[addr]; } /** * @dev Set `addr` is excluded from tax to `state`. */ function setIsTaxlessDestination(address addr, bool state) public onlyAdmins { _excludedFromFineAndTaxDestinations[addr] = state; } /** * @dev Check if `addr` is excluded from tax. */ function isTaxless(address addr) public view returns (bool) { return _excludedFromTax[addr]; } /** * @dev Set `addr` is excluded from tax to `state`. */ function setIsTaxless(address addr, bool state) public onlyAdmins { _excludedFromTax[addr] = state; } /** * @dev Check if `addr` is excluded from fines. */ function isFineFree(address addr) public view returns (bool) { return _excludedFromFines[addr]; } /** * @dev Set `addr` is excluded from fines to `state`. */ function setIsFineFree(address addr, bool state) public onlyAdmins { _excludedFromFines[addr] = state; } /** * @dev Check if `addr` is excluded from reflects. */ function isExcluded(address addr) public view returns (bool) { return _excludedFromReflects[addr]; } /** * @dev Set `addr` is excluded from reflections to `state`. */ function setIsExcluded(address addr, bool state) public onlyAdmins { if (isExcluded(addr) && !state) { uint256 balance = _balances[addr]; _totalExcluded = _totalExcluded - balance; _balances[addr] = _balances[addr] * _balanceCoeff; } else if (!isExcluded(addr) && state) { uint256 balance = _balances[addr] / _balanceCoeff; _totalExcluded = _totalExcluded + balance; _balances[addr] = balance; } _excludedFromReflects[addr] = state; } /** * @dev Check if `addr` is excluded from max balance limit. */ function isLimitless(address addr) public view returns (bool) { return _excludedFromMaxBalance[addr]; } /** * @dev Set `addr` is excluded from max balance to `state`. */ function setIsLimitless(address addr, bool state) public onlyAdmins { _excludedFromMaxBalance[addr] = state; } /** * @dev Check if `addr` is an admin. */ function isAdmin(address addr) external view returns (bool) { return _adminAddrs[addr]; } /** * @dev Set `addr` is excluded from reflections to `state`. */ function setIsAdmin(address addr, bool state) external onlyAdmins { _adminAddrs[addr] = state; } /** * @dev Calculates the burn amount for a transaction. * * Checks how many tokens are already burned, if it's more than the * burn threshold then it returns zero, otherwise returns one percent * of `amount`. */ function _getBurnAmount(uint256 amount) private view returns (uint256) { uint256 _burnedAmount = _balances[_burnAddr]; if (_burnedAmount >= _burnThreshold) { return 0; } uint256 toBurn = amount / 100; if (_burnThreshold - _burnedAmount < toBurn) { return _burnThreshold - _burnedAmount; } return toBurn; } /** * @dev Check how many tokens are currently burned. */ function getTotalBurned() external view returns (uint256) { return _balances[_burnAddr]; } /** * @dev Check how many tokens are currently excluded. */ function getTotalExcluded() external view returns (uint256) { return _totalExcluded; } /** * @dev Check how many tokens are in circulation. */ function getCirculation() external view returns (uint256) { return _circulation; } /** * @dev Get tax amount for `amount` moved from `sender`. */ function _getTax(address sender, uint256 amount) private view returns (uint256) { uint8 taxPercentage = _getTaxPercentage(sender); uint256 tax = (amount * taxPercentage) / 100; return tax; } /** * @dev calculate tax percentage for `sender` based on purchase times. */ function _getTaxPercentage(address sender) private view returns (uint8) { return getTaxPercentageAt(sender, block.timestamp); } /** * @dev calculate tax percentage for `sender` at `timestamp` based on purchase times. */ function getTaxPercentageAt(address sender, uint256 timestamp) public view returns (uint8) { bool taxFree = isTaxless(sender); bool fineFree = isFineFree(sender); if (taxFree && fineFree) { return 0; } if (fineFree) { return _baseTax; } uint256 daysPassed = (timestamp - _purchaseTimes[sender]) / 86400; if (daysPassed >= 30) { return taxFree ? 0 : _baseTax; } return taxFree ? _earlySaleFines[daysPassed] : _baseTax + _earlySaleFines[daysPassed]; } /** * @dev Calculates transfer amount based on reward exclusion and reward coeff. */ function _getTransferAmount(address sender, uint256 amount) private view returns (uint256) { if (isExcluded(sender)) { return amount; } return amount * _balanceCoeff; } /** * @dev Checks if `recipient` won't have more than max balance after a transfer. */ function _checkMaxBalance(address recipient, uint256 incoming) private view returns (bool) { if (isLimitless(recipient)) { return true; } uint256 newBalance = _balances[recipient] + incoming; return (newBalance / _balanceCoeff) <= getMaxBalance(); } /** * @dev Returns the current maximum balance. */ function getMaxBalance() public view returns (uint256) { return _minMaxBalance + _circulation / 100; } /** * @dev Returns the current balance coefficient. */ function getCurrentCoeff() external view returns (uint256) { return _balanceCoeff; } /** * @dev Remove `amount` from msg.sender and reflect it on all holders. * * Requirements: * * - `amount` shouldn't be bigger than the msg.sender balance. */ function deliver(uint256 amount) external { address sender = _msgSender(); uint256 outgoing = _getTransferAmount(sender, amount); require( outgoing <= _balances[sender], "Kenshi: Cannot deliver more than the owned balance" ); _balances[sender] = _balances[sender] - outgoing; if (isExcluded(sender)) { _totalExcluded = _totalExcluded - amount; _circulation = _totalSupply - _totalExcluded; } _balanceCoeff = _balanceCoeff - (_balanceCoeff * amount) / _circulation; require( _balanceCoeff > _minBalanceCoeff, "Kenshi: Coefficient smaller than the minimum defined" ); emit Reflect(amount); } event InvestmentPercentageChanged(uint8 percentage); /** * @dev Sets the treasury `percentage`, indirectly sets rewards percentage. * * Requirements: * * - percentage should be equal to or smaller than 100 * * emits a {InvestmentPercentageChanged} event. */ function setInvestPercentage(uint8 percentage) external onlyOwner { require(percentage <= 100); _investPercentage = percentage; emit InvestmentPercentageChanged(percentage); } /** * @dev Returns the investment percentage. */ function getInvestPercentage() external view returns (uint8) { return _investPercentage; } event BaseTaxChanged(uint8 percentage); /** * @dev Sets the base tax `percentage`. * * Requirements: * * - percentage should be equal to or smaller than 15 * * emits a {BaseTaxChanged} event. */ function setBaseTaxPercentage(uint8 percentage) external onlyOwner { require(percentage <= 15); _baseTax = percentage; emit BaseTaxChanged(percentage); } /** * @dev Returns the base tax percentage. */ function getBaseTaxPercentage() external view returns (uint8) { return _baseTax; } /** * @dev Sets the trading to open, allows making transfers. */ function openTrades() external onlyOwner { _tradeOpen = true; } /** * @dev Sets `treasury` addr for collecting investment tokens. * * Requirements: * * - `treasury` should not be address(0) */ function setTreasuryAddr(address treasury) external onlyOwner { require(treasury != address(0), "Kenshi: Cannot set treasury to 0x0"); if (_treasuryAddr != address(0)) { setIsTaxless(_treasuryAddr, false); setIsFineFree(_treasuryAddr, false); setIsExcluded(_treasuryAddr, false); setIsLimitless(_treasuryAddr, false); } _treasuryAddr = treasury; setIsTaxless(_treasuryAddr, true); setIsFineFree(_treasuryAddr, true); setIsExcluded(_treasuryAddr, true); setIsLimitless(_treasuryAddr, true); } event BurnThresholdChanged(uint256 threshold); /** * @dev Sets the `threshold` for automatic burns. * * emits a {BurnThresholdChanged} event. */ function setBurnThreshold(uint256 threshold) external onlyOwner { _burnThreshold = threshold; emit BurnThresholdChanged(threshold); } /** * @dev Returns the burn threshold amount. */ function getBurnThreshold() external view returns (uint256) { return _burnThreshold; } /** * @dev Sends `amount` of BEP20 `token` from contract address to `recipient` * * Useful if someone sent bep20 tokens to the contract address by mistake. */ function recoverBEP20( address token, address recipient, uint256 amount ) external onlyOwner returns (bool) { require( token != address(this), "Kenshi: Cannot recover Kenshi from the contract" ); return IBEP20(token).transfer(recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"percentage","type":"uint8"}],"name":"BaseTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"BurnThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"percentage","type":"uint8"}],"name":"InvestmentPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reflect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseTaxPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCoeff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInvestPercentage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getTaxPercentageAt","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalExcluded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isFineFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isLimitless","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isTaxless","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isTaxlessDestination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverBEP20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"percentage","type":"uint8"}],"name":"setBaseTaxPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setBurnThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"percentage","type":"uint8"}],"name":"setInvestPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsFineFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsLimitless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsTaxless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setIsTaxlessDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setTreasuryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFromAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052604051806103c00160405280603160ff168152602001602760ff168152602001602160ff168152602001601d60ff168152602001601a60ff168152602001601760ff168152602001601560ff168152602001601360ff168152602001601160ff168152602001601060ff168152602001600e60ff168152602001600d60ff168152602001600c60ff168152602001600b60ff168152602001600a60ff168152602001600960ff168152602001600860ff168152602001600760ff168152602001600760ff168152602001600660ff168152602001600560ff168152602001600460ff168152602001600460ff168152602001600360ff168152602001600360ff168152602001600260ff168152602001600260ff168152602001600160ff168152602001600060ff168152602001600060ff16815250601690601e6200014c9291906200084a565b503480156200015a57600080fd5b5060006200016d6200084260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060400160405280600681526020017f4b656e73686900000000000000000000000000000000000000000000000000008152506006908051906020019062000258929190620008eb565b506040518060400160405280600681526020017f4b454e534849000000000000000000000000000000000000000000000000000081525060059080519060200190620002a6929190620008eb565b506012600460006101000a81548160ff021916908360ff1602179055506c7e37be2022c0914b2680000000600381905550600354600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6003546040516200037f9190620009b6565b60405180910390a36005601360146101000a81548160ff021916908360ff1602179055506001601360156101000a81548160ff021916908360ff1602179055506032601360166101000a81548160ff021916908360ff1602179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061dead601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060026003546200063f919062000a02565b6015819055506001600e6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160106000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606460035462000806919062000a02565b6014819055506003546000196200081e919062000a02565b600981905550670de0b6b3a7640000600a8190555060035460078190555062000a9e565b600033905090565b82601e601f01602090048101928215620008d85791602002820160005b83821115620008a757835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000867565b8015620008d65782816101000a81549060ff0219169055600101602081600001049283019260010302620008a7565b505b509050620008e791906200097c565b5090565b828054620008f99062000a69565b90600052602060002090601f0160209004810192826200091d576000855562000969565b82601f106200093857805160ff191683800117855562000969565b8280016001018555821562000969579182015b82811115620009685782518255916020019190600101906200094b565b5b5090506200097891906200097c565b5090565b5b80821115620009975760008160009055506001016200097d565b5090565b6000819050919050565b620009b0816200099b565b82525050565b6000602082019050620009cd6000830184620009a5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000a0f826200099b565b915062000a1c836200099b565b92508262000a2f5762000a2e620009d3565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a8257607f821691505b60208210810362000a985762000a9762000a3a565b5b50919050565b61574c8062000aae6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c806395d89b4111610182578063c3e1888e116100e9578063cfd22ad3116100a2578063d8fbe9941161007c578063d8fbe99414610969578063dd62ed3e14610999578063e97b2a8d146109c9578063f2fde38b146109e7576102d6565b8063cfd22ad3146108ff578063d72419c41461091b578063d75371421461094b576102d6565b8063c3e1888e1461082b578063c4d259ad14610849578063c57480d814610865578063cae9ca5114610883578063cba0e996146108b3578063cf8e2f8e146108e3576102d6565b8063a9059cbb1161013b578063a9059cbb14610755578063af716f4614610785578063b55cd04b146107a3578063b9daee4b146107c1578063bf151cb8146107dd578063c1d34b89146107fb576102d6565b806395d89b41146106815780639d6b5f211461069f578063a457c2d7146106bb578063a5ae2d2f146106eb578063a7e05b9c1461071b578063a844e77814610737576102d6565b8063395093511161024157806370a08231116101fa578063893d20e8116101d4578063893d20e81461060d5780638b2415831461062b5780638da5cb5b1461064757806392900b0014610665576102d6565b806370a08231146105b757806371205ba7146105e7578063715018a614610603576102d6565b806339509351146104d15780633bd5d173146105015780634000aea01461051d57806341822f6d1461054d5780636f7598a91461057d5780636f78e80814610587576102d6565b806318160ddd1161029357806318160ddd146103d55780632120bb9d146103f357806323b872dd1461042357806324d7806c14610453578063313ce567146104835780633177029f146104a1576102d6565b806301ffc9a7146102db578063049a380f1461030b57806306fdde031461033b578063095ea7b3146103595780630c490f5d146103895780631296ee62146103a5575b600080fd5b6102f560048036038101906102f09190614297565b610a03565b60405161030291906142df565b60405180910390f35b61032560048036038101906103209190614358565b610a6d565b60405161033291906142df565b60405180910390f35b610343610ac3565b604051610350919061441e565b60405180910390f35b610373600480360381019061036e9190614476565b610b55565b60405161038091906142df565b60405180910390f35b6103a3600480360381019061039e91906144e2565b610b73565b005b6103bf60048036038101906103ba9190614476565b610c61565b6040516103cc91906142df565b60405180910390f35b6103dd610c85565b6040516103ea9190614531565b60405180910390f35b61040d60048036038101906104089190614358565b610c8f565b60405161041a91906142df565b60405180910390f35b61043d6004803603810190610438919061454c565b610ce5565b60405161044a91906142df565b60405180910390f35b61046d60048036038101906104689190614358565b610e62565b60405161047a91906142df565b60405180910390f35b61048b610eb8565b60405161049891906145bb565b60405180910390f35b6104bb60048036038101906104b69190614476565b610ecf565b6040516104c891906142df565b60405180910390f35b6104eb60048036038101906104e69190614476565b610ef3565b6040516104f891906142df565b60405180910390f35b61051b600480360381019061051691906145d6565b610f9f565b005b61053760048036038101906105329190614738565b6111b2565b60405161054491906142df565b60405180910390f35b61056760048036038101906105629190614358565b61121c565b60405161057491906142df565b60405180910390f35b610585611272565b005b6105a1600480360381019061059c919061454c565b611324565b6040516105ae91906142df565b60405180910390f35b6105d160048036038101906105cc9190614358565b6114b0565b6040516105de9190614531565b60405180910390f35b61060160048036038101906105fc91906147d3565b61155c565b005b61060b611657565b005b6106156117aa565b604051610622919061480f565b60405180910390f35b610645600480360381019061064091906144e2565b6117b9565b005b61064f6118a7565b60405161065c919061480f565b60405180910390f35b61067f600480360381019061067a91906144e2565b6118d0565b005b6106896119be565b604051610696919061441e565b60405180910390f35b6106b960048036038101906106b491906145d6565b611a50565b005b6106d560048036038101906106d09190614476565b611b26565b6040516106e291906142df565b60405180910390f35b61070560048036038101906107009190614358565b611c97565b60405161071291906142df565b60405180910390f35b61073560048036038101906107309190614358565b611ced565b005b61073f611ff4565b60405161074c9190614531565b60405180910390f35b61076f600480360381019061076a9190614476565b611ffe565b60405161077c91906142df565b60405180910390f35b61078d61201c565b60405161079a91906145bb565b60405180910390f35b6107ab612033565b6040516107b89190614531565b60405180910390f35b6107db60048036038101906107d691906144e2565b61209c565b005b6107e561218a565b6040516107f29190614531565b60405180910390f35b6108156004803603810190610810919061482a565b612194565b60405161082291906142df565b60405180910390f35b6108336121f9565b6040516108409190614531565b60405180910390f35b610863600480360381019061085e91906144e2565b61221c565b005b61086d61230a565b60405161087a91906145bb565b60405180910390f35b61089d60048036038101906108989190614738565b612321565b6040516108aa91906142df565b60405180910390f35b6108cd60048036038101906108c89190614358565b612383565b6040516108da91906142df565b60405180910390f35b6108fd60048036038101906108f891906144e2565b6123d9565b005b610919600480360381019061091491906147d3565b612691565b005b61093560048036038101906109309190614476565b61278c565b60405161094291906145bb565b60405180910390f35b6109536128f1565b6040516109609190614531565b60405180910390f35b610983600480360381019061097e919061454c565b6128fb565b60405161099091906142df565b60405180910390f35b6109b360048036038101906109ae91906148ad565b612921565b6040516109c09190614531565b60405180910390f35b6109d16129a8565b6040516109de9190614531565b60405180910390f35b610a0160048036038101906109fc9190614358565b6129b2565b005b60007fb0202a11000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610ad29061491c565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe9061491c565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b5050505050905090565b6000610b69610b62612a53565b8484612a5b565b6001905092915050565b60116000610b7f612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd90614999565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000610c7d8383604051806020016040528060008152506111b2565b905092915050565b6000600354905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d31612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614a2b565b60405180910390fd5b610db7848484612c24565b610e5784610dc3612a53565b84600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e0d612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e529190614a7a565b612a5b565b600190509392505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600460009054906101000a900460ff16905090565b6000610eeb838360405180602001604052806000815250612321565b905092915050565b6000610f95610f00612a53565b848460026000610f0e612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f909190614aae565b612a5b565b6001905092915050565b6000610fa9612a53565b90506000610fb78284613baf565b9050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290614b76565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110869190614a7a565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110d282612383565b1561110257826007546110e59190614a7a565b6007819055506007546003546110fb9190614a7a565b6008819055505b600854836009546111139190614b96565b61111d9190614c1f565b60095461112a9190614a7a565b600981905550600a5460095411611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d90614cc2565b60405180910390fd5b7f408e9645f473f06eda2e6a1d9fffa66cbe665c97f16f18d116b6767a4c95a0f6836040516111a59190614531565b60405180910390a1505050565b60006111be8484611ffe565b506111d26111ca612a53565b858585613bde565b611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614d54565b60405180910390fd5b600190509392505050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61127a612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90614dc0565b60405180910390fd5b6001601760006101000a81548160ff021916908315150217905550565b600061132e612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290614dc0565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142090614e52565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401611464929190614e72565b6020604051808303816000875af1158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190614eb0565b90509392505050565b60006114bb82612383565b1561150757600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611557565b600954600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115549190614c1f565b90505b919050565b611564612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e890614dc0565b60405180910390fd5b600f8160ff16111561160257600080fd5b80601360146101000a81548160ff021916908360ff1602179055507fda5b12ec8e97b327058800fb1a07075b414d18519ec40951feda80a5b4a974648160405161164c91906145bb565b60405180910390a150565b61165f612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614dc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006117b46118a7565b905090565b601160006117c5612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390614999565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601160006118dc612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195a90614999565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600580546119cd9061491c565b80601f01602080910402602001604051908101604052809291908181526020018280546119f99061491c565b8015611a465780601f10611a1b57610100808354040283529160200191611a46565b820191906000526020600020905b815481529060010190602001808311611a2957829003601f168201915b5050505050905090565b611a58612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90614dc0565b60405180910390fd5b806015819055507f964aa8da62513027e13863ea8dacd6937c67895e78df8e0af8dae4333a16abfa81604051611b1b9190614531565b60405180910390a150565b60008160026000611b35612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490614f4f565b60405180910390fd5b611c8d611bf8612a53565b848460026000611c06612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c889190614a7a565b612a5b565b6001905092915050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611cf5612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7990614dc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890614fe1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611efc57611e74600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000610b73565b611ea1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600061209c565b611ece600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006123d9565b611efb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006118d0565b5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611f6a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610b73565b611f97600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161209c565b611fc4600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016123d9565b611ff1600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016118d0565b50565b6000601554905090565b600061201261200b612a53565b8484612c24565b6001905092915050565b6000601360149054906101000a900460ff16905090565b600060016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b601160006120a8612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212690614999565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600854905090565b60006121a1858585610ce5565b506121ae85858585613bde565b6121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e490614d54565b60405180910390fd5b60019050949350505050565b6000606460085461220a9190614c1f565b6014546122179190614aae565b905090565b60116000612228612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a690614999565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000601360169054906101000a900460ff16905090565b600061232d8484610b55565b50612339848484613ced565b612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90615073565b60405180910390fd5b600190509392505050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601160006123e5612a53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390614999565b60405180910390fd5b61247582612383565b801561247f575080155b15612572576000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050806007546124d69190614a7a565b600781905550600954600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125299190614b96565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050612636565b61257b82612383565b1580156125855750805b15612635576000600954600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125d99190614c1f565b9050806007546125e99190614aae565b60078190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612699612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90614dc0565b60405180910390fd5b60648160ff16111561273757600080fd5b80601360166101000a81548160ff021916908360ff1602179055507f0c773aa4786a7af9d36a7f622d610914921fd7be651abe83ab4b9be6ba773df48160405161278191906145bb565b60405180910390a150565b60008061279884611c97565b905060006127a585610c8f565b90508180156127b15750805b156127c1576000925050506128eb565b80156127e057601360149054906101000a900460ff16925050506128eb565b600062015180601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866128319190614a7a565b61283b9190614c1f565b9050601e811061286c578261285f57601360149054906101000a900460ff16612862565b60005b93505050506128eb565b826128ba57601681601e811061288557612884615093565b5b602091828204019190069054906101000a900460ff16601360149054906101000a900460ff166128b591906150c2565b6128e5565b601681601e81106128ce576128cd615093565b5b602091828204019190069054906101000a900460ff165b93505050505b92915050565b6000600754905090565b600061291884848460405180602001604052806000815250612194565b90509392505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600954905090565b6129ba612a53565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3e90614dc0565b60405180910390fd5b612a5081613df9565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac19061516b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b30906151fd565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c179190614531565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a9061528f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf990615321565b60405180910390fd5b60008111612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c906153b3565b60405180910390fd5b612d4e83611c97565b8015612d5f5750612d5e83610c8f565b5b80612d6f5750612d6e8261121c565b5b156130a6576000612d808483613baf565b90506000612d8e8484613baf565b9050600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115612e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0990615445565b60405180910390fd5b601760009054906101000a900460ff1680612e605750612e306118a7565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612eaf57612e6f8482613f25565b612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea5906154d7565b60405180910390fd5b5b81600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612efa9190614a7a565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f889190614aae565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612fd485612383565b8015612fe65750612fe484612383565b155b156130045782600754612ff99190614a7a565b60078190555061303a565b61300d85612383565b15801561301f575061301e84612383565b5b1561303957826007546130329190614aae565b6007819055505b5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516130979190614531565b60405180910390a35050613baa565b601760009054906101000a900460ff166130f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ec90615543565b60405180910390fd5b600061310082613faf565b9050600061310e8584614071565b9050600082821161312057600061312d565b828261312c9190614a7a565b5b905060006064601360169054906101000a900460ff1660ff16836131519190614b96565b61315b9190614c1f565b90506000818361316b9190614a7a565b9050600085848861317c9190614a7a565b6131869190614a7a565b905060006131948a89613baf565b905060006131a28a84613baf565b9050600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115613226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321d90615445565b60405180910390fd5b6132308a82613f25565b61326f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613266906154d7565b60405180910390fd5b600085111561345057600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613440578460016000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461333b9190614aae565b60016000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550846007546133ae9190614aae565b600781905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516134339190614531565b60405180910390a361344f565b848461344c9190614aae565b93505b5b60008811156135c7578760016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134c69190614aae565b60016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550876007546135399190614aae565b600781905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040516135be9190614531565b60405180910390a35b81600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136129190614a7a565b600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546136a09190614aae565b600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516137409190614531565b60405180910390a36137518b612383565b1561376b57886007546137649190614a7a565b6007819055505b6137748a612383565b1561378e57826007546137879190614aae565b6007819055505b60075460035461379e9190614a7a565b6008819055506000600854856009546137b79190614b96565b6137c19190614c1f565b90506000600a54826009546137d69190614a7a565b1190506000861180156137e7575080155b80156138425750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156139b9578560016000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138b49190614aae565b60016000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856007546139279190614aae565b600781905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516139ac9190614531565b60405180910390a3613b95565b8080156139c7575060095482105b15613a1c57816009546139da9190614a7a565b6009819055507f408e9645f473f06eda2e6a1d9fffa66cbe665c97f16f18d116b6767a4c95a0f686604051613a0f9190614531565b60405180910390a1613b94565b6000861115613b93578560016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a929190614aae565b60016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555085600754613b059190614aae565b600781905550601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051613b8a9190614531565b60405180910390a35b5b5b613b9f8c846140a9565b505050505050505050505b505050565b6000613bba83612383565b15613bc757819050613bd8565b60095482613bd59190614b96565b90505b92915050565b6000613bff8473ffffffffffffffffffffffffffffffffffffffff166141c6565b613c0c5760009050613ce5565b60008473ffffffffffffffffffffffffffffffffffffffff166388a7ca5c613c32612a53565b8887876040518563ffffffff1660e01b8152600401613c5494939291906155b8565b6020604051808303816000875af1158015613c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c979190615619565b90506388a7ca5c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6000613d0e8473ffffffffffffffffffffffffffffffffffffffff166141c6565b613d1b5760009050613df2565b60008473ffffffffffffffffffffffffffffffffffffffff16637b04a2d0613d41612a53565b86866040518463ffffffff1660e01b8152600401613d6193929190615646565b6020604051808303816000875af1158015613d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da49190615619565b9050637b04a2d060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5f906156f6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000613f3083610a6d565b15613f3e5760019050613fa9565b600082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613f8b9190614aae565b9050613f956121f9565b60095482613fa39190614c1f565b11159150505b92915050565b60008060016000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601554811061402957600091505061406c565b60006064846140389190614c1f565b905080826015546140499190614a7a565b1015614066578160155461405d9190614a7a565b9250505061406c565b80925050505b919050565b60008061407d846141e9565b9050600060648260ff16856140929190614b96565b61409c9190614c1f565b9050809250505092915050565b60006140ff8383600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140fa9190614a7a565b6141fc565b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141499190614b96565b9050614154836114b0565b61415e84846141fc565b426141699190614b96565b826141749190614aae565b61417e9190614c1f565b601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006141f5824261278c565b9050919050565b600061420783612383565b1561421457819050614225565b600954826142229190614c1f565b90505b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6142748161423f565b811461427f57600080fd5b50565b6000813590506142918161426b565b92915050565b6000602082840312156142ad576142ac614235565b5b60006142bb84828501614282565b91505092915050565b60008115159050919050565b6142d9816142c4565b82525050565b60006020820190506142f460008301846142d0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614325826142fa565b9050919050565b6143358161431a565b811461434057600080fd5b50565b6000813590506143528161432c565b92915050565b60006020828403121561436e5761436d614235565b5b600061437c84828501614343565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143bf5780820151818401526020810190506143a4565b838111156143ce576000848401525b50505050565b6000601f19601f8301169050919050565b60006143f082614385565b6143fa8185614390565b935061440a8185602086016143a1565b614413816143d4565b840191505092915050565b6000602082019050818103600083015261443881846143e5565b905092915050565b6000819050919050565b61445381614440565b811461445e57600080fd5b50565b6000813590506144708161444a565b92915050565b6000806040838503121561448d5761448c614235565b5b600061449b85828601614343565b92505060206144ac85828601614461565b9150509250929050565b6144bf816142c4565b81146144ca57600080fd5b50565b6000813590506144dc816144b6565b92915050565b600080604083850312156144f9576144f8614235565b5b600061450785828601614343565b9250506020614518858286016144cd565b9150509250929050565b61452b81614440565b82525050565b60006020820190506145466000830184614522565b92915050565b60008060006060848603121561456557614564614235565b5b600061457386828701614343565b935050602061458486828701614343565b925050604061459586828701614461565b9150509250925092565b600060ff82169050919050565b6145b58161459f565b82525050565b60006020820190506145d060008301846145ac565b92915050565b6000602082840312156145ec576145eb614235565b5b60006145fa84828501614461565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614645826143d4565b810181811067ffffffffffffffff821117156146645761466361460d565b5b80604052505050565b600061467761422b565b9050614683828261463c565b919050565b600067ffffffffffffffff8211156146a3576146a261460d565b5b6146ac826143d4565b9050602081019050919050565b82818337600083830152505050565b60006146db6146d684614688565b61466d565b9050828152602081018484840111156146f7576146f6614608565b5b6147028482856146b9565b509392505050565b600082601f83011261471f5761471e614603565b5b813561472f8482602086016146c8565b91505092915050565b60008060006060848603121561475157614750614235565b5b600061475f86828701614343565b935050602061477086828701614461565b925050604084013567ffffffffffffffff8111156147915761479061423a565b5b61479d8682870161470a565b9150509250925092565b6147b08161459f565b81146147bb57600080fd5b50565b6000813590506147cd816147a7565b92915050565b6000602082840312156147e9576147e8614235565b5b60006147f7848285016147be565b91505092915050565b6148098161431a565b82525050565b60006020820190506148246000830184614800565b92915050565b6000806000806080858703121561484457614843614235565b5b600061485287828801614343565b945050602061486387828801614343565b935050604061487487828801614461565b925050606085013567ffffffffffffffff8111156148955761489461423a565b5b6148a18782880161470a565b91505092959194509250565b600080604083850312156148c4576148c3614235565b5b60006148d285828601614343565b92505060206148e385828601614343565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061493457607f821691505b602082108103614947576149466148ed565b5b50919050565b7f4b656e7368693a2043616c6c6572206973206e6f7420616e2061646d696e0000600082015250565b6000614983601e83614390565b915061498e8261494d565b602082019050919050565b600060208201905081810360008301526149b281614976565b9050919050565b7f42455032303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614a15602883614390565b9150614a20826149b9565b604082019050919050565b60006020820190508181036000830152614a4481614a08565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a8582614440565b9150614a9083614440565b925082821015614aa357614aa2614a4b565b5b828203905092915050565b6000614ab982614440565b9150614ac483614440565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af957614af8614a4b565b5b828201905092915050565b7f4b656e7368693a2043616e6e6f742064656c69766572206d6f7265207468616e60008201527f20746865206f776e65642062616c616e63650000000000000000000000000000602082015250565b6000614b60603283614390565b9150614b6b82614b04565b604082019050919050565b60006020820190508181036000830152614b8f81614b53565b9050919050565b6000614ba182614440565b9150614bac83614440565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614be557614be4614a4b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c2a82614440565b9150614c3583614440565b925082614c4557614c44614bf0565b5b828204905092915050565b7f4b656e7368693a20436f656666696369656e7420736d616c6c6572207468616e60008201527f20746865206d696e696d756d20646566696e6564000000000000000000000000602082015250565b6000614cac603483614390565b9150614cb782614c50565b604082019050919050565b60006020820190508181036000830152614cdb81614c9f565b9050919050565b7f424550313336333a205f636865636b416e6443616c6c5472616e73666572207260008201527f6576657274730000000000000000000000000000000000000000000000000000602082015250565b6000614d3e602683614390565b9150614d4982614ce2565b604082019050919050565b60006020820190508181036000830152614d6d81614d31565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614daa602083614390565b9150614db582614d74565b602082019050919050565b60006020820190508181036000830152614dd981614d9d565b9050919050565b7f4b656e7368693a2043616e6e6f74207265636f766572204b656e73686920667260008201527f6f6d2074686520636f6e74726163740000000000000000000000000000000000602082015250565b6000614e3c602f83614390565b9150614e4782614de0565b604082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b6000604082019050614e876000830185614800565b614e946020830184614522565b9392505050565b600081519050614eaa816144b6565b92915050565b600060208284031215614ec657614ec5614235565b5b6000614ed484828501614e9b565b91505092915050565b7f42455032303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614f39602583614390565b9150614f4482614edd565b604082019050919050565b60006020820190508181036000830152614f6881614f2c565b9050919050565b7f4b656e7368693a2043616e6e6f742073657420747265617375727920746f203060008201527f7830000000000000000000000000000000000000000000000000000000000000602082015250565b6000614fcb602283614390565b9150614fd682614f6f565b604082019050919050565b60006020820190508181036000830152614ffa81614fbe565b9050919050565b7f424550313336333a205f636865636b416e6443616c6c417070726f766520726560008201527f7665727473000000000000000000000000000000000000000000000000000000602082015250565b600061505d602583614390565b915061506882615001565b604082019050919050565b6000602082019050818103600083015261508c81615050565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150cd8261459f565b91506150d88361459f565b92508260ff038211156150ee576150ed614a4b565b5b828201905092915050565b7f42455032303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615155602483614390565b9150615160826150f9565b604082019050919050565b6000602082019050818103600083015261518481615148565b9050919050565b7f42455032303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006151e7602283614390565b91506151f28261518b565b604082019050919050565b60006020820190508181036000830152615216816151da565b9050919050565b7f42455032303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615279602583614390565b91506152848261521d565b604082019050919050565b600060208201905081810360008301526152a88161526c565b9050919050565b7f42455032303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061530b602383614390565b9150615316826152af565b604082019050919050565b6000602082019050818103600083015261533a816152fe565b9050919050565b7f4b656e7368693a205472616e7366657220616d6f756e742073686f756c64206260008201527f6520626967676572207468616e20300000000000000000000000000000000000602082015250565b600061539d602f83614390565b91506153a882615341565b604082019050919050565b600060208201905081810360008301526153cc81615390565b9050919050565b7f4b656e7368693a2042616c616e6365206973206c6f776572207468616e20746860008201527f652072657175657374656420616d6f756e740000000000000000000000000000602082015250565b600061542f603283614390565b915061543a826153d3565b604082019050919050565b6000602082019050818103600083015261545e81615422565b9050919050565b7f4b656e7368693a20526573756c74696e672062616c616e6365206d6f7265207460008201527f68616e20746865206d6178696d756d20616c6c6f776564000000000000000000602082015250565b60006154c1603783614390565b91506154cc82615465565b604082019050919050565b600060208201905081810360008301526154f0816154b4565b9050919050565b7f4b656e7368693a2054726164696e67206973206e6f74206f70656e2079657400600082015250565b600061552d601f83614390565b9150615538826154f7565b602082019050919050565b6000602082019050818103600083015261555c81615520565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061558a82615563565b615594818561556e565b93506155a48185602086016143a1565b6155ad816143d4565b840191505092915050565b60006080820190506155cd6000830187614800565b6155da6020830186614800565b6155e76040830185614522565b81810360608301526155f9818461557f565b905095945050505050565b6000815190506156138161426b565b92915050565b60006020828403121561562f5761562e614235565b5b600061563d84828501615604565b91505092915050565b600060608201905061565b6000830186614800565b6156686020830185614522565b818103604083015261567a818461557f565b9050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156e0602683614390565b91506156eb82615684565b604082019050919050565b6000602082019050818103600083015261570f816156d3565b905091905056fea2646970667358221220c3b36ded65efd5d64a5b151801dec4aa2dc0b6ec41bc51208f7dd446ca89b18064736f6c634300080e0033
Deployed ByteCode Sourcemap
15733:32543:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30505:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39482:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20489:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21750:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38041:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31008:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20638:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38235:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22373:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39882:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20187:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33670:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23265:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44140:783;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31537:362;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37384:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46340:77;;;:::i;:::-;;47936:337;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20793:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45897:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14946:142;;;:::i;:::-;;20035:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37605:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14304:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39690:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20337:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47410:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24049:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37850:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46595:626;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47640:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21218:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46154:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40930:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38431:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41300:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32966:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43638:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40076:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45530:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34206:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38631:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38836:555;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45249:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42098:662;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41119:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32295:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21438:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43834:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15243:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30505:175;30602:4;30646:26;30631:41;;;:11;:41;;;;30624:48;;30505:175;;;:::o;39482:117::-;39538:4;39562:23;:29;39586:4;39562:29;;;;;;;;;;;;;;;;;;;;;;;;;39555:36;;39482:117;;;:::o;20489:85::-;20528:13;20561:5;20554:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20489:85;:::o;21750:152::-;21816:4;21833:39;21842:12;:10;:12::i;:::-;21856:7;21865:6;21833:8;:39::i;:::-;21890:4;21883:11;;21750:152;;;;:::o;38041:115::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38143:5:::1;38118:16;:22;38135:4;38118:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;38041:115:::0;;:::o;31008:171::-;31104:4;31133:38;31149:9;31160:6;31133:38;;;;;;;;;;;;:15;:38::i;:::-;31126:45;;31008:171;;;;:::o;20638:93::-;20684:7;20711:12;;20704:19;;20638:93;:::o;38235:111::-;38290:4;38314:18;:24;38333:4;38314:24;;;;;;;;;;;;;;;;;;;;;;;;;38307:31;;38235:111;;;:::o;22373:484::-;22496:4;22571:6;22535:11;:19;22547:6;22535:19;;;;;;;;;;;;;;;:33;22555:12;:10;:12::i;:::-;22535:33;;;;;;;;;;;;;;;;:42;22513:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;22656:36;22666:6;22674:9;22685:6;22656:9;:36::i;:::-;22703:124;22726:6;22747:12;:10;:12::i;:::-;22810:6;22774:11;:19;22786:6;22774:19;;;;;;;;;;;;;;;:33;22794:12;:10;:12::i;:::-;22774:33;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;22703:8;:124::i;:::-;22845:4;22838:11;;22373:484;;;;;:::o;39882:103::-;39936:4;39960:11;:17;39972:4;39960:17;;;;;;;;;;;;;;;;;;;;;;;;;39953:24;;39882:103;;;:::o;20187:85::-;20230:5;20255:9;;;;;;;;;;;20248:16;;20187:85;:::o;33670:165::-;33763:4;33792:35;33807:7;33816:6;33792:35;;;;;;;;;;;;:14;:35::i;:::-;33785:42;;33670:165;;;;:::o;23265:282::-;23365:4;23387:130;23410:12;:10;:12::i;:::-;23437:7;23496:10;23459:11;:25;23471:12;:10;:12::i;:::-;23459:25;;;;;;;;;;;;;;;:34;23485:7;23459:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;23387:8;:130::i;:::-;23535:4;23528:11;;23265:282;;;;:::o;44140:783::-;44193:14;44210:12;:10;:12::i;:::-;44193:29;;44233:16;44252:34;44271:6;44279;44252:18;:34::i;:::-;44233:53;;44333:9;:17;44343:6;44333:17;;;;;;;;;;;;;;;;44321:8;:29;;44299:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;44481:8;44461:9;:17;44471:6;44461:17;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;44441:9;:17;44451:6;44441:17;;;;;;;;;;;;;;;:48;;;;44506:18;44517:6;44506:10;:18::i;:::-;44502:150;;;44575:6;44558:14;;:23;;;;:::i;:::-;44541:14;:40;;;;44626:14;;44611:12;;:29;;;;:::i;:::-;44596:12;:44;;;;44502:150;44723:12;;44713:6;44697:13;;:22;;;;:::i;:::-;44696:39;;;;:::i;:::-;44680:13;;:55;;;;:::i;:::-;44664:13;:71;;;;44786:16;;44770:13;;:32;44748:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;44900:15;44908:6;44900:15;;;;;;:::i;:::-;;;;;;;;44182:741;;44140:783;:::o;31537:362::-;31666:4;31683:27;31692:9;31703:6;31683:8;:27::i;:::-;;31743:60;31765:12;:10;:12::i;:::-;31779:9;31790:6;31798:4;31743:21;:60::i;:::-;31721:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31887:4;31880:11;;31537:362;;;;;:::o;37384:138::-;37449:4;37473:35;:41;37509:4;37473:41;;;;;;;;;;;;;;;;;;;;;;;;;37466:48;;37384:138;;;:::o;46340:77::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46405:4:::1;46392:10;;:17;;;;;;;;;;;;;;;;;;46340:77::o:0;47936:337::-;48070:4;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48126:4:::1;48109:22;;:5;:22;;::::0;48087:119:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48231:5;48224:22;;;48247:9;48258:6;48224:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48217:48;;47936:337:::0;;;;;:::o;20793:213::-;20850:7;20874:19;20885:7;20874:10;:19::i;:::-;20870:77;;;20917:9;:18;20927:7;20917:18;;;;;;;;;;;;;;;;20910:25;;;;20870:77;20985:13;;20964:9;:18;20974:7;20964:18;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;20957:41;;20793:213;;;;:::o;45897:185::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45997:2:::1;45983:10;:16;;;;45975:25;;;::::0;::::1;;46022:10;46011:8;;:21;;;;;;;;;;;;;;;;;;46048:26;46063:10;46048:26;;;;;;:::i;:::-;;;;;;;;45897:185:::0;:::o;14946:142::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15047:1:::1;15010:40;;15031:6;::::0;::::1;;;;;;;;15010:40;;;;;;;;;;;;15078:1;15061:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;14946:142::o:0;20035:85::-;20078:7;20105;:5;:7::i;:::-;20098:14;;20035:85;:::o;37605:168::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37760:5:::1;37716:35;:41;37752:4;37716:41;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;37605:168:::0;;:::o;14304:79::-;14342:7;14369:6;;;;;;;;;;;14362:13;;14304:79;:::o;39690:124::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39801:5:::1;39769:23;:29;39793:4;39769:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;39690:124:::0;;:::o;20337:89::-;20378:13;20411:7;20404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20337:89;:::o;47410:156::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47502:9:::1;47485:14;:26;;;;47527:31;47548:9;47527:31;;;;;;:::i;:::-;;;;;;;;47410:156:::0;:::o;24049:442::-;24154:4;24235:15;24198:11;:25;24210:12;:10;:12::i;:::-;24198:25;;;;;;;;;;;;;;;:34;24224:7;24198:34;;;;;;;;;;;;;;;;:52;24176:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;24326:135;24349:12;:10;:12::i;:::-;24376:7;24435:15;24398:11;:25;24410:12;:10;:12::i;:::-;24398:25;;;;;;;;;;;;;;;:34;24424:7;24398:34;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;24326:8;:135::i;:::-;24479:4;24472:11;;24049:442;;;;:::o;37850:108::-;37904:4;37928:16;:22;37945:4;37928:22;;;;;;;;;;;;;;;;;;;;;;;;;37921:29;;37850:108;;;:::o;46595:626::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;46696:1:::1;46676:22;;:8;:22;;::::0;46668:69:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46779:1;46754:27;;:13;;;;;;;;;;;:27;;;46750:245;;46798:34;46811:13;;;;;;;;;;;46826:5;46798:12;:34::i;:::-;46847:35;46861:13;;;;;;;;;;;46876:5;46847:13;:35::i;:::-;46897;46911:13;;;;;;;;;;;46926:5;46897:13;:35::i;:::-;46947:36;46962:13;;;;;;;;;;;46977:5;46947:14;:36::i;:::-;46750:245;47023:8;47007:13;;:24;;;;;;;;;;;;;;;;;;47044:33;47057:13;;;;;;;;;;;47072:4;47044:12;:33::i;:::-;47088:34;47102:13;;;;;;;;;;;47117:4;47088:13;:34::i;:::-;47133;47147:13;;;;;;;;;;;47162:4;47133:13;:34::i;:::-;47178:35;47193:13;;;;;;;;;;;47208:4;47178:14;:35::i;:::-;46595:626:::0;:::o;47640:100::-;47691:7;47718:14;;47711:21;;47640:100;:::o;21218:158::-;21287:4;21304:42;21314:12;:10;:12::i;:::-;21328:9;21339:6;21304:9;:42::i;:::-;21364:4;21357:11;;21218:158;;;;:::o;46154:96::-;46209:5;46234:8;;;;;;;;;;;46227:15;;46154:96;:::o;40930:104::-;40979:7;41006:9;:20;41016:9;;;;;;;;;;;41006:20;;;;;;;;;;;;;;;;40999:27;;40930:104;:::o;38431:118::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38536:5:::1;38509:18;:24;38528:4;38509:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;38431:118:::0;;:::o;41300:96::-;41349:7;41376:12;;41369:19;;41300:96;:::o;32966:397::-;33124:4;33141:39;33154:6;33162:9;33173:6;33141:12;:39::i;:::-;;33213:54;33235:6;33243:9;33254:6;33262:4;33213:21;:54::i;:::-;33191:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;33351:4;33344:11;;32966:397;;;;;;:::o;43638:116::-;43684:7;43743:3;43728:12;;:18;;;;:::i;:::-;43711:14;;:35;;;;:::i;:::-;43704:42;;43638:116;:::o;40076:110::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40173:5:::1;40153:11;:17;40165:4;40153:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;40076:110:::0;;:::o;45530:104::-;45584:5;45609:17;;;;;;;;;;;45602:24;;45530:104;:::o;34206:338::-;34332:4;34349:24;34357:7;34366:6;34349:7;:24::i;:::-;;34406:43;34427:7;34436:6;34444:4;34406:20;:43::i;:::-;34384:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;34532:4;34525:11;;34206:338;;;;;:::o;38631:114::-;38686:4;38710:21;:27;38732:4;38710:27;;;;;;;;;;;;;;;;;;;;;;;;;38703:34;;38631:114;;;:::o;38836:555::-;19887:11;:25;19899:12;:10;:12::i;:::-;19887:25;;;;;;;;;;;;;;;;;;;;;;;;;19879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38918:16:::1;38929:4;38918:10;:16::i;:::-;:26;;;;;38939:5;38938:6;38918:26;38914:422;;;38961:15;38979:9;:15;38989:4;38979:15;;;;;;;;;;;;;;;;38961:33;;39043:7;39026:14;;:24;;;;:::i;:::-;39009:14;:41;;;;39101:13;;39083:9;:15;39093:4;39083:15;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;39065:9;:15;39075:4;39065:15;;;;;;;;;;;;;;;:49;;;;38946:180;38914:422;;;39137:16;39148:4;39137:10;:16::i;:::-;39136:17;:26;;;;;39157:5;39136:26;39132:204;;;39179:15;39215:13;;39197:9;:15;39207:4;39197:15;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;39179:49;;39277:7;39260:14;;:24;;;;:::i;:::-;39243:14;:41;;;;39317:7;39299:9;:15;39309:4;39299:15;;;;;;;;;;;;;;;:25;;;;39164:172;39132:204;38914:422;39378:5;39348:21;:27;39370:4;39348:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;38836:555:::0;;:::o;45249:207::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45348:3:::1;45334:10;:17;;;;45326:26;;;::::0;::::1;;45383:10;45363:17;;:30;;;;;;;;;;;;;;;;;;45409:39;45437:10;45409:39;;;;;;:::i;:::-;;;;;;;;45249:207:::0;:::o;42098:662::-;42209:5;42232:12;42247:17;42257:6;42247:9;:17::i;:::-;42232:32;;42275:13;42291:18;42302:6;42291:10;:18::i;:::-;42275:34;;42324:7;:19;;;;;42335:8;42324:19;42320:60;;;42367:1;42360:8;;;;;;42320:60;42394:8;42390:56;;;42426:8;;;;;;;;;;;42419:15;;;;;;42390:56;42456:18;42516:5;42490:14;:22;42505:6;42490:22;;;;;;;;;;;;;;;;42478:9;:34;;;;:::i;:::-;42477:44;;;;:::i;:::-;42456:65;;42550:2;42536:10;:16;42532:78;;42576:7;:22;;42590:8;;;;;;;;;;;42576:22;;;42586:1;42576:22;42569:29;;;;;;;42532:78;42640:7;:112;;42725:15;42741:10;42725:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;42714:8;;;;;;;;;;;:38;;;;:::i;:::-;42640:112;;;42667:15;42683:10;42667:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;42640:112;42620:132;;;;;42098:662;;;;;:::o;41119:100::-;41170:7;41197:14;;41190:21;;41119:100;:::o;32295:214::-;32427:4;32451:50;32471:6;32479:9;32490:6;32451:50;;;;;;;;;;;;:19;:50::i;:::-;32444:57;;32295:214;;;;;:::o;21438:166::-;21538:7;21570:11;:17;21582:4;21570:17;;;;;;;;;;;;;;;:26;21588:7;21570:26;;;;;;;;;;;;;;;;21563:33;;21438:166;;;;:::o;43834:98::-;43884:7;43911:13;;43904:20;;43834:98;:::o;15243:111::-;14526:12;:10;:12::i;:::-;14516:22;;:6;;;;;;;;;;:22;;;14508:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15318:28:::1;15337:8;15318:18;:28::i;:::-;15243:111:::0;:::o;13184:90::-;13229:7;13256:10;13249:17;;13184:90;:::o;30037:368::-;30180:1;30164:18;;:4;:18;;;30156:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30261:1;30242:21;;:7;:21;;;30234:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30344:6;30315:11;:17;30327:4;30315:17;;;;;;;;;;;;;;;:26;30333:7;30315:26;;;;;;;;;;;;;;;:35;;;;30381:7;30366:31;;30375:4;30366:31;;;30390:6;30366:31;;;;;;:::i;:::-;;;;;;;;30037:368;;;:::o;25258:4341::-;25408:1;25390:20;;:6;:20;;;25382:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;25492:1;25471:23;;:9;:23;;;25463:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25562:1;25553:6;:10;25545:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;25647:17;25657:6;25647:9;:17::i;:::-;:39;;;;;25668:18;25679:6;25668:10;:18::i;:::-;25647:39;25646:89;;;;25704:31;25725:9;25704:20;:31::i;:::-;25646:89;25628:1245;;;25762:17;25782:34;25801:6;25809;25782:18;:34::i;:::-;25762:54;;25831:17;25851:37;25870:9;25881:6;25851:18;:37::i;:::-;25831:57;;25944:9;:17;25954:6;25944:17;;;;;;;;;;;;;;;;25931:9;:30;;25905:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;26139:10;;;;;;;;;;;:31;;;;26163:7;:5;:7::i;:::-;26153:17;;:6;:17;;;;26139:31;26135:239;;;26221:38;26238:9;26249;26221:16;:38::i;:::-;26191:167;;;;;;;;;;;;:::i;:::-;;;;;;;;;26135:239;26430:9;26410;:17;26420:6;26410:17;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;26390:9;:17;26400:6;26390:17;;;;;;;;;;;;;;;:49;;;;26500:9;26477;:20;26487:9;26477:20;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;26454:9;:20;26464:9;26454:20;;;;;;;;;;;;;;;:55;;;;26530:18;26541:6;26530:10;:18::i;:::-;:44;;;;;26553:21;26564:9;26553:10;:21::i;:::-;26552:22;26530:44;26526:256;;;26629:6;26612:14;;:23;;;;:::i;:::-;26595:14;:40;;;;26526:256;;;26662:18;26673:6;26662:10;:18::i;:::-;26661:19;:44;;;;;26684:21;26695:9;26684:10;:21::i;:::-;26661:44;26657:125;;;26760:6;26743:14;;:23;;;;:::i;:::-;26726:14;:40;;;;26657:125;26526:256;26820:9;26803:35;;26812:6;26803:35;;;26831:6;26803:35;;;;;;:::i;:::-;;;;;;;;26855:7;;;;25628:1245;26893:10;;;;;;;;;;;26885:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;26952:12;26967:22;26982:6;26967:14;:22::i;:::-;26952:37;;27000:14;27017:23;27025:6;27033;27017:7;:23::i;:::-;27000:40;;27051:11;27074:4;27065:6;:13;:33;;27097:1;27065:33;;;27090:4;27081:6;:13;;;;:::i;:::-;27065:33;27051:47;;27142:14;27187:3;27166:17;;;;;;;;;;;27160:23;;:3;:23;;;;:::i;:::-;27159:31;;;;:::i;:::-;27142:48;;27201:14;27224:6;27218:3;:12;;;;:::i;:::-;27201:29;;27243:23;27284:4;27278:3;27269:6;:12;;;;:::i;:::-;:19;;;;:::i;:::-;27243:45;;27299:16;27318:34;27337:6;27345;27318:18;:34::i;:::-;27299:53;;27363:16;27382:46;27401:9;27412:15;27382:18;:46::i;:::-;27363:65;;27475:9;:17;27485:6;27475:17;;;;;;;;;;;;;;;;27463:8;:29;;27441:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;27605:37;27622:9;27633:8;27605:16;:37::i;:::-;27583:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;27751:1;27742:6;:10;27738:357;;;27798:1;27773:27;;:13;;;;;;;;;;;:27;;;27769:315;;27875:6;27848:9;:24;27858:13;;;;;;;;;;;27848:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;27821:9;:24;27831:13;;;;;;;;;;;27821:24;;;;;;;;;;;;;;;:60;;;;27934:6;27917:14;;:23;;;;:::i;:::-;27900:14;:40;;;;27981:13;;;;;;;;;;;27964:39;;27973:6;27964:39;;;27996:6;27964:39;;;;;;:::i;:::-;;;;;;;;27769:315;;;28062:6;28053;:15;;;;:::i;:::-;28044:24;;27769:315;27738:357;28118:1;28111:4;:8;28107:197;;;28182:4;28159:9;:20;28169:9;;;;;;;;;;;28159:20;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;28136:9;:20;28146:9;;;;;;;;;;;28136:20;;;;;;;;;;;;;;;:50;;;;28235:4;28218:14;;:21;;;;:::i;:::-;28201:14;:38;;;;28276:9;;;;;;;;;;;28259:33;;28268:6;28259:33;;;28287:4;28259:33;;;;;;:::i;:::-;;;;;;;;28107:197;28356:8;28336:9;:17;28346:6;28336:17;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;28316:9;:17;28326:6;28316:17;;;;;;;;;;;;;;;:48;;;;28421:8;28398:9;:20;28408:9;28398:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;28375:9;:20;28385:9;28375:20;;;;;;;;;;;;;;;:54;;;;28464:9;28447:44;;28456:6;28447:44;;;28475:15;28447:44;;;;;;:::i;:::-;;;;;;;;28508:18;28519:6;28508:10;:18::i;:::-;28504:91;;;28577:6;28560:14;;:23;;;;:::i;:::-;28543:14;:40;;;;28504:91;28611:21;28622:9;28611:10;:21::i;:::-;28607:103;;;28683:15;28666:14;;:32;;;;:::i;:::-;28649:14;:49;;;;28607:103;28752:14;;28737:12;;:29;;;;:::i;:::-;28722:12;:44;;;;28777:13;28820:12;;28810:6;28794:13;;:22;;;;:::i;:::-;28793:39;;;;:::i;:::-;28777:55;;28843:18;28888:16;;28880:5;28864:13;;:21;;;;:::i;:::-;:40;28843:61;;28930:1;28921:6;:10;:28;;;;;28936:13;28935:14;28921:28;:59;;;;;28978:1;28953:27;;:13;;;;;;;;;;;:27;;;;28921:59;28917:626;;;29051:6;29024:9;:24;29034:13;;;;;;;;;;;29024:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;28997:9;:24;29007:13;;;;;;;;;;;28997:24;;;;;;;;;;;;;;;:60;;;;29106:6;29089:14;;:23;;;;:::i;:::-;29072:14;:40;;;;29149:13;;;;;;;;;;;29132:39;;29141:6;29132:39;;;29164:6;29132:39;;;;;;:::i;:::-;;;;;;;;28917:626;;;29193:13;:38;;;;;29218:13;;29210:5;:21;29193:38;29189:354;;;29280:5;29264:13;;:21;;;;:::i;:::-;29248:13;:37;;;;29305:15;29313:6;29305:15;;;;;;:::i;:::-;;;;;;;;29189:354;;;29351:1;29342:6;:10;29338:205;;;29415:6;29392:9;:20;29402:9;;;;;;;;;;;29392:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;29369:9;:20;29379:9;;;;;;;;;;;29369:20;;;;;;;;;;;;;;;:52;;;;29470:6;29453:14;;:23;;;;:::i;:::-;29436:14;:40;;;;29513:9;;;;;;;;;;;29496:35;;29505:6;29496:35;;;29524:6;29496:35;;;;;;:::i;:::-;;;;;;;;29338:205;29189:354;28917:626;29555:36;29571:9;29582:8;29555:15;:36::i;:::-;25371:4228;;;;;;;;;;25258:4341;;;;:::o;42870:245::-;42979:7;43008:18;43019:6;43008:10;:18::i;:::-;43004:64;;;43050:6;43043:13;;;;43004:64;43094:13;;43085:6;:22;;;;:::i;:::-;43078:29;;42870:245;;;;;:::o;35110:524::-;35272:4;35294:22;:9;:20;;;:22::i;:::-;35289:68;;35340:5;35333:12;;;;35289:68;35367:13;35400:9;35383:46;;;35444:12;:10;:12::i;:::-;35471:6;35492;35513:4;35383:145;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35367:161;;35570:55;;;35547:78;;;:6;:78;;;;35539:87;;;35110:524;;;;;;;:::o;36094:454::-;36228:4;36250:20;:7;:18;;;:20::i;:::-;36245:66;;36294:5;36287:12;;;;36245:66;36321:13;36353:7;36337:43;;;36395:12;:10;:12::i;:::-;36422:6;36443:4;36337:121;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36321:137;;36487:52;;;36477:62;;;:6;:62;;;;36469:71;;;36094:454;;;;;;:::o;15460:266::-;15568:1;15548:22;;:8;:22;;;15526:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;15681:8;15652:38;;15673:6;;;;;;;;;;15652:38;;;;;;;;;;;;15710:8;15701:6;;:17;;;;;;;;;;;;;;;;;;15460:266;:::o;43227:335::-;43339:4;43365:22;43377:9;43365:11;:22::i;:::-;43361:66;;;43411:4;43404:11;;;;43361:66;43437:18;43481:8;43458:9;:20;43468:9;43458:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;43437:52;;43539:15;:13;:15::i;:::-;43521:13;;43508:10;:26;;;;:::i;:::-;43507:47;;43500:54;;;43227:335;;;;;:::o;40448:399::-;40510:7;40530:21;40554:9;:20;40564:9;;;;;;;;;;;40554:20;;;;;;;;;;;;;;;;40530:44;;40606:14;;40589:13;:31;40585:72;;40644:1;40637:8;;;;;40585:72;40667:14;40693:3;40684:6;:12;;;;:::i;:::-;40667:29;;40744:6;40728:13;40711:14;;:30;;;;:::i;:::-;:39;40707:109;;;40791:13;40774:14;;:30;;;;:::i;:::-;40767:37;;;;;;40707:109;40833:6;40826:13;;;;40448:399;;;;:::o;41484:254::-;41582:7;41607:19;41629:25;41647:6;41629:17;:25::i;:::-;41607:47;;41665:11;41706:3;41689:13;41680:22;;:6;:22;;;;:::i;:::-;41679:30;;;;:::i;:::-;41665:44;;41727:3;41720:10;;;;41484:254;;;;:::o;36669:308::-;36743:15;36797:40;36806:4;36830:6;36812:9;:15;36822:4;36812:15;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;36797:8;:40::i;:::-;36761:14;:20;36776:4;36761:20;;;;;;;;;;;;;;;;:76;;;;:::i;:::-;36743:94;;36954:15;36964:4;36954:9;:15::i;:::-;36915:22;36924:4;36930:6;36915:8;:22::i;:::-;36897:15;:40;;;;:::i;:::-;36887:7;:50;;;;:::i;:::-;36886:83;;;;:::i;:::-;36850:14;:20;36865:4;36850:20;;;;;;;;;;;;;;;:119;;;;36732:245;36669:308;;:::o;12135:326::-;12195:4;12452:1;12430:7;:19;;;:23;12423:30;;12135:326;;;:::o;41840:141::-;41905:5;41930:43;41949:6;41957:15;41930:18;:43::i;:::-;41923:50;;41840:141;;;:::o;37076:231::-;37173:7;37202:16;37213:4;37202:10;:16::i;:::-;37198:62;;;37242:6;37235:13;;;;37198:62;37286:13;;37277:6;:22;;;;:::i;:::-;37270:29;;37076:231;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:474::-;4174:6;4182;4231:2;4219:9;4210:7;4206:23;4202:32;4199:119;;;4237:79;;:::i;:::-;4199:119;4357:1;4382:53;4427:7;4418:6;4407:9;4403:22;4382:53;:::i;:::-;4372:63;;4328:117;4484:2;4510:53;4555:7;4546:6;4535:9;4531:22;4510:53;:::i;:::-;4500:63;;4455:118;4106:474;;;;;:::o;4586:116::-;4656:21;4671:5;4656:21;:::i;:::-;4649:5;4646:32;4636:60;;4692:1;4689;4682:12;4636:60;4586:116;:::o;4708:133::-;4751:5;4789:6;4776:20;4767:29;;4805:30;4829:5;4805:30;:::i;:::-;4708:133;;;;:::o;4847:468::-;4912:6;4920;4969:2;4957:9;4948:7;4944:23;4940:32;4937:119;;;4975:79;;:::i;:::-;4937:119;5095:1;5120:53;5165:7;5156:6;5145:9;5141:22;5120:53;:::i;:::-;5110:63;;5066:117;5222:2;5248:50;5290:7;5281:6;5270:9;5266:22;5248:50;:::i;:::-;5238:60;;5193:115;4847:468;;;;;:::o;5321:118::-;5408:24;5426:5;5408:24;:::i;:::-;5403:3;5396:37;5321:118;;:::o;5445:222::-;5538:4;5576:2;5565:9;5561:18;5553:26;;5589:71;5657:1;5646:9;5642:17;5633:6;5589:71;:::i;:::-;5445:222;;;;:::o;5673:619::-;5750:6;5758;5766;5815:2;5803:9;5794:7;5790:23;5786:32;5783:119;;;5821:79;;:::i;:::-;5783:119;5941:1;5966:53;6011:7;6002:6;5991:9;5987:22;5966:53;:::i;:::-;5956:63;;5912:117;6068:2;6094:53;6139:7;6130:6;6119:9;6115:22;6094:53;:::i;:::-;6084:63;;6039:118;6196:2;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6167:118;5673:619;;;;;:::o;6298:86::-;6333:7;6373:4;6366:5;6362:16;6351:27;;6298:86;;;:::o;6390:112::-;6473:22;6489:5;6473:22;:::i;:::-;6468:3;6461:35;6390:112;;:::o;6508:214::-;6597:4;6635:2;6624:9;6620:18;6612:26;;6648:67;6712:1;6701:9;6697:17;6688:6;6648:67;:::i;:::-;6508:214;;;;:::o;6728:329::-;6787:6;6836:2;6824:9;6815:7;6811:23;6807:32;6804:119;;;6842:79;;:::i;:::-;6804:119;6962:1;6987:53;7032:7;7023:6;7012:9;7008:22;6987:53;:::i;:::-;6977:63;;6933:117;6728:329;;;;:::o;7063:117::-;7172:1;7169;7162:12;7186:117;7295:1;7292;7285:12;7309:180;7357:77;7354:1;7347:88;7454:4;7451:1;7444:15;7478:4;7475:1;7468:15;7495:281;7578:27;7600:4;7578:27;:::i;:::-;7570:6;7566:40;7708:6;7696:10;7693:22;7672:18;7660:10;7657:34;7654:62;7651:88;;;7719:18;;:::i;:::-;7651:88;7759:10;7755:2;7748:22;7538:238;7495:281;;:::o;7782:129::-;7816:6;7843:20;;:::i;:::-;7833:30;;7872:33;7900:4;7892:6;7872:33;:::i;:::-;7782:129;;;:::o;7917:307::-;7978:4;8068:18;8060:6;8057:30;8054:56;;;8090:18;;:::i;:::-;8054:56;8128:29;8150:6;8128:29;:::i;:::-;8120:37;;8212:4;8206;8202:15;8194:23;;7917:307;;;:::o;8230:154::-;8314:6;8309:3;8304;8291:30;8376:1;8367:6;8362:3;8358:16;8351:27;8230:154;;;:::o;8390:410::-;8467:5;8492:65;8508:48;8549:6;8508:48;:::i;:::-;8492:65;:::i;:::-;8483:74;;8580:6;8573:5;8566:21;8618:4;8611:5;8607:16;8656:3;8647:6;8642:3;8638:16;8635:25;8632:112;;;8663:79;;:::i;:::-;8632:112;8753:41;8787:6;8782:3;8777;8753:41;:::i;:::-;8473:327;8390:410;;;;;:::o;8819:338::-;8874:5;8923:3;8916:4;8908:6;8904:17;8900:27;8890:122;;8931:79;;:::i;:::-;8890:122;9048:6;9035:20;9073:78;9147:3;9139:6;9132:4;9124:6;9120:17;9073:78;:::i;:::-;9064:87;;8880:277;8819:338;;;;:::o;9163:797::-;9249:6;9257;9265;9314:2;9302:9;9293:7;9289:23;9285:32;9282:119;;;9320:79;;:::i;:::-;9282:119;9440:1;9465:53;9510:7;9501:6;9490:9;9486:22;9465:53;:::i;:::-;9455:63;;9411:117;9567:2;9593:53;9638:7;9629:6;9618:9;9614:22;9593:53;:::i;:::-;9583:63;;9538:118;9723:2;9712:9;9708:18;9695:32;9754:18;9746:6;9743:30;9740:117;;;9776:79;;:::i;:::-;9740:117;9881:62;9935:7;9926:6;9915:9;9911:22;9881:62;:::i;:::-;9871:72;;9666:287;9163:797;;;;;:::o;9966:118::-;10037:22;10053:5;10037:22;:::i;:::-;10030:5;10027:33;10017:61;;10074:1;10071;10064:12;10017:61;9966:118;:::o;10090:135::-;10134:5;10172:6;10159:20;10150:29;;10188:31;10213:5;10188:31;:::i;:::-;10090:135;;;;:::o;10231:325::-;10288:6;10337:2;10325:9;10316:7;10312:23;10308:32;10305:119;;;10343:79;;:::i;:::-;10305:119;10463:1;10488:51;10531:7;10522:6;10511:9;10507:22;10488:51;:::i;:::-;10478:61;;10434:115;10231:325;;;;:::o;10562:118::-;10649:24;10667:5;10649:24;:::i;:::-;10644:3;10637:37;10562:118;;:::o;10686:222::-;10779:4;10817:2;10806:9;10802:18;10794:26;;10830:71;10898:1;10887:9;10883:17;10874:6;10830:71;:::i;:::-;10686:222;;;;:::o;10914:943::-;11009:6;11017;11025;11033;11082:3;11070:9;11061:7;11057:23;11053:33;11050:120;;;11089:79;;:::i;:::-;11050:120;11209:1;11234:53;11279:7;11270:6;11259:9;11255:22;11234:53;:::i;:::-;11224:63;;11180:117;11336:2;11362:53;11407:7;11398:6;11387:9;11383:22;11362:53;:::i;:::-;11352:63;;11307:118;11464:2;11490:53;11535:7;11526:6;11515:9;11511:22;11490:53;:::i;:::-;11480:63;;11435:118;11620:2;11609:9;11605:18;11592:32;11651:18;11643:6;11640:30;11637:117;;;11673:79;;:::i;:::-;11637:117;11778:62;11832:7;11823:6;11812:9;11808:22;11778:62;:::i;:::-;11768:72;;11563:287;10914:943;;;;;;;:::o;11863:474::-;11931:6;11939;11988:2;11976:9;11967:7;11963:23;11959:32;11956:119;;;11994:79;;:::i;:::-;11956:119;12114:1;12139:53;12184:7;12175:6;12164:9;12160:22;12139:53;:::i;:::-;12129:63;;12085:117;12241:2;12267:53;12312:7;12303:6;12292:9;12288:22;12267:53;:::i;:::-;12257:63;;12212:118;11863:474;;;;;:::o;12343:180::-;12391:77;12388:1;12381:88;12488:4;12485:1;12478:15;12512:4;12509:1;12502:15;12529:320;12573:6;12610:1;12604:4;12600:12;12590:22;;12657:1;12651:4;12647:12;12678:18;12668:81;;12734:4;12726:6;12722:17;12712:27;;12668:81;12796:2;12788:6;12785:14;12765:18;12762:38;12759:84;;12815:18;;:::i;:::-;12759:84;12580:269;12529:320;;;:::o;12855:180::-;12995:32;12991:1;12983:6;12979:14;12972:56;12855:180;:::o;13041:366::-;13183:3;13204:67;13268:2;13263:3;13204:67;:::i;:::-;13197:74;;13280:93;13369:3;13280:93;:::i;:::-;13398:2;13393:3;13389:12;13382:19;;13041:366;;;:::o;13413:419::-;13579:4;13617:2;13606:9;13602:18;13594:26;;13666:9;13660:4;13656:20;13652:1;13641:9;13637:17;13630:47;13694:131;13820:4;13694:131;:::i;:::-;13686:139;;13413:419;;;:::o;13838:227::-;13978:34;13974:1;13966:6;13962:14;13955:58;14047:10;14042:2;14034:6;14030:15;14023:35;13838:227;:::o;14071:366::-;14213:3;14234:67;14298:2;14293:3;14234:67;:::i;:::-;14227:74;;14310:93;14399:3;14310:93;:::i;:::-;14428:2;14423:3;14419:12;14412:19;;14071:366;;;:::o;14443:419::-;14609:4;14647:2;14636:9;14632:18;14624:26;;14696:9;14690:4;14686:20;14682:1;14671:9;14667:17;14660:47;14724:131;14850:4;14724:131;:::i;:::-;14716:139;;14443:419;;;:::o;14868:180::-;14916:77;14913:1;14906:88;15013:4;15010:1;15003:15;15037:4;15034:1;15027:15;15054:191;15094:4;15114:20;15132:1;15114:20;:::i;:::-;15109:25;;15148:20;15166:1;15148:20;:::i;:::-;15143:25;;15187:1;15184;15181:8;15178:34;;;15192:18;;:::i;:::-;15178:34;15237:1;15234;15230:9;15222:17;;15054:191;;;;:::o;15251:305::-;15291:3;15310:20;15328:1;15310:20;:::i;:::-;15305:25;;15344:20;15362:1;15344:20;:::i;:::-;15339:25;;15498:1;15430:66;15426:74;15423:1;15420:81;15417:107;;;15504:18;;:::i;:::-;15417:107;15548:1;15545;15541:9;15534:16;;15251:305;;;;:::o;15562:237::-;15702:34;15698:1;15690:6;15686:14;15679:58;15771:20;15766:2;15758:6;15754:15;15747:45;15562:237;:::o;15805:366::-;15947:3;15968:67;16032:2;16027:3;15968:67;:::i;:::-;15961:74;;16044:93;16133:3;16044:93;:::i;:::-;16162:2;16157:3;16153:12;16146:19;;15805:366;;;:::o;16177:419::-;16343:4;16381:2;16370:9;16366:18;16358:26;;16430:9;16424:4;16420:20;16416:1;16405:9;16401:17;16394:47;16458:131;16584:4;16458:131;:::i;:::-;16450:139;;16177:419;;;:::o;16602:348::-;16642:7;16665:20;16683:1;16665:20;:::i;:::-;16660:25;;16699:20;16717:1;16699:20;:::i;:::-;16694:25;;16887:1;16819:66;16815:74;16812:1;16809:81;16804:1;16797:9;16790:17;16786:105;16783:131;;;16894:18;;:::i;:::-;16783:131;16942:1;16939;16935:9;16924:20;;16602:348;;;;:::o;16956:180::-;17004:77;17001:1;16994:88;17101:4;17098:1;17091:15;17125:4;17122:1;17115:15;17142:185;17182:1;17199:20;17217:1;17199:20;:::i;:::-;17194:25;;17233:20;17251:1;17233:20;:::i;:::-;17228:25;;17272:1;17262:35;;17277:18;;:::i;:::-;17262:35;17319:1;17316;17312:9;17307:14;;17142:185;;;;:::o;17333:239::-;17473:34;17469:1;17461:6;17457:14;17450:58;17542:22;17537:2;17529:6;17525:15;17518:47;17333:239;:::o;17578:366::-;17720:3;17741:67;17805:2;17800:3;17741:67;:::i;:::-;17734:74;;17817:93;17906:3;17817:93;:::i;:::-;17935:2;17930:3;17926:12;17919:19;;17578:366;;;:::o;17950:419::-;18116:4;18154:2;18143:9;18139:18;18131:26;;18203:9;18197:4;18193:20;18189:1;18178:9;18174:17;18167:47;18231:131;18357:4;18231:131;:::i;:::-;18223:139;;17950:419;;;:::o;18375:225::-;18515:34;18511:1;18503:6;18499:14;18492:58;18584:8;18579:2;18571:6;18567:15;18560:33;18375:225;:::o;18606:366::-;18748:3;18769:67;18833:2;18828:3;18769:67;:::i;:::-;18762:74;;18845:93;18934:3;18845:93;:::i;:::-;18963:2;18958:3;18954:12;18947:19;;18606:366;;;:::o;18978:419::-;19144:4;19182:2;19171:9;19167:18;19159:26;;19231:9;19225:4;19221:20;19217:1;19206:9;19202:17;19195:47;19259:131;19385:4;19259:131;:::i;:::-;19251:139;;18978:419;;;:::o;19403:182::-;19543:34;19539:1;19531:6;19527:14;19520:58;19403:182;:::o;19591:366::-;19733:3;19754:67;19818:2;19813:3;19754:67;:::i;:::-;19747:74;;19830:93;19919:3;19830:93;:::i;:::-;19948:2;19943:3;19939:12;19932:19;;19591:366;;;:::o;19963:419::-;20129:4;20167:2;20156:9;20152:18;20144:26;;20216:9;20210:4;20206:20;20202:1;20191:9;20187:17;20180:47;20244:131;20370:4;20244:131;:::i;:::-;20236:139;;19963:419;;;:::o;20388:234::-;20528:34;20524:1;20516:6;20512:14;20505:58;20597:17;20592:2;20584:6;20580:15;20573:42;20388:234;:::o;20628:366::-;20770:3;20791:67;20855:2;20850:3;20791:67;:::i;:::-;20784:74;;20867:93;20956:3;20867:93;:::i;:::-;20985:2;20980:3;20976:12;20969:19;;20628:366;;;:::o;21000:419::-;21166:4;21204:2;21193:9;21189:18;21181:26;;21253:9;21247:4;21243:20;21239:1;21228:9;21224:17;21217:47;21281:131;21407:4;21281:131;:::i;:::-;21273:139;;21000:419;;;:::o;21425:332::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21597:71;21665:1;21654:9;21650:17;21641:6;21597:71;:::i;:::-;21678:72;21746:2;21735:9;21731:18;21722:6;21678:72;:::i;:::-;21425:332;;;;;:::o;21763:137::-;21817:5;21848:6;21842:13;21833:22;;21864:30;21888:5;21864:30;:::i;:::-;21763:137;;;;:::o;21906:345::-;21973:6;22022:2;22010:9;22001:7;21997:23;21993:32;21990:119;;;22028:79;;:::i;:::-;21990:119;22148:1;22173:61;22226:7;22217:6;22206:9;22202:22;22173:61;:::i;:::-;22163:71;;22119:125;21906:345;;;;:::o;22257:224::-;22397:34;22393:1;22385:6;22381:14;22374:58;22466:7;22461:2;22453:6;22449:15;22442:32;22257:224;:::o;22487:366::-;22629:3;22650:67;22714:2;22709:3;22650:67;:::i;:::-;22643:74;;22726:93;22815:3;22726:93;:::i;:::-;22844:2;22839:3;22835:12;22828:19;;22487:366;;;:::o;22859:419::-;23025:4;23063:2;23052:9;23048:18;23040:26;;23112:9;23106:4;23102:20;23098:1;23087:9;23083:17;23076:47;23140:131;23266:4;23140:131;:::i;:::-;23132:139;;22859:419;;;:::o;23284:221::-;23424:34;23420:1;23412:6;23408:14;23401:58;23493:4;23488:2;23480:6;23476:15;23469:29;23284:221;:::o;23511:366::-;23653:3;23674:67;23738:2;23733:3;23674:67;:::i;:::-;23667:74;;23750:93;23839:3;23750:93;:::i;:::-;23868:2;23863:3;23859:12;23852:19;;23511:366;;;:::o;23883:419::-;24049:4;24087:2;24076:9;24072:18;24064:26;;24136:9;24130:4;24126:20;24122:1;24111:9;24107:17;24100:47;24164:131;24290:4;24164:131;:::i;:::-;24156:139;;23883:419;;;:::o;24308:224::-;24448:34;24444:1;24436:6;24432:14;24425:58;24517:7;24512:2;24504:6;24500:15;24493:32;24308:224;:::o;24538:366::-;24680:3;24701:67;24765:2;24760:3;24701:67;:::i;:::-;24694:74;;24777:93;24866:3;24777:93;:::i;:::-;24895:2;24890:3;24886:12;24879:19;;24538:366;;;:::o;24910:419::-;25076:4;25114:2;25103:9;25099:18;25091:26;;25163:9;25157:4;25153:20;25149:1;25138:9;25134:17;25127:47;25191:131;25317:4;25191:131;:::i;:::-;25183:139;;24910:419;;;:::o;25335:180::-;25383:77;25380:1;25373:88;25480:4;25477:1;25470:15;25504:4;25501:1;25494:15;25521:237;25559:3;25578:18;25594:1;25578:18;:::i;:::-;25573:23;;25610:18;25626:1;25610:18;:::i;:::-;25605:23;;25700:1;25694:4;25690:12;25687:1;25684:19;25681:45;;;25706:18;;:::i;:::-;25681:45;25750:1;25747;25743:9;25736:16;;25521:237;;;;:::o;25764:223::-;25904:34;25900:1;25892:6;25888:14;25881:58;25973:6;25968:2;25960:6;25956:15;25949:31;25764:223;:::o;25993:366::-;26135:3;26156:67;26220:2;26215:3;26156:67;:::i;:::-;26149:74;;26232:93;26321:3;26232:93;:::i;:::-;26350:2;26345:3;26341:12;26334:19;;25993:366;;;:::o;26365:419::-;26531:4;26569:2;26558:9;26554:18;26546:26;;26618:9;26612:4;26608:20;26604:1;26593:9;26589:17;26582:47;26646:131;26772:4;26646:131;:::i;:::-;26638:139;;26365:419;;;:::o;26790:221::-;26930:34;26926:1;26918:6;26914:14;26907:58;26999:4;26994:2;26986:6;26982:15;26975:29;26790:221;:::o;27017:366::-;27159:3;27180:67;27244:2;27239:3;27180:67;:::i;:::-;27173:74;;27256:93;27345:3;27256:93;:::i;:::-;27374:2;27369:3;27365:12;27358:19;;27017:366;;;:::o;27389:419::-;27555:4;27593:2;27582:9;27578:18;27570:26;;27642:9;27636:4;27632:20;27628:1;27617:9;27613:17;27606:47;27670:131;27796:4;27670:131;:::i;:::-;27662:139;;27389:419;;;:::o;27814:224::-;27954:34;27950:1;27942:6;27938:14;27931:58;28023:7;28018:2;28010:6;28006:15;27999:32;27814:224;:::o;28044:366::-;28186:3;28207:67;28271:2;28266:3;28207:67;:::i;:::-;28200:74;;28283:93;28372:3;28283:93;:::i;:::-;28401:2;28396:3;28392:12;28385:19;;28044:366;;;:::o;28416:419::-;28582:4;28620:2;28609:9;28605:18;28597:26;;28669:9;28663:4;28659:20;28655:1;28644:9;28640:17;28633:47;28697:131;28823:4;28697:131;:::i;:::-;28689:139;;28416:419;;;:::o;28841:222::-;28981:34;28977:1;28969:6;28965:14;28958:58;29050:5;29045:2;29037:6;29033:15;29026:30;28841:222;:::o;29069:366::-;29211:3;29232:67;29296:2;29291:3;29232:67;:::i;:::-;29225:74;;29308:93;29397:3;29308:93;:::i;:::-;29426:2;29421:3;29417:12;29410:19;;29069:366;;;:::o;29441:419::-;29607:4;29645:2;29634:9;29630:18;29622:26;;29694:9;29688:4;29684:20;29680:1;29669:9;29665:17;29658:47;29722:131;29848:4;29722:131;:::i;:::-;29714:139;;29441:419;;;:::o;29866:234::-;30006:34;30002:1;29994:6;29990:14;29983:58;30075:17;30070:2;30062:6;30058:15;30051:42;29866:234;:::o;30106:366::-;30248:3;30269:67;30333:2;30328:3;30269:67;:::i;:::-;30262:74;;30345:93;30434:3;30345:93;:::i;:::-;30463:2;30458:3;30454:12;30447:19;;30106:366;;;:::o;30478:419::-;30644:4;30682:2;30671:9;30667:18;30659:26;;30731:9;30725:4;30721:20;30717:1;30706:9;30702:17;30695:47;30759:131;30885:4;30759:131;:::i;:::-;30751:139;;30478:419;;;:::o;30903:237::-;31043:34;31039:1;31031:6;31027:14;31020:58;31112:20;31107:2;31099:6;31095:15;31088:45;30903:237;:::o;31146:366::-;31288:3;31309:67;31373:2;31368:3;31309:67;:::i;:::-;31302:74;;31385:93;31474:3;31385:93;:::i;:::-;31503:2;31498:3;31494:12;31487:19;;31146:366;;;:::o;31518:419::-;31684:4;31722:2;31711:9;31707:18;31699:26;;31771:9;31765:4;31761:20;31757:1;31746:9;31742:17;31735:47;31799:131;31925:4;31799:131;:::i;:::-;31791:139;;31518:419;;;:::o;31943:242::-;32083:34;32079:1;32071:6;32067:14;32060:58;32152:25;32147:2;32139:6;32135:15;32128:50;31943:242;:::o;32191:366::-;32333:3;32354:67;32418:2;32413:3;32354:67;:::i;:::-;32347:74;;32430:93;32519:3;32430:93;:::i;:::-;32548:2;32543:3;32539:12;32532:19;;32191:366;;;:::o;32563:419::-;32729:4;32767:2;32756:9;32752:18;32744:26;;32816:9;32810:4;32806:20;32802:1;32791:9;32787:17;32780:47;32844:131;32970:4;32844:131;:::i;:::-;32836:139;;32563:419;;;:::o;32988:181::-;33128:33;33124:1;33116:6;33112:14;33105:57;32988:181;:::o;33175:366::-;33317:3;33338:67;33402:2;33397:3;33338:67;:::i;:::-;33331:74;;33414:93;33503:3;33414:93;:::i;:::-;33532:2;33527:3;33523:12;33516:19;;33175:366;;;:::o;33547:419::-;33713:4;33751:2;33740:9;33736:18;33728:26;;33800:9;33794:4;33790:20;33786:1;33775:9;33771:17;33764:47;33828:131;33954:4;33828:131;:::i;:::-;33820:139;;33547:419;;;:::o;33972:98::-;34023:6;34057:5;34051:12;34041:22;;33972:98;;;:::o;34076:168::-;34159:11;34193:6;34188:3;34181:19;34233:4;34228:3;34224:14;34209:29;;34076:168;;;;:::o;34250:360::-;34336:3;34364:38;34396:5;34364:38;:::i;:::-;34418:70;34481:6;34476:3;34418:70;:::i;:::-;34411:77;;34497:52;34542:6;34537:3;34530:4;34523:5;34519:16;34497:52;:::i;:::-;34574:29;34596:6;34574:29;:::i;:::-;34569:3;34565:39;34558:46;;34340:270;34250:360;;;;:::o;34616:640::-;34811:4;34849:3;34838:9;34834:19;34826:27;;34863:71;34931:1;34920:9;34916:17;34907:6;34863:71;:::i;:::-;34944:72;35012:2;35001:9;34997:18;34988:6;34944:72;:::i;:::-;35026;35094:2;35083:9;35079:18;35070:6;35026:72;:::i;:::-;35145:9;35139:4;35135:20;35130:2;35119:9;35115:18;35108:48;35173:76;35244:4;35235:6;35173:76;:::i;:::-;35165:84;;34616:640;;;;;;;:::o;35262:141::-;35318:5;35349:6;35343:13;35334:22;;35365:32;35391:5;35365:32;:::i;:::-;35262:141;;;;:::o;35409:349::-;35478:6;35527:2;35515:9;35506:7;35502:23;35498:32;35495:119;;;35533:79;;:::i;:::-;35495:119;35653:1;35678:63;35733:7;35724:6;35713:9;35709:22;35678:63;:::i;:::-;35668:73;;35624:127;35409:349;;;;:::o;35764:529::-;35931:4;35969:2;35958:9;35954:18;35946:26;;35982:71;36050:1;36039:9;36035:17;36026:6;35982:71;:::i;:::-;36063:72;36131:2;36120:9;36116:18;36107:6;36063:72;:::i;:::-;36182:9;36176:4;36172:20;36167:2;36156:9;36152:18;36145:48;36210:76;36281:4;36272:6;36210:76;:::i;:::-;36202:84;;35764:529;;;;;;:::o;36299:225::-;36439:34;36435:1;36427:6;36423:14;36416:58;36508:8;36503:2;36495:6;36491:15;36484:33;36299:225;:::o;36530:366::-;36672:3;36693:67;36757:2;36752:3;36693:67;:::i;:::-;36686:74;;36769:93;36858:3;36769:93;:::i;:::-;36887:2;36882:3;36878:12;36871:19;;36530:366;;;:::o;36902:419::-;37068:4;37106:2;37095:9;37091:18;37083:26;;37155:9;37149:4;37145:20;37141:1;37130:9;37126:17;37119:47;37183:131;37309:4;37183:131;:::i;:::-;37175:139;;36902:419;;;:::o
Swarm Source
ipfs://c3b36ded65efd5d64a5b151801dec4aa2dc0b6ec41bc51208f7dd446ca89b180