{
  "_format": "hh-sol-artifact-1",
  "contractName": "SSG",
  "sourceName": "contracts/SSG.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "_lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "allowance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientAllowance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "needed",
          "type": "uint256"
        }
      ],
      "name": "ERC20InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidApprover",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "receiver",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidReceiver",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSender",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "ERC20InvalidSpender",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDelegate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidEndpointCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidLocalDecimals",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "options",
          "type": "bytes"
        }
      ],
      "name": "InvalidOptions",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LzTokenUnavailable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MaxSupplyExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "NoPeer",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        }
      ],
      "name": "NotEnoughNative",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "OnlyEndpoint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "sender",
          "type": "bytes32"
        }
      ],
      "name": "OnlyPeer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySelf",
      "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": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "name": "SimulationResult",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amountLD",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minAmountLD",
          "type": "uint256"
        }
      ],
      "name": "SlippageExceeded",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "EnforcedOptionSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "inspector",
          "type": "address"
        }
      ],
      "name": "MsgInspectorSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "srcEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "toAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "dstEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "fromAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountSentLD",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTSent",
      "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": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "name": "PeerSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "preCrimeAddress",
          "type": "address"
        }
      ],
      "name": "PreCrimeSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_SUPPLY",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEND",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEND_AND_CALL",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "origin",
          "type": "tuple"
        }
      ],
      "name": "allowInitializePath",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "approvalRequired",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "_msgType",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_extraOptions",
          "type": "bytes"
        }
      ],
      "name": "combineOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimalConversionRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "endpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointV2",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "msgType",
          "type": "uint16"
        }
      ],
      "name": "enforcedOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "enforcedOption",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "isComposeMsgSender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "isPeer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint32",
                  "name": "srcEid",
                  "type": "uint32"
                },
                {
                  "internalType": "bytes32",
                  "name": "sender",
                  "type": "bytes32"
                },
                {
                  "internalType": "uint64",
                  "name": "nonce",
                  "type": "uint64"
                }
              ],
              "internalType": "struct Origin",
              "name": "origin",
              "type": "tuple"
            },
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "receiver",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "executor",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "message",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct InboundPacket[]",
          "name": "_packets",
          "type": "tuple[]"
        }
      ],
      "name": "lzReceiveAndRevert",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceiveSimulate",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "msgInspector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "nextNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oApp",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oAppVersion",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "senderVersion",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "receiverVersion",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oftVersion",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        },
        {
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "peers",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "preCrime",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        }
      ],
      "name": "quoteOFT",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAmountLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTLimit",
          "name": "oftLimit",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "int256",
              "name": "feeAmountLD",
              "type": "int256"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            }
          ],
          "internalType": "struct OFTFeeDetail[]",
          "name": "oftFeeDetails",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "internalType": "bool",
          "name": "_payInLzToken",
          "type": "bool"
        }
      ],
      "name": "quoteSend",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "msgFee",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "_fee",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "_refundAddress",
          "type": "address"
        }
      ],
      "name": "send",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "nativeFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "lzTokenFee",
                  "type": "uint256"
                }
              ],
              "internalType": "struct MessagingFee",
              "name": "fee",
              "type": "tuple"
            }
          ],
          "internalType": "struct MessagingReceipt",
          "name": "msgReceipt",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "name": "setDelegate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "setEnforcedOptions",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_msgInspector",
          "type": "address"
        }
      ],
      "name": "setMsgInspector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "setPeer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_preCrime",
          "type": "address"
        }
      ],
      "name": "setPreCrime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sharedDecimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405234801561001057600080fd5b5060405161385638038061385683398101604081905261002f916102ab565b83838383838360128484818181818d6001600160a01b03811661006c57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61007581610181565b506001600160a01b0380831660805281166100a357604051632d618d8160e21b815260040160405180910390fd5b60805160405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b1580156100ea57600080fd5b505af11580156100fe573d6000803e3d6000fd5b50505050505050506101146101d160201b60201c565b60ff168360ff16101561013a576040516301e9714b60e41b815260040160405180910390fd5b61014560068461034b565b61015090600a610451565b60a0525060089150610164905083826104f0565b50600961017182826104f0565b50505050505050505050506105ae565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101fd57600080fd5b81516001600160401b03811115610216576102166101d6565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610244576102446101d6565b60405281815283820160200185101561025c57600080fd5b60005b8281101561027b5760208186018101518383018201520161025f565b506000918101602001919091529392505050565b80516001600160a01b03811681146102a657600080fd5b919050565b600080600080608085870312156102c157600080fd5b84516001600160401b038111156102d757600080fd5b6102e3878288016101ec565b602087015190955090506001600160401b0381111561030157600080fd5b61030d878288016101ec565b93505061031c6040860161028f565b915061032a6060860161028f565b905092959194509250565b634e487b7160e01b600052601160045260246000fd5b60ff828116828216039081111561036457610364610335565b92915050565b6001815b60018411156103a55780850481111561038957610389610335565b600184161561039757908102905b60019390931c92800261036e565b935093915050565b6000826103bc57506001610364565b816103c957506000610364565b81600181146103df57600281146103e957610405565b6001915050610364565b60ff8411156103fa576103fa610335565b50506001821b610364565b5060208310610133831016604e8410600b8410161715610428575081810a610364565b610435600019848461036a565b806000190482111561044957610449610335565b029392505050565b600061046060ff8416836103ad565b9392505050565b600181811c9082168061047b57607f821691505b60208210810361049b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156104eb57806000526020600020601f840160051c810160208510156104c85750805b601f840160051c820191505b818110156104e857600081556001016104d4565b50505b505050565b81516001600160401b03811115610509576105096101d6565b61051d816105178454610467565b846104a1565b6020601f82116001811461055157600083156105395750848201515b600019600385901b1c1916600184901b1784556104e8565b600084815260208120601f198516915b828110156105815787850151825560209485019460019092019101610561565b508482101561059f5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161323d6106196000396000818161067301528181611b7d01528181611bf20152611d4d01526000818161053201528181610aa201528181611143015281816113ba0152818161172501528181611e45015281816120d10152612188015261323d6000f3fe6080604052600436106102675760003560e01c8063715018a611610144578063bb0b6a53116100b6578063d045a0dc1161007a578063d045a0dc146107aa578063d4243885146107bd578063dd62ed3e146107dd578063f2fde38b14610823578063fc0c546a146104b6578063ff7bd03d1461084357600080fd5b8063bb0b6a5314610709578063bc70b35414610736578063bd815db014610756578063c7c7f5b314610769578063ca5eb5e11461078a57600080fd5b806395d89b411161010857806395d89b411461064c578063963efcaa146106615780639f68b96414610695578063a9059cbb146106a9578063b731ea0a146106c9578063b98bd070146106e957600080fd5b8063715018a6146105aa5780637d25a05e146105bf57806382413eac146105fa578063857749b01461061a5780638da5cb5b1461062e57600080fd5b8063313ce567116101dd57806352ae2879116101a157806352ae2879146104b65780635535d461146104c95780635a0dfe4d146104e95780635e280f11146105205780636fc1b31e1461055457806370a082311461057457600080fd5b8063313ce5671461040857806332cb6b0c1461042a5780633400288b146104495780633b6f743b1461046957806340c10f191461049657600080fd5b8063134d4f251161022f578063134d4f2514610343578063156a0d0f1461036b57806317442b701461039257806318160ddd146103b45780631f5e1334146103d357806323b872dd146103e857600080fd5b806306fdde031461026c578063095ea7b3146102975780630d35b415146102c7578063111ecdad146102f657806313137d651461032e575b600080fd5b34801561027857600080fd5b50610281610863565b60405161028e9190612300565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004612328565b6108f5565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e236600461236c565b61090f565b60405161028e939291906123a0565b34801561030257600080fd5b50600454610316906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b61034161033c366004612497565b610aa0565b005b34801561034f57600080fd5b50610358600281565b60405161ffff909116815260200161028e565b34801561037757600080fd5b506040805162b9270b60e21b8152600160208201520161028e565b34801561039e57600080fd5b506040805160018152600260208201520161028e565b3480156103c057600080fd5b506007545b60405190815260200161028e565b3480156103df57600080fd5b50610358600181565b3480156103f457600080fd5b506102b7610403366004612538565b610b60565b34801561041457600080fd5b5060125b60405160ff909116815260200161028e565b34801561043657600080fd5b506103c56a108b2a2c2802909400000081565b34801561045557600080fd5b50610341610464366004612592565b610b86565b34801561047557600080fd5b506104896104843660046125bc565b610b9c565b60405161028e919061260d565b3480156104a257600080fd5b506103416104b1366004612328565b610c03565b3480156104c257600080fd5b5030610316565b3480156104d557600080fd5b506102816104e4366004612636565b610c54565b3480156104f557600080fd5b506102b7610504366004612592565b63ffffffff919091166000908152600160205260409020541490565b34801561052c57600080fd5b506103167f000000000000000000000000000000000000000000000000000000000000000081565b34801561056057600080fd5b5061034161056f366004612669565b610cf9565b34801561058057600080fd5b506103c561058f366004612669565b6001600160a01b031660009081526005602052604090205490565b3480156105b657600080fd5b50610341610d56565b3480156105cb57600080fd5b506105e26105da366004612592565b600092915050565b6040516001600160401b03909116815260200161028e565b34801561060657600080fd5b506102b7610615366004612686565b610d6a565b34801561062657600080fd5b506006610418565b34801561063a57600080fd5b506000546001600160a01b0316610316565b34801561065857600080fd5b50610281610d7f565b34801561066d57600080fd5b506103c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a157600080fd5b5060006102b7565b3480156106b557600080fd5b506102b76106c4366004612328565b610d8e565b3480156106d557600080fd5b50600254610316906001600160a01b031681565b3480156106f557600080fd5b50610341610704366004612730565b610d9c565b34801561071557600080fd5b506103c5610724366004612771565b60016020526000908152604090205481565b34801561074257600080fd5b5061028161075136600461278c565b610db6565b610341610764366004612730565b610f5e565b61077c6107773660046127ec565b6110e8565b60405161028e929190612859565b34801561079657600080fd5b506103416107a5366004612669565b61111c565b6103416107b8366004612497565b6111a2565b3480156107c957600080fd5b506103416107d8366004612669565b6111d1565b3480156107e957600080fd5b506103c56107f83660046128ab565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561082f57600080fd5b5061034161083e366004612669565b611227565b34801561084f57600080fd5b506102b761085e3660046128d9565b611265565b606060088054610872906128f5565b80601f016020809104026020016040519081016040528092919081815260200182805461089e906128f5565b80156108eb5780601f106108c0576101008083540402835291602001916108eb565b820191906000526020600020905b8154815290600101906020018083116108ce57829003601f168201915b5050505050905090565b60003361090381858561129b565b60019150505b92915050565b60408051808201909152600080825260208201526060610942604051806040016040528060008152602001600081525090565b600080306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190612929565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190612946565b60408051808201825284815260208082018490528251600080825291810190935290975091925090610a5d565b604080518082019091526000815260606020820152815260200190600190039081610a355790505b509350600080610a82604089013560608a0135610a7d60208c018c612771565b6112ad565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610af0576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610b0a90610b05908a612771565b6112e9565b14610b4857610b1c6020880188612771565b60405163309afaf360e21b815263ffffffff909116600482015260208801356024820152604401610ae7565b610b5787878787878787611325565b50505050505050565b600033610b6e85828561148c565b610b7985858561150b565b60019150505b9392505050565b610b8e61156a565b610b988282611597565b5050565b60408051808201909152600080825260208201526000610bcc60408501356060860135610a7d6020880188612771565b915050600080610bdc86846115ec565b9092509050610bf9610bf16020880188612771565b83838861170f565b9695505050505050565b610c0b61156a565b6a108b2a2c2802909400000081610c2160075490565b610c2b919061298b565b1115610c4a57604051638a164f6360e01b815260040160405180910390fd5b610b9882826117f0565b600360209081526000928352604080842090915290825290208054610c78906128f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca4906128f5565b8015610cf15780601f10610cc657610100808354040283529160200191610cf1565b820191906000526020600020905b815481529060010190602001808311610cd457829003601f168201915b505050505081565b610d0161156a565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d5e61156a565b610d686000611826565b565b6001600160a01b03811630145b949350505050565b606060098054610872906128f5565b60003361090381858561150b565b610da461156a565b610b98610db18284612a3f565b611876565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610dea906128f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e16906128f5565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b505050505090508051600003610eb35783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610d779350505050565b6000839003610ec3579050610d77565b60028310610f4157610f0a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b80610f188460028188612b68565b604051602001610f2a93929190612b92565b604051602081830303815290604052915050610d77565b8383604051639a6d49cd60e01b8152600401610ae7929190612be3565b60005b818110156110675736838383818110610f7c57610f7c612bf7565b9050602002810190610f8e9190612c0d565b9050610fc1610fa06020830183612771565b602083013563ffffffff919091166000908152600160205260409020541490565b610fcb575061105f565b3063d045a0dc60c08301358360a0810135610fea610100830183612c2e565b610ffb610100890160e08a01612669565b6110096101208a018a612c2e565b6040518963ffffffff1660e01b815260040161102b9796959493929190612c89565b6000604051808303818588803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b5050505050505b600101610f61565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ce9190810190612d0f565b604051638351eea760e01b8152600401610ae79190612300565b6110f0612269565b604080518082019091526000808252602082015261110f8585856119a9565b915091505b935093915050565b61112461156a565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b15801561118757600080fd5b505af115801561119b573d6000803e3d6000fd5b5050505050565b3330146111c25760405163029a949d60e31b815260040160405180910390fd5b610b5787878787878787610b48565b6111d961156a565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d4b565b61122f61156a565b6001600160a01b03811661125957604051631e4fbdf760e01b815260006004820152602401610ae7565b61126281611826565b50565b600060208201803590600190839061127d9086612771565b63ffffffff1681526020810191909152604001600020541492915050565b6112a88383836001611aa4565b505050565b6000806112b985611b79565b915081905083811015611114576040516371c4efed60e01b81526004810182905260248101859052604401610ae7565b63ffffffff8116600090815260016020526040812054806109095760405163f6ff4fb760e01b815263ffffffff84166004820152602401610ae7565b60006113376113348787611bb0565b90565b905060006113638261135161134c8a8a611bc8565b611beb565b61135e60208d018d612771565b611c20565b9050602886111561142a5760006113a061138360608c0160408d01612d7c565b61139060208d018d612771565b8461139b8c8c611c6c565b611cb7565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906113f69086908d906000908790600401612d99565b600060405180830381600087803b15801561141057600080fd5b505af1158015611424573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61146360208d018d612771565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b6001600160a01b0383811660009081526006602090815260408083209386168352929052205460001981101561150557818110156114f657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610ae7565b61150584848484036000611aa4565b50505050565b6001600160a01b03831661153557604051634b637e8f60e11b815260006004820152602401610ae7565b6001600160a01b03821661155f5760405163ec442f0560e01b815260006004820152602401610ae7565b6112a8838383611ce9565b6000546001600160a01b03163314610d685760405163118cdaa760e01b8152336004820152602401610ae7565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b910160405180910390a15050565b6060806000611649856020013561160286611d46565b61160f60a0890189612c2e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d7292505050565b909350905060008161165c57600161165f565b60025b905061167f6116716020880188612771565b8261075160808a018a612c2e565b6004549093506001600160a01b031680156117055760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906116c29088908890600401612dca565b602060405180830381865afa1580156116df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117039190612def565b505b5050509250929050565b60408051808201909152600080825260208201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611772896112e9565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016117a7929190612e0c565b6040805180830381865afa1580156117c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e79190612eb6565b95945050505050565b6001600160a01b03821661181a5760405163ec442f0560e01b815260006004820152602401610ae7565b610b9860008383611ce9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b815181101561194d576118a882828151811061189757611897612bf7565b60200260200101516040015161197d565b8181815181106118ba576118ba612bf7565b602002602001015160400151600360008484815181106118dc576118dc612bf7565b60200260200101516000015163ffffffff1663ffffffff168152602001908152602001600020600084848151811061191657611916612bf7565b60200260200101516020015161ffff1661ffff16815260200190815260200160002090816119449190612f19565b50600101611879565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610d4b9190612fd7565b600281015161ffff8116600314610b985781604051639a6d49cd60e01b8152600401610ae79190612300565b6119b1612269565b60408051808201909152600080825260208201526000806119e833604089013560608a01356119e360208c018c612771565b611dec565b915091506000806119f989846115ec565b9092509050611a25611a0e60208b018b612771565b8383611a1f368d90038d018d613067565b8b611e12565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611a73908d018d612771565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b038416611ace5760405163e602df0560e01b815260006004820152602401610ae7565b6001600160a01b038316611af857604051634a1406b160e11b815260006004820152602401610ae7565b6001600160a01b038085166000908152600660209081526040808320938716835292905220829055801561150557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b6b91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000611ba6818461309a565b61090991906130bc565b6000611bbf6020828486612b68565b610b7f916130d3565b6000611bd8602860208486612b68565b611be1916130f1565b60c01c9392505050565b60006109097f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166130bc565b60006a108b2a2c2802909400000083611c3860075490565b611c42919061298b565b1115611c6157604051638a164f6360e01b815260040160405180910390fd5b610d77848484611f1d565b6060611c7b8260288186612b68565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001611cd09493929190613129565b6040516020818303038152906040529050949350505050565b6001600160a01b038316158015611d1d57506a108b2a2c2802909400000081611d1160075490565b611d1b919061298b565b115b15611d3b57604051638a164f6360e01b815260040160405180910390fd5b6112a8838383611f45565b60006109097f00000000000000000000000000000000000000000000000000000000000000008361309a565b8051606090151580611dbb578484604051602001611da792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611de2565b84843385604051602001611dd29493929190613178565b6040516020818303038152906040525b9150935093915050565b600080611dfa8585856112ad565b9092509050611e09868361206f565b94509492505050565b611e1a612269565b6000611e2984600001516120a5565b602085015190915015611e4357611e4384602001516120cd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611e938c6112e9565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611ecf929190612e0c565b60806040518083038185885af1158015611eed573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f1291906131bb565b979650505050505050565b60006001600160a01b038416611f335761dead93505b611f3d84846117f0565b509092915050565b6001600160a01b038316611f70578060076000828254611f65919061298b565b90915550611fe29050565b6001600160a01b03831660009081526005602052604090205481811015611fc35760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610ae7565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b038216611ffe5760078054829003905561201d565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161206291815260200190565b60405180910390a3505050565b6001600160a01b03821661209957604051634b637e8f60e11b815260006004820152602401610ae7565b610b9882600083611ce9565b60008134146120c9576040516304fb820960e51b8152346004820152602401610ae7565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190612929565b90506001600160a01b03811661217a576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610b9896881695899361150593889360009283929091839182885af18061221b576040513d6000823e3d81fd5b50506000513d91508115612233578060011415612240565b6001600160a01b0384163b155b1561150557604051635274afe760e01b81526001600160a01b0385166004820152602401610ae7565b60405180606001604052806000801916815260200160006001600160401b031681526020016122ab604051806040016040528060008152602001600081525090565b905290565b60005b838110156122cb5781810151838201526020016122b3565b50506000910152565b600081518084526122ec8160208601602086016122b0565b601f01601f19169290920160200192915050565b602081526000610b7f60208301846122d4565b6001600160a01b038116811461126257600080fd5b6000806040838503121561233b57600080fd5b823561234681612313565b946020939093013593505050565b600060e0828403121561236657600080fd5b50919050565b60006020828403121561237e57600080fd5b81356001600160401b0381111561239457600080fd5b610d7784828501612354565b8351815260208085015190820152600060a0820160a0604084015280855180835260c08501915060c08160051b86010192506020870160005b828110156124215760bf19878603018452815180518652602081015190506040602087015261240b60408701826122d4565b95505060209384019391909101906001016123d9565b5050855160608601525050602084015160808401529050610d77565b60006060828403121561236657600080fd5b60008083601f84011261246157600080fd5b5081356001600160401b0381111561247857600080fd5b60208301915083602082850101111561249057600080fd5b9250929050565b600080600080600080600060e0888a0312156124b257600080fd5b6124bc898961243d565b96506060880135955060808801356001600160401b038111156124de57600080fd5b6124ea8a828b0161244f565b90965094505060a08801356124fe81612313565b925060c08801356001600160401b0381111561251957600080fd5b6125258a828b0161244f565b989b979a50959850939692959293505050565b60008060006060848603121561254d57600080fd5b833561255881612313565b9250602084013561256881612313565b929592945050506040919091013590565b803563ffffffff8116811461258d57600080fd5b919050565b600080604083850312156125a557600080fd5b61234683612579565b801515811461126257600080fd5b600080604083850312156125cf57600080fd5b82356001600160401b038111156125e557600080fd5b6125f185828601612354565b9250506020830135612602816125ae565b809150509250929050565b815181526020808301519082015260408101610909565b803561ffff8116811461258d57600080fd5b6000806040838503121561264957600080fd5b61265283612579565b915061266060208401612624565b90509250929050565b60006020828403121561267b57600080fd5b8135610b7f81612313565b60008060008060a0858703121561269c57600080fd5b6126a6868661243d565b935060608501356001600160401b038111156126c157600080fd5b6126cd8782880161244f565b90945092505060808501356126e181612313565b939692955090935050565b60008083601f8401126126fe57600080fd5b5081356001600160401b0381111561271557600080fd5b6020830191508360208260051b850101111561249057600080fd5b6000806020838503121561274357600080fd5b82356001600160401b0381111561275957600080fd5b612765858286016126ec565b90969095509350505050565b60006020828403121561278357600080fd5b610b7f82612579565b600080600080606085870312156127a257600080fd5b6127ab85612579565b93506127b960208601612624565b925060408501356001600160401b038111156127d457600080fd5b6127e08782880161244f565b95989497509550505050565b6000806000838503608081121561280257600080fd5b84356001600160401b0381111561281857600080fd5b61282487828801612354565b9450506040601f198201121561283957600080fd5b50602084019150606084013561284e81612313565b809150509250925092565b600060c082019050835182526001600160401b0360208501511660208301526040840151612894604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b7f565b600080604083850312156128be57600080fd5b82356128c981612313565b9150602083013561260281612313565b6000606082840312156128eb57600080fd5b610b7f838361243d565b600181811c9082168061290957607f821691505b60208210810361236657634e487b7160e01b600052602260045260246000fd5b60006020828403121561293b57600080fd5b8151610b7f81612313565b60006020828403121561295857600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561090957610909612975565b604051606081016001600160401b03811182821017156129c0576129c061295f565b60405290565b604080519081016001600160401b03811182821017156129c0576129c061295f565b604051601f8201601f191681016001600160401b0381118282101715612a1057612a1061295f565b604052919050565b60006001600160401b03821115612a3157612a3161295f565b50601f01601f191660200190565b60006001600160401b03831115612a5857612a5861295f565b8260051b612a68602082016129e8565b84815290830190602081019036831115612a8157600080fd5b845b83811015612b5e5780356001600160401b03811115612aa157600080fd5b86016060368290031215612ab457600080fd5b612abc61299e565b612ac582612579565b8152612ad360208301612624565b602082015260408201356001600160401b03811115612af157600080fd5b919091019036601f830112612b0557600080fd5b8135612b18612b1382612a18565b6129e8565b818152366020838601011115612b2d57600080fd5b8160208501602083013760006020838301015280604084015250508085525050602083019250602081019050612a83565b5095945050505050565b60008085851115612b7857600080fd5b83861115612b8557600080fd5b5050820193919092039150565b60008451612ba48184602089016122b0565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610d77602083018486612bba565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112612c2457600080fd5b9190910192915050565b6000808335601e19843603018112612c4557600080fd5b8301803591506001600160401b03821115612c5f57600080fd5b60200191503681900382131561249057600080fd5b6001600160401b038116811461126257600080fd5b63ffffffff612c9789612579565b1681526020888101359082015260006040890135612cb481612c74565b6001600160401b03811660408401525087606083015260e06080830152612cdf60e083018789612bba565b6001600160a01b03861660a084015282810360c0840152612d01818587612bba565b9a9950505050505050505050565b600060208284031215612d2157600080fd5b81516001600160401b03811115612d3757600080fd5b8201601f81018413612d4857600080fd5b8051612d56612b1382612a18565b818152856020838501011115612d6b57600080fd5b6117e78260208301602086016122b0565b600060208284031215612d8e57600080fd5b8135610b7f81612c74565b60018060a01b038516815283602082015261ffff83166040820152608060608201526000610bf960808301846122d4565b604081526000612ddd60408301856122d4565b82810360208401526117e781856122d4565b600060208284031215612e0157600080fd5b8151610b7f816125ae565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152612e4260e08401826122d4565b90506060850151603f198483030160a0850152612e5f82826122d4565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215612e9757600080fd5b612e9f6129c6565b825181526020928301519281019290925250919050565b600060408284031215612ec857600080fd5b610b7f8383612e85565b601f8211156112a857806000526020600020601f840160051c81016020851015612ef95750805b601f840160051c820191505b8181101561119b5760008155600101612f05565b81516001600160401b03811115612f3257612f3261295f565b612f4681612f4084546128f5565b84612ed2565b6020601f821160018114612f7a5760008315612f625750848201515b600019600385901b1c1916600184901b17845561119b565b600084815260208120601f198516915b82811015612faa5787850151825560209485019460019092019101612f8a565b5084821015612fc85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561305b57603f19878603018452815163ffffffff815116865261ffff6020820151166020870152604081015190506060604087015261304560608701826122d4565b9550506020938401939190910190600101612fff565b50929695505050505050565b6000604082840312801561307a57600080fd5b506130836129c6565b823581526020928301359281019290925250919050565b6000826130b757634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761090957610909612975565b8035602083101561090957600019602084900360031b1b1692915050565b80356001600160c01b03198116906008841015613122576001600160c01b0319600885900360031b81901b82161691505b5092915050565b6001600160401b0360c01b8560c01b16815263ffffffff60e01b8460e01b16600882015282600c8201526000825161316881602c8501602087016122b0565b91909101602c0195945050505050565b8481526001600160401b0360c01b8460c01b166020820152826028820152600082516131ab8160488501602087016122b0565b9190910160480195945050505050565b600060808284031280156131ce57600080fd5b506131d761299e565b8251815260208301516131e981612c74565b60208201526131fb8460408501612e85565b6040820152939250505056fea2646970667358221220c68cc336aa6c3f40258b0c3ad54353a64779235c6fca359dddc5bbeab4a6242e64736f6c634300081c0033",
  "deployedBytecode": "0x6080604052600436106102675760003560e01c8063715018a611610144578063bb0b6a53116100b6578063d045a0dc1161007a578063d045a0dc146107aa578063d4243885146107bd578063dd62ed3e146107dd578063f2fde38b14610823578063fc0c546a146104b6578063ff7bd03d1461084357600080fd5b8063bb0b6a5314610709578063bc70b35414610736578063bd815db014610756578063c7c7f5b314610769578063ca5eb5e11461078a57600080fd5b806395d89b411161010857806395d89b411461064c578063963efcaa146106615780639f68b96414610695578063a9059cbb146106a9578063b731ea0a146106c9578063b98bd070146106e957600080fd5b8063715018a6146105aa5780637d25a05e146105bf57806382413eac146105fa578063857749b01461061a5780638da5cb5b1461062e57600080fd5b8063313ce567116101dd57806352ae2879116101a157806352ae2879146104b65780635535d461146104c95780635a0dfe4d146104e95780635e280f11146105205780636fc1b31e1461055457806370a082311461057457600080fd5b8063313ce5671461040857806332cb6b0c1461042a5780633400288b146104495780633b6f743b1461046957806340c10f191461049657600080fd5b8063134d4f251161022f578063134d4f2514610343578063156a0d0f1461036b57806317442b701461039257806318160ddd146103b45780631f5e1334146103d357806323b872dd146103e857600080fd5b806306fdde031461026c578063095ea7b3146102975780630d35b415146102c7578063111ecdad146102f657806313137d651461032e575b600080fd5b34801561027857600080fd5b50610281610863565b60405161028e9190612300565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004612328565b6108f5565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e236600461236c565b61090f565b60405161028e939291906123a0565b34801561030257600080fd5b50600454610316906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b61034161033c366004612497565b610aa0565b005b34801561034f57600080fd5b50610358600281565b60405161ffff909116815260200161028e565b34801561037757600080fd5b506040805162b9270b60e21b8152600160208201520161028e565b34801561039e57600080fd5b506040805160018152600260208201520161028e565b3480156103c057600080fd5b506007545b60405190815260200161028e565b3480156103df57600080fd5b50610358600181565b3480156103f457600080fd5b506102b7610403366004612538565b610b60565b34801561041457600080fd5b5060125b60405160ff909116815260200161028e565b34801561043657600080fd5b506103c56a108b2a2c2802909400000081565b34801561045557600080fd5b50610341610464366004612592565b610b86565b34801561047557600080fd5b506104896104843660046125bc565b610b9c565b60405161028e919061260d565b3480156104a257600080fd5b506103416104b1366004612328565b610c03565b3480156104c257600080fd5b5030610316565b3480156104d557600080fd5b506102816104e4366004612636565b610c54565b3480156104f557600080fd5b506102b7610504366004612592565b63ffffffff919091166000908152600160205260409020541490565b34801561052c57600080fd5b506103167f000000000000000000000000000000000000000000000000000000000000000081565b34801561056057600080fd5b5061034161056f366004612669565b610cf9565b34801561058057600080fd5b506103c561058f366004612669565b6001600160a01b031660009081526005602052604090205490565b3480156105b657600080fd5b50610341610d56565b3480156105cb57600080fd5b506105e26105da366004612592565b600092915050565b6040516001600160401b03909116815260200161028e565b34801561060657600080fd5b506102b7610615366004612686565b610d6a565b34801561062657600080fd5b506006610418565b34801561063a57600080fd5b506000546001600160a01b0316610316565b34801561065857600080fd5b50610281610d7f565b34801561066d57600080fd5b506103c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a157600080fd5b5060006102b7565b3480156106b557600080fd5b506102b76106c4366004612328565b610d8e565b3480156106d557600080fd5b50600254610316906001600160a01b031681565b3480156106f557600080fd5b50610341610704366004612730565b610d9c565b34801561071557600080fd5b506103c5610724366004612771565b60016020526000908152604090205481565b34801561074257600080fd5b5061028161075136600461278c565b610db6565b610341610764366004612730565b610f5e565b61077c6107773660046127ec565b6110e8565b60405161028e929190612859565b34801561079657600080fd5b506103416107a5366004612669565b61111c565b6103416107b8366004612497565b6111a2565b3480156107c957600080fd5b506103416107d8366004612669565b6111d1565b3480156107e957600080fd5b506103c56107f83660046128ab565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561082f57600080fd5b5061034161083e366004612669565b611227565b34801561084f57600080fd5b506102b761085e3660046128d9565b611265565b606060088054610872906128f5565b80601f016020809104026020016040519081016040528092919081815260200182805461089e906128f5565b80156108eb5780601f106108c0576101008083540402835291602001916108eb565b820191906000526020600020905b8154815290600101906020018083116108ce57829003601f168201915b5050505050905090565b60003361090381858561129b565b60019150505b92915050565b60408051808201909152600080825260208201526060610942604051806040016040528060008152602001600081525090565b600080306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190612929565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190612946565b60408051808201825284815260208082018490528251600080825291810190935290975091925090610a5d565b604080518082019091526000815260606020820152815260200190600190039081610a355790505b509350600080610a82604089013560608a0135610a7d60208c018c612771565b6112ad565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610af0576040516391ac5e4f60e01b81523360048201526024015b60405180910390fd5b60208701803590610b0a90610b05908a612771565b6112e9565b14610b4857610b1c6020880188612771565b60405163309afaf360e21b815263ffffffff909116600482015260208801356024820152604401610ae7565b610b5787878787878787611325565b50505050505050565b600033610b6e85828561148c565b610b7985858561150b565b60019150505b9392505050565b610b8e61156a565b610b988282611597565b5050565b60408051808201909152600080825260208201526000610bcc60408501356060860135610a7d6020880188612771565b915050600080610bdc86846115ec565b9092509050610bf9610bf16020880188612771565b83838861170f565b9695505050505050565b610c0b61156a565b6a108b2a2c2802909400000081610c2160075490565b610c2b919061298b565b1115610c4a57604051638a164f6360e01b815260040160405180910390fd5b610b9882826117f0565b600360209081526000928352604080842090915290825290208054610c78906128f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca4906128f5565b8015610cf15780601f10610cc657610100808354040283529160200191610cf1565b820191906000526020600020905b815481529060010190602001808311610cd457829003601f168201915b505050505081565b610d0161156a565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d5e61156a565b610d686000611826565b565b6001600160a01b03811630145b949350505050565b606060098054610872906128f5565b60003361090381858561150b565b610da461156a565b610b98610db18284612a3f565b611876565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610dea906128f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e16906128f5565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b505050505090508051600003610eb35783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610d779350505050565b6000839003610ec3579050610d77565b60028310610f4157610f0a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b80610f188460028188612b68565b604051602001610f2a93929190612b92565b604051602081830303815290604052915050610d77565b8383604051639a6d49cd60e01b8152600401610ae7929190612be3565b60005b818110156110675736838383818110610f7c57610f7c612bf7565b9050602002810190610f8e9190612c0d565b9050610fc1610fa06020830183612771565b602083013563ffffffff919091166000908152600160205260409020541490565b610fcb575061105f565b3063d045a0dc60c08301358360a0810135610fea610100830183612c2e565b610ffb610100890160e08a01612669565b6110096101208a018a612c2e565b6040518963ffffffff1660e01b815260040161102b9796959493929190612c89565b6000604051808303818588803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b5050505050505b600101610f61565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156110a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ce9190810190612d0f565b604051638351eea760e01b8152600401610ae79190612300565b6110f0612269565b604080518082019091526000808252602082015261110f8585856119a9565b915091505b935093915050565b61112461156a565b60405163ca5eb5e160e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b15801561118757600080fd5b505af115801561119b573d6000803e3d6000fd5b5050505050565b3330146111c25760405163029a949d60e31b815260040160405180910390fd5b610b5787878787878787610b48565b6111d961156a565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d4b565b61122f61156a565b6001600160a01b03811661125957604051631e4fbdf760e01b815260006004820152602401610ae7565b61126281611826565b50565b600060208201803590600190839061127d9086612771565b63ffffffff1681526020810191909152604001600020541492915050565b6112a88383836001611aa4565b505050565b6000806112b985611b79565b915081905083811015611114576040516371c4efed60e01b81526004810182905260248101859052604401610ae7565b63ffffffff8116600090815260016020526040812054806109095760405163f6ff4fb760e01b815263ffffffff84166004820152602401610ae7565b60006113376113348787611bb0565b90565b905060006113638261135161134c8a8a611bc8565b611beb565b61135e60208d018d612771565b611c20565b9050602886111561142a5760006113a061138360608c0160408d01612d7c565b61139060208d018d612771565b8461139b8c8c611c6c565b611cb7565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906113f69086908d906000908790600401612d99565b600060405180830381600087803b15801561141057600080fd5b505af1158015611424573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61146360208d018d612771565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b6001600160a01b0383811660009081526006602090815260408083209386168352929052205460001981101561150557818110156114f657604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610ae7565b61150584848484036000611aa4565b50505050565b6001600160a01b03831661153557604051634b637e8f60e11b815260006004820152602401610ae7565b6001600160a01b03821661155f5760405163ec442f0560e01b815260006004820152602401610ae7565b6112a8838383611ce9565b6000546001600160a01b03163314610d685760405163118cdaa760e01b8152336004820152602401610ae7565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b910160405180910390a15050565b6060806000611649856020013561160286611d46565b61160f60a0890189612c2e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d7292505050565b909350905060008161165c57600161165f565b60025b905061167f6116716020880188612771565b8261075160808a018a612c2e565b6004549093506001600160a01b031680156117055760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906116c29088908890600401612dca565b602060405180830381865afa1580156116df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117039190612def565b505b5050509250929050565b60408051808201909152600080825260208201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611772896112e9565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b81526004016117a7929190612e0c565b6040805180830381865afa1580156117c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e79190612eb6565b95945050505050565b6001600160a01b03821661181a5760405163ec442f0560e01b815260006004820152602401610ae7565b610b9860008383611ce9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b815181101561194d576118a882828151811061189757611897612bf7565b60200260200101516040015161197d565b8181815181106118ba576118ba612bf7565b602002602001015160400151600360008484815181106118dc576118dc612bf7565b60200260200101516000015163ffffffff1663ffffffff168152602001908152602001600020600084848151811061191657611916612bf7565b60200260200101516020015161ffff1661ffff16815260200190815260200160002090816119449190612f19565b50600101611879565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67481604051610d4b9190612fd7565b600281015161ffff8116600314610b985781604051639a6d49cd60e01b8152600401610ae79190612300565b6119b1612269565b60408051808201909152600080825260208201526000806119e833604089013560608a01356119e360208c018c612771565b611dec565b915091506000806119f989846115ec565b9092509050611a25611a0e60208b018b612771565b8383611a1f368d90038d018d613067565b8b611e12565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a90611a73908d018d612771565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6001600160a01b038416611ace5760405163e602df0560e01b815260006004820152602401610ae7565b6001600160a01b038316611af857604051634a1406b160e11b815260006004820152602401610ae7565b6001600160a01b038085166000908152600660209081526040808320938716835292905220829055801561150557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611b6b91815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000611ba6818461309a565b61090991906130bc565b6000611bbf6020828486612b68565b610b7f916130d3565b6000611bd8602860208486612b68565b611be1916130f1565b60c01c9392505050565b60006109097f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166130bc565b60006a108b2a2c2802909400000083611c3860075490565b611c42919061298b565b1115611c6157604051638a164f6360e01b815260040160405180910390fd5b610d77848484611f1d565b6060611c7b8260288186612b68565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001611cd09493929190613129565b6040516020818303038152906040529050949350505050565b6001600160a01b038316158015611d1d57506a108b2a2c2802909400000081611d1160075490565b611d1b919061298b565b115b15611d3b57604051638a164f6360e01b815260040160405180910390fd5b6112a8838383611f45565b60006109097f00000000000000000000000000000000000000000000000000000000000000008361309a565b8051606090151580611dbb578484604051602001611da792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611de2565b84843385604051602001611dd29493929190613178565b6040516020818303038152906040525b9150935093915050565b600080611dfa8585856112ad565b9092509050611e09868361206f565b94509492505050565b611e1a612269565b6000611e2984600001516120a5565b602085015190915015611e4357611e4384602001516120cd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff168152602001611e938c6112e9565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611ecf929190612e0c565b60806040518083038185885af1158015611eed573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f1291906131bb565b979650505050505050565b60006001600160a01b038416611f335761dead93505b611f3d84846117f0565b509092915050565b6001600160a01b038316611f70578060076000828254611f65919061298b565b90915550611fe29050565b6001600160a01b03831660009081526005602052604090205481811015611fc35760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610ae7565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b038216611ffe5760078054829003905561201d565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161206291815260200190565b60405180910390a3505050565b6001600160a01b03821661209957604051634b637e8f60e11b815260006004820152602401610ae7565b610b9882600083611ce9565b60008134146120c9576040516304fb820960e51b8152346004820152602401610ae7565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121519190612929565b90506001600160a01b03811661217a576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381811660448501526064808501889052855180860390910181526084909401909452602080840180516001600160e01b03166323b872dd60e01b1781528451610b9896881695899361150593889360009283929091839182885af18061221b576040513d6000823e3d81fd5b50506000513d91508115612233578060011415612240565b6001600160a01b0384163b155b1561150557604051635274afe760e01b81526001600160a01b0385166004820152602401610ae7565b60405180606001604052806000801916815260200160006001600160401b031681526020016122ab604051806040016040528060008152602001600081525090565b905290565b60005b838110156122cb5781810151838201526020016122b3565b50506000910152565b600081518084526122ec8160208601602086016122b0565b601f01601f19169290920160200192915050565b602081526000610b7f60208301846122d4565b6001600160a01b038116811461126257600080fd5b6000806040838503121561233b57600080fd5b823561234681612313565b946020939093013593505050565b600060e0828403121561236657600080fd5b50919050565b60006020828403121561237e57600080fd5b81356001600160401b0381111561239457600080fd5b610d7784828501612354565b8351815260208085015190820152600060a0820160a0604084015280855180835260c08501915060c08160051b86010192506020870160005b828110156124215760bf19878603018452815180518652602081015190506040602087015261240b60408701826122d4565b95505060209384019391909101906001016123d9565b5050855160608601525050602084015160808401529050610d77565b60006060828403121561236657600080fd5b60008083601f84011261246157600080fd5b5081356001600160401b0381111561247857600080fd5b60208301915083602082850101111561249057600080fd5b9250929050565b600080600080600080600060e0888a0312156124b257600080fd5b6124bc898961243d565b96506060880135955060808801356001600160401b038111156124de57600080fd5b6124ea8a828b0161244f565b90965094505060a08801356124fe81612313565b925060c08801356001600160401b0381111561251957600080fd5b6125258a828b0161244f565b989b979a50959850939692959293505050565b60008060006060848603121561254d57600080fd5b833561255881612313565b9250602084013561256881612313565b929592945050506040919091013590565b803563ffffffff8116811461258d57600080fd5b919050565b600080604083850312156125a557600080fd5b61234683612579565b801515811461126257600080fd5b600080604083850312156125cf57600080fd5b82356001600160401b038111156125e557600080fd5b6125f185828601612354565b9250506020830135612602816125ae565b809150509250929050565b815181526020808301519082015260408101610909565b803561ffff8116811461258d57600080fd5b6000806040838503121561264957600080fd5b61265283612579565b915061266060208401612624565b90509250929050565b60006020828403121561267b57600080fd5b8135610b7f81612313565b60008060008060a0858703121561269c57600080fd5b6126a6868661243d565b935060608501356001600160401b038111156126c157600080fd5b6126cd8782880161244f565b90945092505060808501356126e181612313565b939692955090935050565b60008083601f8401126126fe57600080fd5b5081356001600160401b0381111561271557600080fd5b6020830191508360208260051b850101111561249057600080fd5b6000806020838503121561274357600080fd5b82356001600160401b0381111561275957600080fd5b612765858286016126ec565b90969095509350505050565b60006020828403121561278357600080fd5b610b7f82612579565b600080600080606085870312156127a257600080fd5b6127ab85612579565b93506127b960208601612624565b925060408501356001600160401b038111156127d457600080fd5b6127e08782880161244f565b95989497509550505050565b6000806000838503608081121561280257600080fd5b84356001600160401b0381111561281857600080fd5b61282487828801612354565b9450506040601f198201121561283957600080fd5b50602084019150606084013561284e81612313565b809150509250925092565b600060c082019050835182526001600160401b0360208501511660208301526040840151612894604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b7f565b600080604083850312156128be57600080fd5b82356128c981612313565b9150602083013561260281612313565b6000606082840312156128eb57600080fd5b610b7f838361243d565b600181811c9082168061290957607f821691505b60208210810361236657634e487b7160e01b600052602260045260246000fd5b60006020828403121561293b57600080fd5b8151610b7f81612313565b60006020828403121561295857600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561090957610909612975565b604051606081016001600160401b03811182821017156129c0576129c061295f565b60405290565b604080519081016001600160401b03811182821017156129c0576129c061295f565b604051601f8201601f191681016001600160401b0381118282101715612a1057612a1061295f565b604052919050565b60006001600160401b03821115612a3157612a3161295f565b50601f01601f191660200190565b60006001600160401b03831115612a5857612a5861295f565b8260051b612a68602082016129e8565b84815290830190602081019036831115612a8157600080fd5b845b83811015612b5e5780356001600160401b03811115612aa157600080fd5b86016060368290031215612ab457600080fd5b612abc61299e565b612ac582612579565b8152612ad360208301612624565b602082015260408201356001600160401b03811115612af157600080fd5b919091019036601f830112612b0557600080fd5b8135612b18612b1382612a18565b6129e8565b818152366020838601011115612b2d57600080fd5b8160208501602083013760006020838301015280604084015250508085525050602083019250602081019050612a83565b5095945050505050565b60008085851115612b7857600080fd5b83861115612b8557600080fd5b5050820193919092039150565b60008451612ba48184602089016122b0565b8201838582376000930192835250909392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610d77602083018486612bba565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112612c2457600080fd5b9190910192915050565b6000808335601e19843603018112612c4557600080fd5b8301803591506001600160401b03821115612c5f57600080fd5b60200191503681900382131561249057600080fd5b6001600160401b038116811461126257600080fd5b63ffffffff612c9789612579565b1681526020888101359082015260006040890135612cb481612c74565b6001600160401b03811660408401525087606083015260e06080830152612cdf60e083018789612bba565b6001600160a01b03861660a084015282810360c0840152612d01818587612bba565b9a9950505050505050505050565b600060208284031215612d2157600080fd5b81516001600160401b03811115612d3757600080fd5b8201601f81018413612d4857600080fd5b8051612d56612b1382612a18565b818152856020838501011115612d6b57600080fd5b6117e78260208301602086016122b0565b600060208284031215612d8e57600080fd5b8135610b7f81612c74565b60018060a01b038516815283602082015261ffff83166040820152608060608201526000610bf960808301846122d4565b604081526000612ddd60408301856122d4565b82810360208401526117e781856122d4565b600060208284031215612e0157600080fd5b8151610b7f816125ae565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a06080840152612e4260e08401826122d4565b90506060850151603f198483030160a0850152612e5f82826122d4565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b600060408284031215612e9757600080fd5b612e9f6129c6565b825181526020928301519281019290925250919050565b600060408284031215612ec857600080fd5b610b7f8383612e85565b601f8211156112a857806000526020600020601f840160051c81016020851015612ef95750805b601f840160051c820191505b8181101561119b5760008155600101612f05565b81516001600160401b03811115612f3257612f3261295f565b612f4681612f4084546128f5565b84612ed2565b6020601f821160018114612f7a5760008315612f625750848201515b600019600385901b1c1916600184901b17845561119b565b600084815260208120601f198516915b82811015612faa5787850151825560209485019460019092019101612f8a565b5084821015612fc85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561305b57603f19878603018452815163ffffffff815116865261ffff6020820151166020870152604081015190506060604087015261304560608701826122d4565b9550506020938401939190910190600101612fff565b50929695505050505050565b6000604082840312801561307a57600080fd5b506130836129c6565b823581526020928301359281019290925250919050565b6000826130b757634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761090957610909612975565b8035602083101561090957600019602084900360031b1b1692915050565b80356001600160c01b03198116906008841015613122576001600160c01b0319600885900360031b81901b82161691505b5092915050565b6001600160401b0360c01b8560c01b16815263ffffffff60e01b8460e01b16600882015282600c8201526000825161316881602c8501602087016122b0565b91909101602c0195945050505050565b8481526001600160401b0360c01b8460c01b166020820152826028820152600082516131ab8160488501602087016122b0565b9190910160480195945050505050565b600060808284031280156131ce57600080fd5b506131d761299e565b8251815260208301516131e981612c74565b60208201526131fb8460408501612e85565b6040820152939250505056fea2646970667358221220c68cc336aa6c3f40258b0c3ad54353a64779235c6fca359dddc5bbeab4a6242e64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
