Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,717 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Train Pet | 8923433 | 8 hrs ago | IN | 0 S | 0.0397227 | ||||
Train Pet | 8923319 | 8 hrs ago | IN | 0 S | 0.04136164 | ||||
Train Pet | 8923243 | 8 hrs ago | IN | 0 S | 0.0213518 | ||||
Train Pet | 8923166 | 8 hrs ago | IN | 0 S | 0.02748709 | ||||
Train Pet | 8787321 | 23 hrs ago | IN | 0 S | 0.0221329 | ||||
Train Pet | 8787252 | 23 hrs ago | IN | 0 S | 0.02125265 | ||||
Train Pet | 8756263 | 27 hrs ago | IN | 0 S | 0.0213487 | ||||
Train Pet | 8756215 | 27 hrs ago | IN | 0 S | 0.02135655 | ||||
Train Pet | 8756101 | 27 hrs ago | IN | 0 S | 0.03055342 | ||||
Open Box | 8756037 | 27 hrs ago | IN | 0 S | 0.0360074 | ||||
Train Pet | 8680260 | 34 hrs ago | IN | 0 S | 0.03178345 | ||||
Train Pet | 8680204 | 34 hrs ago | IN | 0 S | 0.02914376 | ||||
Train Pet | 8680151 | 34 hrs ago | IN | 0 S | 0.03004811 | ||||
Feed Pet | 8658003 | 36 hrs ago | IN | 0 S | 0.03114359 | ||||
Feed Pet | 8657991 | 36 hrs ago | IN | 0 S | 0.02444438 | ||||
Train Pet | 8657906 | 36 hrs ago | IN | 0 S | 0.02212085 | ||||
Train Pet | 8657857 | 36 hrs ago | IN | 0 S | 0.02133745 | ||||
Train Pet | 8657802 | 36 hrs ago | IN | 0 S | 0.0213461 | ||||
Train Pet | 8657767 | 36 hrs ago | IN | 0 S | 0.02134255 | ||||
Feed Pet | 8657686 | 36 hrs ago | IN | 0 S | 0.0211841 | ||||
Feed Pet | 8657638 | 36 hrs ago | IN | 0 S | 0.02107995 | ||||
Open Box | 8656996 | 36 hrs ago | IN | 0 S | 0.05429915 | ||||
Train Pet | 8578022 | 45 hrs ago | IN | 0 S | 0.02125575 | ||||
Train Pet | 8577988 | 45 hrs ago | IN | 0 S | 0.02305604 | ||||
Train Pet | 8577918 | 45 hrs ago | IN | 0 S | 0.0221364 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8388926 | 2 days ago | 32 S | ||||
8388652 | 2 days ago | 24 S | ||||
8388636 | 2 days ago | 16 S | ||||
8385079 | 2 days ago | 8 S | ||||
8370990 | 3 days ago | 8 S | ||||
8358278 | 3 days ago | 8 S | ||||
8357698 | 3 days ago | 8 S | ||||
8353836 | 3 days ago | 8 S | ||||
8352802 | 3 days ago | 120 S | ||||
8352255 | 3 days ago | 112 S | ||||
8351338 | 3 days ago | 104 S | ||||
8350716 | 3 days ago | 96 S | ||||
8350278 | 3 days ago | 88 S | ||||
8344434 | 3 days ago | 32 S | ||||
8344418 | 3 days ago | 24 S | ||||
8344401 | 3 days ago | 16 S | ||||
8344386 | 3 days ago | 8 S | ||||
8335957 | 3 days ago | 8 S | ||||
8332139 | 3 days ago | 80 S | ||||
8331212 | 3 days ago | 72 S | ||||
8329375 | 3 days ago | 64 S | ||||
8328336 | 3 days ago | 56 S | ||||
8326516 | 3 days ago | 8 S | ||||
8324283 | 3 days ago | 15 S | ||||
8321217 | 3 days ago | 48 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FARPG_BasicInteractions
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-14 */ // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: FINALdeployFA/LIB - Common Structs.sol pragma solidity ^0.8.9; library S { //Pet struct struct Unit { uint hp; //unit fainted when hp <= 0 uint attack; //attack - defense = damage on hp uint defense; //attack - defense = damage on hp uint speed; //how frequent to take a move uint intelligence; //how frequent to use skill uint genestrength; //depends on how many duplicates uint range; //range skill, id uint special; //special skill, id } struct Status { uint id; //unit id uint family; //determine which class of gear it can be wore. record while evolve, since its only has max 2 family, example Dragon+phantom, and 30gene max, so can use *100 uint stage; //1 is rookie, 2 is mature, 3 is perfect } struct Time { uint bond; //how many time you took on this unit , use to evolve uint stamina; //how much you can train it per day. it should follow saturation graph uint hunger; //how much you feed it per day. it should follow saturation graph } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: FINALdeployFA/INTERFACE - StorageV2.sol pragma solidity ^0.8.20; // Import your custom structs /** * @title IFARPG_Storage * @dev Interface for FARPG_Storage so other contracts can call it */ interface IFARPG_Storage { //------------------------------------------------------------------------- // Administrative / Master Contract Access //------------------------------------------------------------------------- function owner() external view returns (address); function masterContracts(uint index) external view returns (address); function masterIndex(address) external view returns (uint); function addMasterContract(address _address, uint _index) external; function addMasterContractBatch(address[] memory _addresses, uint[] memory _indices) external; function removeMasterContract(uint _index) external; function getAllMasterContracts() external view returns (address[] memory, uint[] memory); //------------------------------------------------------------------------- // UID Management //------------------------------------------------------------------------- function UIDmain(address) external view returns (uint); function UID_ownedby(uint) external view returns (address); function UIDcounter() external view returns (uint); function getUID(address player) external view returns (uint _UID); function transferUID(address player, address newplayerwallet) external; function registerUID(address player) external; function setUIDmain (address playerAddress, uint UID) external; function setUID_ownedby (uint UID, address playerAddress) external; //------------------------------------------------------------------------- // Quest (setters) //------------------------------------------------------------------------- function setMainQuest(address player, uint index, uint8 progress) external; function setSideQuest(address player, uint index, uint8 progress) external; function setPremiumScore(address player, uint score) external; function setPlayerGeneStrength(address player, uint index, uint strength) external; function setPlayerVitamin(address player, uint index, uint amount) external; //------------------------------------------------------------------------- // Quest (getters) //------------------------------------------------------------------------- function getMainQuestProgress(address player, uint index) external view returns (uint8); function getSideQuestProgress(address player, uint index) external view returns (uint8); function getPremiumScore(address player) external view returns (uint); function getPlayerQuestAndScore(address player, uint index) external view returns (uint, uint, uint); function getMainQuestProgressArray(address player) external view returns (uint8[64] memory); function getSideQuestProgressArray(address player) external view returns (uint8[64] memory); //------------------------------------------------------------------------- // Player Stats (setters) //------------------------------------------------------------------------- function setPersonalWallet(address player, address personal) external; function setGiveControlTo(address player, address web2wallet) external; function setExp(address player, uint experience) external; function setRankScore(address player, uint score) external; function setEnergy1(address player, uint energy) external; function setEnergy2(address player, uint energy) external; function setEnergy22(address player, uint energy) external; function setEnergy3(address player, uint energy) external; function setTeamFormat(address player, uint[60] calldata format) external; function setUsernameToUID(string memory username, uint _UID) external; function setUIDToUsername(uint _UID, string memory username) external; function deleteUsernameToAddress (string memory username) external; // Points function setPoint1(address player, uint point) external; function setPoint2(address player, uint point) external; function setPoint3(address player, uint point) external; function setPoint4(address player, uint point) external; function setPoint5(address player, uint point) external; function addPoint1(address player, uint point) external; function addPoint2(address player, uint point) external; function addPoint3(address player, uint point) external; function addPoint4(address player, uint point) external; function addPoint5(address player, uint point) external; //------------------------------------------------------------------------- // Player Stats (getters) //------------------------------------------------------------------------- function personalwallet(address) external view returns (address); function givecontrolto(address) external view returns (address); function getExperience(address player) external view returns (uint); function getRankingScore(address player) external view returns (uint); function getEnergy1(address player) external view returns (uint); function getEnergy2(address player) external view returns (uint); function getEnergy22(address player) external view returns (uint); function getEnergy3(address player) external view returns (uint); function getPlayerStats(address player) external view returns (uint, uint, uint, uint, uint, uint); function UIDToUsername(uint) external view returns (string memory); function usernameToUID(string memory) external view returns (uint); function getPoint1(address player) external view returns (uint); function getPoint2(address player) external view returns (uint); function getPoint3(address player) external view returns (uint); function getPoint4(address player) external view returns (uint); function getPoint5(address player) external view returns (uint); function getPlayerPoints(address player) external view returns (uint, uint, uint, uint, uint); function getPlayergenestrengthArray(address player) external view returns (uint[50] memory); function getPlayerGeneStrength(address player, uint index) external view returns (uint); function getPlayervitaminArray(address player) external view returns (uint[50] memory); function getPlayerVitamin(address player, uint index) external view returns (uint); //------------------------------------------------------------------------- // Limits (setters) //------------------------------------------------------------------------- function setLimit1(address player, uint limit) external; function setLimit2(address player, uint limit) external; function setLimit3(address player, uint limit) external; function setTimebound1(address player, uint timestamp) external; function setTimebound2(address player, uint timestamp) external; function setTimebound3(address player, uint timestamp) external; //------------------------------------------------------------------------- // Limits (getters) //------------------------------------------------------------------------- function getLimit1(address player) external view returns (uint); function getLimit2(address player) external view returns (uint); function getLimit3(address player) external view returns (uint); function getTimebound1(address player) external view returns (uint); function getTimebound2(address player) external view returns (uint); function getTimebound3(address player) external view returns (uint); function getPlayerLimits(address player) external view returns (uint, uint, uint, uint, uint, uint); //------------------------------------------------------------------------- // Numberset (setters) //------------------------------------------------------------------------- function setNumberSet1(address player, uint[6] memory number) external; function setNumberSet2(address player, uint[5] memory number) external; function setNumberSet3(address player, uint[5] memory number) external; function setNumberSet4(address player, uint[5] memory number) external; function setNumberSet5(address player, uint[5] memory number) external; function setNumberSet6(address player, uint[5] memory number) external; function setNumberSet7(address player, uint[5] memory number) external; function setNumberSet8(address player, uint[5] memory number) external; function setNumberSet9(address player, uint[5] memory number) external; function setNumberSetA(address player, uint[5] memory number) external; function setNumberSetB(address player, uint[5] memory number) external; function setNumberSetC(address player, uint[5] memory number) external; function setNumberSetD(address player, uint[5] memory number) external; function setNumberSetE(address player, uint[10] memory number) external; function setNumberSetF(address player, uint[10] memory number) external; function setNumberSetG(address player, uint[10] memory number) external; function setNumberSetH(address player, uint[10] memory number) external; //------------------------------------------------------------------------- // Numberset (getters) //------------------------------------------------------------------------- function getNumberSet1(address player) external view returns (uint[6] memory); function getNumberSet2(address player) external view returns (uint[5] memory); function getNumberSet3(address player) external view returns (uint[5] memory); function getNumberSet4(address player) external view returns (uint[5] memory); function getNumberSet5(address player) external view returns (uint[5] memory); function getNumberSet6(address player) external view returns (uint[5] memory); function getNumberSet7(address player) external view returns (uint[5] memory); function getNumberSet8(address player) external view returns (uint[5] memory); function getNumberSet9(address player) external view returns (uint[5] memory); function getNumberSetA(address player) external view returns (uint[5] memory); function getNumberSetB(address player) external view returns (uint[5] memory); function getNumberSetC(address player) external view returns (uint[5] memory); function getNumberSetD(address player) external view returns (uint[5] memory); function getNumberSetE(address player) external view returns (uint[10] memory); function getNumberSetF(address player) external view returns (uint[10] memory); function getNumberSetG(address player) external view returns (uint[10] memory); function getNumberSetH(address player) external view returns (uint[10] memory); //------------------------------------------------------------------------- // PVP Ranks //------------------------------------------------------------------------- struct Player { uint256 rankPoints; uint256 league; uint256 indexInLeague; // Index of the player within their league array } function setPlayers(address player, Player memory rankpointleagueindexinleague) external; function setReset_Time_Attempts(address player, uint[2] memory resettimeattemps) external; function setEligible_Opponents(address player, address[5] memory eligibleOppo) external; function setFaught_Opponents(address player, uint[5] memory faughtOppo) external; function setDefending_Formation(address player, uint[3] memory defendingslot) external; function getPlayers(address player) external view returns (Player memory ) ; function getReset_Time_Attempts(address player ) external view returns (uint[2] memory ); function getEligible_Opponents(address player ) external view returns (address[5] memory); function getFaught_Opponents(address player ) external view returns(uint[5] memory) ; function getDefending_Formation(address player) external view returns (uint[3] memory ); //------------------------------------------------------------------------- // Pet data (setters) //------------------------------------------------------------------------- function setPetUnits(address player, uint index, S.Unit memory newUnit) external; function setPetUnitsMaxVitamined(address player, uint index, S.Unit memory newUnit) external; function setPetStatuses(address player, uint index, S.Status memory newStatus) external; function setPetTimes(address player, uint index, S.Time memory newTime) external; //------------------------------------------------------------------------- // Pet data (getters) //------------------------------------------------------------------------- function getPetUnitsAll(address player) external view returns (S.Unit[500] memory); function getPetUnits(address player, uint _index) external view returns (S.Unit memory); function getPetUnitsMaxVitaminedAll(address player) external view returns (S.Unit[500] memory); function getPetUnitsMaxVitamined(address player, uint _index) external view returns (S.Unit memory); function getPetStatusesAll(address player) external view returns (S.Status[500] memory); function getPetStatuses(address player, uint _index) external view returns (S.Status memory); function getPetTimesAll(address player) external view returns (S.Time[500] memory); function getPetTimes(address player, uint _index) external view returns (S.Time memory); //------------------------------------------------------------------------- // Party / Outfit //------------------------------------------------------------------------- function setPartyFormation(address player, uint[30] memory slots) external; function setTrainerOutfitPosition(address player, uint[150] memory outfitIds) external; function getPartyFormation(address player) external view returns (uint[30] memory); function getAllOutfits(address player) external view returns (uint[150] memory); //------------------------------------------------------------------------- // Trainer Gene Infusing //------------------------------------------------------------------------- function setTrainerGeneInfusingGene(address player, uint index, uint value) external; function setTrainerGeneInfusingGeneAll(address player, uint[50] memory newData) external; function setTrainerGeneInfusingTimer(address player, uint index, uint value) external; function setTrainerGeneInfusingTimerAll(address player, uint[50] memory newData) external; function getTrainerGeneInfusingGeneAll(address player) external view returns (uint[50] memory) ; function getTrainerGeneInfusingTimerAll(address player) external view returns (uint[50] memory); function getTrainerGeneInfusingGene(address player, uint Index)external view returns (uint ) ; function getTrainerGeneInfusingTimer(address player, uint Index)external view returns (uint ); //------------------------------------------------------------------------- // Additional Utility //------------------------------------------------------------------------- function getBattleUnit3(address player, uint[3] calldata slots) external view returns (S.Unit[3] memory Units3, uint[3] memory UnitIds); function getSlotUnitMore(address player, uint startindex, uint stopindex) external view returns (S.Unit[] memory Units, uint[] memory UnitIds); function getTeamFormat(address _addr) external view returns (uint[60] memory); //------------------------------------------------------------------------- // Weather System //------------------------------------------------------------------------- function getWeatherUnity() external view returns (uint _weather, uint _daylight, uint _blocktime); function getWeatherBattle(uint _timenow) external view returns (uint _weather); function setWeatherConstants(uint[12] memory _weatherIndices) external; function getWeatherIndexConstants() external view returns (uint[] memory); } // File: FINALdeployFA/PUBLIC - Basic Interactions V1.sol pragma solidity ^0.8.19; //_______________________________________________________________ // ___ __ __ _ ___ _ ___ _ __ // | _ )\ \ / / _ | | / _ \ _ | | / _ \ (_)\ \ // | _ \ \ V / | || || (_) || || || (_) | _ | | // |___/ |_| \__/ \___/ \__/ \___/ ( ) | | // |/ /_/ //_______________________________________________________________ // Interface for accessing Storage //------------------------------------------------------------------- // _____ _ _ _______ ______ _____ ______ _____ ______ // |_ _| \ | |__ __| ____| __ \| ____/\ / ____| ____| // | | | \| | | | | |__ | |__) | |__ / \ | | | |__ // | | | . ` | | | | __| | _ /| __/ /\ \| | | __| // _| |_| |\ | | | | |____| | \ \| | / ____ \ |____| |____ // |_____|_| \_| |_| |______|_| \_\_|/_/ \_\_____|______| // //------------------------------------------------------------------- interface FARPG_RAMInterface { // Read functions struct TrainerData { uint gene; uint[50] genestrength; uint hashed; } function genetoid_mapping(uint trainergene) external pure returns (uint); function petunitsmax(uint id) external pure returns (S.Unit calldata); function petunitsevolveid(S.Status calldata _status, S.Unit calldata _Unit, TrainerData calldata _trainerData) external pure returns (S.Status memory , uint ); } contract FARPG_BasicInteractions is Ownable, ReentrancyGuard { IFARPG_Storage public contractStorage; FARPG_RAMInterface public contractRAM; constructor() { } event StatChangedResult(S.Unit AfterUnit, S.Status AfterStatus, S.Time AfterTime); //------------------------------------------------------------------- // _____ _ ____ ____ _ __ __ // / ____| | / __ \| _ \ /\ | | \ \ / / // | | __| | | | | | |_) | / \ | | \ \ / / // | | |_ | | | | | | _ < / /\ \ | | \ \/ / // | |__| | |___| |__| | |_) / ____ \| |____ \ / _ // \_____|______\____/|____/_/ \_\______| \/ (_) // //------------------------------------------------------------------- uint public PRICE_TOOPENBOX = 8 ether; //Default 8S .openbox for 1st one in 24hr is free, next will be this PRICE, and 2x, 3x, and so on. uint public PRICE_EXPANDSLOT = 5 ether; //Default 5S.fixed for each attemps to expand 1 slot uint public TIME_BOXLIMITRESET = 24 hours; //0th box opened until next TIME, the limit is reset, and can open 0th box again for free. S.Unit[500] public petunitsMAX; uint public TIME_INITIALSTAMINA = 24 hours; //initial stamina uint public TIME_INITIALENDURANCE = 3 hours; //initial endurance/hunger uint public REENTRANT_TIMELIMIT = 2 seconds; // default 2 seconds. means u cannot run the nonreentrant functions >1 time within 3 seconds. uint public PET_STAMINA_MAX = 24 hours; //maximum stamina even rested for so long uint public PET_HUNGER_MAX = 24 hours; // if a pet left for very long time. the MAX hunger should be... uint public ROOKIETOMATURE_BOND = 35 hours; uint public MATURETOPERFECT_BOND = 81 hours; // on evolved, you gain max stamina and initial hunger again, means 45hours again. mapping (address => uint) private reentrant_time; //--------------------------------------------------------- // _____ __ __ _____ _ _ // /\ | __ \| \/ |_ _| \ | | // / \ | | | | \ / | | | | \| | // / /\ \ | | | | |\/| | | | | . ` | // / ____ \| |__| | | | |_| |_| |\ | // /_/ \_\_____/|_| |_|_____|_| \_| // //--------------------------------------------------------- address public treasury = msg.sender; //default function updateTreasury(address _newTreasury) external onlyOwner { require(_newTreasury != address(0), "Invalid treasury address"); treasury = _newTreasury; } function updateStorageContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractStorage = IFARPG_Storage(_newContractAAddress); } function updateRAMContractAAddress(address _newContractAAddress) external onlyOwner { require(_newContractAAddress != address(0), "Invalid address"); contractRAM = FARPG_RAMInterface(_newContractAAddress); } function withdraw() external onlyOwner { // Function to withdraw all balance from the contract for revenue require(address(this).balance > 0, "Contract balance is zero"); payable(treasury).transfer(address(this).balance); } //------------ game setting ------------- function setPriceToOpenBox(uint _newPrice) external onlyOwner { PRICE_TOOPENBOX = _newPrice; } function setPriceExpandSlot(uint _newPrice) external onlyOwner { PRICE_EXPANDSLOT = _newPrice; } function setTimeBoxLimitReset(uint _newTime) external onlyOwner { TIME_BOXLIMITRESET = _newTime; } function setTimeInitialStamina(uint _newTime) external onlyOwner { TIME_INITIALSTAMINA = _newTime; } function setTimeInitialEndurance(uint _newTime) external onlyOwner { TIME_INITIALENDURANCE = _newTime; } function setReentrantTimeLimit(uint _newLimit) external onlyOwner { REENTRANT_TIMELIMIT = _newLimit; } function setPetStaminaMax(uint _newMax) external onlyOwner { PET_STAMINA_MAX = _newMax; } function setPetHungerMax(uint _newMax) external onlyOwner { PET_HUNGER_MAX = _newMax; } function setRookieToMatureBond(uint _newBond) external onlyOwner { ROOKIETOMATURE_BOND = _newBond; } function setMatureToPerfectBond(uint _newBond) external onlyOwner { MATURETOPERFECT_BOND = _newBond; } //--------------------------------------------------------- // // _____ _______ _____ _______ // / ____|__ __|/\ | __ \__ __| // | (___ | | / \ | |__) | | | // \___ \ | | / /\ \ | _ / | | // ____) | | |/ ____ \| | \ \ | | // |_____/ |_/_/ \_\_| \_\ |_| // //--------------------------------------------------------- //--------- sub functions --------------- function accountAddressToProceed() public view returns (address) { // Ready for account abstraction // If the player doesn't provide a personal wallet, all data will be recorded in the trainer wallet address playerAddress = contractStorage.personalwallet(msg.sender); if (playerAddress == address(0)) { return msg.sender; } else { return playerAddress; } } function forwardEtherToTreasury() internal { require(treasury != address(0), "Treasury address not set"); (bool sent, ) = treasury.call{value: msg.value}(""); require(sent, "Failed to forward Ether to treasury"); } function openBoxIn24Hr_paid() public view returns (uint boxOpened, uint remainingTimeReset_s, uint pricePerBox) { address playerAddress = accountAddressToProceed(); uint timeElapsed = block.timestamp - contractStorage.getTimebound1(playerAddress); if (timeElapsed >= 24 hours) { //over the TIME limit for 0th box open boxOpened = 0; remainingTimeReset_s = 0; } else { //still within TIME limit since last 0th box opened boxOpened = contractStorage.getLimit1(playerAddress); remainingTimeReset_s = 24 hours - timeElapsed; pricePerBox = PRICE_TOOPENBOX*boxOpened; } } function subtract(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } function slotLimit_expansionCost(uint number_expansionrequest) public view returns (uint slotLimit, uint expansionCost) { address playerAddress = accountAddressToProceed(); slotLimit = contractStorage.getLimit2(playerAddress); require (number_expansionrequest + slotLimit < 499); //499 used as empty, so expanded to 498 only expansionCost = PRICE_EXPANDSLOT*number_expansionrequest; } function petTiming(uint slot) public view returns (uint bond, uint stamina, uint endurance) { //for front end only address playerAddress = accountAddressToProceed(); S.Time memory pettimes = contractStorage.getPetTimes(playerAddress,slot); bond = pettimes.bond; uint _timenow = block.timestamp; if (_timenow - pettimes.stamina > PET_STAMINA_MAX) { stamina = PET_STAMINA_MAX; } else { stamina = _timenow- pettimes.stamina; } if (pettimes.hunger < _timenow) { endurance = 0; } else if (pettimes.hunger - _timenow < PET_HUNGER_MAX) { endurance = pettimes.hunger - _timenow; } else { endurance = PET_HUNGER_MAX; } } modifier onlyEOA() { require(!isContract(msg.sender), "Smart contracts not allowed"); _; } function noneReentrant_time(address player) internal { require(block.timestamp - reentrant_time[player] >= REENTRANT_TIMELIMIT,"Non-Reentrant, slow down TX attempts."); reentrant_time[player] = block.timestamp; } function isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } /////////////////////////////////////// OPEN BOX ////////////////////////////////////////////////////////////////// function openBox(uint slot, uint trainergene) public payable nonReentrant { address playerAddress = accountAddressToProceed(); uint limit2 = contractStorage.getLimit2(playerAddress); //limit2 is slot limit uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,trainergene); uint _timenow = block.timestamp; //check to see the chosen slot has occupied or exceed the slotlimit S.Status memory _petstatus = contractStorage.getPetStatuses(playerAddress, slot); noneReentrant_time(playerAddress); //prevent spam if (limit2 == 0) { limit2 = 5; contractStorage.setLimit2(playerAddress, limit2); //initialize for the limit2 since its a new player } require(slot < limit2, "Chosen slot exceeds limit."); require(_petstatus.id == 0, "Chosen slot is occupied."); require(genestrength > 0, "Don't have the gene."); (uint openedBox, uint remainingTimeReset, uint priceperbox) = openBoxIn24Hr_paid(); // drop the opened box memory, do not need it if (remainingTimeReset == 0) { // means player can start to openbox for free //...openbox in next sequence //then set the limit to 1 contractStorage.setLimit1(playerAddress, 1); contractStorage.setTimebound1(playerAddress, block.timestamp); } else { //means taken up the free chances, so need to pay if want to open box require(msg.value == priceperbox, "Insufficient payment to open the box"); //...openbox in next sequence //then increase the limit, do not need to reset the timebound contractStorage.setLimit1(playerAddress, openedBox+1); } S.Unit memory _petunit = S.Unit({ hp: 1000, attack: 100, defense: 50, speed: 100, intelligence: 100, genestrength: genestrength, range: 0, special: 0}); _petstatus = S.Status({id: contractRAM.genetoid_mapping(trainergene), family: trainergene + 1 , stage: 1}); S.Time memory _pettime = S.Time({bond: 0, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetUnits(playerAddress, slot ,_petunit); contractStorage.setPetStatuses(playerAddress,slot , _petstatus); contractStorage.setPetTimes(playerAddress, slot ,_pettime); contractStorage.setPetUnitsMaxVitamined(playerAddress, slot ,contractRAM.petunitsmax(_petstatus.id)); //***//** evolve set bit based on ID/////////////// // Function to set the bit corresponding to the ID uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << (_petstatus.id%10000));//do not minus 1 bit as no shinning contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// if (msg.value > 0) { forwardEtherToTreasury(); } emit StatChangedResult(_petunit,_petstatus,_pettime); } /////////////////////////////////////// EXPAND SLOT ////////////////////////////////////////////////////////////////// function expandSlot(uint numberOfexpansion) public payable nonReentrant { address playerAddress = accountAddressToProceed(); // the slotLimit_expansionCost declare view function above has checked the request expansion slot is no more than 500 hard limit (uint slotlimit, uint expansionCost) = slotLimit_expansionCost(numberOfexpansion); require(msg.value == expansionCost, "Insufficient payment to expand"); contractStorage.setLimit2(playerAddress, slotlimit+numberOfexpansion); //confirmed payment, then expand slot forwardEtherToTreasury(); } /////////////////////////////////////// FEED PET ////////////////////////////////////////////////////////////////// struct PetData { //resolve stack too deep S.Status petstatuses; S.Unit petunits; S.Time pettimes; S.Unit petunitsmax; } function UnitUpdateStats(S.Unit memory petunits, S.Unit memory petunitsmax , uint stats_type, uint rate) internal pure returns (S.Unit memory petunitsout){ //************* rate in 100% = 1000 *********** petunitsout = petunits; if (stats_type == 0) { //hp if (petunitsmax.hp > petunits.hp) { //no overflow petunitsout.hp = petunits.hp + ((petunitsmax.hp - petunits.hp)*rate)/1000; } else {petunitsout.hp = petunitsmax.hp;} } else if (stats_type == 1) { // atk if (petunitsmax.attack > petunits.attack) { //no overflow petunitsout.attack = petunits.attack + ((petunitsmax.attack - petunits.attack)*rate)/1000; } else {petunitsout.attack = petunitsmax.attack;} } else if (stats_type == 2) { // def if (petunitsmax.defense > petunits.defense) { //no overflow petunitsout.defense = petunits.defense + ((petunitsmax.defense - petunits.defense)*rate)/1000; } else {petunitsout.defense = petunitsmax.defense;} } else if (stats_type == 3) { // spd if (petunitsmax.speed > petunits.speed) { //no overflow petunitsout.speed = petunits.speed + ((petunitsmax.speed - petunits.speed)*rate)/1000; } else {petunitsout.speed = petunitsmax.speed;} } else if (stats_type == 4) { // int if (petunitsmax.intelligence > petunits.intelligence) { //no overflow petunitsout.intelligence = petunits.intelligence + ((petunitsmax.intelligence - petunits.intelligence)*rate)/1000; } else {petunitsout.intelligence = petunitsmax.intelligence;} } } function feedPet(uint _slot, uint _foodtype, uint _trainergene) public onlyEOA nonReentrant { address playerAddress = accountAddressToProceed(); uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene); //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer require(genestrength > 0, "Don't have the gene."); require(_foodtype <= 10, "Wrong Food type"); //} PetData memory Lings; Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot); Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot); Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot); Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot); uint _exp = contractStorage.getExperience(playerAddress); uint _full; //determine how full is the food after eaten in time uint _partialstat; // partial stat gain only. 100% = 10000 uint _timenow = block.timestamp; noneReentrant_time(playerAddress); //prevent spam require (Lings.petstatuses.id != 0, "empty slot"); if (_foodtype==0){_full = 6 hours;} //backpack food else if (_foodtype==1){_full = 12 hours; } //shop1 else if (_foodtype==2){_full = 10 hours; } else if (_foodtype==3){_full = 10 hours; } else if (_foodtype==4){_full = 11 hours; } //shop1.1 else if (_foodtype==5){_full = 11 hours; } else if (_foodtype==6){_full = 24 hours; } //shop2 else if (_foodtype==7){_full = 24 hours; } else if (_foodtype==8){_full = 24 hours; } else if (_foodtype==9){_full = 24 hours; } //shop2.2 else if (_foodtype==10){_full = 24 hours; } if (Lings.pettimes.hunger < _timenow) { //super hungry, endurance = 0 Lings.pettimes.bond = Lings.pettimes.bond + _full; _exp += _full; Lings.pettimes.hunger = _timenow + _full; _partialstat= 10; // 100% = 10 } else if (Lings.pettimes.hunger - _timenow + _full> PET_HUNGER_MAX) { //over feed, gain partial stat uint fullhittingcap = (PET_HUNGER_MAX- (Lings.pettimes.hunger - _timenow)); Lings.pettimes.bond = Lings.pettimes.bond + fullhittingcap; _exp += fullhittingcap; _partialstat = (fullhittingcap*10)/ (_full); //100 = 1 = 100% (upscale 2 0) //this has to run last otherwise alter the hunger variable for above Lings.pettimes.hunger = _timenow + PET_HUNGER_MAX; } else { //no over feed. stat gain all Lings.pettimes.bond = Lings.pettimes.bond + _full; _exp += _full; Lings.pettimes.hunger = Lings.pettimes.hunger + _full; _partialstat= 10; // 100% = 10 } if (_foodtype==0){} //backpack food else if (_foodtype==1){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,10*_partialstat);} //hp + 10% //shop1 else if (_foodtype==2){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,5*_partialstat);} //atk + 5% else if (_foodtype==3){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,5*_partialstat);} //def + 5% else if (_foodtype==4){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,5*_partialstat);} //spd + 5% //shop1.1 else if (_foodtype==5){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,5*_partialstat);} //int + 5% else if (_foodtype==6){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,19*_partialstat);} //hp + 19% //shop2 else if (_foodtype==7){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,11*_partialstat);} //atk + 11% else if (_foodtype==8){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,11*_partialstat);} //def + 11% else if (_foodtype==9){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,11*_partialstat);} //spd + 11% //shop2.2 else if (_foodtype==10){Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,11*_partialstat);} //int + 11% //*************** check evolve ************** if ((Lings.petstatuses.stage == 1 && Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature (Lings.petstatuses.stage == 2 && Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect //evolve id and maxstats //this need from RAM as update each patch FARPG_RAMInterface.TrainerData memory _trainerdata; _trainerdata.gene = _trainergene; _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress); _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao))); uint compiledGenestrength; (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata); contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage //ONCE evolve you gain Stamina and Endurance Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger Lings.petunitsmax = contractRAM.petunitsmax(Lings.petstatuses.id); //use new id to get max stat, no genestrength and skills yet contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot, Lings.petunitsmax); //evolve gain all stats by 30% Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300); if (Lings.petstatuses.stage == 2) {//evolved into Mature Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.range = Lings.petstatuses.id - 10001; } else { Lings.petunits.range = Lings.petstatuses.id - 1; } } if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change. Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.special = Lings.petstatuses.id - 10001; } else { Lings.petunits.special = Lings.petstatuses.id - 1; } } contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills) uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); } //************** check evolve end ****************** contractStorage.setExp(playerAddress, _exp); emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes); } /////////////////////////////////////// TRAIN PET ////////////////////////////////////////////////////////////////// function trainPet(uint _slot, uint _traintype, uint _trainergene) public onlyEOA nonReentrant { address playerAddress = accountAddressToProceed(); uint _exp = contractStorage.getExperience(playerAddress); uint genestrength = contractStorage.getPlayerGeneStrength(playerAddress,_trainergene); //if (_trainergene !=0) { //if the trainer is not default Jojo, then make sure this player has different trainer require(genestrength > 0, "Don't have the gene."); require(_traintype <= 24, "Wrong Train type"); //} PetData memory Lings; Lings.petstatuses = contractStorage.getPetStatuses(playerAddress,_slot); Lings.petunits = contractStorage.getPetUnits(playerAddress,_slot); Lings.pettimes = contractStorage.getPetTimes(playerAddress,_slot); Lings.petunitsmax = contractStorage.getPetUnitsMaxVitamined(playerAddress,_slot); uint _effort; //determine how full is the food after eaten in time uint _timenow = block.timestamp; noneReentrant_time(playerAddress); //prevent spam require (Lings.petstatuses.id != 0, "empty slot"); // training percent over iteration function: (max-current)*(1-(1-rate)^iteration) // so i can use this (1-(1-rate)^iteration) to calculate // e.g 1 iteration 7%, with that function 3 iteration suppose to be 19.6% //**************************** since 100% = 1000, 10% = 100 for UnitUpdateStats **** if (_traintype==0){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //basic 1, 0hp / 1atk / 2def/ 3spd / 4int else if (_traintype==1){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==2){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==3){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==4){_effort = 3 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,170); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==5){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==6){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==7){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==8){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==9){_effort = 6 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,311); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==10){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } //after upgrade training ground else if (_traintype==11){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==12){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==13){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==14){_effort = 12 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,525); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==15){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==16){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==17){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==18){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==19){_effort = 18 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,673); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } else if (_traintype==20){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,100); } else if (_traintype==21){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,100); } else if (_traintype==22){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,100); } else if (_traintype==23){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,100); } else if (_traintype==24){_effort = 24 hours; Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,775); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,100); } uint _staminaleft = _timenow - Lings.pettimes.stamina; //staminatime sure lower than timenow. NO WAY staminatime > timenow, really is, then revert require(_staminaleft >= _effort, "Not enough stamina."); if (_staminaleft > PET_STAMINA_MAX) {_staminaleft = PET_STAMINA_MAX;} //capping stamina before spending _staminaleft -= _effort; //remaining stamina Lings.pettimes.stamina = _timenow - _staminaleft; //timenow always larger than staminaleft. Lings.pettimes.bond += _effort; _exp += _effort; //*************** check evolve ************** if ((Lings.petstatuses.stage == 1 && Lings.pettimes.bond > ROOKIETOMATURE_BOND)|| //check if rookie, then to mature (Lings.petstatuses.stage == 2 && Lings.pettimes.bond > MATURETOPERFECT_BOND)) { // check if mature, then to perfect //evolve id and maxstats //this need from RAM as update each patch FARPG_RAMInterface.TrainerData memory _trainerdata; _trainerdata.gene = _trainergene; _trainerdata.genestrength = contractStorage.getPlayergenestrengthArray(playerAddress); _trainerdata.hashed = uint(keccak256(abi.encodePacked(playerAddress,block.timestamp,block.prevrandao))); uint compiledGenestrength; (Lings.petstatuses, compiledGenestrength)= contractRAM.petunitsevolveid(Lings.petstatuses,Lings.petunits, _trainerdata); contractStorage.setPetStatuses(playerAddress,_slot , Lings.petstatuses); //update: ID, family, stage //ONCE evolve you gain Stamina and Endurance Lings.pettimes = S.Time({bond: Lings.pettimes.bond, stamina: _timenow - TIME_INITIALSTAMINA, hunger: _timenow + TIME_INITIALENDURANCE}); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); //update: bond for evolve, stamina, hunger Lings.petunitsmax = contractRAM.petunitsmax(Lings.petstatuses.id); //use new id to get max stat, no genestrength and skills yet contractStorage.setPetUnitsMaxVitamined(playerAddress, _slot, Lings.petunitsmax); //evolve gain all stats by 30% Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,0,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,1,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,2,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,3,300); Lings.petunits=UnitUpdateStats(Lings.petunits,Lings.petunitsmax,4,300); if (Lings.petstatuses.stage == 2) {//evolved into Mature Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.range = Lings.petstatuses.id - 10001; } else { Lings.petunits.range = Lings.petstatuses.id - 1; } } if (Lings.petstatuses.stage == 3) {//**********evolved into Perfect, determine the genestrength, follow the lowest means it wont change. Lings.petstatuses.id += 1; //add 1 to minus 1 back to retain consistent gas. if (Lings.petstatuses.id > 10000) { //if its shinning, normalized it first for skill Lings.petunits.special = Lings.petstatuses.id - 10001; } else { Lings.petunits.special = Lings.petstatuses.id - 1; } } contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); //final write into petUnits (stats, genestrength, skills) uint GENEbit = contractStorage.getPoint2(playerAddress); // Set the bit at the position corresponding to ID GENEbit |= (1 << ((Lings.petstatuses.id-1)%10000));//need to minus 1 bit because of previous add on shinning check contractStorage.setPoint2(playerAddress,GENEbit); //**//***////////////////////////////////////////// } else { //if no evolve, follow back the stamina and hunger, only update Units states and time, Status(ID, Family, stage) no change. contractStorage.setPetUnits(playerAddress, _slot , Lings.petunits); contractStorage.setPetTimes(playerAddress, _slot ,Lings.pettimes); } //************** check evolve end ****************** contractStorage.setExp(playerAddress, _exp); emit StatChangedResult(Lings.petunits,Lings.petstatuses,Lings.pettimes); } ////////////////////////////////////////// REGISTER PLAYER NAME //////////////////////////////////////////// event PlayerRegistered(address indexed playerAddress, string username); // Event to log username change event UsernameChanged(address indexed playerAddress, string oldUsername, string newUsername); uint changeNameCost = 1*10**16; //default 0.01 S to prevent spam register all name function registerUsername(string memory _username) public payable nonReentrant { require(msg.value == changeNameCost, "Insufficient payment to expand"); require(validateUsername(_username), "Invalid username"); address playerAddress = accountAddressToProceed(); uint playerUID = contractStorage.getUID(playerAddress); // Check if this UID is already assigned a username require(bytes(contractStorage.UIDToUsername(playerUID)).length == 0, "Player already has a registered name"); // Check if the desired username is taken require(contractStorage.usernameToUID(_username) == 0, "Username already exists"); // Map UID -> Username contractStorage.setUIDToUsername(playerUID, _username); // Map Username -> UID contractStorage.setUsernameToUID(_username, playerUID); // Emit an event emit PlayerRegistered(msg.sender, _username); } // Function to change player username function changeUsername(string memory _newUsername) public payable nonReentrant { require(msg.value == changeNameCost, "Insufficient payment to expand"); require(validateUsername(_newUsername), "Invalid new username"); address playerAddress = accountAddressToProceed(); // Retrieve caller's UID; must exist uint playerUID = contractStorage.getUID(playerAddress); // Retrieve their old username string memory oldUsername = contractStorage.UIDToUsername(playerUID); // Make sure the new username is free require(contractStorage.usernameToUID(_newUsername) == 0, "New username already exists"); contractStorage.setUIDToUsername(playerUID, _newUsername); contractStorage.setUsernameToUID(_newUsername, playerUID); contractStorage.deleteUsernameToAddress(oldUsername); // Emit event emit UsernameChanged(msg.sender, oldUsername, _newUsername); } // Function to validate the username function validateUsername(string memory _username) internal pure returns (bool) { bytes memory usernameBytes = bytes(_username); if (usernameBytes.length == 0 || usernameBytes.length > 15) { return false; } for (uint i = 0; i < usernameBytes.length; i++) { bytes8 char = usernameBytes[i]; if ( !(char >= '0' && char <= '9') && // 0-9 !(char == '_') && !(char >= 'A' && char <= 'Z') && // A-Z !(char >= 'a' && char <= 'z') // a-z ) { return false; } } return true; } function getUsername() public view returns (string memory) { // Check UID address playerAddress = accountAddressToProceed(); uint uid = contractStorage.UIDmain(playerAddress); return contractStorage.UIDToUsername(uid); } //////////////////////////////////////// SET TEAM FORMATION /////////////////////////////////////////// function changeTeamFormation (uint team, uint[3] calldata format) public nonReentrant { address playerAddress = accountAddressToProceed(); uint[60] memory allformat = contractStorage.getTeamFormat(playerAddress); require (team < 20, "Team 0 to 19 is only available right now."); require (format[0] != format[1] && format[0] != format[2] && format[1] != format[2], "Cannot have same slot on a team"); allformat[team*3]=format[0]; allformat[team*3+1]=format[1]; allformat[team*3+2]=format[2]; contractStorage.setTeamFormat(playerAddress, allformat); } function viewAllTeamFormation() public view returns (uint[60] memory allFormats) { address playerAddress = accountAddressToProceed(); allFormats = contractStorage.getTeamFormat(playerAddress); } //////////////////////////////////////////// READ FUNCTION ///////////////////////////////////////////////////////////////// function readPetStatusesArray(address _player, uint _slot_start, uint _slot_stop) public view returns (S.Status[] memory petstatuses) { uint slotLimit = contractStorage.getLimit2(_player); require(_slot_start <= _slot_stop, "Invalid input: _slot_start needs <= _slot_stop"); require(_slot_stop < slotLimit, "Invalid input: _slot_stop > slotLimit"); uint numElements = _slot_stop - _slot_start + 1; petstatuses = new S.Status[](numElements); for (uint i = 0; i < numElements; i++) { petstatuses[i] = contractStorage.getPetStatuses(_player, _slot_start + i); } } function readPetAllStatsArray(address _player,uint _slot_start,uint _slot_stop) public view returns ( S.Status[] memory petstatuses, S.Unit[] memory petUnits, S.Unit[] memory petUnitsMaxVitamined, S.Time[] memory petTimes) { uint slotLimit = contractStorage.getLimit2(_player); require(_slot_start <= _slot_stop, "Invalid input: _slot_start must be less than or equal to _slot_stop"); require(_slot_stop < slotLimit, "Invalid input: _slot_stop exceeds slotLimit"); uint numElements = _slot_stop - _slot_start + 1; petstatuses = new S.Status[](numElements); petUnits = new S.Unit[](numElements); petUnitsMaxVitamined = new S.Unit[](numElements); petTimes = new S.Time[](numElements); for (uint i = 0; i < numElements; i++) { uint currentIndex = _slot_start + i; petstatuses[i] = contractStorage.getPetStatuses(_player, currentIndex); petUnits[i] = contractStorage.getPetUnits(_player, currentIndex); petUnitsMaxVitamined[i] = contractStorage.getPetUnitsMaxVitamined(_player, currentIndex); petTimes[i] = contractStorage.getPetTimes(_player, currentIndex); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"username","type":"string"}],"name":"PlayerRegistered","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"indexed":false,"internalType":"struct S.Unit","name":"AfterUnit","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"indexed":false,"internalType":"struct S.Status","name":"AfterStatus","type":"tuple"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"indexed":false,"internalType":"struct S.Time","name":"AfterTime","type":"tuple"}],"name":"StatChangedResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"playerAddress","type":"address"},{"indexed":false,"internalType":"string","name":"oldUsername","type":"string"},{"indexed":false,"internalType":"string","name":"newUsername","type":"string"}],"name":"UsernameChanged","type":"event"},{"inputs":[],"name":"MATURETOPERFECT_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_HUNGER_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PET_STAMINA_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_EXPANDSLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_TOOPENBOX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REENTRANT_TIMELIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOKIETOMATURE_BOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_BOXLIMITRESET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALENDURANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_INITIALSTAMINA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountAddressToProceed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"team","type":"uint256"},{"internalType":"uint256[3]","name":"format","type":"uint256[3]"}],"name":"changeTeamFormation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUsername","type":"string"}],"name":"changeUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractRAM","outputs":[{"internalType":"contract FARPG_RAMInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractStorage","outputs":[{"internalType":"contract IFARPG_Storage","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfexpansion","type":"uint256"}],"name":"expandSlot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_foodtype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"feedPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUsername","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint256","name":"trainergene","type":"uint256"}],"name":"openBox","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"openBoxIn24Hr_paid","outputs":[{"internalType":"uint256","name":"boxOpened","type":"uint256"},{"internalType":"uint256","name":"remainingTimeReset_s","type":"uint256"},{"internalType":"uint256","name":"pricePerBox","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"petTiming","outputs":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"endurance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"petunitsMAX","outputs":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetAllStatsArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnits","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"hp","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"speed","type":"uint256"},{"internalType":"uint256","name":"intelligence","type":"uint256"},{"internalType":"uint256","name":"genestrength","type":"uint256"},{"internalType":"uint256","name":"range","type":"uint256"},{"internalType":"uint256","name":"special","type":"uint256"}],"internalType":"struct S.Unit[]","name":"petUnitsMaxVitamined","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"bond","type":"uint256"},{"internalType":"uint256","name":"stamina","type":"uint256"},{"internalType":"uint256","name":"hunger","type":"uint256"}],"internalType":"struct S.Time[]","name":"petTimes","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"},{"internalType":"uint256","name":"_slot_start","type":"uint256"},{"internalType":"uint256","name":"_slot_stop","type":"uint256"}],"name":"readPetStatusesArray","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"family","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"internalType":"struct S.Status[]","name":"petstatuses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_username","type":"string"}],"name":"registerUsername","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setMatureToPerfectBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetHungerMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setPetStaminaMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceExpandSlot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPriceToOpenBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setReentrantTimeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBond","type":"uint256"}],"name":"setRookieToMatureBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeBoxLimitReset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialEndurance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setTimeInitialStamina","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number_expansionrequest","type":"uint256"}],"name":"slotLimit_expansionCost","outputs":[{"internalType":"uint256","name":"slotLimit","type":"uint256"},{"internalType":"uint256","name":"expansionCost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slot","type":"uint256"},{"internalType":"uint256","name":"_traintype","type":"uint256"},{"internalType":"uint256","name":"_trainergene","type":"uint256"}],"name":"trainPet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateRAMContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAAddress","type":"address"}],"name":"updateStorageContractAAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewAllTeamFormation","outputs":[{"internalType":"uint256[60]","name":"allFormats","type":"uint256[60]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052676f05b59d3b200000600455674563918244f40000600555620151806006819055610fa7819055612a30610fa8556002610fa955610faa819055610fab556201ec30610fac5562047310610fad55610faf80546001600160a01b03191633179055662386f26fc10000610fb055348015607b575f5ffd5b50608333608b565b6001805560da565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b615b1f806100e75f395ff3fe608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151de565b610809565b005b3480156102e1575f5ffd5b506102d46102f0366004615200565b610880565b348015610300575f5ffd5b506102d461030f366004615229565b61192c565b34801561031f575f5ffd5b5061032861193a565b6040516102ac9190615268565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615229565b6119c0565b3480156103af575f5ffd5b506102d46103be366004615229565b6119cd565b6102d46103d1366004615313565b6119db565b3480156103e1575f5ffd5b506102d4611d57565b3480156103f5575f5ffd5b506102d461040436600461538d565b611de5565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153bd565b61203c565b6040516102ac9190615448565b6102d4610477366004615229565b6122a9565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db612364565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a612497565b6040516102ac9190615488565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615229565b612588565b348015610557575f5ffd5b506102d4612595565b34801561056b575f5ffd5b506102d461057a366004615229565b6125a8565b6102d461058d366004615313565b6125b6565b34801561059d575f5ffd5b506102d46105ac366004615229565b61293e565b3480156105bc575f5ffd5b506102d46105cb3660046151de565b61294b565b3480156105db575f5ffd5b506105ef6105ea366004615229565b6129cc565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615229565b612a16565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612abd565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151de565b612b47565b3480156106ce575f5ffd5b506102d46106dd366004615229565b612bb9565b3480156106ed575f5ffd5b506104db6106fc366004615229565b612bc7565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d4610731366004615200565b612ce0565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153bd565b613c11565b6040516102ac9493929190615524565b348015610785575f5ffd5b506102d4610794366004615229565b614171565b3480156107a4575f5ffd5b506102d46107b3366004615229565b61417f565b3480156107c3575f5ffd5b506102d46107d23660046151de565b61418d565b6102d46107e53660046155c1565b614203565b3480156107f5575f5ffd5b506102d4610804366004615229565b614ad9565b610811614ae7565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b40565b5f6108e0612abd565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e7989061098890869088906004016155f8565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155e1565b90505f81116109e85760405162461bcd60e51b815260040161085590615611565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b906004016155f8565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa59190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b906004016155f8565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b906004016155f8565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b906004016155f8565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156b0565b60608201525f42610c1986614b99565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c38565b602084018190526060840151610c92919060016064614c38565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c38565b602084018190526060840151610c92919060036064614c38565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c38565b602084018190526060840151610c92919060046064614c38565b87600303610d5257612a309150610d3983602001518460600151600360aa614c38565b602084018190526060840151610c9291905f6064614c38565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c38565b602084018190526060840151610c92919060026064614c38565b87600503610db2576154609150610c78836020015184606001515f610137614c38565b87600603610dd6576154609150610cbf836020015184606001516001610137614c38565b87600703610dfa576154609150610cfc836020015184606001516002610137614c38565b87600803610e1e576154609150610d39836020015184606001516003610137614c38565b87600903610e42576154609150610d75836020015184606001516004610137614c38565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c38565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c38565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c38565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c38565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c38565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c38565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c38565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c38565b87601203610f845761fd209150610d398360200151846060015160036102a1614c38565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c38565b87601403610fcc57620151809150610c78836020015184606001515f610307614c38565b87601503610ff157620151809150610cbf836020015184606001516001610307614c38565b8760160361101657620151809150610cfc836020015184606001516002610307614c38565b8760170361103b57620151809150610d39836020015184606001516003610307614c38565b8760180361108057620151809150611060836020015184606001516004610307614c38565b60208401819052606084015161107a919060026064614c38565b60208401525b5f836040015160200151826110959190615732565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f88382615732565b90506111048183615732565b60408501805160200191909152518051849190611122908390615745565b90525061112f8387615745565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117a95761117d61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157bf565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b89190615832565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a9392919061585d565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e9190615732565b8152602001610fa854866113729190615745565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c59392919061585d565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b50506003548851516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506114279160040190815260200190565b61010060405180830381865afa158015611443573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146791906156b0565b866060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e89606001516040518463ffffffff1660e01b81526004016114b793929190615895565b5f604051808303815f87803b1580156114ce575f5ffd5b505af11580156114e0573d5f5f3e3d5ffd5b505050506114fa866020015187606001515f61012c614c38565b6020870181905260608701516115159190600161012c614c38565b6020870181905260608701516115309190600261012c614c38565b60208701819052606087015161154b9190600361012c614c38565b6020870181905260608701516115669190600461012c614c38565b60208701528551604001516002036115d157855180516001919061158b908390615745565b90525085515161271010156115b8578551516115aa9061271190615732565b602087015160c001526115d1565b8551516115c790600190615732565b602087015160c001525b8551604001516003036116375785518051600191906115f1908390615745565b905250855151612710101561161e578551516116109061271190615732565b602087015160e00152611637565b85515161162d90600190615732565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b815260040161167f93929190615895565b5f604051808303815f87803b158015611696575f5ffd5b505af11580156116a8573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171a91906155e1565b8751519091506127109061173090600190615732565b61173a91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90611774908d9085906004016155f8565b5f604051808303815f87803b15801561178b575f5ffd5b505af115801561179d573d5f5f3e3d5ffd5b50505050505050611872565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e0918b918f91600401615895565b5f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a789250611844918b918f9160040161585d565b5f604051808303815f87803b15801561185b575f5ffd5b505af115801561186d573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118a4908a908a906004016155f8565b5f604051808303815f87803b1580156118bb575f5ffd5b505af11580156118cd573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f0151866040015160405161190f939291906158e1565b60405180910390a15050505050505061192760018055565b505050565b611934614ae7565b610fab55565b61194261514f565b5f61194b612abd565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba9190615931565b91505090565b6119c8614ae7565b600555565b6119d5614ae7565b610fac55565b6119e3614b40565b610fb0543414611a055760405162461bcd60e51b815260040161085590615960565b611a0e81614e4c565b611a4d5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a56612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac691906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b0d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b349190810190615997565b5115611b8e5760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bbe908690600401615488565b602060405180830381865afa158015611bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd91906155e1565b15611c4a5760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c7c9084908790600401615a0c565b5f604051808303815f87803b158015611c93575f5ffd5b505af1158015611ca5573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611cdb9086908590600401615a24565b5f604051808303815f87803b158015611cf2575f5ffd5b505af1158015611d04573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d419190615488565b60405180910390a25050611d5460018055565b50565b611d5f614ae7565b5f4711611dae5760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d54573d5f5f3e3d5ffd5b611ded614b40565b5f611df6612abd565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e689190615931565b905060148410611ecc5760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611ee657508235604084013514155b8015611efa57506020830135604084013514155b611f465760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f54866003615a59565b603c8110611f6457611f64615a45565b6020020152826001602002013581611f7d866003615a59565b611f88906001615745565b603c8110611f9857611f98615a45565b6020020152604083013581611fae866003615a59565b611fb9906002615745565b603c8110611fc957611fc9615a45565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120009085908590600401615a70565b5f604051808303815f87803b158015612017575f5ffd5b505af1158015612029573d5f5f3e3d5ffd5b50505050505061203860018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa158015612088573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac91906155e1565b9050828411156121155760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121725760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f61217d8585615732565b612188906001615745565b90508067ffffffffffffffff8111156121a3576121a361527d565b6040519080825280602002602001820160405280156121f557816020015b6121e260405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c15790505b5092505f5b8181101561229f576002546001600160a01b03166388e6c74d8861221e848a615745565b6040518363ffffffff1660e01b815260040161223b9291906155f8565b606060405180830381865afa158015612256573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227a9190615696565b84828151811061228c5761228c615a45565b60209081029190910101526001016121fa565b5050509392505050565b6122b1614b40565b5f6122ba612abd565b90505f5f6122c784612a16565b915091508034146122ea5760405162461bcd60e51b815260040161085590615960565b6002546001600160a01b031663ebd6180c846123068786615745565b6040518363ffffffff1660e01b81526004016123239291906155f8565b5f604051808303815f87803b15801561233a575f5ffd5b505af115801561234c573d5f5f3e3d5ffd5b50505050612358614f64565b505050611d5460018055565b5f5f5f5f612370612abd565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e191906155e1565b6123eb9042615732565b9050620151808110612402575f94505f9350612490565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa15801561244a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246e91906155e1565b945061247d8162015180615732565b93508460045461248d9190615a59565b92505b5050909192565b60605f6124a2612abd565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251391906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa15801561255a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125819190810190615997565b9250505090565b612590614ae7565b600655565b61259d614ae7565b6125a65f61506a565b565b6125b0614ae7565b610faa55565b6125be614b40565b610fb05434146125e05760405162461bcd60e51b815260040161085590615960565b6125e981614e4c565b61262c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f612635612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612681573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a591906155e1565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127179190810190615997565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa90612748908790600401615488565b602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906155e1565b156127d45760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf906128069085908890600401615a0c565b5f604051808303815f87803b15801561281d575f5ffd5b505af115801561282f573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b91506128659087908690600401615a24565b5f604051808303815f87803b15801561287c575f5ffd5b505af115801561288e573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c2908490600401615488565b5f604051808303815f87803b1580156128d9575f5ffd5b505af11580156128eb573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee828660405161292a929190615a8e565b60405180910390a2505050611d5460018055565b612946614ae7565b600455565b612953614ae7565b6001600160a01b0381166129a95760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129dc575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a21612abd565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8f91906155e1565b92506101f3612a9e8486615745565b10612aa7575f5ffd5b83600554612ab59190615a59565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2b9190615abb565b90506001600160a01b038116612b42573391505090565b919050565b612b4f614ae7565b6001600160a01b038116612b975760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc1614ae7565b610fa855565b5f5f5f5f612bd3612abd565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c0a9085908a906004016155f8565b606060405180830381865afa158015612c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c499190615696565b8051610faa546020830151919750919250429190612c679083615732565b1115612c7857610faa549450612c8a565b6020820151612c879082615732565b94505b8082604001511015612c9e575f9350612cd6565b610fab54818360400151612cb29190615732565b1015612ccf57808260400151612cc89190615732565b9350612cd6565b610fab5493505b5050509193909250565b333b15612d2f5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d37614b40565b5f612d40612abd565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7790859087906004016155f8565b602060405180830381865afa158015612d92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db691906155e1565b90505f8111612dd75760405162461bcd60e51b815260040161085590615611565b600a841115612e1a5760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e226150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e549086908a906004016155f8565b606060405180830381865afa158015612e6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e939190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ec79086908a906004016155f8565b61010060405180830381865afa158015612ee3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0791906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f3e9086908a906004016155f8565b606060405180830381865afa158015612f59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7d9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fb79086908a906004016155f8565b61010060405180830381865afa158015612fd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff791906156b0565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa158015613044573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306891906155e1565b90505f804261307687614b99565b8451515f036130b45760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130c557615460925061317a565b886001036130d75761a8c0925061317a565b886002036130e957618ca0925061317a565b886003036130fb57618ca0925061317a565b8860040361310d57619ab0925061317a565b8860050361311f57619ab0925061317a565b886006036131325762015180925061317a565b886007036131455762015180925061317a565b886008036131585762015180925061317a565b8860090361316b5762015180925061317a565b88600a0361317a576201518092505b8085604001516040015110156131c85760408501515161319b908490615745565b6040860151526131ab8385615745565b93506131b78382615745565b6040808701510152600a91506132b3565b610fab5483828760400151604001516131e19190615732565b6131eb9190615745565b111561326f575f818660400151604001516132069190615732565b610fab546132149190615732565b604087015151909150613228908290615745565b6040870151526132388186615745565b94508361324682600a615a59565b6132509190615ad6565b9250610fab54826132619190615745565b6040808801510152506132b3565b604085015151613280908490615745565b6040860151526132908385615745565b9350828560400151604001516132a69190615745565b6040808701510152600a91505b881561343457886001036132eb576132e1856020015186606001515f85600a6132dc9190615a59565b614c38565b6020860152613434565b8860020361330f576132e18560200151866060015160018560056132dc9190615a59565b88600303613333576132e18560200151866060015160028560056132dc9190615a59565b88600403613357576132e18560200151866060015160038560056132dc9190615a59565b8860050361337b576132e18560200151866060015160048560056132dc9190615a59565b8860060361339e576132e1856020015186606001515f8560136132dc9190615a59565b886007036133c2576132e185602001518660600151600185600b6132dc9190615a59565b886008036133e6576132e185602001518660600151600285600b6132dc9190615a59565b8860090361340a576132e185602001518660600151600385600b6132dc9190615a59565b88600a036134345761342e85602001518660600151600485600b6132dc9190615a59565b60208601525b84516040015160011480156134505750610fac54604086015151115b80613472575084516040015160021480156134725750610fad54604086015151115b15613aab5761347f61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ef9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb9261357b9290919087906004016157bf565b608060405180830381865afa158015613596573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ba9190615832565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161360c9392919061585d565b5f604051808303815f87803b158015613623575f5ffd5b505af1158015613635573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa754856136609190615732565b8152602001610fa854856136749190615745565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136c79392919061585d565b5f604051808303815f87803b1580156136de575f5ffd5b505af11580156136f0573d5f5f3e3d5ffd5b50506003548951516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506137299160040190815260200190565b61010060405180830381865afa158015613745573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376991906156b0565b876060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e8a606001516040518463ffffffff1660e01b81526004016137b993929190615895565b5f604051808303815f87803b1580156137d0575f5ffd5b505af11580156137e2573d5f5f3e3d5ffd5b505050506137fc876020015188606001515f61012c614c38565b6020880181905260608801516138179190600161012c614c38565b6020880181905260608801516138329190600261012c614c38565b60208801819052606088015161384d9190600361012c614c38565b6020880181905260608801516138689190600461012c614c38565b60208801528651604001516002036138d357865180516001919061388d908390615745565b90525086515161271010156138ba578651516138ac9061271190615732565b602088015160c001526138d3565b8651516138c990600190615732565b602088015160c001525b8651604001516003036139395786518051600191906138f3908390615745565b9052508651516127101015613920578651516139129061271190615732565b602088015160e00152613939565b86515161392f90600190615732565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398193929190615895565b5f604051808303815f87803b158015613998575f5ffd5b505af11580156139aa573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156139f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1c91906155e1565b88515190915061271090613a3290600190615732565b613a3c91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a76908d9085906004016155f8565b5f604051808303815f87803b158015613a8d575f5ffd5b505af1158015613a9f573d5f5f3e3d5ffd5b50505050505050613b74565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613ae2918b918f91600401615895565b5f604051808303815f87803b158015613af9575f5ffd5b505af1158015613b0b573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b46918b918f9160040161585d565b5f604051808303815f87803b158015613b5d575f5ffd5b505af1158015613b6f573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613ba6908a9088906004016155f8565b5f604051808303815f87803b158015613bbd575f5ffd5b505af1158015613bcf573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f0151876040015160405161190f939291906158e1565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c8791906155e1565b905085871115613d0b5760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d6e5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d798888615732565b613d84906001615745565b90508067ffffffffffffffff811115613d9f57613d9f61527d565b604051908082528060200260200182016040528015613df157816020015b613dde60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dbd5790505b5095508067ffffffffffffffff811115613e0d57613e0d61527d565b604051908082528060200260200182016040528015613e4657816020015b613e3361516e565b815260200190600190039081613e2b5790505b5094508067ffffffffffffffff811115613e6257613e6261527d565b604051908082528060200260200182016040528015613e9b57816020015b613e8861516e565b815260200190600190039081613e805790505b5093508067ffffffffffffffff811115613eb757613eb761527d565b604051908082528060200260200182016040528015613f0957816020015b613ef660405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ed55790505b5092505f5b81811015614165575f613f21828b615745565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f54908e9085906004016155f8565b606060405180830381865afa158015613f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f939190615696565b888381518110613fa557613fa5615a45565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fe2908e9085906004016155f8565b61010060405180830381865afa158015613ffe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402291906156b0565b87838151811061403457614034615a45565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e90614071908e9085906004016155f8565b61010060405180830381865afa15801561408d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b191906156b0565b8683815181106140c3576140c3615a45565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190614100908e9085906004016155f8565b606060405180830381865afa15801561411b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061413f9190615696565b85838151811061415157614151615a45565b602090810291909101015250600101613f0e565b50505093509350935093565b614179614ae7565b610fa955565b614187614ae7565b610fa755565b614195614ae7565b6001600160a01b0381166141fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d548161506a565b61420b614b40565b5f614214612abd565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa158015614261573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428591906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142bc90869088906004016155f8565b602060405180830381865afa1580156142d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142fb91906155e1565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d906143329088908b906004016155f8565b606060405180830381865afa15801561434d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143719190615696565b905061437c85614b99565b835f036143e757600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143b990889088906004016155f8565b5f604051808303815f87803b1580156143d0575f5ffd5b505af11580156143e2573d5f5f3e3d5ffd5b505050505b8387106144365760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144855760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144a45760405162461bcd60e51b815260040161085590615611565b5f5f5f6144af612364565b925092509250815f0361457e5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144ef908b906001906004016155f8565b5f604051808303815f87803b158015614506575f5ffd5b505af1158015614518573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f8807915061454c908b9042906004016155f8565b5f604051808303815f87803b158015614563575f5ffd5b505af1158015614575573d5f5f3e3d5ffd5b50505050614641565b8034146145d95760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad74706896145f6866001615745565b6040518363ffffffff1660e01b81526004016146139291906155f8565b5f604051808303815f87803b15801561462a575f5ffd5b505af115801561463c573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146f591906155e1565b81526020016147058c6001615745565b8152602001600181525094505f60405180606001604052805f8152602001610fa754896147329190615732565b8152602001610fa854896147469190615745565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161478f93929190615895565b5f604051808303815f87803b1580156147a6575f5ffd5b505af11580156147b8573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b81526004016148009392919061585d565b5f604051808303815f87803b158015614817575f5ffd5b505af1158015614829573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b81526004016148719392919061585d565b5f604051808303815f87803b158015614888575f5ffd5b505af115801561489a573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161490891815260200190565b61010060405180830381865afa158015614924573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061494891906156b0565b6040518463ffffffff1660e01b815260040161496693929190615895565b5f604051808303815f87803b15801561497d575f5ffd5b505af115801561498f573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149dd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0191906155e1565b8751909150614a1390612710906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a4d908e9085906004016155f8565b5f604051808303815f87803b158015614a64575f5ffd5b505af1158015614a76573d5f5f3e3d5ffd5b505050505f341115614a8a57614a8a614f64565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614abd939291906158e1565b60405180910390a1505050505050505050505061203860018055565b614ae1614ae7565b610fad55565b5f546001600160a01b031633146125a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bc09042615732565b1015614c1c5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4061516e565b849050825f03614c9857845184511115614c8f57845184516103e8918491614c689190615732565b614c729190615a59565b614c7c9190615ad6565b8551614c889190615745565b8152614e44565b83518152614e44565b82600103614d0457846020015184602001511115614cf5576103e88286602001518660200151614cc89190615732565b614cd29190615a59565b614cdc9190615ad6565b8560200151614ceb9190615745565b6020820152614e44565b60208085015190820152614e44565b82600203614d7057846040015184604001511115614d61576103e88286604001518660400151614d349190615732565b614d3e9190615a59565b614d489190615ad6565b8560400151614d579190615745565b6040820152614e44565b60408085015190820152614e44565b82600303614ddc57846060015184606001511115614dcd576103e88286606001518660600151614da09190615732565b614daa9190615a59565b614db49190615ad6565b8560600151614dc39190615745565b6060820152614e44565b60608085015190820152614e44565b82600403614e4457846080015184608001511115614e39576103e88286608001518660800151614e0c9190615732565b614e169190615a59565b614e209190615ad6565b8560800151614e2f9190615745565b6080820152614e44565b608080850151908201525b949350505050565b80515f9082901580614e5f5750600f8151115b15614e6c57505f92915050565b5f5b8151811015614f5a575f828281518110614e8a57614e8a615a45565b01602001516001600160f81b0319169050600360fc1b8110801590614ebd5750603960f81b6001600160c01b0319821611155b158015614ed85750605f60f81b6001600160c01b0319821614155b8015614f0d5750604160f81b6001600160c01b0319821610801590614f0b5750602d60f91b6001600160c01b0319821611155b155b8015614f425750606160f81b6001600160c01b0319821610801590614f405750603d60f91b6001600160c01b0319821611155b155b15614f5157505f949350505050565b50600101614e6e565b5060019392505050565b610faf546001600160a01b0316614fbd5760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615008576040519150601f19603f3d011682016040523d82523d5f602084013e61500d565b606091505b5050905080611d545760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150e560405180606001604052805f81526020015f81526020015f81525090565b81526020016150f261516e565b815260200161511860405180606001604052805f81526020015f81526020015f81525090565b815260200161512561516e565b905290565b60405180606001604052805f81526020016151436151ab565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d54575f5ffd5b5f602082840312156151ee575f5ffd5b81356151f9816151ca565b9392505050565b5f5f5f60608486031215615212575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615239575f5ffd5b5035919050565b805f5b603c811015615262578151845260209384019390910190600101615243565b50505050565b61078081016152778284615240565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152b5576152b561527d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152e4576152e461527d565b604052919050565b5f67ffffffffffffffff8211156153055761530561527d565b50601f01601f191660200190565b5f60208284031215615323575f5ffd5b813567ffffffffffffffff811115615339575f5ffd5b8201601f81018413615349575f5ffd5b803561535c615357826152ec565b6152bb565b818152856020838501011115615370575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f6080838503121561539e575f5ffd5b82359150608083018410156153b1575f5ffd5b50926020919091019150565b5f5f5f606084860312156153cf575f5ffd5b83356153da816151ca565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561543e576154288683518051825260208082015190830152604090810151910152565b6060959095019460209190910190600101615401565b5093949350505050565b602081525f6151f960208301846153ef565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6151f9602083018461545a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561543e5761550d86835161549a565b6101009590950194602091909101906001016154fa565b608081525f61553660808301876153ef565b828103602084015261554881876154e8565b9050828103604084015261555c81866154e8565b8381036060850152845180825260208087019350909101905f5b818110156155b35761559d8385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615576565b509098975050505050505050565b5f5f604083850312156155d2575f5ffd5b50508035926020909101359150565b5f602082840312156155f1575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561564f575f5ffd5b6040516060810167ffffffffffffffff811182821017156156725761567261527d565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156a6575f5ffd5b6151f9838361563f565b5f6101008284031280156156c2575f5ffd5b506156cb615291565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152775761527761571e565b808201808211156152775761527761571e565b5f6106408284031215615769575f5ffd5b5f83601f840112615778575f5ffd5b505f80610640615787816152bb565b925082915084018581111561579a575f5ffd5b845b818110156157b457805184526020938401930161579c565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157e9606083018561549a565b8251610160830152602083015161018083015f5b603281101561581c5782518252602092830192909101906001016157fd565b50505060408301516107c0830152949350505050565b5f5f60808385031215615843575f5ffd5b61584d848461563f565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e4460408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e44604083018461549a565b634e487b7160e01b5f52601260045260245ffd5b5f826158dc576158dc6158ba565b500690565b6101c081016158f0828661549a565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e44565b5f6107808284031215615942575f5ffd5b5f83601f840112615951575f5ffd5b505f80610780615787816152bb565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159a7575f5ffd5b815167ffffffffffffffff8111156159bd575f5ffd5b8201601f810184136159cd575f5ffd5b80516159db615357826152ec565b8181528560208385010111156159ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e44604083018461545a565b604081525f615a36604083018561545a565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152775761527761571e565b6001600160a01b03831681526107a081016151f96020830184615240565b604081525f615aa0604083018561545a565b8281036020840152615ab2818561545a565b95945050505050565b5f60208284031215615acb575f5ffd5b81516151f9816151ca565b5f82615ae457615ae46158ba565b50049056fea264697066735822122050f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f83264736f6c634300081c0033
Deployed Bytecode
0x608060405260043610610275575f3560e01c80636edb6aa01161014a578063b9f54f2c116100be578063e5ea43d411610078578063e5ea43d41461074b578063e9c634c91461077a578063eadfd89314610799578063f2fde38b146107b8578063f35dea5a146107d7578063feaa19bf146107ea575f5ffd5b8063b9f54f2c146106a4578063c2442589146106c3578063cf6621fc146106e2578063d82d7a0d14610701578063d9c17a1a14610717578063e1c361e214610736575f5ffd5b80637f51bb1f1161010f5780637f51bb1f146105b157806381069905146105d05780638197906e1461062a5780638da5cb5b1461065e57806396a33dc51461067a578063a46a6ab41461068e575f5ffd5b80636edb6aa01461052d578063715018a61461054c57806376e2fcd51461056057806377c846af1461057f5780637a44d04814610592575f5ffd5b80633ccfd60b116101ec57806361894434116101a6578063618944341461047c57806361d027b314610491578063635ab8a0146104b1578063647fed85146104c7578063681f3e6d146104f65780636ac5ef7014610517575f5ffd5b80633ccfd60b146103d657806348586b3d146103ea5780634af2fe6f146104095780635054cfe2146104285780635f76310c1461043d5780636070721614610469575f5ffd5b8063236a32c21161023d578063236a32c21461033557806324a22f481461035957806328d24d771461036f5780632fd4f060146103855780633149443c146103a457806336a94134146103c3575f5ffd5b80630549b27e1461027957806306f94913146102b55780630e13ae3b146102d65780631211759b146102f5578063194ace8a14610314575b5f5ffd5b348015610284575f5ffd5b50600254610298906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102c0575f5ffd5b506102d46102cf3660046151de565b610809565b005b3480156102e1575f5ffd5b506102d46102f0366004615200565b610880565b348015610300575f5ffd5b506102d461030f366004615229565b61192c565b34801561031f575f5ffd5b5061032861193a565b6040516102ac9190615268565b348015610340575f5ffd5b5061034b610faa5481565b6040519081526020016102ac565b348015610364575f5ffd5b5061034b610fa75481565b34801561037a575f5ffd5b5061034b610fad5481565b348015610390575f5ffd5b506102d461039f366004615229565b6119c0565b3480156103af575f5ffd5b506102d46103be366004615229565b6119cd565b6102d46103d1366004615313565b6119db565b3480156103e1575f5ffd5b506102d4611d57565b3480156103f5575f5ffd5b506102d461040436600461538d565b611de5565b348015610414575f5ffd5b50600354610298906001600160a01b031681565b348015610433575f5ffd5b5061034b60045481565b348015610448575f5ffd5b5061045c6104573660046153bd565b61203c565b6040516102ac9190615448565b6102d4610477366004615229565b6122a9565b348015610487575f5ffd5b5061034b60055481565b34801561049c575f5ffd5b50610faf54610298906001600160a01b031681565b3480156104bc575f5ffd5b5061034b610fac5481565b3480156104d2575f5ffd5b506104db612364565b604080519384526020840192909252908201526060016102ac565b348015610501575f5ffd5b5061050a612497565b6040516102ac9190615488565b348015610522575f5ffd5b5061034b610fab5481565b348015610538575f5ffd5b506102d4610547366004615229565b612588565b348015610557575f5ffd5b506102d4612595565b34801561056b575f5ffd5b506102d461057a366004615229565b6125a8565b6102d461058d366004615313565b6125b6565b34801561059d575f5ffd5b506102d46105ac366004615229565b61293e565b3480156105bc575f5ffd5b506102d46105cb3660046151de565b61294b565b3480156105db575f5ffd5b506105ef6105ea366004615229565b6129cc565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102ac565b348015610635575f5ffd5b50610649610644366004615229565b612a16565b604080519283526020830191909152016102ac565b348015610669575f5ffd5b505f546001600160a01b0316610298565b348015610685575f5ffd5b50610298612abd565b348015610699575f5ffd5b5061034b610fa95481565b3480156106af575f5ffd5b506102d46106be3660046151de565b612b47565b3480156106ce575f5ffd5b506102d46106dd366004615229565b612bb9565b3480156106ed575f5ffd5b506104db6106fc366004615229565b612bc7565b34801561070c575f5ffd5b5061034b610fa85481565b348015610722575f5ffd5b506102d4610731366004615200565b612ce0565b348015610741575f5ffd5b5061034b60065481565b348015610756575f5ffd5b5061076a6107653660046153bd565b613c11565b6040516102ac9493929190615524565b348015610785575f5ffd5b506102d4610794366004615229565b614171565b3480156107a4575f5ffd5b506102d46107b3366004615229565b61417f565b3480156107c3575f5ffd5b506102d46107d23660046151de565b61418d565b6102d46107e53660046155c1565b614203565b3480156107f5575f5ffd5b506102d4610804366004615229565b614ad9565b610811614ae7565b6001600160a01b03811661085e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b333b156108cf5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b6108d7614b40565b5f6108e0612abd565b600254604051631add0e8b60e21b81526001600160a01b0380841660048301529293505f9290911690636b743a2c90602401602060405180830381865afa15801561092d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095191906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e7989061098890869088906004016155f8565b602060405180830381865afa1580156109a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c791906155e1565b90505f81116109e85760405162461bcd60e51b815260040161085590615611565b6018851115610a2c5760405162461bcd60e51b815260206004820152601060248201526f57726f6e6720547261696e207479706560801b6044820152606401610855565b610a346150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90610a669087908b906004016155f8565b606060405180830381865afa158015610a81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa59190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90610ad99087908b906004016155f8565b61010060405180830381865afa158015610af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1991906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190610b509087908b906004016155f8565b606060405180830381865afa158015610b6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8f9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90610bc99087908b906004016155f8565b61010060405180830381865afa158015610be5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0991906156b0565b60608201525f42610c1986614b99565b8251515f03610c575760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b875f03610c9c57612a309150610c78836020015184606001515f60aa614c38565b602084018190526060840151610c92919060016064614c38565b6020840152611080565b87600103610cd957612a309150610cbf83602001518460600151600160aa614c38565b602084018190526060840151610c92919060036064614c38565b87600203610d1657612a309150610cfc83602001518460600151600260aa614c38565b602084018190526060840151610c92919060046064614c38565b87600303610d5257612a309150610d3983602001518460600151600360aa614c38565b602084018190526060840151610c9291905f6064614c38565b87600403610d8f57612a309150610d7583602001518460600151600460aa614c38565b602084018190526060840151610c92919060026064614c38565b87600503610db2576154609150610c78836020015184606001515f610137614c38565b87600603610dd6576154609150610cbf836020015184606001516001610137614c38565b87600703610dfa576154609150610cfc836020015184606001516002610137614c38565b87600803610e1e576154609150610d39836020015184606001516003610137614c38565b87600903610e42576154609150610d75836020015184606001516004610137614c38565b87600a03610e655761a8c09150610c78836020015184606001515f61020d614c38565b87600b03610e895761a8c09150610cbf83602001518460600151600161020d614c38565b87600c03610ead5761a8c09150610cfc83602001518460600151600261020d614c38565b87600d03610ed15761a8c09150610d3983602001518460600151600361020d614c38565b87600e03610ef55761a8c09150610d7583602001518460600151600461020d614c38565b87600f03610f185761fd209150610c78836020015184606001515f6102a1614c38565b87601003610f3c5761fd209150610cbf8360200151846060015160016102a1614c38565b87601103610f605761fd209150610cfc8360200151846060015160026102a1614c38565b87601203610f845761fd209150610d398360200151846060015160036102a1614c38565b87601303610fa85761fd209150610d758360200151846060015160046102a1614c38565b87601403610fcc57620151809150610c78836020015184606001515f610307614c38565b87601503610ff157620151809150610cbf836020015184606001516001610307614c38565b8760160361101657620151809150610cfc836020015184606001516002610307614c38565b8760170361103b57620151809150610d39836020015184606001516003610307614c38565b8760180361108057620151809150611060836020015184606001516004610307614c38565b60208401819052606084015161107a919060026064614c38565b60208401525b5f836040015160200151826110959190615732565b9050828110156110dd5760405162461bcd60e51b81526020600482015260136024820152722737ba1032b737bab3b41039ba30b6b4b7309760691b6044820152606401610855565b610faa548111156110ee5750610faa545b6110f88382615732565b90506111048183615732565b60408501805160200191909152518051849190611122908390615745565b90525061112f8387615745565b845160400151909650600114801561114e5750610fac54604085015151115b80611170575083516040015160021480156111705750610fad54604085015151115b156117a95761117d61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156111c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354875192880151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb926112799290919087906004016157bf565b608060405180830381865afa158015611294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b89190615832565b875f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e895f01516040518463ffffffff1660e01b815260040161130a9392919061585d565b5f604051808303815f87803b158015611321575f5ffd5b505af1158015611333573d5f5f3e3d5ffd5b50505050604051806060016040528087604001515f01518152602001610fa7548661135e9190615732565b8152602001610fa854866113729190615745565b815250866040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e89604001516040518463ffffffff1660e01b81526004016113c59392919061585d565b5f604051808303815f87803b1580156113dc575f5ffd5b505af11580156113ee573d5f5f3e3d5ffd5b50506003548851516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506114279160040190815260200190565b61010060405180830381865afa158015611443573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061146791906156b0565b866060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e89606001516040518463ffffffff1660e01b81526004016114b793929190615895565b5f604051808303815f87803b1580156114ce575f5ffd5b505af11580156114e0573d5f5f3e3d5ffd5b505050506114fa866020015187606001515f61012c614c38565b6020870181905260608701516115159190600161012c614c38565b6020870181905260608701516115309190600261012c614c38565b60208701819052606087015161154b9190600361012c614c38565b6020870181905260608701516115669190600461012c614c38565b60208701528551604001516002036115d157855180516001919061158b908390615745565b90525085515161271010156115b8578551516115aa9061271190615732565b602087015160c001526115d1565b8551516115c790600190615732565b602087015160c001525b8551604001516003036116375785518051600191906115f1908390615745565b905250855151612710101561161e578551516116109061271190615732565b602087015160e00152611637565b85515161162d90600190615732565b602087015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e89602001516040518463ffffffff1660e01b815260040161167f93929190615895565b5f604051808303815f87803b158015611696575f5ffd5b505af11580156116a8573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156116f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171a91906155e1565b8751519091506127109061173090600190615732565b61173a91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90611774908d9085906004016155f8565b5f604051808303815f87803b15801561178b575f5ffd5b505af115801561179d573d5f5f3e3d5ffd5b50505050505050611872565b600254602085015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b916117e0918b918f91600401615895565b5f604051808303815f87803b1580156117f7575f5ffd5b505af1158015611809573d5f5f3e3d5ffd5b5050600254604080880151905163108b074f60e31b81526001600160a01b0390921693506384583a789250611844918b918f9160040161585d565b5f604051808303815f87803b15801561185b575f5ffd5b505af115801561186d573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad906118a4908a908a906004016155f8565b5f604051808303815f87803b1580156118bb575f5ffd5b505af11580156118cd573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8460200151855f0151866040015160405161190f939291906158e1565b60405180910390a15050505050505061192760018055565b505050565b611934614ae7565b610fab55565b61194261514f565b5f61194b612abd565b600254604051633d52077560e01b81526001600160a01b038084166004830152929350911690633d5207759060240161078060405180830381865afa158015611996573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ba9190615931565b91505090565b6119c8614ae7565b600555565b6119d5614ae7565b610fac55565b6119e3614b40565b610fb0543414611a055760405162461bcd60e51b815260040161085590615960565b611a0e81614e4c565b611a4d5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420757365726e616d6560801b6044820152606401610855565b5f611a56612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015611aa2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac691906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa158015611b0d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b349190810190615997565b5115611b8e5760405162461bcd60e51b8152602060048201526024808201527f506c6179657220616c72656164792068617320612072656769737465726564206044820152636e616d6560e01b6064820152608401610855565b60025460405163589d1b5560e11b81526001600160a01b039091169063b13a36aa90611bbe908690600401615488565b602060405180830381865afa158015611bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd91906155e1565b15611c4a5760405162461bcd60e51b815260206004820152601760248201527f557365726e616d6520616c7265616479206578697374730000000000000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf90611c7c9084908790600401615a0c565b5f604051808303815f87803b158015611c93575f5ffd5b505af1158015611ca5573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b9150611cdb9086908590600401615a24565b5f604051808303815f87803b158015611cf2575f5ffd5b505af1158015611d04573d5f5f3e3d5ffd5b50505050336001600160a01b03167fe04d23b73ae3d3b27074da9719b5a4cd521395aaf86bfe7e374933ecb567731a84604051611d419190615488565b60405180910390a25050611d5460018055565b50565b611d5f614ae7565b5f4711611dae5760405162461bcd60e51b815260206004820152601860248201527f436f6e74726163742062616c616e6365206973207a65726f00000000000000006044820152606401610855565b610faf546040516001600160a01b03909116904780156108fc02915f818181858888f19350505050158015611d54573d5f5f3e3d5ffd5b611ded614b40565b5f611df6612abd565b600254604051633d52077560e01b81526001600160a01b0380841660048301529293505f9290911690633d5207759060240161078060405180830381865afa158015611e44573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e689190615931565b905060148410611ecc5760405162461bcd60e51b815260206004820152602960248201527f5465616d203020746f203139206973206f6e6c7920617661696c61626c65207260448201526834b3b43a103737bb9760b91b6064820152608401610855565b8235602084013514801590611ee657508235604084013514155b8015611efa57506020830135604084013514155b611f465760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420686176652073616d6520736c6f74206f6e2061207465616d006044820152606401610855565b823581611f54866003615a59565b603c8110611f6457611f64615a45565b6020020152826001602002013581611f7d866003615a59565b611f88906001615745565b603c8110611f9857611f98615a45565b6020020152604083013581611fae866003615a59565b611fb9906002615745565b603c8110611fc957611fc9615a45565b602002015260025460405163ad9bc5fd60e01b81526001600160a01b039091169063ad9bc5fd906120009085908590600401615a70565b5f604051808303815f87803b158015612017575f5ffd5b505af1158015612029573d5f5f3e3d5ffd5b50505050505061203860018055565b5050565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060925f9291169063a4c8ec3490602401602060405180830381865afa158015612088573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ac91906155e1565b9050828411156121155760405162461bcd60e51b815260206004820152602e60248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206e6565647360448201526d0203c3d205f736c6f745f73746f760941b6064820152608401610855565b8083106121725760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420696e7075743a205f736c6f745f73746f70203e20736c6f74604482015264131a5b5a5d60da1b6064820152608401610855565b5f61217d8585615732565b612188906001615745565b90508067ffffffffffffffff8111156121a3576121a361527d565b6040519080825280602002602001820160405280156121f557816020015b6121e260405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816121c15790505b5092505f5b8181101561229f576002546001600160a01b03166388e6c74d8861221e848a615745565b6040518363ffffffff1660e01b815260040161223b9291906155f8565b606060405180830381865afa158015612256573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227a9190615696565b84828151811061228c5761228c615a45565b60209081029190910101526001016121fa565b5050509392505050565b6122b1614b40565b5f6122ba612abd565b90505f5f6122c784612a16565b915091508034146122ea5760405162461bcd60e51b815260040161085590615960565b6002546001600160a01b031663ebd6180c846123068786615745565b6040518363ffffffff1660e01b81526004016123239291906155f8565b5f604051808303815f87803b15801561233a575f5ffd5b505af115801561234c573d5f5f3e3d5ffd5b50505050612358614f64565b505050611d5460018055565b5f5f5f5f612370612abd565b60025460405163aa31497760e01b81526001600160a01b0380841660048301529293505f929091169063aa31497790602401602060405180830381865afa1580156123bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e191906155e1565b6123eb9042615732565b9050620151808110612402575f94505f9350612490565b60025460405163f9c0109b60e01b81526001600160a01b0384811660048301529091169063f9c0109b90602401602060405180830381865afa15801561244a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061246e91906155e1565b945061247d8162015180615732565b93508460045461248d9190615a59565b92505b5050909192565b60605f6124a2612abd565b600254604051630bc7d91360e31b81526001600160a01b0380841660048301529293505f9290911690635e3ec89890602401602060405180830381865afa1580156124ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061251391906155e1565b6002546040516351a2c27760e01b8152600481018390529192506001600160a01b0316906351a2c277906024015f60405180830381865afa15801561255a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125819190810190615997565b9250505090565b612590614ae7565b600655565b61259d614ae7565b6125a65f61506a565b565b6125b0614ae7565b610faa55565b6125be614b40565b610fb05434146125e05760405162461bcd60e51b815260040161085590615960565b6125e981614e4c565b61262c5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206e657720757365726e616d6560601b6044820152606401610855565b5f612635612abd565b600254604051624165b160e71b81526001600160a01b0380841660048301529293505f92909116906320b2d88090602401602060405180830381865afa158015612681573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126a591906155e1565b6002546040516351a2c27760e01b8152600481018390529192505f916001600160a01b03909116906351a2c277906024015f60405180830381865afa1580156126f0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127179190810190615997565b60025460405163589d1b5560e11b81529192506001600160a01b03169063b13a36aa90612748908790600401615488565b602060405180830381865afa158015612763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278791906155e1565b156127d45760405162461bcd60e51b815260206004820152601b60248201527f4e657720757365726e616d6520616c72656164792065786973747300000000006044820152606401610855565b6002546040516368b0c7cf60e01b81526001600160a01b03909116906368b0c7cf906128069085908890600401615a0c565b5f604051808303815f87803b15801561281d575f5ffd5b505af115801561282f573d5f5f3e3d5ffd5b5050600254604051630a15e13b60e01b81526001600160a01b039091169250630a15e13b91506128659087908690600401615a24565b5f604051808303815f87803b15801561287c575f5ffd5b505af115801561288e573d5f5f3e3d5ffd5b5050600254604051632e9cdc6d60e21b81526001600160a01b03909116925063ba7371b491506128c2908490600401615488565b5f604051808303815f87803b1580156128d9575f5ffd5b505af11580156128eb573d5f5f3e3d5ffd5b50505050336001600160a01b03167f10022a11494e4dcaccdda542dc8a420f8a1c3397f37d5bd035a805e79e1a32ee828660405161292a929190615a8e565b60405180910390a2505050611d5460018055565b612946614ae7565b600455565b612953614ae7565b6001600160a01b0381166129a95760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207472656173757279206164647265737300000000000000006044820152606401610855565b610faf80546001600160a01b0319166001600160a01b0392909216919091179055565b6007816101f481106129dc575f80fd5b6008020180546001820154600283015460038401546004850154600586015460068701546007909701549597509395929491939092909188565b5f5f5f612a21612abd565b6002546040516329323b0d60e21b81526001600160a01b03808416600483015292935091169063a4c8ec3490602401602060405180830381865afa158015612a6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8f91906155e1565b92506101f3612a9e8486615745565b10612aa7575f5ffd5b83600554612ab59190615a59565b915050915091565b6002546040516302e6c26360e11b81523360048201525f9182916001600160a01b03909116906305cd84c690602401602060405180830381865afa158015612b07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2b9190615abb565b90506001600160a01b038116612b42573391505090565b919050565b612b4f614ae7565b6001600160a01b038116612b975760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610855565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b612bc1614ae7565b610fa855565b5f5f5f5f612bd3612abd565b60025460405163fd45e19160e01b81529192505f916001600160a01b039091169063fd45e19190612c0a9085908a906004016155f8565b606060405180830381865afa158015612c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c499190615696565b8051610faa546020830151919750919250429190612c679083615732565b1115612c7857610faa549450612c8a565b6020820151612c879082615732565b94505b8082604001511015612c9e575f9350612cd6565b610fab54818360400151612cb29190615732565b1015612ccf57808260400151612cc89190615732565b9350612cd6565b610fab5493505b5050509193909250565b333b15612d2f5760405162461bcd60e51b815260206004820152601b60248201527f536d61727420636f6e747261637473206e6f7420616c6c6f77656400000000006044820152606401610855565b612d37614b40565b5f612d40612abd565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e79890612d7790859087906004016155f8565b602060405180830381865afa158015612d92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612db691906155e1565b90505f8111612dd75760405162461bcd60e51b815260040161085590615611565b600a841115612e1a5760405162461bcd60e51b815260206004820152600f60248201526e57726f6e6720466f6f64207479706560881b6044820152606401610855565b612e226150b9565b6002546040516388e6c74d60e01b81526001600160a01b03909116906388e6c74d90612e549086908a906004016155f8565b606060405180830381865afa158015612e6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e939190615696565b8152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90612ec79086908a906004016155f8565b61010060405180830381865afa158015612ee3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0791906156b0565b602082015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190612f3e9086908a906004016155f8565b606060405180830381865afa158015612f59573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7d9190615696565b60408083019190915260025490516308ff748760e11b81526001600160a01b03909116906311fee90e90612fb79086908a906004016155f8565b61010060405180830381865afa158015612fd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff791906156b0565b6060820152600254604051631add0e8b60e21b81526001600160a01b0385811660048301525f921690636b743a2c90602401602060405180830381865afa158015613044573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306891906155e1565b90505f804261307687614b99565b8451515f036130b45760405162461bcd60e51b815260206004820152600a602482015269195b5c1d1e481cdb1bdd60b21b6044820152606401610855565b885f036130c557615460925061317a565b886001036130d75761a8c0925061317a565b886002036130e957618ca0925061317a565b886003036130fb57618ca0925061317a565b8860040361310d57619ab0925061317a565b8860050361311f57619ab0925061317a565b886006036131325762015180925061317a565b886007036131455762015180925061317a565b886008036131585762015180925061317a565b8860090361316b5762015180925061317a565b88600a0361317a576201518092505b8085604001516040015110156131c85760408501515161319b908490615745565b6040860151526131ab8385615745565b93506131b78382615745565b6040808701510152600a91506132b3565b610fab5483828760400151604001516131e19190615732565b6131eb9190615745565b111561326f575f818660400151604001516132069190615732565b610fab546132149190615732565b604087015151909150613228908290615745565b6040870151526132388186615745565b94508361324682600a615a59565b6132509190615ad6565b9250610fab54826132619190615745565b6040808801510152506132b3565b604085015151613280908490615745565b6040860151526132908385615745565b9350828560400151604001516132a69190615745565b6040808701510152600a91505b881561343457886001036132eb576132e1856020015186606001515f85600a6132dc9190615a59565b614c38565b6020860152613434565b8860020361330f576132e18560200151866060015160018560056132dc9190615a59565b88600303613333576132e18560200151866060015160028560056132dc9190615a59565b88600403613357576132e18560200151866060015160038560056132dc9190615a59565b8860050361337b576132e18560200151866060015160048560056132dc9190615a59565b8860060361339e576132e1856020015186606001515f8560136132dc9190615a59565b886007036133c2576132e185602001518660600151600185600b6132dc9190615a59565b886008036133e6576132e185602001518660600151600285600b6132dc9190615a59565b8860090361340a576132e185602001518660600151600385600b6132dc9190615a59565b88600a036134345761342e85602001518660600151600485600b6132dc9190615a59565b60208601525b84516040015160011480156134505750610fac54604086015151115b80613472575084516040015160021480156134725750610fad54604086015151115b15613aab5761347f61512a565b888152600254604051633f96d5e560e21b81526001600160a01b038a811660048301529091169063fe5b57949060240161064060405180830381865afa1580156134cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ef9190615758565b6020808301919091526040516bffffffffffffffffffffffff1960608b901b169181019190915242603482015244605482015260740160408051601f19818403018152918152815160209283012083820152600354885192890151915163f5a37ffb60e01b81525f936001600160a01b039092169263f5a37ffb9261357b9290919087906004016157bf565b608060405180830381865afa158015613596573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ba9190615832565b885f01819350829052505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8a8e8a5f01516040518463ffffffff1660e01b815260040161360c9392919061585d565b5f604051808303815f87803b158015613623575f5ffd5b505af1158015613635573d5f5f3e3d5ffd5b50505050604051806060016040528088604001515f01518152602001610fa754856136609190615732565b8152602001610fa854856136749190615745565b815250876040018190525060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788a8e8a604001516040518463ffffffff1660e01b81526004016136c79392919061585d565b5f604051808303815f87803b1580156136de575f5ffd5b505af11580156136f0573d5f5f3e3d5ffd5b50506003548951516040516315e3d00d60e11b81526001600160a01b039092169350632bc7a01a92506137299160040190815260200190565b61010060405180830381865afa158015613745573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376991906156b0565b876060018190525060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18a8e8a606001516040518463ffffffff1660e01b81526004016137b993929190615895565b5f604051808303815f87803b1580156137d0575f5ffd5b505af11580156137e2573d5f5f3e3d5ffd5b505050506137fc876020015188606001515f61012c614c38565b6020880181905260608801516138179190600161012c614c38565b6020880181905260608801516138329190600261012c614c38565b60208801819052606088015161384d9190600361012c614c38565b6020880181905260608801516138689190600461012c614c38565b60208801528651604001516002036138d357865180516001919061388d908390615745565b90525086515161271010156138ba578651516138ac9061271190615732565b602088015160c001526138d3565b8651516138c990600190615732565b602088015160c001525b8651604001516003036139395786518051600191906138f3908390615745565b9052508651516127101015613920578651516139129061271190615732565b602088015160e00152613939565b86515161392f90600190615732565b602088015160e001525b60025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8a8e8a602001516040518463ffffffff1660e01b815260040161398193929190615895565b5f604051808303815f87803b158015613998575f5ffd5b505af11580156139aa573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038d811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156139f8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1c91906155e1565b88515190915061271090613a3290600190615732565b613a3c91906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90613a76908d9085906004016155f8565b5f604051808303815f87803b158015613a8d575f5ffd5b505af1158015613a9f573d5f5f3e3d5ffd5b50505050505050613b74565b600254602086015160405163daa3f88b60e01b81526001600160a01b039092169163daa3f88b91613ae2918b918f91600401615895565b5f604051808303815f87803b158015613af9575f5ffd5b505af1158015613b0b573d5f5f3e3d5ffd5b5050600254604080890151905163108b074f60e31b81526001600160a01b0390921693506384583a789250613b46918b918f9160040161585d565b5f604051808303815f87803b158015613b5d575f5ffd5b505af1158015613b6f573d5f5f3e3d5ffd5b505050505b600254604051631ba678ad60e01b81526001600160a01b0390911690631ba678ad90613ba6908a9088906004016155f8565b5f604051808303815f87803b158015613bbd575f5ffd5b505af1158015613bcf573d5f5f3e3d5ffd5b505050507fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd8560200151865f0151876040015160405161190f939291906158e1565b6002546040516329323b0d60e21b81526001600160a01b0385811660048301526060928392839283925f9291169063a4c8ec3490602401602060405180830381865afa158015613c63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c8791906155e1565b905085871115613d0b5760405162461bcd60e51b815260206004820152604360248201527f496e76616c696420696e7075743a205f736c6f745f7374617274206d7573742060448201527f6265206c657373207468616e206f7220657175616c20746f205f736c6f745f736064820152620746f760ec1b608482015260a401610855565b808610613d6e5760405162461bcd60e51b815260206004820152602b60248201527f496e76616c696420696e7075743a205f736c6f745f73746f702065786365656460448201526a1cc81cdb1bdd131a5b5a5d60aa1b6064820152608401610855565b5f613d798888615732565b613d84906001615745565b90508067ffffffffffffffff811115613d9f57613d9f61527d565b604051908082528060200260200182016040528015613df157816020015b613dde60405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613dbd5790505b5095508067ffffffffffffffff811115613e0d57613e0d61527d565b604051908082528060200260200182016040528015613e4657816020015b613e3361516e565b815260200190600190039081613e2b5790505b5094508067ffffffffffffffff811115613e6257613e6261527d565b604051908082528060200260200182016040528015613e9b57816020015b613e8861516e565b815260200190600190039081613e805790505b5093508067ffffffffffffffff811115613eb757613eb761527d565b604051908082528060200260200182016040528015613f0957816020015b613ef660405180606001604052805f81526020015f81526020015f81525090565b815260200190600190039081613ed55790505b5092505f5b81811015614165575f613f21828b615745565b6002546040516388e6c74d60e01b81529192506001600160a01b0316906388e6c74d90613f54908e9085906004016155f8565b606060405180830381865afa158015613f6f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f939190615696565b888381518110613fa557613fa5615a45565b6020908102919091010152600254604051636802761f60e01b81526001600160a01b0390911690636802761f90613fe2908e9085906004016155f8565b61010060405180830381865afa158015613ffe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402291906156b0565b87838151811061403457614034615a45565b60209081029190910101526002546040516308ff748760e11b81526001600160a01b03909116906311fee90e90614071908e9085906004016155f8565b61010060405180830381865afa15801561408d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b191906156b0565b8683815181106140c3576140c3615a45565b602090810291909101015260025460405163fd45e19160e01b81526001600160a01b039091169063fd45e19190614100908e9085906004016155f8565b606060405180830381865afa15801561411b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061413f9190615696565b85838151811061415157614151615a45565b602090810291909101015250600101613f0e565b50505093509350935093565b614179614ae7565b610fa955565b614187614ae7565b610fa755565b614195614ae7565b6001600160a01b0381166141fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610855565b611d548161506a565b61420b614b40565b5f614214612abd565b6002546040516329323b0d60e21b81526001600160a01b0380841660048301529293505f929091169063a4c8ec3490602401602060405180830381865afa158015614261573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428591906155e1565b6002546040516315f67cf360e31b81529192505f916001600160a01b039091169063afb3e798906142bc90869088906004016155f8565b602060405180830381865afa1580156142d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142fb91906155e1565b6002546040516388e6c74d60e01b815291925042915f916001600160a01b0316906388e6c74d906143329088908b906004016155f8565b606060405180830381865afa15801561434d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143719190615696565b905061437c85614b99565b835f036143e757600254604051633af5860360e21b8152600595506001600160a01b039091169063ebd6180c906143b990889088906004016155f8565b5f604051808303815f87803b1580156143d0575f5ffd5b505af11580156143e2573d5f5f3e3d5ffd5b505050505b8387106144365760405162461bcd60e51b815260206004820152601a60248201527f43686f73656e20736c6f742065786365656473206c696d69742e0000000000006044820152606401610855565b8051156144855760405162461bcd60e51b815260206004820152601860248201527f43686f73656e20736c6f74206973206f636375706965642e00000000000000006044820152606401610855565b5f83116144a45760405162461bcd60e51b815260040161085590615611565b5f5f5f6144af612364565b925092509250815f0361457e5760025460405163356ba38360e11b81526001600160a01b0390911690636ad74706906144ef908b906001906004016155f8565b5f604051808303815f87803b158015614506575f5ffd5b505af1158015614518573d5f5f3e3d5ffd5b5050600254604051625f880760e01b81526001600160a01b039091169250625f8807915061454c908b9042906004016155f8565b5f604051808303815f87803b158015614563575f5ffd5b505af1158015614575573d5f5f3e3d5ffd5b50505050614641565b8034146145d95760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74207061796d656e7420746f206f70656e20746865604482015263040c4def60e31b6064820152608401610855565b6002546001600160a01b0316636ad74706896145f6866001615745565b6040518363ffffffff1660e01b81526004016146139291906155f8565b5f604051808303815f87803b15801561462a575f5ffd5b505af115801561463c573d5f5f3e3d5ffd5b505050505b60408051610100810182526103e8815260646020820181905260328284015260608083018290526080830182905260a083018a90525f60c0840181905260e0840152835190810193849052600354634fa9782d60e01b9094529081018c9052909181906001600160a01b0316634fa9782d60848301602060405180830381865afa1580156146d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146f591906155e1565b81526020016147058c6001615745565b8152602001600181525094505f60405180606001604052805f8152602001610fa754896147329190615732565b8152602001610fa854896147469190615745565b815250905060025f9054906101000a90046001600160a01b03166001600160a01b031663daa3f88b8b8e856040518463ffffffff1660e01b815260040161478f93929190615895565b5f604051808303815f87803b1580156147a6575f5ffd5b505af11580156147b8573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166331ec4dea8b8e896040518463ffffffff1660e01b81526004016148009392919061585d565b5f604051808303815f87803b158015614817575f5ffd5b505af1158015614829573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b03166384583a788b8e846040518463ffffffff1660e01b81526004016148719392919061585d565b5f604051808303815f87803b158015614888575f5ffd5b505af115801561489a573d5f5f3e3d5ffd5b5050505060025f9054906101000a90046001600160a01b03166001600160a01b031663c10e83e18b8e60035f9054906101000a90046001600160a01b03166001600160a01b0316632bc7a01a8b5f01516040518263ffffffff1660e01b815260040161490891815260200190565b61010060405180830381865afa158015614924573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061494891906156b0565b6040518463ffffffff1660e01b815260040161496693929190615895565b5f604051808303815f87803b15801561497d575f5ffd5b505af115801561498f573d5f5f3e3d5ffd5b505060025460405163b2cbbfad60e01b81526001600160a01b038e811660048301525f9450909116915063b2cbbfad90602401602060405180830381865afa1580156149dd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a0191906155e1565b8751909150614a1390612710906158ce565b600254604051636ed6fed760e11b8152600190921b92909217916001600160a01b03169063ddadfdae90614a4d908e9085906004016155f8565b5f604051808303815f87803b158015614a64575f5ffd5b505af1158015614a76573d5f5f3e3d5ffd5b505050505f341115614a8a57614a8a614f64565b7fc1e766b7fcdd3f4867b7cd3d80cf2616b5b7bc4340a7971becb6036c77aa65bd838884604051614abd939291906158e1565b60405180910390a1505050505050505050505061203860018055565b614ae1614ae7565b610fad55565b5f546001600160a01b031633146125a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b600260015403614b925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002600155565b610fa9546001600160a01b0382165f908152610fae6020526040902054614bc09042615732565b1015614c1c5760405162461bcd60e51b815260206004820152602560248201527f4e6f6e2d5265656e7472616e742c20736c6f7720646f776e205458206174746560448201526436b83a399760d91b6064820152608401610855565b6001600160a01b03165f908152610fae60205260409020429055565b614c4061516e565b849050825f03614c9857845184511115614c8f57845184516103e8918491614c689190615732565b614c729190615a59565b614c7c9190615ad6565b8551614c889190615745565b8152614e44565b83518152614e44565b82600103614d0457846020015184602001511115614cf5576103e88286602001518660200151614cc89190615732565b614cd29190615a59565b614cdc9190615ad6565b8560200151614ceb9190615745565b6020820152614e44565b60208085015190820152614e44565b82600203614d7057846040015184604001511115614d61576103e88286604001518660400151614d349190615732565b614d3e9190615a59565b614d489190615ad6565b8560400151614d579190615745565b6040820152614e44565b60408085015190820152614e44565b82600303614ddc57846060015184606001511115614dcd576103e88286606001518660600151614da09190615732565b614daa9190615a59565b614db49190615ad6565b8560600151614dc39190615745565b6060820152614e44565b60608085015190820152614e44565b82600403614e4457846080015184608001511115614e39576103e88286608001518660800151614e0c9190615732565b614e169190615a59565b614e209190615ad6565b8560800151614e2f9190615745565b6080820152614e44565b608080850151908201525b949350505050565b80515f9082901580614e5f5750600f8151115b15614e6c57505f92915050565b5f5b8151811015614f5a575f828281518110614e8a57614e8a615a45565b01602001516001600160f81b0319169050600360fc1b8110801590614ebd5750603960f81b6001600160c01b0319821611155b158015614ed85750605f60f81b6001600160c01b0319821614155b8015614f0d5750604160f81b6001600160c01b0319821610801590614f0b5750602d60f91b6001600160c01b0319821611155b155b8015614f425750606160f81b6001600160c01b0319821610801590614f405750603d60f91b6001600160c01b0319821611155b155b15614f5157505f949350505050565b50600101614e6e565b5060019392505050565b610faf546001600160a01b0316614fbd5760405162461bcd60e51b815260206004820152601860248201527f54726561737572792061646472657373206e6f742073657400000000000000006044820152606401610855565b610faf546040515f916001600160a01b03169034908381818185875af1925050503d805f8114615008576040519150601f19603f3d011682016040523d82523d5f602084013e61500d565b606091505b5050905080611d545760405162461bcd60e51b815260206004820152602360248201527f4661696c656420746f20666f727761726420457468657220746f20747265617360448201526275727960e81b6064820152608401610855565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405180608001604052806150e560405180606001604052805f81526020015f81526020015f81525090565b81526020016150f261516e565b815260200161511860405180606001604052805f81526020015f81526020015f81525090565b815260200161512561516e565b905290565b60405180606001604052805f81526020016151436151ab565b81526020015f81525090565b604051806107800160405280603c906020820280368337509192915050565b6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6040518061064001604052806032906020820280368337509192915050565b6001600160a01b0381168114611d54575f5ffd5b5f602082840312156151ee575f5ffd5b81356151f9816151ca565b9392505050565b5f5f5f60608486031215615212575f5ffd5b505081359360208301359350604090920135919050565b5f60208284031215615239575f5ffd5b5035919050565b805f5b603c811015615262578151845260209384019390910190600101615243565b50505050565b61078081016152778284615240565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff811182821017156152b5576152b561527d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156152e4576152e461527d565b604052919050565b5f67ffffffffffffffff8211156153055761530561527d565b50601f01601f191660200190565b5f60208284031215615323575f5ffd5b813567ffffffffffffffff811115615339575f5ffd5b8201601f81018413615349575f5ffd5b803561535c615357826152ec565b6152bb565b818152856020838501011115615370575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f6080838503121561539e575f5ffd5b82359150608083018410156153b1575f5ffd5b50926020919091019150565b5f5f5f606084860312156153cf575f5ffd5b83356153da816151ca565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561543e576154288683518051825260208082015190830152604090810151910152565b6060959095019460209190910190600101615401565b5093949350505050565b602081525f6151f960208301846153ef565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6151f9602083018461545a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301525050565b5f8151808452602084019350602083015f5b8281101561543e5761550d86835161549a565b6101009590950194602091909101906001016154fa565b608081525f61553660808301876153ef565b828103602084015261554881876154e8565b9050828103604084015261555c81866154e8565b8381036060850152845180825260208087019350909101905f5b818110156155b35761559d8385518051825260208082015190830152604090810151910152565b6020939093019260609290920191600101615576565b509098975050505050505050565b5f5f604083850312156155d2575f5ffd5b50508035926020909101359150565b5f602082840312156155f1575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601490820152732237b713ba103430bb32903a34329033b2b7329760611b604082015260600190565b5f6060828403121561564f575f5ffd5b6040516060810167ffffffffffffffff811182821017156156725761567261527d565b60409081528351825260208085015190830152928301519281019290925250919050565b5f606082840312156156a6575f5ffd5b6151f9838361563f565b5f6101008284031280156156c2575f5ffd5b506156cb615291565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e0928301519281019290925250919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156152775761527761571e565b808201808211156152775761527761571e565b5f6106408284031215615769575f5ffd5b5f83601f840112615778575f5ffd5b505f80610640615787816152bb565b925082915084018581111561579a575f5ffd5b845b818110156157b457805184526020938401930161579c565b509095945050505050565b8351815260208085015190820152604080850151908201526107e081016157e9606083018561549a565b8251610160830152602083015161018083015f5b603281101561581c5782518252602092830192909101906001016157fd565b50505060408301516107c0830152949350505050565b5f5f60808385031215615843575f5ffd5b61584d848461563f565b6060939093015192949293505050565b6001600160a01b03841681526020810183905260a08101614e4460408301848051825260208082015190830152604090810151910152565b6001600160a01b0384168152602081018390526101408101614e44604083018461549a565b634e487b7160e01b5f52601260045260245ffd5b5f826158dc576158dc6158ba565b500690565b6101c081016158f0828661549a565b8351610100830152602084015161012083015260408401516101408301528251610160830152602083015161018083015260408301516101a0830152614e44565b5f6107808284031215615942575f5ffd5b5f83601f840112615951575f5ffd5b505f80610780615787816152bb565b6020808252601e908201527f496e73756666696369656e74207061796d656e7420746f20657870616e640000604082015260600190565b5f602082840312156159a7575f5ffd5b815167ffffffffffffffff8111156159bd575f5ffd5b8201601f810184136159cd575f5ffd5b80516159db615357826152ec565b8181528560208385010111156159ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b828152604060208201525f614e44604083018461545a565b604081525f615a36604083018561545a565b90508260208301529392505050565b634e487b7160e01b5f52603260045260245ffd5b80820281158282048414176152775761527761571e565b6001600160a01b03831681526107a081016151f96020830184615240565b604081525f615aa0604083018561545a565b8281036020840152615ab2818561545a565b95945050505050565b5f60208284031215615acb575f5ffd5b81516151f9816151ca565b5f82615ae457615ae46158ba565b50049056fea264697066735822122050f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f83264736f6c634300081c0033
Deployed Bytecode Sourcemap
26162:41328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26230:37;;;;;;;;;;-1:-1:-1;26230:37:0;;;;-1:-1:-1;;;;;26230:37:0;;;;;;-1:-1:-1;;;;;201:32:1;;;183:51;;171:2;156:18;26230:37:0;;;;;;;;29229:230;;;;;;;;;;-1:-1:-1;29229:230:0;;;;;:::i;:::-;;:::i;:::-;;49616:11374;;;;;;;;;;-1:-1:-1;49616:11374:0;;;;;:::i;:::-;;:::i;30601:101::-;;;;;;;;;;-1:-1:-1;30601:101:0;;;;;:::i;:::-;;:::i;65226:217::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27784:38::-;;;;;;;;;;;;;;;;;;;2039:25:1;;;2027:2;2012:18;27784:38:0;1893:177:1;27496:42:0;;;;;;;;;;;;;;;;28032:43;;;;;;;;;;;;;;;;29892:110;;;;;;;;;;-1:-1:-1;29892:110:0;;;;;:::i;:::-;;:::i;30708:114::-;;;;;;;;;;-1:-1:-1;30708:114:0;;;;;:::i;:::-;;:::i;61424:991::-;;;;;;:::i;:::-;;:::i;29465:255::-;;;;;;;;;;;;;:::i;64594:626::-;;;;;;;;;;-1:-1:-1;64594:626:0;;;;;:::i;:::-;;:::i;26274:37::-;;;;;;;;;;-1:-1:-1;26274:37:0;;;;-1:-1:-1;;;;;26274:37:0;;;27079;;;;;;;;;;;;;;;;65587:645;;;;;;;;;;-1:-1:-1;65587:645:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38313:604::-;;;;;;:::i;:::-;;:::i;27222:38::-;;;;;;;;;;;;;;;;28747:36;;;;;;;;;;-1:-1:-1;28747:36:0;;;;-1:-1:-1;;;;;28747:36:0;;;27982:42;;;;;;;;;;;;;;;;32218:689;;;;;;;;;;;;;:::i;:::-;;;;6122:25:1;;;6178:2;6163:18;;6156:34;;;;6206:18;;;6199:34;6110:2;6095:18;32218:689:0;5920:319:1;64216:261:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27871:37::-;;;;;;;;;;;;;;;;30008:112;;;;;;;;;;-1:-1:-1;30008:112:0;;;;;:::i;:::-;;:::i;2788:103::-;;;;;;;;;;;;;:::i;30492:::-;;;;;;;;;;-1:-1:-1;30492:103:0;;;;;:::i;:::-;;:::i;62470:1009::-;;;;;;:::i;:::-;;:::i;29778:108::-;;;;;;;;;;-1:-1:-1;29778:108:0;;;;;:::i;:::-;;:::i;28802:181::-;;;;;;;;;;-1:-1:-1;28802:181:0;;;;;:::i;:::-;;:::i;27459:30::-;;;;;;;;;;-1:-1:-1;27459:30:0;;;;;:::i;:::-;;:::i;:::-;;;;7106:25:1;;;7162:2;7147:18;;7140:34;;;;7190:18;;;7183:34;;;;7248:2;7233:18;;7226:34;;;;7291:3;7276:19;;7269:35;7335:3;7320:19;;7313:35;7379:3;7364:19;;7357:35;7423:3;7408:19;;7401:35;7093:3;7078:19;27459:30:0;6763:679:1;33082:431:0;;;;;;;;;;-1:-1:-1;33082:431:0;;;;;:::i;:::-;;:::i;:::-;;;;7621:25:1;;;7677:2;7662:18;;7655:34;;;;7594:18;33082:431:0;7447:248:1;2140:87:0;;;;;;;;;;-1:-1:-1;2186:7:0;2213:6;-1:-1:-1;;;;;2213:6:0;2140:87;;31529:429;;;;;;;;;;;;;:::i;27640:43::-;;;;;;;;;;;;;;;;28989:234;;;;;;;;;;-1:-1:-1;28989:234:0;;;;;:::i;:::-;;:::i;30246:118::-;;;;;;;;;;-1:-1:-1;30246:118:0;;;;;:::i;:::-;;:::i;33519:780::-;;;;;;;;;;-1:-1:-1;33519:780:0;;;;;:::i;:::-;;:::i;27563:43::-;;;;;;;;;;;;;;;;40934:8546;;;;;;;;;;-1:-1:-1;40934:8546:0;;;;;:::i;:::-;;:::i;27320:41::-;;;;;;;;;;;;;;;;66244:1233;;;;;;;;;;-1:-1:-1;66244:1233:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30370:116::-;;;;;;;;;;-1:-1:-1;30370:116:0;;;;;:::i;:::-;;:::i;30126:114::-;;;;;;;;;;-1:-1:-1;30126:114:0;;;;;:::i;:::-;;:::i;3046:201::-;;;;;;;;;;-1:-1:-1;3046:201:0;;;;;:::i;:::-;;:::i;35001:3183::-;;;;;;:::i;:::-;;:::i;30828:116::-;;;;;;;;;;-1:-1:-1;30828:116:0;;;;;:::i;:::-;;:::i;29229:230::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29332:34:0;::::1;29324:62;;;::::0;-1:-1:-1;;;29324:62:0;;10588:2:1;29324:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;29324:62:0::1;;;;;;;;;29397:11;:54:::0;;-1:-1:-1;;;;;;29397:54:0::1;-1:-1:-1::0;;;;;29397:54:0;;;::::1;::::0;;;::::1;::::0;;29229:230::o;49616:11374::-;34355:10;34803:18;34849:8;34335:63;;;;-1:-1:-1;;;34335:63:0;;10932:2:1;34335:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;34335:63:0;10730:351:1;34335:63:0;7139:21:::1;:19;:21::i;:::-;49721::::2;49745:25;:23;:25::i;:::-;49793:15;::::0;:44:::2;::::0;-1:-1:-1;;;49793:44:0;;-1:-1:-1;;;;;201:32:1;;;49793:44:0::2;::::0;::::2;183:51:1::0;49721:49:0;;-1:-1:-1;49781:9:0::2;::::0;49793:15;;::::2;::::0;:29:::2;::::0;156:18:1;;49793:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49868:15;::::0;:65:::2;::::0;-1:-1:-1;;;49868:65:0;;49781:56;;-1:-1:-1;49848:17:0::2;::::0;-1:-1:-1;;;;;49868:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;49906:13;;49920:12;;49868:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49848:85;;50093:1;50078:12;:16;50070:49;;;;-1:-1:-1::0;;;50070:49:0::2;;;;;;;:::i;:::-;50156:2;50142:10;:16;;50134:45;;;::::0;-1:-1:-1;;;50134:45:0;;12151:2:1;50134:45:0::2;::::0;::::2;12133:21:1::0;12190:2;12170:18;;;12163:30;-1:-1:-1;;;12209:18:1;;;12202:46;12265:18;;50134:45:0::2;11949:340:1::0;50134:45:0::2;50203:20;;:::i;:::-;50254:15;::::0;:51:::2;::::0;-1:-1:-1;;;50254:51:0;;-1:-1:-1;;;;;50254:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;50285:13;;50299:5;;50254:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50234:71:::0;;50333:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;50333:48:0;;-1:-1:-1;;;;;50333:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;50361:13;;50375:5;;50333:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50316:14;::::0;::::2;:65:::0;50409:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;50409:48:0;;-1:-1:-1;;;;;50409:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;50437:13;;50451:5;;50409:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50392:14;::::0;;::::2;:65:::0;;;;50488:15:::2;::::0;:60;;-1:-1:-1;;;50488:60:0;;-1:-1:-1;;;;;50488:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;50528:13;;50542:5;;50488:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50468:17;::::0;::::2;:80:::0;50559:12:::2;50651:15;50677:33;50696:13:::0;50677:18:::2;:33::i;:::-;50745:17:::0;;:20;:17:::2;:25:::0;50736:49:::2;;;::::0;-1:-1:-1;;;50736:49:0;;14855:2:1;50736:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;50736:49:0::2;14653:334:1::0;50736:49:0::2;51140:10;51152:1;51140:13:::0;51131:5066:::2;;51165:7;51155:17;;51189:55;51205:5;:14;;;51220:5;:17;;;51238:1;51240:3;51189:15;:55::i;:::-;51174:14;::::0;::::2;:70:::0;;;51292:17:::2;::::0;::::2;::::0;51261:55:::2;::::0;51174:70;51310:1:::2;51312:3;51261:15;:55::i;:::-;51246:14;::::0;::::2;:70:::0;51131:5066:::2;;;51380:10;51392:1;51380:13:::0;51376:4821:::2;;51405:7;51395:17;;51429:55;51445:5;:14;;;51460:5;:17;;;51478:1;51480:3;51429:15;:55::i;:::-;51414:14;::::0;::::2;:70:::0;;;51532:17:::2;::::0;::::2;::::0;51501:55:::2;::::0;51414:70;51550:1:::2;51552:3;51501:15;:55::i;51376:4821::-;51579:10;51591:1;51579:13:::0;51575:4622:::2;;51604:7;51594:17;;51628:55;51644:5;:14;;;51659:5;:17;;;51677:1;51679:3;51628:15;:55::i;:::-;51613:14;::::0;::::2;:70:::0;;;51731:17:::2;::::0;::::2;::::0;51700:55:::2;::::0;51613:70;51749:1:::2;51751:3;51700:15;:55::i;51575:4622::-;51778:10;51790:1;51778:13:::0;51774:4423:::2;;51803:7;51793:17;;51827:55;51843:5;:14;;;51858:5;:17;;;51876:1;51878:3;51827:15;:55::i;:::-;51812:14;::::0;::::2;:70:::0;;;51930:17:::2;::::0;::::2;::::0;51899:55:::2;::::0;51812:70;51948:1:::2;51950:3;51899:15;:55::i;51774:4423::-;51977:10;51989:1;51977:13:::0;51973:4224:::2;;52002:7;51992:17;;52026:55;52042:5;:14;;;52057:5;:17;;;52075:1;52077:3;52026:15;:55::i;:::-;52011:14;::::0;::::2;:70:::0;;;52129:17:::2;::::0;::::2;::::0;52098:55:::2;::::0;52011:70;52147:1:::2;52149:3;52098:15;:55::i;51973:4224::-;52176:10;52188:1;52176:13:::0;52172:4025:::2;;52201:7;52191:17;;52225:55;52241:5;:14;;;52256:5;:17;;;52274:1;52276:3;52225:15;:55::i;52172:4025::-;52375:10;52387:1;52375:13:::0;52371:3826:::2;;52400:7;52390:17;;52424:55;52440:5;:14;;;52455:5;:17;;;52473:1;52475:3;52424:15;:55::i;52371:3826::-;52574:10;52586:1;52574:13:::0;52570:3627:::2;;52599:7;52589:17;;52623:55;52639:5;:14;;;52654:5;:17;;;52672:1;52674:3;52623:15;:55::i;52570:3627::-;52773:10;52785:1;52773:13:::0;52769:3428:::2;;52798:7;52788:17;;52822:55;52838:5;:14;;;52853:5;:17;;;52871:1;52873:3;52822:15;:55::i;52769:3428::-;52972:10;52984:1;52972:13:::0;52968:3229:::2;;52997:7;52987:17;;53021:55;53037:5;:14;;;53052:5;:17;;;53070:1;53072:3;53021:15;:55::i;52968:3229::-;53171:10;53183:2;53171:14:::0;53167:3030:::2;;53197:8;53187:18;;53222:55;53238:5;:14;;;53253:5;:17;;;53271:1;53273:3;53222:15;:55::i;53167:3030::-;53403:10;53415:2;53403:14:::0;53399:2798:::2;;53429:8;53419:18;;53454:55;53470:5;:14;;;53485:5;:17;;;53503:1;53505:3;53454:15;:55::i;53399:2798::-;53604:10;53616:2;53604:14:::0;53600:2597:::2;;53630:8;53620:18;;53655:55;53671:5;:14;;;53686:5;:17;;;53704:1;53706:3;53655:15;:55::i;53600:2597::-;53805:10;53817:2;53805:14:::0;53801:2396:::2;;53831:8;53821:18;;53856:55;53872:5;:14;;;53887:5;:17;;;53905:1;53907:3;53856:15;:55::i;53801:2396::-;54006:10;54018:2;54006:14:::0;54002:2195:::2;;54032:8;54022:18;;54057:55;54073:5;:14;;;54088:5;:17;;;54106:1;54108:3;54057:15;:55::i;54002:2195::-;54207:10;54219:2;54207:14:::0;54203:1994:::2;;54233:8;54223:18;;54258:55;54274:5;:14;;;54289:5;:17;;;54307:1;54309:3;54258:15;:55::i;54203:1994::-;54408:10;54420:2;54408:14:::0;54404:1793:::2;;54434:8;54424:18;;54459:55;54475:5;:14;;;54490:5;:17;;;54508:1;54510:3;54459:15;:55::i;54404:1793::-;54609:10;54621:2;54609:14:::0;54605:1592:::2;;54635:8;54625:18;;54660:55;54676:5;:14;;;54691:5;:17;;;54709:1;54711:3;54660:15;:55::i;54605:1592::-;54810:10;54822:2;54810:14:::0;54806:1391:::2;;54836:8;54826:18;;54861:55;54877:5;:14;;;54892:5;:17;;;54910:1;54912:3;54861:15;:55::i;54806:1391::-;55011:10;55023:2;55011:14:::0;55007:1190:::2;;55037:8;55027:18;;55062:55;55078:5;:14;;;55093:5;:17;;;55111:1;55113:3;55062:15;:55::i;55007:1190::-;55212:10;55224:2;55212:14:::0;55208:989:::2;;55238:8;55228:18;;55263:55;55279:5;:14;;;55294:5;:17;;;55312:1;55314:3;55263:15;:55::i;55208:989::-;55413:10;55425:2;55413:14:::0;55409:788:::2;;55439:8;55429:18;;55464:55;55480:5;:14;;;55495:5;:17;;;55513:1;55515:3;55464:15;:55::i;55409:788::-;55614:10;55626:2;55614:14:::0;55610:587:::2;;55640:8;55630:18;;55665:55;55681:5;:14;;;55696:5;:17;;;55714:1;55716:3;55665:15;:55::i;55610:587::-;55815:10;55827:2;55815:14:::0;55811:386:::2;;55841:8;55831:18;;55866:55;55882:5;:14;;;55897:5;:17;;;55915:1;55917:3;55866:15;:55::i;55811:386::-;56016:10;56028:2;56016:14:::0;56012:185:::2;;56042:8;56032:18;;56067:55;56083:5;:14;;;56098:5;:17;;;56116:1;56118:3;56067:15;:55::i;:::-;56052:14;::::0;::::2;:70:::0;;;56170:17:::2;::::0;::::2;::::0;56139:55:::2;::::0;56052:70;56188:1:::2;56190:3;56139:15;:55::i;:::-;56124:14;::::0;::::2;:70:::0;56012:185:::2;56208:17;56239:5;:14;;;:22;;;56228:8;:33;;;;:::i;:::-;56208:53;;56388:7;56372:12;:23;;56364:55;;;::::0;-1:-1:-1;;;56364:55:0;;15459:2:1;56364:55:0::2;::::0;::::2;15441:21:1::0;15498:2;15478:18;;;15471:30;-1:-1:-1;;;15517:18:1;;;15510:49;15576:18;;56364:55:0::2;15257:343:1::0;56364:55:0::2;56449:15;;56434:12;:30;56430:69;;;-1:-1:-1::0;56482:15:0::2;::::0;56430:69:::2;56543:23;56559:7:::0;56543:23;::::2;:::i;:::-;::::0;-1:-1:-1;56622:23:0::2;56543::::0;56622:8;:23:::2;:::i;:::-;56597:14;::::0;::::2;::::0;;:22:::2;;:48:::0;;;;56698:14;:30;;56721:7;;56698:14;:30:::2;::::0;56721:7;;56698:30:::2;:::i;:::-;::::0;;-1:-1:-1;56739:15:0::2;56747:7:::0;56739:15;::::2;:::i;:::-;56827:17:::0;;:23:::2;;::::0;56739:15;;-1:-1:-1;56854:1:0::2;56827:28;:77:::0;::::2;;;-1:-1:-1::0;56885:19:0::2;::::0;56863:14:::2;::::0;::::2;::::0;:19;:41:::2;56827:77;56826:209;;;-1:-1:-1::0;56956:17:0;;:23:::2;;::::0;56983:1:::2;56956:28;:78:::0;::::2;;;-1:-1:-1::0;57014:20:0::2;::::0;56992:14:::2;::::0;::::2;::::0;:19;:42:::2;56956:78;56822:3959;;;57181:50;;:::i;:::-;57246:32:::0;;;57321:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;57321:57:0;;-1:-1:-1;;;;;201:32:1;;;57321:57:0::2;::::0;::::2;183:51:1::0;57321:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;57321:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57293:25;::::0;;::::2;:85:::0;;;;57430:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;57430:64:0;;::::2;16697:66:1::0;;;;57461:15:0::2;16779:12:1::0;;;16772:28;57477:16:0::2;16816:12:1::0;;;16809:28;16853:12;;57430:64:0::2;::::0;;-1:-1:-1;;57430:64:0;;::::2;::::0;;;;;;57420:75;;57430:64:::2;57420:75:::0;;::::2;::::0;57393:19;;::::2;:103:::0;57594:11:::2;::::0;57623:17;;57641:14;;::::2;::::0;57594:76;;-1:-1:-1;;;57594:76:0;;57415:81:::2;::::0;-1:-1:-1;;;;;57594:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;57623:17;;57641:14;57393:12;;57594:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57552:5;:17;;57551:119;;;;;;;;57697:15;;;;;;;;;-1:-1:-1::0;;;;;57697:15:0::2;-1:-1:-1::0;;;;;57697:30:0::2;;57728:13;57742:5;57750;:17;;;57697:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57886:118;;;;;;;;57900:5;:14;;;:19;;;57886:118;;;;57941:19;;57930:8;:30;;;;:::i;:::-;57886:118;;;;57981:21;;57970:8;:32;;;;:::i;:::-;57886:118;;::::0;57869:5:::2;:14;;:135;;;;58019:15;;;;;;;;;-1:-1:-1::0;;;;;58019:15:0::2;-1:-1:-1::0;;;;;58019:27:0::2;;58047:13;58062:5;58069;:14;;;58019:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;58162:11:0::2;::::0;58186:17;;:20;58162:45:::2;::::0;-1:-1:-1;;;58162:45:0;;-1:-1:-1;;;;;58162:11:0;;::::2;::::0;-1:-1:-1;58162:23:0::2;::::0;-1:-1:-1;58162:45:0::2;::::0;::::2;;2039:25:1::0;;;2027:2;2012:18;;1893:177;58162:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58142:5;:17;;:65;;;;58283:15;;;;;;;;;-1:-1:-1::0;;;;;58283:15:0::2;-1:-1:-1::0;;;;;58283:39:0::2;;58323:13;58338:5;58345;:17;;;58283:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58437:55;58453:5;:14;;;58468:5;:17;;;58486:1;58488:3;58437:15;:55::i;:::-;58422:14;::::0;::::2;:70:::0;;;58553:17:::2;::::0;::::2;::::0;58522:55:::2;::::0;58422:70;58571:1:::2;58573:3;58522:15;:55::i;:::-;58507:14;::::0;::::2;:70:::0;;;58638:17:::2;::::0;::::2;::::0;58607:55:::2;::::0;58507:70;58656:1:::2;58658:3;58607:15;:55::i;:::-;58592:14;::::0;::::2;:70:::0;;;58723:17:::2;::::0;::::2;::::0;58692:55:::2;::::0;58592:70;58741:1:::2;58743:3;58692:15;:55::i;:::-;58677:14;::::0;::::2;:70:::0;;;58808:17:::2;::::0;::::2;::::0;58777:55:::2;::::0;58677:70;58826:1:::2;58828:3;58777:15;:55::i;:::-;58762:14;::::0;::::2;:70:::0;58877:17;;:23:::2;;::::0;58904:1:::2;58877:28:::0;58873:484:::2;;58951:17:::0;;:25;;58975:1:::2;::::0;58951:17;:25:::2;::::0;58975:1;;58951:25:::2;:::i;:::-;::::0;;-1:-1:-1;59053:17:0;;:20;59076:5:::2;-1:-1:-1::0;59049:289:0::2;;;59182:17:::0;;:20;:28:::2;::::0;59205:5:::2;::::0;59182:28:::2;:::i;:::-;59159:14;::::0;::::2;::::0;:20:::2;;:51:::0;59049:289:::2;;;59290:17:::0;;:20;:24:::2;::::0;59313:1:::2;::::0;59290:24:::2;:::i;:::-;59267:14;::::0;::::2;::::0;:20:::2;;:47:::0;59049:289:::2;59375:17:::0;;:23:::2;;::::0;59402:1:::2;59375:28:::0;59371:540:::2;;59525:17:::0;;:25;;59549:1:::2;::::0;59525:17;:25:::2;::::0;59549:1;;59525:25:::2;:::i;:::-;::::0;;-1:-1:-1;59623:17:0;;:20;59646:5:::2;-1:-1:-1::0;59619:277:0::2;;;59750:17:::0;;:20;:28:::2;::::0;59773:5:::2;::::0;59750:28:::2;:::i;:::-;59725:14;::::0;::::2;::::0;:22:::2;;:53:::0;59619:277:::2;;;59852:17:::0;;:20;:24:::2;::::0;59875:1:::2;::::0;59852:24:::2;:::i;:::-;59827:14;::::0;::::2;::::0;:22:::2;;:49:::0;59619:277:::2;59925:15;;;;;;;;;-1:-1:-1::0;;;;;59925:15:0::2;-1:-1:-1::0;;;;;59925:27:0::2;;59953:13;59968:5;59976;:14;;;59925:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;60091:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;60091:40:0;;-1:-1:-1;;;;;201:32:1;;;60091:40:0::2;::::0;::::2;183:51:1::0;60076:12:0::2;::::0;-1:-1:-1;60091:15:0;;::::2;::::0;-1:-1:-1;60091:25:0::2;::::0;156:18:1;;60091:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60229:17:::0;;:20;60076:55;;-1:-1:-1;60253:5:0::2;::::0;60229:22:::2;::::0;60250:1:::2;::::0;60229:22:::2;:::i;:::-;60228:30;;;;:::i;:::-;60338:15;::::0;:48:::2;::::0;-1:-1:-1;;;60338:48:0;;60222:1:::2;:37:::0;;::::2;60210:50:::0;;;::::2;::::0;-1:-1:-1;;;;;60338:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;60364:13;;60210:50;;60338:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57037:3440;;;56822:3959;;;60623:15;::::0;60674:14:::2;::::0;::::2;::::0;60623:66:::2;::::0;-1:-1:-1;;;60623:66:0;;-1:-1:-1;;;;;60623:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;60651:13;;60666:5;;60623:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;60704:15:0::2;::::0;60754:14:::2;::::0;;::::2;::::0;60704:65;;-1:-1:-1;;;60704:65:0;;-1:-1:-1;;;;;60704:15:0;;::::2;::::0;-1:-1:-1;60704:27:0::2;::::0;-1:-1:-1;60704:65:0::2;::::0;60732:13;;60747:5;;60704:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56822:3959;60853:15;::::0;:43:::2;::::0;-1:-1:-1;;;60853:43:0;;-1:-1:-1;;;;;60853:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;60876:13;;60891:4;;60853:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60912:66;60930:5;:14;;;60945:5;:17;;;60963:5;:14;;;60912:66;;;;;;;;:::i;:::-;;;;;;;;49710:11280;;;;;;;7183:20:::1;6577:1:::0;7703:22;;7520:213;7183:20:::1;49616:11374:::0;;;:::o;30601:101::-;2026:13;:11;:13::i;:::-;30670:14:::1;:24:::0;30601:101::o;65226:217::-;65279:26;;:::i;:::-;65318:21;65342:25;:23;:25::i;:::-;65391:15;;:44;;-1:-1:-1;;;65391:44:0;;-1:-1:-1;;;;;201:32:1;;;65391:44:0;;;183:51:1;65318:49:0;;-1:-1:-1;65391:15:0;;;:29;;156:18:1;;65391:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65378:57;;65307:136;65226:217;:::o;29892:110::-;2026:13;:11;:13::i;:::-;29966:16:::1;:28:::0;29892:110::o;30708:114::-;2026:13;:11;:13::i;:::-;30784:19:::1;:30:::0;30708:114::o;61424:991::-;7139:21;:19;:21::i;:::-;61535:14:::1;;61522:9;:27;61514:70;;;;-1:-1:-1::0;;;61514:70:0::1;;;;;;;:::i;:::-;61603:27;61620:9;61603:16;:27::i;:::-;61595:56;;;::::0;-1:-1:-1;;;61595:56:0;;21488:2:1;61595:56:0::1;::::0;::::1;21470:21:1::0;21527:2;21507:18;;;21500:30;-1:-1:-1;;;21546:18:1;;;21539:46;21602:18;;61595:56:0::1;21286:340:1::0;61595:56:0::1;61662:21;61686:25;:23;:25::i;:::-;61748:15;::::0;:37:::1;::::0;-1:-1:-1;;;61748:37:0;;-1:-1:-1;;;;;201:32:1;;;61748:37:0::1;::::0;::::1;183:51:1::0;61662:49:0;;-1:-1:-1;61731:14:0::1;::::0;61748:15;;::::1;::::0;:22:::1;::::0;156:18:1;;61748:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61881:15;::::0;:40:::1;::::0;-1:-1:-1;;;61881:40:0;;::::1;::::0;::::1;2039:25:1::0;;;61731:54:0;;-1:-1:-1;;;;;;61881:15:0::1;::::0;:29:::1;::::0;2012:18:1;;61881:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;61881:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;61875:54:::0;:59;61867:108:::1;;;::::0;-1:-1:-1;;;61867:108:0;;22525:2:1;61867:108:0::1;::::0;::::1;22507:21:1::0;22564:2;22544:18;;;22537:30;22603:34;22583:18;;;22576:62;-1:-1:-1;;;22654:18:1;;;22647:34;22698:19;;61867:108:0::1;22323:400:1::0;61867:108:0::1;62055:15;::::0;:40:::1;::::0;-1:-1:-1;;;62055:40:0;;-1:-1:-1;;;;;62055:15:0;;::::1;::::0;:29:::1;::::0;:40:::1;::::0;62085:9;;62055:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45:::0;62047:81:::1;;;::::0;-1:-1:-1;;;62047:81:0;;22930:2:1;62047:81:0::1;::::0;::::1;22912:21:1::0;22969:2;22949:18;;;22942:30;23008:25;22988:18;;;22981:53;23051:18;;62047:81:0::1;22728:347:1::0;62047:81:0::1;62173:15;::::0;:54:::1;::::0;-1:-1:-1;;;62173:54:0;;-1:-1:-1;;;;;62173:15:0;;::::1;::::0;:32:::1;::::0;:54:::1;::::0;62206:9;;62217;;62173:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;62270:15:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;62270:54:0;;-1:-1:-1;;;;;62270:15:0;;::::1;::::0;-1:-1:-1;62270:32:0::1;::::0;-1:-1:-1;62270:54:0::1;::::0;62303:9;;62314;;62270:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62385:10;-1:-1:-1::0;;;;;62368:39:0::1;;62397:9;62368:39;;;;;;:::i;:::-;;;;;;;;61503:912;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;61424:991;:::o;29465:255::-;2026:13;:11;:13::i;:::-;29622:1:::1;29598:21;:25;29590:62;;;::::0;-1:-1:-1;;;29590:62:0;;23874:2:1;29590:62:0::1;::::0;::::1;23856:21:1::0;23913:2;23893:18;;;23886:30;23952:26;23932:18;;;23925:54;23996:18;;29590:62:0::1;23672:348:1::0;29590:62:0::1;29671:8;::::0;29663:49:::1;::::0;-1:-1:-1;;;;;29671:8:0;;::::1;::::0;29690:21:::1;29663:49:::0;::::1;;;::::0;29671:8:::1;29663:49:::0;29671:8;29663:49;29690:21;29671:8;29663:49;::::1;;;;;;;;;;;;;;;;;;64594:626:::0;7139:21;:19;:21::i;:::-;64691::::1;64715:25;:23;:25::i;:::-;64779:15;::::0;:44:::1;::::0;-1:-1:-1;;;64779:44:0;;-1:-1:-1;;;;;201:32:1;;;64779:44:0::1;::::0;::::1;183:51:1::0;64691:49:0;;-1:-1:-1;64751:25:0::1;::::0;64779:15;;::::1;::::0;:29:::1;::::0;156:18:1;;64779:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64751:72;;64850:2;64843:4;:9;64834:64;;;::::0;-1:-1:-1;;;64834:64:0;;24227:2:1;64834:64:0::1;::::0;::::1;24209:21:1::0;24266:2;24246:18;;;24239:30;24305:34;24285:18;;;24278:62;-1:-1:-1;;;24356:18:1;;;24349:39;24405:19;;64834:64:0::1;24025:405:1::0;64834:64:0::1;64918:9:::0;::::1;64931;::::0;::::1;;64918:22;::::0;::::1;::::0;:48:::1;;-1:-1:-1::0;64944:9:0;::::1;64957::::0;;::::1;;64944:22;;64918:48;:74;;;;-1:-1:-1::0;64983:9:0::1;64970::::0;::::1;;64983::::0;;::::1;;64970:22;;64918:74;64909:119;;;::::0;-1:-1:-1;;;64909:119:0;;24769:2:1;64909:119:0::1;::::0;::::1;24751:21:1::0;24808:2;24788:18;;;24781:30;24847:33;24827:18;;;24820:61;24898:18;;64909:119:0::1;24567:355:1::0;64909:119:0::1;65057:9:::0;::::1;65039::::0;65049:6:::1;:4:::0;65054:1:::1;65049:6;:::i;:::-;65039:17;;;;;;;:::i;:::-;;;;:27:::0;65097:6;65104:1:::1;65097:9;;;;65077::::0;65087:6:::1;:4:::0;65092:1:::1;65087:6;:::i;:::-;:8;::::0;65094:1:::1;65087:8;:::i;:::-;65077:19;;;;;;;:::i;:::-;;;;:29:::0;65137:9;;::::1;;65117::::0;65127:6:::1;:4:::0;65132:1:::1;65127:6;:::i;:::-;:8;::::0;65134:1:::1;65127:8;:::i;:::-;65117:19;;;;;;;:::i;:::-;;;;:29:::0;65157:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;65157:55:0;;-1:-1:-1;;;;;65157:15:0;;::::1;::::0;:29:::1;::::0;:55:::1;::::0;65187:13;;65202:9;;65157:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64680:540;;7183:20:::0;6577:1;7703:22;;7520:213;7183:20;64594:626;;:::o;65587:645::-;65749:15;;:34;;-1:-1:-1;;;65749:34:0;;-1:-1:-1;;;;;201:32:1;;;65749:34:0;;;183:51:1;65690:29:0;;65732:14;;65749:15;;;:25;;156:18:1;;65749:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65732:51;;65817:10;65802:11;:25;;65794:84;;;;-1:-1:-1;;;65794:84:0;;25649:2:1;65794:84:0;;;25631:21:1;25688:2;25668:18;;;25661:30;25727:34;25707:18;;;25700:62;-1:-1:-1;;;25778:18:1;;;25771:44;25832:19;;65794:84:0;25447:410:1;65794:84:0;65910:9;65897:10;:22;65889:72;;;;-1:-1:-1;;;65889:72:0;;26064:2:1;65889:72:0;;;26046:21:1;26103:2;26083:18;;;26076:30;26142:34;26122:18;;;26115:62;-1:-1:-1;;;26193:18:1;;;26186:35;26238:19;;65889:72:0;25862:401:1;65889:72:0;65974:16;65993:24;66006:11;65993:10;:24;:::i;:::-;:28;;66020:1;65993:28;:::i;:::-;65974:47;;66061:11;66046:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66046:27:0;;;;;;;;;;;;;;;;-1:-1:-1;66032:41:0;-1:-1:-1;66091:6:0;66086:139;66107:11;66103:1;:15;66086:139;;;66157:15;;-1:-1:-1;;;;;66157:15:0;:30;66188:7;66197:15;66211:1;66197:11;:15;:::i;:::-;66157:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66140:11;66152:1;66140:14;;;;;;;;:::i;:::-;;;;;;;;;;:73;66120:3;;66086:139;;;;65721:511;;65587:645;;;;;:::o;38313:604::-;7139:21;:19;:21::i;:::-;38396::::1;38420:25;:23;:25::i;:::-;38396:49;;38595:14;38611:18;38633:42;38657:17;38633:23;:42::i;:::-;38594:81;;;;38708:13;38695:9;:26;38687:69;;;;-1:-1:-1::0;;;38687:69:0::1;;;;;;;:::i;:::-;38767:15;::::0;-1:-1:-1;;;;;38767:15:0::1;:25;38793:13:::0;38808:27:::1;38818:17:::0;38808:9;:27:::1;:::i;:::-;38767:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38885:24;:22;:24::i;:::-;38385:532;;;7183:20:::0;6577:1;7703:22;;7520:213;32218:689;32269:14;32285:25;32312:16;32350:21;32374:25;:23;:25::i;:::-;32447:15;;:44;;-1:-1:-1;;;32447:44:0;;-1:-1:-1;;;;;201:32:1;;;32447:44:0;;;183:51:1;32350:49:0;;-1:-1:-1;32410:16:0;;32447:15;;;;:29;;156:18:1;;32447:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32429:62;;:15;:62;:::i;:::-;32410:81;;32521:8;32506:11;:23;32502:398;;32597:1;32585:13;;32636:1;32613:24;;32502:398;;;32734:15;;:40;;-1:-1:-1;;;32734:40:0;;-1:-1:-1;;;;;201:32:1;;;32734:40:0;;;183:51:1;32734:15:0;;;;:25;;156:18:1;;32734:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32722:52;-1:-1:-1;32812:22:0;32823:11;32812:8;:22;:::i;:::-;32789:45;;32879:9;32863:15;;:25;;;;:::i;:::-;32849:39;;32502:398;32330:577;;32218:689;;;:::o;64216:261::-;64260:13;64308:21;64332:25;:23;:25::i;:::-;64379:15;;:38;;-1:-1:-1;;;64379:38:0;;-1:-1:-1;;;;;201:32:1;;;64379:38:0;;;183:51:1;64308:49:0;;-1:-1:-1;64368:8:0;;64379:15;;;;:23;;156:18:1;;64379:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64435:15;;:34;;-1:-1:-1;;;64435:34:0;;;;;2039:25:1;;;64368:49:0;;-1:-1:-1;;;;;;64435:15:0;;:29;;2012:18:1;;64435:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64435:34:0;;;;;;;;;;;;:::i;:::-;64428:41;;;;64216:261;:::o;30008:112::-;2026:13;:11;:13::i;:::-;30083:18:::1;:29:::0;30008:112::o;2788:103::-;2026:13;:11;:13::i;:::-;2853:30:::1;2880:1;2853:18;:30::i;:::-;2788:103::o:0;30492:::-;2026:13;:11;:13::i;:::-;30562:15:::1;:25:::0;30492:103::o;62470:1009::-;7139:21;:19;:21::i;:::-;62582:14:::1;;62569:9;:27;62561:70;;;;-1:-1:-1::0;;;62561:70:0::1;;;;;;;:::i;:::-;62650:30;62667:12;62650:16;:30::i;:::-;62642:63;;;::::0;-1:-1:-1;;;62642:63:0;;26470:2:1;62642:63:0::1;::::0;::::1;26452:21:1::0;26509:2;26489:18;;;26482:30;-1:-1:-1;;;26528:18:1;;;26521:50;26588:18;;62642:63:0::1;26268:344:1::0;62642:63:0::1;62716:21;62740:25;:23;:25::i;:::-;62839:15;::::0;:37:::1;::::0;-1:-1:-1;;;62839:37:0;;-1:-1:-1;;;;;201:32:1;;;62839:37:0::1;::::0;::::1;183:51:1::0;62716:49:0;;-1:-1:-1;62822:14:0::1;::::0;62839:15;;::::1;::::0;:22:::1;::::0;156:18:1;;62839:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62957:15;::::0;:40:::1;::::0;-1:-1:-1;;;62957:40:0;;::::1;::::0;::::1;2039:25:1::0;;;62822:54:0;;-1:-1:-1;62929:25:0::1;::::0;-1:-1:-1;;;;;62957:15:0;;::::1;::::0;:29:::1;::::0;2012:18:1;;62957:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;62957:40:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;63065:15;::::0;:43:::1;::::0;-1:-1:-1;;;63065:43:0;;62929:68;;-1:-1:-1;;;;;;63065:15:0::1;::::0;:29:::1;::::0;:43:::1;::::0;63095:12;;63065:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48:::0;63057:88:::1;;;::::0;-1:-1:-1;;;63057:88:0;;26819:2:1;63057:88:0::1;::::0;::::1;26801:21:1::0;26858:2;26838:18;;;26831:30;26897:29;26877:18;;;26870:57;26944:18;;63057:88:0::1;26617:351:1::0;63057:88:0::1;63166:15;::::0;:57:::1;::::0;-1:-1:-1;;;63166:57:0;;-1:-1:-1;;;;;63166:15:0;;::::1;::::0;:32:::1;::::0;:57:::1;::::0;63199:9;;63210:12;;63166:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63244:15:0::1;::::0;:57:::1;::::0;-1:-1:-1;;;63244:57:0;;-1:-1:-1;;;;;63244:15:0;;::::1;::::0;-1:-1:-1;63244:32:0::1;::::0;-1:-1:-1;63244:57:0::1;::::0;63277:12;;63291:9;;63244:57:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63324:15:0::1;::::0;:52:::1;::::0;-1:-1:-1;;;63324:52:0;;-1:-1:-1;;;;;63324:15:0;;::::1;::::0;-1:-1:-1;63324:39:0::1;::::0;-1:-1:-1;63324:52:0::1;::::0;63364:11;;63324:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63433:10;-1:-1:-1::0;;;;;63417:54:0::1;;63445:11;63458:12;63417:54;;;;;;;:::i;:::-;;;;;;;;62550:929;;;7183:20:::0;6577:1;7703:22;;7520:213;29778:108;2026:13;:11;:13::i;:::-;29851:15:::1;:27:::0;29778:108::o;28802:181::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;28886:26:0;::::1;28878:63;;;::::0;-1:-1:-1;;;28878:63:0;;27563:2:1;28878:63:0::1;::::0;::::1;27545:21:1::0;27602:2;27582:18;;;27575:30;27641:26;27621:18;;;27614:54;27685:18;;28878:63:0::1;27361:348:1::0;28878:63:0::1;28952:8;:23:::0;;-1:-1:-1;;;;;;28952:23:0::1;-1:-1:-1::0;;;;;28952:23:0;;;::::1;::::0;;;::::1;::::0;;28802:181::o;27459:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27459:30:0;;;;;;;;;;;:::o;33082:431::-;33166:14;33182:18;33213:21;33237:25;:23;:25::i;:::-;33285:15;;:40;;-1:-1:-1;;;33285:40:0;;-1:-1:-1;;;;;201:32:1;;;33285:40:0;;;183:51:1;33213:49:0;;-1:-1:-1;33285:15:0;;;:25;;156:18:1;;33285:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33273:52;-1:-1:-1;33383:3:0;33345:35;33273:52;33345:23;:35;:::i;:::-;:41;33336:51;;;;;;33476:23;33459:16;;:40;;;;:::i;:::-;33443:56;;33202:311;33082:431;;;:::o;31529:429::-;31768:15;;:42;;-1:-1:-1;;;31768:42:0;;31799:10;31768:42;;;183:51:1;31585:7:0;;;;-1:-1:-1;;;;;31768:15:0;;;;:30;;156:18:1;;31768:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31744:66;-1:-1:-1;;;;;;31825:27:0;;31821:130;;31876:10;31869:17;;;31529:429;:::o;31821:130::-;31926:13;31529:429;-1:-1:-1;31529:429:0:o;28989:234::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;29096:34:0;::::1;29088:62;;;::::0;-1:-1:-1;;;29088:62:0;;10588:2:1;29088:62:0::1;::::0;::::1;10570:21:1::0;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:45;10701:18;;29088:62:0::1;10386:339:1::0;29088:62:0::1;29161:15;:54:::0;;-1:-1:-1;;;;;;29161:54:0::1;-1:-1:-1::0;;;;;29161:54:0;;;::::1;::::0;;;::::1;::::0;;28989:234::o;30246:118::-;2026:13;:11;:13::i;:::-;30324:21:::1;:32:::0;30246:118::o;33519:780::-;33570:9;33581:12;33595:14;33643:21;33667:25;:23;:25::i;:::-;33728:15;;:47;;-1:-1:-1;;;33728:47:0;;33643:49;;-1:-1:-1;33703:22:0;;-1:-1:-1;;;;;33728:15:0;;;;:27;;:47;;33643:49;;33770:4;;33728:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33793:13;;33893:15;;33874:16;;;;33793:13;;-1:-1:-1;33703:72:0;;-1:-1:-1;33833:15:0;;33893;33863:27;;33833:15;33863:27;:::i;:::-;:45;33859:172;;;33935:15;;33925:25;;33859:172;;;34003:16;;;;33993:26;;:8;:26;:::i;:::-;33983:36;;33859:172;34063:8;34045;:15;;;:26;34041:251;;;34100:1;34088:13;;34041:251;;;34152:14;;34141:8;34123;:15;;;:26;;;;:::i;:::-;:43;34119:173;;;34213:8;34195;:15;;;:26;;;;:::i;:::-;34183:38;;34119:173;;;34266:14;;34254:26;;34119:173;33611:688;;;33519:780;;;;;:::o;40934:8546::-;34355:10;34803:18;34849:8;34335:63;;;;-1:-1:-1;;;34335:63:0;;10932:2:1;34335:63:0;;;10914:21:1;10971:2;10951:18;;;10944:30;11010:29;10990:18;;;10983:57;11057:18;;34335:63:0;10730:351:1;34335:63:0;7139:21:::1;:19;:21::i;:::-;41037::::2;41061:25;:23;:25::i;:::-;41117:15;::::0;:65:::2;::::0;-1:-1:-1;;;41117:65:0;;41037:49;;-1:-1:-1;41097:17:0::2;::::0;-1:-1:-1;;;;;41117:15:0;;::::2;::::0;:37:::2;::::0;:65:::2;::::0;41037:49;;41169:12;;41117:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41097:85;;41342:1;41327:12;:16;41319:49;;;;-1:-1:-1::0;;;41319:49:0::2;;;;;;;:::i;:::-;41404:2;41391:9;:15;;41383:43;;;::::0;-1:-1:-1;;;41383:43:0;;28172:2:1;41383:43:0::2;::::0;::::2;28154:21:1::0;28211:2;28191:18;;;28184:30;-1:-1:-1;;;28230:18:1;;;28223:45;28285:18;;41383:43:0::2;27970:339:1::0;41383:43:0::2;41450:20;;:::i;:::-;41501:15;::::0;:51:::2;::::0;-1:-1:-1;;;41501:51:0;;-1:-1:-1;;;;;41501:15:0;;::::2;::::0;:30:::2;::::0;:51:::2;::::0;41532:13;;41546:5;;41501:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41481:71:::0;;41580:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;41580:48:0;;-1:-1:-1;;;;;41580:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;41608:13;;41622:5;;41580:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41563:14;::::0;::::2;:65:::0;41656:15:::2;::::0;:48:::2;::::0;-1:-1:-1;;;41656:48:0;;-1:-1:-1;;;;;41656:15:0;;::::2;::::0;:27:::2;::::0;:48:::2;::::0;41684:13;;41698:5;;41656:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41639:14;::::0;;::::2;:65:::0;;;;41735:15:::2;::::0;:60;;-1:-1:-1;;;41735:60:0;;-1:-1:-1;;;;;41735:15:0;;::::2;::::0;:39:::2;::::0;:60:::2;::::0;41775:13;;41789:5;;41735:60:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41715:17;::::0;::::2;:80:::0;41818:15:::2;::::0;:44:::2;::::0;-1:-1:-1;;;41818:44:0;;-1:-1:-1;;;;;201:32:1;;;41818:44:0::2;::::0;::::2;183:51:1::0;41806:9:0::2;::::0;41818:15:::2;::::0;:29:::2;::::0;156:18:1;;41818:44:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41806:56:::0;-1:-1:-1;41873:10:0::2;::::0;42031:15:::2;42057:33;42076:13:::0;42057:18:::2;:33::i;:::-;42125:17:::0;;:20;:17:::2;:25:::0;42116:49:::2;;;::::0;-1:-1:-1;;;42116:49:0;;14855:2:1;42116:49:0::2;::::0;::::2;14837:21:1::0;14894:2;14874:18;;;14867:30;-1:-1:-1;;;14913:18:1;;;14906:40;14963:18;;42116:49:0::2;14653:334:1::0;42116:49:0::2;42185:9;42196:1;42185:12:::0;42176:618:::2;;42207:7;42199:15;;42176:618;;;42251:9;42262:1;42251:12:::0;42247:547:::2;;42273:8;42265:16;;42247:547;;;42311:9;42322:1;42311:12:::0;42307:487:::2;;42333:8;42325:16;;42307:487;;;42364:9;42375:1;42364:12:::0;42360:434:::2;;42386:8;42378:16;;42360:434;;;42417:9;42428:1;42417:12:::0;42413:381:::2;;42439:8;42431:16;;42413:381;;;42479:9;42490:1;42479:12:::0;42475:319:::2;;42501:8;42493:16;;42475:319;;;42532:9;42543:1;42532:12:::0;42528:266:::2;;42554:8;42546:16;;42528:266;;;42592:9;42603:1;42592:12:::0;42588:206:::2;;42614:8;42606:16;;42588:206;;;42645:9;42656:1;42645:12:::0;42641:153:::2;;42667:8;42659:16;;42641:153;;;42698:9;42709:1;42698:12:::0;42694:100:::2;;42720:8;42712:16;;42694:100;;;42760:9;42771:2;42760:13:::0;42756:38:::2;;42783:8;42775:16;;42756:38;42833:8;42809:5;:14;;;:21;;;:32;42805:1071;;;42910:14;::::0;::::2;::::0;:19;:27:::2;::::0;42932:5;;42910:27:::2;:::i;:::-;42888:14;::::0;::::2;::::0;:49;42952:13:::2;42960:5:::0;42952:13;::::2;:::i;:::-;::::0;-1:-1:-1;43004:16:0::2;43015:5:::0;43004:8;:16:::2;:::i;:::-;42980:14;::::0;;::::2;::::0;:21:::2;:40:::0;43049:2:::2;::::0;-1:-1:-1;42805:1071:0::2;;;43128:14;;43121:5;43110:8;43086:5;:14;;;:21;;;:32;;;;:::i;:::-;:40;;;;:::i;:::-;:56;43082:794;;;43190:19;43254:8;43230:5;:14;;;:21;;;:32;;;;:::i;:::-;43213:14;;:50;;;;:::i;:::-;43301:14;::::0;::::2;::::0;:19;43190:74;;-1:-1:-1;43301:36:0::2;::::0;43190:74;;43301:36:::2;:::i;:::-;43279:14;::::0;::::2;::::0;:58;43353:22:::2;43361:14:::0;43353:22;::::2;:::i;:::-;::::0;-1:-1:-1;43427:5:0;43406:17:::2;:14:::0;43421:2:::2;43406:17;:::i;:::-;43405:28;;;;:::i;:::-;43390:43;;43596:14;;43585:8;:25;;;;:::i;:::-;43561:14;::::0;;::::2;::::0;:21:::2;:49:::0;-1:-1:-1;43082:794:0::2;;;43696:14;::::0;::::2;::::0;:19;:27:::2;::::0;43718:5;;43696:27:::2;:::i;:::-;43674:14;::::0;::::2;::::0;:49;43738:13:::2;43746:5:::0;43738:13;::::2;:::i;:::-;;;43814:5;43790;:14;;;:21;;;:29;;;;:::i;:::-;43766:14;::::0;;::::2;::::0;:21:::2;:53:::0;43849:2:::2;::::0;-1:-1:-1;43082:794:0::2;43890:1355:::0;;::::2;;43957:9;43968:1;43957:12:::0;43953:1292:::2;;43986:67;44002:5;:14;;;44017:5;:17;;;44035:1;44040:12;44037:2;:15;;;;:::i;:::-;43986;:67::i;:::-;43971:14;::::0;::::2;:82:::0;43953:1292:::2;;;44094:9;44105:1;44094:12:::0;44090:1155:::2;;44123:66;44139:5;:14;;;44154:5;:17;;;44172:1;44176:12;44174:1;:14;;;;:::i;44090:1155::-;44221:9;44232:1;44221:12:::0;44217:1028:::2;;44250:66;44266:5;:14;;;44281:5;:17;;;44299:1;44303:12;44301:1;:14;;;;:::i;44217:1028::-;44348:9;44359:1;44348:12:::0;44344:901:::2;;44377:66;44393:5;:14;;;44408:5;:17;;;44426:1;44430:12;44428:1;:14;;;;:::i;44344:901::-;44485:9;44496:1;44485:12:::0;44481:764:::2;;44514:66;44530:5;:14;;;44545:5;:17;;;44563:1;44567:12;44565:1;:14;;;;:::i;44481:764::-;44612:9;44623:1;44612:12:::0;44608:637:::2;;44641:67;44657:5;:14;;;44672:5;:17;;;44690:1;44695:12;44692:2;:15;;;;:::i;44608:637::-;44749:9;44760:1;44749:12:::0;44745:500:::2;;44778:67;44794:5;:14;;;44809:5;:17;;;44827:1;44832:12;44829:2;:15;;;;:::i;44745:500::-;44878:9;44889:1;44878:12:::0;44874:371:::2;;44907:67;44923:5;:14;;;44938:5;:17;;;44956:1;44961:12;44958:2;:15;;;;:::i;44874:371::-;45007:9;45018:1;45007:12:::0;45003:242:::2;;45036:67;45052:5;:14;;;45067:5;:17;;;45085:1;45090:12;45087:2;:15;;;;:::i;45003:242::-;45146:9;45157:2;45146:13:::0;45142:103:::2;;45176:67;45192:5;:14;;;45207:5;:17;;;45225:1;45230:12;45227:2;:15;;;;:::i;45176:67::-;45161:14;::::0;::::2;:82:::0;45142:103:::2;45345:17:::0;;:23:::2;;::::0;45372:1:::2;45345:28;:77:::0;::::2;;;-1:-1:-1::0;45403:19:0::2;::::0;45381:14:::2;::::0;::::2;::::0;:19;:41:::2;45345:77;45344:209;;;-1:-1:-1::0;45474:17:0;;:23:::2;;::::0;45501:1:::2;45474:28;:78:::0;::::2;;;-1:-1:-1::0;45532:20:0::2;::::0;45510:14:::2;::::0;::::2;::::0;:19;:42:::2;45474:78;45340:3935;;;45699:50;;:::i;:::-;45764:32:::0;;;45839:15:::2;::::0;:57:::2;::::0;-1:-1:-1;;;45839:57:0;;-1:-1:-1;;;;;201:32:1;;;45839:57:0::2;::::0;::::2;183:51:1::0;45839:15:0;;::::2;::::0;:42:::2;::::0;156:18:1;;45839:57:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45811:25;::::0;;::::2;:85:::0;;;;45948:64:::2;::::0;-1:-1:-1;;16717:2:1;16713:15;;;16709:53;45948:64:0;;::::2;16697:66:1::0;;;;45979:15:0::2;16779:12:1::0;;;16772:28;45995:16:0::2;16816:12:1::0;;;16809:28;16853:12;;45948:64:0::2;::::0;;-1:-1:-1;;45948:64:0;;::::2;::::0;;;;;;45938:75;;45948:64:::2;45938:75:::0;;::::2;::::0;45911:19;;::::2;:103:::0;46112:11:::2;::::0;46141:17;;46159:14;;::::2;::::0;46112:76;;-1:-1:-1;;;46112:76:0;;45933:81:::2;::::0;-1:-1:-1;;;;;46112:11:0;;::::2;::::0;:28:::2;::::0;:76:::2;::::0;46141:17;;46159:14;45911:12;;46112:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46070:5;:17;;46069:119;;;;;;;;46216:15;;;;;;;;;-1:-1:-1::0;;;;;46216:15:0::2;-1:-1:-1::0;;;;;46216:30:0::2;;46247:13;46261:5;46269;:17;;;46216:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46405:118;;;;;;;;46419:5;:14;;;:19;;;46405:118;;;;46460:19;;46449:8;:30;;;;:::i;:::-;46405:118;;;;46500:21;;46489:8;:32;;;;:::i;:::-;46405:118;;::::0;46388:5:::2;:14;;:135;;;;46538:15;;;;;;;;;-1:-1:-1::0;;;;;46538:15:0::2;-1:-1:-1::0;;;;;46538:27:0::2;;46566:13;46581:5;46588;:14;;;46538:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;46681:11:0::2;::::0;46705:17;;:20;46681:45:::2;::::0;-1:-1:-1;;;46681:45:0;;-1:-1:-1;;;;;46681:11:0;;::::2;::::0;-1:-1:-1;46681:23:0::2;::::0;-1:-1:-1;46681:45:0::2;::::0;::::2;;2039:25:1::0;;;2027:2;2012:18;;1893:177;46681:45:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46661:5;:17;;:65;;;;46802:15;;;;;;;;;-1:-1:-1::0;;;;;46802:15:0::2;-1:-1:-1::0;;;;;46802:39:0::2;;46842:13;46857:5;46864;:17;;;46802:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46956:55;46972:5;:14;;;46987:5;:17;;;47005:1;47007:3;46956:15;:55::i;:::-;46941:14;::::0;::::2;:70:::0;;;47072:17:::2;::::0;::::2;::::0;47041:55:::2;::::0;46941:70;47090:1:::2;47092:3;47041:15;:55::i;:::-;47026:14;::::0;::::2;:70:::0;;;47157:17:::2;::::0;::::2;::::0;47126:55:::2;::::0;47026:70;47175:1:::2;47177:3;47126:15;:55::i;:::-;47111:14;::::0;::::2;:70:::0;;;47242:17:::2;::::0;::::2;::::0;47211:55:::2;::::0;47111:70;47260:1:::2;47262:3;47211:15;:55::i;:::-;47196:14;::::0;::::2;:70:::0;;;47327:17:::2;::::0;::::2;::::0;47296:55:::2;::::0;47196:70;47345:1:::2;47347:3;47296:15;:55::i;:::-;47281:14;::::0;::::2;:70:::0;47384:17;;:23:::2;;::::0;47411:1:::2;47384:28:::0;47380:484:::2;;47458:17:::0;;:25;;47482:1:::2;::::0;47458:17;:25:::2;::::0;47482:1;;47458:25:::2;:::i;:::-;::::0;;-1:-1:-1;47560:17:0;;:20;47583:5:::2;-1:-1:-1::0;47556:289:0::2;;;47689:17:::0;;:20;:28:::2;::::0;47712:5:::2;::::0;47689:28:::2;:::i;:::-;47666:14;::::0;::::2;::::0;:20:::2;;:51:::0;47556:289:::2;;;47797:17:::0;;:20;:24:::2;::::0;47820:1:::2;::::0;47797:24:::2;:::i;:::-;47774:14;::::0;::::2;::::0;:20:::2;;:47:::0;47556:289:::2;47882:17:::0;;:23:::2;;::::0;47909:1:::2;47882:28:::0;47878:540:::2;;48032:17:::0;;:25;;48056:1:::2;::::0;48032:17;:25:::2;::::0;48056:1;;48032:25:::2;:::i;:::-;::::0;;-1:-1:-1;48130:17:0;;:20;48153:5:::2;-1:-1:-1::0;48126:277:0::2;;;48257:17:::0;;:20;:28:::2;::::0;48280:5:::2;::::0;48257:28:::2;:::i;:::-;48232:14;::::0;::::2;::::0;:22:::2;;:53:::0;48126:277:::2;;;48359:17:::0;;:20;:24:::2;::::0;48382:1:::2;::::0;48359:24:::2;:::i;:::-;48334:14;::::0;::::2;::::0;:22:::2;;:49:::0;48126:277:::2;48432:15;;;;;;;;;-1:-1:-1::0;;;;;48432:15:0::2;-1:-1:-1::0;;;;;48432:27:0::2;;48460:13;48475:5;48483;:14;;;48432:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;48599:15:0::2;::::0;:40:::2;::::0;-1:-1:-1;;;48599:40:0;;-1:-1:-1;;;;;201:32:1;;;48599:40:0::2;::::0;::::2;183:51:1::0;48584:12:0::2;::::0;-1:-1:-1;48599:15:0;;::::2;::::0;-1:-1:-1;48599:25:0::2;::::0;156:18:1;;48599:40:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48737:17:::0;;:20;48584:55;;-1:-1:-1;48761:5:0::2;::::0;48737:22:::2;::::0;48758:1:::2;::::0;48737:22:::2;:::i;:::-;48736:30;;;;:::i;:::-;48846:15;::::0;:48:::2;::::0;-1:-1:-1;;;48846:48:0;;48730:1:::2;:37:::0;;::::2;48718:50:::0;;;::::2;::::0;-1:-1:-1;;;;;48846:15:0::2;::::0;:25:::2;::::0;:48:::2;::::0;48872:13;;48718:50;;48846:48:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45555:3416;;;45340:3935;;;49117:15;::::0;49168:14:::2;::::0;::::2;::::0;49117:66:::2;::::0;-1:-1:-1;;;49117:66:0;;-1:-1:-1;;;;;49117:15:0;;::::2;::::0;:27:::2;::::0;:66:::2;::::0;49145:13;;49160:5;;49117:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;49198:15:0::2;::::0;49248:14:::2;::::0;;::::2;::::0;49198:65;;-1:-1:-1;;;49198:65:0;;-1:-1:-1;;;;;49198:15:0;;::::2;::::0;-1:-1:-1;49198:27:0::2;::::0;-1:-1:-1;49198:65:0::2;::::0;49226:13;;49241:5;;49198:65:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45340:3935;49347:15;::::0;:43:::2;::::0;-1:-1:-1;;;49347:43:0;;-1:-1:-1;;;;;49347:15:0;;::::2;::::0;:22:::2;::::0;:43:::2;::::0;49370:13;;49385:4;;49347:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49406:66;49424:5;:14;;;49439:5;:17;;;49457:5;:14;;;49406:66;;;;;;;;:::i;66244:1233::-:0;66501:15;;:34;;-1:-1:-1;;;66501:34:0;;-1:-1:-1;;;;;201:32:1;;;66501:34:0;;;183:51:1;66352:29:0;;;;;;;;66484:14;;66501:15;;;:25;;156:18:1;;66501:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66484:51;;66569:10;66554:11;:25;;66546:105;;;;-1:-1:-1;;;66546:105:0;;28641:2:1;66546:105:0;;;28623:21:1;28680:2;28660:18;;;28653:30;28719:34;28699:18;;;28692:62;28790:34;28770:18;;;28763:62;-1:-1:-1;;;28841:19:1;;;28834:34;28885:19;;66546:105:0;28439:471:1;66546:105:0;66683:9;66670:10;:22;66662:78;;;;-1:-1:-1;;;66662:78:0;;29117:2:1;66662:78:0;;;29099:21:1;29156:2;29136:18;;;29129:30;29195:34;29175:18;;;29168:62;-1:-1:-1;;;29246:18:1;;;29239:41;29297:19;;66662:78:0;28915:407:1;66662:78:0;66753:16;66772:24;66785:11;66772:10;:24;:::i;:::-;:28;;66799:1;66772:28;:::i;:::-;66753:47;;66842:11;66827:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66827:27:0;;;;;;;;;;;;;;;;;66813:41;;66889:11;66876:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;66865:36;;66948:11;66935:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;66912:48;;66995:11;66982:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;66982:25:0;;;;;;;;;;;;;;;;-1:-1:-1;66971:36:0;-1:-1:-1;67025:6:0;67020:450;67041:11;67037:1;:15;67020:450;;;67074:17;67094:15;67108:1;67094:11;:15;:::i;:::-;67141;;:53;;-1:-1:-1;;;67141:53:0;;67074:35;;-1:-1:-1;;;;;;67141:15:0;;:30;;:53;;67172:7;;67074:35;;67141:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67124:11;67136:1;67124:14;;;;;;;;:::i;:::-;;;;;;;;;;:70;67223:15;;:50;;-1:-1:-1;;;67223:50:0;;-1:-1:-1;;;;;67223:15:0;;;;:27;;:50;;67251:7;;67260:12;;67223:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67209:8;67218:1;67209:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;67315:15;;:62;;-1:-1:-1;;;67315:62:0;;-1:-1:-1;;;;;67315:15:0;;;;:39;;:62;;67355:7;;67364:12;;67315:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67289:20;67310:1;67289:23;;;;;;;;:::i;:::-;;;;;;;;;;:88;67407:15;;:50;;-1:-1:-1;;;67407:50:0;;-1:-1:-1;;;;;67407:15:0;;;;:27;;:50;;67435:7;;67444:12;;67407:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67393:8;67402:1;67393:11;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;67054:3:0;;67020:450;;;;66473:1004;;66244:1233;;;;;;;:::o;30370:116::-;2026:13;:11;:13::i;:::-;30447:19:::1;:31:::0;30370:116::o;30126:114::-;2026:13;:11;:13::i;:::-;30202:19:::1;:30:::0;30126:114::o;3046:201::-;2026:13;:11;:13::i;:::-;-1:-1:-1;;;;;3135:22:0;::::1;3127:73;;;::::0;-1:-1:-1;;;3127:73:0;;29529:2:1;3127:73:0::1;::::0;::::1;29511:21:1::0;29568:2;29548:18;;;29541:30;29607:34;29587:18;;;29580:62;-1:-1:-1;;;29658:18:1;;;29651:36;29704:19;;3127:73:0::1;29327:402:1::0;3127:73:0::1;3211:28;3230:8;3211:18;:28::i;35001:3183::-:0;7139:21;:19;:21::i;:::-;35095::::1;35119:25;:23;:25::i;:::-;35169:15;::::0;:40:::1;::::0;-1:-1:-1;;;35169:40:0;;-1:-1:-1;;;;;201:32:1;;;35169:40:0::1;::::0;::::1;183:51:1::0;35095:49:0;;-1:-1:-1;35155:11:0::1;::::0;35169:15;;::::1;::::0;:25:::1;::::0;156:18:1;;35169:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35263:15;::::0;:64:::1;::::0;-1:-1:-1;;;35263:64:0;;35155:54;;-1:-1:-1;35243:17:0::1;::::0;-1:-1:-1;;;;;35263:15:0;;::::1;::::0;:37:::1;::::0;:64:::1;::::0;35301:13;;35315:11;;35263:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35486:15;::::0;:51:::1;::::0;-1:-1:-1;;;35486:51:0;;35243:84;;-1:-1:-1;35354:15:0::1;::::0;35338:13:::1;::::0;-1:-1:-1;;;;;35486:15:0::1;::::0;:30:::1;::::0;:51:::1;::::0;35517:13;;35532:4;;35486:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35457:80;;35548:33;35567:13;35548:18;:33::i;:::-;35611:6;35621:1;35611:11:::0;35607:168:::1;;35664:15;::::0;:48:::1;::::0;-1:-1:-1;;;35664:48:0;;35648:1:::1;::::0;-1:-1:-1;;;;;;35664:15:0;;::::1;::::0;:25:::1;::::0;:48:::1;::::0;35690:13;;35648:1;;35664:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35607:168;35800:6;35793:4;:13;35785:52;;;::::0;-1:-1:-1;;;35785:52:0;;29936:2:1;35785:52:0::1;::::0;::::1;29918:21:1::0;29975:2;29955:18;;;29948:30;30014:28;29994:18;;;29987:56;30060:18;;35785:52:0::1;29734:350:1::0;35785:52:0::1;35856:13:::0;;:18;35848:55:::1;;;::::0;-1:-1:-1;;;35848:55:0;;30291:2:1;35848:55:0::1;::::0;::::1;30273:21:1::0;30330:2;30310:18;;;30303:30;30369:26;30349:18;;;30342:54;30413:18;;35848:55:0::1;30089:348:1::0;35848:55:0::1;35949:1;35934:12;:16;35926:49;;;;-1:-1:-1::0;;;35926:49:0::1;;;;;;;:::i;:::-;36003:14;36019:23;36044:16;36064:20;:18;:20::i;:::-;36002:82;;;;;;36145:18;36167:1;36145:23:::0;36141:682:::1;;36315:15;::::0;:43:::1;::::0;-1:-1:-1;;;36315:43:0;;-1:-1:-1;;;;;36315:15:0;;::::1;::::0;:25:::1;::::0;:43:::1;::::0;36341:13;;36315:15;;:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;36373:15:0::1;::::0;:61:::1;::::0;-1:-1:-1;;;36373:61:0;;-1:-1:-1;;;;;36373:15:0;;::::1;::::0;-1:-1:-1;36373:29:0::1;::::0;-1:-1:-1;36373:61:0::1;::::0;36403:13;;36418:15:::1;::::0;36373:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36141:682;;;36571:11;36558:9;:24;36550:73;;;::::0;-1:-1:-1;;;36550:73:0;;30931:2:1;36550:73:0::1;::::0;::::1;30913:21:1::0;30970:2;30950:18;;;30943:30;31009:34;30989:18;;;30982:62;-1:-1:-1;;;31060:18:1;;;31053:34;31104:19;;36550:73:0::1;30729:400:1::0;36550:73:0::1;36758:15;::::0;-1:-1:-1;;;;;36758:15:0::1;:25;36784:13:::0;36799:11:::1;:9:::0;36758:15;36799:11:::1;:::i;:::-;36758:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36141:682;36867:126;::::0;;::::1;::::0;::::1;::::0;;36880:4:::1;36867:126:::0;;36894:3:::1;36867:126;::::0;::::1;::::0;;;36908:2:::1;36867:126:::0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36867:126:0;;;;;;;;;;37017:93;;;;::::1;::::0;;;;37031:11:::1;::::0;-1:-1:-1;;;37031:41:0;;;;;;2039:25:1;;;36867:126:0;;37017:93;;-1:-1:-1;;;;;37031:11:0::1;:28;2012:18:1::0;;;37031:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37017:93:::0;;::::1;;37082:15;:11:::0;37096:1:::1;37082:15;:::i;:::-;37017:93;;;;37107:1;37017:93;;::::0;37004:106:::1;;37121:22;37147:100;;;;;;;;37161:1;37147:100;;;;37184:19;;37173:8;:30;;;;:::i;:::-;37147:100;;;;37224:21;;37213:8;:32;;;;:::i;:::-;37147:100;;::::0;37121:126:::1;;37258:15;;;;;;;;;-1:-1:-1::0;;;;;37258:15:0::1;-1:-1:-1::0;;;;;37258:27:0::1;;37286:13;37301:4;37307:8;37258:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37327:15;;;;;;;;;-1:-1:-1::0;;;;;37327:15:0::1;-1:-1:-1::0;;;;;37327:30:0::1;;37358:13;37372:4;37379:10;37327:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37401:15;;;;;;;;;-1:-1:-1::0;;;;;37401:15:0::1;-1:-1:-1::0;;;;;37401:27:0::1;;37429:13;37444:4;37450:8;37401:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37480:15;;;;;;;;;-1:-1:-1::0;;;;;37480:15:0::1;-1:-1:-1::0;;;;;37480:39:0::1;;37520:13;37535:4;37541:11;;;;;;;;;-1:-1:-1::0;;;;;37541:11:0::1;-1:-1:-1::0;;;;;37541:23:0::1;;37565:10;:13;;;37541:38;;;;;;;;;;;;;2039:25:1::0;;2027:2;2012:18;;1893:177;37541:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37480:100;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;37727:15:0::1;::::0;:40:::1;::::0;-1:-1:-1;;;37727:40:0;;-1:-1:-1;;;;;201:32:1;;;37727:40:0::1;::::0;::::1;183:51:1::0;37712:12:0::1;::::0;-1:-1:-1;37727:15:0;;::::1;::::0;-1:-1:-1;37727:25:0::1;::::0;156:18:1;;37727:40:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37857:13:::0;;37712:55;;-1:-1:-1;37857:19:0::1;::::0;37871:5:::1;::::0;37857:19:::1;:::i;:::-;37924:15;::::0;:48:::1;::::0;-1:-1:-1;;;37924:48:0;;37851:1:::1;:26:::0;;::::1;37839:39:::0;;;::::1;::::0;-1:-1:-1;;;;;37924:15:0::1;::::0;:25:::1;::::0;:48:::1;::::0;37950:13;;37839:39;;37924:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38060:1;38048:9;:13;38044:70;;;38078:24;:22;:24::i;:::-;38129:47;38147:8;38156:10;38167:8;38129:47;;;;;;;;:::i;:::-;;;;;;;;35075:3109;;;;;;;;;;;7183:20:::0;6577:1;7703:22;;7520:213;30828:116;2026:13;:11;:13::i;:::-;30905:20:::1;:31:::0;30828:116::o;2305:132::-;2186:7;2213:6;-1:-1:-1;;;;;2213:6:0;765:10;2369:23;2361:68;;;;-1:-1:-1;;;2361:68:0;;31336:2:1;2361:68:0;;;31318:21:1;;;31355:18;;;31348:30;31414:34;31394:18;;;31387:62;31466:18;;2361:68:0;31134:356:1;7219:293:0;6621:1;7353:7;;:19;7345:63;;;;-1:-1:-1;;;7345:63:0;;31697:2:1;7345:63:0;;;31679:21:1;31736:2;31716:18;;;31709:30;31775:33;31755:18;;;31748:61;31826:18;;7345:63:0;31495:355:1;7345:63:0;6621:1;7486:7;:18;7219:293::o;34424:243::-;34548:19;;-1:-1:-1;;;;;34522:22:0;;;;;;:14;:22;;;;;;34504:40;;:15;:40;:::i;:::-;:63;;34496:112;;;;-1:-1:-1;;;34496:112:0;;32057:2:1;34496:112:0;;;32039:21:1;32096:2;32076:18;;;32069:30;32135:34;32115:18;;;32108:62;-1:-1:-1;;;32186:18:1;;;32179:35;32231:19;;34496:112:0;31855:401:1;34496:112:0;-1:-1:-1;;;;;34619:22:0;;;;;:14;:22;;;;;34644:15;34619:40;;34424:243::o;39211:1717::-;39339:25;;:::i;:::-;39447:8;39433:22;;39477:10;39491:1;39477:15;39466:1455;;39535:11;;39518:14;;:28;39514:196;;;39631:11;;39614:14;;39650:4;;39644;;39614:28;;39631:11;39614:28;:::i;:::-;39613:35;;;;:::i;:::-;39612:42;;;;:::i;:::-;39598:11;;:56;;;;:::i;:::-;39581:73;;39466:1455;;39514:196;39694:14;;39677:31;;39466:1455;;;39731:10;39745:1;39731:15;39727:1194;;39795:8;:15;;;39774:11;:18;;;:36;39770:228;;;39930:4;39924;39907:8;:15;;;39886:11;:18;;;:36;;;;:::i;:::-;39885:43;;;;:::i;:::-;39884:50;;;;:::i;:::-;39866:8;:15;;;:68;;;;:::i;:::-;39845:18;;;:89;39727:1194;;39770:228;39978:18;;;;;39957;;;:39;39727:1194;;;40019:10;40033:1;40019:15;40015:906;;40084:8;:16;;;40062:11;:19;;;:38;40058:236;;;40224:4;40218;40200:8;:16;;;40178:11;:19;;;:38;;;;:::i;:::-;40177:45;;;;:::i;:::-;40176:52;;;;:::i;:::-;40157:8;:16;;;:71;;;;:::i;:::-;40135:19;;;:93;40015:906;;40058:236;40273:19;;;;;40251;;;:41;40015:906;;;40315:10;40329:1;40315:15;40311:610;;40378:8;:14;;;40358:11;:17;;;:34;40354:220;;;40508:4;40502;40486:8;:14;;;40466:11;:17;;;:34;;;;:::i;:::-;40465:41;;;;:::i;:::-;40464:48;;;;:::i;:::-;40447:8;:14;;;:65;;;;:::i;:::-;40427:17;;;:85;40311:610;;40354:220;40555:17;;;;;40535;;;:37;40311:610;;;40595:10;40609:1;40595:15;40591:330;;40665:8;:21;;;40638:11;:24;;;:48;40634:276;;;40830:4;40824;40801:8;:21;;;40774:11;:24;;;:48;;;;:::i;:::-;40773:55;;;;:::i;:::-;40772:62;;;;:::i;:::-;40748:8;:21;;;:86;;;;:::i;:::-;40721:24;;;:113;40634:276;;;40884:24;;;;;40857;;;:51;40634:276;39211:1717;;;;;;:::o;63531:677::-;63682:20;;63605:4;;63657:9;;63682:25;;:54;;;63734:2;63711:13;:20;:25;63682:54;63678:99;;;-1:-1:-1;63760:5:0;;63531:677;-1:-1:-1;;63531:677:0:o;63678:99::-;63792:6;63787:392;63808:13;:20;63804:1;:24;63787:392;;;63850:11;63864:13;63878:1;63864:16;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;63864:16:0;;-1:-1:-1;;;;63919:11:0;;;;;:26;;-1:-1:-1;;;;;;;;;;63934:11:0;;;;63919:26;63917:29;:71;;;;-1:-1:-1;;;;;;;;;;63976:11:0;;;63974:14;63917:71;:121;;;;-1:-1:-1;;;;;;;;;;64011:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;64026:11:0;;;;64011:26;64009:29;63917:121;:178;;;;-1:-1:-1;;;;;;;;;;64068:11:0;;;;;;:26;;-1:-1:-1;;;;;;;;;;64083:11:0;;;;64068:26;64066:29;63917:178;63895:273;;;-1:-1:-1;64147:5:0;;63531:677;-1:-1:-1;;;;63531:677:0:o;63895:273::-;-1:-1:-1;63830:3:0;;63787:392;;;-1:-1:-1;64196:4:0;;63531:677;-1:-1:-1;;;63531:677:0:o;31964:246::-;32026:8;;-1:-1:-1;;;;;32026:8:0;32018:59;;;;-1:-1:-1;;;32018:59:0;;32463:2:1;32018:59:0;;;32445:21:1;32502:2;32482:18;;;32475:30;32541:26;32521:18;;;32514:54;32585:18;;32018:59:0;32261:348:1;32018:59:0;32104:8;;:35;;32089:9;;-1:-1:-1;;;;;32104:8:0;;32125:9;;32089;32104:35;32089:9;32104:35;32125:9;32104:8;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32088:51;;;32158:4;32150:52;;;;-1:-1:-1;;;32150:52:0;;33026:2:1;32150:52:0;;;33008:21:1;33065:2;33045:18;;;33038:30;33104:34;33084:18;;;33077:62;-1:-1:-1;;;33155:18:1;;;33148:33;33198:19;;32150:52:0;32824:399:1;3407:191:0;3481:16;3500:6;;-1:-1:-1;;;;;3517:17:0;;;-1:-1:-1;;;;;;3517:17:0;;;;;;3550:40;;3500:6;;;;;;;3550:40;;3481:16;3550:40;3470:128;3407:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;245:131:1:-;-1:-1:-1;;;;;320:31:1;;310:42;;300:70;;366:1;363;356:12;381:247;440:6;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;548:9;535:23;567:31;592:5;567:31;:::i;:::-;617:5;381:247;-1:-1:-1;;;381:247:1:o;633:466::-;710:6;718;726;779:2;767:9;758:7;754:23;750:32;747:52;;;795:1;792;785:12;747:52;-1:-1:-1;;840:23:1;;;960:2;945:18;;932:32;;-1:-1:-1;1063:2:1;1048:18;;;1035:32;;633:466;-1:-1:-1;633:466:1:o;1104:226::-;1163:6;1216:2;1204:9;1195:7;1191:23;1187:32;1184:52;;;1232:1;1229;1222:12;1184:52;-1:-1:-1;1277:23:1;;1104:226;-1:-1:-1;1104:226:1:o;1335:303::-;1428:5;1451:1;1461:171;1475:4;1472:1;1469:11;1461:171;;;1534:13;;1522:26;;1577:4;1568:14;;;;1605:17;;;;1495:1;1488:9;1461:171;;;1465:3;;1335:303;;:::o;1643:245::-;1825:4;1810:20;;1839:43;1814:9;1864:6;1839:43;:::i;:::-;1643:245;;;;:::o;2075:127::-;2136:10;2131:3;2127:20;2124:1;2117:31;2167:4;2164:1;2157:15;2191:4;2188:1;2181:15;2207:252;2279:2;2273:9;2321:3;2309:16;;2355:18;2340:34;;2376:22;;;2337:62;2334:88;;;2402:18;;:::i;:::-;2438:2;2431:22;2207:252;:::o;2464:275::-;2535:2;2529:9;2600:2;2581:13;;-1:-1:-1;;2577:27:1;2565:40;;2635:18;2620:34;;2656:22;;;2617:62;2614:88;;;2682:18;;:::i;:::-;2718:2;2711:22;2464:275;;-1:-1:-1;2464:275:1:o;2744:187::-;2793:4;2826:18;2818:6;2815:30;2812:56;;;2848:18;;:::i;:::-;-1:-1:-1;2914:2:1;2893:15;-1:-1:-1;;2889:29:1;2920:4;2885:40;;2744:187::o;2936:697::-;3005:6;3058:2;3046:9;3037:7;3033:23;3029:32;3026:52;;;3074:1;3071;3064:12;3026:52;3114:9;3101:23;3147:18;3139:6;3136:30;3133:50;;;3179:1;3176;3169:12;3133:50;3202:22;;3255:4;3247:13;;3243:27;-1:-1:-1;3233:55:1;;3284:1;3281;3274:12;3233:55;3324:2;3311:16;3349:53;3365:36;3394:6;3365:36;:::i;:::-;3349:53;:::i;:::-;3425:6;3418:5;3411:21;3473:7;3468:2;3459:6;3455:2;3451:15;3447:24;3444:37;3441:57;;;3494:1;3491;3484:12;3441:57;3549:6;3544:2;3540;3536:11;3531:2;3524:5;3520:14;3507:49;3601:1;3576:18;;;3596:2;3572:27;3565:38;;;;3580:5;2936:697;-1:-1:-1;;;;2936:697:1:o;3638:367::-;3731:6;3739;3792:3;3780:9;3771:7;3767:23;3763:33;3760:53;;;3809:1;3806;3799:12;3760:53;3854:23;;;-1:-1:-1;3931:3:1;3916:19;;3913:32;-1:-1:-1;3910:52:1;;;3958:1;3955;3948:12;3910:52;-1:-1:-1;3638:367:1;3996:2;3981:18;;;;;-1:-1:-1;3638:367:1:o;4245:487::-;4322:6;4330;4338;4391:2;4379:9;4370:7;4366:23;4362:32;4359:52;;;4407:1;4404;4397:12;4359:52;4446:9;4433:23;4465:31;4490:5;4465:31;:::i;:::-;4515:5;4593:2;4578:18;;4565:32;;-1:-1:-1;4696:2:1;4681:18;;;4668:32;;4245:487;-1:-1:-1;;;4245:487:1:o;4945:444::-;5004:3;5042:5;5036:12;5069:6;5064:3;5057:19;5101:4;5096:3;5092:14;5085:21;;5140:4;5133:5;5129:16;5163:1;5173:191;5187:6;5184:1;5181:13;5173:191;;;5236:44;5276:3;5267:6;5261:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;5236:44;5309:4;5300:14;;;;;5349:4;5337:17;;;;;5209:1;5202:9;5173:191;;;-1:-1:-1;5380:3:1;;4945:444;-1:-1:-1;;;;4945:444:1:o;5394:313::-;5619:2;5608:9;5601:21;5582:4;5639:62;5697:2;5686:9;5682:18;5674:6;5639:62;:::i;6244:289::-;6286:3;6324:5;6318:12;6351:6;6346:3;6339:19;6407:6;6400:4;6393:5;6389:16;6382:4;6377:3;6373:14;6367:47;6459:1;6452:4;6443:6;6438:3;6434:16;6430:27;6423:38;6522:4;6515:2;6511:7;6506:2;6498:6;6494:15;6490:29;6485:3;6481:39;6477:50;6470:57;;;6244:289;;;;:::o;6538:220::-;6687:2;6676:9;6669:21;6650:4;6707:45;6748:2;6737:9;6733:18;6725:6;6707:45;:::i;7700:481::-;7776:5;7770:12;7765:3;7758:25;7832:4;7825:5;7821:16;7815:23;7808:4;7803:3;7799:14;7792:47;7888:4;7881:5;7877:16;7871:23;7864:4;7859:3;7855:14;7848:47;7944:4;7937:5;7933:16;7927:23;7920:4;7915:3;7911:14;7904:47;8000:4;7993:5;7989:16;7983:23;7976:4;7971:3;7967:14;7960:47;8056:4;8049:5;8045:16;8039:23;8032:4;8027:3;8023:14;8016:47;8112:4;8105:5;8101:16;8095:23;8088:4;8083:3;8079:14;8072:47;8168:4;8161:5;8157:16;8151:23;8144:4;8139:3;8135:14;8128:47;;;7700:481::o;8186:442::-;8243:3;8281:5;8275:12;8308:6;8303:3;8296:19;8340:4;8335:3;8331:14;8324:21;;8379:4;8372:5;8368:16;8402:1;8412:191;8426:6;8423:1;8420:13;8412:191;;;8475:42;8513:3;8504:6;8498:13;8475:42;:::i;:::-;8546:6;8537:16;;;;;8588:4;8576:17;;;;;8448:1;8441:9;8412:191;;8633:1397;9218:3;9207:9;9200:22;9181:4;9245:63;9303:3;9292:9;9288:19;9280:6;9245:63;:::i;:::-;9356:9;9348:6;9344:22;9339:2;9328:9;9324:18;9317:50;9390:48;9431:6;9423;9390:48;:::i;:::-;9376:62;;9486:9;9478:6;9474:22;9469:2;9458:9;9454:18;9447:50;9520:48;9561:6;9553;9520:48;:::i;:::-;9604:22;;;9599:2;9584:18;;9577:50;9676:13;;9698:22;;;9748:2;9774:15;;;;-1:-1:-1;9736:15:1;;;;9807:1;9817:187;9831:6;9828:1;9825:13;9817:187;;;9880:44;9920:3;9911:6;9905:13;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;9880:44;9991:2;9979:15;;;;;9953:2;9944:12;;;;;9853:1;9846:9;9817:187;;;-1:-1:-1;10021:3:1;;8633:1397;-1:-1:-1;;;;;;;;8633:1397:1:o;10035:346::-;10103:6;10111;10164:2;10152:9;10143:7;10139:23;10135:32;10132:52;;;10180:1;10177;10170:12;10132:52;-1:-1:-1;;10225:23:1;;;10345:2;10330:18;;;10317:32;;-1:-1:-1;10035:346:1:o;11086:230::-;11156:6;11209:2;11197:9;11188:7;11184:23;11180:32;11177:52;;;11225:1;11222;11215:12;11177:52;-1:-1:-1;11270:16:1;;11086:230;-1:-1:-1;11086:230:1:o;11321:274::-;-1:-1:-1;;;;;11513:32:1;;;;11495:51;;11577:2;11562:18;;11555:34;11483:2;11468:18;;11321:274::o;11600:344::-;11802:2;11784:21;;;11841:2;11821:18;;;11814:30;-1:-1:-1;;;11875:2:1;11860:18;;11853:50;11935:2;11920:18;;11600:344::o;12294:703::-;12358:5;12406:4;12394:9;12389:3;12385:19;12381:30;12378:50;;;12424:1;12421;12414:12;12378:50;12477:2;12471:9;12519:4;12507:17;;12554:18;12539:34;;12575:22;;;12536:62;12533:88;;;12601:18;;:::i;:::-;12637:2;12630:22;;;12721:16;;12746:23;;12835:2;12820:18;;;12814:25;12855:15;;;12848:32;12931:18;;;12925:25;12966:15;;;12959:32;;;;-1:-1:-1;12670:6:1;12294:703;-1:-1:-1;12294:703:1:o;13002:246::-;13095:6;13148:2;13136:9;13127:7;13123:23;13119:32;13116:52;;;13164:1;13161;13154:12;13116:52;13187:55;13234:7;13223:9;13187:55;:::i;13253:1146::-;13344:6;13404:3;13392:9;13383:7;13379:23;13375:33;13420:2;13417:22;;;13435:1;13432;13425:12;13417:22;-1:-1:-1;13477:22:1;;:::i;:::-;13544:16;;13569:22;;13657:2;13642:18;;;13636:25;13677:14;;;13670:31;13767:2;13752:18;;;13746:25;13787:14;;;13780:31;13877:2;13862:18;;;13856:25;13897:14;;;13890:31;13987:3;13972:19;;;13966:26;14008:15;;;14001:32;14099:3;14084:19;;;14078:26;14120:15;;;14113:32;14211:3;14196:19;;;14190:26;14232:15;;;14225:32;14323:3;14308:19;;;14302:26;14344:15;;;14337:32;;;;-1:-1:-1;13576:5:1;13253:1146;-1:-1:-1;13253:1146:1:o;14992:127::-;15053:10;15048:3;15044:20;15041:1;15034:31;15084:4;15081:1;15074:15;15108:4;15105:1;15098:15;15124:128;15191:9;;;15212:11;;;15209:37;;;15226:18;;:::i;15605:125::-;15670:9;;;15691:10;;;15688:36;;;15704:18;;:::i;15735:772::-;15829:6;15882:4;15870:9;15861:7;15857:23;15853:34;15850:54;;;15900:1;15897;15890:12;15850:54;15926:1;15972:7;15965:4;15954:9;15950:20;15946:34;15936:62;;15994:1;15991;15984:12;15936:62;-1:-1:-1;16022:1:1;;16081:4;16105:21;16081:4;16105:21;:::i;:::-;16094:32;-1:-1:-1;16094:32:1;;-1:-1:-1;16176:20:1;;16208:19;;;16205:39;;;16240:1;16237;16230:12;16205:39;16264:9;16282:193;16298:6;16293:3;16290:15;16282:193;;;16390:10;;16413:18;;16460:4;16451:14;;;;16315;16282:193;;;-1:-1:-1;16494:7:1;;15735:772;-1:-1:-1;;;;;15735:772:1:o;16876:917::-;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;;4887:47;17212:4;17197:20;;17278:50;17324:2;17313:9;17309:18;17301:6;17278:50;:::i;:::-;17371:6;17365:13;17359:3;17348:9;17344:19;17337:42;17426:4;17418:6;17414:17;17408:24;17467:3;17456:9;17452:19;17543:1;17553:171;17567:4;17564:1;17561:11;17553:171;;;17626:13;;17614:26;;17669:4;17697:17;;;;17660:14;;;;17587:1;17580:9;17553:171;;;17557:3;;;17780:4;17772:6;17768:17;17762:24;17755:4;17744:9;17740:20;17733:54;16876:917;;;;;;:::o;17798:354::-;17900:6;17908;17961:3;17949:9;17940:7;17936:23;17932:33;17929:53;;;17978:1;17975;17968:12;17929:53;18001:55;18048:7;18037:9;18001:55;:::i;:::-;18118:2;18103:18;;;;18097:25;17991:65;;18097:25;;-1:-1:-1;;;17798:354:1:o;18157:410::-;-1:-1:-1;;;;;18424:32:1;;18406:51;;18488:2;18473:18;;18466:34;;;18393:3;18378:19;;18509:52;18557:2;18542:18;;18534:6;4809:12;;4797:25;;4871:4;4860:16;;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;;4910:23;4894:14;;4887:47;4737:203;18983:404;-1:-1:-1;;;;;19246:32:1;;19228:51;;19310:2;19295:18;;19288:34;;;19215:3;19200:19;;19331:50;19377:2;19362:18;;19354:6;19331:50;:::i;19392:127::-;19453:10;19448:3;19444:20;19441:1;19434:31;19484:4;19481:1;19474:15;19508:4;19505:1;19498:15;19524:112;19556:1;19582;19572:35;;19587:18;;:::i;:::-;-1:-1:-1;19621:9:1;;19524:112::o;19641:504::-;19961:3;19946:19;;19974:41;19950:9;19997:6;19974:41;:::i;:::-;4809:12;;20072:3;20057:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;4809:12;;20134:3;20119:19;;4797:25;4871:4;4860:16;;4854:23;4838:14;;;4831:47;4927:4;4916:16;;4910:23;4894:14;;;4887:47;20086:53;4737:203;20150:772;20244:6;20297:4;20285:9;20276:7;20272:23;20268:34;20265:54;;;20315:1;20312;20305:12;20265:54;20341:1;20387:7;20380:4;20369:9;20365:20;20361:34;20351:62;;20409:1;20406;20399:12;20351:62;-1:-1:-1;20437:1:1;;20496:4;20520:21;20496:4;20520:21;:::i;20927:354::-;21129:2;21111:21;;;21168:2;21148:18;;;21141:30;21207:32;21202:2;21187:18;;21180:60;21272:2;21257:18;;20927:354::o;21631:687::-;21711:6;21764:2;21752:9;21743:7;21739:23;21735:32;21732:52;;;21780:1;21777;21770:12;21732:52;21813:9;21807:16;21846:18;21838:6;21835:30;21832:50;;;21878:1;21875;21868:12;21832:50;21901:22;;21954:4;21946:13;;21942:27;-1:-1:-1;21932:55:1;;21983:1;21980;21973:12;21932:55;22016:2;22010:9;22041:53;22057:36;22086:6;22057:36;:::i;22041:53::-;22117:6;22110:5;22103:21;22165:7;22160:2;22151:6;22147:2;22143:15;22139:24;22136:37;22133:57;;;22186:1;22183;22176:12;22133:57;22234:6;22229:2;22225;22221:11;22216:2;22209:5;22205:14;22199:42;22286:1;22261:18;;;22281:2;22257:27;22250:38;;;;22265:5;21631:687;-1:-1:-1;;;;21631:687:1:o;23080:291::-;23257:6;23246:9;23239:25;23300:2;23295;23284:9;23280:18;23273:30;23220:4;23320:45;23361:2;23350:9;23346:18;23338:6;23320:45;:::i;23376:291::-;23553:2;23542:9;23535:21;23516:4;23573:45;23614:2;23603:9;23599:18;23591:6;23573:45;:::i;:::-;23565:53;;23654:6;23649:2;23638:9;23634:18;23627:34;23376:291;;;;;:::o;24435:127::-;24496:10;24491:3;24487:20;24484:1;24477:31;24527:4;24524:1;24517:15;24551:4;24548:1;24541:15;24927:168;25000:9;;;25031;;25048:15;;;25042:22;;25028:37;25018:71;;25069:18;;:::i;25100:342::-;-1:-1:-1;;;;;25342:32:1;;25324:51;;25310:4;25295:20;;25384:52;25432:2;25417:18;;25409:6;25384:52;:::i;26973:383::-;27170:2;27159:9;27152:21;27133:4;27196:45;27237:2;27226:9;27222:18;27214:6;27196:45;:::i;:::-;27289:9;27281:6;27277:22;27272:2;27261:9;27257:18;27250:50;27317:33;27343:6;27335;27317:33;:::i;:::-;27309:41;26973:383;-1:-1:-1;;;;;26973:383:1:o;27714:251::-;27784:6;27837:2;27825:9;27816:7;27812:23;27808:32;27805:52;;;27853:1;27850;27843:12;27805:52;27885:9;27879:16;27904:31;27929:5;27904:31;:::i;28314:120::-;28354:1;28380;28370:35;;28385:18;;:::i;:::-;-1:-1:-1;28419:9:1;;28314:120::o
Swarm Source
ipfs://50f8f9105876dce6fa5413b2f572da476f349e611457d7daa0cd6670f331f832
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
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.