{
  "_format": "hh-sol-artifact-1",
  "contractName": "OFTAdapterAltImpl",
  "sourceName": "contracts/cross-chain/oftImpl/hub/OFTAdapterAltImpl.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_endpoint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "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": [
        {
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        }
      ],
      "name": "MsgValueNotZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NativeTokenUnavailable",
      "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": "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": [
        {
          "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"
    },
    {
      "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": [],
      "name": "approvalRequired",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "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": "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": [],
      "name": "msgInspector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nativeToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "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": "token",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x610100604052348015610010575f5ffd5b506040516130fc3803806130fc83398101604081905261002f91610278565b828282828282826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610071573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009591906102b8565b8282818181816100a433610209565b6001600160a01b0380831660805281166100d157604051632d618d8160e21b815260040160405180910390fd5b60805160405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e1906024015f604051808303815f87803b158015610115575f5ffd5b505af1158015610127573d5f5f3e3d5ffd5b505050505050505061013d61025860201b60201c565b60ff168360ff161015610163576040516301e9714b60e41b815260040160405180910390fd5b61016e6006846102f3565b61017990600a6103f5565b60a0525050506001600160a01b0392831660c052505060805160408051631c2eb17b60e31b8152905191909216945063e1758bd89350600480830193506020928290030181865afa1580156101d0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101f49190610403565b6001600160a01b031660e0525061041c915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b80516001600160a01b0381168114610273575f5ffd5b919050565b5f5f5f6060848603121561028a575f5ffd5b6102938461025d565b92506102a16020850161025d565b91506102af6040850161025d565b90509250925092565b5f602082840312156102c8575f5ffd5b815160ff811681146102d8575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561030c5761030c6102df565b92915050565b6001815b600184111561034d57808504811115610331576103316102df565b600184161561033f57908102905b60019390931c928002610316565b935093915050565b5f826103635750600161030c565b8161036f57505f61030c565b8160018114610385576002811461038f576103ab565b600191505061030c565b60ff8411156103a0576103a06102df565b50506001821b61030c565b5060208310610133831016604e8410600b84101617156103ce575081810a61030c565b6103da5f198484610312565b805f19048211156103ed576103ed6102df565b029392505050565b5f6102d860ff841683610355565b5f60208284031215610413575f5ffd5b6102d88261025d565b60805160a05160c05160e051612c446104b85f395f818161059d01528181611a1b0152611a6d01525f81816105ec015281816116b2015261182101525f818161043c015281816115fd01528181611676015261176301525f818161034f015281816107a701528181610d8b01528181611027015281816112c8015281816118a001528181611a9001528181611abc0152611b730152612c445ff3fe608060405260043610610188575f3560e01c80630d35b4151461018c578063111ecdad146101c357806313137d65146101ef578063134d4f2514610204578063156a0d0f1461022b57806317442b70146102515780631f5e1334146102725780633400288b146102865780633b6f743b146102a557806352ae2879146102d15780635535d461146102e35780635a0dfe4d1461030f5780635e280f111461033e5780636fc1b31e14610371578063715018a6146103905780637d25a05e146103a457806382413eac146103dd578063857749b0146103fc5780638da5cb5b14610417578063963efcaa1461042b5780639f68b9641461046c578063b731ea0a1461047f578063b98bd0701461049e578063bb0b6a53146104bd578063bc70b354146104e8578063bd815db014610507578063c7c7f5b31461051a578063ca5eb5e11461053b578063d045a0dc1461055a578063d42438851461056d578063e1758bd81461058c578063f2fde38b146105bf578063fc0c546a146105de578063ff7bd03d14610610575b5f5ffd5b348015610197575f5ffd5b506101ab6101a6366004611dd9565b61062f565b6040516101ba93929190611e66565b60405180910390f35b3480156101ce575f5ffd5b506004546101e2906001600160a01b031681565b6040516101ba9190611ef6565b6102026101fd366004611f72565b6107a5565b005b34801561020f575f5ffd5b50610218600281565b60405161ffff90911681526020016101ba565b348015610236575f5ffd5b506040805162b9270b60e21b815260016020820152016101ba565b34801561025c575f5ffd5b50604080516001815260026020820152016101ba565b34801561027d575f5ffd5b50610218600181565b348015610291575f5ffd5b506102026102a0366004612024565b61085d565b3480156102b0575f5ffd5b506102c46102bf366004612059565b610873565b6040516101ba91906120a7565b3480156102dc575f5ffd5b50306101e2565b3480156102ee575f5ffd5b506103026102fd3660046120c6565b6108ce565b6040516101ba91906120f7565b34801561031a575f5ffd5b5061032e610329366004612024565b610970565b60405190151581526020016101ba565b348015610349575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561037c575f5ffd5b5061020261038b366004612109565b61098b565b34801561039b575f5ffd5b506102026109e9565b3480156103af575f5ffd5b506103c56103be366004612024565b5f92915050565b6040516001600160401b0390911681526020016101ba565b3480156103e8575f5ffd5b5061032e6103f7366004612124565b6109fc565b348015610407575f5ffd5b50604051600681526020016101ba565b348015610422575f5ffd5b506101e2610a11565b348015610436575f5ffd5b5061045e7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ba565b348015610477575f5ffd5b50600161032e565b34801561048a575f5ffd5b506002546101e2906001600160a01b031681565b3480156104a9575f5ffd5b506102026104b83660046121c6565b610a1f565b3480156104c8575f5ffd5b5061045e6104d7366004612204565b60016020525f908152604090205481565b3480156104f3575f5ffd5b5061030261050236600461221d565b610a39565b6102026105153660046121c6565b610bda565b61052d610528366004612279565b610d44565b6040516101ba9291906122e1565b348015610546575f5ffd5b50610202610555366004612109565b610d6c565b610202610568366004611f72565b610df0565b348015610578575f5ffd5b50610202610587366004612109565b610e1f565b348015610597575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ca575f5ffd5b506102026105d9366004612109565b610e72565b3480156105e9575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006101e2565b34801561061b575f5ffd5b5061032e61062a36600461231d565b610eeb565b604080518082019091525f8082526020820152606061064c611d88565b5f5f90505f306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b19190612337565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107109190612352565b604080518082018252848152602080820184905282515f80825291810190935290975091925090610763565b604080518082019091525f81526060602082015281526020019060019003908161073c5790505b5093505f80610787604089013560608a013561078260208c018c612204565b610f1f565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107f957336040516391ac5e4f60e01b81526004016107f09190611ef6565b60405180910390fd5b602087018035906108139061080e908a612204565b610f5a565b14610845576108256020880188612204565b876020013560405163309afaf360e21b81526004016107f092919061237d565b61085487878787878787610f95565b50505050505050565b6108656110ec565b61086f828261114b565b5050565b61087b611d88565b5f610896604085013560608601356107826020880188612204565b9150505f5f6108a586846111a0565b90925090506108c26108ba6020880188612204565b8383886112be565b93505050505b92915050565b600360209081525f9283526040808420909152908252902080546108f190612393565b80601f016020809104026020016040519081016040528092919081815260200182805461091d90612393565b80156109685780601f1061093f57610100808354040283529160200191610968565b820191905f5260205f20905b81548152906001019060200180831161094b57829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b6109936110ec565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906109de908390611ef6565b60405180910390a150565b6109f16110ec565b6109fa5f611391565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b610a276110ec565b61086f610a348284612465565b6113e0565b63ffffffff84165f90815260036020908152604080832061ffff87168452909152812080546060929190610a6c90612393565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9890612393565b8015610ae35780601f10610aba57610100808354040283529160200191610ae3565b820191905f5260205f20905b815481529060010190602001808311610ac657829003601f168201915b5050505050905080515f03610b315783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929450610a099350505050565b5f839003610b40579050610a09565b60028310610bbd57610b8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114e192505050565b80610b948460028188612586565b604051602001610ba6939291906125ad565b604051602081830303815290604052915050610a09565b8383604051639a6d49cd60e01b81526004016107f09291906125fb565b5f5b81811015610cc75736838383818110610bf757610bf761260e565b9050602002810190610c099190612622565b9050610c25610c1b6020830183612204565b6020830135610970565b610c2f5750610cbf565b3063d045a0dc60c08301358360a0810135610c4e610100830183612641565b610c5f610100890160e08a01612109565b610c6d6101208a018a612641565b6040518963ffffffff1660e01b8152600401610c8f9796959493929190612697565b5f604051808303818588803b158015610ca6575f5ffd5b505af1158015610cb8573d5f5f3e3d5ffd5b5050505050505b600101610bdc565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610d03573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d2a919081019061271c565b604051638351eea760e01b81526004016107f091906120f7565b610d4c611da0565b610d54611d88565b610d5f85858561150d565b915091505b935093915050565b610d746110ec565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610dc0908490600401611ef6565b5f604051808303815f87803b158015610dd7575f5ffd5b505af1158015610de9573d5f5f3e3d5ffd5b5050505050565b333014610e105760405163029a949d60e31b815260040160405180910390fd5b61085487878787878787610845565b610e276110ec565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760906109de908390611ef6565b610e7a6110ec565b6001600160a01b038116610edf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f0565b610ee881611391565b50565b5f602082018035906001908390610f029086612204565b63ffffffff16815260208101919091526040015f20541492915050565b5f5f610f2a856115fa565b915081905083811015610d64576040516371c4efed60e01b815260048101829052602481018590526044016107f0565b63ffffffff81165f90815260016020526040812054806108c85760405163f6ff4fb760e01b815263ffffffff841660048201526024016107f0565b5f610fa6610fa38787611630565b90565b90505f610fd182610fbf610fba8a8a61164e565b611670565b610fcc60208d018d612204565b6116a4565b90506028861115611091575f61100d610ff060608c0160408d01612784565b610ffd60208d018d612204565b846110088c8c6116e1565b61172b565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906110629086908d905f90879060040161279f565b5f604051808303815f87803b158015611079575f5ffd5b505af115801561108b573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6110ca60208d018d612204565b846040516110d992919061237d565b60405180910390a3505050505050505050565b336110f5610a11565b6001600160a01b0316146109fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f0565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b90611194908490849061237d565b60405180910390a15050565b6060805f6111fb85602001356111b58661175d565b6111c260a0890189612641565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061178892505050565b90935090505f8161120d576001611210565b60025b90506112306112226020880188612204565b8261050260808a018a612641565b6004549093506001600160a01b031680156112b45760405163043a78eb60e01b81526001600160a01b0382169063043a78eb9061127390889088906004016127cf565b602060405180830381865afa15801561128e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b291906127f3565b505b5050509250929050565b6112c6611d88565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161131589610f5a565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b815260040161134a92919061280e565b6040805180830381865afa158015611364573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138891906128b5565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b81518110156114b1576114118282815181106114005761140061260e565b6020026020010151604001516114e1565b8181815181106114235761142361260e565b60200260200101516040015160035f8484815181106114445761144461260e565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f84848151811061147b5761147b61260e565b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816114a89190612913565b506001016113e2565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674816040516109de91906129cd565b600281015161ffff811660031461086f5781604051639a6d49cd60e01b81526004016107f091906120f7565b611515611da0565b61151d611d88565b5f8061153f33604089013560608a013561153a60208c018c612204565b611802565b915091505f5f61154f89846111a0565b909250905061157b61156460208b018b612204565b8383611575368d90038d018d612a5b565b8b611852565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906115c9908d018d612204565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006116268184612a8c565b6108c89190612aab565b5f61163e6020828486612586565b61164791612ace565b9392505050565b5f61165d602860208486612586565b61166691612aeb565b60c01c9392505050565b5f6108c87f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416612aab565b5f6116d96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611972565b509092915050565b60606116f08260288186612586565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b6060848484846040516020016117449493929190612b23565b6040516020818303038152906040529050949350505050565b5f6108c87f000000000000000000000000000000000000000000000000000000000000000083612a8c565b80516060901515806117d15784846040516020016117bd92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040526117f8565b848433856040516020016117e89493929190612b74565b6040516020818303038152906040525b9150935093915050565b5f5f61180f858585610f1f565b90925090506118496001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168730856119da565b94509492505050565b61185a611da0565b341561187b57604051637693b46f60e01b81523460048201526024016107f0565b825161188690611a18565b5060208301511561189e5761189e8360200151611ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a4506040518060a001604052808963ffffffff1681526020016118ed8a610f5a565b81526020018881526020018781526020015f8760200151111515815250846040518363ffffffff1660e01b815260040161192892919061280e565b6080604051808303815f875af1158015611944573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119689190612bb3565b9695505050505050565b6040516001600160a01b0383166024820152604481018290526119d590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b98565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611a129085906323b872dd60e01b9060840161199e565b50505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a6057604051638dce522760e01b815260040160405180910390fd5b611ab56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f0000000000000000000000000000000000000000000000000000000000000000856119da565b5090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3a9190612337565b90506001600160a01b038116611b63576040516329b99a9560e11b815260040160405180910390fd5b61086f6001600160a01b038216337f0000000000000000000000000000000000000000000000000000000000000000856119da565b5f611bec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c6b9092919063ffffffff16565b905080515f1480611c0c575080806020019051810190611c0c91906127f3565b6119d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060610a0984845f85855f5f866001600160a01b03168587604051611c909190612bfd565b5f6040518083038185875af1925050503d805f8114611cca576040519150601f19603f3d011682016040523d82523d5f602084013e611ccf565b606091505b5091509150611ce087838387611ceb565b979650505050505050565b60608315611d595782515f03611d52576001600160a01b0385163b611d525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081610a09565b610a098383815115611d6e5781518083602001fd5b8060405162461bcd60e51b81526004016107f091906120f7565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611dbe611d88565b905290565b5f60e08284031215611dd3575f5ffd5b50919050565b5f60208284031215611de9575f5ffd5b81356001600160401b03811115611dfe575f5ffd5b610a0984828501611dc3565b80518252602090810151910152565b5f5b83811015611e33578181015183820152602001611e1b565b50505f910152565b5f8151808452611e52816020860160208601611e19565b601f01601f19169290920160200192915050565b5f60a08201611e758387611e0a565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b82811015611ee15760bf198786030184528151805186526020810151905060406020870152611ecb6040870182611e3b565b9550506020938401939190910190600101611e99565b5050505080915050610a096060830184611e0a565b6001600160a01b0391909116815260200190565b5f60608284031215611dd3575f5ffd5b5f5f83601f840112611f2a575f5ffd5b5081356001600160401b03811115611f40575f5ffd5b602083019150836020828501011115611f57575f5ffd5b9250929050565b6001600160a01b0381168114610ee8575f5ffd5b5f5f5f5f5f5f5f60e0888a031215611f88575f5ffd5b611f928989611f0a565b96506060880135955060808801356001600160401b03811115611fb3575f5ffd5b611fbf8a828b01611f1a565b90965094505060a0880135611fd381611f5e565b925060c08801356001600160401b03811115611fed575f5ffd5b611ff98a828b01611f1a565b989b979a50959850939692959293505050565b803563ffffffff8116811461201f575f5ffd5b919050565b5f5f60408385031215612035575f5ffd5b61203e8361200c565b946020939093013593505050565b8015158114610ee8575f5ffd5b5f5f6040838503121561206a575f5ffd5b82356001600160401b0381111561207f575f5ffd5b61208b85828601611dc3565b925050602083013561209c8161204c565b809150509250929050565b604081016108c88284611e0a565b803561ffff8116811461201f575f5ffd5b5f5f604083850312156120d7575f5ffd5b6120e08361200c565b91506120ee602084016120b5565b90509250929050565b602081525f6116476020830184611e3b565b5f60208284031215612119575f5ffd5b813561164781611f5e565b5f5f5f5f60a08587031215612137575f5ffd5b6121418686611f0a565b935060608501356001600160401b0381111561215b575f5ffd5b61216787828801611f1a565b909450925050608085013561217b81611f5e565b939692955090935050565b5f5f83601f840112612196575f5ffd5b5081356001600160401b038111156121ac575f5ffd5b6020830191508360208260051b8501011115611f57575f5ffd5b5f5f602083850312156121d7575f5ffd5b82356001600160401b038111156121ec575f5ffd5b6121f885828601612186565b90969095509350505050565b5f60208284031215612214575f5ffd5b6116478261200c565b5f5f5f5f60608587031215612230575f5ffd5b6122398561200c565b9350612247602086016120b5565b925060408501356001600160401b03811115612261575f5ffd5b61226d87828801611f1a565b95989497509550505050565b5f5f5f838503608081121561228c575f5ffd5b84356001600160401b038111156122a1575f5ffd5b6122ad87828801611dc3565b9450506040601f19820112156122c1575f5ffd5b5060208401915060608401356122d681611f5e565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c083019161230f90840182611e0a565b506116476080830184611e0a565b5f6060828403121561232d575f5ffd5b6116478383611f0a565b5f60208284031215612347575f5ffd5b815161164781611f5e565b5f60208284031215612362575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b600181811c908216806123a757607f821691505b602082108103611dd357634e487b7160e01b5f52602260045260245ffd5b604051606081016001600160401b03811182821017156123e7576123e7612369565b60405290565b604080519081016001600160401b03811182821017156123e7576123e7612369565b604051601f8201601f191681016001600160401b038111828210171561243757612437612369565b604052919050565b5f6001600160401b0382111561245757612457612369565b50601f01601f191660200190565b5f6001600160401b0383111561247d5761247d612369565b8260051b61248d6020820161240f565b848152908301906020810190368311156124a5575f5ffd5b845b8381101561257c5780356001600160401b038111156124c4575f5ffd5b860160603682900312156124d6575f5ffd5b6124de6123c5565b6124e78261200c565b81526124f5602083016120b5565b602082015260408201356001600160401b03811115612512575f5ffd5b919091019036601f830112612525575f5ffd5b81356125386125338261243f565b61240f565b81815236602083860101111561254c575f5ffd5b816020850160208301375f60208383010152806040840152505080855250506020830192506020810190506124a7565b5095945050505050565b5f5f85851115612594575f5ffd5b838611156125a0575f5ffd5b5050820193919092039150565b5f84516125be818460208901611e19565b8201838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a096020830184866125d3565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e19833603018112612637575f5ffd5b9190910192915050565b5f5f8335601e19843603018112612656575f5ffd5b8301803591506001600160401b0382111561266f575f5ffd5b602001915036819003821315611f57575f5ffd5b6001600160401b0381168114610ee8575f5ffd5b63ffffffff6126a58961200c565b168152602088810135908201525f60408901356126c181612683565b6001600160401b031660408301526060820188905260e0608083018190526126ec90830187896125d3565b6001600160a01b03861660a084015282810360c084015261270e8185876125d3565b9a9950505050505050505050565b5f6020828403121561272c575f5ffd5b81516001600160401b03811115612741575f5ffd5b8201601f81018413612751575f5ffd5b805161275f6125338261243f565b818152856020838501011115612773575f5ffd5b611388826020830160208601611e19565b5f60208284031215612794575f5ffd5b813561164781612683565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f6119686080830184611e3b565b604081525f6127e16040830185611e3b565b82810360208401526113888185611e3b565b5f60208284031215612803575f5ffd5b81516116478161204c565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a0608084015261284360e0840182611e3b565b90506060850151603f198483030160a08501526128608282611e3b565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f60408284031215612896575f5ffd5b61289e6123ed565b825181526020928301519281019290925250919050565b5f604082840312156128c5575f5ffd5b6116478383612886565b601f8211156119d557805f5260205f20601f840160051c810160208510156128f45750805b601f840160051c820191505b81811015610de9575f8155600101612900565b81516001600160401b0381111561292c5761292c612369565b6129408161293a8454612393565b846128cf565b6020601f821160018114612972575f831561295b5750848201515b5f19600385901b1c1916600184901b178455610de9565b5f84815260208120601f198516915b828110156129a15787850151825560209485019460019092019101612981565b50848210156129be57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015612a4f57603f19878603018452815163ffffffff815116865261ffff60208201511660208701526040810151905060606040870152612a396060870182611e3b565b95505060209384019391909101906001016129f3565b50929695505050505050565b5f6040828403128015612a6c575f5ffd5b50612a756123ed565b823581526020928301359281019290925250919050565b5f82612aa657634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176108c857634e487b7160e01b5f52601160045260245ffd5b803560208310156108c8575f19602084900360031b1b1692915050565b80356001600160c01b03198116906008841015612b1c576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c810183905281515f90612b6481602c850160208701611e19565b91909101602c0195945050505050565b84815260018060c01b03198460c01b1660208201528260288201525f8251612ba3816048850160208701611e19565b9190910160480195945050505050565b5f6080828403128015612bc4575f5ffd5b50612bcd6123c5565b825181526020830151612bdf81612683565b6020820152612bf18460408501612886565b60408201529392505050565b5f8251612637818460208701611e1956fea264697066735822122018d261815c6e0546992a55beabf10db992c07d286f5b0f14474ca28ade8ad96f64736f6c634300081e0033",
  "deployedBytecode": "0x608060405260043610610188575f3560e01c80630d35b4151461018c578063111ecdad146101c357806313137d65146101ef578063134d4f2514610204578063156a0d0f1461022b57806317442b70146102515780631f5e1334146102725780633400288b146102865780633b6f743b146102a557806352ae2879146102d15780635535d461146102e35780635a0dfe4d1461030f5780635e280f111461033e5780636fc1b31e14610371578063715018a6146103905780637d25a05e146103a457806382413eac146103dd578063857749b0146103fc5780638da5cb5b14610417578063963efcaa1461042b5780639f68b9641461046c578063b731ea0a1461047f578063b98bd0701461049e578063bb0b6a53146104bd578063bc70b354146104e8578063bd815db014610507578063c7c7f5b31461051a578063ca5eb5e11461053b578063d045a0dc1461055a578063d42438851461056d578063e1758bd81461058c578063f2fde38b146105bf578063fc0c546a146105de578063ff7bd03d14610610575b5f5ffd5b348015610197575f5ffd5b506101ab6101a6366004611dd9565b61062f565b6040516101ba93929190611e66565b60405180910390f35b3480156101ce575f5ffd5b506004546101e2906001600160a01b031681565b6040516101ba9190611ef6565b6102026101fd366004611f72565b6107a5565b005b34801561020f575f5ffd5b50610218600281565b60405161ffff90911681526020016101ba565b348015610236575f5ffd5b506040805162b9270b60e21b815260016020820152016101ba565b34801561025c575f5ffd5b50604080516001815260026020820152016101ba565b34801561027d575f5ffd5b50610218600181565b348015610291575f5ffd5b506102026102a0366004612024565b61085d565b3480156102b0575f5ffd5b506102c46102bf366004612059565b610873565b6040516101ba91906120a7565b3480156102dc575f5ffd5b50306101e2565b3480156102ee575f5ffd5b506103026102fd3660046120c6565b6108ce565b6040516101ba91906120f7565b34801561031a575f5ffd5b5061032e610329366004612024565b610970565b60405190151581526020016101ba565b348015610349575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561037c575f5ffd5b5061020261038b366004612109565b61098b565b34801561039b575f5ffd5b506102026109e9565b3480156103af575f5ffd5b506103c56103be366004612024565b5f92915050565b6040516001600160401b0390911681526020016101ba565b3480156103e8575f5ffd5b5061032e6103f7366004612124565b6109fc565b348015610407575f5ffd5b50604051600681526020016101ba565b348015610422575f5ffd5b506101e2610a11565b348015610436575f5ffd5b5061045e7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ba565b348015610477575f5ffd5b50600161032e565b34801561048a575f5ffd5b506002546101e2906001600160a01b031681565b3480156104a9575f5ffd5b506102026104b83660046121c6565b610a1f565b3480156104c8575f5ffd5b5061045e6104d7366004612204565b60016020525f908152604090205481565b3480156104f3575f5ffd5b5061030261050236600461221d565b610a39565b6102026105153660046121c6565b610bda565b61052d610528366004612279565b610d44565b6040516101ba9291906122e1565b348015610546575f5ffd5b50610202610555366004612109565b610d6c565b610202610568366004611f72565b610df0565b348015610578575f5ffd5b50610202610587366004612109565b610e1f565b348015610597575f5ffd5b506101e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ca575f5ffd5b506102026105d9366004612109565b610e72565b3480156105e9575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000006101e2565b34801561061b575f5ffd5b5061032e61062a36600461231d565b610eeb565b604080518082019091525f8082526020820152606061064c611d88565b5f5f90505f306001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b19190612337565b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107109190612352565b604080518082018252848152602080820184905282515f80825291810190935290975091925090610763565b604080518082019091525f81526060602082015281526020019060019003908161073c5790505b5093505f80610787604089013560608a013561078260208c018c612204565b610f1f565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146107f957336040516391ac5e4f60e01b81526004016107f09190611ef6565b60405180910390fd5b602087018035906108139061080e908a612204565b610f5a565b14610845576108256020880188612204565b876020013560405163309afaf360e21b81526004016107f092919061237d565b61085487878787878787610f95565b50505050505050565b6108656110ec565b61086f828261114b565b5050565b61087b611d88565b5f610896604085013560608601356107826020880188612204565b9150505f5f6108a586846111a0565b90925090506108c26108ba6020880188612204565b8383886112be565b93505050505b92915050565b600360209081525f9283526040808420909152908252902080546108f190612393565b80601f016020809104026020016040519081016040528092919081815260200182805461091d90612393565b80156109685780601f1061093f57610100808354040283529160200191610968565b820191905f5260205f20905b81548152906001019060200180831161094b57829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b6109936110ec565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906109de908390611ef6565b60405180910390a150565b6109f16110ec565b6109fa5f611391565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b610a276110ec565b61086f610a348284612465565b6113e0565b63ffffffff84165f90815260036020908152604080832061ffff87168452909152812080546060929190610a6c90612393565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9890612393565b8015610ae35780601f10610aba57610100808354040283529160200191610ae3565b820191905f5260205f20905b815481529060010190602001808311610ac657829003601f168201915b5050505050905080515f03610b315783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929450610a099350505050565b5f839003610b40579050610a09565b60028310610bbd57610b8684848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114e192505050565b80610b948460028188612586565b604051602001610ba6939291906125ad565b604051602081830303815290604052915050610a09565b8383604051639a6d49cd60e01b81526004016107f09291906125fb565b5f5b81811015610cc75736838383818110610bf757610bf761260e565b9050602002810190610c099190612622565b9050610c25610c1b6020830183612204565b6020830135610970565b610c2f5750610cbf565b3063d045a0dc60c08301358360a0810135610c4e610100830183612641565b610c5f610100890160e08a01612109565b610c6d6101208a018a612641565b6040518963ffffffff1660e01b8152600401610c8f9796959493929190612697565b5f604051808303818588803b158015610ca6575f5ffd5b505af1158015610cb8573d5f5f3e3d5ffd5b5050505050505b600101610bdc565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610d03573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d2a919081019061271c565b604051638351eea760e01b81526004016107f091906120f7565b610d4c611da0565b610d54611d88565b610d5f85858561150d565b915091505b935093915050565b610d746110ec565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610dc0908490600401611ef6565b5f604051808303815f87803b158015610dd7575f5ffd5b505af1158015610de9573d5f5f3e3d5ffd5b5050505050565b333014610e105760405163029a949d60e31b815260040160405180910390fd5b61085487878787878787610845565b610e276110ec565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760906109de908390611ef6565b610e7a6110ec565b6001600160a01b038116610edf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f0565b610ee881611391565b50565b5f602082018035906001908390610f029086612204565b63ffffffff16815260208101919091526040015f20541492915050565b5f5f610f2a856115fa565b915081905083811015610d64576040516371c4efed60e01b815260048101829052602481018590526044016107f0565b63ffffffff81165f90815260016020526040812054806108c85760405163f6ff4fb760e01b815263ffffffff841660048201526024016107f0565b5f610fa6610fa38787611630565b90565b90505f610fd182610fbf610fba8a8a61164e565b611670565b610fcc60208d018d612204565b6116a4565b90506028861115611091575f61100d610ff060608c0160408d01612784565b610ffd60208d018d612204565b846110088c8c6116e1565b61172b565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906110629086908d905f90879060040161279f565b5f604051808303815f87803b158015611079575f5ffd5b505af115801561108b573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c6110ca60208d018d612204565b846040516110d992919061237d565b60405180910390a3505050505050505050565b336110f5610a11565b6001600160a01b0316146109fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f0565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b90611194908490849061237d565b60405180910390a15050565b6060805f6111fb85602001356111b58661175d565b6111c260a0890189612641565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061178892505050565b90935090505f8161120d576001611210565b60025b90506112306112226020880188612204565b8261050260808a018a612641565b6004549093506001600160a01b031680156112b45760405163043a78eb60e01b81526001600160a01b0382169063043a78eb9061127390889088906004016127cf565b602060405180830381865afa15801561128e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b291906127f3565b505b5050509250929050565b6112c6611d88565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff16815260200161131589610f5a565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b815260040161134a92919061280e565b6040805180830381865afa158015611364573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138891906128b5565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b81518110156114b1576114118282815181106114005761140061260e565b6020026020010151604001516114e1565b8181815181106114235761142361260e565b60200260200101516040015160035f8484815181106114445761144461260e565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f84848151811061147b5761147b61260e565b60200260200101516020015161ffff1661ffff1681526020019081526020015f2090816114a89190612913565b506001016113e2565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674816040516109de91906129cd565b600281015161ffff811660031461086f5781604051639a6d49cd60e01b81526004016107f091906120f7565b611515611da0565b61151d611d88565b5f8061153f33604089013560608a013561153a60208c018c612204565b611802565b915091505f5f61154f89846111a0565b909250905061157b61156460208b018b612204565b8383611575368d90038d018d612a5b565b8b611852565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906115c9908d018d612204565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006116268184612a8c565b6108c89190612aab565b5f61163e6020828486612586565b61164791612ace565b9392505050565b5f61165d602860208486612586565b61166691612aeb565b60c01c9392505050565b5f6108c87f00000000000000000000000000000000000000000000000000000000000000006001600160401b038416612aab565b5f6116d96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611972565b509092915050565b60606116f08260288186612586565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b6060848484846040516020016117449493929190612b23565b6040516020818303038152906040529050949350505050565b5f6108c87f000000000000000000000000000000000000000000000000000000000000000083612a8c565b80516060901515806117d15784846040516020016117bd92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040526117f8565b848433856040516020016117e89493929190612b74565b6040516020818303038152906040525b9150935093915050565b5f5f61180f858585610f1f565b90925090506118496001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168730856119da565b94509492505050565b61185a611da0565b341561187b57604051637693b46f60e01b81523460048201526024016107f0565b825161188690611a18565b5060208301511561189e5761189e8360200151611ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a4506040518060a001604052808963ffffffff1681526020016118ed8a610f5a565b81526020018881526020018781526020015f8760200151111515815250846040518363ffffffff1660e01b815260040161192892919061280e565b6080604051808303815f875af1158015611944573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119689190612bb3565b9695505050505050565b6040516001600160a01b0383166024820152604481018290526119d590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b98565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611a129085906323b872dd60e01b9060840161199e565b50505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a6057604051638dce522760e01b815260040160405180910390fd5b611ab56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f0000000000000000000000000000000000000000000000000000000000000000856119da565b5090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3a9190612337565b90506001600160a01b038116611b63576040516329b99a9560e11b815260040160405180910390fd5b61086f6001600160a01b038216337f0000000000000000000000000000000000000000000000000000000000000000856119da565b5f611bec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c6b9092919063ffffffff16565b905080515f1480611c0c575080806020019051810190611c0c91906127f3565b6119d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107f0565b6060610a0984845f85855f5f866001600160a01b03168587604051611c909190612bfd565b5f6040518083038185875af1925050503d805f8114611cca576040519150601f19603f3d011682016040523d82523d5f602084013e611ccf565b606091505b5091509150611ce087838387611ceb565b979650505050505050565b60608315611d595782515f03611d52576001600160a01b0385163b611d525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107f0565b5081610a09565b610a098383815115611d6e5781518083602001fd5b8060405162461bcd60e51b81526004016107f091906120f7565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611dbe611d88565b905290565b5f60e08284031215611dd3575f5ffd5b50919050565b5f60208284031215611de9575f5ffd5b81356001600160401b03811115611dfe575f5ffd5b610a0984828501611dc3565b80518252602090810151910152565b5f5b83811015611e33578181015183820152602001611e1b565b50505f910152565b5f8151808452611e52816020860160208601611e19565b601f01601f19169290920160200192915050565b5f60a08201611e758387611e0a565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b82811015611ee15760bf198786030184528151805186526020810151905060406020870152611ecb6040870182611e3b565b9550506020938401939190910190600101611e99565b5050505080915050610a096060830184611e0a565b6001600160a01b0391909116815260200190565b5f60608284031215611dd3575f5ffd5b5f5f83601f840112611f2a575f5ffd5b5081356001600160401b03811115611f40575f5ffd5b602083019150836020828501011115611f57575f5ffd5b9250929050565b6001600160a01b0381168114610ee8575f5ffd5b5f5f5f5f5f5f5f60e0888a031215611f88575f5ffd5b611f928989611f0a565b96506060880135955060808801356001600160401b03811115611fb3575f5ffd5b611fbf8a828b01611f1a565b90965094505060a0880135611fd381611f5e565b925060c08801356001600160401b03811115611fed575f5ffd5b611ff98a828b01611f1a565b989b979a50959850939692959293505050565b803563ffffffff8116811461201f575f5ffd5b919050565b5f5f60408385031215612035575f5ffd5b61203e8361200c565b946020939093013593505050565b8015158114610ee8575f5ffd5b5f5f6040838503121561206a575f5ffd5b82356001600160401b0381111561207f575f5ffd5b61208b85828601611dc3565b925050602083013561209c8161204c565b809150509250929050565b604081016108c88284611e0a565b803561ffff8116811461201f575f5ffd5b5f5f604083850312156120d7575f5ffd5b6120e08361200c565b91506120ee602084016120b5565b90509250929050565b602081525f6116476020830184611e3b565b5f60208284031215612119575f5ffd5b813561164781611f5e565b5f5f5f5f60a08587031215612137575f5ffd5b6121418686611f0a565b935060608501356001600160401b0381111561215b575f5ffd5b61216787828801611f1a565b909450925050608085013561217b81611f5e565b939692955090935050565b5f5f83601f840112612196575f5ffd5b5081356001600160401b038111156121ac575f5ffd5b6020830191508360208260051b8501011115611f57575f5ffd5b5f5f602083850312156121d7575f5ffd5b82356001600160401b038111156121ec575f5ffd5b6121f885828601612186565b90969095509350505050565b5f60208284031215612214575f5ffd5b6116478261200c565b5f5f5f5f60608587031215612230575f5ffd5b6122398561200c565b9350612247602086016120b5565b925060408501356001600160401b03811115612261575f5ffd5b61226d87828801611f1a565b95989497509550505050565b5f5f5f838503608081121561228c575f5ffd5b84356001600160401b038111156122a1575f5ffd5b6122ad87828801611dc3565b9450506040601f19820112156122c1575f5ffd5b5060208401915060608401356122d681611f5e565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c083019161230f90840182611e0a565b506116476080830184611e0a565b5f6060828403121561232d575f5ffd5b6116478383611f0a565b5f60208284031215612347575f5ffd5b815161164781611f5e565b5f60208284031215612362575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b600181811c908216806123a757607f821691505b602082108103611dd357634e487b7160e01b5f52602260045260245ffd5b604051606081016001600160401b03811182821017156123e7576123e7612369565b60405290565b604080519081016001600160401b03811182821017156123e7576123e7612369565b604051601f8201601f191681016001600160401b038111828210171561243757612437612369565b604052919050565b5f6001600160401b0382111561245757612457612369565b50601f01601f191660200190565b5f6001600160401b0383111561247d5761247d612369565b8260051b61248d6020820161240f565b848152908301906020810190368311156124a5575f5ffd5b845b8381101561257c5780356001600160401b038111156124c4575f5ffd5b860160603682900312156124d6575f5ffd5b6124de6123c5565b6124e78261200c565b81526124f5602083016120b5565b602082015260408201356001600160401b03811115612512575f5ffd5b919091019036601f830112612525575f5ffd5b81356125386125338261243f565b61240f565b81815236602083860101111561254c575f5ffd5b816020850160208301375f60208383010152806040840152505080855250506020830192506020810190506124a7565b5095945050505050565b5f5f85851115612594575f5ffd5b838611156125a0575f5ffd5b5050820193919092039150565b5f84516125be818460208901611e19565b8201838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a096020830184866125d3565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e19833603018112612637575f5ffd5b9190910192915050565b5f5f8335601e19843603018112612656575f5ffd5b8301803591506001600160401b0382111561266f575f5ffd5b602001915036819003821315611f57575f5ffd5b6001600160401b0381168114610ee8575f5ffd5b63ffffffff6126a58961200c565b168152602088810135908201525f60408901356126c181612683565b6001600160401b031660408301526060820188905260e0608083018190526126ec90830187896125d3565b6001600160a01b03861660a084015282810360c084015261270e8185876125d3565b9a9950505050505050505050565b5f6020828403121561272c575f5ffd5b81516001600160401b03811115612741575f5ffd5b8201601f81018413612751575f5ffd5b805161275f6125338261243f565b818152856020838501011115612773575f5ffd5b611388826020830160208601611e19565b5f60208284031215612794575f5ffd5b813561164781612683565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f6119686080830184611e3b565b604081525f6127e16040830185611e3b565b82810360208401526113888185611e3b565b5f60208284031215612803575f5ffd5b81516116478161204c565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a0608084015261284360e0840182611e3b565b90506060850151603f198483030160a08501526128608282611e3b565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f60408284031215612896575f5ffd5b61289e6123ed565b825181526020928301519281019290925250919050565b5f604082840312156128c5575f5ffd5b6116478383612886565b601f8211156119d557805f5260205f20601f840160051c810160208510156128f45750805b601f840160051c820191505b81811015610de9575f8155600101612900565b81516001600160401b0381111561292c5761292c612369565b6129408161293a8454612393565b846128cf565b6020601f821160018114612972575f831561295b5750848201515b5f19600385901b1c1916600184901b178455610de9565b5f84815260208120601f198516915b828110156129a15787850151825560209485019460019092019101612981565b50848210156129be57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015612a4f57603f19878603018452815163ffffffff815116865261ffff60208201511660208701526040810151905060606040870152612a396060870182611e3b565b95505060209384019391909101906001016129f3565b50929695505050505050565b5f6040828403128015612a6c575f5ffd5b50612a756123ed565b823581526020928301359281019290925250919050565b5f82612aa657634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176108c857634e487b7160e01b5f52601160045260245ffd5b803560208310156108c8575f19602084900360031b1b1692915050565b80356001600160c01b03198116906008841015612b1c576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c810183905281515f90612b6481602c850160208701611e19565b91909101602c0195945050505050565b84815260018060c01b03198460c01b1660208201528260288201525f8251612ba3816048850160208701611e19565b9190910160480195945050505050565b5f6080828403128015612bc4575f5ffd5b50612bcd6123c5565b825181526020830151612bdf81612683565b6020820152612bf18460408501612886565b60408201529392505050565b5f8251612637818460208701611e1956fea264697066735822122018d261815c6e0546992a55beabf10db992c07d286f5b0f14474ca28ade8ad96f64736f6c634300081e0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
