Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GebProxyActions
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-05-13
*/
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
pragma solidity >=0.6.7;
interface DSAuthority {
function canCall(
address src, address dst, bytes4 sig
) external view returns (bool);
}
abstract contract DSAuthEvents {
event LogSetAuthority (address indexed authority);
event LogSetOwner (address indexed owner);
}
contract DSAuth is DSAuthEvents {
DSAuthority public authority;
address public owner;
constructor() public {
owner = msg.sender;
emit LogSetOwner(msg.sender);
}
function setOwner(address owner_)
virtual
public
auth
{
owner = owner_;
emit LogSetOwner(owner);
}
function setAuthority(DSAuthority authority_)
virtual
public
auth
{
authority = authority_;
emit LogSetAuthority(address(authority));
}
modifier auth {
require(isAuthorized(msg.sender, msg.sig), "ds-auth-unauthorized");
_;
}
function isAuthorized(address src, bytes4 sig) virtual internal view returns (bool) {
if (src == address(this)) {
return true;
} else if (src == owner) {
return true;
} else if (authority == DSAuthority(0)) {
return false;
} else {
return authority.canCall(src, address(this), sig);
}
}
}
abstract contract CollateralLike {
function approve(address, uint) virtual public;
function transfer(address, uint) virtual public;
function transferFrom(address, address, uint) virtual public;
function deposit() virtual public payable;
function withdraw(uint) virtual public;
}
abstract contract ManagerLike {
function safeCan(address, uint, address) virtual public view returns (uint);
function collateralTypes(uint) virtual public view returns (bytes32);
function ownsSAFE(uint) virtual public view returns (address);
function safes(uint) virtual public view returns (address);
function safeEngine() virtual public view returns (address);
function openSAFE(bytes32, address) virtual public returns (uint);
function transferSAFEOwnership(uint, address) virtual public;
function allowSAFE(uint, address, uint) virtual public;
function allowHandler(address, uint) virtual public;
function modifySAFECollateralization(uint, int, int) virtual public;
function transferCollateral(uint, address, uint) virtual public;
function transferInternalCoins(uint, address, uint) virtual public;
function quitSystem(uint, address) virtual public;
function enterSystem(address, uint) virtual public;
function moveSAFE(uint, uint) virtual public;
function protectSAFE(uint, address, address) virtual public;
}
abstract contract SAFEEngineLike {
function canModifySAFE(address, address) virtual public view returns (uint);
function collateralTypes(bytes32) virtual public view returns (uint, uint, uint, uint, uint);
function coinBalance(address) virtual public view returns (uint);
function safes(bytes32, address) virtual public view returns (uint, uint);
function modifySAFECollateralization(bytes32, address, address, address, int, int) virtual public;
function approveSAFEModification(address) virtual public;
function transferInternalCoins(address, address, uint) virtual public;
}
abstract contract CollateralJoinLike {
function decimals() virtual public returns (uint);
function collateral() virtual public returns (CollateralLike);
function join(address, uint) virtual public payable;
function exit(address, uint) virtual public;
}
abstract contract GNTJoinLike {
function bags(address) virtual public view returns (address);
function make(address) virtual public returns (address);
}
abstract contract DSTokenLike {
function balanceOf(address) virtual public view returns (uint);
function approve(address, uint) virtual public;
function transfer(address, uint) virtual public returns (bool);
function transferFrom(address, address, uint) virtual public returns (bool);
}
abstract contract WethLike {
function balanceOf(address) virtual public view returns (uint);
function approve(address, uint) virtual public;
function transfer(address, uint) virtual public;
function transferFrom(address, address, uint) virtual public;
function deposit() virtual public payable;
function withdraw(uint) virtual public;
}
abstract contract CoinJoinLike {
function safeEngine() virtual public returns (SAFEEngineLike);
function systemCoin() virtual public returns (DSTokenLike);
function join(address, uint) virtual public payable;
function exit(address, uint) virtual public;
}
abstract contract ApproveSAFEModificationLike {
function approveSAFEModification(address) virtual public;
function denySAFEModification(address) virtual public;
}
abstract contract GlobalSettlementLike {
function collateralCashPrice(bytes32) virtual public view returns (uint);
function redeemCollateral(bytes32, uint) virtual public;
function freeCollateral(bytes32) virtual public;
function prepareCoinsForRedeeming(uint) virtual public;
function processSAFE(bytes32, address) virtual public;
}
abstract contract TaxCollectorLike {
function taxSingle(bytes32) virtual public returns (uint);
}
abstract contract CoinSavingsAccountLike {
function savings(address) virtual public view returns (uint);
function updateAccumulatedRate() virtual public returns (uint);
function deposit(uint) virtual public;
function withdraw(uint) virtual public;
}
abstract contract ProxyRegistryLike {
function proxies(address) virtual public view returns (address);
function build(address) virtual public returns (address);
}
abstract contract ProxyLike {
function owner() virtual public view returns (address);
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING: These functions meant to be used as a a library for a DSProxy. Some are unsafe if you call them directly.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
contract Common {
uint256 constant RAY = 10 ** 27;
// Internal functions
function multiply(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, "mul-overflow");
}
function _coinJoin_join(address apt, address safeHandler, uint wad) internal {
// Approves adapter to take the COIN amount
CoinJoinLike(apt).systemCoin().approve(apt, wad);
// Joins COIN into the safeEngine
CoinJoinLike(apt).join(safeHandler, wad);
}
// Public functions
function coinJoin_join(address apt, address safeHandler, uint wad) public {
// Gets COIN from the user's wallet
CoinJoinLike(apt).systemCoin().transferFrom(msg.sender, address(this), wad);
_coinJoin_join(apt, safeHandler, wad);
}
}
contract BasicActions is Common {
// Internal functions
/// @notice Safe subtraction
/// @dev Reverts on overflows
function subtract(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, "sub-overflow");
}
/// @notice Safe conversion uint -> int
/// @dev Reverts on overflows
function toInt(uint x) internal pure returns (int y) {
y = int(x);
require(y >= 0, "int-overflow");
}
/// @notice Converts a wad (18 decimal places) to rad (45 decimal places)
function toRad(uint wad) internal pure returns (uint rad) {
rad = multiply(wad, 10 ** 27);
}
function convertTo18(address collateralJoin, uint256 amt) internal returns (uint256 wad) {
// For those collaterals that have other than 18 decimals precision we need to do the conversion before passing to modifySAFECollateralization function
// Adapters will automatically handle the difference of precision
uint decimals = CollateralJoinLike(collateralJoin).decimals();
wad = amt;
if (decimals < 18) {
wad = multiply(
amt,
10 ** (18 - decimals)
);
} else if (decimals > 18) {
wad = amt / 10 ** (decimals - 18);
}
}
/// @notice Gets delta debt generated (Total Safe debt minus available safeHandler COIN balance)
/// @param safeEngine address
/// @param taxCollector address
/// @param safeHandler address
/// @param collateralType bytes32
/// @return deltaDebt
function _getGeneratedDeltaDebt(
address safeEngine,
address taxCollector,
address safeHandler,
bytes32 collateralType,
uint wad
) internal returns (int deltaDebt) {
// Updates stability fee rate
uint rate = TaxCollectorLike(taxCollector).taxSingle(collateralType);
require(rate > 0, "invalid-collateral-type");
// Gets COIN balance of the handler in the safeEngine
uint coin = SAFEEngineLike(safeEngine).coinBalance(safeHandler);
// If there was already enough COIN in the safeEngine balance, just exits it without adding more debt
if (coin < multiply(wad, RAY)) {
// Calculates the needed deltaDebt so together with the existing coins in the safeEngine is enough to exit wad amount of COIN tokens
deltaDebt = toInt(subtract(multiply(wad, RAY), coin) / rate);
// This is neeeded due lack of precision. It might need to sum an extra deltaDebt wei (for the given COIN wad amount)
deltaDebt = multiply(uint(deltaDebt), rate) < multiply(wad, RAY) ? deltaDebt + 1 : deltaDebt;
}
}
/// @notice Gets repaid delta debt generated (rate adjusted debt)
/// @param safeEngine address
/// @param coin uint amount
/// @param safe uint - safeId
/// @param collateralType bytes32
/// @return deltaDebt
function _getRepaidDeltaDebt(
address safeEngine,
uint coin,
address safe,
bytes32 collateralType
) internal view returns (int deltaDebt) {
// Gets actual rate from the safeEngine
(, uint rate,,,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType);
require(rate > 0, "invalid-collateral-type");
// Gets actual generatedDebt value of the safe
(, uint generatedDebt) = SAFEEngineLike(safeEngine).safes(collateralType, safe);
// Uses the whole coin balance in the safeEngine to reduce the debt
deltaDebt = toInt(coin / rate);
// Checks the calculated deltaDebt is not higher than safe.generatedDebt (total debt), otherwise uses its value
deltaDebt = uint(deltaDebt) <= generatedDebt ? - deltaDebt : - toInt(generatedDebt);
}
/// @notice Gets repaid debt (rate adjusted rate minus COIN balance available in usr's address)
/// @param safeEngine address
/// @param usr address
/// @param safe uint
/// @param collateralType address
/// @return wad
function _getRepaidAlDebt(
address safeEngine,
address usr,
address safe,
bytes32 collateralType
) internal view returns (uint wad) {
// Gets actual rate from the safeEngine
(, uint rate,,,) = SAFEEngineLike(safeEngine).collateralTypes(collateralType);
// Gets actual generatedDebt value of the safe
(, uint generatedDebt) = SAFEEngineLike(safeEngine).safes(collateralType, safe);
// Gets actual coin amount in the safe
uint coin = SAFEEngineLike(safeEngine).coinBalance(usr);
uint rad = subtract(multiply(generatedDebt, rate), coin);
wad = rad / RAY;
// If the rad precision has some dust, it will need to request for 1 extra wad wei
wad = multiply(wad, RAY) < rad ? wad + 1 : wad;
}
/// @notice Generates Debt (and sends coin balance to address to)
/// @param manager address
/// @param taxCollector address
/// @param coinJoin address
/// @param safe uint
/// @param wad uint - amount of debt to be generated
/// @param to address - receiver of the balance of generated COIN
function _generateDebt(address manager, address taxCollector, address coinJoin, uint safe, uint wad, address to) internal {
address safeHandler = ManagerLike(manager).safes(safe);
address safeEngine = ManagerLike(manager).safeEngine();
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
// Generates debt in the SAFE
modifySAFECollateralization(manager, safe, 0, _getGeneratedDeltaDebt(safeEngine, taxCollector, safeHandler, collateralType, wad));
// Moves the COIN amount (balance in the safeEngine in rad) to proxy's address
transferInternalCoins(manager, safe, address(this), toRad(wad));
// Allows adapter to access to proxy's COIN balance in the safeEngine
if (SAFEEngineLike(safeEngine).canModifySAFE(address(this), address(coinJoin)) == 0) {
SAFEEngineLike(safeEngine).approveSAFEModification(coinJoin);
}
// Exits COIN to this contract
CoinJoinLike(coinJoin).exit(to, wad);
}
/// @notice Generates Debt (and sends coin balance to address to)
/// @param manager address
/// @param ethJoin address
/// @param safe uint
/// @param value uint - amount of ETH to be locked in the Safe.
/// @dev Proxy needs to have enough balance (> value), public functions should handle this.
function _lockETH(
address manager,
address ethJoin,
uint safe,
uint value
) internal {
// Receives ETH amount, converts it to WETH and joins it into the safeEngine
ethJoin_join(ethJoin, address(this), value);
// Locks WETH amount into the SAFE
SAFEEngineLike(ManagerLike(manager).safeEngine()).modifySAFECollateralization(
ManagerLike(manager).collateralTypes(safe),
ManagerLike(manager).safes(safe),
address(this),
address(this),
toInt(value),
0
);
}
/// @notice Repays debt
/// @param manager address
/// @param coinJoin address
/// @param safe uint
/// @param wad uint - amount of debt to be repayed
function _repayDebt(
address manager,
address coinJoin,
uint safe,
uint wad,
bool transferFromCaller
) internal {
address safeEngine = ManagerLike(manager).safeEngine();
address safeHandler = ManagerLike(manager).safes(safe);
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
address own = ManagerLike(manager).ownsSAFE(safe);
if (own == address(this) || ManagerLike(manager).safeCan(own, safe, address(this)) == 1) {
// Joins COIN amount into the safeEngine
if (transferFromCaller) coinJoin_join(coinJoin, safeHandler, wad);
else _coinJoin_join(coinJoin, safeHandler, wad);
// // Paybacks debt to the SAFE
modifySAFECollateralization(manager, safe, 0, _getRepaidDeltaDebt(safeEngine, SAFEEngineLike(safeEngine).coinBalance(safeHandler), safeHandler, collateralType));
} else {
// Joins COIN amount into the safeEngine
if (transferFromCaller) coinJoin_join(coinJoin, address(this), wad);
else _coinJoin_join(coinJoin, address(this), wad);
// Paybacks debt to the SAFE
SAFEEngineLike(safeEngine).modifySAFECollateralization(
collateralType,
safeHandler,
address(this),
address(this),
0,
_getRepaidDeltaDebt(safeEngine, wad * RAY, safeHandler, collateralType)
);
}
}
/// @notice Repays debt and frees collateral ETH
/// @param manager address
/// @param ethJoin address
/// @param coinJoin address
/// @param safe uint
/// @param collateralWad uint - amount of ETH to free
/// @param deltaWad uint - amount of debt to be repayed
/// @param transferFromCaller True if transferring coin from caller, false if balance in the proxy
function _repayDebtAndFreeETH(
address manager,
address ethJoin,
address coinJoin,
uint safe,
uint collateralWad,
uint deltaWad,
bool transferFromCaller
) internal {
address safeHandler = ManagerLike(manager).safes(safe);
// Joins COIN amount into the safeEngine
if (transferFromCaller) coinJoin_join(coinJoin, safeHandler, deltaWad);
else _coinJoin_join(coinJoin, safeHandler, deltaWad);
// Paybacks debt to the SAFE and unlocks WETH amount from it
modifySAFECollateralization(
manager,
safe,
-toInt(collateralWad),
_getRepaidDeltaDebt(ManagerLike(manager).safeEngine(), SAFEEngineLike(ManagerLike(manager).safeEngine()).coinBalance(safeHandler), safeHandler, ManagerLike(manager).collateralTypes(safe))
);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), collateralWad);
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), collateralWad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(collateralWad);
}
// Public functions
/// @notice ERC20 transfer
/// @param collateral address - address of ERC20 collateral
/// @param dst address - Transfer destination
/// @param amt address - Amount to transfer
function transfer(address collateral, address dst, uint amt) external {
CollateralLike(collateral).transfer(dst, amt);
}
/// @notice Joins the system with the full msg.value
/// @param apt address - Address of the adapter
/// @param safe uint - Safe Id
function ethJoin_join(address apt, address safe) external payable {
ethJoin_join(apt, safe, msg.value);
}
/// @notice Joins the system with the a specified value
/// @param apt address - Address of the adapter
/// @param safe uint - Safe Id
/// @param value uint - Value to join
function ethJoin_join(address apt, address safe, uint value) public payable {
// Wraps ETH in WETH
CollateralJoinLike(apt).collateral().deposit{value: value}();
// Approves adapter to take the WETH amount
CollateralJoinLike(apt).collateral().approve(address(apt), value);
// Joins WETH collateral into the safeEngine
CollateralJoinLike(apt).join(safe, value);
}
/// @notice Approves an address to modify the Safe
/// @param safeEngine address
/// @param usr address - Address allowed to modify Safe
function approveSAFEModification(
address safeEngine,
address usr
) external {
ApproveSAFEModificationLike(safeEngine).approveSAFEModification(usr);
}
/// @notice Denies an address to modify the Safe
/// @param safeEngine address
/// @param usr address - Address disallowed to modify Safe
function denySAFEModification(
address safeEngine,
address usr
) external {
ApproveSAFEModificationLike(safeEngine).denySAFEModification(usr);
}
/// @notice Opens a brand new Safe
/// @param manager address - Safe Manager
/// @param collateralType bytes32 - collateral type
/// @param usr address - Owner of the safe
function openSAFE(
address manager,
bytes32 collateralType,
address usr
) public returns (uint safe) {
safe = ManagerLike(manager).openSAFE(collateralType, usr);
}
/// @notice Transfer the ownership of a proxy owned Safe
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param usr address - Owner of the safe
function transferSAFEOwnership(
address manager,
uint safe,
address usr
) public {
ManagerLike(manager).transferSAFEOwnership(safe, usr);
}
/// @notice Transfer the ownership to a new proxy owned by a different address
/// @param proxyRegistry address - Safe Manager
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param dst address - Owner of the new proxy
function transferSAFEOwnershipToProxy(
address proxyRegistry,
address manager,
uint safe,
address dst
) external {
// Gets actual proxy address
address proxy = ProxyRegistryLike(proxyRegistry).proxies(dst);
// Checks if the proxy address already existed and dst address is still the owner
if (proxy == address(0) || ProxyLike(proxy).owner() != dst) {
uint csize;
assembly {
csize := extcodesize(dst)
}
// We want to avoid creating a proxy for a contract address that might not be able to handle proxies, then losing the SAFE
require(csize == 0, "dst-is-a-contract");
// Creates the proxy for the dst address
proxy = ProxyRegistryLike(proxyRegistry).build(dst);
}
// Transfers SAFE to the dst proxy
transferSAFEOwnership(manager, safe, proxy);
}
/// @notice Allow/disallow a usr address to manage the safe
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param usr address - usr address
/// uint ok - 1 for allowed
function allowSAFE(
address manager,
uint safe,
address usr,
uint ok
) external {
ManagerLike(manager).allowSAFE(safe, usr, ok);
}
/// @notice Allow/disallow a usr address to quit to the sender handler
/// @param manager address - Safe Manager
/// @param usr address - usr address
/// uint ok - 1 for allowed
function allowHandler(
address manager,
address usr,
uint ok
) external {
ManagerLike(manager).allowHandler(usr, ok);
}
/// @notice Transfer wad amount of safe collateral from the safe address to a dst address.
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param dst address - destination address
/// uint wad - amount
function transferCollateral(
address manager,
uint safe,
address dst,
uint wad
) public {
ManagerLike(manager).transferCollateral(safe, dst, wad);
}
/// @notice Transfer rad amount of COIN from the safe address to a dst address.
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param dst address - destination address
/// uint rad - amount
function transferInternalCoins(
address manager,
uint safe,
address dst,
uint rad
) public {
ManagerLike(manager).transferInternalCoins(safe, dst, rad);
}
/// @notice Modify a SAFE's collateralization ratio while keeping the generated COIN or collateral freed in the SAFE handler address.
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param deltaCollateral - int
/// @param deltaDebt - int
function modifySAFECollateralization(
address manager,
uint safe,
int deltaCollateral,
int deltaDebt
) public {
ManagerLike(manager).modifySAFECollateralization(safe, deltaCollateral, deltaDebt);
}
/// @notice Quit the system, migrating the safe (lockedCollateral, generatedDebt) to a different dst handler
/// @param manager address - Safe Manager
/// @param safe uint - Safe Id
/// @param dst - destination handler
function quitSystem(
address manager,
uint safe,
address dst
) external {
ManagerLike(manager).quitSystem(safe, dst);
}
/// @notice Import a position from src handler to the handler owned by safe
/// @param manager address - Safe Manager
/// @param src - source handler
/// @param safe uint - Safe Id
function enterSystem(
address manager,
address src,
uint safe
) external {
ManagerLike(manager).enterSystem(src, safe);
}
/// @notice Move a position from safeSrc handler to the safeDst handler
/// @param manager address - Safe Manager
/// @param safeSrc uint - Source Safe Id
/// @param safeDst uint - Destination Safe Id
function moveSAFE(
address manager,
uint safeSrc,
uint safeDst
) external {
ManagerLike(manager).moveSAFE(safeSrc, safeDst);
}
/// @notice Lock ETH (msg.value) as collateral in safe
/// @param manager address - Safe Manager
/// @param ethJoin address
/// @param safe uint - Safe Id
function lockETH(
address manager,
address ethJoin,
uint safe
) public payable {
_lockETH(manager, ethJoin, safe, msg.value);
}
/// @notice Free ETH (wad) from safe and sends it to msg.sender
/// @param manager address - Safe Manager
/// @param ethJoin address
/// @param safe uint - Safe Id
/// @param wad uint - Amount
function freeETH(
address manager,
address ethJoin,
uint safe,
uint wad
) public {
// Unlocks WETH amount from the SAFE
modifySAFECollateralization(manager, safe, -toInt(wad), 0);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), wad);
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), wad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(wad);
// Sends ETH back to the user's wallet
msg.sender.transfer(wad);
}
/// @notice Exits ETH (wad) from balance available in the handler
/// @param manager address - Safe Manager
/// @param ethJoin address
/// @param safe uint - Safe Id
/// @param wad uint - Amount
function exitETH(
address manager,
address ethJoin,
uint safe,
uint wad
) external {
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), wad);
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), wad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(wad);
// Sends ETH back to the user's wallet
msg.sender.transfer(wad);
}
/// @notice Generates debt and sends COIN amount to msg.sender
/// @param manager address
/// @param taxCollector address
/// @param coinJoin address
/// @param safe uint - Safe Id
/// @param wad uint - Amount
function generateDebt(
address manager,
address taxCollector,
address coinJoin,
uint safe,
uint wad
) public {
_generateDebt(manager, taxCollector, coinJoin, safe, wad, msg.sender);
}
/// @notice Repays debt
/// @param manager address
/// @param coinJoin address
/// @param safe uint - Safe Id
/// @param wad uint - Amount
function repayDebt(
address manager,
address coinJoin,
uint safe,
uint wad
) public {
_repayDebt(manager, coinJoin, safe, wad, true);
}
/// @notice Locks Eth, generates debt and sends COIN amount (deltaWad) to msg.sender
/// @param manager address
/// @param taxCollector address
/// @param ethJoin address
/// @param coinJoin address
/// @param safe uint - Safe Id
/// @param deltaWad uint - Amount
function lockETHAndGenerateDebt(
address manager,
address taxCollector,
address ethJoin,
address coinJoin,
uint safe,
uint deltaWad
) public payable {
_lockETH(manager, ethJoin, safe, msg.value);
_generateDebt(manager, taxCollector, coinJoin, safe, deltaWad, msg.sender);
}
/// @notice Opens Safe, locks Eth, generates debt and sends COIN amount (deltaWad) to msg.sender
/// @param manager address
/// @param taxCollector address
/// @param ethJoin address
/// @param coinJoin address
/// @param deltaWad uint - Amount
function openLockETHAndGenerateDebt(
address manager,
address taxCollector,
address ethJoin,
address coinJoin,
bytes32 collateralType,
uint deltaWad
) external payable returns (uint safe) {
safe = openSAFE(manager, collateralType, address(this));
lockETHAndGenerateDebt(manager, taxCollector, ethJoin, coinJoin, safe, deltaWad);
}
/// @notice Repays debt and frees ETH (sends it to msg.sender)
/// @param manager address
/// @param ethJoin address
/// @param coinJoin address
/// @param safe uint - Safe Id
/// @param collateralWad uint - Amount of collateral to free
/// @param deltaWad uint - Amount of debt to repay
function repayDebtAndFreeETH(
address manager,
address ethJoin,
address coinJoin,
uint safe,
uint collateralWad,
uint deltaWad
) external {
_repayDebtAndFreeETH(manager, ethJoin, coinJoin, safe, collateralWad, deltaWad, true);
// Sends ETH back to the user's wallet
msg.sender.transfer(collateralWad);
}
}
contract GebProxyActions is BasicActions {
function tokenCollateralJoin_join(address apt, address safe, uint amt, bool transferFrom) public {
// Only executes for tokens that have approval/transferFrom implementation
if (transferFrom) {
// Gets token from the user's wallet
CollateralJoinLike(apt).collateral().transferFrom(msg.sender, address(this), amt);
// Approves adapter to take the token amount
CollateralJoinLike(apt).collateral().approve(apt, amt);
}
// Joins token collateral into the safeEngine
CollateralJoinLike(apt).join(safe, amt);
}
function protectSAFE(
address manager,
uint safe,
address liquidationEngine,
address saviour
) public {
ManagerLike(manager).protectSAFE(safe, liquidationEngine, saviour);
}
function makeCollateralBag(
address collateralJoin
) public returns (address bag) {
bag = GNTJoinLike(collateralJoin).make(address(this));
}
function safeLockETH(
address manager,
address ethJoin,
uint safe,
address owner
) public payable {
require(ManagerLike(manager).ownsSAFE(safe) == owner, "owner-missmatch");
lockETH(manager, ethJoin, safe);
}
function lockTokenCollateral(
address manager,
address collateralJoin,
uint safe,
uint amt,
bool transferFrom
) public {
// Takes token amount from user's wallet and joins into the safeEngine
tokenCollateralJoin_join(collateralJoin, address(this), amt, transferFrom);
// Locks token amount into the SAFE
SAFEEngineLike(ManagerLike(manager).safeEngine()).modifySAFECollateralization(
ManagerLike(manager).collateralTypes(safe),
ManagerLike(manager).safes(safe),
address(this),
address(this),
toInt(convertTo18(collateralJoin, amt)),
0
);
}
function safeLockTokenCollateral(
address manager,
address collateralJoin,
uint safe,
uint amt,
bool transferFrom,
address owner
) public {
require(ManagerLike(manager).ownsSAFE(safe) == owner, "owner-missmatch");
lockTokenCollateral(manager, collateralJoin, safe, amt, transferFrom);
}
function freeTokenCollateral(
address manager,
address collateralJoin,
uint safe,
uint amt
) public {
uint wad = convertTo18(collateralJoin, amt);
// Unlocks token amount from the SAFE
modifySAFECollateralization(manager, safe, -toInt(wad), 0);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), wad);
// Exits token amount to the user's wallet as a token
CollateralJoinLike(collateralJoin).exit(msg.sender, amt);
}
function exitTokenCollateral(
address manager,
address collateralJoin,
uint safe,
uint amt
) public {
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), convertTo18(collateralJoin, amt));
// Exits token amount to the user's wallet as a token
CollateralJoinLike(collateralJoin).exit(msg.sender, amt);
}
function generateDebtAndProtectSAFE(
address manager,
address taxCollector,
address coinJoin,
uint safe,
uint wad,
address liquidationEngine,
address saviour
) external {
generateDebt(manager, taxCollector, coinJoin, safe, wad);
protectSAFE(manager, safe, liquidationEngine, saviour);
}
function safeRepayDebt(
address manager,
address coinJoin,
uint safe,
uint wad,
address owner
) public {
require(ManagerLike(manager).ownsSAFE(safe) == owner, "owner-missmatch");
repayDebt(manager, coinJoin, safe, wad);
}
function repayAllDebt(
address manager,
address coinJoin,
uint safe
) public {
address safeEngine = ManagerLike(manager).safeEngine();
address safeHandler = ManagerLike(manager).safes(safe);
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
(, uint generatedDebt) = SAFEEngineLike(safeEngine).safes(collateralType, safeHandler);
address own = ManagerLike(manager).ownsSAFE(safe);
if (own == address(this) || ManagerLike(manager).safeCan(own, safe, address(this)) == 1) {
// Joins COIN amount into the safeEngine
coinJoin_join(coinJoin, safeHandler, _getRepaidAlDebt(safeEngine, safeHandler, safeHandler, collateralType));
// Paybacks debt to the SAFE
modifySAFECollateralization(manager, safe, 0, -int(generatedDebt));
} else {
// Joins COIN amount into the safeEngine
coinJoin_join(coinJoin, address(this), _getRepaidAlDebt(safeEngine, address(this), safeHandler, collateralType));
// Paybacks debt to the SAFE
SAFEEngineLike(safeEngine).modifySAFECollateralization(
collateralType,
safeHandler,
address(this),
address(this),
0,
-int(generatedDebt)
);
}
}
function safeRepayAllDebt(
address manager,
address coinJoin,
uint safe,
address owner
) public {
require(ManagerLike(manager).ownsSAFE(safe) == owner, "owner-missmatch");
repayAllDebt(manager, coinJoin, safe);
}
function openLockETHGenerateDebtAndProtectSAFE(
address manager,
address taxCollector,
address ethJoin,
address coinJoin,
bytes32 collateralType,
uint deltaWad,
address liquidationEngine,
address saviour
) public payable returns (uint safe) {
safe = openSAFE(manager, collateralType, address(this));
lockETHAndGenerateDebt(manager, taxCollector, ethJoin, coinJoin, safe, deltaWad);
protectSAFE(manager, safe, liquidationEngine, saviour);
}
function lockTokenCollateralAndGenerateDebt(
address manager,
address taxCollector,
address collateralJoin,
address coinJoin,
uint safe,
uint collateralAmount,
uint deltaWad,
bool transferFrom
) public {
address safeHandler = ManagerLike(manager).safes(safe);
address safeEngine = ManagerLike(manager).safeEngine();
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
// Takes token amount from user's wallet and joins into the safeEngine
tokenCollateralJoin_join(collateralJoin, safeHandler, collateralAmount, transferFrom);
// Locks token amount into the SAFE and generates debt
modifySAFECollateralization(manager, safe, toInt(convertTo18(collateralJoin, collateralAmount)), _getGeneratedDeltaDebt(safeEngine, taxCollector, safeHandler, collateralType, deltaWad));
// Moves the COIN amount (balance in the safeEngine in rad) to proxy's address
transferInternalCoins(manager, safe, address(this), toRad(deltaWad));
// Allows adapter to access to proxy's COIN balance in the safeEngine
if (SAFEEngineLike(safeEngine).canModifySAFE(address(this), address(coinJoin)) == 0) {
SAFEEngineLike(safeEngine).approveSAFEModification(coinJoin);
}
// Exits COIN to the user's wallet as a token
CoinJoinLike(coinJoin).exit(msg.sender, deltaWad);
}
function lockTokenCollateralGenerateDebtAndProtectSAFE(
address manager,
address taxCollector,
address collateralJoin,
address coinJoin,
uint safe,
uint collateralAmount,
uint deltaWad,
bool transferFrom,
address liquidationEngine,
address saviour
) public {
lockTokenCollateralAndGenerateDebt(
manager,
taxCollector,
collateralJoin,
coinJoin,
safe,
collateralAmount,
deltaWad,
transferFrom
);
protectSAFE(manager, safe, liquidationEngine, saviour);
}
function openLockTokenCollateralAndGenerateDebt(
address manager,
address taxCollector,
address collateralJoin,
address coinJoin,
bytes32 collateralType,
uint collateralAmount,
uint deltaWad,
bool transferFrom
) public returns (uint safe) {
safe = openSAFE(manager, collateralType, address(this));
lockTokenCollateralAndGenerateDebt(manager, taxCollector, collateralJoin, coinJoin, safe, collateralAmount, deltaWad, transferFrom);
}
function openLockTokenCollateralGenerateDebtAndProtectSAFE(
address manager,
address taxCollector,
address collateralJoin,
address coinJoin,
bytes32 collateralType,
uint collateralAmount,
uint deltaWad,
bool transferFrom,
address liquidationEngine,
address saviour
) public returns (uint safe) {
safe = openSAFE(manager, collateralType, address(this));
lockTokenCollateralAndGenerateDebt(manager, taxCollector, collateralJoin, coinJoin, safe, collateralAmount, deltaWad, transferFrom);
protectSAFE(manager, safe, liquidationEngine, saviour);
}
function openLockGNTAndGenerateDebt(
address manager,
address taxCollector,
address gntJoin,
address coinJoin,
bytes32 collateralType,
uint collateralAmount,
uint deltaWad
) public returns (address bag, uint safe) {
// Creates bag (if doesn't exist) to hold GNT
bag = GNTJoinLike(gntJoin).bags(address(this));
if (bag == address(0)) {
bag = makeCollateralBag(gntJoin);
}
// Transfer funds to the funds which previously were sent to the proxy
CollateralLike(CollateralJoinLike(gntJoin).collateral()).transfer(bag, collateralAmount);
safe = openLockTokenCollateralAndGenerateDebt(manager, taxCollector, gntJoin, coinJoin, collateralType, collateralAmount, deltaWad, false);
}
function openLockGNTGenerateDebtAndProtectSAFE(
address manager,
address taxCollector,
address gntJoin,
address coinJoin,
bytes32 collateralType,
uint collateralAmount,
uint deltaWad,
address liquidationEngine,
address saviour
) public returns (address bag, uint safe) {
(bag, safe) = openLockGNTAndGenerateDebt(
manager,
taxCollector,
gntJoin,
coinJoin,
collateralType,
collateralAmount,
deltaWad
);
protectSAFE(manager, safe, liquidationEngine, saviour);
}
function repayAllDebtAndFreeETH(
address manager,
address ethJoin,
address coinJoin,
uint safe,
uint collateralWad
) public {
address safeEngine = ManagerLike(manager).safeEngine();
address safeHandler = ManagerLike(manager).safes(safe);
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
(, uint generatedDebt) = SAFEEngineLike(safeEngine).safes(collateralType, safeHandler);
// Joins COIN amount into the safeEngine
coinJoin_join(coinJoin, safeHandler, _getRepaidAlDebt(safeEngine, safeHandler, safeHandler, collateralType));
// Paybacks debt to the SAFE and unlocks WETH amount from it
modifySAFECollateralization(
manager,
safe,
-toInt(collateralWad),
-int(generatedDebt)
);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), collateralWad);
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), collateralWad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(collateralWad);
// Sends ETH back to the user's wallet
msg.sender.transfer(collateralWad);
}
function repayDebtAndFreeTokenCollateral(
address manager,
address collateralJoin,
address coinJoin,
uint safe,
uint collateralAmount,
uint deltaWad
) external {
address safeHandler = ManagerLike(manager).safes(safe);
// Joins COIN amount into the safeEngine
coinJoin_join(coinJoin, safeHandler, deltaWad);
uint collateralWad = convertTo18(collateralJoin, collateralAmount);
// Paybacks debt to the SAFE and unlocks token amount from it
modifySAFECollateralization(
manager,
safe,
-toInt(collateralWad),
_getRepaidDeltaDebt(ManagerLike(manager).safeEngine(), SAFEEngineLike(ManagerLike(manager).safeEngine()).coinBalance(safeHandler), safeHandler, ManagerLike(manager).collateralTypes(safe))
);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), collateralWad);
// Exits token amount to the user's wallet as a token
CollateralJoinLike(collateralJoin).exit(msg.sender, collateralAmount);
}
function repayAllDebtAndFreeTokenCollateral(
address manager,
address collateralJoin,
address coinJoin,
uint safe,
uint collateralAmount
) public {
address safeEngine = ManagerLike(manager).safeEngine();
address safeHandler = ManagerLike(manager).safes(safe);
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
(, uint generatedDebt) = SAFEEngineLike(safeEngine).safes(collateralType, safeHandler);
// Joins COIN amount into the safeEngine
coinJoin_join(coinJoin, safeHandler, _getRepaidAlDebt(safeEngine, safeHandler, safeHandler, collateralType));
uint collateralWad = convertTo18(collateralJoin, collateralAmount);
// Paybacks debt to the SAFE and unlocks token amount from it
modifySAFECollateralization(
manager,
safe,
-toInt(collateralWad),
-int(generatedDebt)
);
// Moves the amount from the SAFE handler to proxy's address
transferCollateral(manager, safe, address(this), collateralWad);
// Exits token amount to the user's wallet as a token
CollateralJoinLike(collateralJoin).exit(msg.sender, collateralAmount);
}
}
contract GebProxyActionsGlobalSettlement is Common {
// Internal functions
function _freeCollateral(
address manager,
address globalSettlement,
uint safe
) internal returns (uint lockedCollateral) {
bytes32 collateralType = ManagerLike(manager).collateralTypes(safe);
address safeHandler = ManagerLike(manager).safes(safe);
SAFEEngineLike safeEngine = SAFEEngineLike(ManagerLike(manager).safeEngine());
uint generatedDebt;
(lockedCollateral, generatedDebt) = safeEngine.safes(collateralType, safeHandler);
// If SAFE still has debt, it needs to be paid
if (generatedDebt > 0) {
GlobalSettlementLike(globalSettlement).processSAFE(collateralType, safeHandler);
(lockedCollateral,) = safeEngine.safes(collateralType, safeHandler);
}
// Approves the manager to transfer the position to proxy's address in the safeEngine
if (safeEngine.canModifySAFE(address(this), address(manager)) == 0) {
safeEngine.approveSAFEModification(manager);
}
// Transfers position from SAFE to the proxy address
ManagerLike(manager).quitSystem(safe, address(this));
// Frees the position and recovers the collateral in the safeEngine registry
GlobalSettlementLike(globalSettlement).freeCollateral(collateralType);
}
// Public functions
function freeETH(
address manager,
address ethJoin,
address globalSettlement,
uint safe
) external {
uint wad = _freeCollateral(manager, globalSettlement, safe);
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), wad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(wad);
// Sends ETH back to the user's wallet
msg.sender.transfer(wad);
}
function freeTokenCollateral(
address manager,
address collateralJoin,
address globalSettlement,
uint safe
) public {
uint amt = _freeCollateral(manager, globalSettlement, safe) / 10 ** (18 - CollateralJoinLike(collateralJoin).decimals());
// Exits token amount to the user's wallet as a token
CollateralJoinLike(collateralJoin).exit(msg.sender, amt);
}
function prepareCoinsForRedeeming(
address coinJoin,
address globalSettlement,
uint wad
) public {
coinJoin_join(coinJoin, address(this), wad);
SAFEEngineLike safeEngine = CoinJoinLike(coinJoin).safeEngine();
// Approves the globalSettlement to take out COIN from the proxy's balance in the safeEngine
if (safeEngine.canModifySAFE(address(this), address(globalSettlement)) == 0) {
safeEngine.approveSAFEModification(globalSettlement);
}
GlobalSettlementLike(globalSettlement).prepareCoinsForRedeeming(wad);
}
function redeemETH(
address ethJoin,
address globalSettlement,
bytes32 collateralType,
uint wad
) public {
GlobalSettlementLike(globalSettlement).redeemCollateral(collateralType, wad);
uint collateralWad = multiply(wad, GlobalSettlementLike(globalSettlement).collateralCashPrice(collateralType)) / RAY;
// Exits WETH amount to proxy address as a token
CollateralJoinLike(ethJoin).exit(address(this), collateralWad);
// Converts WETH to ETH
CollateralJoinLike(ethJoin).collateral().withdraw(collateralWad);
// Sends ETH back to the user's wallet
msg.sender.transfer(collateralWad);
}
function redeemTokenCollateral(
address collateralJoin,
address globalSettlement,
bytes32 collateralType,
uint wad
) public {
GlobalSettlementLike(globalSettlement).redeemCollateral(collateralType, wad);
// Exits token amount to the user's wallet as a token
uint amt = multiply(wad, GlobalSettlementLike(globalSettlement).collateralCashPrice(collateralType)) / RAY / 10 ** (18 - CollateralJoinLike(collateralJoin).decimals());
CollateralJoinLike(collateralJoin).exit(msg.sender, amt);
}
}
contract GebProxyActionsCoinSavingsAccount is Common {
function deposit(
address coinJoin,
address coinSavingsAccount,
uint wad
) public {
SAFEEngineLike safeEngine = CoinJoinLike(coinJoin).safeEngine();
// Executes updateAccumulatedRate to get the accumulatedRates updated to latestUpdateTime == now, otherwise join will fail
uint accumulatedRates = CoinSavingsAccountLike(coinSavingsAccount).updateAccumulatedRate();
// Joins wad amount to the safeEngine balance
coinJoin_join(coinJoin, address(this), wad);
// Approves the coinSavingsAccount to take out COIN from the proxy's balance in the safeEngine
if (safeEngine.canModifySAFE(address(this), address(coinSavingsAccount)) == 0) {
safeEngine.approveSAFEModification(coinSavingsAccount);
}
// Joins the savings value (equivalent to the COIN wad amount) in the coinSavingsAccount
CoinSavingsAccountLike(coinSavingsAccount).deposit(multiply(wad, RAY) / accumulatedRates);
}
function withdraw(
address coinJoin,
address coinSavingsAccount,
uint wad
) public {
SAFEEngineLike safeEngine = CoinJoinLike(coinJoin).safeEngine();
// Executes updateAccumulatedRate to count the savings accumulated until this moment
uint accumulatedRates = CoinSavingsAccountLike(coinSavingsAccount).updateAccumulatedRate();
// Calculates the savings value in the coinSavingsAccount equivalent to the COIN wad amount
uint savings = multiply(wad, RAY) / accumulatedRates;
// Exits COIN from the coinSavingsAccount
CoinSavingsAccountLike(coinSavingsAccount).withdraw(savings);
// Checks the actual balance of COIN in the safeEngine after the coinSavingsAccount exit
uint bal = CoinJoinLike(coinJoin).safeEngine().coinBalance(address(this));
// Allows adapter to access to proxy's COIN balance in the safeEngine
if (safeEngine.canModifySAFE(address(this), address(coinJoin)) == 0) {
safeEngine.approveSAFEModification(coinJoin);
}
// It is necessary to check if due rounding the exact wad amount can be exited by the adapter.
// Otherwise it will do the minimum COIN balance in the safeEngine
CoinJoinLike(coinJoin).exit(
msg.sender,
bal >= multiply(wad, RAY) ? wad : bal / RAY
);
}
function withdrawAll(
address coinJoin,
address coinSavingsAccount
) public {
SAFEEngineLike safeEngine = CoinJoinLike(coinJoin).safeEngine();
// Executes updateAccumulatedRate to count the savings accumulated until this moment
uint accumulatedRates = CoinSavingsAccountLike(coinSavingsAccount).updateAccumulatedRate();
// Gets the total savings belonging to the proxy address
uint savings = CoinSavingsAccountLike(coinSavingsAccount).savings(address(this));
// Exits COIN from the coinSavingsAccount
CoinSavingsAccountLike(coinSavingsAccount).withdraw(savings);
// Allows adapter to access to proxy's COIN balance in the safeEngine
if (safeEngine.canModifySAFE(address(this), address(coinJoin)) == 0) {
safeEngine.approveSAFEModification(coinJoin);
}
// Exits the COIN amount corresponding to the value of savings
CoinJoinLike(coinJoin).exit(msg.sender, multiply(accumulatedRates, savings) / RAY);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"ok","type":"uint256"}],"name":"allowHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"ok","type":"uint256"}],"name":"allowSAFE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"safeEngine","type":"address"},{"internalType":"address","name":"usr","type":"address"}],"name":"approveSAFEModification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"apt","type":"address"},{"internalType":"address","name":"safeHandler","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"coinJoin_join","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"safeEngine","type":"address"},{"internalType":"address","name":"usr","type":"address"}],"name":"denySAFEModification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"}],"name":"enterSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"apt","type":"address"},{"internalType":"address","name":"safe","type":"address"}],"name":"ethJoin_join","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"apt","type":"address"},{"internalType":"address","name":"safe","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ethJoin_join","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"exitETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"exitTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"freeETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"freeTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"generateDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"generateDebtAndProtectSAFE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"}],"name":"lockETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"}],"name":"lockETHAndGenerateDebt","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"}],"name":"lockTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"}],"name":"lockTokenCollateralAndGenerateDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"lockTokenCollateralGenerateDebtAndProtectSAFE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralJoin","type":"address"}],"name":"makeCollateralBag","outputs":[{"internalType":"address","name":"bag","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"int256","name":"deltaCollateral","type":"int256"},{"internalType":"int256","name":"deltaDebt","type":"int256"}],"name":"modifySAFECollateralization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safeSrc","type":"uint256"},{"internalType":"uint256","name":"safeDst","type":"uint256"}],"name":"moveSAFE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"deltaWad","type":"uint256"}],"name":"openLockETHAndGenerateDebt","outputs":[{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"openLockETHGenerateDebtAndProtectSAFE","outputs":[{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"gntJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"}],"name":"openLockGNTAndGenerateDebt","outputs":[{"internalType":"address","name":"bag","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"gntJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"openLockGNTGenerateDebtAndProtectSAFE","outputs":[{"internalType":"address","name":"bag","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"}],"name":"openLockTokenCollateralAndGenerateDebt","outputs":[{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"taxCollector","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"openLockTokenCollateralGenerateDebtAndProtectSAFE","outputs":[{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"usr","type":"address"}],"name":"openSAFE","outputs":[{"internalType":"uint256","name":"safe","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"liquidationEngine","type":"address"},{"internalType":"address","name":"saviour","type":"address"}],"name":"protectSAFE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"dst","type":"address"}],"name":"quitSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"}],"name":"repayAllDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralWad","type":"uint256"}],"name":"repayAllDebtAndFreeETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"}],"name":"repayAllDebtAndFreeTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"repayDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralWad","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"}],"name":"repayDebtAndFreeETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"deltaWad","type":"uint256"}],"name":"repayDebtAndFreeTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"ethJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"safeLockETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"collateralJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"},{"internalType":"address","name":"owner","type":"address"}],"name":"safeLockTokenCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"safeRepayAllDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"coinJoin","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"uint256","name":"wad","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"safeRepayDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"apt","type":"address"},{"internalType":"address","name":"safe","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"bool","name":"transferFrom","type":"bool"}],"name":"tokenCollateralJoin_join","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transferCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"transferInternalCoins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"transferSAFEOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyRegistry","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"safe","type":"uint256"},{"internalType":"address","name":"dst","type":"address"}],"name":"transferSAFEOwnershipToProxy","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50614bc6806100206000396000f3fe6080604052600436106102885760003560e01c806373f1ff691161015a578063b2be9117116100c1578063e205c1081161007a578063e205c10814610f29578063e25187c114610f5f578063ee28457614610fc7578063f19d3b4114611003578063f7f898b014611048578063ff08ec261461108b57610288565b8063b2be911714610d6c578063beabacc814610dbb578063c42e34e714610dfe578063d723323b14610e39578063d97ebbd514610e6f578063dbf83cde14610ee057610288565b80638a58060c116101135780638a58060c14610bb55780639edd720714610bfc578063a033df1214610c51578063a72d3ab014610c7f578063ac8b81de14610cc2578063b02f9e3d14610d1d57610288565b806373f1ff69146109e95780637b5a3b4314610a4a5780637b65158f14610a935780637f6a7acf14610ada57806384efae8314610b31578063861b15eb14610b7a57610288565b80632dc469a3116101fe5780634cac3da1116101b75780634cac3da11461082e57806352e83c6d1461087157806354523249146108b45780636093c9751461090057806360eba4f11461094957806364e506a01461099857610288565b80632dc469a3146106345780633664fa711461068357806339c1f126146106c25780633c6dc59a1461073a578063437c050d1461078357806343847b21146107eb57610288565b80631c145dcd116102505780631c145dcd146104435780631c25ff121461048e578063230eeac0146104df578063252fa0f61461056157806325817008146105a45780632d418a33146105ed57610288565b806303f2cd051461028d57806308f00e34146102d857806313cc55e4146103215780631a8678d9146103765780631c005fda14610400575b600080fd5b34801561029957600080fd5b506102d6600480360360808110156102b057600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356110d7565b005b3480156102e457600080fd5b506102d6600480360360808110156102fb57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611158565b34801561032d57600080fd5b506102d6600480360360c081101561034457600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a001356112c7565b34801561038257600080fd5b506103ee600480360361014081101561039a57600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e08101351515916101008201358116916101200135166115bd565b60408051918252519081900360200190f35b34801561040c57600080fd5b506102d66004803603606081101561042357600080fd5b506001600160a01b038135811691602081013590911690604001356115f6565b34801561044f57600080fd5b506102d66004803603608081101561046657600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156116f1565b34801561049a57600080fd5b506102d6600480360360a08110156104b157600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608090910135166118fe565b3480156104eb57600080fd5b5061053e600480360360e081101561050257600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c001356119d1565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561056d57600080fd5b506103ee6004803603606081101561058457600080fd5b506001600160a01b03813581169160208101359160409091013516611b54565b3480156105b057600080fd5b506102d6600480360360808110156105c757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611bdb565b3480156105f957600080fd5b506102d66004803603608081101561061057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bef565b34801561064057600080fd5b506102d6600480360360a081101561065757600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135611c48565b34801561068f57600080fd5b506102d6600480360360608110156106a657600080fd5b506001600160a01b038135169060208101359060400135611ee0565b3480156106ce57600080fd5b506102d660048036036101408110156106e657600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e0810135151591610100820135811691610120013516611f4b565b34801561074657600080fd5b506102d66004803603608081101561075d57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611f73565b34801561078f57600080fd5b506102d660048036036101008110156107a757600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c08101359060e001351515612166565b3480156107f757600080fd5b506102d66004803603606081101561080e57600080fd5b506001600160a01b0381358116916020810135909116906040013561246d565b34801561083a57600080fd5b506102d66004803603606081101561085157600080fd5b506001600160a01b038135811691602081013590911690604001356124cd565b34801561087d57600080fd5b506102d66004803603606081101561089457600080fd5b506001600160a01b0381358116916020810135916040909101351661252d565b6103ee600480360360c08110156108ca57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a0013561258d565b34801561090c57600080fd5b506102d66004803603608081101561092357600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356125b4565b34801561095557600080fd5b506102d6600480360360a081101561096c57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135612653565b3480156109a457600080fd5b506102d6600480360360a08110156109bb57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013515156129c2565b3480156109f557600080fd5b506102d6600480360360e0811015610a0c57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013582169160c09091013516612b9e565b348015610a5657600080fd5b506102d660048036036080811015610a6d57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612bb7565b348015610a9f57600080fd5b506102d660048036036080811015610ab657600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612bc5565b348015610ae657600080fd5b506102d6600480360360c0811015610afd57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a0013516612c1e565b348015610b3d57600080fd5b506102d660048036036080811015610b5457600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516612cfa565b348015610b8657600080fd5b506102d660048036036040811015610b9d57600080fd5b506001600160a01b0381358116916020013516612dcc565b348015610bc157600080fd5b506102d660048036036080811015610bd857600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612e38565b348015610c0857600080fd5b506102d6600480360360c0811015610c1f57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135612e91565b6102d660048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516612ece565b348015610c8b57600080fd5b506102d660048036036060811015610ca257600080fd5b506001600160a01b03813581169160208101359160409091013516612edd565b6103ee6004803603610100811015610cd957600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c082013581169160e0013516612f3d565b348015610d2957600080fd5b506102d6600480360360a0811015610d4057600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135612f72565b348015610d7857600080fd5b50610d9f60048036036020811015610d8f57600080fd5b50356001600160a01b0316612f80565b604080516001600160a01b039092168252519081900360200190f35b348015610dc757600080fd5b506102d660048036036060811015610dde57600080fd5b506001600160a01b03813581169160208101359091169060400135612ffd565b348015610e0a57600080fd5b506102d660048036036040811015610e2157600080fd5b506001600160a01b038135811691602001351661305d565b6102d660048036036060811015610e4f57600080fd5b506001600160a01b038135811691602081013590911690604001356130b5565b348015610e7b57600080fd5b5061053e6004803603610120811015610e9357600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e081013582169161010090910135166132aa565b348015610eec57600080fd5b506102d660048036036080811015610f0357600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166132db565b6102d660048036036060811015610f3f57600080fd5b506001600160a01b03813581169160208101359091169060400135613335565b348015610f6b57600080fd5b506103ee6004803603610100811015610f8357600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c08101359060e001351515613341565b6102d660048036036080811015610fdd57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516613360565b34801561100f57600080fd5b506102d66004803603608081101561102657600080fd5b506001600160a01b038135169060208101359060408101359060600135613432565b34801561105457600080fd5b506102d66004803603606081101561106b57600080fd5b506001600160a01b03813581169160208101359091169060400135613488565b6102d6600480360360c08110156110a157600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a0013561381c565b6110ec8483306110e78786613836565b612bc5565b6040805163ef693bed60e01b81523360048201526024810183905290516001600160a01b0385169163ef693bed91604480830192600092919082900301818387803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b5050505050505050565b61116484833084612bc5565b6040805163ef693bed60e01b81523060048201526024810183905290516001600160a01b0385169163ef693bed91604480830192600092919082900301818387803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b50505050826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506040513d602081101561122f57600080fd5b505160408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561127b57600080fd5b505af115801561128f573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156112c0573d6000803e3d6000fd5b5050505050565b6000866001600160a01b031663434efcbd856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561130d57600080fd5b505afa158015611321573d6000803e3d6000fd5b505050506040513d602081101561133757600080fd5b505190506113468582846115f6565b60006113528785613836565b90506115418886611362846138e8565b60000361153c8c6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a157600080fd5b505afa1580156113b5573d6000803e3d6000fd5b505050506040513d60208110156113cb57600080fd5b81019080805190602001909291905050508d6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561141557600080fd5b505afa158015611429573d6000803e3d6000fd5b505050506040513d602081101561143f57600080fd5b505160408051633eaf7a0360e21b81526001600160a01b038b811660048301529151919092169163fabde80c916024808301926020929190829003018186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b8101908080519060200190929190505050888f6001600160a01b031663918b7cfe8e6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b5051613933565b613432565b61154d88863084612bc5565b6040805163ef693bed60e01b81523360048201526024810186905290516001600160a01b0389169163ef693bed91604480830192600092919082900301818387803b15801561159b57600080fd5b505af11580156115af573d6000803e3d6000fd5b505050505050505050505050565b60006115ca8b8830611b54565b90506115dc8b8b8b8b858b8b8b612166565b6115e88b8285856132db565b9a9950505050505050505050565b826001600160a01b031663a7e944556040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050506040513d602081101561165b57600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156116b457600080fd5b505af11580156116c8573d6000803e3d6000fd5b505050506040513d60208110156116de57600080fd5b506116ec9050838383613ab5565b505050565b801561189e57836001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b505050506040513d602081101561175c57600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50505050836001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180757600080fd5b505af115801561181b573d6000803e3d6000fd5b505050506040513d602081101561183157600080fd5b50516040805163095ea7b360e01b81526001600160a01b038781166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561188557600080fd5b505af1158015611899573d6000803e3d6000fd5b505050505b836001600160a01b0316633b4da69f84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561113a57600080fd5b806001600160a01b0316856001600160a01b031663a2a4d76e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516001600160a01b0316146119c5576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b6112c085858585611bdb565b60408051638c4c280160e01b8152306004820152905160009182916001600160a01b03891691638c4c2801916024808301926020929190829003018186803b158015611a1c57600080fd5b505afa158015611a30573d6000803e3d6000fd5b505050506040513d6020811015611a4657600080fd5b505191506001600160a01b038216611a6457611a6187612f80565b91505b866001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b505050506040513d6020811015611ac957600080fd5b50516040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018890529151919092169163a9059cbb91604480830192600092919082900301818387803b158015611b1d57600080fd5b505af1158015611b31573d6000803e3d6000fd5b50505050611b46898989898989896000613341565b905097509795505050505050565b6040805163d983ff9560e01b8152600481018490526001600160a01b038381166024830152915160009286169163d983ff9591604480830192602092919082900301818787803b158015611ba757600080fd5b505af1158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b5051949350505050565b611be9848484846001613af0565b50505050565b6040805163660e160760e01b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163660e16079160648082019260009290919082900301818387803b15801561113a57600080fd5b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d6020811015611cad57600080fd5b50516040805163434efcbd60e01b81526004810186905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d6020811015611d2657600080fd5b5051604080516348c5be7f60e11b81526004810187905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d6020811015611d9f57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b158015611df357600080fd5b505afa158015611e07573d6000803e3d6000fd5b505050506040513d6040811015611e1d57600080fd5b50602001519050611e3a8784611e3587828088613f1d565b6115f6565b6000611e468987613836565b9050611e628a88611e56846138e8565b60000385600003613432565b611e6e8a883084612bc5565b6040805163ef693bed60e01b81523360048201526024810188905290516001600160a01b038b169163ef693bed91604480830192600092919082900301818387803b158015611ebc57600080fd5b505af1158015611ed0573d6000803e3d6000fd5b5050505050505050505050505050565b826001600160a01b031663018477a583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b505af1158015611f42573d6000803e3d6000fd5b50505050505050565b611f5b8a8a8a8a8a8a8a8a612166565b611f678a8784846132db565b50505050505050505050565b6000846001600160a01b031663c4552791836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611fcb57600080fd5b505afa158015611fdf573d6000803e3d6000fd5b505050506040513d6020811015611ff557600080fd5b505190506001600160a01b03811615806120855750816001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d602081101561207757600080fd5b50516001600160a01b031614155b1561215b57813b80156120d3576040805162461bcd60e51b8152602060048201526011602482015270191cdd0b5a5ccb584b58dbdb9d1c9858dd607a1b604482015290519081900360640190fd5b856001600160a01b031663f3701da2846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561212b57600080fd5b505af115801561213f573d6000803e3d6000fd5b505050506040513d602081101561215557600080fd5b50519150505b6112c0848483612edd565b6000886001600160a01b031663434efcbd866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121ac57600080fd5b505afa1580156121c0573d6000803e3d6000fd5b505050506040513d60208110156121d657600080fd5b5051604080516367aea31360e01b815290519192506000916001600160a01b038c16916367aea313916004808301926020929190829003018186803b15801561221e57600080fd5b505afa158015612232573d6000803e3d6000fd5b505050506040513d602081101561224857600080fd5b5051604080516348c5be7f60e11b81526004810189905290519192506000916001600160a01b038d169163918b7cfe916024808301926020929190829003018186803b15801561229757600080fd5b505afa1580156122ab573d6000803e3d6000fd5b505050506040513d60208110156122c157600080fd5b505190506122d1898488876116f1565b6122f58b886122e86122e38d8b613836565b6138e8565b61153c868f89888d6140eb565b6123098b8830612304896142b8565b611bef565b604080516350de215d60e01b81523060048201526001600160a01b038a811660248301529151918416916350de215d91604480820192602092909190829003018186803b15801561235957600080fd5b505afa15801561236d573d6000803e3d6000fd5b505050506040513d602081101561238357600080fd5b50516123fa57816001600160a01b031663d94d4208896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156123e157600080fd5b505af11580156123f5573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b81523360048201526024810187905290516001600160a01b038a169163ef693bed91604480830192600092919082900301818387803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050505050505050505050505050565b826001600160a01b031663391735c183836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b826001600160a01b0316636ffdabbf83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b826001600160a01b031663a26292db83836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015611f2e57600080fd5b600061259a878430611b54565b90506125aa87878787858761381c565b9695505050505050565b60006125c08483613836565b90506125da85846125d0846138e8565b6000036000613432565b6125e685843084612bc5565b6040805163ef693bed60e01b81523360048201526024810184905290516001600160a01b0386169163ef693bed91604480830192600092919082900301818387803b15801561263457600080fd5b505af1158015612648573d6000803e3d6000fd5b505050505050505050565b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561268e57600080fd5b505afa1580156126a2573d6000803e3d6000fd5b505050506040513d60208110156126b857600080fd5b50516040805163434efcbd60e01b81526004810186905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b15801561270757600080fd5b505afa15801561271b573d6000803e3d6000fd5b505050506040513d602081101561273157600080fd5b5051604080516348c5be7f60e11b81526004810187905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b15801561278057600080fd5b505afa158015612794573d6000803e3d6000fd5b505050506040513d60208110156127aa57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d604081101561282857600080fd5b506020015190506128408784611e3587828088613f1d565b61285a898761284e886138e8565b60000384600003613432565b61286689873088612bc5565b6040805163ef693bed60e01b81523060048201526024810187905290516001600160a01b038a169163ef693bed91604480830192600092919082900301818387803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b50505050876001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561290757600080fd5b505af115801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505160408051632e1a7d4d60e01b81526004810188905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561297d57600080fd5b505af1158015612991573d6000803e3d6000fd5b505060405133925087156108fc02915087906000818181858888f19350505050158015611f67573d6000803e3d6000fd5b6129ce843084846116f1565b846001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0757600080fd5b505afa158015612a1b573d6000803e3d6000fd5b505050506040513d6020811015612a3157600080fd5b5051604080516348c5be7f60e11b81526004810186905290516001600160a01b03928316926399bec315929089169163918b7cfe91602480820192602092909190829003018186803b158015612a8657600080fd5b505afa158015612a9a573d6000803e3d6000fd5b505050506040513d6020811015612ab057600080fd5b50516040805163434efcbd60e01b81526004810188905290516001600160a01b038a169163434efcbd916024808301926020929190829003018186803b158015612af957600080fd5b505afa158015612b0d573d6000803e3d6000fd5b505050506040513d6020811015612b2357600080fd5b50513080612b346122e38b8a613836565b604080516001600160e01b031960e089901b16815260048101969096526001600160a01b0394851660248701529284166044860152921660648401526084830191909152600060a48301819052905160c48084019382900301818387803b15801561263457600080fd5b612bab8787878787612f72565b611f42878584846132db565b61115884836125d0846138e8565b6040805163438ac0d160e11b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163871581a29160648082019260009290919082900301818387803b15801561113a57600080fd5b806001600160a01b0316866001600160a01b031663a2a4d76e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612c6c57600080fd5b505afa158015612c80573d6000803e3d6000fd5b505050506040513d6020811015612c9657600080fd5b50516001600160a01b031614612ce5576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b612cf286868686866129c2565b505050505050565b806001600160a01b0316846001600160a01b031663a2a4d76e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612d4857600080fd5b505afa158015612d5c573d6000803e3d6000fd5b505050506040513d6020811015612d7257600080fd5b50516001600160a01b031614612dc1576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b611be9848484613488565b816001600160a01b031663d94d4208826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015612e2457600080fd5b505af1158015612cf2573d6000803e3d6000fd5b6040805163e0decbcd60e01b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163e0decbcd9160648082019260009290919082900301818387803b15801561113a57600080fd5b612ea186868686868660016142d5565b604051339083156108fc029084906000818181858888f19350505050158015611f42573d6000803e3d6000fd5b612ed98282346130b5565b5050565b826001600160a01b03166380bdb6b283836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015611f2e57600080fd5b6000612f4a898630611b54565b9050612f5a89898989858961381c565b612f66898285856132db565b98975050505050505050565b6112c0858585858533614644565b60408051631060930d60e01b815230600482015290516000916001600160a01b03841691631060930d9160248082019260209290919082900301818787803b158015612fcb57600080fd5b505af1158015612fdf573d6000803e3d6000fd5b505050506040513d6020811015612ff557600080fd5b505192915050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b816001600160a01b031663d49d7867826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015612e2457600080fd5b826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156130f057600080fd5b505af1158015613104573d6000803e3d6000fd5b505050506040513d602081101561311a57600080fd5b505160408051630d0e30db60e41b815290516001600160a01b039092169163d0e30db0918491600480830192600092919082900301818588803b15801561316057600080fd5b505af1158015613174573d6000803e3d6000fd5b5050505050826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b505050506040513d60208110156131de57600080fd5b50516040805163095ea7b360e01b81526001600160a01b038681166004830152602482018590529151919092169163095ea7b391604480830192600092919082900301818387803b15801561323257600080fd5b505af1158015613246573d6000803e3d6000fd5b50505050826001600160a01b0316633b4da69f83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b6000806132bc8b8b8b8b8b8b8b6119d1565b90925090506132cd8b8286866132db565b995099975050505050505050565b60408051631bc250a960e21b8152600481018590526001600160a01b0384811660248301528381166044830152915191861691636f0942a49160648082019260009290919082900301818387803b15801561113a57600080fd5b6116ec83838334614917565b600061334e898630611b54565b9050612f668989898985898989612166565b806001600160a01b0316846001600160a01b031663a2a4d76e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133ae57600080fd5b505afa1580156133c2573d6000803e3d6000fd5b505050506040513d60208110156133d857600080fd5b50516001600160a01b031614613427576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b611be9848484613335565b836001600160a01b031663c78101f88484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561113a57600080fd5b6000836001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156134c357600080fd5b505afa1580156134d7573d6000803e3d6000fd5b505050506040513d60208110156134ed57600080fd5b50516040805163434efcbd60e01b81526004810185905290519192506000916001600160a01b0387169163434efcbd916024808301926020929190829003018186803b15801561353c57600080fd5b505afa158015613550573d6000803e3d6000fd5b505050506040513d602081101561356657600080fd5b5051604080516348c5be7f60e11b81526004810186905290519192506000916001600160a01b0388169163918b7cfe916024808301926020929190829003018186803b1580156135b557600080fd5b505afa1580156135c9573d6000803e3d6000fd5b505050506040513d60208110156135df57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b15801561363357600080fd5b505afa158015613647573d6000803e3d6000fd5b505050506040513d604081101561365d57600080fd5b50602090810151604080516351526bb760e11b81526004810189905290519193506000926001600160a01b038b169263a2a4d76e926024808201939291829003018186803b1580156136ae57600080fd5b505afa1580156136c2573d6000803e3d6000fd5b505050506040513d60208110156136d857600080fd5b505190506001600160a01b038116301480613775575060408051634fa053b160e01b81526001600160a01b038381166004830152602482018990523060448301529151918a1691634fa053b191606480820192602092909190829003018186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d602081101561376f57600080fd5b50516001145b156137a05761378b8785611e3588888989613f1d565b61379b8887600085600003613432565b61114e565b6137b18730611e3588308989613f1d565b604080516399bec31560e01b8152600481018590526001600160a01b0386811660248301523060448301819052606483015260006084830181905285810360a48401529251908816926399bec3159260c4808201939182900301818387803b15801561159b57600080fd5b61382886858434614917565b612cf2868685858533614644565b600080836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561387457600080fd5b505af1158015613888573d6000803e3d6000fd5b505050506040513d602081101561389e57600080fd5b5051839250905060128110156138c5576138be8382601203600a0a614aee565b91506138e1565b60128111156138e15760128103600a0a83816138dd57fe5b0491505b5092915050565b80600081121561392e576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b919050565b600080856001600160a01b031663d07900bb846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561397a57600080fd5b505afa15801561398e573d6000803e3d6000fd5b505050506040513d60a08110156139a457600080fd5b50602001519050806139f7576040805162461bcd60e51b8152602060048201526017602482015276696e76616c69642d636f6c6c61746572616c2d7479706560481b604482015290519081900360640190fd5b60408051630f50894160e21b8152600481018590526001600160a01b0386811660248301528251600093918a1692633d422504926044808301939192829003018186803b158015613a4757600080fd5b505afa158015613a5b573d6000803e3d6000fd5b505050506040513d6040811015613a7157600080fd5b50602001519050613a8a828781613a8457fe5b046138e8565b925080831115613aa557613a9d816138e8565b600003613aaa565b826000035b979650505050505050565b826001600160a01b031663a7e944556040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156131b457600080fd5b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d6020811015613b5557600080fd5b50516040805163434efcbd60e01b81526004810187905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015613ba457600080fd5b505afa158015613bb8573d6000803e3d6000fd5b505050506040513d6020811015613bce57600080fd5b5051604080516348c5be7f60e11b81526004810188905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b158015613c1d57600080fd5b505afa158015613c31573d6000803e3d6000fd5b505050506040513d6020811015613c4757600080fd5b5051604080516351526bb760e11b81526004810189905290519192506000916001600160a01b038b169163a2a4d76e916024808301926020929190829003018186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d6020811015613cc057600080fd5b505190506001600160a01b038116301480613d5d575060408051634fa053b160e01b81526001600160a01b038381166004830152602482018a90523060448301529151918b1691634fa053b191606480820192602092909190829003018186803b158015613d2d57600080fd5b505afa158015613d41573d6000803e3d6000fd5b505050506040513d6020811015613d5757600080fd5b50516001145b15613e1c578415613d7857613d738884886115f6565b613d83565b613d83888488613ab5565b613e178988600061153c88896001600160a01b031663fabde80c8a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613de457600080fd5b505afa158015613df8573d6000803e3d6000fd5b505050506040513d6020811015613e0e57600080fd5b50518989613933565b612648565b8415613e3257613e2d8830886115f6565b613e3d565b613e3d883088613ab5565b836001600160a01b03166399bec315838530306000613e6b8b676765c793fa10079d601b1b8f028c8c613933565b6040518763ffffffff1660e01b815260040180878152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019650505050505050600060405180830381600087803b158015613efa57600080fd5b505af1158015613f0e573d6000803e3d6000fd5b50505050505050505050505050565b600080856001600160a01b031663d07900bb846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b158015613f6457600080fd5b505afa158015613f78573d6000803e3d6000fd5b505050506040513d60a0811015613f8e57600080fd5b506020015160408051630f50894160e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692633d4225049260448082019391829003018186803b158015613fe557600080fd5b505afa158015613ff9573d6000803e3d6000fd5b505050506040513d604081101561400f57600080fd5b5060209081015160408051633eaf7a0360e21b81526001600160a01b038a811660048301529151929450600093918b169263fabde80c92602480840193919291829003018186803b15801561406357600080fd5b505afa158015614077573d6000803e3d6000fd5b505050506040513d602081101561408d57600080fd5b5051905060006140a66140a08486614aee565b83614b49565b9050676765c793fa10079d601b1b81049450806140ce86676765c793fa10079d601b1b614aee565b106140d957846140de565b846001015b9998505050505050505050565b600080856001600160a01b0316636c50dbba856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561413457600080fd5b505af1158015614148573d6000803e3d6000fd5b505050506040513d602081101561415e57600080fd5b50519050806141ae576040805162461bcd60e51b8152602060048201526017602482015276696e76616c69642d636f6c6c61746572616c2d7479706560481b604482015290519081900360640190fd5b6000876001600160a01b031663fabde80c876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561420657600080fd5b505afa15801561421a573d6000803e3d6000fd5b505050506040513d602081101561423057600080fd5b5051905061424984676765c793fa10079d601b1b614aee565b8110156142ad576142798261427261426c87676765c793fa10079d601b1b614aee565b84614b49565b81613a8457fe5b925061429084676765c793fa10079d601b1b614aee565b61429a8484614aee565b106142a557826142aa565b826001015b92505b505095945050505050565b60006142cf82676765c793fa10079d601b1b614aee565b92915050565b6000876001600160a01b031663434efcbd866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561431b57600080fd5b505afa15801561432f573d6000803e3d6000fd5b505050506040513d602081101561434557600080fd5b50519050811561435f5761435a8682856115f6565b61436a565b61436a868285613ab5565b6145218886614378876138e8565b60000361153c8c6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156143b757600080fd5b505afa1580156143cb573d6000803e3d6000fd5b505050506040513d60208110156143e157600080fd5b81019080805190602001909291905050508d6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561442b57600080fd5b505afa15801561443f573d6000803e3d6000fd5b505050506040513d602081101561445557600080fd5b505160408051633eaf7a0360e21b81526001600160a01b038a811660048301529151919092169163fabde80c916024808301926020929190829003018186803b1580156144a157600080fd5b505afa1580156144b5573d6000803e3d6000fd5b505050506040513d60208110156144cb57600080fd5b8101908080519060200190929190505050878f6001600160a01b031663918b7cfe8e6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561150b57600080fd5b61452d88863087612bc5565b6040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b0389169163ef693bed91604480830192600092919082900301818387803b15801561457b57600080fd5b505af115801561458f573d6000803e3d6000fd5b50505050866001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156145ce57600080fd5b505af11580156145e2573d6000803e3d6000fd5b505050506040513d60208110156145f857600080fd5b505160408051632e1a7d4d60e01b81526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561159b57600080fd5b6000866001600160a01b031663434efcbd856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561468a57600080fd5b505afa15801561469e573d6000803e3d6000fd5b505050506040513d60208110156146b457600080fd5b5051604080516367aea31360e01b815290519192506000916001600160a01b038a16916367aea313916004808301926020929190829003018186803b1580156146fc57600080fd5b505afa158015614710573d6000803e3d6000fd5b505050506040513d602081101561472657600080fd5b5051604080516348c5be7f60e11b81526004810188905290519192506000916001600160a01b038b169163918b7cfe916024808301926020929190829003018186803b15801561477557600080fd5b505afa158015614789573d6000803e3d6000fd5b505050506040513d602081101561479f57600080fd5b505190506147b78987600061153c868d89888d6140eb565b6147c6898730612304896142b8565b604080516350de215d60e01b81523060048201526001600160a01b0389811660248301529151918416916350de215d91604480820192602092909190829003018186803b15801561481657600080fd5b505afa15801561482a573d6000803e3d6000fd5b505050506040513d602081101561484057600080fd5b50516148b757816001600160a01b031663d94d4208886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561489e57600080fd5b505af11580156148b2573d6000803e3d6000fd5b505050505b866001600160a01b031663ef693bed85876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613efa57600080fd5b6149228330836130b5565b836001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561495b57600080fd5b505afa15801561496f573d6000803e3d6000fd5b505050506040513d602081101561498557600080fd5b5051604080516348c5be7f60e11b81526004810185905290516001600160a01b03928316926399bec315929088169163918b7cfe91602480820192602092909190829003018186803b1580156149da57600080fd5b505afa1580156149ee573d6000803e3d6000fd5b505050506040513d6020811015614a0457600080fd5b50516040805163434efcbd60e01b81526004810187905290516001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015614a4d57600080fd5b505afa158015614a61573d6000803e3d6000fd5b505050506040513d6020811015614a7757600080fd5b50513080614a84876138e8565b604080516001600160e01b031960e089901b16815260048101969096526001600160a01b0394851660248701529284166044860152921660648401526084830191909152600060a48301819052905160c48084019382900301818387803b15801561113a57600080fd5b6000811580614b0957505080820282828281614b0657fe5b04145b6142cf576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b808203828111156142cf576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fdfea2646970667358221220115ffdafc8a9d024c33bc83c48276d0199768c747b559af6da737ab172c0233464736f6c63430006070033
Deployed Bytecode
0x6080604052600436106102885760003560e01c806373f1ff691161015a578063b2be9117116100c1578063e205c1081161007a578063e205c10814610f29578063e25187c114610f5f578063ee28457614610fc7578063f19d3b4114611003578063f7f898b014611048578063ff08ec261461108b57610288565b8063b2be911714610d6c578063beabacc814610dbb578063c42e34e714610dfe578063d723323b14610e39578063d97ebbd514610e6f578063dbf83cde14610ee057610288565b80638a58060c116101135780638a58060c14610bb55780639edd720714610bfc578063a033df1214610c51578063a72d3ab014610c7f578063ac8b81de14610cc2578063b02f9e3d14610d1d57610288565b806373f1ff69146109e95780637b5a3b4314610a4a5780637b65158f14610a935780637f6a7acf14610ada57806384efae8314610b31578063861b15eb14610b7a57610288565b80632dc469a3116101fe5780634cac3da1116101b75780634cac3da11461082e57806352e83c6d1461087157806354523249146108b45780636093c9751461090057806360eba4f11461094957806364e506a01461099857610288565b80632dc469a3146106345780633664fa711461068357806339c1f126146106c25780633c6dc59a1461073a578063437c050d1461078357806343847b21146107eb57610288565b80631c145dcd116102505780631c145dcd146104435780631c25ff121461048e578063230eeac0146104df578063252fa0f61461056157806325817008146105a45780632d418a33146105ed57610288565b806303f2cd051461028d57806308f00e34146102d857806313cc55e4146103215780631a8678d9146103765780631c005fda14610400575b600080fd5b34801561029957600080fd5b506102d6600480360360808110156102b057600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356110d7565b005b3480156102e457600080fd5b506102d6600480360360808110156102fb57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611158565b34801561032d57600080fd5b506102d6600480360360c081101561034457600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a001356112c7565b34801561038257600080fd5b506103ee600480360361014081101561039a57600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e08101351515916101008201358116916101200135166115bd565b60408051918252519081900360200190f35b34801561040c57600080fd5b506102d66004803603606081101561042357600080fd5b506001600160a01b038135811691602081013590911690604001356115f6565b34801561044f57600080fd5b506102d66004803603608081101561046657600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156116f1565b34801561049a57600080fd5b506102d6600480360360a08110156104b157600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608090910135166118fe565b3480156104eb57600080fd5b5061053e600480360360e081101561050257600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c001356119d1565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561056d57600080fd5b506103ee6004803603606081101561058457600080fd5b506001600160a01b03813581169160208101359160409091013516611b54565b3480156105b057600080fd5b506102d6600480360360808110156105c757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611bdb565b3480156105f957600080fd5b506102d66004803603608081101561061057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bef565b34801561064057600080fd5b506102d6600480360360a081101561065757600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135611c48565b34801561068f57600080fd5b506102d6600480360360608110156106a657600080fd5b506001600160a01b038135169060208101359060400135611ee0565b3480156106ce57600080fd5b506102d660048036036101408110156106e657600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e0810135151591610100820135811691610120013516611f4b565b34801561074657600080fd5b506102d66004803603608081101561075d57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611f73565b34801561078f57600080fd5b506102d660048036036101008110156107a757600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c08101359060e001351515612166565b3480156107f757600080fd5b506102d66004803603606081101561080e57600080fd5b506001600160a01b0381358116916020810135909116906040013561246d565b34801561083a57600080fd5b506102d66004803603606081101561085157600080fd5b506001600160a01b038135811691602081013590911690604001356124cd565b34801561087d57600080fd5b506102d66004803603606081101561089457600080fd5b506001600160a01b0381358116916020810135916040909101351661252d565b6103ee600480360360c08110156108ca57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a0013561258d565b34801561090c57600080fd5b506102d66004803603608081101561092357600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356125b4565b34801561095557600080fd5b506102d6600480360360a081101561096c57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135612653565b3480156109a457600080fd5b506102d6600480360360a08110156109bb57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013515156129c2565b3480156109f557600080fd5b506102d6600480360360e0811015610a0c57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013582169160c09091013516612b9e565b348015610a5657600080fd5b506102d660048036036080811015610a6d57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612bb7565b348015610a9f57600080fd5b506102d660048036036080811015610ab657600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612bc5565b348015610ae657600080fd5b506102d6600480360360c0811015610afd57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a0013516612c1e565b348015610b3d57600080fd5b506102d660048036036080811015610b5457600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516612cfa565b348015610b8657600080fd5b506102d660048036036040811015610b9d57600080fd5b506001600160a01b0381358116916020013516612dcc565b348015610bc157600080fd5b506102d660048036036080811015610bd857600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612e38565b348015610c0857600080fd5b506102d6600480360360c0811015610c1f57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135612e91565b6102d660048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516612ece565b348015610c8b57600080fd5b506102d660048036036060811015610ca257600080fd5b506001600160a01b03813581169160208101359160409091013516612edd565b6103ee6004803603610100811015610cd957600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c082013581169160e0013516612f3d565b348015610d2957600080fd5b506102d6600480360360a0811015610d4057600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135612f72565b348015610d7857600080fd5b50610d9f60048036036020811015610d8f57600080fd5b50356001600160a01b0316612f80565b604080516001600160a01b039092168252519081900360200190f35b348015610dc757600080fd5b506102d660048036036060811015610dde57600080fd5b506001600160a01b03813581169160208101359091169060400135612ffd565b348015610e0a57600080fd5b506102d660048036036040811015610e2157600080fd5b506001600160a01b038135811691602001351661305d565b6102d660048036036060811015610e4f57600080fd5b506001600160a01b038135811691602081013590911690604001356130b5565b348015610e7b57600080fd5b5061053e6004803603610120811015610e9357600080fd5b506001600160a01b03813581169160208101358216916040820135811691606081013582169160808201359160a08101359160c08201359160e081013582169161010090910135166132aa565b348015610eec57600080fd5b506102d660048036036080811015610f0357600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166132db565b6102d660048036036060811015610f3f57600080fd5b506001600160a01b03813581169160208101359091169060400135613335565b348015610f6b57600080fd5b506103ee6004803603610100811015610f8357600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a08101359060c08101359060e001351515613341565b6102d660048036036080811015610fdd57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516613360565b34801561100f57600080fd5b506102d66004803603608081101561102657600080fd5b506001600160a01b038135169060208101359060408101359060600135613432565b34801561105457600080fd5b506102d66004803603606081101561106b57600080fd5b506001600160a01b03813581169160208101359091169060400135613488565b6102d6600480360360c08110156110a157600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359091169060808101359060a0013561381c565b6110ec8483306110e78786613836565b612bc5565b6040805163ef693bed60e01b81523360048201526024810183905290516001600160a01b0385169163ef693bed91604480830192600092919082900301818387803b15801561113a57600080fd5b505af115801561114e573d6000803e3d6000fd5b5050505050505050565b61116484833084612bc5565b6040805163ef693bed60e01b81523060048201526024810183905290516001600160a01b0385169163ef693bed91604480830192600092919082900301818387803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b50505050826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506040513d602081101561122f57600080fd5b505160408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561127b57600080fd5b505af115801561128f573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156112c0573d6000803e3d6000fd5b5050505050565b6000866001600160a01b031663434efcbd856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561130d57600080fd5b505afa158015611321573d6000803e3d6000fd5b505050506040513d602081101561133757600080fd5b505190506113468582846115f6565b60006113528785613836565b90506115418886611362846138e8565b60000361153c8c6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a157600080fd5b505afa1580156113b5573d6000803e3d6000fd5b505050506040513d60208110156113cb57600080fd5b81019080805190602001909291905050508d6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561141557600080fd5b505afa158015611429573d6000803e3d6000fd5b505050506040513d602081101561143f57600080fd5b505160408051633eaf7a0360e21b81526001600160a01b038b811660048301529151919092169163fabde80c916024808301926020929190829003018186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b8101908080519060200190929190505050888f6001600160a01b031663918b7cfe8e6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561150b57600080fd5b505afa15801561151f573d6000803e3d6000fd5b505050506040513d602081101561153557600080fd5b5051613933565b613432565b61154d88863084612bc5565b6040805163ef693bed60e01b81523360048201526024810186905290516001600160a01b0389169163ef693bed91604480830192600092919082900301818387803b15801561159b57600080fd5b505af11580156115af573d6000803e3d6000fd5b505050505050505050505050565b60006115ca8b8830611b54565b90506115dc8b8b8b8b858b8b8b612166565b6115e88b8285856132db565b9a9950505050505050505050565b826001600160a01b031663a7e944556040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050506040513d602081101561165b57600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156116b457600080fd5b505af11580156116c8573d6000803e3d6000fd5b505050506040513d60208110156116de57600080fd5b506116ec9050838383613ab5565b505050565b801561189e57836001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b505050506040513d602081101561175c57600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50505050836001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561180757600080fd5b505af115801561181b573d6000803e3d6000fd5b505050506040513d602081101561183157600080fd5b50516040805163095ea7b360e01b81526001600160a01b038781166004830152602482018690529151919092169163095ea7b391604480830192600092919082900301818387803b15801561188557600080fd5b505af1158015611899573d6000803e3d6000fd5b505050505b836001600160a01b0316633b4da69f84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561113a57600080fd5b806001600160a01b0316856001600160a01b031663a2a4d76e856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516001600160a01b0316146119c5576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b6112c085858585611bdb565b60408051638c4c280160e01b8152306004820152905160009182916001600160a01b03891691638c4c2801916024808301926020929190829003018186803b158015611a1c57600080fd5b505afa158015611a30573d6000803e3d6000fd5b505050506040513d6020811015611a4657600080fd5b505191506001600160a01b038216611a6457611a6187612f80565b91505b866001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b505050506040513d6020811015611ac957600080fd5b50516040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018890529151919092169163a9059cbb91604480830192600092919082900301818387803b158015611b1d57600080fd5b505af1158015611b31573d6000803e3d6000fd5b50505050611b46898989898989896000613341565b905097509795505050505050565b6040805163d983ff9560e01b8152600481018490526001600160a01b038381166024830152915160009286169163d983ff9591604480830192602092919082900301818787803b158015611ba757600080fd5b505af1158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b5051949350505050565b611be9848484846001613af0565b50505050565b6040805163660e160760e01b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163660e16079160648082019260009290919082900301818387803b15801561113a57600080fd5b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015611c8357600080fd5b505afa158015611c97573d6000803e3d6000fd5b505050506040513d6020811015611cad57600080fd5b50516040805163434efcbd60e01b81526004810186905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d6020811015611d2657600080fd5b5051604080516348c5be7f60e11b81526004810187905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b158015611d7557600080fd5b505afa158015611d89573d6000803e3d6000fd5b505050506040513d6020811015611d9f57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b158015611df357600080fd5b505afa158015611e07573d6000803e3d6000fd5b505050506040513d6040811015611e1d57600080fd5b50602001519050611e3a8784611e3587828088613f1d565b6115f6565b6000611e468987613836565b9050611e628a88611e56846138e8565b60000385600003613432565b611e6e8a883084612bc5565b6040805163ef693bed60e01b81523360048201526024810188905290516001600160a01b038b169163ef693bed91604480830192600092919082900301818387803b158015611ebc57600080fd5b505af1158015611ed0573d6000803e3d6000fd5b5050505050505050505050505050565b826001600160a01b031663018477a583836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b505af1158015611f42573d6000803e3d6000fd5b50505050505050565b611f5b8a8a8a8a8a8a8a8a612166565b611f678a8784846132db565b50505050505050505050565b6000846001600160a01b031663c4552791836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611fcb57600080fd5b505afa158015611fdf573d6000803e3d6000fd5b505050506040513d6020811015611ff557600080fd5b505190506001600160a01b03811615806120855750816001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d602081101561207757600080fd5b50516001600160a01b031614155b1561215b57813b80156120d3576040805162461bcd60e51b8152602060048201526011602482015270191cdd0b5a5ccb584b58dbdb9d1c9858dd607a1b604482015290519081900360640190fd5b856001600160a01b031663f3701da2846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561212b57600080fd5b505af115801561213f573d6000803e3d6000fd5b505050506040513d602081101561215557600080fd5b50519150505b6112c0848483612edd565b6000886001600160a01b031663434efcbd866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156121ac57600080fd5b505afa1580156121c0573d6000803e3d6000fd5b505050506040513d60208110156121d657600080fd5b5051604080516367aea31360e01b815290519192506000916001600160a01b038c16916367aea313916004808301926020929190829003018186803b15801561221e57600080fd5b505afa158015612232573d6000803e3d6000fd5b505050506040513d602081101561224857600080fd5b5051604080516348c5be7f60e11b81526004810189905290519192506000916001600160a01b038d169163918b7cfe916024808301926020929190829003018186803b15801561229757600080fd5b505afa1580156122ab573d6000803e3d6000fd5b505050506040513d60208110156122c157600080fd5b505190506122d1898488876116f1565b6122f58b886122e86122e38d8b613836565b6138e8565b61153c868f89888d6140eb565b6123098b8830612304896142b8565b611bef565b604080516350de215d60e01b81523060048201526001600160a01b038a811660248301529151918416916350de215d91604480820192602092909190829003018186803b15801561235957600080fd5b505afa15801561236d573d6000803e3d6000fd5b505050506040513d602081101561238357600080fd5b50516123fa57816001600160a01b031663d94d4208896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b1580156123e157600080fd5b505af11580156123f5573d6000803e3d6000fd5b505050505b6040805163ef693bed60e01b81523360048201526024810187905290516001600160a01b038a169163ef693bed91604480830192600092919082900301818387803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050505050505050505050505050565b826001600160a01b031663391735c183836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b826001600160a01b0316636ffdabbf83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b826001600160a01b031663a26292db83836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015611f2e57600080fd5b600061259a878430611b54565b90506125aa87878787858761381c565b9695505050505050565b60006125c08483613836565b90506125da85846125d0846138e8565b6000036000613432565b6125e685843084612bc5565b6040805163ef693bed60e01b81523360048201526024810184905290516001600160a01b0386169163ef693bed91604480830192600092919082900301818387803b15801561263457600080fd5b505af1158015612648573d6000803e3d6000fd5b505050505050505050565b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561268e57600080fd5b505afa1580156126a2573d6000803e3d6000fd5b505050506040513d60208110156126b857600080fd5b50516040805163434efcbd60e01b81526004810186905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b15801561270757600080fd5b505afa15801561271b573d6000803e3d6000fd5b505050506040513d602081101561273157600080fd5b5051604080516348c5be7f60e11b81526004810187905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b15801561278057600080fd5b505afa158015612794573d6000803e3d6000fd5b505050506040513d60208110156127aa57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d604081101561282857600080fd5b506020015190506128408784611e3587828088613f1d565b61285a898761284e886138e8565b60000384600003613432565b61286689873088612bc5565b6040805163ef693bed60e01b81523060048201526024810187905290516001600160a01b038a169163ef693bed91604480830192600092919082900301818387803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b50505050876001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561290757600080fd5b505af115801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505160408051632e1a7d4d60e01b81526004810188905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561297d57600080fd5b505af1158015612991573d6000803e3d6000fd5b505060405133925087156108fc02915087906000818181858888f19350505050158015611f67573d6000803e3d6000fd5b6129ce843084846116f1565b846001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0757600080fd5b505afa158015612a1b573d6000803e3d6000fd5b505050506040513d6020811015612a3157600080fd5b5051604080516348c5be7f60e11b81526004810186905290516001600160a01b03928316926399bec315929089169163918b7cfe91602480820192602092909190829003018186803b158015612a8657600080fd5b505afa158015612a9a573d6000803e3d6000fd5b505050506040513d6020811015612ab057600080fd5b50516040805163434efcbd60e01b81526004810188905290516001600160a01b038a169163434efcbd916024808301926020929190829003018186803b158015612af957600080fd5b505afa158015612b0d573d6000803e3d6000fd5b505050506040513d6020811015612b2357600080fd5b50513080612b346122e38b8a613836565b604080516001600160e01b031960e089901b16815260048101969096526001600160a01b0394851660248701529284166044860152921660648401526084830191909152600060a48301819052905160c48084019382900301818387803b15801561263457600080fd5b612bab8787878787612f72565b611f42878584846132db565b61115884836125d0846138e8565b6040805163438ac0d160e11b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163871581a29160648082019260009290919082900301818387803b15801561113a57600080fd5b806001600160a01b0316866001600160a01b031663a2a4d76e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612c6c57600080fd5b505afa158015612c80573d6000803e3d6000fd5b505050506040513d6020811015612c9657600080fd5b50516001600160a01b031614612ce5576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b612cf286868686866129c2565b505050505050565b806001600160a01b0316846001600160a01b031663a2a4d76e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612d4857600080fd5b505afa158015612d5c573d6000803e3d6000fd5b505050506040513d6020811015612d7257600080fd5b50516001600160a01b031614612dc1576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b611be9848484613488565b816001600160a01b031663d94d4208826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015612e2457600080fd5b505af1158015612cf2573d6000803e3d6000fd5b6040805163e0decbcd60e01b8152600481018590526001600160a01b0384811660248301526044820184905291519186169163e0decbcd9160648082019260009290919082900301818387803b15801561113a57600080fd5b612ea186868686868660016142d5565b604051339083156108fc029084906000818181858888f19350505050158015611f42573d6000803e3d6000fd5b612ed98282346130b5565b5050565b826001600160a01b03166380bdb6b283836040518363ffffffff1660e01b815260040180838152602001826001600160a01b03166001600160a01b0316815260200192505050600060405180830381600087803b158015611f2e57600080fd5b6000612f4a898630611b54565b9050612f5a89898989858961381c565b612f66898285856132db565b98975050505050505050565b6112c0858585858533614644565b60408051631060930d60e01b815230600482015290516000916001600160a01b03841691631060930d9160248082019260209290919082900301818787803b158015612fcb57600080fd5b505af1158015612fdf573d6000803e3d6000fd5b505050506040513d6020811015612ff557600080fd5b505192915050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b816001600160a01b031663d49d7867826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015612e2457600080fd5b826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156130f057600080fd5b505af1158015613104573d6000803e3d6000fd5b505050506040513d602081101561311a57600080fd5b505160408051630d0e30db60e41b815290516001600160a01b039092169163d0e30db0918491600480830192600092919082900301818588803b15801561316057600080fd5b505af1158015613174573d6000803e3d6000fd5b5050505050826001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156131b457600080fd5b505af11580156131c8573d6000803e3d6000fd5b505050506040513d60208110156131de57600080fd5b50516040805163095ea7b360e01b81526001600160a01b038681166004830152602482018590529151919092169163095ea7b391604480830192600092919082900301818387803b15801561323257600080fd5b505af1158015613246573d6000803e3d6000fd5b50505050826001600160a01b0316633b4da69f83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611f2e57600080fd5b6000806132bc8b8b8b8b8b8b8b6119d1565b90925090506132cd8b8286866132db565b995099975050505050505050565b60408051631bc250a960e21b8152600481018590526001600160a01b0384811660248301528381166044830152915191861691636f0942a49160648082019260009290919082900301818387803b15801561113a57600080fd5b6116ec83838334614917565b600061334e898630611b54565b9050612f668989898985898989612166565b806001600160a01b0316846001600160a01b031663a2a4d76e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133ae57600080fd5b505afa1580156133c2573d6000803e3d6000fd5b505050506040513d60208110156133d857600080fd5b50516001600160a01b031614613427576040805162461bcd60e51b815260206004820152600f60248201526e0deeedccae45adad2e6e6dac2e8c6d608b1b604482015290519081900360640190fd5b611be9848484613335565b836001600160a01b031663c78101f88484846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561113a57600080fd5b6000836001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156134c357600080fd5b505afa1580156134d7573d6000803e3d6000fd5b505050506040513d60208110156134ed57600080fd5b50516040805163434efcbd60e01b81526004810185905290519192506000916001600160a01b0387169163434efcbd916024808301926020929190829003018186803b15801561353c57600080fd5b505afa158015613550573d6000803e3d6000fd5b505050506040513d602081101561356657600080fd5b5051604080516348c5be7f60e11b81526004810186905290519192506000916001600160a01b0388169163918b7cfe916024808301926020929190829003018186803b1580156135b557600080fd5b505afa1580156135c9573d6000803e3d6000fd5b505050506040513d60208110156135df57600080fd5b505160408051630f50894160e21b8152600481018390526001600160a01b038581166024830152825193945060009390871692633d4225049260448082019391829003018186803b15801561363357600080fd5b505afa158015613647573d6000803e3d6000fd5b505050506040513d604081101561365d57600080fd5b50602090810151604080516351526bb760e11b81526004810189905290519193506000926001600160a01b038b169263a2a4d76e926024808201939291829003018186803b1580156136ae57600080fd5b505afa1580156136c2573d6000803e3d6000fd5b505050506040513d60208110156136d857600080fd5b505190506001600160a01b038116301480613775575060408051634fa053b160e01b81526001600160a01b038381166004830152602482018990523060448301529151918a1691634fa053b191606480820192602092909190829003018186803b15801561374557600080fd5b505afa158015613759573d6000803e3d6000fd5b505050506040513d602081101561376f57600080fd5b50516001145b156137a05761378b8785611e3588888989613f1d565b61379b8887600085600003613432565b61114e565b6137b18730611e3588308989613f1d565b604080516399bec31560e01b8152600481018590526001600160a01b0386811660248301523060448301819052606483015260006084830181905285810360a48401529251908816926399bec3159260c4808201939182900301818387803b15801561159b57600080fd5b61382886858434614917565b612cf2868685858533614644565b600080836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561387457600080fd5b505af1158015613888573d6000803e3d6000fd5b505050506040513d602081101561389e57600080fd5b5051839250905060128110156138c5576138be8382601203600a0a614aee565b91506138e1565b60128111156138e15760128103600a0a83816138dd57fe5b0491505b5092915050565b80600081121561392e576040805162461bcd60e51b815260206004820152600c60248201526b696e742d6f766572666c6f7760a01b604482015290519081900360640190fd5b919050565b600080856001600160a01b031663d07900bb846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561397a57600080fd5b505afa15801561398e573d6000803e3d6000fd5b505050506040513d60a08110156139a457600080fd5b50602001519050806139f7576040805162461bcd60e51b8152602060048201526017602482015276696e76616c69642d636f6c6c61746572616c2d7479706560481b604482015290519081900360640190fd5b60408051630f50894160e21b8152600481018590526001600160a01b0386811660248301528251600093918a1692633d422504926044808301939192829003018186803b158015613a4757600080fd5b505afa158015613a5b573d6000803e3d6000fd5b505050506040513d6040811015613a7157600080fd5b50602001519050613a8a828781613a8457fe5b046138e8565b925080831115613aa557613a9d816138e8565b600003613aaa565b826000035b979650505050505050565b826001600160a01b031663a7e944556040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156131b457600080fd5b6000856001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d6020811015613b5557600080fd5b50516040805163434efcbd60e01b81526004810187905290519192506000916001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015613ba457600080fd5b505afa158015613bb8573d6000803e3d6000fd5b505050506040513d6020811015613bce57600080fd5b5051604080516348c5be7f60e11b81526004810188905290519192506000916001600160a01b038a169163918b7cfe916024808301926020929190829003018186803b158015613c1d57600080fd5b505afa158015613c31573d6000803e3d6000fd5b505050506040513d6020811015613c4757600080fd5b5051604080516351526bb760e11b81526004810189905290519192506000916001600160a01b038b169163a2a4d76e916024808301926020929190829003018186803b158015613c9657600080fd5b505afa158015613caa573d6000803e3d6000fd5b505050506040513d6020811015613cc057600080fd5b505190506001600160a01b038116301480613d5d575060408051634fa053b160e01b81526001600160a01b038381166004830152602482018a90523060448301529151918b1691634fa053b191606480820192602092909190829003018186803b158015613d2d57600080fd5b505afa158015613d41573d6000803e3d6000fd5b505050506040513d6020811015613d5757600080fd5b50516001145b15613e1c578415613d7857613d738884886115f6565b613d83565b613d83888488613ab5565b613e178988600061153c88896001600160a01b031663fabde80c8a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613de457600080fd5b505afa158015613df8573d6000803e3d6000fd5b505050506040513d6020811015613e0e57600080fd5b50518989613933565b612648565b8415613e3257613e2d8830886115f6565b613e3d565b613e3d883088613ab5565b836001600160a01b03166399bec315838530306000613e6b8b676765c793fa10079d601b1b8f028c8c613933565b6040518763ffffffff1660e01b815260040180878152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019650505050505050600060405180830381600087803b158015613efa57600080fd5b505af1158015613f0e573d6000803e3d6000fd5b50505050505050505050505050565b600080856001600160a01b031663d07900bb846040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b158015613f6457600080fd5b505afa158015613f78573d6000803e3d6000fd5b505050506040513d60a0811015613f8e57600080fd5b506020015160408051630f50894160e21b8152600481018690526001600160a01b0387811660248301528251939450600093908a1692633d4225049260448082019391829003018186803b158015613fe557600080fd5b505afa158015613ff9573d6000803e3d6000fd5b505050506040513d604081101561400f57600080fd5b5060209081015160408051633eaf7a0360e21b81526001600160a01b038a811660048301529151929450600093918b169263fabde80c92602480840193919291829003018186803b15801561406357600080fd5b505afa158015614077573d6000803e3d6000fd5b505050506040513d602081101561408d57600080fd5b5051905060006140a66140a08486614aee565b83614b49565b9050676765c793fa10079d601b1b81049450806140ce86676765c793fa10079d601b1b614aee565b106140d957846140de565b846001015b9998505050505050505050565b600080856001600160a01b0316636c50dbba856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561413457600080fd5b505af1158015614148573d6000803e3d6000fd5b505050506040513d602081101561415e57600080fd5b50519050806141ae576040805162461bcd60e51b8152602060048201526017602482015276696e76616c69642d636f6c6c61746572616c2d7479706560481b604482015290519081900360640190fd5b6000876001600160a01b031663fabde80c876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561420657600080fd5b505afa15801561421a573d6000803e3d6000fd5b505050506040513d602081101561423057600080fd5b5051905061424984676765c793fa10079d601b1b614aee565b8110156142ad576142798261427261426c87676765c793fa10079d601b1b614aee565b84614b49565b81613a8457fe5b925061429084676765c793fa10079d601b1b614aee565b61429a8484614aee565b106142a557826142aa565b826001015b92505b505095945050505050565b60006142cf82676765c793fa10079d601b1b614aee565b92915050565b6000876001600160a01b031663434efcbd866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561431b57600080fd5b505afa15801561432f573d6000803e3d6000fd5b505050506040513d602081101561434557600080fd5b50519050811561435f5761435a8682856115f6565b61436a565b61436a868285613ab5565b6145218886614378876138e8565b60000361153c8c6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b1580156143b757600080fd5b505afa1580156143cb573d6000803e3d6000fd5b505050506040513d60208110156143e157600080fd5b81019080805190602001909291905050508d6001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561442b57600080fd5b505afa15801561443f573d6000803e3d6000fd5b505050506040513d602081101561445557600080fd5b505160408051633eaf7a0360e21b81526001600160a01b038a811660048301529151919092169163fabde80c916024808301926020929190829003018186803b1580156144a157600080fd5b505afa1580156144b5573d6000803e3d6000fd5b505050506040513d60208110156144cb57600080fd5b8101908080519060200190929190505050878f6001600160a01b031663918b7cfe8e6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561150b57600080fd5b61452d88863087612bc5565b6040805163ef693bed60e01b81523060048201526024810186905290516001600160a01b0389169163ef693bed91604480830192600092919082900301818387803b15801561457b57600080fd5b505af115801561458f573d6000803e3d6000fd5b50505050866001600160a01b031663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156145ce57600080fd5b505af11580156145e2573d6000803e3d6000fd5b505050506040513d60208110156145f857600080fd5b505160408051632e1a7d4d60e01b81526004810187905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561159b57600080fd5b6000866001600160a01b031663434efcbd856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561468a57600080fd5b505afa15801561469e573d6000803e3d6000fd5b505050506040513d60208110156146b457600080fd5b5051604080516367aea31360e01b815290519192506000916001600160a01b038a16916367aea313916004808301926020929190829003018186803b1580156146fc57600080fd5b505afa158015614710573d6000803e3d6000fd5b505050506040513d602081101561472657600080fd5b5051604080516348c5be7f60e11b81526004810188905290519192506000916001600160a01b038b169163918b7cfe916024808301926020929190829003018186803b15801561477557600080fd5b505afa158015614789573d6000803e3d6000fd5b505050506040513d602081101561479f57600080fd5b505190506147b78987600061153c868d89888d6140eb565b6147c6898730612304896142b8565b604080516350de215d60e01b81523060048201526001600160a01b0389811660248301529151918416916350de215d91604480820192602092909190829003018186803b15801561481657600080fd5b505afa15801561482a573d6000803e3d6000fd5b505050506040513d602081101561484057600080fd5b50516148b757816001600160a01b031663d94d4208886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561489e57600080fd5b505af11580156148b2573d6000803e3d6000fd5b505050505b866001600160a01b031663ef693bed85876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613efa57600080fd5b6149228330836130b5565b836001600160a01b03166367aea3136040518163ffffffff1660e01b815260040160206040518083038186803b15801561495b57600080fd5b505afa15801561496f573d6000803e3d6000fd5b505050506040513d602081101561498557600080fd5b5051604080516348c5be7f60e11b81526004810185905290516001600160a01b03928316926399bec315929088169163918b7cfe91602480820192602092909190829003018186803b1580156149da57600080fd5b505afa1580156149ee573d6000803e3d6000fd5b505050506040513d6020811015614a0457600080fd5b50516040805163434efcbd60e01b81526004810187905290516001600160a01b0389169163434efcbd916024808301926020929190829003018186803b158015614a4d57600080fd5b505afa158015614a61573d6000803e3d6000fd5b505050506040513d6020811015614a7757600080fd5b50513080614a84876138e8565b604080516001600160e01b031960e089901b16815260048101969096526001600160a01b0394851660248701529284166044860152921660648401526084830191909152600060a48301819052905160c48084019382900301818387803b15801561113a57600080fd5b6000811580614b0957505080820282828281614b0657fe5b04145b6142cf576040805162461bcd60e51b815260206004820152600c60248201526b6d756c2d6f766572666c6f7760a01b604482015290519081900360640190fd5b808203828111156142cf576040805162461bcd60e51b815260206004820152600c60248201526b7375622d6f766572666c6f7760a01b604482015290519081900360640190fdfea2646970667358221220115ffdafc8a9d024c33bc83c48276d0199768c747b559af6da737ab172c0233464736f6c63430006070033
Deployed Bytecode Sourcemap
31031:15125:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;34079:444:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34079:444:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;34079:444:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27513:568;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27513:568:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27513:568:0;;;;;;;;;;;;;;;;;;;;;;:::i;43708:1162::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43708:1162:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;43708:1162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40167:670::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40167:670:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;40167:670:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7602:263;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7602:263:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7602:263:0;;;;;;;;;;;;;;;;;:::i;31081:607::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31081:607:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;31081:607:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;34916:294::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34916:294:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;34916:294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40845:822::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40845:822:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;40845:822:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;40845:822:0;;;;;;;;;;;;;;;;;;;;;20724:209;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20724:209:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;20724:209:0;;;;;;;;;;;;;;;;;:::i;28748:190::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28748:190:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28748:190:0;;;;;;;;;;;;;;;;;;;;;;:::i;24068:209::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24068:209:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24068:209:0;;;;;;;;;;;;;;;;;;;;:::i;44878:1275::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44878:1275:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;44878:1275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25848:172::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25848:172:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;25848:172:0;;;;;;;;;;;;;:::i;38953:666::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38953:666:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;38953:666:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21600:961::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21600:961:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21600:961:0;;;;;;;;;;;;;;;;;;;;;;:::i;37471:1474::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37471:1474:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;37471:1474:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23183:165::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23183:165:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;23183:165:0;;;;;;;;;;;;;;;;;:::i;25452:167::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25452:167:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;25452:167:0;;;;;;;;;;;;;;;;;:::i;25078:165::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25078:165:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;25078:165:0;;;;;;;;;;;;;;;;;:::i;29883:412::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;29883:412:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33488:583::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33488:583:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;33488:583:0;;;;;;;;;;;;;;;;;;;;;;:::i;42336:1364::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42336:1364:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;42336:1364:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32388:716::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32388:716:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;32388:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34531:377::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34531:377:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;34531:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26602:681::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26602:681:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26602:681:0;;;;;;;;;;;;;;;;;;;;;;:::i;23612:203::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23612:203:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23612:203:0;;;;;;;;;;;;;;;;;;;;:::i;33112:368::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33112:368:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;33112:368:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36631:276::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36631:276:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;36631:276:0;;;;;;;;;;;;;;;;;;;;;;:::i;19995:187::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19995:187:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19995:187:0;;;;;;;;;;:::i;22792:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22792:185:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22792:185:0;;;;;;;;;;;;;;;;;;;;:::i;30626:394::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30626:394:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;30626:394:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19095:119::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19095:119:0;;;;;;;;;;:::i;21134:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21134:185:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;21134:185:0;;;;;;;;;;;;;;;;;:::i;36915:548::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;36915:548:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28329:247::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28329:247:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28329:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31932:168::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31932:168:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31932:168:0;-1:-1:-1;;;;;31932:168:0;;:::i;:::-;;;;-1:-1:-1;;;;;31932:168:0;;;;;;;;;;;;;;18806:134;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18806:134:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;18806:134:0;;;;;;;;;;;;;;;;;:::i;20343:181::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20343:181:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;20343:181:0;;;;;;;;;;:::i;19415:420::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19415:420:0;;;;;;;;;;;;;;;;;:::i;41675:653::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41675:653:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;41675:653:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31696:228::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31696:228:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;31696:228:0;;;;;;;;;;;;;;;;;;;;;;:::i;26203:173::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;26203:173:0;;;;;;;;;;;;;;;;;:::i;39627:532::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39627:532:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;39627:532:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32108:272::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;32108:272:0;;;;;;;;;;;;;;;;;;;;;;:::i;24579:252::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24579:252:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24579:252:0;;;;;;;;;;;;;;;;;;:::i;35218:1405::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35218:1405:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;35218:1405:0;;;;;;;;;;;;;;;;;:::i;29245:355::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;29245:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34079:444::-;34301:82;34320:7;34329:4;34343;34350:32;34362:14;34378:3;34350:11;:32::i;:::-;34301:18;:82::i;:::-;34459:56;;;-1:-1:-1;;;34459:56:0;;34499:10;34459:56;;;;;;;;;;;;-1:-1:-1;;;;;34459:39:0;;;;;:56;;;;;-1:-1:-1;;34459:56:0;;;;;;;-1:-1:-1;34459:39:0;:56;;;2:2:-1;;;;27:1;24;17:12;2:2;34459:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34459:56:0;;;;34079:444;;;;:::o;27513:568::-;27718:53;27737:7;27746:4;27760;27767:3;27718:18;:53::i;:::-;27840:52;;;-1:-1:-1;;;27840:52:0;;27881:4;27840:52;;;;;;;;;;;;-1:-1:-1;;;;;27840:32:0;;;;;:52;;;;;-1:-1:-1;;27840:52:0;;;;;;;-1:-1:-1;27840:32:0;:52;;;2:2:-1;;;;27:1;24;17:12;2:2;27840:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27840:52:0;;;;27955:7;-1:-1:-1;;;;;27936:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27936:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27936:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27936:40:0;:54;;;-1:-1:-1;;;27936:54:0;;;;;;;;;;-1:-1:-1;;;;;27936:49:0;;;;;;:54;;;;;-1:-1:-1;;27936:54:0;;;;;;;;-1:-1:-1;27936:49:0;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;27936:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28049:24:0;;:10;;-1:-1:-1;28049:24:0;;;;;-1:-1:-1;28069:3:0;;28049:24;;;;28069:3;28049:10;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28049:24:0;27513:568;;;;:::o;43708:1162::-;43938:19;43972:7;-1:-1:-1;;;;;43960:26:0;;43987:4;43960:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43960:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43960:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43960:32:0;;-1:-1:-1;44053:46:0;44067:8;43960:32;44090:8;44053:13;:46::i;:::-;44110:18;44131:45;44143:14;44159:16;44131:11;:45::i;:::-;44110:66;;44258:317;44300:7;44322:4;44342:20;44348:13;44342:5;:20::i;:::-;44341:21;;44377:187;44409:7;-1:-1:-1;;;;;44397:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44397:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44397:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44397:33:0;;;;;;;;;;;;;;;;44459:7;-1:-1:-1;;;;;44447:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44447:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44447:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44447:33:0;44432:74;;;-1:-1:-1;;;44432:74:0;;-1:-1:-1;;;;;44432:74:0;;;;;;;;;:61;;;;;;;:74;;;;;44447:33;;44432:74;;;;;;;:61;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;44432:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44432:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44432:74:0;;;;;;;;;;;;;;;;44508:11;44533:7;-1:-1:-1;;;;;44521:36:0;;44558:4;44521:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44521:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44521:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44521:42:0;44377:19;:187::i;:::-;44258:27;:317::i;:::-;44656:63;44675:7;44684:4;44698;44705:13;44656:18;:63::i;:::-;44793:69;;;-1:-1:-1;;;44793:69:0;;44833:10;44793:69;;;;;;;;;;;;-1:-1:-1;;;;;44793:39:0;;;;;:69;;;;;-1:-1:-1;;44793:69:0;;;;;;;-1:-1:-1;44793:39:0;:69;;;2:2:-1;;;;27:1;24;17:12;2:2;44793:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44793:69:0;;;;43708:1162;;;;;;;;:::o;40167:670::-;40545:9;40574:48;40583:7;40592:14;40616:4;40574:8;:48::i;:::-;40567:55;;40633:131;40668:7;40677:12;40691:14;40707:8;40717:4;40723:16;40741:8;40751:12;40633:34;:131::i;:::-;40775:54;40787:7;40796:4;40802:17;40821:7;40775:11;:54::i;:::-;40167:670;;;;;;;;;;;;:::o;7602:263::-;7745:3;-1:-1:-1;;;;;7732:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7732:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7732:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7732:30:0;:75;;;-1:-1:-1;;;7732:75:0;;7776:10;7732:75;;;;7796:4;7732:75;;;;;;;;;;;;-1:-1:-1;;;;;7732:43:0;;;;;;:75;;;;;:30;;:75;;;;;;;;-1:-1:-1;7732:43:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;7732:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7732:75:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7820:37:0;;-1:-1:-1;7835:3:0;7840:11;7853:3;7820:14;:37::i;:::-;7602:263;;;:::o;31081:607::-;31277:12;31273:303;;;31375:3;-1:-1:-1;;;;;31356:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31356:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31356:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31356:36:0;:81;;;-1:-1:-1;;;31356:81:0;;31406:10;31356:81;;;;31426:4;31356:81;;;;;;;;;;;;-1:-1:-1;;;;;31356:49:0;;;;;;:81;;;;;-1:-1:-1;;31356:81:0;;;;;;;;-1:-1:-1;31356:49:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;31356:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31356:81:0;;;;31529:3;-1:-1:-1;;;;;31510:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31510:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31510:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31510:36:0;:54;;;-1:-1:-1;;;31510:54:0;;-1:-1:-1;;;;;31510:54:0;;;;;;;;;;;;;;;:44;;;;;;;:54;;;;;-1:-1:-1;;31510:54:0;;;;;;;-1:-1:-1;31510:44:0;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;31510:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31510:54:0;;;;31273:303;31660:3;-1:-1:-1;;;;;31641:28:0;;31670:4;31676:3;31641:39;;;;;;;;;;;;;-1:-1:-1;;;;;31641:39:0;-1:-1:-1;;;;;31641:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;34916:294:0;35127:5;-1:-1:-1;;;;;35088:44:0;35100:7;-1:-1:-1;;;;;35088:29:0;;35118:4;35088:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35088:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35088:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35088:35:0;-1:-1:-1;;;;;35088:44:0;;35080:72;;;;;-1:-1:-1;;;35080:72:0;;;;;;;;;;;;-1:-1:-1;;;35080:72:0;;;;;;;;;;;;;;;35163:39;35173:7;35182:8;35192:4;35198:3;35163:9;:39::i;40845:822::-;41199:40;;;-1:-1:-1;;;41199:40:0;;41233:4;41199:40;;;;;;41103:11;;;;-1:-1:-1;;;;;41199:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;2:2:-1;;;;27:1;24;17:12;2:2;41199:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41199:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41199:40:0;;-1:-1:-1;;;;;;41254:17:0;;41250:82;;41294:26;41312:7;41294:17;:26::i;:::-;41288:32;;41250:82;41456:7;-1:-1:-1;;;;;41437:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41437:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41437:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41437:40:0;41422:88;;;-1:-1:-1;;;41422:88:0;;-1:-1:-1;;;;;41422:88:0;;;;;;;;;;;;;;;:65;;;;;;;:88;;;;;-1:-1:-1;;41422:88:0;;;;;;;-1:-1:-1;41422:65:0;:88;;;2:2:-1;;;;27:1;24;17:12;2:2;41422:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41422:88:0;;;;41528:131;41567:7;41576:12;41590:7;41599:8;41609:14;41625:16;41643:8;41653:5;41528:38;:131::i;:::-;41521:138;;40845:822;;;;;;;;;;:::o;20724:209::-;20875:50;;;-1:-1:-1;;;20875:50:0;;;;;;;;-1:-1:-1;;;;;20875:50:0;;;;;;;;;20846:9;;20875:29;;;;;:50;;;;;;;;;;;;;;20846:9;20875:29;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;20875:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20875:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20875:50:0;;20724:209;-1:-1:-1;;;;20724:209:0:o;28748:190::-;28884:46;28895:7;28904:8;28914:4;28920:3;28925:4;28884:10;:46::i;:::-;28748:190;;;;:::o;24068:209::-;24211:58;;;-1:-1:-1;;;24211:58:0;;;;;;;;-1:-1:-1;;;;;24211:58:0;;;;;;;;;;;;;;;:42;;;;;;:58;;;;;-1:-1:-1;;24211:58:0;;;;;;;;-1:-1:-1;24211:42:0;:58;;;2:2:-1;;;;27:1;24;17:12;44878:1275:0;45085:18;45118:7;-1:-1:-1;;;;;45106:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45106:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45106:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45106:33:0;45172:32;;;-1:-1:-1;;;45172:32:0;;;;;;;;;;45106:33;;-1:-1:-1;45150:19:0;;-1:-1:-1;;;;;45172:26:0;;;;;:32;;;;;45106:33;;45172:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;45172:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45172:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45172:32:0;45240:42;;;-1:-1:-1;;;45240:42:0;;;;;;;;;;45172:32;;-1:-1:-1;45215:22:0;;-1:-1:-1;;;;;45240:36:0;;;;;:42;;;;;45172:32;;45240:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;45240:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45240:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45240:42:0;45318:61;;;-1:-1:-1;;;45318:61:0;;;;;;;;-1:-1:-1;;;;;45318:61:0;;;;;;;;;45240:42;;-1:-1:-1;45296:18:0;;45318:32;;;;;;:61;;;;;;;;;;;:32;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;45318:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45318:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45318:61:0;;;;-1:-1:-1;45442:108:0;45456:8;45466:11;45479:70;45496:10;45466:11;;45534:14;45479:16;:70::i;:::-;45442:13;:108::i;:::-;45561:18;45582:45;45594:14;45610:16;45582:11;:45::i;:::-;45561:66;;45709:149;45751:7;45773:4;45793:20;45799:13;45793:5;:20::i;:::-;45792:21;;45833:13;45828:19;;45709:27;:149::i;:::-;45939:63;45958:7;45967:4;45981;45988:13;45939:18;:63::i;:::-;46076:69;;;-1:-1:-1;;;46076:69:0;;46116:10;46076:69;;;;;;;;;;;;-1:-1:-1;;;;;46076:39:0;;;;;:69;;;;;-1:-1:-1;;46076:69:0;;;;;;;-1:-1:-1;46076:39:0;:69;;;2:2:-1;;;;27:1;24;17:12;2:2;46076:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46076:69:0;;;;44878:1275;;;;;;;;;;:::o;25848:172::-;25977:7;-1:-1:-1;;;;;25965:29:0;;25995:7;26004;25965:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25965:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25965:47:0;;;;25848:172;;;:::o;38953:666::-;39316:230;39363:7;39383:12;39408:14;39435:8;39456:4;39473:16;39502:8;39523:12;39316:34;:230::i;:::-;39557:54;39569:7;39578:4;39584:17;39603:7;39557:11;:54::i;:::-;38953:666;;;;;;;;;;:::o;21600:961::-;21803:13;21837;-1:-1:-1;;;;;21819:40:0;;21860:3;21819:45;;;;;;;;;;;;;-1:-1:-1;;;;;21819:45:0;-1:-1:-1;;;;;21819:45:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21819:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21819:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21819:45:0;;-1:-1:-1;;;;;;21970:19:0;;;;:54;;;22021:3;-1:-1:-1;;;;;21993:31:0;22003:5;-1:-1:-1;;;;;21993:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21993:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21993:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21993:24:0;-1:-1:-1;;;;;21993:31:0;;;21970:54;21966:490;;;22103:16;;22292:10;;22284:40;;;;;-1:-1:-1;;;22284:40:0;;;;;;;;;;;;-1:-1:-1;;;22284:40:0;;;;;;;;;;;;;;;22419:13;-1:-1:-1;;;;;22401:38:0;;22440:3;22401:43;;;;;;;;;;;;;-1:-1:-1;;;;;22401:43:0;-1:-1:-1;;;;;22401:43:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22401:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22401:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22401:43:0;;-1:-1:-1;;21966:490:0;22510:43;22532:7;22541:4;22547:5;22510:21;:43::i;37471:1474::-;37761:19;37795:7;-1:-1:-1;;;;;37783:26:0;;37810:4;37783:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37783:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37783:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37783:32:0;37847:33;;;-1:-1:-1;;;37847:33:0;;;;37783:32;;-1:-1:-1;37826:18:0;;-1:-1:-1;;;;;37847:31:0;;;;;:33;;;;;37783:32;;37847:33;;;;;;;:31;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;37847:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37847:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37847:33:0;37916:42;;;-1:-1:-1;;;37916:42:0;;;;;;;;;;37847:33;;-1:-1:-1;37891:22:0;;-1:-1:-1;;;;;37916:36:0;;;;;:42;;;;;37847:33;;37916:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;37916:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37916:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37916:42:0;;-1:-1:-1;38049:85:0;38074:14;38090:11;38103:16;38121:12;38049:24;:85::i;:::-;38209:185;38237:7;38246:4;38252:52;38258:45;38270:14;38286:16;38258:11;:45::i;:::-;38252:5;:52::i;:::-;38306:87;38329:10;38341:12;38355:11;38368:14;38384:8;38306:22;:87::i;38209:185::-;38493:68;38515:7;38524:4;38538;38545:15;38551:8;38545:5;:15::i;:::-;38493:21;:68::i;:::-;38655:74;;;-1:-1:-1;;;38655:74:0;;38704:4;38655:74;;;;-1:-1:-1;;;;;38655:74:0;;;;;;;;;:40;;;;;;:74;;;;;;;;;;;;;;;:40;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;38655:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38655:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38655:74:0;38651:172;;38766:10;-1:-1:-1;;;;;38751:50:0;;38802:8;38751:60;;;;;;;;;;;;;-1:-1:-1;;;;;38751:60:0;-1:-1:-1;;;;;38751:60:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38751:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38751:60:0;;;;38651:172;38888:49;;;-1:-1:-1;;;38888:49:0;;38916:10;38888:49;;;;;;;;;;;;-1:-1:-1;;;;;38888:27:0;;;;;:49;;;;;-1:-1:-1;;38888:49:0;;;;;;;-1:-1:-1;38888:27:0;:49;;;2:2:-1;;;;27:1;24;17:12;2:2;38888:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38888:49:0;;;;37471:1474;;;;;;;;;;;:::o;23183:165::-;23310:7;-1:-1:-1;;;;;23298:33:0;;23332:3;23337:2;23298:42;;;;;;;;;;;;;-1:-1:-1;;;;;23298:42:0;-1:-1:-1;;;;;23298:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;25452:167:0;25580:7;-1:-1:-1;;;;;25568:32:0;;25601:3;25606:4;25568:43;;;;;;;;;;;;;-1:-1:-1;;;;;25568:43:0;-1:-1:-1;;;;;25568:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;25078:165:0;25205:7;-1:-1:-1;;;;;25193:31:0;;25225:4;25231:3;25193:42;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25193:42:0;-1:-1:-1;;;;;25193:42:0;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;29883:412:0;30119:9;30148:48;30157:7;30166:14;30190:4;30148:8;:48::i;:::-;30141:55;;30207:80;30230:7;30239:12;30253:7;30262:8;30272:4;30278:8;30207:22;:80::i;:::-;29883:412;;;;;;;;:::o;33488:583::-;33640:8;33651:32;33663:14;33679:3;33651:11;:32::i;:::-;33640:43;;33741:58;33769:7;33778:4;33785:10;33791:3;33785:5;:10::i;:::-;33784:11;;33797:1;33741:27;:58::i;:::-;33880:53;33899:7;33908:4;33922;33929:3;33880:18;:53::i;:::-;34007:56;;;-1:-1:-1;;;34007:56:0;;34047:10;34007:56;;;;;;;;;;;;-1:-1:-1;;;;;34007:39:0;;;;;:56;;;;;-1:-1:-1;;34007:56:0;;;;;;;-1:-1:-1;34007:39:0;:56;;;2:2:-1;;;;27:1;24;17:12;2:2;34007:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34007:56:0;;;;33488:583;;;;;:::o;42336:1364::-;42521:18;42554:7;-1:-1:-1;;;;;42542:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42542:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42542:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42542:33:0;42608:32;;;-1:-1:-1;;;42608:32:0;;;;;;;;;;42542:33;;-1:-1:-1;42586:19:0;;-1:-1:-1;;;;;42608:26:0;;;;;:32;;;;;42542:33;;42608:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;42608:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42608:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42608:32:0;42676:42;;;-1:-1:-1;;;42676:42:0;;;;;;;;;;42608:32;;-1:-1:-1;42651:22:0;;-1:-1:-1;;;;;42676:36:0;;;;;:42;;;;;42608:32;;42676:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;42676:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42676:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42676:42:0;42754:61;;;-1:-1:-1;;;42754:61:0;;;;;;;;-1:-1:-1;;;;;42754:61:0;;;;;;;;;42676:42;;-1:-1:-1;42732:18:0;;42754:32;;;;;;:61;;;;;;;;;;;:32;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;42754:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42754:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42754:61:0;;;;-1:-1:-1;42878:108:0;42892:8;42902:11;42915:70;42932:10;42902:11;;42970:14;42915:16;:70::i;42878:108::-;43067:149;43109:7;43131:4;43151:20;43157:13;43151:5;:20::i;:::-;43150:21;;43191:13;43186:19;;43067:27;:149::i;:::-;43297:63;43316:7;43325:4;43339;43346:13;43297:18;:63::i;:::-;43429:62;;;-1:-1:-1;;;43429:62:0;;43470:4;43429:62;;;;;;;;;;;;-1:-1:-1;;;;;43429:32:0;;;;;:62;;;;;-1:-1:-1;;43429:62:0;;;;;;;-1:-1:-1;43429:32:0;:62;;;2:2:-1;;;;27:1;24;17:12;2:2;43429:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43429:62:0;;;;43554:7;-1:-1:-1;;;;;43535:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43535:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43535:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43535:40:0;:64;;;-1:-1:-1;;;43535:64:0;;;;;;;;;;-1:-1:-1;;;;;43535:49:0;;;;;;:64;;;;;-1:-1:-1;;43535:64:0;;;;;;;;-1:-1:-1;43535:49:0;:64;;;2:2:-1;;;;27:1;24;17:12;2:2;43535:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;43658:34:0;;:10;;-1:-1:-1;43658:34:0;;;;;-1:-1:-1;43678:13:0;;43658:34;;;;43678:13;43658:10;:34;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;32388:716:0;32648:74;32673:14;32697:4;32704:3;32709:12;32648:24;:74::i;:::-;32805:7;-1:-1:-1;;;;;32793:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32793:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32793:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32793:33:0;32870:42;;;-1:-1:-1;;;32870:42:0;;;;;;;;;;-1:-1:-1;;;;;32778:77:0;;;;;;32870:36;;;;;;:42;;;;;32793:33;;32870:42;;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;32870:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32870:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32870:42:0;32927:32;;;-1:-1:-1;;;32927:32:0;;;;;;;;;;-1:-1:-1;;;;;32927:26:0;;;;;:32;;;;;32870:42;;32927:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;32927:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32927:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32927:32:0;32982:4;;33030:39;33036:32;33048:14;33064:3;33036:11;:32::i;33030:39::-;32778:318;;;-1:-1:-1;;;;;;32778:318:0;;;;;;;;;;;;;;-1:-1:-1;;;;;32778:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33084:1;32778:318;;;;;;;;;;;;;;;;;;33084:1;32778:318;;;;2:2:-1;;;;27:1;24;17:12;34531:377:0;34779:56;34792:7;34801:12;34815:8;34825:4;34831:3;34779:12;:56::i;:::-;34846:54;34858:7;34867:4;34873:17;34892:7;34846:11;:54::i;26602:681::-;26781:58;26809:7;26818:4;26825:10;26831:3;26825:5;:10::i;23612:203::-;23752:55;;;-1:-1:-1;;;23752:55:0;;;;;;;;-1:-1:-1;;;;;23752:55:0;;;;;;;;;;;;;;;:39;;;;;;:55;;;;;-1:-1:-1;;23752:55:0;;;;;;;;-1:-1:-1;23752:39:0;:55;;;2:2:-1;;;;27:1;24;17:12;33112:368:0;33367:5;-1:-1:-1;;;;;33328:44:0;33340:7;-1:-1:-1;;;;;33328:29:0;;33358:4;33328:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33328:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33328:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33328:35:0;-1:-1:-1;;;;;33328:44:0;;33320:72;;;;;-1:-1:-1;;;33320:72:0;;;;;;;;;;;;-1:-1:-1;;;33320:72:0;;;;;;;;;;;;;;;33403:69;33423:7;33432:14;33448:4;33454:3;33459:12;33403:19;:69::i;:::-;33112:368;;;;;;:::o;36631:276::-;36826:5;-1:-1:-1;;;;;36787:44:0;36799:7;-1:-1:-1;;;;;36787:29:0;;36817:4;36787:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36787:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36787:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36787:35:0;-1:-1:-1;;;;;36787:44:0;;36779:72;;;;;-1:-1:-1;;;36779:72:0;;;;;;;;;;;;-1:-1:-1;;;36779:72:0;;;;;;;;;;;;;;;36862:37;36875:7;36884:8;36894:4;36862:12;:37::i;19995:187::-;20134:10;-1:-1:-1;;;;;20106:63:0;;20170:3;20106:68;;;;;;;;;;;;;-1:-1:-1;;;;;20106:68:0;-1:-1:-1;;;;;20106:68:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20106:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;22792:185:0;22924:45;;;-1:-1:-1;;;22924:45:0;;;;;;;;-1:-1:-1;;;;;22924:45:0;;;;;;;;;;;;;;;:30;;;;;;:45;;;;;-1:-1:-1;;22924:45:0;;;;;;;;-1:-1:-1;22924:30:0;:45;;;2:2:-1;;;;27:1;24;17:12;30626:394:0;30834:85;30855:7;30864;30873:8;30883:4;30889:13;30904:8;30914:4;30834:20;:85::i;:::-;30978:34;;:10;;:34;;;;;30998:13;;30978:34;;;;30998:13;30978:10;:34;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19095:119:0;19172:34;19185:3;19190:4;19196:9;19172:12;:34::i;:::-;19095:119;;:::o;21134:185::-;21270:7;-1:-1:-1;;;;;21258:42:0;;21301:4;21307:3;21258:53;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21258:53:0;-1:-1:-1;;;;;21258:53:0;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;36915:548:0;37222:9;37251:48;37260:7;37269:14;37293:4;37251:8;:48::i;:::-;37244:55;;37310:80;37333:7;37342:12;37356:7;37365:8;37375:4;37381:8;37310:22;:80::i;:::-;37401:54;37413:7;37422:4;37428:17;37447:7;37401:11;:54::i;:::-;36915:548;;;;;;;;;;:::o;28329:247::-;28499:69;28513:7;28522:12;28536:8;28546:4;28552:3;28557:10;28499:13;:69::i;31932:168::-;32045:47;;;-1:-1:-1;;;32045:47:0;;32086:4;32045:47;;;;;;32015:11;;-1:-1:-1;;;;;32045:32:0;;;;;:47;;;;;;;;;;;;;;;32015:11;32045:32;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;32045:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32045:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32045:47:0;;31932:168;-1:-1:-1;;31932:168:0:o;18806:134::-;18902:10;-1:-1:-1;;;;;18887:35:0;;18923:3;18928;18887:45;;;;;;;;;;;;;-1:-1:-1;;;;;18887:45:0;-1:-1:-1;;;;;18887:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;20343:181:0;20479:10;-1:-1:-1;;;;;20451:60:0;;20512:3;20451:65;;;;;;;;;;;;;-1:-1:-1;;;;;20451:65:0;-1:-1:-1;;;;;20451:65:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;19415:420:0;19551:3;-1:-1:-1;;;;;19532:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19532:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19532:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19532:36:0;:60;;;-1:-1:-1;;;19532:60:0;;;;-1:-1:-1;;;;;19532:44:0;;;;;;19584:5;;19532:60;;;;;;;;;;;;;;19584:5;19532:44;:60;;;2:2:-1;;;;27:1;24;17:12;2:2;19532:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19532:60:0;;;;;19675:3;-1:-1:-1;;;;;19656:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19656:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19656:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19656:36:0;:65;;;-1:-1:-1;;;19656:65:0;;-1:-1:-1;;;;;19656:65:0;;;;;;;;;;;;;;;:44;;;;;;;:65;;;;;-1:-1:-1;;19656:65:0;;;;;;;-1:-1:-1;19656:44:0;:65;;;2:2:-1;;;;27:1;24;17:12;2:2;19656:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19656:65:0;;;;19805:3;-1:-1:-1;;;;;19786:28:0;;19815:4;19821:5;19786:41;;;;;;;;;;;;;-1:-1:-1;;;;;19786:41:0;-1:-1:-1;;;;;19786:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;41675:653:0;42006:11;42019:9;42055:200;42094:7;42114:12;42139:7;42159:8;42180:14;42207:16;42236:8;42055:26;:200::i;:::-;42041:214;;-1:-1:-1;42041:214:0;-1:-1:-1;42266:54:0;42278:7;42041:214;42293:17;42312:7;42266:11;:54::i;:::-;41675:653;;;;;;;;;;;;:::o;31696:228::-;31850:66;;;-1:-1:-1;;;31850:66:0;;;;;;;;-1:-1:-1;;;;;31850:66:0;;;;;;;;;;;;;;;;:32;;;;;;:66;;;;;-1:-1:-1;;31850:66:0;;;;;;;;-1:-1:-1;31850:32:0;:66;;;2:2:-1;;;;27:1;24;17:12;26203:173:0;26325:43;26334:7;26343;26352:4;26358:9;26325:8;:43::i;39627:532::-;39932:9;39961:48;39970:7;39979:14;40003:4;39961:8;:48::i;:::-;39954:55;;40020:131;40055:7;40064:12;40078:14;40094:8;40104:4;40110:16;40128:8;40138:12;40020:34;:131::i;32108:272::-;32305:5;-1:-1:-1;;;;;32266:44:0;32278:7;-1:-1:-1;;;;;32266:29:0;;32296:4;32266:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32266:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32266:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32266:35:0;-1:-1:-1;;;;;32266:44:0;;32258:72;;;;;-1:-1:-1;;;32258:72:0;;;;;;;;;;;;-1:-1:-1;;;32258:72:0;;;;;;;;;;;;;;;32341:31;32349:7;32358;32367:4;32341:7;:31::i;24579:252::-;24753:7;-1:-1:-1;;;;;24741:48:0;;24790:4;24796:15;24813:9;24741:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;35218:1405:0;35338:18;35371:7;-1:-1:-1;;;;;35359:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35359:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35359:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35359:33:0;35425:32;;;-1:-1:-1;;;35425:32:0;;;;;;;;;;35359:33;;-1:-1:-1;35403:19:0;;-1:-1:-1;;;;;35425:26:0;;;;;:32;;;;;35359:33;;35425:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;35425:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35425:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35425:32:0;35493:42;;;-1:-1:-1;;;35493:42:0;;;;;;;;;;35425:32;;-1:-1:-1;35468:22:0;;-1:-1:-1;;;;;35493:36:0;;;;;:42;;;;;35425:32;;35493:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;35493:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35493:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35493:42:0;35571:61;;;-1:-1:-1;;;35571:61:0;;;;;;;;-1:-1:-1;;;;;35571:61:0;;;;;;;;;35493:42;;-1:-1:-1;35549:18:0;;35571:32;;;;;;:61;;;;;;;;;;;:32;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;35571:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35571:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35571:61:0;;;;;;35659:35;;-1:-1:-1;;;35659:35:0;;;;;;;;;;35571:61;;-1:-1:-1;35645:11:0;;-1:-1:-1;;;;;35659:29:0;;;;;:35;;;;;35571:61;35659:35;;;;;;:29;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;35659:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35659:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35659:35:0;;-1:-1:-1;;;;;;35709:20:0;;35724:4;35709:20;;:83;;-1:-1:-1;35733:54:0;;;-1:-1:-1;;;35733:54:0;;-1:-1:-1;;;;;35733:54:0;;;;;;;;;;;;;35781:4;35733:54;;;;;;:28;;;;;;:54;;;;;;;;;;;;;;;:28;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;35733:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35733:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35733:54:0;35791:1;35733:59;35709:83;35705:911;;;35863:108;35877:8;35887:11;35900:70;35917:10;35929:11;35942;35955:14;35900:16;:70::i;35863:108::-;36028:66;36056:7;36065:4;36071:1;36079:13;36074:19;;36028:27;:66::i;:::-;35705:911;;;36181:112;36195:8;36213:4;36220:72;36237:10;36257:4;36264:11;36277:14;36220:16;:72::i;36181:112::-;36350:254;;;-1:-1:-1;;;36350:254:0;;;;;;;;-1:-1:-1;;;;;36350:254:0;;;;;;;36494:4;36350:254;;;;;;;;;;36550:1;36350:254;;;;;;36570:19;;;36350:254;;;;;;:54;;;;;;:254;;;;;;;;;;;36550:1;36350:54;:254;;;2:2:-1;;;;27:1;24;17:12;29245:355:0;29464:43;29473:7;29482;29491:4;29497:9;29464:8;:43::i;:::-;29518:74;29532:7;29541:12;29555:8;29565:4;29571:8;29581:10;29518:13;:74::i;8547:647::-;8623:11;8883:13;8918:14;-1:-1:-1;;;;;8899:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8899:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8899:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8899:45:0;8961:3;;-1:-1:-1;8899:45:0;-1:-1:-1;8990:2:0;8979:13;;8975:212;;;9013:79;9038:3;9070:8;9065:2;:13;9058:2;:21;9013:8;:79::i;:::-;9007:85;;8975:212;;;9125:2;9114:8;:13;9110:77;;;9172:2;9161:8;:13;9154:2;:21;9148:3;:27;;;;;;9142:33;;9110:77;8547:647;;;;;:::o;8222:124::-;8294:1;8268:5;8315:6;;;8307:31;;;;;-1:-1:-1;;;8307:31:0;;;;;;;;;;;;-1:-1:-1;;;8307:31:0;;;;;;;;;;;;;;;8222:124;;;:::o;10889:862::-;11053:13;11131:9;11162:10;-1:-1:-1;;;;;11147:42:0;;11190:14;11147:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11147:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11147:58:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;11147:58:0;;;;-1:-1:-1;11224:8:0;11216:44;;;;;-1:-1:-1;;;11216:44:0;;;;;;;;;;;;-1:-1:-1;;;11216:44:0;;;;;;;;;;;;;;;11354:54;;;-1:-1:-1;;;11354:54:0;;;;;;;;-1:-1:-1;;;;;11354:54:0;;;;;;;;;11332:18;;11354:32;;;;;;:54;;;;;;;;;;;;:32;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;11354:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11354:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11354:54:0;;;;-1:-1:-1;11510:18:0;11523:4;11516;11523;11516:11;;;;;11510:5;:18::i;:::-;11498:30;;11691:13;11677:9;11672:32;;:71;;11723:20;11729:13;11723:5;:20::i;:::-;11721:22;;11672:71;;;11709:9;11707:11;;11672:71;11660:83;10889:862;-1:-1:-1;;;;;;;10889:862:0:o;7278:291::-;7432:3;-1:-1:-1;;;;;7419:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;15336:1549:0;15509:18;15542:7;-1:-1:-1;;;;;15530:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15530:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15530:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15530:33:0;15596:32;;;-1:-1:-1;;;15596:32:0;;;;;;;;;;15530:33;;-1:-1:-1;15574:19:0;;-1:-1:-1;;;;;15596:26:0;;;;;:32;;;;;15530:33;;15596:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;15596:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15596:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15596:32:0;15664:42;;;-1:-1:-1;;;15664:42:0;;;;;;;;;;15596:32;;-1:-1:-1;15639:22:0;;-1:-1:-1;;;;;15664:36:0;;;;;:42;;;;;15596:32;;15664:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;15664:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15664:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15664:42:0;15733:35;;;-1:-1:-1;;;15733:35:0;;;;;;;;;;15664:42;;-1:-1:-1;15719:11:0;;-1:-1:-1;;;;;15733:29:0;;;;;:35;;;;;15664:42;;15733:35;;;;;;;:29;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;15733:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15733:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15733:35:0;;-1:-1:-1;;;;;;15783:20:0;;15798:4;15783:20;;:83;;-1:-1:-1;15807:54:0;;;-1:-1:-1;;;15807:54:0;;-1:-1:-1;;;;;15807:54:0;;;;;;;;;;;;;15855:4;15807:54;;;;;;:28;;;;;;:54;;;;;;;;;;;;;;;:28;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;15807:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15807:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15807:54:0;15865:1;15807:59;15783:83;15779:1099;;;15941:18;15937:127;;;15961:41;15975:8;15985:11;15998:3;15961:13;:41::i;:::-;15937:127;;;16022:42;16037:8;16047:11;16060:3;16022:14;:42::i;:::-;16124:160;16152:7;16161:4;16167:1;16170:113;16190:10;16217;-1:-1:-1;;;;;16202:38:0;;16241:11;16202:51;;;;;;;;;;;;;-1:-1:-1;;;;;16202:51:0;-1:-1:-1;;;;;16202:51:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16202:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16202:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16202:51:0;16255:11;16268:14;16170:19;:113::i;16124:160::-;15779:1099;;;16376:18;16372:131;;;16396:43;16410:8;16428:4;16435:3;16396:13;:43::i;:::-;16372:131;;;16459:44;16474:8;16492:4;16499:3;16459:14;:44::i;:::-;16575:10;-1:-1:-1;;;;;16560:54:0;;16633:14;16666:11;16704:4;16736;16760:1;16780:71;16800:10;-1:-1:-1;;;16812:3:0;:9;16823:11;16836:14;16780:19;:71::i;:::-;16560:306;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16560:306:0;-1:-1:-1;;;;;16560:306:0;;;;;;-1:-1:-1;;;;;16560:306:0;-1:-1:-1;;;;;16560:306:0;;;;;;-1:-1:-1;;;;;16560:306:0;-1:-1:-1;;;;;16560:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16560:306:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16560:306:0;;;;15336:1549;;;;;;;;;:::o;12009:824::-;12172:8;12245:9;12276:10;-1:-1:-1;;;;;12261:42:0;;12304:14;12261:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12261:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12261:58:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;12261:58:0;;;;12411:54;;-1:-1:-1;;;12411:54:0;;;;;;;;-1:-1:-1;;;;;12411:54:0;;;;;;;;;12261:58;;-1:-1:-1;12389:18:0;;12411:32;;;;;;:54;;;;;;;;;;;:32;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;12411:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12411:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12411:54:0;;;;;;12536:43;;-1:-1:-1;;;12536:43:0;;-1:-1:-1;;;;;12536:43:0;;;;;;;;;12411:54;;-1:-1:-1;12524:9:0;;12536:38;;;;;;:43;;;;;12411:54;;12536:43;;;;;;:38;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;12536:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12536:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12536:43:0;;-1:-1:-1;12592:8:0;12603:45;12612:29;12621:13;12636:4;12612:8;:29::i;:::-;12643:4;12603:8;:45::i;:::-;12592:56;-1:-1:-1;;;;12592:56:0;12665:9;12659:15;;12806:3;12785:18;12794:3;-1:-1:-1;;;12785:8:0;:18::i;:::-;:24;:40;;12822:3;12785:40;;;12812:3;12818:1;12812:7;12785:40;12779:46;12009:824;-1:-1:-1;;;;;;;;;12009:824:0:o;9478:1159::-;9677:13;9742:9;9771:12;-1:-1:-1;;;;;9754:40:0;;9795:14;9754:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9754:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9754:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9754:56:0;;-1:-1:-1;9829:8:0;9821:44;;;;;-1:-1:-1;;;9821:44:0;;;;;;;;;;;;-1:-1:-1;;;9821:44:0;;;;;;;;;;;;;;;9941:9;9968:10;-1:-1:-1;;;;;9953:38:0;;9992:11;9953:51;;;;;;;;;;;;;-1:-1:-1;;;;;9953:51:0;-1:-1:-1;;;;;9953:51:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9953:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9953:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9953:51:0;;-1:-1:-1;10139:18:0;10148:3;-1:-1:-1;;;10139:8:0;:18::i;:::-;10132:4;:25;10128:502;;;10332:48;10375:4;10338:34;10347:18;10356:3;-1:-1:-1;;;10347:8:0;:18::i;:::-;10367:4;10338:8;:34::i;:::-;:41;;;;10332:48;10320:60;;10572:18;10581:3;-1:-1:-1;;;10572:8:0;:18::i;:::-;10538:31;10552:9;10564:4;10538:8;:31::i;:::-;:52;:80;;10609:9;10538:80;;;10593:9;10605:1;10593:13;10538:80;10526:92;;10128:502;9478:1159;;;;;;;;;:::o;8433:106::-;8481:8;8508:23;8517:3;-1:-1:-1;;;8508:8:0;:23::i;:::-;8502:29;8433:106;-1:-1:-1;;8433:106:0:o;17294:1280::-;17537:19;17571:7;-1:-1:-1;;;;;17559:26:0;;17586:4;17559:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17559:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17559:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17559:32:0;;-1:-1:-1;17652:133:0;;;;17676:46;17690:8;17700:11;17713:8;17676:13;:46::i;:::-;17652:133;;;17738:47;17753:8;17763:11;17776:8;17738:14;:47::i;:::-;17866:317;17908:7;17930:4;17950:20;17956:13;17950:5;:20::i;:::-;17949:21;;17985:187;18017:7;-1:-1:-1;;;;;18005:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18005:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18005:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;18005:33:0;;;;;;;;;;;;;;;;18067:7;-1:-1:-1;;;;;18055:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18055:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18055:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18055:33:0;18040:74;;;-1:-1:-1;;;18040:74:0;;-1:-1:-1;;;;;18040:74:0;;;;;;;;;:61;;;;;;;:74;;;;;18055:33;;18040:74;;;;;;;:61;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;18040:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18040:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;18040:74:0;;;;;;;;;;;;;;;;18116:11;18141:7;-1:-1:-1;;;;;18129:36:0;;18166:4;18129:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;17866:317:0;18264:63;18283:7;18292:4;18306;18313:13;18264:18;:63::i;:::-;18396:62;;;-1:-1:-1;;;18396:62:0;;18437:4;18396:62;;;;;;;;;;;;-1:-1:-1;;;;;18396:32:0;;;;;:62;;;;;-1:-1:-1;;18396:62:0;;;;;;;-1:-1:-1;18396:32:0;:62;;;2:2:-1;;;;27:1;24;17:12;2:2;18396:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18396:62:0;;;;18521:7;-1:-1:-1;;;;;18502:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18502:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18502:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18502:40:0;:64;;;-1:-1:-1;;;18502:64:0;;;;;;;;;;-1:-1:-1;;;;;18502:49:0;;;;;;:64;;;;;-1:-1:-1;;18502:64:0;;;;;;;;-1:-1:-1;18502:49:0;:64;;;2:2:-1;;;;27:1;24;17:12;13169:1027:0;13302:19;13336:7;-1:-1:-1;;;;;13324:26:0;;13351:4;13324:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13324:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13324:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13324:32:0;13388:33;;;-1:-1:-1;;;13388:33:0;;;;13324:32;;-1:-1:-1;13367:18:0;;-1:-1:-1;;;;;13388:31:0;;;;;:33;;;;;13324:32;;13388:33;;;;;;;:31;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;13388:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13388:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13388:33:0;13457:42;;;-1:-1:-1;;;13457:42:0;;;;;;;;;;13388:33;;-1:-1:-1;13432:22:0;;-1:-1:-1;;;;;13457:36:0;;;;;:42;;;;;13388:33;;13457:42;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;13457:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13457:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13457:42:0;;-1:-1:-1;13549:129:0;13577:7;13586:4;13592:1;13595:82;13618:10;13630:12;13644:11;13457:42;13673:3;13595:22;:82::i;13549:129::-;13777:63;13799:7;13808:4;13822;13829:10;13835:3;13829:5;:10::i;13777:63::-;13934:74;;;-1:-1:-1;;;13934:74:0;;13983:4;13934:74;;;;-1:-1:-1;;;;;13934:74:0;;;;;;;;;:40;;;;;;:74;;;;;;;;;;;;;;;:40;:74;;;2:2:-1;;;;27:1;24;17:12;2:2;13934:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13934:74:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13934:74:0;13930:172;;14045:10;-1:-1:-1;;;;;14030:50:0;;14081:8;14030:60;;;;;;;;;;;;;-1:-1:-1;;;;;14030:60:0;-1:-1:-1;;;;;14030:60:0;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14030:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14030:60:0;;;;13930:172;14165:8;-1:-1:-1;;;;;14152:27:0;;14180:2;14184:3;14152:36;;;;;;;;;;;;;-1:-1:-1;;;;;14152:36:0;-1:-1:-1;;;;;14152:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;14531:621:0;14755:43;14768:7;14785:4;14792:5;14755:12;:43::i;:::-;14880:7;-1:-1:-1;;;;;14868:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14868:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14868:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14868:33:0;14945:42;;;-1:-1:-1;;;14945:42:0;;;;;;;;;;-1:-1:-1;;;;;14853:77:0;;;;;;14945:36;;;;;;:42;;;;;14868:33;;14945:42;;;;;;;;:36;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;14945:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14945:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14945:42:0;15002:32;;;-1:-1:-1;;;15002:32:0;;;;;;;;;;-1:-1:-1;;;;;15002:26:0;;;;;:32;;;;;14945:42;;15002:32;;;;;;;:26;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;15002:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15002:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15002:32:0;15057:4;;15105:12;15111:5;15105;:12::i;:::-;14853:291;;;-1:-1:-1;;;;;;14853:291:0;;;;;;;;;;;;;;-1:-1:-1;;;;;14853:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15132:1;14853:291;;;;;;;;;;;;;;;;;;15132:1;14853:291;;;;2:2:-1;;;;27:1;24;17:12;7131:139:0;7188:6;7215;;;:30;;-1:-1:-1;;7230:5:0;;;7244:1;7239;7230:5;7239:1;7225:15;;;;;:20;7215:30;7207:55;;;;;-1:-1:-1;;;7207:55:0;;;;;;;;;;;;-1:-1:-1;;;7207:55:0;;;;;;;;;;;;;;8009:125;8098:5;;;8093:16;;;;8085:41;;;;;-1:-1:-1;;;8085:41:0;;;;;;;;;;;;-1:-1:-1;;;8085:41:0;;;;;;;;;;;;;
Swarm Source
ipfs://115ffdafc8a9d024c33bc83c48276d0199768c747b559af6da737ab172c02334
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.