{
  "_format": "hh-sol-artifact-1",
  "contractName": "SampleWarperWithRentalHookBasedMemory",
  "sourceName": "contracts/mocks/warper/ERC721/v1-controller/custom/SampleWarperWithRentalHookBasedMemory.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "original",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "metahub",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "BalanceQueryForZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CallForwardToZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CallerIsNotRentingManager",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CallerIsNotWarperAdmin",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ContractIsAlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ContractIsNotInitializing",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "original",
          "type": "address"
        },
        {
          "internalType": "bytes4",
          "name": "requiredInterfaceId",
          "type": "bytes4"
        }
      ],
      "name": "InvalidOriginalTokenInterface",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MethodNotAllowed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MintToTheZeroAddress",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "OperatorQueryForNonexistentToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "OwnerQueryForNonexistentToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "RentingHookError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "TokenIsAlreadyMinted",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "TransferToNonERC721ReceiverImplementer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TransferToTheZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "inputs": [],
      "name": "__assetClass",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "__metahub",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "rentalId_",
          "type": "uint256"
        },
        {
          "components": [
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "class",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "data",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct Assets.AssetId",
                  "name": "id",
                  "type": "tuple"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Assets.Asset[]",
              "name": "warpedAssets",
              "type": "tuple[]"
            },
            {
              "internalType": "uint256",
              "name": "universeId",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "collectionId",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "listingId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "renter",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "startTime",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTime",
              "type": "uint32"
            },
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct IListingTermsRegistry.ListingTerms",
                  "name": "listingTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "universeTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "protocolTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "paymentToken",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "paymentTokenQuote",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ITokenQuote.PaymentTokenData",
                  "name": "paymentTokenData",
                  "type": "tuple"
                }
              ],
              "internalType": "struct Rentings.AgreementTerms",
              "name": "agreementTerms",
              "type": "tuple"
            }
          ],
          "internalType": "struct Rentings.Agreement",
          "name": "rentalAgreement_",
          "type": "tuple"
        },
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "bool",
                  "name": "isLister",
                  "type": "bool"
                },
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UserEarning[]",
              "name": "userEarnings",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "universeId",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UniverseEarning",
              "name": "universeEarning",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.ProtocolEarning",
              "name": "protocolEarning",
              "type": "tuple"
            }
          ],
          "internalType": "struct Accounts.RentalEarnings",
          "name": "rentalEarnings_",
          "type": "tuple"
        }
      ],
      "name": "__onRent",
      "outputs": [
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "internalType": "string",
          "name": "errorMessage",
          "type": "string"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "__original",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4[]",
          "name": "interfaceIds",
          "type": "bytes4[]"
        }
      ],
      "name": "__supportedInterfaces",
      "outputs": [
        {
          "internalType": "bool[]",
          "name": "",
          "type": "bool[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "rentalId",
          "type": "uint256"
        }
      ],
      "name": "getRentalAgreement",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "class",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "data",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct Assets.AssetId",
                  "name": "id",
                  "type": "tuple"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Assets.Asset[]",
              "name": "warpedAssets",
              "type": "tuple[]"
            },
            {
              "internalType": "uint256",
              "name": "universeId",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "collectionId",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "listingId",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "renter",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "startTime",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTime",
              "type": "uint32"
            },
            {
              "components": [
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct IListingTermsRegistry.ListingTerms",
                  "name": "listingTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "universeTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "bytes4",
                      "name": "strategyId",
                      "type": "bytes4"
                    },
                    {
                      "internalType": "bytes",
                      "name": "strategyData",
                      "type": "bytes"
                    }
                  ],
                  "internalType": "struct ITaxTermsRegistry.TaxTerms",
                  "name": "protocolTaxTerms",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "paymentToken",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "paymentTokenQuote",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ITokenQuote.PaymentTokenData",
                  "name": "paymentTokenData",
                  "type": "tuple"
                }
              ],
              "internalType": "struct Rentings.AgreementTerms",
              "name": "agreementTerms",
              "type": "tuple"
            }
          ],
          "internalType": "struct Rentings.Agreement",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "rentalId",
          "type": "uint256"
        }
      ],
      "name": "getRentalEarnings",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "bool",
                  "name": "isLister",
                  "type": "bool"
                },
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UserEarning[]",
              "name": "userEarnings",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "universeId",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.UniverseEarning",
              "name": "universeEarning",
              "type": "tuple"
            },
            {
              "components": [
                {
                  "internalType": "enum IPaymentManager.EarningType",
                  "name": "earningType",
                  "type": "uint8"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "internalType": "struct Accounts.ProtocolEarning",
              "name": "protocolEarning",
              "type": "tuple"
            }
          ],
          "internalType": "struct Accounts.RentalEarnings",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "renter",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getRenterWarpedTokenIdLastRentalAgreement",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "rentalId",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "data",
          "type": "bytes[]"
        }
      ],
      "name": "multicall",
      "outputs": [
        {
          "internalType": "bytes[]",
          "name": "results",
          "type": "bytes[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "successState_",
          "type": "bool"
        }
      ],
      "name": "setSuccessState",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x60806040526004805460ff191660011790553480156200001e57600080fd5b506040516200338c3803806200338c8339810160408190526200004191620004b1565b6000620000776200006360016000805160206200334c833981519152620004e9565b60001b6200018b60201b6200112b1760201c565b5460ff16159050620000886200018e565b158015620000b65750620000b16200006360016000805160206200336c833981519152620004e9565b5460ff165b15620000d45760405162ea7fe560e71b815260040160405180910390fd5b80156200010c576001620000fc62000063826000805160206200334c833981519152620004e9565b805460ff19169115159190911790555b620001188383620001ac565b801562000182576000620001416200006360016000805160206200334c833981519152620004e9565b805460ff19169115159190911790556000620001726200006360016000805160206200336c833981519152620004e9565b805460ff19169115159190911790555b5050506200050f565b90565b6000620001a6306200021360201b6200112e1760201c565b15905090565b620001cc6200006360016000805160206200334c833981519152620004e9565b5460ff16620001ee576040516369be8d9360e11b815260040160405180910390fd5b620001f98262000222565b62000204826200029f565b6200020f8162000334565b5050565b6001600160a01b03163b151590565b6200024c635b5e139f60e01b826001600160a01b0316620003a860201b6200113d1790919060201c565b620002865760405163c30175c560e01b81526001600160a01b0382166004820152635b5e139f60e01b602482015260440160405180910390fd5b6200029c816200029c60201b620011591760201c565b50565b620002bf6200006360016000805160206200334c833981519152620004e9565b5460ff16620002e1576040516369be8d9360e11b815260040160405180910390fd5b80620003136200006360017f1cd3cead3f33d5ed74fb83a237e17d126ef505cbae350d3d0ffce421e3a1d144620004e9565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620003546200006360016000805160206200334c833981519152620004e9565b5460ff1662000376576040516369be8d9360e11b815260040160405180910390fd5b80620003136200006360017fc57d320c8f1e45a5114285d6f31191434d3d45422aff570b70ab6787e45bcf00620004e9565b6000620003b583620003d0565b8015620003c95750620003c9838362000409565b9392505050565b6000620003e5826301ffc9a760e01b62000409565b801562000403575062000401826001600160e01b031962000409565b155b92915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d915060005190508280156200047c575060208210155b8015620004895750600081115b979650505050505050565b80516001600160a01b0381168114620004ac57600080fd5b919050565b60008060408385031215620004c557600080fd5b620004d08362000494565b9150620004e06020840162000494565b90509250929050565b6000828210156200050a57634e487b7160e01b600052601160045260246000fd5b500390565b612e2d806200051f6000396000f3fe60806040526004361061012e5760003560e01c80636352211e116100ab578063b88d4fde1161006f578063b88d4fde14610392578063cb31468c146103b2578063d1cd1837146103e0578063e846a5a914610423578063e985e9c51461045e578063f46c73c61461047e5761013d565b80636352211e146102dc57806370a08231146102fc57806394d008ef1461032a578063a22cb4651461034a578063ac9650d8146103655761013d565b806323b872dd116100f257806323b872dd1461022c57806342842e0e1461024c5780635a70a2831461026c5780636236f3b61461028157806362bc508a146102ae5761013d565b806301ffc9a714610145578063081812fc1461017a578063095ea7b3146101b257806318a8a6cf146101d25780631f9e3304146101ff5761013d565b3661013d5761013b610493565b005b61013b610493565b34801561015157600080fd5b50610165610160366004611b82565b6104a5565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061019a610195366004611b9f565b6104d0565b6040516001600160a01b039091168152602001610171565b3480156101be57600080fd5b5061013b6101cd366004611bcd565b6105b3565b3480156101de57600080fd5b506101f26101ed366004611b9f565b6105cc565b6040516101719190611cf0565b34801561020b57600080fd5b5061021f61021a366004611e39565b6109de565b6040516101719190611eea565b34801561023857600080fd5b5061013b610247366004611f30565b6109ea565b34801561025857600080fd5b5061013b610267366004611f30565b6109fa565b34801561027857600080fd5b5061019a610a15565b34801561028d57600080fd5b506102a161029c366004611b9f565b610a24565b6040516101719190612005565b3480156102ba57600080fd5b5061013b6102c93660046120c4565b6004805460ff1916911515919091179055565b3480156102e857600080fd5b5061019a6102f7366004611b9f565b610be7565b34801561030857600080fd5b5061031c6103173660046120e1565b610c85565b604051908152602001610171565b34801561033657600080fd5b5061013b61034536600461216d565b610d47565b34801561035657600080fd5b5061013b6101cd3660046121c5565b34801561037157600080fd5b506103856103803660046121fe565b610e3c565b6040516101719190612272565b34801561039e57600080fd5b5061013b6103ad3660046122d4565b610f30565b3480156103be57600080fd5b506103d26103cd366004612358565b610f42565b6040516101719291906123ba565b3480156103ec57600080fd5b5061031c6103fb366004611bcd565b6001600160a01b03919091166000908152600260209081526040808320938352929052205490565b34801561042f57600080fd5b507f73ad2146b3d3a286642c794379d750360a2d53a3459a11b3e5d6cc900f55f44a60405161017191906123d5565b34801561046a57600080fd5b506101656104793660046123ea565b61106f565b34801561048a57600080fd5b5061019a611121565b6104a361049e61115c565b61119b565b565b60006001600160e01b031982166332cc51a360e21b14806104ca57506104ca826111e8565b92915050565b6000806104dc83611228565b905060008160028111156104f2576104f2611f71565b036105185760405163e4c0734760e01b8152600481018490526024015b60405180910390fd5b6105206112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b815260040161056b91906123d5565b602060405180830381865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612418565b9392505050565b6040516341f8b8eb60e11b815260040160405180910390fd5b6105d4611a00565b600082815260016020908152604080832081518154610120948102820185019093526101008101838152909491938593919285929185015b828210156106ff576000848152602090206040805160808101825260038502909201805460e01b6001600160e01b031916918301918252600181018054919284929091849160608501919061066090612435565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612435565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b50505050508152505081526020016002820154815250508152602001906001019061060c565b505050908252506001820154602082015260028201546040808301919091526003830154606083015260048301546001600160a01b03811660808085019190915263ffffffff600160a01b8304811660a080870191909152600160c01b9093041660c08086019190915283519081019093526005850180546001600160e01b031960e091821b16928501928352600687018054919096019591938593928592918501916107ab90612435565b80601f01602080910402602001604051908101604052809291908181526020018280546107d790612435565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050509190925250505081526040805180820190915260028301805460e01b6001600160e01b03191682526003840180546020948501948401919061086890612435565b80601f016020809104026020016040519081016040528092919081815260200182805461089490612435565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050509190925250505081526040805180820190915260048301805460e01b6001600160e01b03191682526005840180546020948501948401919061092590612435565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612435565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050509190925250505081526040805180820190915260068301546001600160a01b03168152600790920154602083810191909152015290525092915050565b60606104ca30836112f1565b6109f58383836113b3565b505050565b6109f583838360405180602001604052806000815250610f30565b6000610a1f6112c1565b905090565b610a2c611a62565b60008281526003602090815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b82821015610b05576000848152602090206040805160a08101909152600384029091018054829060ff166006811115610a9d57610a9d611f71565b6006811115610aae57610aae611f71565b81528154610100810460ff161515602080840191909152620100009091046001600160a01b039081166040840152600180850154606085015260029094015416608090920191909152918352929092019101610a62565b505050908252506040805160808101909152600183018054602090930192829060ff166006811115610b3957610b39611f71565b6006811115610b4a57610b4a611f71565b8152600182015460208083019190915260028301546040808401919091526003909301546001600160a01b031660609283015292845281519081019091526005840180549390920192909190829060ff166006811115610bac57610bac611f71565b6006811115610bbd57610bbd611f71565b8152600182015460208201526002909101546001600160a01b031660409091015290525092915050565b600080610bf383611228565b90506000816002811115610c0957610c09611f71565b03610c2a5760405163e4c0734760e01b81526004810184905260240161050f565b6001816002811115610c3e57610c3e611f71565b03610c4b576105ac6112c1565b506000828152602081905260409020546001600160a01b0316806104ca5760405163e4c0734760e01b81526004810184905260240161050f565b60006001600160a01b038216610cae576040516323d3ad8160e21b815260040160405180910390fd5b6000610cb8611479565b9050806001600160a01b031663bfe0af99610cd16112c1565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201523060248201529086166044820152606401602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612469565b6001600160a01b038316610d6e5760405163c96c2a0b60e01b815260040160405180910390fd5b6000828152602081905260409020546001600160a01b031615610da7576040516376b78f6560e01b81526004810183905260240161050f565b610db360008484611579565b60008281526020819052604080822080546001600160a01b0319166001600160a01b03871690811790915590518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610e15600084848461163e565b6109f55760405162aae5b760e01b81526001600160a01b038416600482015260240161050f565b6060816001600160401b03811115610e5657610e56611df3565b604051908082528060200260200182016040528015610e8957816020015b6060815260200190600190039081610e745790505b50905060005b82811015610f2957610ef930858584818110610ead57610ead612482565b9050602002810190610ebf9190612498565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061174a92505050565b828281518110610f0b57610f0b612482565b60200260200101819052508080610f21906124fb565b915050610e8f565b5092915050565b610f3c8484848461176f565b50505050565b60008381526001602052604081206060908490610f5f8282612909565b505060008581526003602052604090208390610f7b8282612b41565b90505060005b610f8b8580612514565b9050811015611031576000610fdd610fa38780612514565b84818110610fb357610fb3612482565b9050602002810190610fc5919061255d565b610fcf908061255d565b610fd890612c80565b6117ad565b915087905060026000610ff660a08a0160808b016120e1565b6001600160a01b0316815260208082019290925260409081016000908120948152939091529091205580611029816124fb565b915050610f81565b505060045460408051808201909152601381527254686572652077617320616e206572726f722160681b602082015260ff9091169590945092505050565b60006110796112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016110c491906123d5565b602060405180830381865afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111059190612418565b6001600160a01b0316826001600160a01b031614905092915050565b6000610a1f61115c565b90565b6001600160a01b03163b151590565b6000611148836117d1565b80156105ac57506105ac8383611804565b50565b600061118c61112b60017f1cd3cead3f33d5ed74fb83a237e17d126ef505cbae350d3d0ffce421e3a1d144612cf5565b546001600160a01b0316919050565b6001600160a01b0381166111c25760405163eb0308d160e01b815260040160405180910390fd5b34366000803760008036600084865af13d6000803e8080156111e3573d6000f35b3d6000fd5b60006001600160e01b031982166394d008ef60e01b148061121957506001600160e01b031982166380ac58cd60e01b145b806104ca57506104ca82611898565b600080611233611479565b9050806001600160a01b0316633f09518c61124c6112c1565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606401602060405180830381865afa15801561129d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612d0c565b600061118c61112b60017fc57d320c8f1e45a5114285d6f31191434d3d45422aff570b70ab6787e45bcf00612cf5565b6060600082516001600160401b0381111561130e5761130e611df3565b604051908082528060200260200182016040528015611337578160200160208202803683370190505b509050611343846117d1565b156105ac5760005b83518110156113ab576113778585838151811061136a5761136a612482565b6020026020010151611804565b82828151811061138957611389612482565b91151560209283029190910190910152806113a3816124fb565b91505061134b565b509392505050565b6000818152602081905260409020546001600160a01b03166113eb5760405163074fede760e51b81526004810182905260240161050f565b6001600160a01b0382166114125760405163671d1add60e11b815260040160405180910390fd5b61141d838383611579565b60008181526020819052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006114836112c1565b6001600160a01b031663e3dedd6b7fa9bb56dd0bf7501666e4d616edd892185cdc45d735a001a809bd3db50c9004b86040518263ffffffff1660e01b81526004016114ce91906123d5565b602060405180830381865afa1580156114eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150f9190612418565b60405163ebf03f4960e01b81523060048201526001600160a01b03919091169063ebf03f4990602401602060405180830381865afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f9190612418565b6115816112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016115cc91906123d5565b602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d9190612418565b6001600160a01b0316336001600160a01b0316146109f557604051630fd6440760e01b815260040160405180910390fd5b60006001600160a01b0384163b61165757506001611742565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611689903390899088908890600401612d2d565b6020604051808303816000875af19250505080156116c4575060408051601f3d908101601f191682019092526116c191810190612d60565b60015b61172c573d8080156116f2576040519150601f19603f3d011682016040523d82523d6000602084013e6116f7565b606091505b5080516000036117245760405162aae5b760e01b81526001600160a01b038616600482015260240161050f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606105ac8383604051806060016040528060278152602001612dd1602791396118ea565b61177a8484846113b3565b6117868484848461163e565b610f3c5760405162aae5b760e01b81526001600160a01b038416600482015260240161050f565b60008082602001518060200190518101906117c89190612d7d565b91509150915091565b60006117e4826301ffc9a760e01b611804565b80156104ca57506117fd826001600160e01b0319611804565b1592915050565b6000806301ffc9a760e01b8360405160240161182091906123d5565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000806000602060008551602087018a617530fa92503d91506000519050828015611881575060208210155b801561188d5750600081115b979650505050505050565b60006001600160e01b03198216630b3888fd60e31b14806118c957506001600160e01b031982166301ffc9a760e01b145b806104ca57506104ca826118db61115c565b6001600160a01b03169061113d565b60606001600160a01b0384163b6119525760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161050f565b600080856001600160a01b03168560405161196d9190612dab565b600060405180830381855af49150503d80600081146119a8576040519150601f19603f3d011682016040523d82523d6000602084013e6119ad565b606091505b50915091506119bd8282866119c7565b9695505050505050565b606083156119d65750816105ac565b8251156119e65782518084602001fd5b8160405162461bcd60e51b815260040161050f9190612dbd565b6040518061010001604052806060815260200160008152602001600080191681526020016000815260200160006001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001611a5d611acc565b905290565b604051806060016040528060608152602001611aa960408051608081019091528060008152602001600081526020016000815260200160006001600160a01b031681525090565b815260408051606081018252600080825260208281018290529282015291015290565b6040805160c08101909152600060808201908152606060a083015281908152602001611b15604051806040016040528060006001600160e01b0319168152602001606081525090565b8152602001611b41604051806040016040528060006001600160e01b0319168152602001606081525090565b8152602001611a5d604051806040016040528060006001600160a01b03168152602001600081525090565b6001600160e01b03198116811461115957600080fd5b600060208284031215611b9457600080fd5b81356105ac81611b6c565b600060208284031215611bb157600080fd5b5035919050565b6001600160a01b038116811461115957600080fd5b60008060408385031215611be057600080fd5b8235611beb81611bb8565b946020939093013593505050565b60005b83811015611c14578181015183820152602001611bfc565b83811115610f3c5750506000910152565b60008151808452611c3d816020860160208601611bf9565b601f01601f19169290920160200192915050565b63ffffffff60e01b815116825260006020820151604060208501526117426040850182611c25565b6000815160a08452611c8e60a0850182611c51565b905060208301518482036020860152611ca78282611c51565b91505060408301518482036040860152611cc18282611c51565b60609485015180516001600160a01b031695870195909552602090940151608090950194909452509092915050565b602080825282516101008383018190528151610120850181905260009392610140600583901b87018101939185019290870190865b81811015611d6a5761013f19898703018352845160408151818952611d4c828a0182611c51565b928a0151988a01989098525095509386019391860191600101611d25565b505050838701516040870152604087015160608701526060870151608087015260808701519350611da660a08701856001600160a01b03169052565b60a087015163ffffffff811660c0880152935060c087015163ffffffff811660e0880152935060e08701519350601f1986840301818701525050611dea8183611c79565b95945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e3157611e31611df3565b604052919050565b60006020808385031215611e4c57600080fd5b82356001600160401b0380821115611e6357600080fd5b818501915085601f830112611e7757600080fd5b813581811115611e8957611e89611df3565b8060051b9150611e9a848301611e09565b8181529183018401918481019088841115611eb457600080fd5b938501935b83851015611ede5784359250611ece83611b6c565b8282529385019390850190611eb9565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611f24578351151583529284019291840191600101611f06565b50909695505050505050565b600080600060608486031215611f4557600080fd5b8335611f5081611bb8565b92506020840135611f6081611bb8565b929592945050506040919091013590565b634e487b7160e01b600052602160045260246000fd5b60078110611fa557634e487b7160e01b600052602160045260246000fd5b9052565b611fb4828251611f87565b60208181015190830152604080820151908301526060908101516001600160a01b0316910152565b611fe7828251611f87565b602081810151908301526040908101516001600160a01b0316910152565b6020808252825161010083830152805161012084018190526000929182019083906101408601905b8083101561208f578351612042838251611f87565b808601511515838701526040808201516001600160a01b0390811691850191909152606080830151908501526080918201511690830152928401926001929092019160a09091019061202d565b5092860151926120a26040870185611fa9565b604087015193506119bd60c0870185611fdc565b801515811461115957600080fd5b6000602082840312156120d657600080fd5b81356105ac816120b6565b6000602082840312156120f357600080fd5b81356105ac81611bb8565b600082601f83011261210f57600080fd5b81356001600160401b0381111561212857612128611df3565b61213b601f8201601f1916602001611e09565b81815284602083860101111561215057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561218257600080fd5b833561218d81611bb8565b92506020840135915060408401356001600160401b038111156121af57600080fd5b6121bb868287016120fe565b9150509250925092565b600080604083850312156121d857600080fd5b82356121e381611bb8565b915060208301356121f3816120b6565b809150509250929050565b6000806020838503121561221157600080fd5b82356001600160401b038082111561222857600080fd5b818501915085601f83011261223c57600080fd5b81358181111561224b57600080fd5b8660208260051b850101111561226057600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156122c757603f198886030184526122b5858351611c25565b94509285019290850190600101612299565b5092979650505050505050565b600080600080608085870312156122ea57600080fd5b84356122f581611bb8565b9350602085013561230581611bb8565b92506040850135915060608501356001600160401b0381111561232757600080fd5b612333878288016120fe565b91505092959194509250565b6000610100828403121561235257600080fd5b50919050565b60008060006060848603121561236d57600080fd5b8335925060208401356001600160401b038082111561238b57600080fd5b6123978783880161233f565b935060408601359150808211156123ad57600080fd5b506121bb8682870161233f565b82151581526040602082015260006117426040830184611c25565b6001600160e01b031991909116815260200190565b600080604083850312156123fd57600080fd5b823561240881611bb8565b915060208301356121f381611bb8565b60006020828403121561242a57600080fd5b81516105ac81611bb8565b600181811c9082168061244957607f821691505b60208210810361235257634e487b7160e01b600052602260045260246000fd5b60006020828403121561247b57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126124af57600080fd5b8301803591506001600160401b038211156124c957600080fd5b6020019150368190038213156124de57600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b60006001820161250d5761250d6124e5565b5060010190565b6000808335601e1984360301811261252b57600080fd5b8301803591506001600160401b0382111561254557600080fd5b6020019150600581901b36038213156124de57600080fd5b60008235603e1983360301811261257357600080fd5b9190910192915050565b5b81811015612592576000815560010161257e565b5050565b601f8211156109f557806000526020600020601f840160051c810160208510156125bd5750805b6125cf601f850160051c83018261257d565b5050505050565b81356125e181611b6c565b8060e01c63ffffffff19835416178255506001808201602080850135601e1986360301811261260f57600080fd5b850180356001600160401b0381111561262757600080fd5b803603838301131561263857600080fd5b61264c816126468654612435565b86612596565b6000601f821160018114612682576000831561266a57508382018501355b600019600385901b1c1916600184901b1786556126db565b600086815260209020601f19841690835b828110156126b257868501880135825593870193908901908701612693565b50848210156126d15760001960f88660031b161c198785880101351681555b50508683881b0186555b505050505050505050565b6126f96126f3838461255d565b826125d6565b602082013560028201555050565b600160401b83111561271b5761271b611df3565b805483825580841015612801577f5555555555555555555555555555555555555555555555555555555555555555600181831181161561275d5761275d6124e5565b6003828711821615612771576127716124e5565b600085815260208120909350878202810190828602015b808210156127fb578482558382016127a08154612435565b80156127e957601f808211600181146127bb578884556127e6565b6000848152602090206127d783850160051c82018a830161257d565b50600084815260208120818655555b50505b50508460028301558282019150612788565b50505050505b5060008181526020812083915b8581101561283f57612829612823848761255d565b836126e6565b602092909201916003919091019060010161280e565b505050505050565b600081356104ca81611bb8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000813563ffffffff811681146104ca57600080fd5b60008235609e1983360301811261257357600080fd5b6128ad6126f3838461255d565b6128c66128bd602084018461255d565b600283016125d6565b6128df6128d6604084018461255d565b600483016125d6565b60608201356128ed81611bb8565b6128fa8160068401612854565b50608082013560078201555050565b8135601e1983360301811261291d57600080fd5b820180356001600160401b0381111561293557600080fd5b6020820191508060051b360382131561294d57600080fd5b612958818385612707565b50506020820135600182015560408201356002820155606082013560038201556004810161299161298b60808501612847565b82612854565b6129c46129a060a08501612874565b82805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b6129f76129d360c08501612874565b82805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b50612592612a0860e084018461288a565b600583016128a0565b60008135600781106104ca57600080fd5b60078210612a4057634e487b7160e01b600052602160045260246000fd5b60ff1981541660ff831681178255505050565b612a65612a5f83612a11565b82612a22565b6020820135612a73816120b6565b815461ff0019811691151560081b61ff001691821783556040840135612a9881611bb8565b610100600160b01b03199190911690911760109190911b62010000600160b01b0316178155606082013560018201556080820135612ad581611bb8565b6109f58160028401612854565b612aee612a5f83612a11565b60208201356001820155604082013560028201556060820135612b1081611bb8565b6109f58160038401612854565b612b29612a5f83612a11565b602082013560018201556040820135612ad581611bb8565b8135601e19833603018112612b5557600080fd5b820180356001600160401b03811115612b6d57600080fd5b60208201915060a08082023603831315612b8657600080fd5b600160401b821115612b9a57612b9a611df3565b835482855580831015612c2d577f55555555555555555555555555555555555555555555555555555555555555556001818311811615612bdc57612bdc6124e5565b6003828611821615612bf057612bf06124e5565b600088815260208120909350868202810190828602015b80821015612c275784825584848301558460028301558282019150612c07565b50505050505b5060008481526020902060005b83811015612c5f57612c4c8583612a53565b9382019360039190910190600101612c3a565b5050612c716020860160018601612ae2565b6125cf81860160058601612b1d565b600060408236031215612c9257600080fd5b604051604081016001600160401b038282108183111715612cb557612cb5611df3565b8160405284359150612cc682611b6c565b90825260208401359080821115612cdc57600080fd5b50612ce9368286016120fe565b60208301525092915050565b600082821015612d0757612d076124e5565b500390565b600060208284031215612d1e57600080fd5b8151600381106105ac57600080fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119bd90830184611c25565b600060208284031215612d7257600080fd5b81516105ac81611b6c565b60008060408385031215612d9057600080fd5b8251612d9b81611bb8565b6020939093015192949293505050565b60008251612573818460208701611bf9565b6020815260006105ac6020830184611c2556fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ed47957bea1e5a562e1159154ead4e0eb00b2edc213ea0c59efa0b9c3ea1176a64736f6c634300080d0033c2221768d9692f01d28cc433c84b2dc197fbcc867663b61d61e17ca4877697fa37e69e8e563db672cb7e105d3e1915d10ef53975d285d458a13e70818bf53d27",
  "deployedBytecode": "0x60806040526004361061012e5760003560e01c80636352211e116100ab578063b88d4fde1161006f578063b88d4fde14610392578063cb31468c146103b2578063d1cd1837146103e0578063e846a5a914610423578063e985e9c51461045e578063f46c73c61461047e5761013d565b80636352211e146102dc57806370a08231146102fc57806394d008ef1461032a578063a22cb4651461034a578063ac9650d8146103655761013d565b806323b872dd116100f257806323b872dd1461022c57806342842e0e1461024c5780635a70a2831461026c5780636236f3b61461028157806362bc508a146102ae5761013d565b806301ffc9a714610145578063081812fc1461017a578063095ea7b3146101b257806318a8a6cf146101d25780631f9e3304146101ff5761013d565b3661013d5761013b610493565b005b61013b610493565b34801561015157600080fd5b50610165610160366004611b82565b6104a5565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061019a610195366004611b9f565b6104d0565b6040516001600160a01b039091168152602001610171565b3480156101be57600080fd5b5061013b6101cd366004611bcd565b6105b3565b3480156101de57600080fd5b506101f26101ed366004611b9f565b6105cc565b6040516101719190611cf0565b34801561020b57600080fd5b5061021f61021a366004611e39565b6109de565b6040516101719190611eea565b34801561023857600080fd5b5061013b610247366004611f30565b6109ea565b34801561025857600080fd5b5061013b610267366004611f30565b6109fa565b34801561027857600080fd5b5061019a610a15565b34801561028d57600080fd5b506102a161029c366004611b9f565b610a24565b6040516101719190612005565b3480156102ba57600080fd5b5061013b6102c93660046120c4565b6004805460ff1916911515919091179055565b3480156102e857600080fd5b5061019a6102f7366004611b9f565b610be7565b34801561030857600080fd5b5061031c6103173660046120e1565b610c85565b604051908152602001610171565b34801561033657600080fd5b5061013b61034536600461216d565b610d47565b34801561035657600080fd5b5061013b6101cd3660046121c5565b34801561037157600080fd5b506103856103803660046121fe565b610e3c565b6040516101719190612272565b34801561039e57600080fd5b5061013b6103ad3660046122d4565b610f30565b3480156103be57600080fd5b506103d26103cd366004612358565b610f42565b6040516101719291906123ba565b3480156103ec57600080fd5b5061031c6103fb366004611bcd565b6001600160a01b03919091166000908152600260209081526040808320938352929052205490565b34801561042f57600080fd5b507f73ad2146b3d3a286642c794379d750360a2d53a3459a11b3e5d6cc900f55f44a60405161017191906123d5565b34801561046a57600080fd5b506101656104793660046123ea565b61106f565b34801561048a57600080fd5b5061019a611121565b6104a361049e61115c565b61119b565b565b60006001600160e01b031982166332cc51a360e21b14806104ca57506104ca826111e8565b92915050565b6000806104dc83611228565b905060008160028111156104f2576104f2611f71565b036105185760405163e4c0734760e01b8152600481018490526024015b60405180910390fd5b6105206112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b815260040161056b91906123d5565b602060405180830381865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612418565b9392505050565b6040516341f8b8eb60e11b815260040160405180910390fd5b6105d4611a00565b600082815260016020908152604080832081518154610120948102820185019093526101008101838152909491938593919285929185015b828210156106ff576000848152602090206040805160808101825260038502909201805460e01b6001600160e01b031916918301918252600181018054919284929091849160608501919061066090612435565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612435565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b50505050508152505081526020016002820154815250508152602001906001019061060c565b505050908252506001820154602082015260028201546040808301919091526003830154606083015260048301546001600160a01b03811660808085019190915263ffffffff600160a01b8304811660a080870191909152600160c01b9093041660c08086019190915283519081019093526005850180546001600160e01b031960e091821b16928501928352600687018054919096019591938593928592918501916107ab90612435565b80601f01602080910402602001604051908101604052809291908181526020018280546107d790612435565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050509190925250505081526040805180820190915260028301805460e01b6001600160e01b03191682526003840180546020948501948401919061086890612435565b80601f016020809104026020016040519081016040528092919081815260200182805461089490612435565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050509190925250505081526040805180820190915260048301805460e01b6001600160e01b03191682526005840180546020948501948401919061092590612435565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612435565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050509190925250505081526040805180820190915260068301546001600160a01b03168152600790920154602083810191909152015290525092915050565b60606104ca30836112f1565b6109f58383836113b3565b505050565b6109f583838360405180602001604052806000815250610f30565b6000610a1f6112c1565b905090565b610a2c611a62565b60008281526003602090815260408083208151815460809481028201850190935260608101838152909491938593919285929185015b82821015610b05576000848152602090206040805160a08101909152600384029091018054829060ff166006811115610a9d57610a9d611f71565b6006811115610aae57610aae611f71565b81528154610100810460ff161515602080840191909152620100009091046001600160a01b039081166040840152600180850154606085015260029094015416608090920191909152918352929092019101610a62565b505050908252506040805160808101909152600183018054602090930192829060ff166006811115610b3957610b39611f71565b6006811115610b4a57610b4a611f71565b8152600182015460208083019190915260028301546040808401919091526003909301546001600160a01b031660609283015292845281519081019091526005840180549390920192909190829060ff166006811115610bac57610bac611f71565b6006811115610bbd57610bbd611f71565b8152600182015460208201526002909101546001600160a01b031660409091015290525092915050565b600080610bf383611228565b90506000816002811115610c0957610c09611f71565b03610c2a5760405163e4c0734760e01b81526004810184905260240161050f565b6001816002811115610c3e57610c3e611f71565b03610c4b576105ac6112c1565b506000828152602081905260409020546001600160a01b0316806104ca5760405163e4c0734760e01b81526004810184905260240161050f565b60006001600160a01b038216610cae576040516323d3ad8160e21b815260040160405180910390fd5b6000610cb8611479565b9050806001600160a01b031663bfe0af99610cd16112c1565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201523060248201529086166044820152606401602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612469565b6001600160a01b038316610d6e5760405163c96c2a0b60e01b815260040160405180910390fd5b6000828152602081905260409020546001600160a01b031615610da7576040516376b78f6560e01b81526004810183905260240161050f565b610db360008484611579565b60008281526020819052604080822080546001600160a01b0319166001600160a01b03871690811790915590518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610e15600084848461163e565b6109f55760405162aae5b760e01b81526001600160a01b038416600482015260240161050f565b6060816001600160401b03811115610e5657610e56611df3565b604051908082528060200260200182016040528015610e8957816020015b6060815260200190600190039081610e745790505b50905060005b82811015610f2957610ef930858584818110610ead57610ead612482565b9050602002810190610ebf9190612498565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061174a92505050565b828281518110610f0b57610f0b612482565b60200260200101819052508080610f21906124fb565b915050610e8f565b5092915050565b610f3c8484848461176f565b50505050565b60008381526001602052604081206060908490610f5f8282612909565b505060008581526003602052604090208390610f7b8282612b41565b90505060005b610f8b8580612514565b9050811015611031576000610fdd610fa38780612514565b84818110610fb357610fb3612482565b9050602002810190610fc5919061255d565b610fcf908061255d565b610fd890612c80565b6117ad565b915087905060026000610ff660a08a0160808b016120e1565b6001600160a01b0316815260208082019290925260409081016000908120948152939091529091205580611029816124fb565b915050610f81565b505060045460408051808201909152601381527254686572652077617320616e206572726f722160681b602082015260ff9091169590945092505050565b60006110796112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016110c491906123d5565b602060405180830381865afa1580156110e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111059190612418565b6001600160a01b0316826001600160a01b031614905092915050565b6000610a1f61115c565b90565b6001600160a01b03163b151590565b6000611148836117d1565b80156105ac57506105ac8383611804565b50565b600061118c61112b60017f1cd3cead3f33d5ed74fb83a237e17d126ef505cbae350d3d0ffce421e3a1d144612cf5565b546001600160a01b0316919050565b6001600160a01b0381166111c25760405163eb0308d160e01b815260040160405180910390fd5b34366000803760008036600084865af13d6000803e8080156111e3573d6000f35b3d6000fd5b60006001600160e01b031982166394d008ef60e01b148061121957506001600160e01b031982166380ac58cd60e01b145b806104ca57506104ca82611898565b600080611233611479565b9050806001600160a01b0316633f09518c61124c6112c1565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606401602060405180830381865afa15801561129d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612d0c565b600061118c61112b60017fc57d320c8f1e45a5114285d6f31191434d3d45422aff570b70ab6787e45bcf00612cf5565b6060600082516001600160401b0381111561130e5761130e611df3565b604051908082528060200260200182016040528015611337578160200160208202803683370190505b509050611343846117d1565b156105ac5760005b83518110156113ab576113778585838151811061136a5761136a612482565b6020026020010151611804565b82828151811061138957611389612482565b91151560209283029190910190910152806113a3816124fb565b91505061134b565b509392505050565b6000818152602081905260409020546001600160a01b03166113eb5760405163074fede760e51b81526004810182905260240161050f565b6001600160a01b0382166114125760405163671d1add60e11b815260040160405180910390fd5b61141d838383611579565b60008181526020819052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006114836112c1565b6001600160a01b031663e3dedd6b7fa9bb56dd0bf7501666e4d616edd892185cdc45d735a001a809bd3db50c9004b86040518263ffffffff1660e01b81526004016114ce91906123d5565b602060405180830381865afa1580156114eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150f9190612418565b60405163ebf03f4960e01b81523060048201526001600160a01b03919091169063ebf03f4990602401602060405180830381865afa158015611555573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f9190612418565b6115816112c1565b6001600160a01b031663e3dedd6b7f9b4d0cb4e76b932bf6c979cd152d23fb4da2bb167c72cceed92f670a5328c4c36040518263ffffffff1660e01b81526004016115cc91906123d5565b602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d9190612418565b6001600160a01b0316336001600160a01b0316146109f557604051630fd6440760e01b815260040160405180910390fd5b60006001600160a01b0384163b61165757506001611742565b604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611689903390899088908890600401612d2d565b6020604051808303816000875af19250505080156116c4575060408051601f3d908101601f191682019092526116c191810190612d60565b60015b61172c573d8080156116f2576040519150601f19603f3d011682016040523d82523d6000602084013e6116f7565b606091505b5080516000036117245760405162aae5b760e01b81526001600160a01b038616600482015260240161050f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606105ac8383604051806060016040528060278152602001612dd1602791396118ea565b61177a8484846113b3565b6117868484848461163e565b610f3c5760405162aae5b760e01b81526001600160a01b038416600482015260240161050f565b60008082602001518060200190518101906117c89190612d7d565b91509150915091565b60006117e4826301ffc9a760e01b611804565b80156104ca57506117fd826001600160e01b0319611804565b1592915050565b6000806301ffc9a760e01b8360405160240161182091906123d5565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000806000602060008551602087018a617530fa92503d91506000519050828015611881575060208210155b801561188d5750600081115b979650505050505050565b60006001600160e01b03198216630b3888fd60e31b14806118c957506001600160e01b031982166301ffc9a760e01b145b806104ca57506104ca826118db61115c565b6001600160a01b03169061113d565b60606001600160a01b0384163b6119525760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161050f565b600080856001600160a01b03168560405161196d9190612dab565b600060405180830381855af49150503d80600081146119a8576040519150601f19603f3d011682016040523d82523d6000602084013e6119ad565b606091505b50915091506119bd8282866119c7565b9695505050505050565b606083156119d65750816105ac565b8251156119e65782518084602001fd5b8160405162461bcd60e51b815260040161050f9190612dbd565b6040518061010001604052806060815260200160008152602001600080191681526020016000815260200160006001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001611a5d611acc565b905290565b604051806060016040528060608152602001611aa960408051608081019091528060008152602001600081526020016000815260200160006001600160a01b031681525090565b815260408051606081018252600080825260208281018290529282015291015290565b6040805160c08101909152600060808201908152606060a083015281908152602001611b15604051806040016040528060006001600160e01b0319168152602001606081525090565b8152602001611b41604051806040016040528060006001600160e01b0319168152602001606081525090565b8152602001611a5d604051806040016040528060006001600160a01b03168152602001600081525090565b6001600160e01b03198116811461115957600080fd5b600060208284031215611b9457600080fd5b81356105ac81611b6c565b600060208284031215611bb157600080fd5b5035919050565b6001600160a01b038116811461115957600080fd5b60008060408385031215611be057600080fd5b8235611beb81611bb8565b946020939093013593505050565b60005b83811015611c14578181015183820152602001611bfc565b83811115610f3c5750506000910152565b60008151808452611c3d816020860160208601611bf9565b601f01601f19169290920160200192915050565b63ffffffff60e01b815116825260006020820151604060208501526117426040850182611c25565b6000815160a08452611c8e60a0850182611c51565b905060208301518482036020860152611ca78282611c51565b91505060408301518482036040860152611cc18282611c51565b60609485015180516001600160a01b031695870195909552602090940151608090950194909452509092915050565b602080825282516101008383018190528151610120850181905260009392610140600583901b87018101939185019290870190865b81811015611d6a5761013f19898703018352845160408151818952611d4c828a0182611c51565b928a0151988a01989098525095509386019391860191600101611d25565b505050838701516040870152604087015160608701526060870151608087015260808701519350611da660a08701856001600160a01b03169052565b60a087015163ffffffff811660c0880152935060c087015163ffffffff811660e0880152935060e08701519350601f1986840301818701525050611dea8183611c79565b95945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611e3157611e31611df3565b604052919050565b60006020808385031215611e4c57600080fd5b82356001600160401b0380821115611e6357600080fd5b818501915085601f830112611e7757600080fd5b813581811115611e8957611e89611df3565b8060051b9150611e9a848301611e09565b8181529183018401918481019088841115611eb457600080fd5b938501935b83851015611ede5784359250611ece83611b6c565b8282529385019390850190611eb9565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611f24578351151583529284019291840191600101611f06565b50909695505050505050565b600080600060608486031215611f4557600080fd5b8335611f5081611bb8565b92506020840135611f6081611bb8565b929592945050506040919091013590565b634e487b7160e01b600052602160045260246000fd5b60078110611fa557634e487b7160e01b600052602160045260246000fd5b9052565b611fb4828251611f87565b60208181015190830152604080820151908301526060908101516001600160a01b0316910152565b611fe7828251611f87565b602081810151908301526040908101516001600160a01b0316910152565b6020808252825161010083830152805161012084018190526000929182019083906101408601905b8083101561208f578351612042838251611f87565b808601511515838701526040808201516001600160a01b0390811691850191909152606080830151908501526080918201511690830152928401926001929092019160a09091019061202d565b5092860151926120a26040870185611fa9565b604087015193506119bd60c0870185611fdc565b801515811461115957600080fd5b6000602082840312156120d657600080fd5b81356105ac816120b6565b6000602082840312156120f357600080fd5b81356105ac81611bb8565b600082601f83011261210f57600080fd5b81356001600160401b0381111561212857612128611df3565b61213b601f8201601f1916602001611e09565b81815284602083860101111561215057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561218257600080fd5b833561218d81611bb8565b92506020840135915060408401356001600160401b038111156121af57600080fd5b6121bb868287016120fe565b9150509250925092565b600080604083850312156121d857600080fd5b82356121e381611bb8565b915060208301356121f3816120b6565b809150509250929050565b6000806020838503121561221157600080fd5b82356001600160401b038082111561222857600080fd5b818501915085601f83011261223c57600080fd5b81358181111561224b57600080fd5b8660208260051b850101111561226057600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156122c757603f198886030184526122b5858351611c25565b94509285019290850190600101612299565b5092979650505050505050565b600080600080608085870312156122ea57600080fd5b84356122f581611bb8565b9350602085013561230581611bb8565b92506040850135915060608501356001600160401b0381111561232757600080fd5b612333878288016120fe565b91505092959194509250565b6000610100828403121561235257600080fd5b50919050565b60008060006060848603121561236d57600080fd5b8335925060208401356001600160401b038082111561238b57600080fd5b6123978783880161233f565b935060408601359150808211156123ad57600080fd5b506121bb8682870161233f565b82151581526040602082015260006117426040830184611c25565b6001600160e01b031991909116815260200190565b600080604083850312156123fd57600080fd5b823561240881611bb8565b915060208301356121f381611bb8565b60006020828403121561242a57600080fd5b81516105ac81611bb8565b600181811c9082168061244957607f821691505b60208210810361235257634e487b7160e01b600052602260045260246000fd5b60006020828403121561247b57600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126124af57600080fd5b8301803591506001600160401b038211156124c957600080fd5b6020019150368190038213156124de57600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b60006001820161250d5761250d6124e5565b5060010190565b6000808335601e1984360301811261252b57600080fd5b8301803591506001600160401b0382111561254557600080fd5b6020019150600581901b36038213156124de57600080fd5b60008235603e1983360301811261257357600080fd5b9190910192915050565b5b81811015612592576000815560010161257e565b5050565b601f8211156109f557806000526020600020601f840160051c810160208510156125bd5750805b6125cf601f850160051c83018261257d565b5050505050565b81356125e181611b6c565b8060e01c63ffffffff19835416178255506001808201602080850135601e1986360301811261260f57600080fd5b850180356001600160401b0381111561262757600080fd5b803603838301131561263857600080fd5b61264c816126468654612435565b86612596565b6000601f821160018114612682576000831561266a57508382018501355b600019600385901b1c1916600184901b1786556126db565b600086815260209020601f19841690835b828110156126b257868501880135825593870193908901908701612693565b50848210156126d15760001960f88660031b161c198785880101351681555b50508683881b0186555b505050505050505050565b6126f96126f3838461255d565b826125d6565b602082013560028201555050565b600160401b83111561271b5761271b611df3565b805483825580841015612801577f5555555555555555555555555555555555555555555555555555555555555555600181831181161561275d5761275d6124e5565b6003828711821615612771576127716124e5565b600085815260208120909350878202810190828602015b808210156127fb578482558382016127a08154612435565b80156127e957601f808211600181146127bb578884556127e6565b6000848152602090206127d783850160051c82018a830161257d565b50600084815260208120818655555b50505b50508460028301558282019150612788565b50505050505b5060008181526020812083915b8581101561283f57612829612823848761255d565b836126e6565b602092909201916003919091019060010161280e565b505050505050565b600081356104ca81611bb8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000813563ffffffff811681146104ca57600080fd5b60008235609e1983360301811261257357600080fd5b6128ad6126f3838461255d565b6128c66128bd602084018461255d565b600283016125d6565b6128df6128d6604084018461255d565b600483016125d6565b60608201356128ed81611bb8565b6128fa8160068401612854565b50608082013560078201555050565b8135601e1983360301811261291d57600080fd5b820180356001600160401b0381111561293557600080fd5b6020820191508060051b360382131561294d57600080fd5b612958818385612707565b50506020820135600182015560408201356002820155606082013560038201556004810161299161298b60808501612847565b82612854565b6129c46129a060a08501612874565b82805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b6129f76129d360c08501612874565b82805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b50612592612a0860e084018461288a565b600583016128a0565b60008135600781106104ca57600080fd5b60078210612a4057634e487b7160e01b600052602160045260246000fd5b60ff1981541660ff831681178255505050565b612a65612a5f83612a11565b82612a22565b6020820135612a73816120b6565b815461ff0019811691151560081b61ff001691821783556040840135612a9881611bb8565b610100600160b01b03199190911690911760109190911b62010000600160b01b0316178155606082013560018201556080820135612ad581611bb8565b6109f58160028401612854565b612aee612a5f83612a11565b60208201356001820155604082013560028201556060820135612b1081611bb8565b6109f58160038401612854565b612b29612a5f83612a11565b602082013560018201556040820135612ad581611bb8565b8135601e19833603018112612b5557600080fd5b820180356001600160401b03811115612b6d57600080fd5b60208201915060a08082023603831315612b8657600080fd5b600160401b821115612b9a57612b9a611df3565b835482855580831015612c2d577f55555555555555555555555555555555555555555555555555555555555555556001818311811615612bdc57612bdc6124e5565b6003828611821615612bf057612bf06124e5565b600088815260208120909350868202810190828602015b80821015612c275784825584848301558460028301558282019150612c07565b50505050505b5060008481526020902060005b83811015612c5f57612c4c8583612a53565b9382019360039190910190600101612c3a565b5050612c716020860160018601612ae2565b6125cf81860160058601612b1d565b600060408236031215612c9257600080fd5b604051604081016001600160401b038282108183111715612cb557612cb5611df3565b8160405284359150612cc682611b6c565b90825260208401359080821115612cdc57600080fd5b50612ce9368286016120fe565b60208301525092915050565b600082821015612d0757612d076124e5565b500390565b600060208284031215612d1e57600080fd5b8151600381106105ac57600080fd5b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119bd90830184611c25565b600060208284031215612d7257600080fd5b81516105ac81611b6c565b60008060408385031215612d9057600080fd5b8251612d9b81611bb8565b6020939093015192949293505050565b60008251612573818460208701611bf9565b6020815260006105ac6020830184611c2556fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ed47957bea1e5a562e1159154ead4e0eb00b2edc213ea0c59efa0b9c3ea1176a64736f6c634300080d0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
