Overview
APE Balance
APE Value
$0.00Multichain Info
Latest 25 from a total of 4,443 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Play | 32784807 | 8 mins ago | IN | 50.07321158 APE | 0.07230925 | ||||
| Play | 32784773 | 9 mins ago | IN | 50.07321158 APE | 0.07230925 | ||||
| Play | 32782216 | 1 hr ago | IN | 10.07321158 APE | 0.07230925 | ||||
| Play | 32781638 | 1 hr ago | IN | 10.07321158 APE | 0.07202332 | ||||
| Play | 32779819 | 2 hrs ago | IN | 15.07321158 APE | 0.07230925 | ||||
| Play | 32779664 | 2 hrs ago | IN | 5.07321158 APE | 0.07230925 | ||||
| Play | 32778428 | 3 hrs ago | IN | 15.07321158 APE | 0.07221987 | ||||
| Play | 32774734 | 4 hrs ago | IN | 10.07321158 APE | 0.07726649 | ||||
| Play | 32774722 | 4 hrs ago | IN | 10.07321158 APE | 0.07220401 | ||||
| Play | 32774019 | 5 hrs ago | IN | 5.07321158 APE | 0.07220401 | ||||
| Play | 32774009 | 5 hrs ago | IN | 5.07321158 APE | 0.07220401 | ||||
| Play | 32774005 | 5 hrs ago | IN | 5.07321158 APE | 0.07218693 | ||||
| Play | 32771443 | 6 hrs ago | IN | 5.07321158 APE | 0.07221987 | ||||
| Play | 32771435 | 6 hrs ago | IN | 5.07321158 APE | 0.07221987 | ||||
| Play | 32771430 | 6 hrs ago | IN | 5.07321158 APE | 0.07221987 | ||||
| Play | 32770129 | 7 hrs ago | IN | 50.07321158 APE | 0.07230925 | ||||
| Play | 32770099 | 7 hrs ago | IN | 10.07321158 APE | 0.07230925 | ||||
| Play | 32770023 | 7 hrs ago | IN | 10.07321158 APE | 0.07230925 | ||||
| Play | 32767751 | 8 hrs ago | IN | 733.47321158 APE | 0.07233365 | ||||
| Play | 32767736 | 8 hrs ago | IN | 1,000.07321158 APE | 0.07233365 | ||||
| Play | 32767720 | 8 hrs ago | IN | 1,000.07321158 APE | 0.07233365 | ||||
| Play | 32767442 | 8 hrs ago | IN | 1,003.17321158 APE | 0.07739491 | ||||
| Play | 32767423 | 8 hrs ago | IN | 1,003.17321158 APE | 0.07233365 | ||||
| Play | 32761980 | 11 hrs ago | IN | 38.87321158 APE | 0.0722517 | ||||
| Play | 32761760 | 11 hrs ago | IN | 38.87321158 APE | 0.07737783 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 32784896 | 4 mins ago | 5.92998 APE | ||||
| 32784894 | 4 mins ago | 0.07321158 APE | ||||
| 32784894 | 4 mins ago | 0.12102 APE | ||||
| 32784894 | 4 mins ago | 6.12421158 APE | ||||
| 32784808 | 8 mins ago | 22.3335 APE | ||||
| 32784808 | 8 mins ago | 26.6665 APE | ||||
| 32784807 | 8 mins ago | 0.07321158 APE | ||||
| 32784807 | 8 mins ago | 1 APE | ||||
| 32784774 | 9 mins ago | 7.056 APE | ||||
| 32784774 | 9 mins ago | 41.944 APE | ||||
| 32784773 | 9 mins ago | 0.07321158 APE | ||||
| 32784773 | 9 mins ago | 1 APE | ||||
| 32782217 | 1 hr ago | 0.9112 APE | ||||
| 32782217 | 1 hr ago | 8.8888 APE | ||||
| 32782216 | 1 hr ago | 0.07321158 APE | ||||
| 32782216 | 1 hr ago | 0.2 APE | ||||
| 32781639 | 1 hr ago | 4.55 APE | ||||
| 32781639 | 1 hr ago | 5.25 APE | ||||
| 32781638 | 1 hr ago | 0.07321158 APE | ||||
| 32781638 | 1 hr ago | 0.2 APE | ||||
| 32779821 | 2 hrs ago | 5.41875 APE | ||||
| 32779821 | 2 hrs ago | 9.28125 APE | ||||
| 32779819 | 2 hrs ago | 0.07321158 APE | ||||
| 32779819 | 2 hrs ago | 0.3 APE | ||||
| 32779665 | 2 hrs ago | 4.9 APE |
Cross-Chain Transactions
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x9ebb4Df2...E7723F3CB The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Source Code (Solidity)
/**
*Submitted for verification at apescan.io on 2025-05-23
*/
//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}
contract ApeOwnable {
// Governance Manager
IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);
modifier onlyOwner() {
require(
msg.sender == manager.owner(),
'Only Owner'
);
_;
}
modifier onlyGame() {
require(
manager.isGame(msg.sender),
'UnAuthorized'
);
_;
}
modifier onlyRNG() {
require(
msg.sender == manager.RNG(),
'Only RNG Contract'
);
_;
}
modifier validatePlayer(address player) {
if (player != msg.sender) {
require(
manager.canPlayForOthers(msg.sender),
'UnAuthorized To Play For Others'
);
}
_;
}
modifier notPaused() {
require(
manager.paused() == false,
'All Games Paused'
);
_;
}
modifier onlyAdmin() {
require(
manager.isAdmin(msg.sender),
'UnAuthorized'
);
_;
}
}
interface IRNG {
function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
function getFee() external view returns (uint256);
}
interface IGovernanceManager {
function RNG() external view returns (address);
function owner() external view returns (address);
function referralManager() external view returns (address);
function feeReceiver() external view returns (address);
function claimManager() external view returns (address);
function house() external view returns (address);
function isGame(address game) external view returns (bool);
function userInfoTracker() external view returns (address);
function canPlayForOthers(address addr) external view returns (bool);
function paused() external view returns (bool);
function isAdmin(address admin) external view returns (bool);
}
interface IHouse {
/**
House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
*/
function houseProfit(uint256 GAME_ID) external payable;
/**
Function Games Call to tell the house that a user has won the bet
*/
function payout(uint256 GAME_ID, address user, uint256 value) external;
/**
Read function to determine the maximum payout allowed by the house at the current time
*/
function maxPayout() external view returns (uint256);
/**
Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
*/
function randomRequested() external;
/**
Resolves a random request from chainlink, allowing house users to withdraw
*/
function randomRequestResolved() external;
}
interface IGame {
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external;
function play(address user, bytes calldata gameData) external payable;
}
interface IUserInfoTracker {
function wagered(address user, uint256 amount, uint256 GAME_ID) external;
}
interface IClaimManager {
function credit(
uint256 GAME_ID,
address user
) external payable;
}
interface IHistoryManager {
function addData(address user, uint256 GAME_ID, uint256 gameId) external;
}
interface IFeeRecipient {
function takeFee(address ref, address player) external payable;
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function symbol() external view returns(string memory);
function name() external view returns(string memory);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Returns the number of decimal places
*/
function decimals() external view returns (uint8);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
Game Master Class, any inheriting game must pass the necessary fields into the constructor
*/
contract GameMasterclass is ApeOwnable, IGame {
// GAME ID
uint256 public immutable GAME_ID;
// History Manager
IHistoryManager public immutable history;
/** Game Is Either Paused Or Unpaused */
bool public paused = false;
/** List of all used game ids */
uint256[] public usedGameIds;
mapping ( uint256 => bool ) internal isUsedGameId;
// request ID => GameID
mapping ( uint64 => uint256 ) private requestToGame;
/// @notice emitted after a random request has been sent out
event RandomnessRequested(uint256 gameId);
/**
Builds The Necessary Components Of Any Game
*/
constructor(
uint256 GAME_ID_,
address history_
) {
// set other variables
GAME_ID = GAME_ID_;
history = IHistoryManager(history_);
}
//////////////////////////////////////
/////// OWNER FUNCTIONS ////////
//////////////////////////////////////
function pause() external onlyOwner {
paused = true;
}
function resume() external onlyOwner {
paused = false;
}
function withdrawETH(address to, uint256 amount) external onlyOwner {
(bool s,) = payable(to).call{value: amount}("");
require(s);
}
function withdrawToken(address token, uint amount) external onlyOwner {
TransferHelper.safeTransfer(token, msg.sender, amount);
}
function _registerBet(address user, uint256 amount) internal {
IUserInfoTracker(manager.userInfoTracker()).wagered(user, amount, GAME_ID);
}
function _processFee(uint256 feeAmount, address ref, address player) internal {
IFeeRecipient(manager.feeReceiver()).takeFee{value: feeAmount}(ref, player);
}
function getVRFFee() public view returns (uint256) {
return IRNG(manager.RNG()).getFee();
}
function fulfillRandomWords(uint64 requestId, uint256[] calldata randomWords) external virtual {}
function play(address player, bytes calldata gameData) external payable override validatePlayer(player) notPaused() {
require(
!paused,
'Paused'
);
// play game
_playGame(player, gameData);
}
function _playGame(address player, bytes calldata gameData) internal virtual {}
function _handlePayout(address player, uint256 totalToPayout, uint256 amountForHouse) internal {
if (totalToPayout > 0) {
// there is a payout, we won something
if (totalToPayout >= amountForHouse) {
// the user has won more than we are giving to the house
// this means we need to send them (to claim manager) amountForHouse directly
// and only request that the house `payout` the difference!
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: amountForHouse}(
GAME_ID,
player
);
// get the difference
uint256 remaining = totalToPayout - amountForHouse;
if (remaining > 0) {
// payout the rest from the house
IHouse(manager.house()).payout(GAME_ID, player, remaining);
}
} else {
// the user has won less than we are giving to the house
// pay them out directly in full, send whatever is left over to the house
// add to user's claim manager the amount for the house
IClaimManager(manager.claimManager()).credit{value: totalToPayout}(
GAME_ID,
player
);
// calculate remaining left for the house
uint256 remaining = amountForHouse - totalToPayout;
// send the remaining to the house
IHouse(manager.house()).houseProfit{value: remaining }(GAME_ID);
}
} else {
// we won nothing, send the house everything
IHouse(manager.house()).houseProfit{value: amountForHouse }(GAME_ID);
}
}
/// @dev logs the gameId in the used list and adds game to player's history
function _registerGameId(address player, uint256 gameId) internal {
// set history data
history.addData(player, GAME_ID, gameId);
// add to list of used game ids
usedGameIds.push(gameId);
isUsedGameId[gameId] = true;
}
function _requestRandom(uint256 gameId, uint8 numWords, bytes32 userRandomWord) internal {
// request random words from RNG contract
uint64 requestId = IRNG(manager.RNG()).requestRandom{value: getVRFFee()}(
userRandomWord, // random user seed
numWords // the number of random results to return
);
// require that the requestId is unused
require(
requestToGame[requestId] == 0,
'RequestId In Use'
);
// map this request ID to the game it belongs to
requestToGame[requestId] = gameId;
// set data in house
IHouse(manager.house()).randomRequested();
// emit event
emit RandomnessRequested(gameId);
}
function _resolveRandom(uint64 requestId) internal {
// resolve request in house
IHouse(manager.house()).randomRequestResolved();
// clear storage
delete requestToGame[requestId];
}
function getGameIdFromRequest(uint64 requestId) internal view returns (uint256) {
return requestToGame[requestId];
}
function getHouse() public view returns (address) {
return manager.house();
}
function isValidGameId(uint256 gameId) public view returns (bool) {
return isUsedGameId[gameId] == false && gameId > 0;
}
function batchCallIsUsedGameId(uint256[] calldata gameIds) external view returns (bool[] memory isUsed) {
uint len = gameIds.length;
isUsed = new bool[](len);
for (uint i = 0; i < len;) {
isUsed[i] = isUsedGameId[gameIds[i]];
unchecked { ++i; }
}
}
function paginateUsedGameIDs(uint256 start, uint256 end) external view returns (uint256[] memory) {
if (end > usedGameIds.length) {
end = usedGameIds.length;
}
uint256[] memory ids = new uint256[](end - start);
for (uint i = start; i < end;) {
ids[i - start] = usedGameIds[i];
unchecked { ++i; }
}
return ids;
}
function numUsedGameIDs() external view returns (uint256) {
return usedGameIds.length;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view virtual returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {}
function batchRawGameInfo(uint256[] calldata gameIds) external view virtual returns (bytes[] memory) {}
}
/**
Slots PvH Game
*/
contract Slots is GameMasterclass {
/** Reel Info */
uint8[] public reel1;
uint8[] public reel2;
uint8[] public reel3;
/** num to coin in reel */
mapping ( uint8 => uint8 ) public numToCoinReel1;
mapping ( uint8 => uint8 ) public numToCoinReel2;
mapping ( uint8 => uint8 ) public numToCoinReel3;
// Num Spins
uint8 public MAX_SPINS = 10;
// Game Struct
struct Game {
/** Player */
address player;
/** Amount Bet */
uint256 betAmount;
/** Total Amount For House */
uint256 amountForHouse;
/** Final Output -- reels */
uint8[] num0;
uint8[] num1;
uint8[] num2;
/** Payouts */
uint256 payout;
/** Whether or not the game has ended and the VRF has called back */
bool hasEnded;
/** Timestamp */
uint256 timestamp;
}
struct GameInfoReturnType {
address player;
uint256 betAmountPerSpin;
uint256 totalBetAmount;
uint8[] num0;
uint8[] num1;
uint8[] num2;
uint256 totalPayout;
bool hasEnded;
uint256 timestamp;
}
// mapping from GameID => Game
mapping ( uint256 => Game ) public games;
/** Platform Fee Taken Out Of Buy In */
uint256 public platformFee = 100;
/** Maps three random numbers to a payout */
mapping ( uint8 => mapping ( uint8 => mapping ( uint8 => uint256 ) ) ) public payout;
/** Payout Denom */
uint256 public constant PAYOUT_DENOM = 10_000; // 0.01x precision (payout of 100 = 1%, 10,000 = 1x, 1,000,000 = 100x)
/** Locks changes to odds */
bool public oddsLocked;
/// @notice emitted after the platform fee has been changed
event SetPlatformFee(uint256 newFee);
/// @notice emitted after a game has been started at a specific table
event GameStarted(address indexed user, uint256 gameId);
/// @notice Emitted after the VRF comes back with the index of the winning player
event GameEnded(
address indexed user,
uint256 gameId,
uint256 buyIn,
uint256 payout
);
/// @notice Emitted if the fulfilRandomWords function needs to return out for any reason
event FulfilRandomFailed(uint256 requestId, uint256 gameId, uint256[] randomWords);
/// @notice Emitted when the reel data is updated, emits the odds associated with the reel data
event OddsLocked();
constructor(
/** Game Configs */
uint8[] memory reel1_,
uint8[] memory reel2_,
uint8[] memory reel3_,
uint256 GAME_ID_,
address _history
) GameMasterclass(GAME_ID_, _history){
// set reels
reel1 = reel1_;
reel2 = reel2_;
reel3 = reel3_;
require(
reel1_.length == reel2_.length &&
reel2_.length == reel3_.length,
'Invalid Reel Length'
);
}
// set spins
function setMaxSpins(uint8 _maxSpins) external onlyOwner {
MAX_SPINS = _maxSpins;
}
function setPlatformFee(uint256 newPlatform) external onlyOwner {
require(
newPlatform <= PAYOUT_DENOM / 5,
'Cannot Exceed 20%'
);
platformFee = newPlatform;
emit SetPlatformFee(newPlatform);
}
function lockOdds() external onlyOwner {
oddsLocked = true;
emit OddsLocked();
}
function setReels(
uint8[] calldata reel1_,
uint8[] calldata reel2_,
uint8[] calldata reel3_
) external onlyOwner {
require(
oddsLocked == false,
'Odds Are Locked'
);
require(
reel1_.length == reel2_.length &&
reel2_.length == reel3_.length,
'Invalid Reel Length'
);
reel1 = reel1_;
reel2 = reel2_;
reel3 = reel3_;
}
function enforceReel1() public onlyOwner {
// set num to coins
uint8 coin1 = 0;
uint8 len = reel1[reel1.length - 1];
for (uint8 i = 0; i < len;) {
numToCoinReel1[i] = coin1;
unchecked { ++i; }
if (i == reel1[coin1]) {
unchecked { ++coin1; }
}
}
}
function enforceReel2() public onlyOwner {
// set num to coins
uint8 coin2 = 0;
uint8 len = reel2[reel2.length - 1];
for (uint8 i = 0; i < len;) {
numToCoinReel2[i] = coin2;
unchecked { ++i; }
if (i == reel2[coin2]) {
unchecked { ++coin2; }
}
}
}
function enforceReel3() public onlyOwner {
// set num to coins
uint8 coin3 = 0;
uint8 len = reel3[reel3.length - 1];
for (uint8 i = 0; i < len;) {
numToCoinReel3[i] = coin3;
unchecked { ++i; }
if (i == reel3[coin3]) {
unchecked { ++coin3; }
}
}
}
function batchSetPayouts(
uint8[] calldata coins0,
uint8[] calldata coins1,
uint8[] calldata coins2,
uint256[] calldata payoutMultiplier
) external onlyOwner {
require(
oddsLocked == false,
'Odds are locked'
);
uint len = coins0.length;
require(
len == coins1.length,
'Invalid Length 0-1'
);
require(
len == coins2.length,
'Invalid Length 0-2'
);
require(
len == payoutMultiplier.length,
'Invalid Length 0-payout'
);
for (uint i = 0; i < len;) {
// set payout
payout[coins0[i]][coins1[i]][coins2[i]] = payoutMultiplier[i];
unchecked { ++i; }
}
}
receive() external payable {}
function _playGame(address player, bytes calldata gameData) internal override {
// determine vrf fee
uint256 vrfFee = getVRFFee();
// decode game data
(
uint256 gameId,
uint8 numSpins,
address ref,
bytes32 userRandomWord
) = abi.decode(gameData, (uint256, uint8, address, bytes32));
// validate inputs
require(
msg.value >= vrfFee,
'ERR: MIN BUY IN'
);
require(
isValidGameId(gameId) == true,
'ERR: INVALID GAME ID'
);
require(
numSpins > 0 && numSpins <= MAX_SPINS,
'ERR: INVALID SPINS'
);
// determine total bet amount
uint256 totalBetAmount = msg.value - vrfFee;
// calculate the bet amount
uint256 betAmountPerSpin = totalBetAmount / numSpins;
// take platform fee out of the buy in
uint256 platformFeeAmount = ( totalBetAmount * platformFee ) / PAYOUT_DENOM;
// send to platform receiver (taking ref into account)
_processFee(platformFeeAmount, ref, player);
// save game data
games[gameId].player = player;
games[gameId].betAmount = betAmountPerSpin;
games[gameId].amountForHouse = totalBetAmount - platformFeeAmount;
games[gameId].num0 = new uint8[](numSpins);
games[gameId].num1 = new uint8[](numSpins);
games[gameId].num2 = new uint8[](numSpins);
games[gameId].timestamp = block.timestamp;
// register game Id
_registerGameId(player, gameId);
// register bet
_registerBet(player, totalBetAmount);
// emit event
emit GameStarted(player, gameId);
// fetch random number
_requestRandom(gameId, numSpins * 3, userRandomWord);
}
/**
Callback to provide us with randomness
*/
function fulfillRandomWords(
uint64 requestId,
uint256[] calldata randomWords
) external override onlyRNG {
// get game ID from requestId
uint256 gameId = getGameIdFromRequest(requestId);
// resolve randomness
_resolveRandom(requestId);
// if faulty ID, remove
if (
gameId == 0 ||
games[gameId].player == address(0) ||
games[gameId].hasEnded == true ||
games[gameId].num0.length == 0 ||
randomWords.length != (games[gameId].num0.length * 3)
) {
emit FulfilRandomFailed(requestId, gameId, randomWords);
return;
}
// set game has ended
games[gameId].hasEnded = true;
// fetch the bet amount per spin
uint256 betAmountPerSpin = games[gameId].betAmount;
// total to pay out for the house and total to send the house
uint256 totalToPayout = 0;
// get total options per reel
uint8 numReel1 = numOptionsReel1();
uint8 numReel2 = numOptionsReel2();
uint8 numReel3 = numOptionsReel3();
// get num spins
uint8 NUM_SPINS = uint8(games[gameId].num0.length);
// loop through spins
for (uint i = 0; i < NUM_SPINS;) {
// fetch index (coin) of reel array
uint8 index1 = numToCoinReel1[uint8(randomWords[i * 3] % numReel1)];
uint8 index2 = numToCoinReel2[uint8(randomWords[(i * 3) + 1] % numReel2)];
uint8 index3 = numToCoinReel3[uint8(randomWords[(i * 3) + 2] % numReel3)];
// save indexes to state
games[gameId].num0[i] = index1;
games[gameId].num1[i] = index2;
games[gameId].num2[i] = index3;
// if payout exists, user won this spin
if (payout[index1][index2][index3] > 0) {
// increment data, add to total payout
unchecked {
totalToPayout += ( ( payout[index1][index2][index3] * betAmountPerSpin ) / PAYOUT_DENOM );
}
}
unchecked { ++i; }
}
// save payout info
games[gameId].payout = totalToPayout;
// handle payouts
_handlePayout(games[gameId].player, totalToPayout, games[gameId].amountForHouse);
// emit game ended event
emit GameEnded(games[gameId].player, gameId, games[gameId].betAmount * NUM_SPINS, totalToPayout);
}
function optionsReel1() external view returns (uint8[] memory) {
return reel1;
}
function optionsReel2() external view returns (uint8[] memory) {
return reel2;
}
function optionsReel3() external view returns (uint8[] memory) {
return reel3;
}
function numOptionsReel1() public view returns (uint8) {
return reel1[reel1.length - 1];
}
function numOptionsReel2() public view returns (uint8) {
return reel2[reel2.length - 1];
}
function numOptionsReel3() public view returns (uint8) {
return reel3[reel3.length - 1];
}
function getPayout(uint8 coin1, uint8 coin2, uint8 coin3) public view returns (uint256) {
return payout[coin1][coin2][coin3];
}
function getGameInfo(uint256 gameId) public view returns (
GameInfoReturnType memory
) {
return GameInfoReturnType({
player: games[gameId].player,
betAmountPerSpin: games[gameId].betAmount,
totalBetAmount: games[gameId].betAmount * games[gameId].num0.length,
num0: games[gameId].num0,
num1: games[gameId].num1,
num2: games[gameId].num2,
totalPayout: games[gameId].payout,
hasEnded: games[gameId].hasEnded,
timestamp: games[gameId].timestamp
});
}
function batchGameInfo(uint256[] calldata gameIds) external view returns (
GameInfoReturnType[] memory
) {
uint len = gameIds.length;
GameInfoReturnType[] memory retTypes = new GameInfoReturnType[](len);
for (uint i = 0; i < len;) {
retTypes[i] = getGameInfo(gameIds[i]);
unchecked { ++i; }
}
return retTypes;
}
function batchRawGameInfo(uint256[] calldata gameIds) external view override returns (bytes[] memory) {
uint len = gameIds.length;
bytes[] memory retTypes = new bytes[](len);
for (uint i = 0; i < len;) {
retTypes[i] = abi.encode(getGameInfo(gameIds[i]));
unchecked { ++i; }
}
return retTypes;
}
function getEssentialGameInfo(uint256[] calldata gameIds) external view override returns (
address[] memory players,
uint256[] memory buyInAmounts,
uint256[] memory totalPayouts,
uint256[] memory timestamps,
bool[] memory hasEndeds
) {
uint len = gameIds.length;
players = new address[](len);
buyInAmounts = new uint256[](len);
totalPayouts = new uint256[](len);
timestamps = new uint256[](len);
hasEndeds = new bool[](len);
for (uint i = 0; i < len;) {
players[i] = games[gameIds[i]].player;
buyInAmounts[i] = games[gameIds[i]].betAmount * games[gameIds[i]].num0.length;
totalPayouts[i] = games[gameIds[i]].payout;
timestamps[i] = games[gameIds[i]].timestamp;
hasEndeds[i] = games[gameIds[i]].hasEnded;
unchecked { ++i; }
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint8[]","name":"reel1_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel2_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel3_","type":"uint8[]"},{"internalType":"uint256","name":"GAME_ID_","type":"uint256"},{"internalType":"address","name":"_history","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"FulfilRandomFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"GameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"GameStarted","type":"event"},{"anonymous":false,"inputs":[],"name":"OddsLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SetPlatformFee","type":"event"},{"inputs":[],"name":"GAME_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SPINS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_DENOM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchCallIsUsedGameId","outputs":[{"internalType":"bool[]","name":"isUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchGameInfo","outputs":[{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmountPerSpin","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8[]","name":"num0","type":"uint8[]"},{"internalType":"uint8[]","name":"num1","type":"uint8[]"},{"internalType":"uint8[]","name":"num2","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Slots.GameInfoReturnType[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"batchRawGameInfo","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"coins0","type":"uint8[]"},{"internalType":"uint8[]","name":"coins1","type":"uint8[]"},{"internalType":"uint8[]","name":"coins2","type":"uint8[]"},{"internalType":"uint256[]","name":"payoutMultiplier","type":"uint256[]"}],"name":"batchSetPayouts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceReel3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"requestId","type":"uint64"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"fulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"games","outputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"amountForHouse","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"gameIds","type":"uint256[]"}],"name":"getEssentialGameInfo","outputs":[{"internalType":"address[]","name":"players","type":"address[]"},{"internalType":"uint256[]","name":"buyInAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"totalPayouts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"bool[]","name":"hasEndeds","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"getGameInfo","outputs":[{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmountPerSpin","type":"uint256"},{"internalType":"uint256","name":"totalBetAmount","type":"uint256"},{"internalType":"uint8[]","name":"num0","type":"uint8[]"},{"internalType":"uint8[]","name":"num1","type":"uint8[]"},{"internalType":"uint8[]","name":"num2","type":"uint8[]"},{"internalType":"uint256","name":"totalPayout","type":"uint256"},{"internalType":"bool","name":"hasEnded","type":"bool"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Slots.GameInfoReturnType","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHouse","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"coin1","type":"uint8"},{"internalType":"uint8","name":"coin2","type":"uint8"},{"internalType":"uint8","name":"coin3","type":"uint8"}],"name":"getPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVRFFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"history","outputs":[{"internalType":"contract IHistoryManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"isValidGameId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockOdds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOptionsReel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"numToCoinReel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numUsedGameIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oddsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel1","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel2","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optionsReel3","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"paginateUsedGameIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"payout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"bytes","name":"gameData","type":"bytes"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reel3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxSpins","type":"uint8"}],"name":"setMaxSpins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatform","type":"uint256"}],"name":"setPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"reel1_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel2_","type":"uint8[]"},{"internalType":"uint8[]","name":"reel3_","type":"uint8[]"}],"name":"setReels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedGameIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x60c06040526000805460ff19908116909155600a8054909116811790556064600c5534801561002d57600080fd5b5060405161492438038061492483398101604081905261004c91610293565b60808290526001600160a01b03811660a0528451610071906004906020880190610106565b508351610085906005906020870190610106565b508251610099906006906020860190610106565b50835185511480156100ac575082518451145b6100fc5760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964205265656c204c656e67746800000000000000000000000000604482015260640160405180910390fd5b5050505050610355565b82805482825590600052602060002090601f0160209004810192821561019c5791602002820160005b8382111561016d57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030261012f565b801561019a5782816101000a81549060ff021916905560010160208160000104928301926001030261016d565b505b506101a89291506101ac565b5090565b5b808211156101a857600081556001016101ad565b634e487b7160e01b600052604160045260246000fd5b805160ff811681146101e857600080fd5b919050565b600082601f8301126101fe57600080fd5b81516001600160401b03811115610217576102176101c1565b604051600582901b90603f8201601f191681016001600160401b0381118282101715610245576102456101c1565b60405291825260208185018101929081018684111561026357600080fd5b6020860192505b838310156102895761027b836101d7565b81526020928301920161026a565b5095945050505050565b600080600080600060a086880312156102ab57600080fd5b85516001600160401b038111156102c157600080fd5b6102cd888289016101ed565b602088015190965090506001600160401b038111156102eb57600080fd5b6102f7888289016101ed565b604088015190955090506001600160401b0381111561031557600080fd5b610321888289016101ed565b60608801516080890151919550935090506001600160a01b038116811461034757600080fd5b809150509295509295909350565b60805160a0516145726103b2600039600081816106e5015261361e01526000818161097201528181612c1701528181612d2201528181612e2201528181612f290152818161301f015281816135f1015261375c01526145726000f3fe6080604052600436106102975760003560e01c806389fc2c0f1161015a578063c271ac1a116100c1578063d7b7ca4a1161007a578063d7b7ca4a146108ec578063d951ec5b14610901578063e4b26ae714610916578063f0034a7e14610936578063fc628ac41461094b578063fdcdb06b1461096057600080fd5b8063c271ac1a146107f9578063c4fd5d6d14610843578063c811ad7114610874578063cc81d05514610887578063d01585d41461089c578063d02e3555146108bc57600080fd5b80639fe870dd116101135780639fe870dd14610765578063a16c47371461077a578063aa44cf171461079a578063aa5a60e5146107af578063b79f2925146107c4578063bd92621b146107e457600080fd5b806389fc2c0f146106715780638a31ae561461069157806391ea41e6146106a657806398daac83146106d35780639e281a98146107075780639f90bd651461072757600080fd5b8063481c6a75116101fe5780636c236d58116101b75780636c236d58146105c0578063749fa03c146105d55780637b8d3879146105f55780638456cb5914610622578063864638a51461063757806387cf2a231461065157600080fd5b8063481c6a751461050157806348e8294a1461052357806351e925591461055057806352233e91146105705780635c975abb14610586578063614be8d4146105a057600080fd5b80632fbb0116116102505780632fbb0116146103f357806330ea95f31461041557806332883e7e1461045757806338b6d2e5146104845780634782f779146104b457806347e1d550146104d457600080fd5b8063046f7da2146102a35780630476f004146102ba57806304e2064f146102e9578063117a5b901461031657806312e8e2c3146103af57806326232a2e146103cf57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610994565b005b3480156102c657600080fd5b50600e546102d49060ff1681565b60405190151581526020015b60405180910390f35b3480156102f557600080fd5b506102fe610a49565b6040516001600160a01b0390911681526020016102e0565b34801561032257600080fd5b50610376610331366004613b9c565b600b602052600090815260409020805460018201546002830154600684015460078501546008909501546001600160a01b039094169492939192909160ff9091169086565b604080516001600160a01b03909716875260208701959095529385019290925260608401521515608083015260a082015260c0016102e0565b3480156103bb57600080fd5b506102b86103ca366004613b9c565b610ac0565b3480156103db57600080fd5b506103e5600c5481565b6040519081526020016102e0565b3480156103ff57600080fd5b50610408610beb565b6040516102e09190613bb5565b34801561042157600080fd5b50610445610430366004613c11565b60086020526000908152604090205460ff1681565b60405160ff90911681526020016102e0565b34801561046357600080fd5b50610477610472366004613c33565b610c61565b6040516102e09190613c91565b34801561049057600080fd5b5061044561049f366004613c11565b60096020526000908152604090205460ff1681565b3480156104c057600080fd5b506102b86104cf366004613cbc565b610d25565b3480156104e057600080fd5b506104f46104ef366004613b9c565b610e2a565b6040516102e09190613dc5565b34801561050d57600080fd5b506102fe60008051602061451d83398151915281565b34801561052f57600080fd5b5061054361053e366004613e23565b611054565b6040516102e09190613e64565b34801561055c57600080fd5b506102d461056b366004613b9c565b611107565b34801561057c57600080fd5b506103e561271081565b34801561059257600080fd5b506000546102d49060ff1681565b3480156105ac57600080fd5b506104456105bb366004613b9c565b611127565b3480156105cc57600080fd5b5061040861115b565b3480156105e157600080fd5b506102b86105f0366004613ede565b6111b5565b34801561060157600080fd5b50610615610610366004613e23565b6116f3565b6040516102e09190613f66565b34801561062e57600080fd5b506102b86117b0565b34801561064357600080fd5b50600a546104459060ff1681565b34801561065d57600080fd5b506102b861066c366004613f79565b61185f565b34801561067d57600080fd5b506103e561068c366004613b9c565b611b0d565b34801561069d57600080fd5b506102b8611b2e565b3480156106b257600080fd5b506106c66106c1366004613e23565b611c95565b6040516102e09190614070565b3480156106df57600080fd5b506102fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561071357600080fd5b506102b8610722366004613cbc565b611d4c565b34801561073357600080fd5b506103e56107423660046140e4565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561077157600080fd5b506102b8611dfb565b34801561078657600080fd5b50610445610795366004613b9c565b611f62565b3480156107a657600080fd5b50610445611f72565b3480156107bb57600080fd5b506102b8611fbb565b3480156107d057600080fd5b506104456107df366004613b9c565b612122565b3480156107f057600080fd5b50610445612132565b34801561080557600080fd5b506103e56108143660046140e4565b60ff9283166000908152600d602090815260408083209486168352938152838220929094168152925290205490565b34801561084f57600080fd5b5061086361085e366004613e23565b612146565b6040516102e0959493929190614127565b6102b86108823660046141c7565b6124b5565b34801561089357600080fd5b506001546103e5565b3480156108a857600080fd5b506102b86108b7366004613c11565b61267c565b3480156108c857600080fd5b506104456108d7366004613c11565b60076020526000908152604090205460ff1681565b3480156108f857600080fd5b50610445612732565b34801561090d57600080fd5b506102b8612746565b34801561092257600080fd5b506102b861093136600461424c565b61281e565b34801561094257600080fd5b506103e5612982565b34801561095757600080fd5b50610408612a55565b34801561096c57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906142ef565b6001600160a01b0316336001600160a01b031614610a3d5760405162461bcd60e51b8152600401610a349061430c565b60405180910390fd5b6000805460ff19169055565b600060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906142ef565b905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3091906142ef565b6001600160a01b0316336001600160a01b031614610b605760405162461bcd60e51b8152600401610a349061430c565b610b6d600561271061435c565b811115610bb05760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b6044820152606401610a34565b600c8190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5757602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c285790505b5050505050905090565b600154606090821115610c745760015491505b6000610c808484614370565b6001600160401b03811115610c9757610c97614383565b604051908082528060200260200182016040528015610cc0578160200160208202803683370190505b509050835b83811015610d1b5760018181548110610ce057610ce0614399565b9060005260206000200154828683610cf89190614370565b81518110610d0857610d08614399565b6020908102919091010152600101610cc5565b5090505b92915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9591906142ef565b6001600160a01b0316336001600160a01b031614610dc55760405162461bcd60e51b8152600401610a349061430c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b5050905080610e2557600080fd5b505050565b610e32613a20565b60408051610120810182526000848152600b602081815284832080546001600160a01b03168552600181015482860181905293889052919052600301549192830191610e7d916143af565b81526000848152600b60209081526040918290206003018054835181840281018401909452808452938201939091830182828015610ef857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610ec95790505b50505050508152602001600b6000858152602001908152602001600020600401805480602002602001604051908101604052809291908181526020018280548015610f8057602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f515790505b50505050508152602001600b600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561100857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610fd95790505b50505091835250506000848152600b60208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b0381111561107157611071614383565b6040519080825280602002602001820160405280156110aa57816020015b611097613a20565b81526020019060019003908161108f5790505b50905060005b828110156110fe576110d98686838181106110cd576110cd614399565b90506020020135610e2a565b8282815181106110eb576110eb614399565b60209081029190910101526001016110b0565b50949350505050565b60008181526002602052604081205460ff16158015610d1f575050151590565b6006818154811061113757600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60606005805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906142ef565b6001600160a01b0316336001600160a01b0316146112795760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b6044820152606401610a34565b6001600160401b03831660009081526003602052604090205461129b84612aaf565b8015806112bd57506000818152600b60205260409020546001600160a01b0316155b806112de57506000818152600b602052604090206007015460ff1615156001145b806112f857506000818152600b6020526040902060030154155b8061131f57506000818152600b6020526040902060039081015461131b916143af565b8214155b15611367577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58482858560405161135994939291906143c6565b60405180910390a150505050565b6000818152600b6020526040812060078101805460ff1916600190811790915501549080611393611f72565b9050600061139f612132565b905060006113ab612732565b6000878152600b60205260408120600301549192505b8160ff1681101561164157600060078160ff88168d8d6113e28760036143af565b8181106113f1576113f1614399565b905060200201356114029190614418565b60ff908116825260208201929092526040016000908120548216925090600890829088168e8e6114338860036143af565b61143e90600161442c565b81811061144d5761144d614399565b9050602002013561145e9190614418565b60ff908116825260208201929092526040016000908120548216925090600990829088168f8f61148f8960036143af565b61149a90600261442c565b8181106114a9576114a9614399565b905060200201356114ba9190614418565b60ff1660ff16815260200190815260200160002060009054906101000a900460ff16905082600b60008d8152602001908152602001600020600301858154811061150657611506614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600b60008d8152602001908152602001600020600401858154811061155857611558614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555080600b60008d815260200190815260200160002060050185815481106115aa576115aa614399565b60009182526020808320818304018054601f9093166101000a60ff8181021990941695841602949094179093558581168252600d8352604080832086831684528452808320918516835292522054156116335760ff8084166000908152600d602090815260408083208685168452825280832093851683529290522054612710908b0204890198505b8360010193505050506113c1565b506000878152600b60205260409020600681018690558054600290910154611674916001600160a01b0316908790612b8b565b6000878152600b6020526040902080546001909101546001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89089906116c89060ff8616906143af565b604080519283526020830191909152810188905260600160405180910390a250505050505050505050565b606081806001600160401b0381111561170e5761170e614383565b604051908082528060200260200182016040528015611737578160200160208202803683370190505b50915060005b818110156117a8576002600086868481811061175b5761175b614399565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061179057611790614399565b9115156020928302919091019091015260010161173d565b505092915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182091906142ef565b6001600160a01b0316336001600160a01b0316146118505760405162461bcd60e51b8152600401610a349061430c565b6000805460ff19166001179055565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf91906142ef565b6001600160a01b0316336001600160a01b0316146118ff5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156119445760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8185c99481b1bd8dad959608a1b6044820152606401610a34565b868581146119895760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c656e67746820302d3160701b6044820152606401610a34565b8084146119cd5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2102632b733ba341018169960711b6044820152606401610a34565b808214611a1c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c656e67746820302d7061796f75740000000000000000006044820152606401610a34565b60005b81811015611b0157838382818110611a3957611a39614399565b90506020020135600d60008c8c85818110611a5657611a56614399565b9050602002016020810190611a6b9190613c11565b60ff1660ff16815260200190815260200160002060008a8a85818110611a9357611a93614399565b9050602002016020810190611aa89190613c11565b60ff1660ff1681526020019081526020016000206000888885818110611ad057611ad0614399565b9050602002016020810190611ae59190613c11565b60ff168152602081019190915260400160002055600101611a1f565b50505050505050505050565b60018181548110611b1d57600080fd5b600091825260209091200154905081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906142ef565b6001600160a01b0316336001600160a01b031614611bce5760405162461bcd60e51b8152600401610a349061430c565b600580546000918291611be390600190614370565b81548110611bf357611bf3614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600860205260409020805460ff19169185169182179055600580546001909301929091908110611c5d57611c5d614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611c90578260010192505b611c13565b6060816000816001600160401b03811115611cb257611cb2614383565b604051908082528060200260200182016040528015611ce557816020015b6060815260200190600190039081611cd05790505b50905060005b828110156110fe57611d088686838181106110cd576110cd614399565b604051602001611d189190613dc5565b604051602081830303815290604052828281518110611d3957611d39614399565b6020908102919091010152600101611ceb565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc91906142ef565b6001600160a01b0316336001600160a01b031614611dec5760405162461bcd60e51b8152600401610a349061430c565b611df7823383613075565b5050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906142ef565b6001600160a01b0316336001600160a01b031614611e9b5760405162461bcd60e51b8152600401610a349061430c565b600480546000918291611eb090600190614370565b81548110611ec057611ec0614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600760205260409020805460ff19169185169182179055600480546001909301929091908110611f2a57611f2a614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611f5d578260010192505b611ee0565b6005818154811061113757600080fd5b6004805460009190611f8690600190614370565b81548110611f9657611f96614399565b90600052602060002090602091828204019190069054906101000a900460ff16905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906142ef565b6001600160a01b0316336001600160a01b03161461205b5760405162461bcd60e51b8152600401610a349061430c565b60068054600091829161207090600190614370565b8154811061208057612080614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600960205260409020805460ff191691851691821790556006805460019093019290919081106120ea576120ea614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361211d578260010192505b6120a0565b6004818154811061113757600080fd5b6005805460009190611f8690600190614370565b60608080808085806001600160401b0381111561216557612165614383565b60405190808252806020026020018201604052801561218e578160200160208202803683370190505b509550806001600160401b038111156121a9576121a9614383565b6040519080825280602002602001820160405280156121d2578160200160208202803683370190505b509450806001600160401b038111156121ed576121ed614383565b604051908082528060200260200182016040528015612216578160200160208202803683370190505b509350806001600160401b0381111561223157612231614383565b60405190808252806020026020018201604052801561225a578160200160208202803683370190505b509250806001600160401b0381111561227557612275614383565b60405190808252806020026020018201604052801561229e578160200160208202803683370190505b50915060005b818110156124a957600b60008a8a848181106122c2576122c2614399565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061230057612300614399565b60200260200101906001600160a01b031690816001600160a01b031681525050600b60008a8a8481811061233657612336614399565b90506020020135815260200190815260200160002060030180549050600b60008b8b8581811061236857612368614399565b9050602002013581526020019081526020016000206001015461238b91906143af565b86828151811061239d5761239d614399565b602002602001018181525050600b60008a8a848181106123bf576123bf614399565b905060200201358152602001908152602001600020600601548582815181106123ea576123ea614399565b602002602001018181525050600b60008a8a8481811061240c5761240c614399565b9050602002013581526020019081526020016000206008015484828151811061243757612437614399565b602002602001018181525050600b60008a8a8481811061245957612459614399565b90506020020135815260200190815260200160002060070160009054906101000a900460ff1683828151811061249157612491614399565b911515602092830291909101909101526001016122a4565b50509295509295909350565b826001600160a01b038116331461257f57604051636d6d50a160e11b815233600482015260008051602061451d8339815191529063dadaa14290602401602060405180830381865afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612533919061443f565b61257f5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f7468657273006044820152606401610a34565b60008051602061451d8339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef919061443f565b1561262f5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b6044820152606401610a34565b60005460ff161561266b5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a34565b6126768484846131a6565b50505050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec91906142ef565b6001600160a01b0316336001600160a01b03161461271c5760405162461bcd60e51b8152600401610a349061430c565b600a805460ff191660ff92909216919091179055565b6006805460009190611f8690600190614370565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b691906142ef565b6001600160a01b0316336001600160a01b0316146127e65760405162461bcd60e51b8152600401610a349061430c565b600e805460ff191660011790556040517f4dd505a3f8a65b7f59071d5daac7f7a386abde7d7712486e25d410e6e9e38d2f90600090a1565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906142ef565b6001600160a01b0316336001600160a01b0316146128be5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156129035760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8105c9948131bd8dad959608a1b6044820152606401610a34565b848314801561291157508281145b6129535760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840a4cacad84098cadccee8d606b1b6044820152606401610a34565b61295f60048787613a77565b5061296c60058585613a77565b5061297960068383613a77565b50505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ef565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190614461565b60606006805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f91906142ef565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b8115612f9e57808210612da35760008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015612c7457600080fd5b505af1158015612c88573d6000803e3d6000fd5b505050505060008183612c9b9190614370565b905080156126765760008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1391906142ef565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b5050505050505050565b60008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1391906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b505050505060008282612ea69190614370565b905060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1891906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401612f6691815260200190565b6000604051808303818588803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050505050505050565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300e91906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161305c91815260200190565b6000604051808303818588803b158015612d8557600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130d1919061447a565b6000604051808303816000865af19150503d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b509150915081801561313d57508051158061313d57508080602001905181019061313d919061443f565b61319f5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610a34565b5050505050565b60006131b0612982565b905060008080806131c386880188614496565b93509350935093508434101561320d5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b6044820152606401610a34565b61321684611107565b151560011461325e5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b6044820152606401610a34565b60008360ff1611801561327a5750600a5460ff90811690841611155b6132bb5760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c4944205350494e5360701b6044820152606401610a34565b60006132c78634614370565b905060006132d860ff86168361435c565b90506000612710600c54846132ed91906143af565b6132f7919061435c565b905061330481868d613528565b6000878152600b6020526040902080546001600160a01b0319166001600160a01b038d1617815560010182905561333b8184614370565b6000888152600b602052604090206002015560ff86166001600160401b0381111561336857613368614383565b604051908082528060200260200182016040528015613391578160200160208202803683370190505b50600b600089815260200190815260200160002060030190805190602001906133bb929190613b20565b508560ff166001600160401b038111156133d7576133d7614383565b604051908082528060200260200182016040528015613400578160200160208202803683370190505b50600b6000898152602001908152602001600020600401908051906020019061342a929190613b20565b508560ff166001600160401b0381111561344657613446614383565b60405190808252806020026020018201604052801561346f578160200160208202803683370190505b50600b60008981526020019081526020016000206005019080519060200190613499929190613b20565b506000878152600b60205260409020426008909101556134b98b886135d2565b6134c38b846136c6565b8a6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c7886040516134fe91815260200190565b60405180910390a261351b876135158860036144dc565b866137c4565b5050505050505050505050565b60008051602061451d8339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015613574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061359891906142ef565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161305c565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006024830152604482018390527f00000000000000000000000000000000000000000000000000000000000000001690639a4918c190606401600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b60008051602061451d8339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906142ef565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000006044830152919091169063eb3d9bea90606401600060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015613812573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383691906142ef565b6001600160a01b03166397cca7af61384c612982565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015613891573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138b691906144ff565b6001600160401b038116600090815260036020526040902054909150156139125760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b6044820152606401610a34565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b03198152915160008051602061451d8339815191529263ff9b3acf9260048083019391928290030181865afa158015613979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399d91906142ef565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156139d757600080fd5b505af11580156139eb573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161135991815260200190565b60405180610120016040528060006001600160a01b03168152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613aa0565b8015613b0e5782816101000a81549060ff0219169055600101602081600001049283019260010302613ae1565b505b50613b1c929150613b87565b5090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613b49565b5b80821115613b1c5760008155600101613b88565b600060208284031215613bae57600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b81811015613bf057835160ff16835260209384019390920191600101613bcf565b509095945050505050565b803560ff81168114613c0c57600080fd5b919050565b600060208284031215613c2357600080fd5b613c2c82613bfb565b9392505050565b60008060408385031215613c4657600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015613c87578151865260209586019590910190600101613c69565b5093949350505050565b602081526000613c2c6020830184613c55565b6001600160a01b0381168114613cb957600080fd5b50565b60008060408385031215613ccf57600080fd5b8235613cda81613ca4565b946020939093013593505050565b600081518084526020840193506020830160005b82811015613c8757815160ff16865260209586019590910190600101613cfc565b80516001600160a01b031682526020810151602083015260408101516040830152600060608201516101206060850152613d5b610120850182613ce8565b905060808301518482036080860152613d748282613ce8565b91505060a083015184820360a0860152613d8e8282613ce8565b91505060c083015160c085015260e0830151613dae60e086018215159052565b506101008301516101008501528091505092915050565b602081526000613c2c6020830184613d1d565b60008083601f840112613dea57600080fd5b5081356001600160401b03811115613e0157600080fd5b6020830191508360208260051b8501011115613e1c57600080fd5b9250929050565b60008060208385031215613e3657600080fd5b82356001600160401b03811115613e4c57600080fd5b613e5885828601613dd8565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452613ea8858351613d1d565b94506020938401939190910190600101613e8c565b50929695505050505050565b6001600160401b0381168114613cb957600080fd5b600080600060408486031215613ef357600080fd5b8335613efe81613ec9565b925060208401356001600160401b03811115613f1957600080fd5b613f2586828701613dd8565b9497909650939450505050565b600081518084526020840193506020830160005b82811015613c875781511515865260209586019590910190600101613f46565b602081526000613c2c6020830184613f32565b6000806000806000806000806080898b031215613f9557600080fd5b88356001600160401b03811115613fab57600080fd5b613fb78b828c01613dd8565b90995097505060208901356001600160401b03811115613fd657600080fd5b613fe28b828c01613dd8565b90975095505060408901356001600160401b0381111561400157600080fd5b61400d8b828c01613dd8565b90955093505060608901356001600160401b0381111561402c57600080fd5b6140388b828c01613dd8565b999c989b5096995094979396929594505050565b60005b8381101561406757818101518382015260200161404f565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452815180518087526140c181602089016020850161404c565b601f01601f19169590950160209081019550938401939190910190600101614098565b6000806000606084860312156140f957600080fd5b61410284613bfb565b925061411060208501613bfb565b915061411e60408501613bfb565b90509250925092565b60a08082528651908201819052600090602088019060c0840190835b8181101561416a5783516001600160a01b0316835260209384019390920191600101614143565b5050838103602085015261417e8189613c55565b91505082810360408401526141938187613c55565b905082810360608401526141a78186613c55565b905082810360808401526141bb8185613f32565b98975050505050505050565b6000806000604084860312156141dc57600080fd5b83356141e781613ca4565b925060208401356001600160401b0381111561420257600080fd5b8401601f8101861361421357600080fd5b80356001600160401b0381111561422957600080fd5b86602082840101111561423b57600080fd5b939660209190910195509293505050565b6000806000806000806060878903121561426557600080fd5b86356001600160401b0381111561427b57600080fd5b61428789828a01613dd8565b90975095505060208701356001600160401b038111156142a657600080fd5b6142b289828a01613dd8565b90955093505060408701356001600160401b038111156142d157600080fd5b6142dd89828a01613dd8565b979a9699509497509295939492505050565b60006020828403121561430157600080fd5b8151613c2c81613ca4565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261436b5761436b614330565b500490565b81810381811115610d1f57610d1f614346565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610d1f57610d1f614346565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156143fd57600080fd5b8260051b808560808501379190910160800195945050505050565b60008261442757614427614330565b500690565b80820180821115610d1f57610d1f614346565b60006020828403121561445157600080fd5b81518015158114613c2c57600080fd5b60006020828403121561447357600080fd5b5051919050565b6000825161448c81846020870161404c565b9190910192915050565b600080600080608085870312156144ac57600080fd5b843593506144bc60208601613bfb565b925060408501356144cc81613ca4565b9396929550929360600135925050565b60ff81811683821602908116908181146144f8576144f8614346565b5092915050565b60006020828403121561451157600080fd5b8151613c2c81613ec956fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212205e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c0844901035364736f6c634300081c003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000003b0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000f9
Deployed Bytecode
0x6080604052600436106102975760003560e01c806389fc2c0f1161015a578063c271ac1a116100c1578063d7b7ca4a1161007a578063d7b7ca4a146108ec578063d951ec5b14610901578063e4b26ae714610916578063f0034a7e14610936578063fc628ac41461094b578063fdcdb06b1461096057600080fd5b8063c271ac1a146107f9578063c4fd5d6d14610843578063c811ad7114610874578063cc81d05514610887578063d01585d41461089c578063d02e3555146108bc57600080fd5b80639fe870dd116101135780639fe870dd14610765578063a16c47371461077a578063aa44cf171461079a578063aa5a60e5146107af578063b79f2925146107c4578063bd92621b146107e457600080fd5b806389fc2c0f146106715780638a31ae561461069157806391ea41e6146106a657806398daac83146106d35780639e281a98146107075780639f90bd651461072757600080fd5b8063481c6a75116101fe5780636c236d58116101b75780636c236d58146105c0578063749fa03c146105d55780637b8d3879146105f55780638456cb5914610622578063864638a51461063757806387cf2a231461065157600080fd5b8063481c6a751461050157806348e8294a1461052357806351e925591461055057806352233e91146105705780635c975abb14610586578063614be8d4146105a057600080fd5b80632fbb0116116102505780632fbb0116146103f357806330ea95f31461041557806332883e7e1461045757806338b6d2e5146104845780634782f779146104b457806347e1d550146104d457600080fd5b8063046f7da2146102a35780630476f004146102ba57806304e2064f146102e9578063117a5b901461031657806312e8e2c3146103af57806326232a2e146103cf57600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b8610994565b005b3480156102c657600080fd5b50600e546102d49060ff1681565b60405190151581526020015b60405180910390f35b3480156102f557600080fd5b506102fe610a49565b6040516001600160a01b0390911681526020016102e0565b34801561032257600080fd5b50610376610331366004613b9c565b600b602052600090815260409020805460018201546002830154600684015460078501546008909501546001600160a01b039094169492939192909160ff9091169086565b604080516001600160a01b03909716875260208701959095529385019290925260608401521515608083015260a082015260c0016102e0565b3480156103bb57600080fd5b506102b86103ca366004613b9c565b610ac0565b3480156103db57600080fd5b506103e5600c5481565b6040519081526020016102e0565b3480156103ff57600080fd5b50610408610beb565b6040516102e09190613bb5565b34801561042157600080fd5b50610445610430366004613c11565b60086020526000908152604090205460ff1681565b60405160ff90911681526020016102e0565b34801561046357600080fd5b50610477610472366004613c33565b610c61565b6040516102e09190613c91565b34801561049057600080fd5b5061044561049f366004613c11565b60096020526000908152604090205460ff1681565b3480156104c057600080fd5b506102b86104cf366004613cbc565b610d25565b3480156104e057600080fd5b506104f46104ef366004613b9c565b610e2a565b6040516102e09190613dc5565b34801561050d57600080fd5b506102fe60008051602061451d83398151915281565b34801561052f57600080fd5b5061054361053e366004613e23565b611054565b6040516102e09190613e64565b34801561055c57600080fd5b506102d461056b366004613b9c565b611107565b34801561057c57600080fd5b506103e561271081565b34801561059257600080fd5b506000546102d49060ff1681565b3480156105ac57600080fd5b506104456105bb366004613b9c565b611127565b3480156105cc57600080fd5b5061040861115b565b3480156105e157600080fd5b506102b86105f0366004613ede565b6111b5565b34801561060157600080fd5b50610615610610366004613e23565b6116f3565b6040516102e09190613f66565b34801561062e57600080fd5b506102b86117b0565b34801561064357600080fd5b50600a546104459060ff1681565b34801561065d57600080fd5b506102b861066c366004613f79565b61185f565b34801561067d57600080fd5b506103e561068c366004613b9c565b611b0d565b34801561069d57600080fd5b506102b8611b2e565b3480156106b257600080fd5b506106c66106c1366004613e23565b611c95565b6040516102e09190614070565b3480156106df57600080fd5b506102fe7f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa81565b34801561071357600080fd5b506102b8610722366004613cbc565b611d4c565b34801561073357600080fd5b506103e56107423660046140e4565b600d60209081526000938452604080852082529284528284209052825290205481565b34801561077157600080fd5b506102b8611dfb565b34801561078657600080fd5b50610445610795366004613b9c565b611f62565b3480156107a657600080fd5b50610445611f72565b3480156107bb57600080fd5b506102b8611fbb565b3480156107d057600080fd5b506104456107df366004613b9c565b612122565b3480156107f057600080fd5b50610445612132565b34801561080557600080fd5b506103e56108143660046140e4565b60ff9283166000908152600d602090815260408083209486168352938152838220929094168152925290205490565b34801561084f57600080fd5b5061086361085e366004613e23565b612146565b6040516102e0959493929190614127565b6102b86108823660046141c7565b6124b5565b34801561089357600080fd5b506001546103e5565b3480156108a857600080fd5b506102b86108b7366004613c11565b61267c565b3480156108c857600080fd5b506104456108d7366004613c11565b60076020526000908152604090205460ff1681565b3480156108f857600080fd5b50610445612732565b34801561090d57600080fd5b506102b8612746565b34801561092257600080fd5b506102b861093136600461424c565b61281e565b34801561094257600080fd5b506103e5612982565b34801561095757600080fd5b50610408612a55565b34801561096c57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000381565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0491906142ef565b6001600160a01b0316336001600160a01b031614610a3d5760405162461bcd60e51b8152600401610a349061430c565b60405180910390fd5b6000805460ff19169055565b600060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906142ef565b905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3091906142ef565b6001600160a01b0316336001600160a01b031614610b605760405162461bcd60e51b8152600401610a349061430c565b610b6d600561271061435c565b811115610bb05760405162461bcd60e51b815260206004820152601160248201527043616e6e6f74204578636565642032302560781b6044820152606401610a34565b600c8190556040518181527f05fd392cc4f8fe360ff8b094f628b1c29b9000441290e2f8a597c12d5379b06d9060200160405180910390a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5757602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610c285790505b5050505050905090565b600154606090821115610c745760015491505b6000610c808484614370565b6001600160401b03811115610c9757610c97614383565b604051908082528060200260200182016040528015610cc0578160200160208202803683370190505b509050835b83811015610d1b5760018181548110610ce057610ce0614399565b9060005260206000200154828683610cf89190614370565b81518110610d0857610d08614399565b6020908102919091010152600101610cc5565b5090505b92915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9591906142ef565b6001600160a01b0316336001600160a01b031614610dc55760405162461bcd60e51b8152600401610a349061430c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b5050905080610e2557600080fd5b505050565b610e32613a20565b60408051610120810182526000848152600b602081815284832080546001600160a01b03168552600181015482860181905293889052919052600301549192830191610e7d916143af565b81526000848152600b60209081526040918290206003018054835181840281018401909452808452938201939091830182828015610ef857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610ec95790505b50505050508152602001600b6000858152602001908152602001600020600401805480602002602001604051908101604052809291908181526020018280548015610f8057602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610f515790505b50505050508152602001600b600085815260200190815260200160002060050180548060200260200160405190810160405280929190818152602001828054801561100857602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610fd95790505b50505091835250506000848152600b60208181526040808420600681015483870152600781015460ff161515918601919091529690925290526008909301546060909301929092525090565b6060816000816001600160401b0381111561107157611071614383565b6040519080825280602002602001820160405280156110aa57816020015b611097613a20565b81526020019060019003908161108f5790505b50905060005b828110156110fe576110d98686838181106110cd576110cd614399565b90506020020135610e2a565b8282815181106110eb576110eb614399565b60209081029190910101526001016110b0565b50949350505050565b60008181526002602052604081205460ff16158015610d1f575050151590565b6006818154811061113757600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60606005805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122591906142ef565b6001600160a01b0316336001600160a01b0316146112795760405162461bcd60e51b815260206004820152601160248201527013db9b1e48149391c810dbdb9d1c9858dd607a1b6044820152606401610a34565b6001600160401b03831660009081526003602052604090205461129b84612aaf565b8015806112bd57506000818152600b60205260409020546001600160a01b0316155b806112de57506000818152600b602052604090206007015460ff1615156001145b806112f857506000818152600b6020526040902060030154155b8061131f57506000818152600b6020526040902060039081015461131b916143af565b8214155b15611367577f2acb79a40a39601d6c546f6db7b37fd1018c0401f5f5e07754bff874ce6ac8a58482858560405161135994939291906143c6565b60405180910390a150505050565b6000818152600b6020526040812060078101805460ff1916600190811790915501549080611393611f72565b9050600061139f612132565b905060006113ab612732565b6000878152600b60205260408120600301549192505b8160ff1681101561164157600060078160ff88168d8d6113e28760036143af565b8181106113f1576113f1614399565b905060200201356114029190614418565b60ff908116825260208201929092526040016000908120548216925090600890829088168e8e6114338860036143af565b61143e90600161442c565b81811061144d5761144d614399565b9050602002013561145e9190614418565b60ff908116825260208201929092526040016000908120548216925090600990829088168f8f61148f8960036143af565b61149a90600261442c565b8181106114a9576114a9614399565b905060200201356114ba9190614418565b60ff1660ff16815260200190815260200160002060009054906101000a900460ff16905082600b60008d8152602001908152602001600020600301858154811061150657611506614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555081600b60008d8152602001908152602001600020600401858154811061155857611558614399565b90600052602060002090602091828204019190066101000a81548160ff021916908360ff16021790555080600b60008d815260200190815260200160002060050185815481106115aa576115aa614399565b60009182526020808320818304018054601f9093166101000a60ff8181021990941695841602949094179093558581168252600d8352604080832086831684528452808320918516835292522054156116335760ff8084166000908152600d602090815260408083208685168452825280832093851683529290522054612710908b0204890198505b8360010193505050506113c1565b506000878152600b60205260409020600681018690558054600290910154611674916001600160a01b0316908790612b8b565b6000878152600b6020526040902080546001909101546001600160a01b03909116907fc542d3f545425a3b913c4056355fd70bae2039ab35205203499d8bfd03c01ae89089906116c89060ff8616906143af565b604080519283526020830191909152810188905260600160405180910390a250505050505050505050565b606081806001600160401b0381111561170e5761170e614383565b604051908082528060200260200182016040528015611737578160200160208202803683370190505b50915060005b818110156117a8576002600086868481811061175b5761175b614399565b90506020020135815260200190815260200160002060009054906101000a900460ff1683828151811061179057611790614399565b9115156020928302919091019091015260010161173d565b505092915050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182091906142ef565b6001600160a01b0316336001600160a01b0316146118505760405162461bcd60e51b8152600401610a349061430c565b6000805460ff19166001179055565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cf91906142ef565b6001600160a01b0316336001600160a01b0316146118ff5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156119445760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8185c99481b1bd8dad959608a1b6044820152606401610a34565b868581146119895760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964204c656e67746820302d3160701b6044820152606401610a34565b8084146119cd5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2102632b733ba341018169960711b6044820152606401610a34565b808214611a1c5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c656e67746820302d7061796f75740000000000000000006044820152606401610a34565b60005b81811015611b0157838382818110611a3957611a39614399565b90506020020135600d60008c8c85818110611a5657611a56614399565b9050602002016020810190611a6b9190613c11565b60ff1660ff16815260200190815260200160002060008a8a85818110611a9357611a93614399565b9050602002016020810190611aa89190613c11565b60ff1660ff1681526020019081526020016000206000888885818110611ad057611ad0614399565b9050602002016020810190611ae59190613c11565b60ff168152602081019190915260400160002055600101611a1f565b50505050505050505050565b60018181548110611b1d57600080fd5b600091825260209091200154905081565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9e91906142ef565b6001600160a01b0316336001600160a01b031614611bce5760405162461bcd60e51b8152600401610a349061430c565b600580546000918291611be390600190614370565b81548110611bf357611bf3614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600860205260409020805460ff19169185169182179055600580546001909301929091908110611c5d57611c5d614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611c90578260010192505b611c13565b6060816000816001600160401b03811115611cb257611cb2614383565b604051908082528060200260200182016040528015611ce557816020015b6060815260200190600190039081611cd05790505b50905060005b828110156110fe57611d088686838181106110cd576110cd614399565b604051602001611d189190613dc5565b604051602081830303815290604052828281518110611d3957611d39614399565b6020908102919091010152600101611ceb565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dbc91906142ef565b6001600160a01b0316336001600160a01b031614611dec5760405162461bcd60e51b8152600401610a349061430c565b611df7823383613075565b5050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906142ef565b6001600160a01b0316336001600160a01b031614611e9b5760405162461bcd60e51b8152600401610a349061430c565b600480546000918291611eb090600190614370565b81548110611ec057611ec0614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600760205260409020805460ff19169185169182179055600480546001909301929091908110611f2a57611f2a614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff1603611f5d578260010192505b611ee0565b6005818154811061113757600080fd5b6004805460009190611f8690600190614370565b81548110611f9657611f96614399565b90600052602060002090602091828204019190069054906101000a900460ff16905090565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202b91906142ef565b6001600160a01b0316336001600160a01b03161461205b5760405162461bcd60e51b8152600401610a349061430c565b60068054600091829161207090600190614370565b8154811061208057612080614399565b60009182526020808320908204015460ff601f9092166101000a90041691505b8160ff168160ff161015610e255760ff8181166000908152600960205260409020805460ff191691851691821790556006805460019093019290919081106120ea576120ea614399565b90600052602060002090602091828204019190069054906101000a900460ff1660ff168160ff160361211d578260010192505b6120a0565b6004818154811061113757600080fd5b6005805460009190611f8690600190614370565b60608080808085806001600160401b0381111561216557612165614383565b60405190808252806020026020018201604052801561218e578160200160208202803683370190505b509550806001600160401b038111156121a9576121a9614383565b6040519080825280602002602001820160405280156121d2578160200160208202803683370190505b509450806001600160401b038111156121ed576121ed614383565b604051908082528060200260200182016040528015612216578160200160208202803683370190505b509350806001600160401b0381111561223157612231614383565b60405190808252806020026020018201604052801561225a578160200160208202803683370190505b509250806001600160401b0381111561227557612275614383565b60405190808252806020026020018201604052801561229e578160200160208202803683370190505b50915060005b818110156124a957600b60008a8a848181106122c2576122c2614399565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b031687828151811061230057612300614399565b60200260200101906001600160a01b031690816001600160a01b031681525050600b60008a8a8481811061233657612336614399565b90506020020135815260200190815260200160002060030180549050600b60008b8b8581811061236857612368614399565b9050602002013581526020019081526020016000206001015461238b91906143af565b86828151811061239d5761239d614399565b602002602001018181525050600b60008a8a848181106123bf576123bf614399565b905060200201358152602001908152602001600020600601548582815181106123ea576123ea614399565b602002602001018181525050600b60008a8a8481811061240c5761240c614399565b9050602002013581526020019081526020016000206008015484828151811061243757612437614399565b602002602001018181525050600b60008a8a8481811061245957612459614399565b90506020020135815260200190815260200160002060070160009054906101000a900460ff1683828151811061249157612491614399565b911515602092830291909101909101526001016122a4565b50509295509295909350565b826001600160a01b038116331461257f57604051636d6d50a160e11b815233600482015260008051602061451d8339815191529063dadaa14290602401602060405180830381865afa15801561250f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612533919061443f565b61257f5760405162461bcd60e51b815260206004820152601f60248201527f556e417574686f72697a656420546f20506c617920466f72204f7468657273006044820152606401610a34565b60008051602061451d8339815191526001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef919061443f565b1561262f5760405162461bcd60e51b815260206004820152601060248201526f105b1b0811d85b595cc814185d5cd95960821b6044820152606401610a34565b60005460ff161561266b5760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a34565b6126768484846131a6565b50505050565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ec91906142ef565b6001600160a01b0316336001600160a01b03161461271c5760405162461bcd60e51b8152600401610a349061430c565b600a805460ff191660ff92909216919091179055565b6006805460009190611f8690600190614370565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b691906142ef565b6001600160a01b0316336001600160a01b0316146127e65760405162461bcd60e51b8152600401610a349061430c565b600e805460ff191660011790556040517f4dd505a3f8a65b7f59071d5daac7f7a386abde7d7712486e25d410e6e9e38d2f90600090a1565b60008051602061451d8339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561286a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288e91906142ef565b6001600160a01b0316336001600160a01b0316146128be5760405162461bcd60e51b8152600401610a349061430c565b600e5460ff16156129035760405162461bcd60e51b815260206004820152600f60248201526e13d9191cc8105c9948131bd8dad959608a1b6044820152606401610a34565b848314801561291157508281145b6129535760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840a4cacad84098cadccee8d606b1b6044820152606401610a34565b61295f60048787613a77565b5061296c60058585613a77565b5061297960068383613a77565b50505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f491906142ef565b6001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb9190614461565b60606006805480602002602001604051908101604052809291908181526020018280548015610c57576000918252602091829020805460ff168452908202830192909160019101808411610c285790505050505050905090565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612afb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1f91906142ef565b6001600160a01b0316638b3939f26040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b505050506001600160401b0316600090815260036020526040812055565b8115612f9e57808210612da35760008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0891906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b0385811660248301529190911690639fec19e09083906044016000604051808303818588803b158015612c7457600080fd5b505af1158015612c88573d6000803e3d6000fd5b505050505060008183612c9b9190614370565b905080156126765760008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1391906142ef565b60405163ae2f5d9360e01b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b03868116602483015260448201849052919091169063ae2f5d9390606401600060405180830381600087803b158015612d8557600080fd5b505af1158015612d99573d6000803e3d6000fd5b5050505050505050565b60008051602061451d8339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1391906142ef565b6040516304ff60cf60e51b81527f000000000000000000000000000000000000000000000000000000000000000360048201526001600160a01b0385811660248301529190911690639fec19e09084906044016000604051808303818588803b158015612e7f57600080fd5b505af1158015612e93573d6000803e3d6000fd5b505050505060008282612ea69190614370565b905060008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f1891906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b8152600401612f6691815260200190565b6000604051808303818588803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b505050505050505050565b60008051602061451d8339815191526001600160a01b031663ff9b3acf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300e91906142ef565b6001600160a01b031663b3cb6f1a827f00000000000000000000000000000000000000000000000000000000000000036040518363ffffffff1660e01b815260040161305c91815260200190565b6000604051808303818588803b158015612d8557600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916130d1919061447a565b6000604051808303816000865af19150503d806000811461310e576040519150601f19603f3d011682016040523d82523d6000602084013e613113565b606091505b509150915081801561313d57508051158061313d57508080602001905181019061313d919061443f565b61319f5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b6064820152608401610a34565b5050505050565b60006131b0612982565b905060008080806131c386880188614496565b93509350935093508434101561320d5760405162461bcd60e51b815260206004820152600f60248201526e22a9291d1026a4a710212aac9024a760891b6044820152606401610a34565b61321684611107565b151560011461325e5760405162461bcd60e51b81526020600482015260146024820152731154948e88125395905312510811d0535148125160621b6044820152606401610a34565b60008360ff1611801561327a5750600a5460ff90811690841611155b6132bb5760405162461bcd60e51b81526020600482015260126024820152714552523a20494e56414c4944205350494e5360701b6044820152606401610a34565b60006132c78634614370565b905060006132d860ff86168361435c565b90506000612710600c54846132ed91906143af565b6132f7919061435c565b905061330481868d613528565b6000878152600b6020526040902080546001600160a01b0319166001600160a01b038d1617815560010182905561333b8184614370565b6000888152600b602052604090206002015560ff86166001600160401b0381111561336857613368614383565b604051908082528060200260200182016040528015613391578160200160208202803683370190505b50600b600089815260200190815260200160002060030190805190602001906133bb929190613b20565b508560ff166001600160401b038111156133d7576133d7614383565b604051908082528060200260200182016040528015613400578160200160208202803683370190505b50600b6000898152602001908152602001600020600401908051906020019061342a929190613b20565b508560ff166001600160401b0381111561344657613446614383565b60405190808252806020026020018201604052801561346f578160200160208202803683370190505b50600b60008981526020019081526020016000206005019080519060200190613499929190613b20565b506000878152600b60205260409020426008909101556134b98b886135d2565b6134c38b846136c6565b8a6001600160a01b03167fea32a03505fd9f04d664676d72295a86c5fb0465e69654751907ca305bc1d1c7886040516134fe91815260200190565b60405180910390a261351b876135158860036144dc565b866137c4565b5050505050505050505050565b60008051602061451d8339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015613574573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061359891906142ef565b60405163bc5101e560e01b81526001600160a01b0384811660048301528381166024830152919091169063bc5101e590859060440161305c565b604051639a4918c160e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000036024830152604482018390527f000000000000000000000000fa296156dac165af92f7fdb012b61a874670e1aa1690639a4918c190606401600060405180830381600087803b15801561366257600080fd5b505af1158015613676573d6000803e3d6000fd5b50506001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601849055600093845260026020526040909320805460ff1916909317909255505050565b60008051602061451d8339815191526001600160a01b031663846c43986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373691906142ef565b60405163759ecdf560e11b81526001600160a01b038481166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000036044830152919091169063eb3d9bea90606401600060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050505050565b600060008051602061451d8339815191526001600160a01b031663f71492206040518163ffffffff1660e01b8152600401602060405180830381865afa158015613812573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061383691906142ef565b6001600160a01b03166397cca7af61384c612982565b6040516001600160e01b031960e084901b1681526004810186905260ff8716602482015260440160206040518083038185885af1158015613891573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906138b691906144ff565b6001600160401b038116600090815260036020526040902054909150156139125760405162461bcd60e51b815260206004820152601060248201526f52657175657374496420496e2055736560801b6044820152606401610a34565b6001600160401b038116600090815260036020908152604091829020869055815160016264c53160e01b03198152915160008051602061451d8339815191529263ff9b3acf9260048083019391928290030181865afa158015613979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399d91906142ef565b6001600160a01b0316638d7fe4786040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156139d757600080fd5b505af11580156139eb573d6000803e3d6000fd5b505050507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d458460405161135991815260200190565b60405180610120016040528060006001600160a01b03168152602001600081526020016000815260200160608152602001606081526020016060815260200160008152602001600015158152602001600081525090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613aa0565b8015613b0e5782816101000a81549060ff0219169055600101602081600001049283019260010302613ae1565b505b50613b1c929150613b87565b5090565b82805482825590600052602060002090601f01602090048101928215613b105791602002820160005b83821115613ae157835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613b49565b5b80821115613b1c5760008155600101613b88565b600060208284031215613bae57600080fd5b5035919050565b602080825282518282018190526000918401906040840190835b81811015613bf057835160ff16835260209384019390920191600101613bcf565b509095945050505050565b803560ff81168114613c0c57600080fd5b919050565b600060208284031215613c2357600080fd5b613c2c82613bfb565b9392505050565b60008060408385031215613c4657600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b82811015613c87578151865260209586019590910190600101613c69565b5093949350505050565b602081526000613c2c6020830184613c55565b6001600160a01b0381168114613cb957600080fd5b50565b60008060408385031215613ccf57600080fd5b8235613cda81613ca4565b946020939093013593505050565b600081518084526020840193506020830160005b82811015613c8757815160ff16865260209586019590910190600101613cfc565b80516001600160a01b031682526020810151602083015260408101516040830152600060608201516101206060850152613d5b610120850182613ce8565b905060808301518482036080860152613d748282613ce8565b91505060a083015184820360a0860152613d8e8282613ce8565b91505060c083015160c085015260e0830151613dae60e086018215159052565b506101008301516101008501528091505092915050565b602081526000613c2c6020830184613d1d565b60008083601f840112613dea57600080fd5b5081356001600160401b03811115613e0157600080fd5b6020830191508360208260051b8501011115613e1c57600080fd5b9250929050565b60008060208385031215613e3657600080fd5b82356001600160401b03811115613e4c57600080fd5b613e5885828601613dd8565b90969095509350505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452613ea8858351613d1d565b94506020938401939190910190600101613e8c565b50929695505050505050565b6001600160401b0381168114613cb957600080fd5b600080600060408486031215613ef357600080fd5b8335613efe81613ec9565b925060208401356001600160401b03811115613f1957600080fd5b613f2586828701613dd8565b9497909650939450505050565b600081518084526020840193506020830160005b82811015613c875781511515865260209586019590910190600101613f46565b602081526000613c2c6020830184613f32565b6000806000806000806000806080898b031215613f9557600080fd5b88356001600160401b03811115613fab57600080fd5b613fb78b828c01613dd8565b90995097505060208901356001600160401b03811115613fd657600080fd5b613fe28b828c01613dd8565b90975095505060408901356001600160401b0381111561400157600080fd5b61400d8b828c01613dd8565b90955093505060608901356001600160401b0381111561402c57600080fd5b6140388b828c01613dd8565b999c989b5096995094979396929594505050565b60005b8381101561406757818101518382015260200161404f565b50506000910152565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015613ebd57603f19878603018452815180518087526140c181602089016020850161404c565b601f01601f19169590950160209081019550938401939190910190600101614098565b6000806000606084860312156140f957600080fd5b61410284613bfb565b925061411060208501613bfb565b915061411e60408501613bfb565b90509250925092565b60a08082528651908201819052600090602088019060c0840190835b8181101561416a5783516001600160a01b0316835260209384019390920191600101614143565b5050838103602085015261417e8189613c55565b91505082810360408401526141938187613c55565b905082810360608401526141a78186613c55565b905082810360808401526141bb8185613f32565b98975050505050505050565b6000806000604084860312156141dc57600080fd5b83356141e781613ca4565b925060208401356001600160401b0381111561420257600080fd5b8401601f8101861361421357600080fd5b80356001600160401b0381111561422957600080fd5b86602082840101111561423b57600080fd5b939660209190910195509293505050565b6000806000806000806060878903121561426557600080fd5b86356001600160401b0381111561427b57600080fd5b61428789828a01613dd8565b90975095505060208701356001600160401b038111156142a657600080fd5b6142b289828a01613dd8565b90955093505060408701356001600160401b038111156142d157600080fd5b6142dd89828a01613dd8565b979a9699509497509295939492505050565b60006020828403121561430157600080fd5b8151613c2c81613ca4565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008261436b5761436b614330565b500490565b81810381811115610d1f57610d1f614346565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610d1f57610d1f614346565b6001600160401b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156143fd57600080fd5b8260051b808560808501379190910160800195945050505050565b60008261442757614427614330565b500690565b80820180821115610d1f57610d1f614346565b60006020828403121561445157600080fd5b81518015158114613c2c57600080fd5b60006020828403121561447357600080fd5b5051919050565b6000825161448c81846020870161404c565b9190910192915050565b600080600080608085870312156144ac57600080fd5b843593506144bc60208601613bfb565b925060408501356144cc81613ca4565b9396929550929360600135925050565b60ff81811683821602908116908181146144f8576144f8614346565b5092915050565b60006020828403121561451157600080fd5b8151613c2c81613ec956fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa26469706673582212205e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c0844901035364736f6c634300081c0033
Deployed Bytecode Sourcemap
15895:13751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9593:70;;;;;;;;;;;;;:::i;:::-;;17629:22;;;;;;;;;;-1:-1:-1;17629:22:0;;;;;;;;;;;275:14:1;;268:22;250:41;;238:2;223:18;17629:22:0;;;;;;;;14370:91;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;575:32:1;;;557:51;;545:2;530:18;14370:91:0;411:203:1;17167:40:0;;;;;;;;;;-1:-1:-1;17167:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17167:40:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1149:32:1;;;1131:51;;1213:2;1198:18;;1191:34;;;;1241:18;;;1234:34;;;;1299:2;1284:18;;1277:34;1355:14;1348:22;1342:3;1327:19;;1320:51;1169:3;1387:19;;1380:35;1118:3;1103:19;17167:40:0;850:571:1;19079:260:0;;;;;;;;;;-1:-1:-1;19079:260:0;;;;;:::i;:::-;;:::i;17261:32::-;;;;;;;;;;;;;;;;;;;1572:25:1;;;1560:2;1545:18;17261:32:0;1426:177:1;26512:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16130:48::-;;;;;;;;;;-1:-1:-1;16130:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2751:4:1;2739:17;;;2721:36;;2709:2;2694:18;16130:48:0;2579:184:1;14935:409:0;;;;;;;;;;-1:-1:-1;14935:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16185:48::-;;;;;;;;;;-1:-1:-1;16185:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9671:155;;;;;;;;;;-1:-1:-1;9671:155:0;;;;;:::i;:::-;;:::i;27303:600::-;;;;;;;;;;-1:-1:-1;27303:600:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1899:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1899:107:0;;27911:413;;;;;;;;;;-1:-1:-1;27911:413:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14469:135::-;;;;;;;;;;-1:-1:-1;14469:135:0;;;;;:::i;:::-;;:::i;17470:45::-;;;;;;;;;;;;17509:6;17470:45;;8742:26;;;;;;;;;;-1:-1:-1;8742:26:0;;;;;;;;16014:20;;;;;;;;;;-1:-1:-1;16014:20:0;;;;;:::i;:::-;;:::i;26614:94::-;;;;;;;;;;;;;:::i;23944:2560::-;;;;;;;;;;-1:-1:-1;23944:2560:0;;;;;:::i;:::-;;:::i;14612:315::-;;;;;;;;;;-1:-1:-1;14612:315:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9517:68::-;;;;;;;;;;;;;:::i;16260:27::-;;;;;;;;;;-1:-1:-1;16260:27:0;;;;;;;;21066:835;;;;;;;;;;-1:-1:-1;21066:835:0;;;;;:::i;:::-;;:::i;8815:28::-;;;;;;;;;;-1:-1:-1;8815:28:0;;;;;:::i;:::-;;:::i;20320:365::-;;;;;;;;;;;;;:::i;28332:370::-;;;;;;;;;;-1:-1:-1;28332:370:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8647:40::-;;;;;;;;;;;;;;;9834:143;;;;;;;;;;-1:-1:-1;9834:143:0;;;;;:::i;:::-;;:::i;17352:84::-;;;;;;;;;;-1:-1:-1;17352:84:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19947:365;;;;;;;;;;;;;:::i;15987:20::-;;;;;;;;;;-1:-1:-1;15987:20:0;;;;;:::i;:::-;;:::i;26818:104::-;;;;;;;;;;;;;:::i;20693:365::-;;;;;;;;;;;;;:::i;15960:20::-;;;;;;;;;;-1:-1:-1;15960:20:0;;;;;:::i;:::-;;:::i;26930:104::-;;;;;;;;;;;;;:::i;27154:141::-;;;;;;;;;;-1:-1:-1;27154:141:0;;;;;:::i;:::-;27260:13;;;;27233:7;27260:13;;;:6;:13;;;;;;;;:20;;;;;;;;;;;:27;;;;;;;;;;;;27154:141;28710:933;;;;;;;;;;-1:-1:-1;28710:933:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;10549:260::-;;;;;;:::i;:::-;;:::i;15352:102::-;;;;;;;;;;-1:-1:-1;15428:11:0;:18;15352:102;;18974:97;;;;;;;;;;-1:-1:-1;18974:97:0;;;;;:::i;:::-;;:::i;16075:48::-;;;;;;;;;;-1:-1:-1;16075:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27042:104;;;;;;;;;;;;;:::i;19347:103::-;;;;;;;;;;;;;:::i;19458:481::-;;;;;;;;;;-1:-1:-1;19458:481:0;;;;;:::i;:::-;;:::i;10331:105::-;;;;;;;;;;;;;:::i;26716:94::-;;;;;;;;;;;;;:::i;8582:32::-;;;;;;;;;;;;;;;9593:70;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;;;;;;;;;9650:5:::1;9641:14:::0;;-1:-1:-1;;9641:14:0::1;::::0;;9593:70::o;14370:91::-;14411:7;-1:-1:-1;;;;;;;;;;;;;;;;14438:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14431:22;;14370:91;:::o;19079:260::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19191:16:::1;19206:1;17509:6;19191:16;:::i;:::-;19176:11;:31;;19154:98;;;::::0;-1:-1:-1;;;19154:98:0;;17041:2:1;19154:98:0::1;::::0;::::1;17023:21:1::0;17080:2;17060:18;;;17053:30;-1:-1:-1;;;17099:18:1;;;17092:47;17156:18;;19154:98:0::1;16839:341:1::0;19154:98:0::1;19263:11;:25:::0;;;19304:27:::1;::::0;1572:25:1;;;19304:27:0::1;::::0;1560:2:1;1545:18;19304:27:0::1;;;;;;;19079:260:::0;:::o;26512:94::-;26559:14;26593:5;26586:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26512:94;:::o;14935:409::-;15054:11;:18;15015:16;;15048:24;;15044:81;;;15095:11;:18;;-1:-1:-1;15044:81:0;15135:20;15172:11;15178:5;15172:3;:11;:::i;:::-;-1:-1:-1;;;;;15158:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15158:26:0;-1:-1:-1;15135:49:0;-1:-1:-1;15209:5:0;15195:121;15220:3;15216:1;:7;15195:121;;;15258:11;15270:1;15258:14;;;;;;;;:::i;:::-;;;;;;;;;15241:3;15249:5;15245:1;:9;;;;:::i;:::-;15241:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;15299:3;;15195:121;;;-1:-1:-1;15333:3:0;-1:-1:-1;14935:409:0;;;;;:::o;9671:155::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9751:6:::1;9770:2;-1:-1:-1::0;;;;;9762:16:0::1;9786:6;9762:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9750:47;;;9816:1;9808:10;;;::::0;::::1;;9739:87;9671:155:::0;;:::o;27303:600::-;27371:25;;:::i;:::-;27422:473;;;;;;;;-1:-1:-1;27464:13:0;;;:5;:13;;;;;;;:20;;-1:-1:-1;;;;;27464:20:0;27422:473;;27464:20;27517:23;;;27422:473;;;;;;27597:13;;;;;;;:18;;:25;27422:473;;;;;27571:51;;;:::i;:::-;27422:473;;27643:13;;;;:5;27422:473;27643:13;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;27643:18;;27422:473;;27643:18;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27682:5;:13;27688:6;27682:13;;;;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27721:5;:13;27727:6;27721:13;;;;;;;;;;;:18;;27422:473;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27422:473:0;;;-1:-1:-1;;27767:13:0;;;;:5;27422:473;27767:13;;;;;;;:20;;;;27422:473;;;;27812:22;;;;;;27422:473;;;;;;;;;27860:13;;;;;;:23;;;;;27422:473;;;;;;;;-1:-1:-1;27415:480:0;27303:600::o;27911:413::-;27995:27;28052:7;28041:8;28052:7;-1:-1:-1;;;;;28116:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;28077:68;;28171:6;28166:123;28187:3;28183:1;:7;28166:123;;;28222:23;28234:7;;28242:1;28234:10;;;;;;;:::i;:::-;;;;;;;28222:11;:23::i;:::-;28208:8;28217:1;28208:11;;;;;;;;:::i;:::-;;;;;;;;;;:37;28272:3;;28166:123;;;-1:-1:-1;28308:8:0;27911:413;-1:-1:-1;;;;27911:413:0:o;14469:135::-;14529:4;14553:20;;;:12;:20;;;;;;;;:29;;;:43;;-1:-1:-1;;14586:10:0;;;14469:135::o;16014:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26614:94::-;26661:14;26695:5;26688:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26614:94;:::o;23944:2560::-;-1:-1:-1;;;;;;;;;;;;;;;;2377:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2363:27:0;:10;-1:-1:-1;;;;;2363:27:0;;2341:94;;;;-1:-1:-1;;;2341:94:0;;18167:2:1;2341:94:0;;;18149:21:1;18206:2;18186:18;;;18179:30;-1:-1:-1;;;18225:18:1;;;18218:47;18282:18;;2341:94:0;17965:341:1;2341:94:0;-1:-1:-1;;;;;14330:24:0;;24125:14:::1;14330:24:::0;;;:13;:24;;;;;;24217:25:::1;14330:24:::0;24217:14:::1;:25::i;:::-;24314:11:::0;;;:63:::1;;-1:-1:-1::0;24375:1:0::1;24343:13:::0;;;:5:::1;:13;::::0;;;;:20;-1:-1:-1;;;;;24343:20:0::1;:34:::0;24314:63:::1;:111;;;-1:-1:-1::0;24395:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;::::1;;:30;;:22:::0;:30:::1;24314:111;:158;;;-1:-1:-1::0;24442:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18:::1;;:25:::0;:30;24314:158:::1;:228;;;-1:-1:-1::0;24512:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:18:::1;::::0;;::::1;:25:::0;:29:::1;::::0;::::1;:::i;:::-;24489:53:::0;::::1;;24314:228;24296:361;;;24574:50;24593:9;24604:6;24612:11;;24574:50;;;;;;;;;:::i;:::-;;;;;;;;24639:7;9739:87;9671:155:::0;;:::o;24296:361::-:1;24700:13;::::0;;;:5:::1;:13;::::0;;;;:22:::1;::::0;::::1;:29:::0;;-1:-1:-1;;24700:29:0::1;24725:4;24700:29:::0;;::::1;::::0;;;24811:23:::1;::::0;;24700:13;25012:17:::1;:15;:17::i;:::-;24995:34;;25040:14;25057:17;:15;:17::i;:::-;25040:34;;25085:14;25102:17;:15;:17::i;:::-;25158:15;25182:13:::0;;;:5:::1;:13;::::0;;;;:18:::1;;:25:::0;25085:34;;-1:-1:-1;25252:904:0::1;25273:9;25269:13;;:1;:13;25252:904;;;25351:12;25366:14;25351:12:::0;25387:29:::1;::::0;::::1;:11:::0;;25399:5:::1;:1:::0;25403::::1;25399:5;:::i;:::-;25387:18;;;;;;;:::i;:::-;;;;;;;:29;;;;:::i;:::-;25366:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25366:52:0;;;;;::::1;::::0;-1:-1:-1;;25448:14:0::1;::::0;-1:-1:-1;;25469:35:0;::::1;:11:::0;;25482:5:::1;:1:::0;25486::::1;25482:5;:::i;:::-;25481:11;::::0;25491:1:::1;25481:11;:::i;:::-;25469:24;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;25448:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25448:58:0;;;;;::::1;::::0;-1:-1:-1;;25536:14:0::1;::::0;-1:-1:-1;;25557:35:0;::::1;:11:::0;;25570:5:::1;:1:::0;25574::::1;25570:5;:::i;:::-;25569:11;::::0;25579:1:::1;25569:11;:::i;:::-;25557:24;;;;;;;:::i;:::-;;;;;;;:35;;;;:::i;:::-;25536:58;;;;;;;;;;;;;;;;;;;;;;;;;25521:73;;25673:6;25649:5;:13;25655:6;25649:13;;;;;;;;;;;:18;;25668:1;25649:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;25718:6;25694:5;:13;25700:6;25694:13;;;;;;;;;;;:18;;25713:1;25694:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;25763:6;25739:5;:13;25745:6;25739:13;;;;;;;;;;;:18;;25758:1;25739:21;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;:30:::0;;:21;;;;:30:::1;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;25843:14;;::::1;::::0;;:6:::1;:14:::0;;;;;;:22;;::::1;::::0;;;;;;;:30;;::::1;::::0;;;;;;:34;25839:274:::1;;26010:14;::::0;;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;;:22;;::::1;::::0;;;;;;;:30;;::::1;::::0;;;;;;;17509:6:::1;::::0;26010:49;::::1;26008:68;25989:89;;;;25839:274;26139:3;;;;;25285:871;;;25252:904;;;-1:-1:-1::0;26197:13:0::1;::::0;;;:5:::1;:13;::::0;;;;:20:::1;::::0;::::1;:36:::0;;;26287:20;;26324:28:::1;::::0;;::::1;::::0;26273:80:::1;::::0;-1:-1:-1;;;;;26287:20:0::1;::::0;26220:13;;26273::::1;:80::i;:::-;26415:13;::::0;;;:5:::1;:13;::::0;;;;:20;;;26445:23;;::::1;::::0;-1:-1:-1;;;;;26415:20:0;;::::1;::::0;26405:91:::1;::::0;26421:6;;26445:35:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;26405:91;::::0;;19376:25:1;;;19432:2;19417:18;;19410:34;;;;19460:18;;19453:34;;;19364:2;19349:18;26405:91:0::1;;;;;;;24073:2431;;;;;;;23944:2560:::0;;;:::o;14612:315::-;14694:20;14738:7;;-1:-1:-1;;;;;14772:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14772:15:0;;14763:24;;14803:6;14798:122;14819:3;14815:1;:7;14798:122;;;14852:12;:24;14865:7;;14873:1;14865:10;;;;;;;:::i;:::-;;;;;;;14852:24;;;;;;;;;;;;;;;;;;;;;14840:6;14847:1;14840:9;;;;;;;;:::i;:::-;:36;;;:9;;;;;;;;;;;:36;14903:3;;14798:122;;;;14716:211;14612:315;;;;:::o;9517:68::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9564:6:::1;:13:::0;;-1:-1:-1;;9564:13:0::1;9573:4;9564:13;::::0;;9517:68::o;21066:835::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;21298:10:::1;::::0;::::1;;:19;21276:84;;;::::0;-1:-1:-1;;;21276:84:0;;19700:2:1;21276:84:0::1;::::0;::::1;19682:21:1::0;19739:2;19719:18;;;19712:30;-1:-1:-1;;;19758:18:1;;;19751:45;19813:18;;21276:84:0::1;19498:339:1::0;21276:84:0::1;21382:6:::0;21428:20;;::::1;21406:88;;;::::0;-1:-1:-1;;;21406:88:0;;20044:2:1;21406:88:0::1;::::0;::::1;20026:21:1::0;20083:2;20063:18;;;20056:30;-1:-1:-1;;;20102:18:1;;;20095:48;20160:18;;21406:88:0::1;19842:342:1::0;21406:88:0::1;21527:20:::0;;::::1;21505:88;;;::::0;-1:-1:-1;;;21505:88:0;;20391:2:1;21505:88:0::1;::::0;::::1;20373:21:1::0;20430:2;20410:18;;;20403:30;-1:-1:-1;;;20449:18:1;;;20442:48;20507:18;;21505:88:0::1;20189:342:1::0;21505:88:0::1;21626:30:::0;;::::1;21604:103;;;::::0;-1:-1:-1;;;21604:103:0;;20738:2:1;21604:103:0::1;::::0;::::1;20720:21:1::0;20777:2;20757:18;;;20750:30;20816:25;20796:18;;;20789:53;20859:18;;21604:103:0::1;20536:347:1::0;21604:103:0::1;21725:6;21720:174;21741:3;21737:1;:7;21720:174;;;21831:16;;21848:1;21831:19;;;;;;;:::i;:::-;;;;;;;21789:6;:17;21796:6;;21803:1;21796:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:17;;;;;;;;;;;;;;;:28;21807:6;;21814:1;21807:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:28;;;;;;;;;;;;;;;:39;21818:6;;21825:1;21818:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;21789:39;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;21789:39:0;:61;21877:3:::1;;21720:174;;;;21265:636;21066:835:::0;;;;;;;;:::o;8815:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8815:28:0;:::o;20320:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20439:5:::1;20445:12:::0;;20401:11:::1;::::0;;;20445:16:::1;::::0;20460:1:::1;::::0;20445:16:::1;:::i;:::-;20439:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20473:205:0::1;20495:3;20491:7;;:1;:7;;;20473:205;;;20516:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20516:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20597:5:::1;:12:::0;;-1:-1:-1;20568:3:0;;::::1;::::0;20597:5;;20516:25;20597:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20592:17;;:1;:17;;::::0;20588:79:::1;;20642:7;;;;;20588:79;20473:205;;28332:370:::0;28418:14;28456:7;28445:8;28456:7;-1:-1:-1;;;;;28507:16:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28481:42;;28539:6;28534:135;28555:3;28551:1;:7;28534:135;;;28601:23;28613:7;;28621:1;28613:10;;;;;;;:::i;28601:23::-;28590:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;28576:8;28585:1;28576:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;28652:3;;28534:135;;9834:143;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;9915:54:::1;9943:5;9950:10;9962:6;9915:27;:54::i;:::-;9834:143:::0;;:::o;19947:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20066:5:::1;20072:12:::0;;20028:11:::1;::::0;;;20072:16:::1;::::0;20087:1:::1;::::0;20072:16:::1;:::i;:::-;20066:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20100:205:0::1;20122:3;20118:7;;:1;:7;;;20100:205;;;20143:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20143:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20224:5:::1;:12:::0;;-1:-1:-1;20195:3:0;;::::1;::::0;20224:5;;20143:25;20224:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20219:17;;:1;:17;;::::0;20215:79:::1;;20269:7;;;;;20215:79;20100:205;;15987:20:::0;;;;;;;;;;;;26818:104;26891:5;26897:12;;26866:5;;26891;26897:16;;26912:1;;26897:16;:::i;:::-;26891:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;26884:30;;26818:104;:::o;20693:365::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;20812:5:::1;20818:12:::0;;20774:11:::1;::::0;;;20818:16:::1;::::0;20833:1:::1;::::0;20818:16:::1;:::i;:::-;20812:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;::::0;-1:-1:-1;20846:205:0::1;20868:3;20864:7;;:1;:7;;;20846:205;;;20889:17;::::0;;::::1;;::::0;;;:14:::1;:17;::::0;;;;:25;;-1:-1:-1;;20889:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;20970:5:::1;:12:::0;;-1:-1:-1;20941:3:0;;::::1;::::0;20970:5;;20889:25;20970:12;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;20965:17;;:1;:17;;::::0;20961:79:::1;;21015:7;;;;;20961:79;20846:205;;15960:20:::0;;;;;;;;;;;;26930:104;27003:5;27009:12;;26978:5;;27003;27009:16;;27024:1;;27009:16;:::i;28710:933::-;28810:24;;;;;29016:7;;-1:-1:-1;;;;;29051:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29051:18:0;;29041:28;;29109:3;-1:-1:-1;;;;;29095:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29095:18:0;;29080:33;;29153:3;-1:-1:-1;;;;;29139:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29139:18:0;;29124:33;;29195:3;-1:-1:-1;;;;;29181:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29181:18:0;;29168:31;;29233:3;-1:-1:-1;;;;;29222:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29222:15:0;;29210:27;;29255:6;29250:386;29271:3;29267:1;:7;29250:386;;;29305:5;:17;29311:7;;29319:1;29311:10;;;;;;;:::i;:::-;;;;;;;29305:17;;;;;;;;;;;:24;;;;;;;;;;-1:-1:-1;;;;;29305:24:0;29292:7;29300:1;29292:10;;;;;;;;:::i;:::-;;;;;;:37;-1:-1:-1;;;;;29292:37:0;;;-1:-1:-1;;;;;29292:37:0;;;;;29392:5;:17;29398:7;;29406:1;29398:10;;;;;;;:::i;:::-;;;;;;;29392:17;;;;;;;;;;;:22;;:29;;;;29362:5;:17;29368:7;;29376:1;29368:10;;;;;;;:::i;:::-;;;;;;;29362:17;;;;;;;;;;;:27;;;:59;;;;:::i;:::-;29344:12;29357:1;29344:15;;;;;;;;:::i;:::-;;;;;;:77;;;;;29454:5;:17;29460:7;;29468:1;29460:10;;;;;;;:::i;:::-;;;;;;;29454:17;;;;;;;;;;;:24;;;29436:12;29449:1;29436:15;;;;;;;;:::i;:::-;;;;;;:42;;;;;29509:5;:17;29515:7;;29523:1;29515:10;;;;;;;:::i;:::-;;;;;;;29509:17;;;;;;;;;;;:27;;;29493:10;29504:1;29493:13;;;;;;;;:::i;:::-;;;;;;:43;;;;;29566:5;:17;29572:7;;29580:1;29572:10;;;;;;;:::i;:::-;;;;;;;29566:17;;;;;;;;;;;:26;;;;;;;;;;;;29551:9;29561:1;29551:12;;;;;;;;:::i;:::-;:41;;;:12;;;;;;;;;;;:41;29619:3;;29250:386;;;;28994:649;28710:933;;;;;;;;:::o;10549:260::-;10645:6;-1:-1:-1;;;;;2518:20:0;;2528:10;2518:20;2514:182;;2581:36;;-1:-1:-1;;;2581:36:0;;2606:10;2581:36;;;557:51:1;-1:-1:-1;;;;;;;;;;;1963:42:0;2581:24;;530:18:1;;2581:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2555:129;;;;-1:-1:-1;;;2555:129:0;;21372:2:1;2555:129:0;;;21354:21:1;21411:2;21391:18;;;21384:30;21450:33;21430:18;;;21423:61;21501:18;;2555:129:0;21170:355:1;2555:129:0;-1:-1:-1;;;;;;;;;;;;;;;;2777:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;2755:91;;;::::0;-1:-1:-1;;;2755:91:0;;21732:2:1;2755:91:0::1;::::0;::::1;21714:21:1::0;21771:2;21751:18;;;21744:30;-1:-1:-1;;;21790:18:1;;;21783:46;21846:18;;2755:91:0::1;21530:340:1::0;2755:91:0::1;10699:6:::2;::::0;::::2;;10698:7;10676:63;;;::::0;-1:-1:-1;;;10676:63:0;;22077:2:1;10676:63:0::2;::::0;::::2;22059:21:1::0;22116:1;22096:18;;;22089:29;-1:-1:-1;;;22134:18:1;;;22127:36;22180:18;;10676:63:0::2;21875:329:1::0;10676:63:0::2;10774:27;10784:6;10792:8;;10774:9;:27::i;:::-;10549:260:::0;;;;:::o;18974:97::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19042:9:::1;:21:::0;;-1:-1:-1;;19042:21:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;18974:97::o;27042:104::-;27115:5;27121:12;;27090:5;;27115;27121:16;;27136:1;;27121:16;:::i;19347:103::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19397:10:::1;:17:::0;;-1:-1:-1;;19397:17:0::1;19410:4;19397:17;::::0;;19430:12:::1;::::0;::::1;::::0;19397:10:::1;::::0;19430:12:::1;19347:103::o:0;19458:481::-;-1:-1:-1;;;;;;;;;;;;;;;;2083:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2069:29:0;:10;-1:-1:-1;;;;;2069:29:0;;2047:89;;;;-1:-1:-1;;;2047:89:0;;;;;;;:::i;:::-;19637:10:::1;::::0;::::1;;:19;19615:84;;;::::0;-1:-1:-1;;;19615:84:0;;22411:2:1;19615:84:0::1;::::0;::::1;22393:21:1::0;22450:2;22430:18;;;22423:30;-1:-1:-1;;;22469:18:1;;;22462:45;22524:18;;19615:84:0::1;22209:339:1::0;19615:84:0::1;19732:30:::0;;::::1;:77:::0;::::1;;;-1:-1:-1::0;19779:30:0;;::::1;19732:77;19710:146;;;::::0;-1:-1:-1;;;19710:146:0;;22755:2:1;19710:146:0::1;::::0;::::1;22737:21:1::0;22794:2;22774:18;;;22767:30;-1:-1:-1;;;22813:18:1;;;22806:49;22872:18;;19710:146:0::1;22553:343:1::0;19710:146:0::1;19867:14;:5;19875:6:::0;;19867:14:::1;:::i;:::-;-1:-1:-1::0;19892:14:0::1;:5;19900:6:::0;;19892:14:::1;:::i;:::-;-1:-1:-1::0;19917:14:0::1;:5;19925:6:::0;;19917:14:::1;:::i;:::-;;19458:481:::0;;;;;;:::o;10331:105::-;10373:7;-1:-1:-1;;;;;;;;;;;;;;;;10405:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10400:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26716:94::-;26763:14;26797:5;26790:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26716:94;:::o;14000:224::-;-1:-1:-1;;;;;;;;;;;;;;;;14106:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;14099:45:0;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;14192:24:0;;;;;:13;:24;;;;;14185:31;14000:224::o;10904:1941::-;11016:17;;11012:1824;;11125:14;11108:13;:31;11104:1552;;-1:-1:-1;;;;;;;;;;;;;;;;11495:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11481:145;;-1:-1:-1;;;11481:145:0;;11571:7;11481:145;;;23264:25:1;-1:-1:-1;;;;;23325:32:1;;;23305:18;;;23298:60;11481:44:0;;;;;;;11533:14;;23237:18:1;;11481:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11686:17;11722:14;11706:13;:30;;;;:::i;:::-;11686:50;-1:-1:-1;11759:13:0;;11755:175;;-1:-1:-1;;;;;;;;;;;;;;;;11859:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11852:58;;-1:-1:-1;;;11852:58:0;;11883:7;11852:58;;;23571:25:1;-1:-1:-1;;;;;23632:32:1;;;23612:18;;;23605:60;23681:18;;;23674:34;;;11852:30:0;;;;;;;23544:18:1;;11852:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11141:822;9739:87:::1;9671:155:::0;;:::o;11104:1552::-;-1:-1:-1;;;;;;;;;;;;;;;;12242:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12228:144;;-1:-1:-1;;;12228:144:0;;12317:7;12228:144;;;23264:25:1;-1:-1:-1;;;;;23325:32:1;;;23305:18;;;23298:60;12228:44:0;;;;;;;12280:13;;23237:18:1;;12228:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12452:17;12489:13;12472:14;:30;;;;:::i;:::-;12452:50;;-1:-1:-1;;;;;;;;;;;;;;;;12582:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12575:35:0;;12618:9;12630:7;12575:63;;;;;;;;;;;;;1572:25:1;;1560:2;1545:18;;1426:177;12575:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11969:687;9739:87:::1;9671:155:::0;;:::o;11012:1824::-;-1:-1:-1;;;;;;;;;;;;;;;;12763:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12756:35:0;;12799:14;12816:7;12756:68;;;;;;;;;;;;;1572:25:1;;1560:2;1545:18;;1426:177;12756:68:0;;;;;;;;;;;;;;;;;;;;656:449;888:45;;;-1:-1:-1;;;;;23911:32:1;;;888:45:0;;;23893:51:1;23960:18;;;;23953:34;;;888:45:0;;;;;;;;;;23866:18:1;;;;888:45:0;;;;;;;-1:-1:-1;;;;;888:45:0;-1:-1:-1;;;888:45:0;;;877:57;;-1:-1:-1;;;;877:10:0;;;;:57;;888:45;877:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;841:93;;;;967:7;:57;;;;-1:-1:-1;979:11:0;;:16;;:44;;;1010:4;999:24;;;;;;;;;;;;:::i;:::-;945:152;;;;-1:-1:-1;;;945:152:0;;24492:2:1;945:152:0;;;24474:21:1;24531:2;24511:18;;;24504:30;24570:34;24550:18;;;24543:62;-1:-1:-1;;;24621:18:1;;;24614:43;24674:19;;945:152:0;24290:409:1;945:152:0;763:342;;656:449;;;:::o;21946:1924::-;22067:14;22084:11;:9;:11::i;:::-;22067:28;-1:-1:-1;22152:14:0;;;;22272:56;;;;22283:8;22272:56;:::i;:::-;22137:191;;;;;;;;22404:6;22391:9;:19;;22369:84;;;;-1:-1:-1;;;22369:84:0;;25425:2:1;22369:84:0;;;25407:21:1;25464:2;25444:18;;;25437:30;-1:-1:-1;;;25483:18:1;;;25476:45;25538:18;;22369:84:0;25223:339:1;22369:84:0;22486:21;22500:6;22486:13;:21::i;:::-;:29;;22511:4;22486:29;22464:99;;;;-1:-1:-1;;;22464:99:0;;25769:2:1;22464:99:0;;;25751:21:1;25808:2;25788:18;;;25781:30;-1:-1:-1;;;25827:18:1;;;25820:50;25887:18;;22464:99:0;25567:344:1;22464:99:0;22607:1;22596:8;:12;;;:37;;;;-1:-1:-1;22624:9:0;;;;;;22612:21;;;;;22596:37;22574:105;;;;-1:-1:-1;;;22574:105:0;;26118:2:1;22574:105:0;;;26100:21:1;26157:2;26137:18;;;26130:30;-1:-1:-1;;;26176:18:1;;;26169:48;26234:18;;22574:105:0;25916:342:1;22574:105:0;22731:22;22756:18;22768:6;22756:9;:18;:::i;:::-;22731:43;-1:-1:-1;22824:24:0;22851:26;;;;22731:43;22851:26;:::i;:::-;22824:53;;22938:25;17509:6;22985:11;;22968:14;:28;;;;:::i;:::-;22966:47;;;;:::i;:::-;22938:75;;23090:43;23102:17;23121:3;23126:6;23090:11;:43::i;:::-;23173:13;;;;:5;:13;;;;;:29;;-1:-1:-1;;;;;;23173:29:0;-1:-1:-1;;;;;23173:29:0;;;;;-1:-1:-1;23213:23:0;:42;;;23297:34;23314:17;23297:14;:34;:::i;:::-;23266:13;;;;:5;:13;;;;;:28;;:65;23363:21;;;-1:-1:-1;;;;;23363:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23363:21:0;;23342:5;:13;23348:6;23342:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;;23428:8;23416:21;;-1:-1:-1;;;;;23416:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23416:21:0;;23395:5;:13;23401:6;23395:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;;23481:8;23469:21;;-1:-1:-1;;;;;23469:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23469:21:0;;23448:5;:13;23454:6;23448:13;;;;;;;;;;;:18;;:42;;;;;;;;;;;;:::i;:::-;-1:-1:-1;23501:13:0;;;;:5;:13;;;;;23527:15;23501:23;;;;:41;23584:31;23600:6;23507;23584:15;:31::i;:::-;23653:36;23666:6;23674:14;23653:12;:36::i;:::-;23750:6;-1:-1:-1;;;;;23738:27:0;;23758:6;23738:27;;;;1572:25:1;;1560:2;1545:18;;1426:177;23738:27:0;;;;;;;;23810:52;23825:6;23833:12;:8;23844:1;23833:12;:::i;:::-;23847:14;23810;:52::i;:::-;22024:1846;;;;;;;;21946:1924;;;:::o;10147:172::-;-1:-1:-1;;;;;;;;;;;;;;;;10250:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10236:75;;-1:-1:-1;;;10236:75:0;;-1:-1:-1;;;;;26685:32:1;;;10236:75:0;;;26667:51:1;26754:32;;;26734:18;;;26727:60;10236:44:0;;;;;;;10288:9;;26640:18:1;;10236:75:0;26493:300:1;12934:272:0;13042:40;;-1:-1:-1;;;13042:40:0;;-1:-1:-1;;;;;27018:32:1;;;13042:40:0;;;27000:51:1;13066:7:0;27067:18:1;;;27060:34;27110:18;;;27103:34;;;13042:7:0;:15;;;;26973:18:1;;13042:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13136:11:0;:24;;;;;;;;;;;;-1:-1:-1;13171:20:0;;;:12;13136:24;13171:20;;;;;:27;;-1:-1:-1;;13171:27:0;;;;;;;-1:-1:-1;;;12934:272:0:o;9985:154::-;-1:-1:-1;;;;;;;;;;;;;;;;10074:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10057:74;;-1:-1:-1;;;10057:74:0;;-1:-1:-1;;;;;27018:32:1;;;10057:74:0;;;27000:51:1;27067:18;;;27060:34;;;10123:7:0;27110:18:1;;;27103:34;10057:51:0;;;;;;;26973:18:1;;10057:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9985:154;;:::o;13214:778::-;13367:16;-1:-1:-1;;;;;;;;;;;;;;;;13391:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13386:33:0;;13427:11;:9;:11::i;:::-;13386:185;;-1:-1:-1;;;;;;13386:185:0;;;;;;;;;;27318:25:1;;;27391:4;27379:17;;27359:18;;;27352:45;27291:18;;13386:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13655:24:0;;;;;;:13;:24;;;;;;13367:204;;-1:-1:-1;13655:29:0;13633:95;;;;-1:-1:-1;;;13633:95:0;;27864:2:1;13633:95:0;;;27846:21:1;27903:2;27883:18;;;27876:30;-1:-1:-1;;;27922:18:1;;;27915:46;27978:18;;13633:95:0;27662:340:1;13633:95:0;-1:-1:-1;;;;;13799:24:0;;;;;;:13;:24;;;;;;;;;:33;;;13882:15;;-1:-1:-1;;;;;;13882:15:0;;;;-1:-1:-1;;;;;;;;;;;1963:42:0;13882:13;;:15;;;;;13799:24;;13882:15;;;;;1963:42;13882:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13875:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13957:27;13977:6;13957:27;;;;1572:25:1;;1560:2;1545:18;;1426:177;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;619:226:1;678:6;731:2;719:9;710:7;706:23;702:32;699:52;;;747:1;744;737:12;699:52;-1:-1:-1;792:23:1;;619:226;-1:-1:-1;619:226:1:o;1608:618::-;1794:2;1806:21;;;1876:13;;1779:18;;;1898:22;;;1746:4;;1977:15;;;1951:2;1936:18;;;1746:4;2020:180;2034:6;2031:1;2028:13;2020:180;;;2099:13;;2114:4;2095:24;2083:37;;2149:2;2175:15;;;;2140:12;;;;2056:1;2049:9;2020:180;;;-1:-1:-1;2217:3:1;;1608:618;-1:-1:-1;;;;;1608:618:1:o;2231:156::-;2297:20;;2357:4;2346:16;;2336:27;;2326:55;;2377:1;2374;2367:12;2326:55;2231:156;;;:::o;2392:182::-;2449:6;2502:2;2490:9;2481:7;2477:23;2473:32;2470:52;;;2518:1;2515;2508:12;2470:52;2541:27;2558:9;2541:27;:::i;:::-;2531:37;2392:182;-1:-1:-1;;;2392:182:1:o;2768:346::-;2836:6;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;-1:-1:-1;;2958:23:1;;;3078:2;3063:18;;;3050:32;;-1:-1:-1;2768:346:1:o;3119:420::-;3172:3;3210:5;3204:12;3237:6;3232:3;3225:19;3269:4;3264:3;3260:14;3253:21;;3308:4;3301:5;3297:16;3331:1;3341:173;3355:6;3352:1;3349:13;3341:173;;;3416:13;;3404:26;;3459:4;3450:14;;;;3487:17;;;;3377:1;3370:9;3341:173;;;-1:-1:-1;3530:3:1;;3119:420;-1:-1:-1;;;;3119:420:1:o;3544:261::-;3723:2;3712:9;3705:21;3686:4;3743:56;3795:2;3784:9;3780:18;3772:6;3743:56;:::i;3810:131::-;-1:-1:-1;;;;;3885:31:1;;3875:42;;3865:70;;3931:1;3928;3921:12;3865:70;3810:131;:::o;3946:367::-;4014:6;4022;4075:2;4063:9;4054:7;4050:23;4046:32;4043:52;;;4091:1;4088;4081:12;4043:52;4130:9;4117:23;4149:31;4174:5;4149:31;:::i;:::-;4199:5;4277:2;4262:18;;;;4249:32;;-1:-1:-1;;;3946:367:1:o;4318:429::-;4369:3;4407:5;4401:12;4434:6;4429:3;4422:19;4466:4;4461:3;4457:14;4450:21;;4505:4;4498:5;4494:16;4528:1;4538:184;4552:6;4549:1;4546:13;4538:184;;;4617:13;;4632:4;4613:24;4601:37;;4667:4;4658:14;;;;4695:17;;;;4574:1;4567:9;4538:184;;4752:1000;4850:12;;-1:-1:-1;;;;;368:31:1;356:44;;4917:4;4910:5;4906:16;4900:23;4893:4;4888:3;4884:14;4877:47;4973:4;4966:5;4962:16;4956:23;4949:4;4944:3;4940:14;4933:47;4813:3;5026:4;5019:5;5015:16;5009:23;5064:6;5057:4;5052:3;5048:14;5041:30;5092:58;5142:6;5137:3;5133:16;5119:12;5092:58;:::i;:::-;5080:70;;5198:4;5191:5;5187:16;5181:23;5246:3;5240:4;5236:14;5229:4;5224:3;5220:14;5213:38;5274:48;5317:4;5301:14;5274:48;:::i;:::-;5260:62;;;5370:4;5363:5;5359:16;5353:23;5420:3;5412:6;5408:16;5401:4;5396:3;5392:14;5385:40;5448:50;5491:6;5475:14;5448:50;:::i;:::-;5434:64;;;5547:4;5540:5;5536:16;5530:23;5523:4;5518:3;5514:14;5507:47;5602:4;5595:5;5591:16;5585:23;5617:47;5658:4;5653:3;5649:14;5633;84:13;77:21;65:34;;14:91;5617:47;;5715:6;5708:5;5704:18;5698:25;5689:6;5684:3;5680:16;5673:51;5740:6;5733:13;;;4752:1000;;;;:::o;5757:291::-;5958:2;5947:9;5940:21;5921:4;5978:64;6038:2;6027:9;6023:18;6015:6;5978:64;:::i;6287:367::-;6350:8;6360:6;6414:3;6407:4;6399:6;6395:17;6391:27;6381:55;;6432:1;6429;6422:12;6381:55;-1:-1:-1;6455:20:1;;-1:-1:-1;;;;;6487:30:1;;6484:50;;;6530:1;6527;6520:12;6484:50;6567:4;6559:6;6555:17;6543:29;;6627:3;6620:4;6610:6;6607:1;6603:14;6595:6;6591:27;6587:38;6584:47;6581:67;;;6644:1;6641;6634:12;6581:67;6287:367;;;;;:::o;6659:437::-;6745:6;6753;6806:2;6794:9;6785:7;6781:23;6777:32;6774:52;;;6822:1;6819;6812:12;6774:52;6862:9;6849:23;-1:-1:-1;;;;;6887:6:1;6884:30;6881:50;;;6927:1;6924;6917:12;6881:50;6966:70;7028:7;7019:6;7008:9;7004:22;6966:70;:::i;:::-;7055:8;;6940:96;;-1:-1:-1;6659:437:1;-1:-1:-1;;;;6659:437:1:o;7101:853::-;7315:4;7363:2;7352:9;7348:18;7393:2;7382:9;7375:21;7416:6;7451;7445:13;7482:6;7474;7467:22;7520:2;7509:9;7505:18;7498:25;;7582:2;7572:6;7569:1;7565:14;7554:9;7550:30;7546:39;7532:53;;7620:2;7612:6;7608:15;7641:1;7651:274;7665:6;7662:1;7659:13;7651:274;;;7758:2;7754:7;7742:9;7734:6;7730:22;7726:36;7721:3;7714:49;7786:59;7838:6;7829;7823:13;7786:59;:::i;:::-;7776:69;-1:-1:-1;7880:2:1;7903:12;;;;7868:15;;;;;7687:1;7680:9;7651:274;;;-1:-1:-1;7942:6:1;;7101:853;-1:-1:-1;;;;;;7101:853:1:o;7959:129::-;-1:-1:-1;;;;;8037:5:1;8033:30;8026:5;8023:41;8013:69;;8078:1;8075;8068:12;8093:570;8187:6;8195;8203;8256:2;8244:9;8235:7;8231:23;8227:32;8224:52;;;8272:1;8269;8262:12;8224:52;8311:9;8298:23;8330:30;8354:5;8330:30;:::i;:::-;8379:5;-1:-1:-1;8435:2:1;8420:18;;8407:32;-1:-1:-1;;;;;8451:30:1;;8448:50;;;8494:1;8491;8484:12;8448:50;8533:70;8595:7;8586:6;8575:9;8571:22;8533:70;:::i;:::-;8093:570;;8622:8;;-1:-1:-1;8507:96:1;;-1:-1:-1;;;;8093:570:1:o;8668:433::-;8718:3;8756:5;8750:12;8783:6;8778:3;8771:19;8815:4;8810:3;8806:14;8799:21;;8854:4;8847:5;8843:16;8877:1;8887:189;8901:6;8898:1;8895:13;8887:189;;;8976:13;;8969:21;8962:29;8950:42;;9021:4;9012:14;;;;9049:17;;;;8923:1;8916:9;8887:189;;9106:252;9279:2;9268:9;9261:21;9242:4;9299:53;9348:2;9337:9;9333:18;9325:6;9299:53;:::i;9363:1425::-;9551:6;9559;9567;9575;9583;9591;9599;9607;9660:3;9648:9;9639:7;9635:23;9631:33;9628:53;;;9677:1;9674;9667:12;9628:53;9717:9;9704:23;-1:-1:-1;;;;;9742:6:1;9739:30;9736:50;;;9782:1;9779;9772:12;9736:50;9821:70;9883:7;9874:6;9863:9;9859:22;9821:70;:::i;:::-;9910:8;;-1:-1:-1;9795:96:1;-1:-1:-1;;9998:2:1;9983:18;;9970:32;-1:-1:-1;;;;;10014:32:1;;10011:52;;;10059:1;10056;10049:12;10011:52;10098:72;10162:7;10151:8;10140:9;10136:24;10098:72;:::i;:::-;10189:8;;-1:-1:-1;10072:98:1;-1:-1:-1;;10277:2:1;10262:18;;10249:32;-1:-1:-1;;;;;10293:32:1;;10290:52;;;10338:1;10335;10328:12;10290:52;10377:72;10441:7;10430:8;10419:9;10415:24;10377:72;:::i;:::-;10468:8;;-1:-1:-1;10351:98:1;-1:-1:-1;;10556:2:1;10541:18;;10528:32;-1:-1:-1;;;;;10572:32:1;;10569:52;;;10617:1;10614;10607:12;10569:52;10656:72;10720:7;10709:8;10698:9;10694:24;10656:72;:::i;:::-;9363:1425;;;;-1:-1:-1;9363:1425:1;;-1:-1:-1;9363:1425:1;;;;;;10747:8;-1:-1:-1;;;9363:1425:1:o;10793:250::-;10878:1;10888:113;10902:6;10899:1;10896:13;10888:113;;;10978:11;;;10972:18;10959:11;;;10952:39;10924:2;10917:10;10888:113;;;-1:-1:-1;;11035:1:1;11017:16;;11010:27;10793:250::o;11048:991::-;11208:4;11256:2;11245:9;11241:18;11286:2;11275:9;11268:21;11309:6;11344;11338:13;11375:6;11367;11360:22;11413:2;11402:9;11398:18;11391:25;;11475:2;11465:6;11462:1;11458:14;11447:9;11443:30;11439:39;11425:53;;11513:2;11505:6;11501:15;11534:1;11544:466;11558:6;11555:1;11552:13;11544:466;;;11651:2;11647:7;11635:9;11627:6;11623:22;11619:36;11614:3;11607:49;11685:6;11679:13;11727:2;11721:9;11758:8;11750:6;11743:24;11780:74;11845:8;11840:2;11832:6;11828:15;11823:2;11819;11815:11;11780:74;:::i;:::-;11920:2;11897:17;-1:-1:-1;;11893:31:1;11881:44;;;;11927:2;11877:53;;;;-1:-1:-1;11988:12:1;;;;11953:15;;;;;11580:1;11573:9;11544:466;;12275:322;12346:6;12354;12362;12415:2;12403:9;12394:7;12390:23;12386:32;12383:52;;;12431:1;12428;12421:12;12383:52;12454:27;12471:9;12454:27;:::i;:::-;12444:37;;12500:36;12532:2;12521:9;12517:18;12500:36;:::i;:::-;12490:46;;12555:36;12587:2;12576:9;12572:18;12555:36;:::i;:::-;12545:46;;12275:322;;;;;:::o;12602:1424::-;13098:3;13111:22;;;13182:13;;13083:19;;;13204:22;;;13050:4;;13296;13284:17;;;13257:3;13242:19;;;13050:4;13329:199;13343:6;13340:1;13337:13;13329:199;;;13408:13;;-1:-1:-1;;;;;13404:39:1;13392:52;;13473:4;13501:17;;;;13464:14;;;;13440:1;13358:9;13329:199;;;13333:3;;13575:9;13570:3;13566:19;13559:4;13548:9;13544:20;13537:49;13609:41;13646:3;13638:6;13609:41;:::i;:::-;13595:55;;;13698:9;13690:6;13686:22;13681:2;13670:9;13666:18;13659:50;13732:44;13769:6;13761;13732:44;:::i;:::-;13718:58;;13824:9;13816:6;13812:22;13807:2;13796:9;13792:18;13785:50;13858:44;13895:6;13887;13858:44;:::i;:::-;13844:58;;13951:9;13943:6;13939:22;13933:3;13922:9;13918:19;13911:51;13979:41;14013:6;14005;13979:41;:::i;:::-;13971:49;12602:1424;-1:-1:-1;;;;;;;;12602:1424:1:o;14031:721::-;14110:6;14118;14126;14179:2;14167:9;14158:7;14154:23;14150:32;14147:52;;;14195:1;14192;14185:12;14147:52;14234:9;14221:23;14253:31;14278:5;14253:31;:::i;:::-;14303:5;-1:-1:-1;14359:2:1;14344:18;;14331:32;-1:-1:-1;;;;;14375:30:1;;14372:50;;;14418:1;14415;14408:12;14372:50;14441:22;;14494:4;14486:13;;14482:27;-1:-1:-1;14472:55:1;;14523:1;14520;14513:12;14472:55;14563:2;14550:16;-1:-1:-1;;;;;14581:6:1;14578:30;14575:50;;;14621:1;14618;14611:12;14575:50;14666:7;14661:2;14652:6;14648:2;14644:15;14640:24;14637:37;14634:57;;;14687:1;14684;14677:12;14634:57;14031:721;;14718:2;14710:11;;;;;-1:-1:-1;14740:6:1;;-1:-1:-1;;;14031:721:1:o;14757:1093::-;14909:6;14917;14925;14933;14941;14949;15002:2;14990:9;14981:7;14977:23;14973:32;14970:52;;;15018:1;15015;15008:12;14970:52;15058:9;15045:23;-1:-1:-1;;;;;15083:6:1;15080:30;15077:50;;;15123:1;15120;15113:12;15077:50;15162:70;15224:7;15215:6;15204:9;15200:22;15162:70;:::i;:::-;15251:8;;-1:-1:-1;15136:96:1;-1:-1:-1;;15339:2:1;15324:18;;15311:32;-1:-1:-1;;;;;15355:32:1;;15352:52;;;15400:1;15397;15390:12;15352:52;15439:72;15503:7;15492:8;15481:9;15477:24;15439:72;:::i;:::-;15530:8;;-1:-1:-1;15413:98:1;-1:-1:-1;;15618:2:1;15603:18;;15590:32;-1:-1:-1;;;;;15634:32:1;;15631:52;;;15679:1;15676;15669:12;15631:52;15718:72;15782:7;15771:8;15760:9;15756:24;15718:72;:::i;:::-;14757:1093;;;;-1:-1:-1;14757:1093:1;;-1:-1:-1;14757:1093:1;;15809:8;;14757:1093;-1:-1:-1;;;14757:1093:1:o;15855:251::-;15925:6;15978:2;15966:9;15957:7;15953:23;15949:32;15946:52;;;15994:1;15991;15984:12;15946:52;16026:9;16020:16;16045:31;16070:5;16045:31;:::i;16111:334::-;16313:2;16295:21;;;16352:2;16332:18;;;16325:30;-1:-1:-1;;;16386:2:1;16371:18;;16364:40;16436:2;16421:18;;16111:334::o;16450:127::-;16511:10;16506:3;16502:20;16499:1;16492:31;16542:4;16539:1;16532:15;16566:4;16563:1;16556:15;16582:127;16643:10;16638:3;16634:20;16631:1;16624:31;16674:4;16671:1;16664:15;16698:4;16695:1;16688:15;16714:120;16754:1;16780;16770:35;;16785:18;;:::i;:::-;-1:-1:-1;16819:9:1;;16714:120::o;17185:128::-;17252:9;;;17273:11;;;17270:37;;;17287:18;;:::i;17318:127::-;17379:10;17374:3;17370:20;17367:1;17360:31;17410:4;17407:1;17400:15;17434:4;17431:1;17424:15;17450:127;17511:10;17506:3;17502:20;17499:1;17492:31;17542:4;17539:1;17532:15;17566:4;17563:1;17556:15;17792:168;17865:9;;;17896;;17913:15;;;17907:22;;17893:37;17883:71;;17934:18;;:::i;18311:611::-;-1:-1:-1;;;;;18555:31:1;;18537:50;;18618:2;18603:18;;18596:34;;;18666:2;18661;18646:18;;18639:30;;;18685:18;;18678:34;;;-1:-1:-1;;;;;;18724:31:1;;18721:51;;;18768:1;18765;18758:12;18721:51;18802:6;18799:1;18795:14;18860:6;18852;18846:3;18835:9;18831:19;18818:49;18888:22;;;;18912:3;18884:32;;18311:611;-1:-1:-1;;;;;18311:611:1:o;18927:112::-;18959:1;18985;18975:35;;18990:18;;:::i;:::-;-1:-1:-1;19024:9:1;;18927:112::o;19044:125::-;19109:9;;;19130:10;;;19127:36;;;19143:18;;:::i;20888:277::-;20955:6;21008:2;20996:9;20987:7;20983:23;20979:32;20976:52;;;21024:1;21021;21014:12;20976:52;21056:9;21050:16;21109:5;21102:13;21095:21;21088:5;21085:32;21075:60;;21131:1;21128;21121:12;22901:184;22971:6;23024:2;23012:9;23003:7;22999:23;22995:32;22992:52;;;23040:1;23037;23030:12;22992:52;-1:-1:-1;23063:16:1;;22901:184;-1:-1:-1;22901:184:1:o;23998:287::-;24127:3;24165:6;24159:13;24181:66;24240:6;24235:3;24228:4;24220:6;24216:17;24181:66;:::i;:::-;24263:16;;;;;23998:287;-1:-1:-1;;23998:287:1:o;24704:514::-;24796:6;24804;24812;24820;24873:3;24861:9;24852:7;24848:23;24844:33;24841:53;;;24890:1;24887;24880:12;24841:53;24935:23;;;-1:-1:-1;25001:36:1;25033:2;25018:18;;25001:36;:::i;:::-;24991:46;;25089:2;25078:9;25074:18;25061:32;25102:33;25127:7;25102:33;:::i;:::-;24704:514;;;;-1:-1:-1;25154:7:1;;25208:2;25193:18;25180:32;;-1:-1:-1;;24704:514:1:o;26263:225::-;26367:4;26346:12;;;26360;;;26342:31;26393:22;;;;26434:24;;;26424:58;;26462:18;;:::i;:::-;26424:58;26263:225;;;;:::o;27408:249::-;27477:6;27530:2;27518:9;27509:7;27505:23;27501:32;27498:52;;;27546:1;27543;27536:12;27498:52;27578:9;27572:16;27597:30;27621:5;27597:30;:::i
Swarm Source
ipfs://5e8743371fed897511ecad57fea6c30eee379dd9761ab3cc9470c08449010353
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.