{
  "_format": "hh-sol-artifact-1",
  "contractName": "PositiveAMM",
  "sourceName": "contracts/core/amm/PositiveAMM.sol",
  "abi": [
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "AMMId",
              "name": "ammId",
              "type": "uint24"
            },
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "symbol",
              "type": "string"
            },
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "market",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "oracleImpliedRateWindow",
              "type": "uint32"
            },
            {
              "internalType": "uint64",
              "name": "feeRate",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "totalSupplyCap",
              "type": "uint256"
            },
            {
              "internalType": "MarketAcc",
              "name": "seeder",
              "type": "bytes26"
            },
            {
              "internalType": "address",
              "name": "permissionController",
              "type": "address"
            }
          ],
          "internalType": "struct AMMCreateParams",
          "name": "createParams",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "totalFloatAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "normFixedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "totalLp",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "latestFTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maturity",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "seedTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "cutOffTimestamp",
              "type": "uint256"
            }
          ],
          "internalType": "struct AMMState",
          "name": "initialState",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AMMCutOffReached",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInsufficientCashIn",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInsufficientLiquidity",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMInvalidRateRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMNegativeCash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMSignMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMTotalSupplyCapExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AMMWithdrawOnly",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "account",
          "type": "bytes26"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "BOROS20NotEnoughBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidFeeRates",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidObservationWindow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MarketMatured",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MathInvalidExponent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MathOutOfBounds",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        }
      ],
      "name": "AMMConfigUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "MarketAcc",
          "name": "from",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "MarketAcc",
          "name": "to",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "BOROS20Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "MarketAcc",
          "name": "payer",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "netLpBurned",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netCashOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netSizeOut",
          "type": "int256"
        }
      ],
      "name": "Burn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newFeeRate",
          "type": "uint256"
        }
      ],
      "name": "FeeRateUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "newWindow",
          "type": "uint32"
        }
      ],
      "name": "ImpliedRateObservationWindowUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "MarketAcc",
          "name": "receiver",
          "type": "bytes26"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "netLpMinted",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netCashIn",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "netSizeIn",
          "type": "int256"
        }
      ],
      "name": "Mint",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "name": "Swap",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newTotalSupplyCap",
          "type": "uint256"
        }
      ],
      "name": "TotalSupplyCapUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "ACCOUNT_ONE",
      "outputs": [
        {
          "internalType": "MarketAcc",
          "name": "",
          "type": "bytes26"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "AMM_ID",
      "outputs": [
        {
          "internalType": "AMMId",
          "name": "",
          "type": "uint24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MARKET",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MATURITY",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ROUTER",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEED_TIME",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SELF_ACC",
      "outputs": [
        {
          "internalType": "MarketAcc",
          "name": "",
          "type": "bytes26"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "_storage",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "oracleImpliedRateWindow",
          "type": "uint32"
        },
        {
          "internalType": "uint64",
          "name": "feeRate",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "totalSupplyCap",
          "type": "uint256"
        },
        {
          "internalType": "uint128",
          "name": "totalFloatAmount",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "normFixedAmount",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "lastTradedTime",
          "type": "uint32"
        },
        {
          "internalType": "int128",
          "name": "prevOracleImpliedRate",
          "type": "int128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "account",
          "type": "bytes26"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "payer",
          "type": "bytes26"
        },
        {
          "internalType": "int256",
          "name": "totalCash",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "totalSize",
          "type": "int256"
        },
        {
          "internalType": "uint256",
          "name": "lpToBurn",
          "type": "uint256"
        }
      ],
      "name": "burnByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "netCashOut",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "netSizeOut",
          "type": "int256"
        },
        {
          "internalType": "bool",
          "name": "isMatured",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "targetRate",
          "type": "int256"
        }
      ],
      "name": "calcSwapSize",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRate",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "impliedRate",
      "outputs": [
        {
          "internalType": "int256",
          "name": "",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "MarketAcc",
          "name": "receiver",
          "type": "bytes26"
        },
        {
          "internalType": "int256",
          "name": "totalCash",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "totalSize",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "maxCashIn",
          "type": "int256"
        },
        {
          "internalType": "int256",
          "name": "exactSizeIn",
          "type": "int256"
        }
      ],
      "name": "mintByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "netCashIn",
          "type": "int256"
        },
        {
          "internalType": "uint256",
          "name": "netLpOut",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oracleImpliedRate",
      "outputs": [
        {
          "internalType": "int128",
          "name": "",
          "type": "int128"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "readState",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "totalFloatAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "normFixedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "totalLp",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "latestFTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maturity",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "seedTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAbsRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "cutOffTimestamp",
              "type": "uint256"
            }
          ],
          "internalType": "struct AMMState",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "minAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "maxAbsRate",
          "type": "uint128"
        },
        {
          "internalType": "uint32",
          "name": "cutOffTimestamp",
          "type": "uint32"
        }
      ],
      "name": "setAMMConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "newFeeRate",
          "type": "uint64"
        }
      ],
      "name": "setAMMFeeRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "newWindow",
          "type": "uint32"
        }
      ],
      "name": "setAMMImpliedRateObservationWindow",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newTotalSupplyCap",
          "type": "uint256"
        }
      ],
      "name": "setAMMTotalSupplyCap",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        }
      ],
      "name": "swapByBorosRouter",
      "outputs": [
        {
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "int256",
          "name": "sizeOut",
          "type": "int256"
        }
      ],
      "name": "swapView",
      "outputs": [
        {
          "internalType": "int256",
          "name": "costOut",
          "type": "int256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupplyCap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x610180604052348015610010575f5ffd5b50604051613c02380380613c0283398101604081905261002f9161094b565b81818161012001518260200151836040015181600290816100509190610af4565b50600361005d8282610af4565b5050506001600160a01b0390811660809081526060840151821660a09081529084015190911660c05281015161009290610237565b63ffffffff1660e05260808101516100a990610237565b63ffffffff1661010052815162ffffff166101605260c0516040805163303e74df60e01b815290515f9283926001600160a01b039091169163303e74df9160048082019260e0929091908290030181865afa15801561010a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012e9190610bbd565b509396509194506101489350309250859150849050610250565b65ffffffffffff19166101205261016160018383610250565b65ffffffffffff19166101405260c08301516101a2906101809061028a565b60e085015161018e9061028a565b61010086015161019d90610237565b61029e565b60a08401516101b09061038d565b60e08401516101be906103f2565b60c08401516101cc90610427565b6101d5836104b8565b6101f6846101000151620f424085604001516101f19190610c68565b610511565b6101405161020790620f4240610511565b600654600154111561022c57604051637540794960e01b815260040160405180910390fd5b505050505050610c8e565b5f640100000000821061024c5761024c610520565b5090565b5f62ffffff821661ffff84166001600160d01b03600887901b610100600160a81b031660ff1760101b161760181b1760301b949350505050565b5f600160801b821061024c5761024c610520565b5f806102b66001600160801b0380871690861661052d565b915091506101005163ffffffff168363ffffffff1611156102ea5760405163c32bc49360e01b815260040160405180910390fd5b815f1080156102f857508082105b61031457604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b61039681610556565b6005805463ffffffff60201b191664010000000063ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f906020016103e7565b670de0b6b3a7640000816001600160401b031611156104595760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916680100000000000000006001600160401b038416908102919091179091556040519081527f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd8906020016103e7565b80516104c39061028a565b600780546001600160801b0319166001600160801b039290921691909117905560208101516104f19061028a565b600780546001600160801b03928316600160801b02921691909117905550565b61051c5f8383610595565b5050565b6335278d125f526004601cfd5b5f8061053d846305f5e1006106bf565b915061054d836305f5e1006106e4565b90509250929050565b63ffffffff8116600a118015906105755750610e1063ffffffff821611155b610592576040516354c2857360e11b815260040160405180910390fd5b50565b61059f835f610700565b156105c0578060015f8282546105b59190610c7b565b909155506106349050565b65ffffffffffff1983165f908152602081905260409020548181101561061657604051637ec2996b60e01b815265ffffffffffff1985166004820152602481018290526044810183905260640160405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b61063e825f610700565b156106515760018054829003905561066f565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b5f6106db836106d684670de0b6b3a7640000610c7b565b610711565b90505b92915050565b5f6106db836106fb84670de0b6b3a7640000610c68565b610747565b65ffffffffffff1990811691161490565b81810281810483146107305781156107305763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f815f19048311156107665781156107665763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b03811182821017156107ad576107ad610776565b60405290565b60405161014081016001600160401b03811182821017156107ad576107ad610776565b62ffffff81168114610592575f5ffd5b80516107f1816107d6565b919050565b5f82601f830112610805575f5ffd5b81516001600160401b0381111561081e5761081e610776565b604051601f8201601f19908116603f011681016001600160401b038111828210171561084c5761084c610776565b604052818152838201602001851015610863575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80516001600160a01b03811681146107f1575f5ffd5b805163ffffffff811681146107f1575f5ffd5b80516001600160401b03811681146107f1575f5ffd5b805165ffffffffffff19811681146107f1575f5ffd5b5f61012082840312156108e5575f5ffd5b6108ed61078a565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100928301519281019290925250919050565b5f5f610140838503121561095d575f5ffd5b82516001600160401b03811115610972575f5ffd5b83016101408186031215610984575f5ffd5b61098c6107b3565b610995826107e6565b815260208201516001600160401b038111156109af575f5ffd5b6109bb878285016107f6565b60208301525060408201516001600160401b038111156109d9575f5ffd5b6109e5878285016107f6565b6040830152506109f76060830161087f565b6060820152610a086080830161087f565b6080820152610a1960a08301610895565b60a0820152610a2a60c083016108a8565b60c082015260e08281015190820152610a4661010083016108be565b610100820152610a59610120830161087f565b610120820152925061054d905084602085016108d4565b600181811c90821680610a8457607f821691505b602082108103610aa257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610aef57805f5260205f20601f840160051c81016020851015610acd5750805b601f840160051c820191505b81811015610aec575f8155600101610ad9565b50505b505050565b81516001600160401b03811115610b0d57610b0d610776565b610b2181610b1b8454610a70565b84610aa8565b6020601f821160018114610b53575f8315610b3c5750848201515b5f19600385901b1c1916600184901b178455610aec565b5f84815260208120601f198516915b82811015610b825787850151825560209485019460019092019101610b62565b5084821015610b9f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b61ffff81168114610592575f5ffd5b5f5f5f5f5f5f5f60e0888a031215610bd3575f5ffd5b87518015158114610be2575f5ffd5b6020890151909750610bf381610bae565b6040890151909650610c04816107d6565b9450610c1260608901610895565b9350608088015160ff81168114610c27575f5ffd5b60a0890151909350610c3881610bae565b9150610c4660c08901610895565b905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b818103818111156106de576106de610c54565b808201808211156106de576106de610c54565b60805160a05160c05160e05161010051610120516101405161016051612ea9610d595f395f61018001525f6102fe01525f81816101eb015261113501525f818161034c01528181610ffb01526112c101525f81816103d6015261102301525f8181610521015281816107830152818161085001528181610e1101528181610f710152818161110801526113bf01525f81816102b7015281816105e1015281816109100152610b7601525f81816106a8015281816109fb01528181610aba0152610ca70152612ea95ff3fe608060405234801561000f575f5ffd5b5060043610610147575f3560e01c806306fdde031461014b57806318160ddd146101695780631c9c28eb1461017b578063224ae0f2146101b657806324d4206b146101e657806326e96ce41461021a5780632778c3341461022f578063313ce567146102a357806332fe7b26146102b25780633317e9be146102f157806375f3c3ce146102f95780637b6addf3146103205780638e12c0cd146103475780639292c42b1461038357806395d89b4114610396578063978bbdb91461039e5780639a3a2e81146103be578063a6aa7b59146103d1578063acf17125146103f8578063b5f1544914610420578063bb102aea14610433578063c3564b151461043b578063c3fb90d614610463578063cb3d6678146104e3578063d7766b39146104f6578063e8f02a0714610509578063f46f16c21461051c575b5f5ffd5b610153610543565b6040516101609190612a03565b60405180910390f35b6001545b604051908152602001610160565b6101a27f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610160565b6101c96101c4366004612a4e565b6105d3565b604080519384526020840192909252151590820152606001610160565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101609190612a84565b61022d610228366004612aa9565b610691565b005b610237610753565b60405161016091905f61012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b60405160128152602001610160565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610160565b61016d610768565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b610328610833565b60408051600f9390930b835263ffffffff909116602083015201610160565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610160565b61016d610391366004612ac4565b610904565b6101536109d5565b600554600160401b90046001600160401b03166040516101609190612adb565b61022d6103cc366004612aef565b6109e4565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b61016d610406366004612b15565b65ffffffffffff19165f9081526020819052604090205490565b61022d61042e366004612b44565b610aa3565b60065461016d565b61044e610449366004612b88565b610b69565b60408051928352602083019190915201610160565b6004546005546006546007546008546104cd946001600160801b0380821695600160801b9283900482169563ffffffff80831696600160201b808504831697600160401b9095046001600160401b03169693958083169594909204909116929182169104600f0b8a565b6040516101609a99989796959493929190612bc6565b61022d6104f1366004612ac4565b610c90565b61016d610504366004612ac4565b610d4f565b61016d610517366004612ac4565b610d73565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b60606002805461055290612c42565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90612c42565b80156105c95780601f106105a0576101008083540402835291602001916105c9565b820191905f5260205f20905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b5f8080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461061e576040516282b42960e81b815260040160405180910390fd5b610626610dae565b610631868686610e00565b919450925090506106428785610eba565b8665ffffffffffff19167fa4d3bfbe6e7fe6b8d6c00f6cc61e2087b14a629095e6afdd82cb7842c457d77085858560405161067f93929190612c74565b60405180910390a29450945094915050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7009613906106ec90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610707573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190612cb7565b610747576040516282b42960e81b815260040160405180910390fd5b61075081610ec9565b50565b61075b6129c0565b610763610f2d565b905090565b6005545f9063ffffffff16428111610825578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190612cd6565b63ffffffff16106108255760405163c32bc49360e01b815260040160405180910390fd5b61082d611079565b91505090565b6005545f90819063ffffffff164281116108f2578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce9190612cd6565b63ffffffff16106108f25760405163c32bc49360e01b815260040160405180910390fd5b6108fb4261109b565b92509250509091565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094d576040516282b42960e81b815260040160405180910390fd5b610955610dae565b61095d6110ef565b1561097b57604051636b7ae02b60e11b815260040160405180910390fd5b5f61098e83610989856111a8565b6111cf565b60405191935091507f15391ef1cdeab4c973414c6652cf113cb3c8d26819a60aaebaae91bcb82c83da906109c790859085908590612c74565b60405180910390a150919050565b60606003805461055290612c42565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610a3f90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7e9190612cb7565b610a9a576040516282b42960e81b815260040160405180910390fd5b61075081611217565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610afe90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d9190612cb7565b610b59576040516282b42960e81b815260040160405180910390fd5b610b6483838361129d565b505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bb3576040516282b42960e81b815260040160405180910390fd5b610bbb610dae565b610bc36110ef565b15610be157604051636b7ae02b60e11b815260040160405180910390fd5b5f8613610c01576040516390f2286360e01b815260040160405180910390fd5b610c0d868686866113af565b9092509050610c1c8782611467565b6006546001541115610c4157604051637540794960e01b815260040160405180910390fd5b8665ffffffffffff19167f89a302decbf25a038eb274f71951f4be62b45c4e96bdf6e4f3bb246770a24bd4828486604051610c7e93929190612c74565b60405180910390a29550959350505050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610ceb90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610d06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2a9190612cb7565b610d46576040516282b42960e81b815260040160405180910390fd5b61075081611472565b5f610d586110ef565b15610d6457505f919050565b610d6d826114a7565b92915050565b5f610d7c6110ef565b15610d9a57604051636b7ae02b60e11b815260040160405180910390fd5b610da782610989846114c4565b5092915050565b5f610db8426114da565b9050610dc38161109b565b506008805463ffffffff90931663ffffffff196001600160801b03909316600160201b02929092166001600160a01b031990931692909217179055565b5f5f5f5f610e0c610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e909190612cf1565b9050610e9f82828a8a8a6114f2565b91965094509250610eaf8261165c565b505093509350939050565b610ec5825f836116b5565b5050565b610ed2816117e0565b6005805463ffffffff60201b1916600160201b63ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b610f356129c0565b60408051610120810182526007546001600160801b038082168352600160801b909104166020820152908101610f6a60015490565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612cd6565b63ffffffff90811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f0000000000000000000000000000000000000000000000000000000000000000811660408301526004546001600160801b038082166060850152600160801b9091041660808301526005541660a090910152919050565b6007545f90610763906001600160801b0380821691600160801b90041661181c565b6008545f908190600160201b8104600f0b9063ffffffff16826110c46110bf611079565b61182f565b600554600160201b900463ffffffff16945090506110e5838584848a61184f565b9450505050915091565b6040516308aafaad60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308aafaad9061115d907f000000000000000000000000000000000000000000000000000000000000000090600401612a84565b602060405180830381865afa158015611178573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119c9190612d08565b62ffffff161515919050565b5f5f6111b2610f2d565b90506111be81846118e0565b91506111c98161165c565b50919050565b6005545f9081906111f990600160401b90046001600160401b03166111f386611a4e565b90611a5a565b905061120481611a90565b61120e9084612d3e565b91509250929050565b670de0b6b3a7640000816001600160401b031611156112495760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916600160401b6001600160401b038416021790556040517f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890610f22908390612adb565b5f5f6112bb856001600160801b0316856001600160801b0316611a9c565b915091507f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff16111561130c5760405163c32bc49360e01b815260040160405180910390fd5b815f10801561131a57508082105b61133657604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b5f5f5f6113ba610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af115801561141a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143e9190612cf1565b905061144e82828a8a8a8a611ac5565b909450925061145c8261165c565b505094509492505050565b610ec55f83836116b5565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f90602001610f22565b5f5f6114b1610f2d565b90506114bd8184611ca6565b9392505050565b5f5f6114ce610f2d565b90506114bd81846118e0565b5f600160201b82106114ee576114ee611da2565b5090565b5f5f5f6115028860400151611a90565b61150b85611a90565b6115159088612d65565b61151f9190612da8565b92508760600151886080015111159050801561153d575f9150611651565b5f61154786611daf565b90505f5f6115548a611dce565b61155d84611dce565b1490508015611590578a604001518761157585611a4e565b61157f9190612dd4565b6115899190612deb565b91506115b5565b6115b28b60400151886115a286611a4e565b6115ac9190612dd4565b90611def565b91505b6115be83611dce565b6115c783611a90565b6115d19190612d65565b94508a60400151878c5f01516115e79190612dd4565b6115f19190612deb565b8b518c90611600908390612dfe565b90525060408b015160208c0151611618908990612dd4565b6116229190612deb565b8b6020018181516116339190612dfe565b90525060408b01805188919061164a908390612dfe565b9052505050505b955095509592505050565b805161166790611e0e565b600780546001600160801b0319166001600160801b0392909216919091179055602081015161169590611e0e565b600780546001600160801b03928316600160801b02921691909117905550565b6116bf835f611e22565b156116e0578060015f8282546116d59190612e11565b909155506117559050565b65ffffffffffff1983165f908152602081905260409020548181101561173757604051637ec2996b60e01b815265ffffffffffff198516600482015260248101829052604481018390526064015b60405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b61175f825f611e22565b1561177257600180548290039055611790565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b63ffffffff8116600a118015906117ff5750610e1063ffffffff821611155b610750576040516354c2857360e11b815260040160405180910390fd5b5f6114bd61182a8385611e33565b611a90565b5f6001607f1b820160801c611842575090565b61184a611da2565b919050565b5f63ffffffff8516816118628685612e24565b60030b9050805f036118785787925050506118d7565b8181126118895784925050506118d7565b5f6118948284612e40565b89600f0b6118a29190612d65565b6118b083600f89900b612d65565b6118ba9190612d3e565b90506118c68382612da8565b90506118d18161182f565b93505050505b95945050505050565b5f5f6118eb84611e75565b90505f5f6118f885611a4e565b90505f8513156119395761190d816001612e11565b86511161192d57604051633582eca960e21b815260040160405180910390fd5b85518190039150611949565b8551611946908290612e11565b91505b602086015186515f91611966916119609087611ed1565b9061203c565b90505f61197d6119768587611ed1565b8390611e33565b9050838860c0015161198f9190612dd4565b6119a1670de0b6b3a764000083612dd4565b10156119c057604051633582eca960e21b815260040160405180910390fd5b838860e001516119d09190612dd4565b6119e2670de0b6b3a764000083612dd4565b1115611a0157604051633582eca960e21b815260040160405180910390fd5b5f611a0f8960200151611a90565b611a1883611a90565b611a229190612e40565b858a5260208a018390529050611a41611a3a87611a90565b829061206b565b9998505050505050505050565b60ff81901d9081011890565b8181028181048314611a79578115611a795763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f5f8212611842575090565b5f80611aac846305f5e100612095565b9150611abc836305f5e1006120b1565b90509250929050565b606086015160808701515f91829111801590611af457604051635f2a407b60e01b815260040160405180910390fd5b5f8713611b0357611b03612e5f565b5f611b0d87611daf565b9050611b1885611dce565b611b2182611dce565b14611b3f5760405163c510544560e01b815260040160405180910390fd5b805f03611b735787611b5087611a90565b8b60400151611b5f9190612dd4565b611b699190612deb565b9250859350611c1e565b5f611b7d82611a4e565b90505f611b8987611a4e565b90505f611b958c611dce565b611b9e85611dce565b1490508015611bc95782828e60400151611bb89190612dd4565b611bc29190612deb565b9550611be0565b611bdd83838f604001516115ac9190612dd4565b95505b611bf761182a8e60400151888e6115ac9190612dd4565b965088871315611c1a5760405163580ca8fd60e01b815260040160405180910390fd5b5050505b60408a01518a51611c30908590612dd4565b611c3a9190612deb565b8a518b90611c49908390612e11565b90525060408a015160208b0151611c61908590612dd4565b611c6b9190612deb565b8a602001818151611c7c9190612e11565b90525060408a018051849190611c93908390612e11565b9052509299919850909650505050505050565b5f611cb183836120cd565b91505f611cc5845f0151856020015161181c565b9050600a611cdb611cd68386612e40565b611a4e565b1080611cf05750610100840151606085015110155b15611cfe575f915050610d6d565b5f611d0884611a90565b90505f611d1486611e75565b90505f611d29670de0b6b3a764000083612e11565b602088015188519192505f91611d3f9085611ed1565b611d499190612dd4565b90505f611d826002611d76611d66670de0b6b3a764000087611e33565b611d708987612deb565b90611ed1565b90808218908210021890565b9050611d8d81611a90565b8951611d9890611a90565b611a419190612e40565b6335278d125f526004601cfd5b5f6103e8611dbc83611a4e565b10611dc75781610d6d565b5f92915050565b5f5f821315611ddf57506001919050565b5f821215611dc757505f19919050565b5f81611e02576365244e4e5f526004601cfd5b50808206151591040190565b5f600160801b82106114ee576114ee611da2565b65ffffffffffff1990811691161490565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202611e6357637c5f487d5f526004601cfd5b50670de0b6b3a7640000919091020490565b61010081015160608201515f9111611ea05760405163c32bc49360e01b815260040160405180910390fd5b610d6d8260a001518360800151611eb79190612dfe565b83606001518460800151611ecb9190612dfe565b90611e33565b5f815f03611ee85750670de0b6b3a7640000610d6d565b825f03611ef657505f610d6d565b600160ff1b8310611f1a57604051637304657960e01b815260040160405180910390fd5b82770bce5086492111aea88f4bb1ca6bcf584181ea8059f765328310611f5357604051637304657960e01b815260040160405180910390fd5b825f670c7d713b49da000083138015611f735750670f43fc2c04ee000083125b15611fa9575f611f8284612116565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050611fb7565b81611fb384612233565b0290505b670de0b6b3a76400009005680238fd42c5cf03ffff198112801590611fe5575068070c1cc73b00c800008113155b6120295760405162461bcd60e51b815260206004820152601560248201527470726f64756374206f7574206f6620626f756e647360581b604482015260640161172e565b612032816125d1565b9695505050505050565b5f815f190483111561205b57811561205b5763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b670de0b6b3a76400008281029081058314820261208f57635c43740d5f526004601cfd5b05919050565b5f6114bd836120ac84670de0b6b3a7640000612e11565b611a5a565b5f6114bd836120c884670de0b6b3a7640000612dfe565b61203c565b5f5f5f6120e28560c001518660e00151611a9c565b915091506118d76120f282611a90565b61210a6120fe85611a90565b80881290881802871890565b90808218908213021890565b670de0b6b3a7640000025f806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161215657612156612d94565b0590505f6a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f82050160020295945050505050565b5f670de0b6b3a76400008212156122725761226a826a0c097ce7bc90715b34b9f160241b8161226457612264612d94565b05612233565b5f0392915050565b5f775803bcc5cb9634ba4cfb2213f784019318ed4dcb6017880f60361b83126122bc5772195e54c5dd42177f53a27172fa9ec63026282760241b830592506806f05b59d3b2000000015b6f8bcc0026baae9e45e470190267a230cf60191b83126122f3576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261233b576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312612376576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf85083126123ad57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126123e457690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126124195768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261244457680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312612479576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f177578893793783126124ae576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126124e2576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312612516576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b5f68056bc75e2d63100000840168056bc75e2d63100000808603028161253e5761253e612d94565b0590505f68056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b5f680238fd42c5cf03ffff1982121580156125f5575068070c1cc73b00c800008213155b6126125760405163739a565d60e11b815260040160405180910390fd5b5f82121561264857612625825f036125d1565b6a0c097ce7bc90715b34b9f160241b8161264157612641612d94565b0592915050565b5f6806f05b59d3b2000000831261268557506806f05b59d3b1ffffff199091019072195e54c5dd42177f53a27172fa9ec63026282760241b6126bb565b6803782dace9d900000083126126b757506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806126bb565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac62000000841261270b5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412612747576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b18800000841261278157682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126127bb576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac620000084126127f457680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261282d5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412612866576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261289f5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b803565ffffffffffff198116811461184a575f5ffd5b5f5f5f5f60808587031215612a61575f5ffd5b612a6a85612a38565b966020860135965060408601359560600135945092505050565b65ffffffffffff1991909116815260200190565b63ffffffff81168114610750575f5ffd5b5f60208284031215612ab9575f5ffd5b81356114bd81612a98565b5f60208284031215612ad4575f5ffd5b5035919050565b6001600160401b0391909116815260200190565b5f60208284031215612aff575f5ffd5b81356001600160401b03811681146114bd575f5ffd5b5f60208284031215612b25575f5ffd5b6114bd82612a38565b80356001600160801b038116811461184a575f5ffd5b5f5f5f60608486031215612b56575f5ffd5b612b5f84612b2e565b9250612b6d60208501612b2e565b91506040840135612b7d81612a98565b809150509250925092565b5f5f5f5f5f60a08688031215612b9c575f5ffd5b612ba586612a38565b97602087013597506040870135966060810135965060800135945092505050565b6001600160801b038b811682528a8116602083015263ffffffff8a8116604084015289811660608401526001600160401b038916608084015260a0830188905286821660c084015290851660e083015283166101008201526101408101612c33610120830184600f0b9052565b9b9a5050505050505050505050565b600181811c90821680612c5657607f821691505b6020821081036111c957634e487b7160e01b5f52602260045260245ffd5b9283526020830191909152604082015260600190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215612cc7575f5ffd5b815180151581146114bd575f5ffd5b5f60208284031215612ce6575f5ffd5b81516114bd81612a98565b5f60208284031215612d01575f5ffd5b5051919050565b5f60208284031215612d18575f5ffd5b815162ffffff811681146114bd575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715612d5d57612d5d612d2a565b505092915050565b8082025f8212600160ff1b84141615612d8057612d80612d2a565b8181058314821517610d6d57610d6d612d2a565b634e487b7160e01b5f52601260045260245ffd5b5f82612db657612db6612d94565b600160ff1b82145f1984141615612dcf57612dcf612d2a565b500590565b8082028115828204841417610d6d57610d6d612d2a565b5f82612df957612df9612d94565b500490565b81810381811115610d6d57610d6d612d2a565b80820180821115610d6d57610d6d612d2a565b63ffffffff8281168282160390811115610d6d57610d6d612d2a565b8181035f831280158383131683831282161715610da757610da7612d2a565b634e487b7160e01b5f52600160045260245ffdfea2646970667358221220af551fad7c59b6d821b394ff827fd65fd1cfd094eb1ea3809437b473c0cbc48764736f6c634300081c0033",
  "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610147575f3560e01c806306fdde031461014b57806318160ddd146101695780631c9c28eb1461017b578063224ae0f2146101b657806324d4206b146101e657806326e96ce41461021a5780632778c3341461022f578063313ce567146102a357806332fe7b26146102b25780633317e9be146102f157806375f3c3ce146102f95780637b6addf3146103205780638e12c0cd146103475780639292c42b1461038357806395d89b4114610396578063978bbdb91461039e5780639a3a2e81146103be578063a6aa7b59146103d1578063acf17125146103f8578063b5f1544914610420578063bb102aea14610433578063c3564b151461043b578063c3fb90d614610463578063cb3d6678146104e3578063d7766b39146104f6578063e8f02a0714610509578063f46f16c21461051c575b5f5ffd5b610153610543565b6040516101609190612a03565b60405180910390f35b6001545b604051908152602001610160565b6101a27f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff9091168152602001610160565b6101c96101c4366004612a4e565b6105d3565b604080519384526020840192909252151590820152606001610160565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101609190612a84565b61022d610228366004612aa9565b610691565b005b610237610753565b60405161016091905f61012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015292915050565b60405160128152602001610160565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610160565b61016d610768565b61020d7f000000000000000000000000000000000000000000000000000000000000000081565b610328610833565b60408051600f9390930b835263ffffffff909116602083015201610160565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610160565b61016d610391366004612ac4565b610904565b6101536109d5565b600554600160401b90046001600160401b03166040516101609190612adb565b61022d6103cc366004612aef565b6109e4565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b61016d610406366004612b15565b65ffffffffffff19165f9081526020819052604090205490565b61022d61042e366004612b44565b610aa3565b60065461016d565b61044e610449366004612b88565b610b69565b60408051928352602083019190915201610160565b6004546005546006546007546008546104cd946001600160801b0380821695600160801b9283900482169563ffffffff80831696600160201b808504831697600160401b9095046001600160401b03169693958083169594909204909116929182169104600f0b8a565b6040516101609a99989796959493929190612bc6565b61022d6104f1366004612ac4565b610c90565b61016d610504366004612ac4565b610d4f565b61016d610517366004612ac4565b610d73565b6102d97f000000000000000000000000000000000000000000000000000000000000000081565b60606002805461055290612c42565b80601f016020809104026020016040519081016040528092919081815260200182805461057e90612c42565b80156105c95780601f106105a0576101008083540402835291602001916105c9565b820191905f5260205f20905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b5f8080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461061e576040516282b42960e81b815260040160405180910390fd5b610626610dae565b610631868686610e00565b919450925090506106428785610eba565b8665ffffffffffff19167fa4d3bfbe6e7fe6b8d6c00f6cc61e2087b14a629095e6afdd82cb7842c457d77085858560405161067f93929190612c74565b60405180910390a29450945094915050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b7009613906106ec90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610707573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190612cb7565b610747576040516282b42960e81b815260040160405180910390fd5b61075081610ec9565b50565b61075b6129c0565b610763610f2d565b905090565b6005545f9063ffffffff16428111610825578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107dd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190612cd6565b63ffffffff16106108255760405163c32bc49360e01b815260040160405180910390fd5b61082d611079565b91505090565b6005545f90819063ffffffff164281116108f2578063ffffffff167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ce9190612cd6565b63ffffffff16106108f25760405163c32bc49360e01b815260040160405180910390fd5b6108fb4261109b565b92509250509091565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461094d576040516282b42960e81b815260040160405180910390fd5b610955610dae565b61095d6110ef565b1561097b57604051636b7ae02b60e11b815260040160405180910390fd5b5f61098e83610989856111a8565b6111cf565b60405191935091507f15391ef1cdeab4c973414c6652cf113cb3c8d26819a60aaebaae91bcb82c83da906109c790859085908590612c74565b60405180910390a150919050565b60606003805461055290612c42565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610a3f90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610a5a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7e9190612cb7565b610a9a576040516282b42960e81b815260040160405180910390fd5b61075081611217565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610afe90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d9190612cb7565b610b59576040516282b42960e81b815260040160405180910390fd5b610b6483838361129d565b505050565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bb3576040516282b42960e81b815260040160405180910390fd5b610bbb610dae565b610bc36110ef565b15610be157604051636b7ae02b60e11b815260040160405180910390fd5b5f8613610c01576040516390f2286360e01b815260040160405180910390fd5b610c0d868686866113af565b9092509050610c1c8782611467565b6006546001541115610c4157604051637540794960e01b815260040160405180910390fd5b8665ffffffffffff19167f89a302decbf25a038eb274f71951f4be62b45c4e96bdf6e4f3bb246770a24bd4828486604051610c7e93929190612c74565b60405180910390a29550959350505050565b60405163b700961360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b700961390610ceb90339030906001600160e01b03195f351690600401612c8a565b602060405180830381865afa158015610d06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2a9190612cb7565b610d46576040516282b42960e81b815260040160405180910390fd5b61075081611472565b5f610d586110ef565b15610d6457505f919050565b610d6d826114a7565b92915050565b5f610d7c6110ef565b15610d9a57604051636b7ae02b60e11b815260040160405180910390fd5b610da782610989846114c4565b5092915050565b5f610db8426114da565b9050610dc38161109b565b506008805463ffffffff90931663ffffffff196001600160801b03909316600160201b02929092166001600160a01b031990931692909217179055565b5f5f5f5f610e0c610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e909190612cf1565b9050610e9f82828a8a8a6114f2565b91965094509250610eaf8261165c565b505093509350939050565b610ec5825f836116b5565b5050565b610ed2816117e0565b6005805463ffffffff60201b1916600160201b63ffffffff8416908102919091179091556040519081527f48c052f6bf1f8a513b946b104b98bee186b737ce4e3f364b2aa7401f82e040ec906020015b60405180910390a150565b610f356129c0565b60408051610120810182526007546001600160801b038082168352600160801b909104166020820152908101610f6a60015490565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85dfce36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fcb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612cd6565b63ffffffff90811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f0000000000000000000000000000000000000000000000000000000000000000811660408301526004546001600160801b038082166060850152600160801b9091041660808301526005541660a090910152919050565b6007545f90610763906001600160801b0380821691600160801b90041661181c565b6008545f908190600160201b8104600f0b9063ffffffff16826110c46110bf611079565b61182f565b600554600160201b900463ffffffff16945090506110e5838584848a61184f565b9450505050915091565b6040516308aafaad60e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906308aafaad9061115d907f000000000000000000000000000000000000000000000000000000000000000090600401612a84565b602060405180830381865afa158015611178573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119c9190612d08565b62ffffff161515919050565b5f5f6111b2610f2d565b90506111be81846118e0565b91506111c98161165c565b50919050565b6005545f9081906111f990600160401b90046001600160401b03166111f386611a4e565b90611a5a565b905061120481611a90565b61120e9084612d3e565b91509250929050565b670de0b6b3a7640000816001600160401b031611156112495760405163081ca07f60e01b815260040160405180910390fd5b60058054600160401b600160801b031916600160401b6001600160401b038416021790556040517f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890610f22908390612adb565b5f5f6112bb856001600160801b0316856001600160801b0316611a9c565b915091507f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff16111561130c5760405163c32bc49360e01b815260040160405180910390fd5b815f10801561131a57508082105b61133657604051620ca50360e31b815260040160405180910390fd5b6001600160801b03858116600160801b91861691820281176004556005805463ffffffff191663ffffffff87169081179091556040805192835260208301939093528183015290517f49465dfaf65a9f995d83e80aaabd038e108086e61a6215bd725f698586d5a2239181900360600190a15050505050565b5f5f5f6113ba610f2d565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fba55856040518163ffffffff1660e01b81526004016020604051808303815f875af115801561141a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143e9190612cf1565b905061144e82828a8a8a8a611ac5565b909450925061145c8261165c565b505094509492505050565b610ec55f83836116b5565b60068190556040518181527f296dbcad3f3b915b3b636a011bea7d7f633cb1928287f6906ef0ccafe4a7e33f90602001610f22565b5f5f6114b1610f2d565b90506114bd8184611ca6565b9392505050565b5f5f6114ce610f2d565b90506114bd81846118e0565b5f600160201b82106114ee576114ee611da2565b5090565b5f5f5f6115028860400151611a90565b61150b85611a90565b6115159088612d65565b61151f9190612da8565b92508760600151886080015111159050801561153d575f9150611651565b5f61154786611daf565b90505f5f6115548a611dce565b61155d84611dce565b1490508015611590578a604001518761157585611a4e565b61157f9190612dd4565b6115899190612deb565b91506115b5565b6115b28b60400151886115a286611a4e565b6115ac9190612dd4565b90611def565b91505b6115be83611dce565b6115c783611a90565b6115d19190612d65565b94508a60400151878c5f01516115e79190612dd4565b6115f19190612deb565b8b518c90611600908390612dfe565b90525060408b015160208c0151611618908990612dd4565b6116229190612deb565b8b6020018181516116339190612dfe565b90525060408b01805188919061164a908390612dfe565b9052505050505b955095509592505050565b805161166790611e0e565b600780546001600160801b0319166001600160801b0392909216919091179055602081015161169590611e0e565b600780546001600160801b03928316600160801b02921691909117905550565b6116bf835f611e22565b156116e0578060015f8282546116d59190612e11565b909155506117559050565b65ffffffffffff1983165f908152602081905260409020548181101561173757604051637ec2996b60e01b815265ffffffffffff198516600482015260248101829052604481018390526064015b60405180910390fd5b65ffffffffffff1984165f9081526020819052604090209082900390555b61175f825f611e22565b1561177257600180548290039055611790565b65ffffffffffff1982165f9081526020819052604090208054820190555b6040805165ffffffffffff198086168252841660208201529081018290527f48eeac6987cc7ebd298919de8cefd9769858440e7adc718f7e9cbd31ccb5b82c9060600160405180910390a1505050565b63ffffffff8116600a118015906117ff5750610e1063ffffffff821611155b610750576040516354c2857360e11b815260040160405180910390fd5b5f6114bd61182a8385611e33565b611a90565b5f6001607f1b820160801c611842575090565b61184a611da2565b919050565b5f63ffffffff8516816118628685612e24565b60030b9050805f036118785787925050506118d7565b8181126118895784925050506118d7565b5f6118948284612e40565b89600f0b6118a29190612d65565b6118b083600f89900b612d65565b6118ba9190612d3e565b90506118c68382612da8565b90506118d18161182f565b93505050505b95945050505050565b5f5f6118eb84611e75565b90505f5f6118f885611a4e565b90505f8513156119395761190d816001612e11565b86511161192d57604051633582eca960e21b815260040160405180910390fd5b85518190039150611949565b8551611946908290612e11565b91505b602086015186515f91611966916119609087611ed1565b9061203c565b90505f61197d6119768587611ed1565b8390611e33565b9050838860c0015161198f9190612dd4565b6119a1670de0b6b3a764000083612dd4565b10156119c057604051633582eca960e21b815260040160405180910390fd5b838860e001516119d09190612dd4565b6119e2670de0b6b3a764000083612dd4565b1115611a0157604051633582eca960e21b815260040160405180910390fd5b5f611a0f8960200151611a90565b611a1883611a90565b611a229190612e40565b858a5260208a018390529050611a41611a3a87611a90565b829061206b565b9998505050505050505050565b60ff81901d9081011890565b8181028181048314611a79578115611a795763bac65e5b5f526004601cfd5b670de0b6b3a7640000808206151591040192915050565b5f5f8212611842575090565b5f80611aac846305f5e100612095565b9150611abc836305f5e1006120b1565b90509250929050565b606086015160808701515f91829111801590611af457604051635f2a407b60e01b815260040160405180910390fd5b5f8713611b0357611b03612e5f565b5f611b0d87611daf565b9050611b1885611dce565b611b2182611dce565b14611b3f5760405163c510544560e01b815260040160405180910390fd5b805f03611b735787611b5087611a90565b8b60400151611b5f9190612dd4565b611b699190612deb565b9250859350611c1e565b5f611b7d82611a4e565b90505f611b8987611a4e565b90505f611b958c611dce565b611b9e85611dce565b1490508015611bc95782828e60400151611bb89190612dd4565b611bc29190612deb565b9550611be0565b611bdd83838f604001516115ac9190612dd4565b95505b611bf761182a8e60400151888e6115ac9190612dd4565b965088871315611c1a5760405163580ca8fd60e01b815260040160405180910390fd5b5050505b60408a01518a51611c30908590612dd4565b611c3a9190612deb565b8a518b90611c49908390612e11565b90525060408a015160208b0151611c61908590612dd4565b611c6b9190612deb565b8a602001818151611c7c9190612e11565b90525060408a018051849190611c93908390612e11565b9052509299919850909650505050505050565b5f611cb183836120cd565b91505f611cc5845f0151856020015161181c565b9050600a611cdb611cd68386612e40565b611a4e565b1080611cf05750610100840151606085015110155b15611cfe575f915050610d6d565b5f611d0884611a90565b90505f611d1486611e75565b90505f611d29670de0b6b3a764000083612e11565b602088015188519192505f91611d3f9085611ed1565b611d499190612dd4565b90505f611d826002611d76611d66670de0b6b3a764000087611e33565b611d708987612deb565b90611ed1565b90808218908210021890565b9050611d8d81611a90565b8951611d9890611a90565b611a419190612e40565b6335278d125f526004601cfd5b5f6103e8611dbc83611a4e565b10611dc75781610d6d565b5f92915050565b5f5f821315611ddf57506001919050565b5f821215611dc757505f19919050565b5f81611e02576365244e4e5f526004601cfd5b50808206151591040190565b5f600160801b82106114ee576114ee611da2565b65ffffffffffff1990811691161490565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f2283108202611e6357637c5f487d5f526004601cfd5b50670de0b6b3a7640000919091020490565b61010081015160608201515f9111611ea05760405163c32bc49360e01b815260040160405180910390fd5b610d6d8260a001518360800151611eb79190612dfe565b83606001518460800151611ecb9190612dfe565b90611e33565b5f815f03611ee85750670de0b6b3a7640000610d6d565b825f03611ef657505f610d6d565b600160ff1b8310611f1a57604051637304657960e01b815260040160405180910390fd5b82770bce5086492111aea88f4bb1ca6bcf584181ea8059f765328310611f5357604051637304657960e01b815260040160405180910390fd5b825f670c7d713b49da000083138015611f735750670f43fc2c04ee000083125b15611fa9575f611f8284612116565b9050670de0b6b3a764000080820784020583670de0b6b3a764000083050201915050611fb7565b81611fb384612233565b0290505b670de0b6b3a76400009005680238fd42c5cf03ffff198112801590611fe5575068070c1cc73b00c800008113155b6120295760405162461bcd60e51b815260206004820152601560248201527470726f64756374206f7574206f6620626f756e647360581b604482015260640161172e565b612032816125d1565b9695505050505050565b5f815f190483111561205b57811561205b5763bac65e5b5f526004601cfd5b50670de0b6b3a764000091020490565b670de0b6b3a76400008281029081058314820261208f57635c43740d5f526004601cfd5b05919050565b5f6114bd836120ac84670de0b6b3a7640000612e11565b611a5a565b5f6114bd836120c884670de0b6b3a7640000612dfe565b61203c565b5f5f5f6120e28560c001518660e00151611a9c565b915091506118d76120f282611a90565b61210a6120fe85611a90565b80881290881802871890565b90808218908213021890565b670de0b6b3a7640000025f806a0c097ce7bc90715b34b9f160241b808401906ec097ce7bc90715b34b9f0fffffffff198501028161215657612156612d94565b0590505f6a0c097ce7bc90715b34b9f160241b82800205905081806a0c097ce7bc90715b34b9f160241b81840205915060038205016a0c097ce7bc90715b34b9f160241b82840205915060058205016a0c097ce7bc90715b34b9f160241b82840205915060078205016a0c097ce7bc90715b34b9f160241b82840205915060098205016a0c097ce7bc90715b34b9f160241b828402059150600b8205016a0c097ce7bc90715b34b9f160241b828402059150600d8205016a0c097ce7bc90715b34b9f160241b828402059150600f82050160020295945050505050565b5f670de0b6b3a76400008212156122725761226a826a0c097ce7bc90715b34b9f160241b8161226457612264612d94565b05612233565b5f0392915050565b5f775803bcc5cb9634ba4cfb2213f784019318ed4dcb6017880f60361b83126122bc5772195e54c5dd42177f53a27172fa9ec63026282760241b830592506806f05b59d3b2000000015b6f8bcc0026baae9e45e470190267a230cf60191b83126122f3576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff0084000831261233b576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312612376576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf85083126123ad57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e283126123e457690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d0383126124195768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb41746121110831261244457680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312612479576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f177578893793783126124ae576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b28660383126124e2576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312612516576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b5f68056bc75e2d63100000840168056bc75e2d63100000808603028161253e5761253e612d94565b0590505f68056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b5f680238fd42c5cf03ffff1982121580156125f5575068070c1cc73b00c800008213155b6126125760405163739a565d60e11b815260040160405180910390fd5b5f82121561264857612625825f036125d1565b6a0c097ce7bc90715b34b9f160241b8161264157612641612d94565b0592915050565b5f6806f05b59d3b2000000831261268557506806f05b59d3b1ffffff199091019072195e54c5dd42177f53a27172fa9ec63026282760241b6126bb565b6803782dace9d900000083126126b757506803782dace9d8ffffff19909101906b1425982cf597cd205cef73806126bb565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac62000000841261270b5768ad78ebc5ac61ffffff199093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412612747576856bc75e2d630ffffff199093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b18800000841261278157682b5e3af16b187fffff199093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c40000084126127bb576815af1d78b58c3fffff199093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac620000084126127f457680ad78ebc5ac61fffff199093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d63100000841261282d5768056bc75e2d630fffff199093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b18800008412612866576802b5e3af16b187ffff199093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261289f5768015af1d78b58c3ffff199093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6040518061012001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b803565ffffffffffff198116811461184a575f5ffd5b5f5f5f5f60808587031215612a61575f5ffd5b612a6a85612a38565b966020860135965060408601359560600135945092505050565b65ffffffffffff1991909116815260200190565b63ffffffff81168114610750575f5ffd5b5f60208284031215612ab9575f5ffd5b81356114bd81612a98565b5f60208284031215612ad4575f5ffd5b5035919050565b6001600160401b0391909116815260200190565b5f60208284031215612aff575f5ffd5b81356001600160401b03811681146114bd575f5ffd5b5f60208284031215612b25575f5ffd5b6114bd82612a38565b80356001600160801b038116811461184a575f5ffd5b5f5f5f60608486031215612b56575f5ffd5b612b5f84612b2e565b9250612b6d60208501612b2e565b91506040840135612b7d81612a98565b809150509250925092565b5f5f5f5f5f60a08688031215612b9c575f5ffd5b612ba586612a38565b97602087013597506040870135966060810135965060800135945092505050565b6001600160801b038b811682528a8116602083015263ffffffff8a8116604084015289811660608401526001600160401b038916608084015260a0830188905286821660c084015290851660e083015283166101008201526101408101612c33610120830184600f0b9052565b9b9a5050505050505050505050565b600181811c90821680612c5657607f821691505b6020821081036111c957634e487b7160e01b5f52602260045260245ffd5b9283526020830191909152604082015260600190565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215612cc7575f5ffd5b815180151581146114bd575f5ffd5b5f60208284031215612ce6575f5ffd5b81516114bd81612a98565b5f60208284031215612d01575f5ffd5b5051919050565b5f60208284031215612d18575f5ffd5b815162ffffff811681146114bd575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715612d5d57612d5d612d2a565b505092915050565b8082025f8212600160ff1b84141615612d8057612d80612d2a565b8181058314821517610d6d57610d6d612d2a565b634e487b7160e01b5f52601260045260245ffd5b5f82612db657612db6612d94565b600160ff1b82145f1984141615612dcf57612dcf612d2a565b500590565b8082028115828204841417610d6d57610d6d612d2a565b5f82612df957612df9612d94565b500490565b81810381811115610d6d57610d6d612d2a565b80820180821115610d6d57610d6d612d2a565b63ffffffff8281168282160390811115610d6d57610d6d612d2a565b8181035f831280158383131683831282161715610da757610da7612d2a565b634e487b7160e01b5f52600160045260245ffdfea2646970667358221220af551fad7c59b6d821b394ff827fd65fd1cfd094eb1ea3809437b473c0cbc48764736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
