{
  "_format": "hh-sol-artifact-1",
  "contractName": "GovTokenStaking",
  "sourceName": "contracts/GovTokenStaking.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotReceive",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CannotRestake",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedInnerCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAmount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "InvalidChip",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidUnlockWaitingPeriod",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MathOverflowedMulDiv",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoClaimableRewards",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoStakedRecordFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoUnstakedRecordFound",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "OwnableInvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "OwnableUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "StakedAmountDeductionFailed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "StakedAmountInsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "TransferFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "UnauthorizedAccess",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "paid",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "Underpayment",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Claimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Distributed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "govToken",
          "type": "address"
        }
      ],
      "name": "GovTokenSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        }
      ],
      "name": "RewardTokenSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Staked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Unstaked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "votingEscrow",
          "type": "address"
        }
      ],
      "name": "VotingEscrowSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Withdrawn",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "accRewardPerWeight",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "accRewardPerWeight",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        },
        {
          "internalType": "address",
          "name": "custodian",
          "type": "address"
        }
      ],
      "name": "batchDeductStakedAmountAndTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "claimedRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "claimedRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "correctRewardDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        }
      ],
      "name": "correctRewardDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "custodian",
          "type": "address"
        }
      ],
      "name": "deductStakedAmountAndTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "distribute",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "distribute",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "from",
          "type": "uint8"
        },
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "to",
          "type": "uint8"
        }
      ],
      "name": "extendUnlockWaitingPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "from",
          "type": "uint8"
        },
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "to",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "extendUnlockWaitingPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "govToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "initialVotingEscrow",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "initialGovToken",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "initialRewardTokens",
          "type": "address[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "restake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "rewardDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "rewardDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardTokens",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newGovToken",
          "type": "address"
        }
      ],
      "name": "setGovToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        }
      ],
      "name": "setRewardTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newVotingEscrow",
          "type": "address"
        }
      ],
      "name": "setVotingEscrow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "nonce",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "signature",
          "type": "bytes"
        }
      ],
      "name": "stake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "stake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakeMinValue",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        }
      ],
      "name": "stakedAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        }
      ],
      "name": "stakedAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakedAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "stakedAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "stakedWeight",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stakedWeight",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "unclaimedRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "unclaimedRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        }
      ],
      "name": "unstake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "unstake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
          "name": "unlockWaitingPeriod",
          "type": "uint8"
        }
      ],
      "name": "unstakedRecords",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
              "name": "unlockWaitingPeriod",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "unlockTime",
              "type": "uint256"
            }
          ],
          "internalType": "struct UnstakedRecord[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "unstakedRecords",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum IGovTokenStaking.UnlockWaitingPeriod",
              "name": "unlockWaitingPeriod",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "unlockTime",
              "type": "uint256"
            }
          ],
          "internalType": "struct UnstakedRecord[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "votingEscrow",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b5060805161408061003e6000396000818161217f015281816121a801526122e901526140806000f3fe6080604052600436106102ae5760003560e01c80637b4717a411610175578063c5046d85116100dc578063e4fc6b6d11610095578063f2e79dd11161006f578063f2e79dd11461094f578063f2fde38b14610964578063f993185514610984578063fb932108146109a457600080fd5b8063e4fc6b6d146108f1578063ecc1d8c7146108f9578063edfceab21461091957600080fd5b8063c5046d8514610816578063ce5ec92e1461082b578063d1ab58f41461084b578063d54f33ab14610891578063dd752e55146108b1578063df545837146108d157600080fd5b8063aa6bb09a1161012e578063aa6bb09a14610705578063ad3cb1cc14610742578063b4545b9e14610773578063bce1b52014610793578063bd834345146107b3578063c2b18aa0146107f457600080fd5b80637b4717a41461060d5780638129fc1c1461065357806387a02172146106685780638da5cb5b14610688578063949813b8146106c5578063a86ea695146106e557600080fd5b80634e71d92d1161021957806358ba9d27116101d257806358ba9d27146105355780635b72b0cb1461056b578063715018a61461058b57806377a24f36146105a05780637934c69d146105c05780637b2f3752146105ed57600080fd5b80634e71d92d1461046b5780634f1ef286146104805780634f2bfe5b1461049357806352d1902d146104b157806354fd4d50146104c65780635873eb9b146104f457600080fd5b8063201e81a81161026b578063201e81a8146103c15780632769b90b146103e15780633351b61c14610401578063373d6132146104215780633ccfd60b14610436578063458cf89c1461044b57600080fd5b806305268cff146102b357806306fdde03146102ea57806307b14524146103315780630ffaec881461035f5780631478a20b1461037f5780631e83409a146103a1575b600080fd5b3480156102bf57600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f657600080fd5b50604080518082019091526015815274505650426574476f76546f6b656e5374616b696e6760581b60208201525b6040516102e191906137d5565b34801561033d57600080fd5b5061035161034c366004613824565b6109c4565b6040519081526020016102e1565b34801561036b57600080fd5b5061035161037a366004613866565b6109f3565b34801561038b57600080fd5b5061039f61039a366004613881565b610a32565b005b3480156103ad57600080fd5b5061039f6103bc3660046138ab565b610b11565b3480156103cd57600080fd5b5061039f6103dc366004613987565b610b61565b3480156103ed57600080fd5b506103516103fc3660046139bb565b610b75565b34801561040d57600080fd5b5061039f61041c366004613a22565b610bc8565b34801561042d57600080fd5b50610351610c1b565b34801561044257600080fd5b5061039f610cc9565b34801561045757600080fd5b5061039f610466366004613a75565b610d8c565b34801561047757600080fd5b5061039f610e2b565b61039f61048e366004613b13565b610e78565b34801561049f57600080fd5b506000546001600160a01b03166102cd565b3480156104bd57600080fd5b50610351610e97565b3480156104d257600080fd5b50604080518082019091526005815264312e312e3160d81b6020820152610324565b34801561050057600080fd5b5061035161050f3660046138ab565b6001600160a01b0316600090815260096020908152604080832083805290915290205490565b34801561054157600080fd5b506103516105503660046138ab565b6001600160a01b031660009081526005602052604090205490565b34801561057757600080fd5b5061039f610586366004613bb8565b610eb4565b34801561059757600080fd5b5061039f610f4f565b3480156105ac57600080fd5b5061039f6105bb366004613beb565b610f63565b3480156105cc57600080fd5b506105e06105db3660046139bb565b61108d565b6040516102e19190613c80565b3480156105f957600080fd5b5061039f610608366004613ce0565b61114e565b34801561061957600080fd5b50610351610628366004613824565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b34801561065f57600080fd5b5061039f61119b565b34801561067457600080fd5b5061039f610683366004613866565b6112af565b34801561069457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102cd565b3480156106d157600080fd5b506103516106e03660046138ab565b61135f565b3480156106f157600080fd5b5061039f6107003660046138ab565b611385565b34801561071157600080fd5b506000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c754610351565b34801561074e57600080fd5b50610324604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561077f57600080fd5b5061039f61078e366004613d21565b611397565b34801561079f57600080fd5b5061039f6107ae366004613d4b565b611411565b3480156107bf57600080fd5b506103516107ce3660046138ab565b6001600160a01b03166000908152600a6020908152604080832083805290915290205490565b34801561080057600080fd5b50610809611530565b6040516102e19190613d64565b34801561082257600080fd5b50600254610351565b34801561083757600080fd5b5061039f6108463660046138ab565b611592565b34801561085757600080fd5b50610351610866366004613824565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b34801561089d57600080fd5b5061039f6108ac366004613db1565b6115a4565b3480156108bd57600080fd5b5061039f6108cc366004613d21565b61162e565b3480156108dd57600080fd5b506105e06108ec3660046138ab565b6116c0565b61039f611776565b34801561090557600080fd5b5061039f610914366004613e31565b611781565b34801561092557600080fd5b506103516109343660046138ab565b6001600160a01b031660009081526008602052604090205490565b34801561095b57600080fd5b50600354610351565b34801561097057600080fd5b5061039f61097f3660046138ab565b611824565b34801561099057600080fd5b5061035161099f3660046138ab565b61185f565b3480156109b057600080fd5b5061039f6109bf366004613e6d565b6118f2565b6001600160a01b0382166000908152600560205260408120546109ea90849084906118fc565b90505b92915050565b600060046000836002811115610a0b57610a0b613c48565b6002811115610a1c57610a1c613c48565b8152602001908152602001600020549050919050565b6000816002811115610a4657610a46613c48565b03610a64576040516357b3acf160e01b815260040160405180910390fd5b806002811115610a7657610a76613c48565b826002811115610a8857610a88613c48565b10610aa6576040516357b3acf160e01b815260040160405180910390fd5b33600081815260066020526040812081856002811115610ac857610ac8613c48565b6002811115610ad957610ad9613c48565b8152602001908152602001600020549050610af5828583611987565b610b00828583611a1e565b610b0b828483611ab9565b50505050565b33600081815260056020526040812054610b2e90839085906118fc565b905080600003610b515760405163f40c208960e01b815260040160405180910390fd5b610b5c828483611b45565b505050565b610b69611beb565b610b7281611c46565b50565b6001600160a01b038216600090815260066020526040812081836002811115610ba057610ba0613c48565b6002811115610bb157610bb1613c48565b815260200190815260200160002054905092915050565b610bd0611beb565b8160005b81811015610c1457610c0c858583818110610bf157610bf1613e89565b9050602002016020810190610c0691906138ab565b84611d5d565b600101610bd4565b5050505050565b60008080610c2b60025b60010190565b905060005b81811015610cc1576000816002811115610c4c57610c4c613c48565b90506000816002811115610c6257610c62613c48565b03610c6d5750610cb9565b610cb560046000836002811115610c8657610c86613c48565b6002811115610c9757610c97613c48565b81526020019081526020016000205485611dd690919063ffffffff16565b9350505b600101610c30565b509092915050565b336000818152600760205260408120610ce190611dda565b805190915060005b81811015610b0b576000838281518110610d0557610d05613e89565b60200260200101519050610d3a610d246001546001600160a01b031690565b60208301516001600160a01b0388169190611ff3565b50805160208201516040516001600160a01b038816927f83637d0d125e3dae88720b1ad229ce05c339c065b6282caf315dcb35a999d6d492610d7b92613e9f565b60405180910390a250600101610ce9565b6000866002811115610da057610da0613c48565b03610dbe576040516357b3acf160e01b815260040160405180910390fd5b600254851015610de15760405163162908e360e11b815260040160405180910390fd5b33610e0c610df76001546001600160a01b031690565b6001600160a01b03831690888888888861200a565b50610e178187612109565b610e22818888611ab9565b50505050505050565b336000818152600560205260408120548190610e4a90849083906118fc565b905080600003610e6d5760405163f40c208960e01b815260040160405180910390fd5b610b5c838383611b45565b610e80612174565b610e8982612219565b610e938282612221565b5050565b6000610ea16122de565b5060008051602061402b83398151915290565b6000546001600160a01b03163314610ee657604051633733be5960e21b81523360048201526024015b60405180910390fd5b81610ef384600183612327565b90508015610f0a57610f0784600283612327565b90505b8015610f29576040516322fb20b360e01b815260040160405180910390fd5b610c14610f3e6001546001600160a01b031690565b6001600160a01b0384169085611ff3565b610f57611beb565b610f6160006123ab565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fa85750825b90506000826001600160401b03166001148015610fc45750303b155b905081158015610fd2575080155b15610ff05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561101a57845460ff60401b1916600160401b1785555b61102261119b565b61102b8861241c565b61103487612471565b61103d86611c46565b831561108357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b6001600160a01b038216600090815260076020908152604080832080548251818502810185019093528083526060946109ea9487949392919084015b8282101561113c576000848152602090206040805160608101909152600384029091018054829060ff16600281111561110457611104613c48565b600281111561111557611115613c48565b815260200160018201548152602001600282015481525050815260200190600101906110c9565b5050505061254390919063ffffffff16565b611156611beb565b8060005b81811015610b0b5761119384848381811061117757611177613e89565b905060200201602081019061118c91906138ab565b6000611d5d565b60010161115a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156111e05750825b90506000826001600160401b031660011480156111fc5750303b155b90508115801561120a575080155b156112285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561125257845460ff60401b1916600160401b1785555b61125b33612644565b611263612655565b8315610c1457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050565b336000818152600660205260408120818460028111156112d1576112d1613c48565b60028111156112e2576112e2613c48565b81526020019081526020016000205490506112fe828483611987565b611308828261265d565b611313828483611a1e565b610b5c604051806060016040528085600281111561133357611333613c48565b81526020808201859052600060409283018190526001600160a01b038716815260079091522090612696565b6001600160a01b0381166000908152600560205260408120546109ed90839083906118fc565b61138e33612219565b610b7281612471565b336113a3818484611987565b6113ae818484612745565b91506113ba818361265d565b6113c5818484611a1e565b610b5c60405180606001604052808560028111156113e5576113e5613c48565b81526020808201869052600060409283018190526001600160a01b038616815260079091522090612696565b336000818152600760205260409020548210611440576040516334ea6fcd60e01b815260040160405180910390fd5b6001600160a01b038116600090815260076020526040812080548490811061146a5761146a613e89565b6000918252602090912060408051606081019091526003909202018054829060ff16600281111561149d5761149d613c48565b60028111156114ae576114ae613c48565b815260200160018201548152602001600282015481525050905080604001514211156114ed576040516343465ae760e11b815260040160405180910390fd5b6001600160a01b038216600090815260076020526040902061150f90846127b0565b61151d828260200151612109565b610b5c8282600001518360200151611ab9565b6060600b80548060200260200160405190810160405280929190818152602001828054801561158857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161156a575b5050505050905090565b61159b33612219565b610b728161241c565b6000546001600160a01b031633146115d157604051633733be5960e21b8152336004820152602401610edd565b8360005b81811015610e22576116268787838181106115f2576115f2613e89565b905060200201602081019061160791906138ab565b86868481811061161957611619613e89565b9050602002013585610eb4565b6001016115d5565b600082600281111561164257611642613c48565b03611660576040516357b3acf160e01b815260040160405180910390fd5b6002548110156116835760405163162908e360e11b815260040160405180910390fd5b336116aa6116996001546001600160a01b031690565b6001600160a01b03831690846128a0565b506116b58183612109565b610b5c818484611ab9565b6001600160a01b0381166000908152600760209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561176b576000848152602090206040805160608101909152600384029091018054829060ff16600281111561173357611733613c48565b600281111561174457611744613c48565b815260200160018201548152602001600282015481525050815260200190600101906116f8565b505050509050919050565b610f61600034612aa6565b600082600281111561179557611795613c48565b036117b3576040516357b3acf160e01b815260040160405180910390fd5b8160028111156117c5576117c5613c48565b8360028111156117d7576117d7613c48565b106117f5576040516357b3acf160e01b815260040160405180910390fd5b33611801818584611987565b61180c818584612745565b9150611819818584611a1e565b610b0b818484611ab9565b61182c611beb565b6001600160a01b03811661185657604051631e4fbdf760e01b815260006004820152602401610edd565b610b72816123ab565b6000808061186d6002610c25565b905060005b818110156118e957600081600281111561188e5761188e613c48565b905060008160028111156118a4576118a4613c48565b036118af57506118e1565b6001600160a01b03861660009081526006602052604081206118dd91836002811115610c8657610c86613c48565b9350505b600101611872565b50909392505050565b610e938282612aa6565b6001600160a01b0383166000908152600560205260408120548181611922576000611953565b6001600160a01b03808716600090815260096020908152604080832093891683529290522054611953908584612bc8565b6001600160a01b03861660009081526008602052604090205490915061197b90850282612c90565b925050505b9392505050565b6001600160a01b0383166000908152600660205260408120818460028111156119b2576119b2613c48565b60028111156119c3576119c3613c48565b8152602001908152602001600020549050806000036119f557604051630b6a056960e31b815260040160405180910390fd5b81811015610b0b578383828460405163308c9dff60e11b8152600401610edd9493929190613eba565b611a29838383612cac565b6001600160a01b03831660009081526005602052604081205490611a4c85612db0565b905081811015611a6557808203611a638682612e6f565b505b611a6f8582612f5e565b846001600160a01b03167f9bda9a567fe5ce9bcfb637505de9a1dc9d112a34e25a8524026e3d869f95b4718585604051611aaa929190613e9f565b60405180910390a25050505050565b611ac4838383612fad565b6001600160a01b03831660009081526005602052604081205490611ae785612db0565b905081811115611b0057818103611afe8682613074565b505b611b0a8582612f5e565b846001600160a01b03167f3cf14181ae25669a913d72411736fc5c01f538fa503e963b0b2e56bcefb3edaf8585604051611aaa929190613e9f565b6001600160a01b038381166000818152600960209081526040808320948716808452948252808320805487019055838352600a825280832094835293905291909120805483019055611b98908383611ff3565b50816001600160a01b0316836001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd399268383604051611bde91815260200190565b60405180910390a3505050565b33611c1d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f615760405163118cdaa760e01b8152336004820152602401610edd565b6000600b805480602002602001604051908101604052809291908181526020018280548015611c9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c80575b505083519394506000925050505b81811015611d0c576000838281518110611cc857611cc8613e89565b60200260200101519050611ce5818661319790919063ffffffff16565b611d03576001600160a01b0381166000908152600860205260408120555b50600101611cac565b508251611d2090600b906020860190613737565b507fa1749ac7c93cc69c34654a02dd46920061d3db5577e75d6561ff2f7199ddc37183604051611d509190613d64565b60405180910390a1505050565b6001600160a01b038281166000818152600560209081526040808320549486168084526008835281842054948452600983528184209084529091529020549082029081811115610c14576001600160a01b0380861660009081526009602090815260408083209388168352929052208290555050505050565b0190565b8054606090429060009081816001600160401b03811115611dfd57611dfd6138c6565b604051908082528060200260200182016040528015611e5357816020015b611e406040805160608101909152806000815260200160008152602001600081525090565b815260200190600190039081611e1b5790505b50905060005b82811015611f7f576000878281548110611e7557611e75613e89565b6000918252602090912060408051606081019091526003909202018054829060ff166002811115611ea857611ea8613c48565b6002811115611eb957611eb9613c48565b81526020016001820154815260200160028201548152505090508060400151861115611f0e5780838681518110611ef257611ef2613e89565b6020026020010181905250611f078560010190565b9450611f76565b8415611f7657808886840381548110611f2957611f29613e89565b6000918252602090912082516003909202018054909190829060ff19166001836002811115611f5a57611f5a613c48565b0217905550602082015160018201556040909101516002909101555b50600101611e59565b508215611fde5760005b83811015611fdc5786805480611fa157611fa1613ee9565b600082815260208120600360001990930192830201805460ff1916815560018101829055600201559055611fd58160010190565b9050611f89565b505b81831015611fea578281525b95945050505050565b600061200284848460006131f6565b949350505050565b60006001600160a01b03871661206057600019860361203157876001600160a01b03163195505b8534101561205b5760405163d17e444b60e01b815234600482015260248101879052604401610edd565b6120fa565b86600187016120d6576040516370a0823160e01b81526001600160a01b038a811660048301528216906370a0823190602401602060405180830381865afa1580156120af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d39190613eff565b96505b866000036120e85760009150506120fe565b6120f8888a308a8a8a8a8a6133b9565b505b5060015b979650505050505050565b6000546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f19906044015b600060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166121ef60008051602061402b833981519152546001600160a01b031690565b6001600160a01b031614155b15610f615760405163703e46dd60e11b815260040160405180910390fd5b610b72611beb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561227b575060408051601f3d908101601f1916820190925261227891810190613eff565b60015b6122a357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610edd565b60008051602061402b83398151915281146122d457604051632a87526960e21b815260048101829052602401610edd565b610b5c8383613471565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f615760405163703e46dd60e11b815260040160405180910390fd5b6001600160a01b038316600090815260066020526040812081908185600281111561235457612354613c48565b600281111561236557612365613c48565b815260200190815260200160002054905082811061239157612388858585611a1e565b600091506123a3565b61239c858583611a1e565b8083035b91505b509392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fdfc99f06c00ec9d9c39735fe0e3b20e8d77ecbe0eed7f1622dbda285002954e8906020015b60405180910390a150565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038516916124b491613f18565b600060405180830381855afa9150503d80600081146124ef576040519150601f19603f3d011682016040523d82523d6000602084013e6124f4565b606091505b5091509150816125175760405163c1ab6dc160e01b815260040160405180910390fd5b60008180602001905181019061252d9190613f34565b60ff169050600a81900a600255610b0b846134c7565b815160609060009081816001600160401b03811115612564576125646138c6565b6040519080825280602002602001820160405280156125ba57816020015b6125a76040805160608101909152806000815260200160008152602001600081525090565b8152602001906001900390816125825790505b50905060005b82811015611fdc5760008782815181106125dc576125dc613e89565b602002602001015190508660028111156125f8576125f8613c48565b8151600281111561260b5761260b613c48565b0361263b578083868151811061262357612623613e89565b60200260200101819052506126388560010190565b94505b506001016125c0565b61264c613515565b610b728161355e565b610f61613515565b600054604051632770a7eb60e21b81526001600160a01b0384811660048301526024820184905290911690639dc29fac9060440161213e565b6002815160028111156126ab576126ab613c48565b036126c157626ebe0042015b60408201526126ed565b6001815160028111156126d6576126d6613c48565b036126e65762093a8042016126b7565b4260408201525b8154600181810184556000848152602090208351600390930201805484939192839160ff19169083600281111561272657612726613c48565b0217905550602082015181600101556040820151816002015550505050565b6001600160a01b038316600090815260066020526040812081908185600281111561277257612772613c48565b600281111561278357612783613c48565b815260200190815260200160002054905082811180156127a65750600254838203105b61200257826123a0565b81548082106127be57505050565b6000198101825b8181101561285f578460018201815481106127e2576127e2613e89565b906000526020600020906003020185828154811061280257612802613e89565b6000918252602090912082546003909202018054909160ff1690829060ff1916600183600281111561283657612836613c48565b0217905550600182810154908201556002918201549101556128588160010190565b90506127c5565b508380548061287057612870613ee9565b600082815260208120600360001990930192830201805460ff191681556001810182905560020155905550505050565b60006001600160a01b0383166128f65760001982036128c757836001600160a01b03163191505b813410156128f15760405163d17e444b60e01b815234600482015260248101839052604401610edd565b612a9c565b826001830161296c576040516370a0823160e01b81526001600160a01b0386811660048301528216906370a0823190602401602060405180830381865afa158015612945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129699190613eff565b92505b8260000361297e576000915050611980565b604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301526000919083169063dd62ed3e90604401602060405180830381865afa1580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f29190613eff565b905083811015612a1f5760405163d17e444b60e01b81526004810182905260248101859052604401610edd565b6040516323b872dd60e01b81526001600160a01b038781166004830152306024830152604482018690528316906323b872dd906064016020604051808303816000875af1158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190613f57565b5050505b5060019392505050565b33612ab28184846128a0565b50826001600160a01b0316816001600160a01b03167fad4a9acf26d8bba7a8cf1a41160d59be042ee554578e256c98d2ab74cdd4354284604051612af891815260200190565b60405180910390a36003548015801590612b7a5750612b7a84600b805480602002602001604051908101604052809291908181526020018280548015612b6757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b49575b505050505061319790919063ffffffff16565b15610b0b57612ba9612b8c8483613566565b6001600160a01b0386166000908152600860205260409020540190565b6001600160a01b03851660009081526008602052604090205550505050565b6000838302816000198587098281108382030391505080600003612bff57838281612bf557612bf5613f79565b0492505050611980565b808411612c1f5760405163227bc15360e01b815260040160405180910390fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b0290565b600081831115612ca357508082036109ed565b50600092915050565b6001600160a01b0383166000908152600660205260408120612d0b91839190856002811115612cdd57612cdd613c48565b6002811115612cee57612cee613c48565b815260200190815260200160002054612e6a90919063ffffffff16565b6001600160a01b038416600090815260066020526040812090846002811115612d3657612d36613c48565b6002811115612d4757612d47613c48565b815260200190815260200160002081905550612d738160046000856002811115612cdd57612cdd613c48565b60046000846002811115612d8957612d89613c48565b6002811115612d9a57612d9a613c48565b8152602081019190915260400160002055505050565b60008080612dbe6002610c25565b905060005b818110156118e9576000816002811115612ddf57612ddf613c48565b90506000816002811115612df557612df5613c48565b03612e005750612e62565b6001600160a01b038616600090815260066020526040812081836002811115612e2b57612e2b613c48565b6002811115612e3c57612e3c613c48565b81526020019081526020016000205490506000612e59838361357f565b95909501945050505b600101612dc3565b900390565b6000600b805480602002602001604051908101604052809291908181526020018280548015612ec757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ea9575b505083519394506000925050505b81811015610c14576000838281518110612ef157612ef1613e89565b602002602001015190506000612f088783886118fc565b90508015612f1b57612f1b878383611b45565b506001600160a01b03908116600081815260086020908152604080832054948a168352600982528083209383529290522080549186029091039055600101612ed5565b6001600160a01b038216600090815260056020526040902080549082905581811115612f9957612f918282036003540390565b600355505050565b81811015610b5c5760035481830301612f91565b6001600160a01b038316600090815260066020526040812061300c91839190856002811115612fde57612fde613c48565b6002811115612fef57612fef613c48565b815260200190815260200160002054611dd690919063ffffffff16565b6001600160a01b03841660009081526006602052604081209084600281111561303757613037613c48565b600281111561304857613048613c48565b815260200190815260200160002081905550612d738160046000856002811115612fde57612fde613c48565b6000600b8054806020026020016040519081016040528092919081815260200182805480156130cc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116130ae575b505083519394506000925050505b81811015610c145760008382815181106130f6576130f6613e89565b6020026020010151905061316561313b60086000846001600160a01b03166001600160a01b031681526020019081526020016000205487612c8c90919063ffffffff16565b6001600160a01b038089166000908152600960209081526040808320938716835292905220540190565b6001600160a01b03878116600090815260096020908152604080832095909316825293909352909120556001016130da565b8151600090815b818110156131eb57836001600160a01b03168582815181106131c2576131c2613e89565b60200260200101516001600160a01b0316036131e3576001925050506109ed565b60010161319e565b506000949350505050565b6000806001600160a01b03851661327f576000198403613214574793505b83600003613226576000915050612002565b6040516001600160a01b038716908590600081818185875af1925050503d806000811461326f576040519150601f19603f3d011682016040523d82523d6000602084013e613274565b606091505b50508091505061337d565b84600185016132f3576040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa1580156132cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f09190613eff565b94505b8460000361330657600092505050612002565b60405163a9059cbb60e01b81526001600160a01b0388811660048301526024820187905282169063a9059cbb906044016020604051808303816000875af1158015613355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133799190613f57565b9150505b806133ad57826133a35760405163c39ba1a960e01b815260048101859052602401610edd565b6000915050612002565b50600195945050505050565b6040805160a0810182526001600160a01b038a811660608301908152608083018990528252602080830188905282840187905283518085018552918a1682528101889052915163187945bd60e11b81526e22d473030f116ddee9f6b43ac78ba3926330f28b7a92613435929091908c9088908890600401613f8f565b600060405180830381600087803b15801561344f57600080fd5b505af1158015613463573d6000803e3d6000fd5b505050505050505050505050565b61347a826135c1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156134bf57610b5c8282613626565b610e93613693565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f1b737a2df6948bd6245ff6c5a979e43e3e9d2e2c233691f4445094a5ae6267a090602001612466565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610f6157604051631afcd79f60e31b815260040160405180910390fd5b61182c613515565b600081838161357757613577613f79565b049392505050565b6000806135976002548461356690919063ffffffff16565b905060028460028111156135ad576135ad613c48565b146135b85780612002565b60028102612002565b806001600160a01b03163b6000036135f757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610edd565b60008051602061402b83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516136439190613f18565b600060405180830381855af49150503d806000811461367e576040519150601f19603f3d011682016040523d82523d6000602084013e613683565b606091505b5091509150611fea8583836136b2565b3415610f615760405163b398979f60e01b815260040160405180910390fd5b6060826136c7576136c28261370e565b611980565b81511580156136de57506001600160a01b0384163b155b1561370757604051639996b31560e01b81526001600160a01b0385166004820152602401610edd565b5080611980565b80511561371e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b82805482825590600052602060002090810192821561378c579160200282015b8281111561378c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613757565b5061379892915061379c565b5090565b5b80821115613798576000815560010161379d565b60005b838110156137cc5781810151838201526020016137b4565b50506000910152565b60208152600082518060208401526137f48160408501602087016137b1565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461381f57600080fd5b919050565b6000806040838503121561383757600080fd5b61384083613808565b915061384e60208401613808565b90509250929050565b80356003811061381f57600080fd5b60006020828403121561387857600080fd5b6109ea82613857565b6000806040838503121561389457600080fd5b61389d83613857565b915061384e60208401613857565b6000602082840312156138bd57600080fd5b6109ea82613808565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613904576139046138c6565b604052919050565b600082601f83011261391d57600080fd5b813560206001600160401b03821115613938576139386138c6565b8160051b6139478282016138dc565b928352848101820192828101908785111561396157600080fd5b83870192505b848310156120fe5761397883613808565b82529183019190830190613967565b60006020828403121561399957600080fd5b81356001600160401b038111156139af57600080fd5b6120028482850161390c565b600080604083850312156139ce57600080fd5b61389d83613808565b60008083601f8401126139e957600080fd5b5081356001600160401b03811115613a0057600080fd5b6020830191508360208260051b8501011115613a1b57600080fd5b9250929050565b600080600060408486031215613a3757600080fd5b83356001600160401b03811115613a4d57600080fd5b613a59868287016139d7565b9094509250613a6c905060208501613808565b90509250925092565b60008060008060008060a08789031215613a8e57600080fd5b613a9787613857565b955060208701359450604087013593506060870135925060808701356001600160401b0380821115613ac857600080fd5b818901915089601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8a6020828501011115613afd57600080fd5b6020830194508093505050509295509295509295565b60008060408385031215613b2657600080fd5b613b2f83613808565b91506020808401356001600160401b0380821115613b4c57600080fd5b818601915086601f830112613b6057600080fd5b813581811115613b7257613b726138c6565b613b84601f8201601f191685016138dc565b91508082528784828501011115613b9a57600080fd5b80848401858401376000848284010152508093505050509250929050565b600080600060608486031215613bcd57600080fd5b613bd684613808565b925060208401359150613a6c60408501613808565b600080600060608486031215613c0057600080fd5b613c0984613808565b9250613c1760208501613808565b915060408401356001600160401b03811115613c3257600080fd5b613c3e8682870161390c565b9150509250925092565b634e487b7160e01b600052602160045260246000fd5b60038110613c7c57634e487b7160e01b600052602160045260246000fd5b9052565b602080825282518282018190526000919060409081850190868401855b82811015613cd3578151613cb2858251613c5e565b80870151858801528501518585015260609093019290850190600101613c9d565b5091979650505050505050565b60008060208385031215613cf357600080fd5b82356001600160401b03811115613d0957600080fd5b613d15858286016139d7565b90969095509350505050565b60008060408385031215613d3457600080fd5b613d3d83613857565b946020939093013593505050565b600060208284031215613d5d57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015613da55783516001600160a01b031683529284019291840191600101613d80565b50909695505050505050565b600080600080600060608688031215613dc957600080fd5b85356001600160401b0380821115613de057600080fd5b613dec89838a016139d7565b90975095506020880135915080821115613e0557600080fd5b50613e12888289016139d7565b9094509250613e25905060408701613808565b90509295509295909350565b600080600060608486031215613e4657600080fd5b613e4f84613857565b9250613e5d60208501613857565b9150604084013590509250925092565b60008060408385031215613e8057600080fd5b613d3d83613808565b634e487b7160e01b600052603260045260246000fd5b60408101613ead8285613c5e565b8260208301529392505050565b6001600160a01b038516815260808101613ed76020830186613c5e565b60408201939093526060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215613f1157600080fd5b5051919050565b60008251613f2a8184602087016137b1565b9190910192915050565b600060208284031215613f4657600080fd5b815160ff8116811461198057600080fd5b600060208284031215613f6957600080fd5b8151801515811461198057600080fd5b634e487b7160e01b600052601260045260246000fd5b6000610100613fb283895180516001600160a01b03168252602090810151910152565b6020880151604084015260408801516060840152613fe6608084018880516001600160a01b03168252602090810151910152565b6001600160a01b03861660c084015260e0830181905282018390526101208385828501376000838501820152601f909301601f19169091019091019594505050505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220b1bbff0652e91b699d5affd90c73b9aa44094068372b88e005846c8898c9c42364736f6c63430008140033",
  "deployedBytecode": "0x6080604052600436106102ae5760003560e01c80637b4717a411610175578063c5046d85116100dc578063e4fc6b6d11610095578063f2e79dd11161006f578063f2e79dd11461094f578063f2fde38b14610964578063f993185514610984578063fb932108146109a457600080fd5b8063e4fc6b6d146108f1578063ecc1d8c7146108f9578063edfceab21461091957600080fd5b8063c5046d8514610816578063ce5ec92e1461082b578063d1ab58f41461084b578063d54f33ab14610891578063dd752e55146108b1578063df545837146108d157600080fd5b8063aa6bb09a1161012e578063aa6bb09a14610705578063ad3cb1cc14610742578063b4545b9e14610773578063bce1b52014610793578063bd834345146107b3578063c2b18aa0146107f457600080fd5b80637b4717a41461060d5780638129fc1c1461065357806387a02172146106685780638da5cb5b14610688578063949813b8146106c5578063a86ea695146106e557600080fd5b80634e71d92d1161021957806358ba9d27116101d257806358ba9d27146105355780635b72b0cb1461056b578063715018a61461058b57806377a24f36146105a05780637934c69d146105c05780637b2f3752146105ed57600080fd5b80634e71d92d1461046b5780634f1ef286146104805780634f2bfe5b1461049357806352d1902d146104b157806354fd4d50146104c65780635873eb9b146104f457600080fd5b8063201e81a81161026b578063201e81a8146103c15780632769b90b146103e15780633351b61c14610401578063373d6132146104215780633ccfd60b14610436578063458cf89c1461044b57600080fd5b806305268cff146102b357806306fdde03146102ea57806307b14524146103315780630ffaec881461035f5780631478a20b1461037f5780631e83409a146103a1575b600080fd5b3480156102bf57600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102f657600080fd5b50604080518082019091526015815274505650426574476f76546f6b656e5374616b696e6760581b60208201525b6040516102e191906137d5565b34801561033d57600080fd5b5061035161034c366004613824565b6109c4565b6040519081526020016102e1565b34801561036b57600080fd5b5061035161037a366004613866565b6109f3565b34801561038b57600080fd5b5061039f61039a366004613881565b610a32565b005b3480156103ad57600080fd5b5061039f6103bc3660046138ab565b610b11565b3480156103cd57600080fd5b5061039f6103dc366004613987565b610b61565b3480156103ed57600080fd5b506103516103fc3660046139bb565b610b75565b34801561040d57600080fd5b5061039f61041c366004613a22565b610bc8565b34801561042d57600080fd5b50610351610c1b565b34801561044257600080fd5b5061039f610cc9565b34801561045757600080fd5b5061039f610466366004613a75565b610d8c565b34801561047757600080fd5b5061039f610e2b565b61039f61048e366004613b13565b610e78565b34801561049f57600080fd5b506000546001600160a01b03166102cd565b3480156104bd57600080fd5b50610351610e97565b3480156104d257600080fd5b50604080518082019091526005815264312e312e3160d81b6020820152610324565b34801561050057600080fd5b5061035161050f3660046138ab565b6001600160a01b0316600090815260096020908152604080832083805290915290205490565b34801561054157600080fd5b506103516105503660046138ab565b6001600160a01b031660009081526005602052604090205490565b34801561057757600080fd5b5061039f610586366004613bb8565b610eb4565b34801561059757600080fd5b5061039f610f4f565b3480156105ac57600080fd5b5061039f6105bb366004613beb565b610f63565b3480156105cc57600080fd5b506105e06105db3660046139bb565b61108d565b6040516102e19190613c80565b3480156105f957600080fd5b5061039f610608366004613ce0565b61114e565b34801561061957600080fd5b50610351610628366004613824565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b34801561065f57600080fd5b5061039f61119b565b34801561067457600080fd5b5061039f610683366004613866565b6112af565b34801561069457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102cd565b3480156106d157600080fd5b506103516106e03660046138ab565b61135f565b3480156106f157600080fd5b5061039f6107003660046138ab565b611385565b34801561071157600080fd5b506000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c754610351565b34801561074e57600080fd5b50610324604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561077f57600080fd5b5061039f61078e366004613d21565b611397565b34801561079f57600080fd5b5061039f6107ae366004613d4b565b611411565b3480156107bf57600080fd5b506103516107ce3660046138ab565b6001600160a01b03166000908152600a6020908152604080832083805290915290205490565b34801561080057600080fd5b50610809611530565b6040516102e19190613d64565b34801561082257600080fd5b50600254610351565b34801561083757600080fd5b5061039f6108463660046138ab565b611592565b34801561085757600080fd5b50610351610866366004613824565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b34801561089d57600080fd5b5061039f6108ac366004613db1565b6115a4565b3480156108bd57600080fd5b5061039f6108cc366004613d21565b61162e565b3480156108dd57600080fd5b506105e06108ec3660046138ab565b6116c0565b61039f611776565b34801561090557600080fd5b5061039f610914366004613e31565b611781565b34801561092557600080fd5b506103516109343660046138ab565b6001600160a01b031660009081526008602052604090205490565b34801561095b57600080fd5b50600354610351565b34801561097057600080fd5b5061039f61097f3660046138ab565b611824565b34801561099057600080fd5b5061035161099f3660046138ab565b61185f565b3480156109b057600080fd5b5061039f6109bf366004613e6d565b6118f2565b6001600160a01b0382166000908152600560205260408120546109ea90849084906118fc565b90505b92915050565b600060046000836002811115610a0b57610a0b613c48565b6002811115610a1c57610a1c613c48565b8152602001908152602001600020549050919050565b6000816002811115610a4657610a46613c48565b03610a64576040516357b3acf160e01b815260040160405180910390fd5b806002811115610a7657610a76613c48565b826002811115610a8857610a88613c48565b10610aa6576040516357b3acf160e01b815260040160405180910390fd5b33600081815260066020526040812081856002811115610ac857610ac8613c48565b6002811115610ad957610ad9613c48565b8152602001908152602001600020549050610af5828583611987565b610b00828583611a1e565b610b0b828483611ab9565b50505050565b33600081815260056020526040812054610b2e90839085906118fc565b905080600003610b515760405163f40c208960e01b815260040160405180910390fd5b610b5c828483611b45565b505050565b610b69611beb565b610b7281611c46565b50565b6001600160a01b038216600090815260066020526040812081836002811115610ba057610ba0613c48565b6002811115610bb157610bb1613c48565b815260200190815260200160002054905092915050565b610bd0611beb565b8160005b81811015610c1457610c0c858583818110610bf157610bf1613e89565b9050602002016020810190610c0691906138ab565b84611d5d565b600101610bd4565b5050505050565b60008080610c2b60025b60010190565b905060005b81811015610cc1576000816002811115610c4c57610c4c613c48565b90506000816002811115610c6257610c62613c48565b03610c6d5750610cb9565b610cb560046000836002811115610c8657610c86613c48565b6002811115610c9757610c97613c48565b81526020019081526020016000205485611dd690919063ffffffff16565b9350505b600101610c30565b509092915050565b336000818152600760205260408120610ce190611dda565b805190915060005b81811015610b0b576000838281518110610d0557610d05613e89565b60200260200101519050610d3a610d246001546001600160a01b031690565b60208301516001600160a01b0388169190611ff3565b50805160208201516040516001600160a01b038816927f83637d0d125e3dae88720b1ad229ce05c339c065b6282caf315dcb35a999d6d492610d7b92613e9f565b60405180910390a250600101610ce9565b6000866002811115610da057610da0613c48565b03610dbe576040516357b3acf160e01b815260040160405180910390fd5b600254851015610de15760405163162908e360e11b815260040160405180910390fd5b33610e0c610df76001546001600160a01b031690565b6001600160a01b03831690888888888861200a565b50610e178187612109565b610e22818888611ab9565b50505050505050565b336000818152600560205260408120548190610e4a90849083906118fc565b905080600003610e6d5760405163f40c208960e01b815260040160405180910390fd5b610b5c838383611b45565b610e80612174565b610e8982612219565b610e938282612221565b5050565b6000610ea16122de565b5060008051602061402b83398151915290565b6000546001600160a01b03163314610ee657604051633733be5960e21b81523360048201526024015b60405180910390fd5b81610ef384600183612327565b90508015610f0a57610f0784600283612327565b90505b8015610f29576040516322fb20b360e01b815260040160405180910390fd5b610c14610f3e6001546001600160a01b031690565b6001600160a01b0384169085611ff3565b610f57611beb565b610f6160006123ab565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610fa85750825b90506000826001600160401b03166001148015610fc45750303b155b905081158015610fd2575080155b15610ff05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561101a57845460ff60401b1916600160401b1785555b61102261119b565b61102b8861241c565b61103487612471565b61103d86611c46565b831561108357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b6001600160a01b038216600090815260076020908152604080832080548251818502810185019093528083526060946109ea9487949392919084015b8282101561113c576000848152602090206040805160608101909152600384029091018054829060ff16600281111561110457611104613c48565b600281111561111557611115613c48565b815260200160018201548152602001600282015481525050815260200190600101906110c9565b5050505061254390919063ffffffff16565b611156611beb565b8060005b81811015610b0b5761119384848381811061117757611177613e89565b905060200201602081019061118c91906138ab565b6000611d5d565b60010161115a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156111e05750825b90506000826001600160401b031660011480156111fc5750303b155b90508115801561120a575080155b156112285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561125257845460ff60401b1916600160401b1785555b61125b33612644565b611263612655565b8315610c1457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050565b336000818152600660205260408120818460028111156112d1576112d1613c48565b60028111156112e2576112e2613c48565b81526020019081526020016000205490506112fe828483611987565b611308828261265d565b611313828483611a1e565b610b5c604051806060016040528085600281111561133357611333613c48565b81526020808201859052600060409283018190526001600160a01b038716815260079091522090612696565b6001600160a01b0381166000908152600560205260408120546109ed90839083906118fc565b61138e33612219565b610b7281612471565b336113a3818484611987565b6113ae818484612745565b91506113ba818361265d565b6113c5818484611a1e565b610b5c60405180606001604052808560028111156113e5576113e5613c48565b81526020808201869052600060409283018190526001600160a01b038616815260079091522090612696565b336000818152600760205260409020548210611440576040516334ea6fcd60e01b815260040160405180910390fd5b6001600160a01b038116600090815260076020526040812080548490811061146a5761146a613e89565b6000918252602090912060408051606081019091526003909202018054829060ff16600281111561149d5761149d613c48565b60028111156114ae576114ae613c48565b815260200160018201548152602001600282015481525050905080604001514211156114ed576040516343465ae760e11b815260040160405180910390fd5b6001600160a01b038216600090815260076020526040902061150f90846127b0565b61151d828260200151612109565b610b5c8282600001518360200151611ab9565b6060600b80548060200260200160405190810160405280929190818152602001828054801561158857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161156a575b5050505050905090565b61159b33612219565b610b728161241c565b6000546001600160a01b031633146115d157604051633733be5960e21b8152336004820152602401610edd565b8360005b81811015610e22576116268787838181106115f2576115f2613e89565b905060200201602081019061160791906138ab565b86868481811061161957611619613e89565b9050602002013585610eb4565b6001016115d5565b600082600281111561164257611642613c48565b03611660576040516357b3acf160e01b815260040160405180910390fd5b6002548110156116835760405163162908e360e11b815260040160405180910390fd5b336116aa6116996001546001600160a01b031690565b6001600160a01b03831690846128a0565b506116b58183612109565b610b5c818484611ab9565b6001600160a01b0381166000908152600760209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561176b576000848152602090206040805160608101909152600384029091018054829060ff16600281111561173357611733613c48565b600281111561174457611744613c48565b815260200160018201548152602001600282015481525050815260200190600101906116f8565b505050509050919050565b610f61600034612aa6565b600082600281111561179557611795613c48565b036117b3576040516357b3acf160e01b815260040160405180910390fd5b8160028111156117c5576117c5613c48565b8360028111156117d7576117d7613c48565b106117f5576040516357b3acf160e01b815260040160405180910390fd5b33611801818584611987565b61180c818584612745565b9150611819818584611a1e565b610b0b818484611ab9565b61182c611beb565b6001600160a01b03811661185657604051631e4fbdf760e01b815260006004820152602401610edd565b610b72816123ab565b6000808061186d6002610c25565b905060005b818110156118e957600081600281111561188e5761188e613c48565b905060008160028111156118a4576118a4613c48565b036118af57506118e1565b6001600160a01b03861660009081526006602052604081206118dd91836002811115610c8657610c86613c48565b9350505b600101611872565b50909392505050565b610e938282612aa6565b6001600160a01b0383166000908152600560205260408120548181611922576000611953565b6001600160a01b03808716600090815260096020908152604080832093891683529290522054611953908584612bc8565b6001600160a01b03861660009081526008602052604090205490915061197b90850282612c90565b925050505b9392505050565b6001600160a01b0383166000908152600660205260408120818460028111156119b2576119b2613c48565b60028111156119c3576119c3613c48565b8152602001908152602001600020549050806000036119f557604051630b6a056960e31b815260040160405180910390fd5b81811015610b0b578383828460405163308c9dff60e11b8152600401610edd9493929190613eba565b611a29838383612cac565b6001600160a01b03831660009081526005602052604081205490611a4c85612db0565b905081811015611a6557808203611a638682612e6f565b505b611a6f8582612f5e565b846001600160a01b03167f9bda9a567fe5ce9bcfb637505de9a1dc9d112a34e25a8524026e3d869f95b4718585604051611aaa929190613e9f565b60405180910390a25050505050565b611ac4838383612fad565b6001600160a01b03831660009081526005602052604081205490611ae785612db0565b905081811115611b0057818103611afe8682613074565b505b611b0a8582612f5e565b846001600160a01b03167f3cf14181ae25669a913d72411736fc5c01f538fa503e963b0b2e56bcefb3edaf8585604051611aaa929190613e9f565b6001600160a01b038381166000818152600960209081526040808320948716808452948252808320805487019055838352600a825280832094835293905291909120805483019055611b98908383611ff3565b50816001600160a01b0316836001600160a01b03167ff7a40077ff7a04c7e61f6f26fb13774259ddf1b6bce9ecf26a8276cdd399268383604051611bde91815260200190565b60405180910390a3505050565b33611c1d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f615760405163118cdaa760e01b8152336004820152602401610edd565b6000600b805480602002602001604051908101604052809291908181526020018280548015611c9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c80575b505083519394506000925050505b81811015611d0c576000838281518110611cc857611cc8613e89565b60200260200101519050611ce5818661319790919063ffffffff16565b611d03576001600160a01b0381166000908152600860205260408120555b50600101611cac565b508251611d2090600b906020860190613737565b507fa1749ac7c93cc69c34654a02dd46920061d3db5577e75d6561ff2f7199ddc37183604051611d509190613d64565b60405180910390a1505050565b6001600160a01b038281166000818152600560209081526040808320549486168084526008835281842054948452600983528184209084529091529020549082029081811115610c14576001600160a01b0380861660009081526009602090815260408083209388168352929052208290555050505050565b0190565b8054606090429060009081816001600160401b03811115611dfd57611dfd6138c6565b604051908082528060200260200182016040528015611e5357816020015b611e406040805160608101909152806000815260200160008152602001600081525090565b815260200190600190039081611e1b5790505b50905060005b82811015611f7f576000878281548110611e7557611e75613e89565b6000918252602090912060408051606081019091526003909202018054829060ff166002811115611ea857611ea8613c48565b6002811115611eb957611eb9613c48565b81526020016001820154815260200160028201548152505090508060400151861115611f0e5780838681518110611ef257611ef2613e89565b6020026020010181905250611f078560010190565b9450611f76565b8415611f7657808886840381548110611f2957611f29613e89565b6000918252602090912082516003909202018054909190829060ff19166001836002811115611f5a57611f5a613c48565b0217905550602082015160018201556040909101516002909101555b50600101611e59565b508215611fde5760005b83811015611fdc5786805480611fa157611fa1613ee9565b600082815260208120600360001990930192830201805460ff1916815560018101829055600201559055611fd58160010190565b9050611f89565b505b81831015611fea578281525b95945050505050565b600061200284848460006131f6565b949350505050565b60006001600160a01b03871661206057600019860361203157876001600160a01b03163195505b8534101561205b5760405163d17e444b60e01b815234600482015260248101879052604401610edd565b6120fa565b86600187016120d6576040516370a0823160e01b81526001600160a01b038a811660048301528216906370a0823190602401602060405180830381865afa1580156120af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d39190613eff565b96505b866000036120e85760009150506120fe565b6120f8888a308a8a8a8a8a6133b9565b505b5060015b979650505050505050565b6000546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f19906044015b600060405180830381600087803b15801561215857600080fd5b505af115801561216c573d6000803e3d6000fd5b505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166121ef60008051602061402b833981519152546001600160a01b031690565b6001600160a01b031614155b15610f615760405163703e46dd60e11b815260040160405180910390fd5b610b72611beb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561227b575060408051601f3d908101601f1916820190925261227891810190613eff565b60015b6122a357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610edd565b60008051602061402b83398151915281146122d457604051632a87526960e21b815260048101829052602401610edd565b610b5c8383613471565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f615760405163703e46dd60e11b815260040160405180910390fd5b6001600160a01b038316600090815260066020526040812081908185600281111561235457612354613c48565b600281111561236557612365613c48565b815260200190815260200160002054905082811061239157612388858585611a1e565b600091506123a3565b61239c858583611a1e565b8083035b91505b509392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fdfc99f06c00ec9d9c39735fe0e3b20e8d77ecbe0eed7f1622dbda285002954e8906020015b60405180910390a150565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b038516916124b491613f18565b600060405180830381855afa9150503d80600081146124ef576040519150601f19603f3d011682016040523d82523d6000602084013e6124f4565b606091505b5091509150816125175760405163c1ab6dc160e01b815260040160405180910390fd5b60008180602001905181019061252d9190613f34565b60ff169050600a81900a600255610b0b846134c7565b815160609060009081816001600160401b03811115612564576125646138c6565b6040519080825280602002602001820160405280156125ba57816020015b6125a76040805160608101909152806000815260200160008152602001600081525090565b8152602001906001900390816125825790505b50905060005b82811015611fdc5760008782815181106125dc576125dc613e89565b602002602001015190508660028111156125f8576125f8613c48565b8151600281111561260b5761260b613c48565b0361263b578083868151811061262357612623613e89565b60200260200101819052506126388560010190565b94505b506001016125c0565b61264c613515565b610b728161355e565b610f61613515565b600054604051632770a7eb60e21b81526001600160a01b0384811660048301526024820184905290911690639dc29fac9060440161213e565b6002815160028111156126ab576126ab613c48565b036126c157626ebe0042015b60408201526126ed565b6001815160028111156126d6576126d6613c48565b036126e65762093a8042016126b7565b4260408201525b8154600181810184556000848152602090208351600390930201805484939192839160ff19169083600281111561272657612726613c48565b0217905550602082015181600101556040820151816002015550505050565b6001600160a01b038316600090815260066020526040812081908185600281111561277257612772613c48565b600281111561278357612783613c48565b815260200190815260200160002054905082811180156127a65750600254838203105b61200257826123a0565b81548082106127be57505050565b6000198101825b8181101561285f578460018201815481106127e2576127e2613e89565b906000526020600020906003020185828154811061280257612802613e89565b6000918252602090912082546003909202018054909160ff1690829060ff1916600183600281111561283657612836613c48565b0217905550600182810154908201556002918201549101556128588160010190565b90506127c5565b508380548061287057612870613ee9565b600082815260208120600360001990930192830201805460ff191681556001810182905560020155905550505050565b60006001600160a01b0383166128f65760001982036128c757836001600160a01b03163191505b813410156128f15760405163d17e444b60e01b815234600482015260248101839052604401610edd565b612a9c565b826001830161296c576040516370a0823160e01b81526001600160a01b0386811660048301528216906370a0823190602401602060405180830381865afa158015612945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129699190613eff565b92505b8260000361297e576000915050611980565b604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301526000919083169063dd62ed3e90604401602060405180830381865afa1580156129ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f29190613eff565b905083811015612a1f5760405163d17e444b60e01b81526004810182905260248101859052604401610edd565b6040516323b872dd60e01b81526001600160a01b038781166004830152306024830152604482018690528316906323b872dd906064016020604051808303816000875af1158015612a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a989190613f57565b5050505b5060019392505050565b33612ab28184846128a0565b50826001600160a01b0316816001600160a01b03167fad4a9acf26d8bba7a8cf1a41160d59be042ee554578e256c98d2ab74cdd4354284604051612af891815260200190565b60405180910390a36003548015801590612b7a5750612b7a84600b805480602002602001604051908101604052809291908181526020018280548015612b6757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b49575b505050505061319790919063ffffffff16565b15610b0b57612ba9612b8c8483613566565b6001600160a01b0386166000908152600860205260409020540190565b6001600160a01b03851660009081526008602052604090205550505050565b6000838302816000198587098281108382030391505080600003612bff57838281612bf557612bf5613f79565b0492505050611980565b808411612c1f5760405163227bc15360e01b815260040160405180910390fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b0290565b600081831115612ca357508082036109ed565b50600092915050565b6001600160a01b0383166000908152600660205260408120612d0b91839190856002811115612cdd57612cdd613c48565b6002811115612cee57612cee613c48565b815260200190815260200160002054612e6a90919063ffffffff16565b6001600160a01b038416600090815260066020526040812090846002811115612d3657612d36613c48565b6002811115612d4757612d47613c48565b815260200190815260200160002081905550612d738160046000856002811115612cdd57612cdd613c48565b60046000846002811115612d8957612d89613c48565b6002811115612d9a57612d9a613c48565b8152602081019190915260400160002055505050565b60008080612dbe6002610c25565b905060005b818110156118e9576000816002811115612ddf57612ddf613c48565b90506000816002811115612df557612df5613c48565b03612e005750612e62565b6001600160a01b038616600090815260066020526040812081836002811115612e2b57612e2b613c48565b6002811115612e3c57612e3c613c48565b81526020019081526020016000205490506000612e59838361357f565b95909501945050505b600101612dc3565b900390565b6000600b805480602002602001604051908101604052809291908181526020018280548015612ec757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ea9575b505083519394506000925050505b81811015610c14576000838281518110612ef157612ef1613e89565b602002602001015190506000612f088783886118fc565b90508015612f1b57612f1b878383611b45565b506001600160a01b03908116600081815260086020908152604080832054948a168352600982528083209383529290522080549186029091039055600101612ed5565b6001600160a01b038216600090815260056020526040902080549082905581811115612f9957612f918282036003540390565b600355505050565b81811015610b5c5760035481830301612f91565b6001600160a01b038316600090815260066020526040812061300c91839190856002811115612fde57612fde613c48565b6002811115612fef57612fef613c48565b815260200190815260200160002054611dd690919063ffffffff16565b6001600160a01b03841660009081526006602052604081209084600281111561303757613037613c48565b600281111561304857613048613c48565b815260200190815260200160002081905550612d738160046000856002811115612fde57612fde613c48565b6000600b8054806020026020016040519081016040528092919081815260200182805480156130cc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116130ae575b505083519394506000925050505b81811015610c145760008382815181106130f6576130f6613e89565b6020026020010151905061316561313b60086000846001600160a01b03166001600160a01b031681526020019081526020016000205487612c8c90919063ffffffff16565b6001600160a01b038089166000908152600960209081526040808320938716835292905220540190565b6001600160a01b03878116600090815260096020908152604080832095909316825293909352909120556001016130da565b8151600090815b818110156131eb57836001600160a01b03168582815181106131c2576131c2613e89565b60200260200101516001600160a01b0316036131e3576001925050506109ed565b60010161319e565b506000949350505050565b6000806001600160a01b03851661327f576000198403613214574793505b83600003613226576000915050612002565b6040516001600160a01b038716908590600081818185875af1925050503d806000811461326f576040519150601f19603f3d011682016040523d82523d6000602084013e613274565b606091505b50508091505061337d565b84600185016132f3576040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa1580156132cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f09190613eff565b94505b8460000361330657600092505050612002565b60405163a9059cbb60e01b81526001600160a01b0388811660048301526024820187905282169063a9059cbb906044016020604051808303816000875af1158015613355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133799190613f57565b9150505b806133ad57826133a35760405163c39ba1a960e01b815260048101859052602401610edd565b6000915050612002565b50600195945050505050565b6040805160a0810182526001600160a01b038a811660608301908152608083018990528252602080830188905282840187905283518085018552918a1682528101889052915163187945bd60e11b81526e22d473030f116ddee9f6b43ac78ba3926330f28b7a92613435929091908c9088908890600401613f8f565b600060405180830381600087803b15801561344f57600080fd5b505af1158015613463573d6000803e3d6000fd5b505050505050505050505050565b61347a826135c1565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156134bf57610b5c8282613626565b610e93613693565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f1b737a2df6948bd6245ff6c5a979e43e3e9d2e2c233691f4445094a5ae6267a090602001612466565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610f6157604051631afcd79f60e31b815260040160405180910390fd5b61182c613515565b600081838161357757613577613f79565b049392505050565b6000806135976002548461356690919063ffffffff16565b905060028460028111156135ad576135ad613c48565b146135b85780612002565b60028102612002565b806001600160a01b03163b6000036135f757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610edd565b60008051602061402b83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516136439190613f18565b600060405180830381855af49150503d806000811461367e576040519150601f19603f3d011682016040523d82523d6000602084013e613683565b606091505b5091509150611fea8583836136b2565b3415610f615760405163b398979f60e01b815260040160405180910390fd5b6060826136c7576136c28261370e565b611980565b81511580156136de57506001600160a01b0384163b155b1561370757604051639996b31560e01b81526001600160a01b0385166004820152602401610edd565b5080611980565b80511561371e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b82805482825590600052602060002090810192821561378c579160200282015b8281111561378c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613757565b5061379892915061379c565b5090565b5b80821115613798576000815560010161379d565b60005b838110156137cc5781810151838201526020016137b4565b50506000910152565b60208152600082518060208401526137f48160408501602087016137b1565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461381f57600080fd5b919050565b6000806040838503121561383757600080fd5b61384083613808565b915061384e60208401613808565b90509250929050565b80356003811061381f57600080fd5b60006020828403121561387857600080fd5b6109ea82613857565b6000806040838503121561389457600080fd5b61389d83613857565b915061384e60208401613857565b6000602082840312156138bd57600080fd5b6109ea82613808565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613904576139046138c6565b604052919050565b600082601f83011261391d57600080fd5b813560206001600160401b03821115613938576139386138c6565b8160051b6139478282016138dc565b928352848101820192828101908785111561396157600080fd5b83870192505b848310156120fe5761397883613808565b82529183019190830190613967565b60006020828403121561399957600080fd5b81356001600160401b038111156139af57600080fd5b6120028482850161390c565b600080604083850312156139ce57600080fd5b61389d83613808565b60008083601f8401126139e957600080fd5b5081356001600160401b03811115613a0057600080fd5b6020830191508360208260051b8501011115613a1b57600080fd5b9250929050565b600080600060408486031215613a3757600080fd5b83356001600160401b03811115613a4d57600080fd5b613a59868287016139d7565b9094509250613a6c905060208501613808565b90509250925092565b60008060008060008060a08789031215613a8e57600080fd5b613a9787613857565b955060208701359450604087013593506060870135925060808701356001600160401b0380821115613ac857600080fd5b818901915089601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8a6020828501011115613afd57600080fd5b6020830194508093505050509295509295509295565b60008060408385031215613b2657600080fd5b613b2f83613808565b91506020808401356001600160401b0380821115613b4c57600080fd5b818601915086601f830112613b6057600080fd5b813581811115613b7257613b726138c6565b613b84601f8201601f191685016138dc565b91508082528784828501011115613b9a57600080fd5b80848401858401376000848284010152508093505050509250929050565b600080600060608486031215613bcd57600080fd5b613bd684613808565b925060208401359150613a6c60408501613808565b600080600060608486031215613c0057600080fd5b613c0984613808565b9250613c1760208501613808565b915060408401356001600160401b03811115613c3257600080fd5b613c3e8682870161390c565b9150509250925092565b634e487b7160e01b600052602160045260246000fd5b60038110613c7c57634e487b7160e01b600052602160045260246000fd5b9052565b602080825282518282018190526000919060409081850190868401855b82811015613cd3578151613cb2858251613c5e565b80870151858801528501518585015260609093019290850190600101613c9d565b5091979650505050505050565b60008060208385031215613cf357600080fd5b82356001600160401b03811115613d0957600080fd5b613d15858286016139d7565b90969095509350505050565b60008060408385031215613d3457600080fd5b613d3d83613857565b946020939093013593505050565b600060208284031215613d5d57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015613da55783516001600160a01b031683529284019291840191600101613d80565b50909695505050505050565b600080600080600060608688031215613dc957600080fd5b85356001600160401b0380821115613de057600080fd5b613dec89838a016139d7565b90975095506020880135915080821115613e0557600080fd5b50613e12888289016139d7565b9094509250613e25905060408701613808565b90509295509295909350565b600080600060608486031215613e4657600080fd5b613e4f84613857565b9250613e5d60208501613857565b9150604084013590509250925092565b60008060408385031215613e8057600080fd5b613d3d83613808565b634e487b7160e01b600052603260045260246000fd5b60408101613ead8285613c5e565b8260208301529392505050565b6001600160a01b038516815260808101613ed76020830186613c5e565b60408201939093526060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215613f1157600080fd5b5051919050565b60008251613f2a8184602087016137b1565b9190910192915050565b600060208284031215613f4657600080fd5b815160ff8116811461198057600080fd5b600060208284031215613f6957600080fd5b8151801515811461198057600080fd5b634e487b7160e01b600052601260045260246000fd5b6000610100613fb283895180516001600160a01b03168252602090810151910152565b6020880151604084015260408801516060840152613fe6608084018880516001600160a01b03168252602090810151910152565b6001600160a01b03861660c084015260e0830181905282018390526101208385828501376000838501820152601f909301601f19169091019091019594505050505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220b1bbff0652e91b699d5affd90c73b9aa44094068372b88e005846c8898c9c42364736f6c63430008140033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
