{
  "_format": "hh-sol-artifact-1",
  "contractName": "DVATransferManager",
  "sourceName": "contracts/DVA/DVATransferManager.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        }
      ],
      "name": "ApprovalsMustBeSequential",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "_approver",
          "type": "address"
        }
      ],
      "name": "ApproverNotFound",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenAddress",
          "type": "address"
        }
      ],
      "name": "DVAManagerIsNotVerifiedForTheToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        }
      ],
      "name": "InvalidTransferID",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenAddress",
          "type": "address"
        }
      ],
      "name": "OnlyTokenAgentCanCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        }
      ],
      "name": "OnlyTransferSenderCanCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "RecipientIsNotVerified",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        }
      ],
      "name": "SignaturesCanNotBeEmpty",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenAddress",
          "type": "address"
        }
      ],
      "name": "TokenIsNotRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_transferID",
          "type": "bytes32"
        }
      ],
      "name": "TransferIsNotInPendingStatus",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "includeRecipientApprover",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "includeAgentApprover",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "sequentialApproval",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "additionalApprovers",
          "type": "address[]"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "hash",
          "type": "bytes32"
        }
      ],
      "name": "ApprovalCriteriaSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "approvalCriteriaHash",
          "type": "bytes32"
        }
      ],
      "name": "TransferApprovalStateReset",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "approver",
          "type": "address"
        }
      ],
      "name": "TransferApproved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "TransferCancelled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "TransferCompleted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "approvalCriteriaHash",
          "type": "bytes32"
        }
      ],
      "name": "TransferInitiated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "rejectedBy",
          "type": "address"
        }
      ],
      "name": "TransferRejected",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "approveTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_nonce",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "calculateTransferID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "cancelTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "v",
              "type": "uint8"
            },
            {
              "internalType": "bytes32",
              "name": "r",
              "type": "bytes32"
            },
            {
              "internalType": "bytes32",
              "name": "s",
              "type": "bytes32"
            }
          ],
          "internalType": "struct IDVATransferManager.Signature[]",
          "name": "signatures",
          "type": "tuple[]"
        }
      ],
      "name": "delegateApproveTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        }
      ],
      "name": "getApprovalCriteria",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "includeRecipientApprover",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "includeAgentApprover",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "sequentialApproval",
              "type": "bool"
            },
            {
              "internalType": "address[]",
              "name": "additionalApprovers",
              "type": "address[]"
            },
            {
              "internalType": "bytes32",
              "name": "hash",
              "type": "bytes32"
            }
          ],
          "internalType": "struct IDVATransferManager.ApprovalCriteria",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "getNextApprover",
      "outputs": [
        {
          "internalType": "address",
          "name": "nextApprover",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "anyTokenAgent",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNextTxNonce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "getTransfer",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "enum IDVATransferManager.TransferStatus",
              "name": "status",
              "type": "uint8"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "wallet",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "anyTokenAgent",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "internalType": "struct IDVATransferManager.Approver[]",
              "name": "approvers",
              "type": "tuple[]"
            },
            {
              "internalType": "bytes32",
              "name": "approvalCriteriaHash",
              "type": "bytes32"
            }
          ],
          "internalType": "struct IDVATransferManager.Transfer",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "initiateTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "transferID",
          "type": "bytes32"
        }
      ],
      "name": "rejectTransfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "includeRecipientApprover",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "includeAgentApprover",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "sequentialApproval",
          "type": "bool"
        },
        {
          "internalType": "address[]",
          "name": "additionalApprovers",
          "type": "address[]"
        }
      ],
      "name": "setApprovalCriteria",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b5060006002556123da806100256000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b329bf5c11610071578063b329bf5c14610170578063ba33984a14610183578063bc0755e114610196578063c341a1c2146101a9578063c38756cc146101bc578063dd1db9cf146101ee57600080fd5b806306fdde03146100b9578063260958a5146100f65780636e710bf3146101165780637087dbf91461012b5780637fbeb89c1461013d57806390906f9d14610150575b600080fd5b6040805180820182526012815271222b20aa3930b739b332b926b0b730b3b2b960711b602082015290516100ed9190611d79565b60405180910390f35b610109610104366004611dc7565b610201565b6040516100ed9190611e54565b610129610124366004611f9e565b610389565b005b6002545b6040519081526020016100ed565b61012961014b366004611dc7565b61062a565b61016361015e36600461208a565b610a4d565b6040516100ed91906120e7565b61012961017e366004611dc7565b610b5d565b610129610191366004611dc7565b610cd6565b6101296101a436600461213d565b610d1a565b61012f6101b736600461217e565b611082565b6101cf6101ca366004611dc7565b6110de565b604080516001600160a01b0390931683529015156020830152016100ed565b6101296101fc3660046121c6565b6111a7565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c08101919091526000828152600160208181526040808420815160e08101835281546001600160a01b0390811682529482015485169381019390935260028101549093169082015260038083015460608301526004830154919291608084019160ff909116908111156102a7576102a7611de0565b60038111156102b8576102b8611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561033c57600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016102e1565b505050908252506006919091015460209091015280519091506001600160a01b03166103835760405163026c8dbb60e11b8152600481018490526024015b60405180910390fd5b92915050565b6040516307feec1960e21b81523360048201526001600160a01b03861690631ffbb06490602401602060405180830381865afa1580156103cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f191906122a0565b61041957604051636d0fd92960e01b81526001600160a01b038616600482015260240161037a565b846001600160a01b031663134e18f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b91906122bd565b60405163b9209e3360e01b81523060048201526001600160a01b03919091169063b9209e3390602401602060405180830381865afa1580156104c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e591906122a0565b61050d576040516379a7abb760e01b81526001600160a01b038616600482015260240161037a565b60008585858460405160200161052694939291906122da565b60408051601f19818403018152828252805160209182012060a084018352881515845287151584830190815287151585850190815260608601888152608087018490526001600160a01b038d1660009081528086529590952086518154935192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909516949094171791909116919091178155925180519195506105d3926001850192910190611cbf565b50608082015181600201559050507f690b0e7ac1907911c2428d54c3bdcaccd20f5c78b030cb2f008a75e590e99ac286868686868660405161061a96959493929190612318565b60405180910390a1505050505050565b600061063582611330565b905061064182826113a5565b1561064a575050565b80546001600160a01b0316600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552869592946060860193909291908301828280156106ed57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106cf575b50505050508152602001600282015481525050905060005b60058401548110156108e457600084600501828154811061072857610728612367565b60009182526020909120018054909150600160a81b900460ff161561074d57506108d2565b6040805160e08101825286546001600160a01b039081168252600188015481166020830152600288015416918101919091526003808701546060830152600487015461089b92918891608084019160ff909116908111156107b0576107b0611de0565b60038111156107c1576107c1611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561084557600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016107ea565b50505090825250600691909101546020918201526040805160608101825285546001600160a01b038116825260ff600160a01b82048116151594830194909452600160a81b9004909216151590820152336114de565b156108aa5760019350506108e4565b8260400151156108d05760405163112e219560e31b81526004810187905260240161037a565b505b806108dc8161237d565b915050610705565b508161090c57604051635788a87b60e01b81526004810185905233602482015260440161037a565b60048301805460ff191660039081179091556040805160e08101825285546001600160a01b03908116825260018701548116602083015260028701541691810191909152818501546060820152610a0f9185906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156109e857600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b9091041615159082015282526001909201910161098d565b505050908252506006919091015460209091015260018501546001600160a01b0316611594565b604080518581523360208201527fa42ddc86614a20e359b00eb1ed42b716b911ca4c69b6af8044306d7de36b35e4910160405180910390a150505050565b6040805160a08101825260008082526020820181905291810182905260608082015260808101919091526001600160a01b038216600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290830182828015610b1857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610afa575b505050918352505060029190910154602090910152608081015190915061038357604051635c1b86b760e11b81526001600160a01b038416600482015260240161037a565b6000610b6882611330565b60018101549091506001600160a01b03163314610b9b5760405163a859598f60e01b81526004810183905260240161037a565b60048101805460ff191660029081179091556040805160e08101825283546001600160a01b03908116825260018501548116602083015283850154169181019190915260038301546060820152610c9e9183906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b82821015610c7757600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b90910416151590820152825260019092019101610c1c565b505050908252506006919091015460209091015260018301546001600160a01b0316611594565b6040518281527f2e936050b1807500251bb54605979b74ee4e0e31a0fcba9f12b51d99496c20fa906020015b60405180910390a15050565b6000610ce182611330565b9050610ced82826113a5565b15610cf6575050565b6000610d0383833361160f565b90508015610d1557610d158383611989565b505050565b6001600160a01b038316600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290830182828015610dbb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d9d575b5050509183525050600291909101546020909101526080810151909150610e0057604051635c1b86b760e11b81526001600160a01b038516600482015260240161037a565b6000849050806001600160a01b031663134e18f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906122bd565b60405163b9209e3360e01b81526001600160a01b038681166004830152919091169063b9209e3390602401602060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed391906122a0565b610f0357604051636178e7e560e11b81526001600160a01b0380871660048301528516602482015260440161037a565b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038216906323b872dd906064016020604051808303816000875af1158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a91906122a0565b506002805460009182610f8c8361237d565b9190505590506000610fa082338888611082565b600081815260016020819052604090912080546001600160a01b038b81166001600160a01b03199283161783559282018054821633179055600282018054938b1693909116929092179091556003810187905560048101805460ff19169055608086015160068201559091506110168186611af4565b608085810151604080518581526001600160a01b038c8116602083015233828401528b16606082015292830189905260a0830191909152517f6bb4a01617c492fa626ed5665cf4a461d4c1c6eeb7f3d910b41b47667348882d9181900360c00190a15050505050505050565b600080858585856040516020016110bc94939291909384526001600160a01b03928316602085015291166040830152606082015260800190565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060006110ec84611330565b905060005b60058201548110156111a05781600501818154811061111257611112612367565b600091825260209091200154600160a81b900460ff1661118e5781600501818154811061114157611141612367565b6000918252602090912001546005830180546001600160a01b039092169550908290811061117157611171612367565b600091825260209091200154600160a01b900460ff1692506111a0565b806111988161237d565b9150506110f1565b5050915091565b80516000036111cc57604051631b53ee4d60e01b81526004810183905260240161037a565b60006111d783611330565b90506111e383826113a5565b156111ed57505050565b6000611246846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060005b835181101561132957600084828151811061126857611268612367565b602002602001015190506000600184836000015184602001518560400151604051600081526020016040526040516112bc949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156112de573d6000803e3d6000fd5b50505060206040510351905060006112f788878461160f565b90508015611313576113098887611989565b5050505050505050565b50505080806113219061237d565b91505061124b565b5050505050565b600081815260016020526040812080546001600160a01b03166113695760405163026c8dbb60e11b81526004810184905260240161037a565b6000600482015460ff16600381111561138457611384611de0565b146103835760405163aafa536960e01b81526004810184905260240161037a565b80546001600160a01b0316600090815260208181526040808320815160a081018352815460ff808216151583526101008204811615158387015262010000909104161515818401526001820180548451818702810187019095528085528695929460608601939092919083018282801561144857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161142a575b5050505050815260200160028201548152505090508060800151836006015403611476576000915050610383565b611484600584016000611d24565b61148e8382611af4565b6080810151600684018190556040805186815260208101929092527fb96b527e72b94fc460a27b6679a9f99a936d3e470a8666177a51e5b7652428b3910160405180910390a15060019392505050565b6000816001600160a01b031683600001516001600160a01b0316148061158c575082602001518015611518575082516001600160a01b0316155b801561158c575083516040516307feec1960e21b81526001600160a01b03848116600483015290911690631ffbb06490602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c91906122a0565b949350505050565b8151606083015160405163a9059cbb60e01b81526001600160a01b038481166004830152602482019290925291169063a9059cbb906044016020604051808303816000875af11580156115eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906122a0565b81546001600160a01b0316600090815260208181526040808320815160a081018352815460ff8082161515835261010082048116151583870152620100009091041615158184015260018201805484518187028101870190955280855286958695869593606086019391929091908301828280156116b657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611698575b50505050508152602001600282015481525050905060005b600587015481101561194d5760008760050182815481106116f1576116f1612367565b60009182526020909120018054909150600160a81b900460ff1615611716575061193b565b841561172f57836117268161237d565b9450505061194d565b6040805160e08101825289546001600160a01b03908116825260018b01548116602083015260028b015416918101919091526003808a0154606083015260048a015461187d92918b91608084019160ff9091169081111561179257611792611de0565b60038111156117a3576117a3611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561182757600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016117cc565b50505090825250600691909101546020918201526040805160608101825285546001600160a01b038116825260ff600160a01b82048116151594830194909452600160a81b9004909216151590820152896114de565b1561190657805460ff60a81b198116600160a81b178255600195506001600160a01b03166118bf5780546001600160a01b0319166001600160a01b0388161781555b604080518a81526001600160a01b03891660208201527fbe292cd4d4b5b62de3d9d1c3884be547205570b87a04717068601ba0c765eb79910160405180910390a15061193b565b82604001511561192c5760405163112e219560e31b8152600481018a905260240161037a565b836119368161237d565b945050505b806119458161237d565b9150506116ce565b508261197e57604051635788a87b60e01b8152600481018890526001600160a01b038616602482015260440161037a565b501595945050505050565b60048101805460ff191660019081179091556040805160e08101825283546001600160a01b03908116825283850154811660208301526002850154169181019190915260038301546060820152611a8c9183906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b82821015611a6557600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b90910416151590820152825260019092019101611a0a565b505050908252506006919091015460209091015260028301546001600160a01b0316611594565b8054600182015460028301546003840154604080518781526001600160a01b039586166020820152938516908401529216606082015260808101919091527fede11861efc96225b5c38ea18f4f95678cd9a04edd36b31e24b257c5b91f3bed9060a001610cca565b805115611b7e576040805160608101825260028401546001600160a01b0390811682526000602080840182815294840182815260058801805460018101825590845291909220935193018054945191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b0319909616949093169390931793909317929092169190911790555b806020015115611bfc5760408051606081018252600080825260016020808401828152948401838152600588018054938401815584529220925192018054935191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b03199095166001600160a01b03949094169390931793909317161790555b60005b816060015151811015610d155782600501604051806060016040528084606001518481518110611c3157611c31612367565b6020908102919091018101516001600160a01b0390811683526000838301819052604093840181905285546001810187559581528290208451950180549285015194909301511515600160a81b0260ff60a81b19941515600160a01b026001600160a81b03199093169590911694909417179190911691909117905580611cb78161237d565b915050611bff565b828054828255906000526020600020908101928215611d14579160200282015b82811115611d1457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cdf565b50611d20929150611d45565b5090565b5080546000825590600052602060002090810190611d429190611d5a565b50565b5b80821115611d205760008155600101611d46565b5b80821115611d205780546001600160b01b0319168155600101611d5b565b600060208083528351808285015260005b81811015611da657858101830151858201604001528201611d8a565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215611dd957600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600081518084526020808501945080840160005b83811015611e4957815180516001600160a01b031688528381015115158489015260409081015115159088015260609096019590820190600101611e0a565b509495945050505050565b60208152600060018060a01b038084511660208401528060208501511660408401528060408501511660608401525060608301516080830152608083015160048110611eb057634e487b7160e01b600052602160045260246000fd5b8060a08401525060a083015160e060c0840152611ed1610100840182611df6565b905060c084015160e08401528091505092915050565b6001600160a01b0381168114611d4257600080fd5b8015158114611d4257600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611f4357611f43611f0a565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7257611f72611f0a565b604052919050565b600067ffffffffffffffff821115611f9457611f94611f0a565b5060051b60200190565b600080600080600060a08688031215611fb657600080fd5b8535611fc181611ee7565b9450602086810135611fd281611efc565b94506040870135611fe281611efc565b93506060870135611ff281611efc565b9250608087013567ffffffffffffffff81111561200e57600080fd5b8701601f8101891361201f57600080fd5b803561203261202d82611f7a565b611f49565b81815260059190911b8201830190838101908b83111561205157600080fd5b928401925b8284101561207857833561206981611ee7565b82529284019290840190612056565b80955050505050509295509295909350565b60006020828403121561209c57600080fd5b81356120a781611ee7565b9392505050565b600081518084526020808501945080840160005b83811015611e495781516001600160a01b0316875295820195908201906001016120c2565b602081528151151560208201526020820151151560408201526040820151151560608201526000606083015160a0608084015261212760c08401826120ae565b9050608084015160a08401528091505092915050565b60008060006060848603121561215257600080fd5b833561215d81611ee7565b9250602084013561216d81611ee7565b929592945050506040919091013590565b6000806000806080858703121561219457600080fd5b8435935060208501356121a681611ee7565b925060408501356121b681611ee7565b9396929550929360600135925050565b60008060408084860312156121da57600080fd5b8335925060208085013567ffffffffffffffff8111156121f957600080fd5b8501601f8101871361220a57600080fd5b803561221861202d82611f7a565b8181526060918202830184019184820191908a84111561223757600080fd5b938501935b8385101561228f5780858c0312156122545760008081fd5b61225c611f20565b853560ff8116811461226e5760008081fd5b8152858701358782015287860135888201528352938401939185019161223c565b508096505050505050509250929050565b6000602082840312156122b257600080fd5b81516120a781611efc565b6000602082840312156122cf57600080fd5b81516120a781611ee7565b6001600160a01b03851681528315156020820152821515604082015260806060820181905260009061230e908301846120ae565b9695505050505050565b6001600160a01b038716815285151560208201528415156040820152831515606082015260c060808201819052600090612354908301856120ae565b90508260a0830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161239d57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212208f5d9e01b82bba25400a72f04035033f7e4339253a652bf71931c98cbdbca0b364736f6c63430008110033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b329bf5c11610071578063b329bf5c14610170578063ba33984a14610183578063bc0755e114610196578063c341a1c2146101a9578063c38756cc146101bc578063dd1db9cf146101ee57600080fd5b806306fdde03146100b9578063260958a5146100f65780636e710bf3146101165780637087dbf91461012b5780637fbeb89c1461013d57806390906f9d14610150575b600080fd5b6040805180820182526012815271222b20aa3930b739b332b926b0b730b3b2b960711b602082015290516100ed9190611d79565b60405180910390f35b610109610104366004611dc7565b610201565b6040516100ed9190611e54565b610129610124366004611f9e565b610389565b005b6002545b6040519081526020016100ed565b61012961014b366004611dc7565b61062a565b61016361015e36600461208a565b610a4d565b6040516100ed91906120e7565b61012961017e366004611dc7565b610b5d565b610129610191366004611dc7565b610cd6565b6101296101a436600461213d565b610d1a565b61012f6101b736600461217e565b611082565b6101cf6101ca366004611dc7565b6110de565b604080516001600160a01b0390931683529015156020830152016100ed565b6101296101fc3660046121c6565b6111a7565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c08101919091526000828152600160208181526040808420815160e08101835281546001600160a01b0390811682529482015485169381019390935260028101549093169082015260038083015460608301526004830154919291608084019160ff909116908111156102a7576102a7611de0565b60038111156102b8576102b8611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561033c57600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016102e1565b505050908252506006919091015460209091015280519091506001600160a01b03166103835760405163026c8dbb60e11b8152600481018490526024015b60405180910390fd5b92915050565b6040516307feec1960e21b81523360048201526001600160a01b03861690631ffbb06490602401602060405180830381865afa1580156103cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f191906122a0565b61041957604051636d0fd92960e01b81526001600160a01b038616600482015260240161037a565b846001600160a01b031663134e18f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b91906122bd565b60405163b9209e3360e01b81523060048201526001600160a01b03919091169063b9209e3390602401602060405180830381865afa1580156104c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e591906122a0565b61050d576040516379a7abb760e01b81526001600160a01b038616600482015260240161037a565b60008585858460405160200161052694939291906122da565b60408051601f19818403018152828252805160209182012060a084018352881515845287151584830190815287151585850190815260608601888152608087018490526001600160a01b038d1660009081528086529590952086518154935192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909516949094171791909116919091178155925180519195506105d3926001850192910190611cbf565b50608082015181600201559050507f690b0e7ac1907911c2428d54c3bdcaccd20f5c78b030cb2f008a75e590e99ac286868686868660405161061a96959493929190612318565b60405180910390a1505050505050565b600061063582611330565b905061064182826113a5565b1561064a575050565b80546001600160a01b0316600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552869592946060860193909291908301828280156106ed57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106cf575b50505050508152602001600282015481525050905060005b60058401548110156108e457600084600501828154811061072857610728612367565b60009182526020909120018054909150600160a81b900460ff161561074d57506108d2565b6040805160e08101825286546001600160a01b039081168252600188015481166020830152600288015416918101919091526003808701546060830152600487015461089b92918891608084019160ff909116908111156107b0576107b0611de0565b60038111156107c1576107c1611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561084557600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016107ea565b50505090825250600691909101546020918201526040805160608101825285546001600160a01b038116825260ff600160a01b82048116151594830194909452600160a81b9004909216151590820152336114de565b156108aa5760019350506108e4565b8260400151156108d05760405163112e219560e31b81526004810187905260240161037a565b505b806108dc8161237d565b915050610705565b508161090c57604051635788a87b60e01b81526004810185905233602482015260440161037a565b60048301805460ff191660039081179091556040805160e08101825285546001600160a01b03908116825260018701548116602083015260028701541691810191909152818501546060820152610a0f9185906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156109e857600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b9091041615159082015282526001909201910161098d565b505050908252506006919091015460209091015260018501546001600160a01b0316611594565b604080518581523360208201527fa42ddc86614a20e359b00eb1ed42b716b911ca4c69b6af8044306d7de36b35e4910160405180910390a150505050565b6040805160a08101825260008082526020820181905291810182905260608082015260808101919091526001600160a01b038216600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290830182828015610b1857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610afa575b505050918352505060029190910154602090910152608081015190915061038357604051635c1b86b760e11b81526001600160a01b038416600482015260240161037a565b6000610b6882611330565b60018101549091506001600160a01b03163314610b9b5760405163a859598f60e01b81526004810183905260240161037a565b60048101805460ff191660029081179091556040805160e08101825283546001600160a01b03908116825260018501548116602083015283850154169181019190915260038301546060820152610c9e9183906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b82821015610c7757600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b90910416151590820152825260019092019101610c1c565b505050908252506006919091015460209091015260018301546001600160a01b0316611594565b6040518281527f2e936050b1807500251bb54605979b74ee4e0e31a0fcba9f12b51d99496c20fa906020015b60405180910390a15050565b6000610ce182611330565b9050610ced82826113a5565b15610cf6575050565b6000610d0383833361160f565b90508015610d1557610d158383611989565b505050565b6001600160a01b038316600090815260208181526040808320815160a081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290830182828015610dbb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d9d575b5050509183525050600291909101546020909101526080810151909150610e0057604051635c1b86b760e11b81526001600160a01b038516600482015260240161037a565b6000849050806001600160a01b031663134e18f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906122bd565b60405163b9209e3360e01b81526001600160a01b038681166004830152919091169063b9209e3390602401602060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed391906122a0565b610f0357604051636178e7e560e11b81526001600160a01b0380871660048301528516602482015260440161037a565b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038216906323b872dd906064016020604051808303816000875af1158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a91906122a0565b506002805460009182610f8c8361237d565b9190505590506000610fa082338888611082565b600081815260016020819052604090912080546001600160a01b038b81166001600160a01b03199283161783559282018054821633179055600282018054938b1693909116929092179091556003810187905560048101805460ff19169055608086015160068201559091506110168186611af4565b608085810151604080518581526001600160a01b038c8116602083015233828401528b16606082015292830189905260a0830191909152517f6bb4a01617c492fa626ed5665cf4a461d4c1c6eeb7f3d910b41b47667348882d9181900360c00190a15050505050505050565b600080858585856040516020016110bc94939291909384526001600160a01b03928316602085015291166040830152606082015260800190565b60408051808303601f1901815291905280516020909101209695505050505050565b60008060006110ec84611330565b905060005b60058201548110156111a05781600501818154811061111257611112612367565b600091825260209091200154600160a81b900460ff1661118e5781600501818154811061114157611141612367565b6000918252602090912001546005830180546001600160a01b039092169550908290811061117157611171612367565b600091825260209091200154600160a01b900460ff1692506111a0565b806111988161237d565b9150506110f1565b5050915091565b80516000036111cc57604051631b53ee4d60e01b81526004810183905260240161037a565b60006111d783611330565b90506111e383826113a5565b156111ed57505050565b6000611246846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060005b835181101561132957600084828151811061126857611268612367565b602002602001015190506000600184836000015184602001518560400151604051600081526020016040526040516112bc949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156112de573d6000803e3d6000fd5b50505060206040510351905060006112f788878461160f565b90508015611313576113098887611989565b5050505050505050565b50505080806113219061237d565b91505061124b565b5050505050565b600081815260016020526040812080546001600160a01b03166113695760405163026c8dbb60e11b81526004810184905260240161037a565b6000600482015460ff16600381111561138457611384611de0565b146103835760405163aafa536960e01b81526004810184905260240161037a565b80546001600160a01b0316600090815260208181526040808320815160a081018352815460ff808216151583526101008204811615158387015262010000909104161515818401526001820180548451818702810187019095528085528695929460608601939092919083018282801561144857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161142a575b5050505050815260200160028201548152505090508060800151836006015403611476576000915050610383565b611484600584016000611d24565b61148e8382611af4565b6080810151600684018190556040805186815260208101929092527fb96b527e72b94fc460a27b6679a9f99a936d3e470a8666177a51e5b7652428b3910160405180910390a15060019392505050565b6000816001600160a01b031683600001516001600160a01b0316148061158c575082602001518015611518575082516001600160a01b0316155b801561158c575083516040516307feec1960e21b81526001600160a01b03848116600483015290911690631ffbb06490602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c91906122a0565b949350505050565b8151606083015160405163a9059cbb60e01b81526001600160a01b038481166004830152602482019290925291169063a9059cbb906044016020604051808303816000875af11580156115eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906122a0565b81546001600160a01b0316600090815260208181526040808320815160a081018352815460ff8082161515835261010082048116151583870152620100009091041615158184015260018201805484518187028101870190955280855286958695869593606086019391929091908301828280156116b657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611698575b50505050508152602001600282015481525050905060005b600587015481101561194d5760008760050182815481106116f1576116f1612367565b60009182526020909120018054909150600160a81b900460ff1615611716575061193b565b841561172f57836117268161237d565b9450505061194d565b6040805160e08101825289546001600160a01b03908116825260018b01548116602083015260028b015416918101919091526003808a0154606083015260048a015461187d92918b91608084019160ff9091169081111561179257611792611de0565b60038111156117a3576117a3611de0565b815260200160058201805480602002602001604051908101604052809291908181526020016000905b8282101561182757600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b909104161515908201528252600190920191016117cc565b50505090825250600691909101546020918201526040805160608101825285546001600160a01b038116825260ff600160a01b82048116151594830194909452600160a81b9004909216151590820152896114de565b1561190657805460ff60a81b198116600160a81b178255600195506001600160a01b03166118bf5780546001600160a01b0319166001600160a01b0388161781555b604080518a81526001600160a01b03891660208201527fbe292cd4d4b5b62de3d9d1c3884be547205570b87a04717068601ba0c765eb79910160405180910390a15061193b565b82604001511561192c5760405163112e219560e31b8152600481018a905260240161037a565b836119368161237d565b945050505b806119458161237d565b9150506116ce565b508261197e57604051635788a87b60e01b8152600481018890526001600160a01b038616602482015260440161037a565b501595945050505050565b60048101805460ff191660019081179091556040805160e08101825283546001600160a01b03908116825283850154811660208301526002850154169181019190915260038301546060820152611a8c9183906080830190815260200160058201805480602002602001604051908101604052809291908181526020016000905b82821015611a6557600084815260209081902060408051606081018252918501546001600160a01b038116835260ff600160a01b82048116151584860152600160a81b90910416151590820152825260019092019101611a0a565b505050908252506006919091015460209091015260028301546001600160a01b0316611594565b8054600182015460028301546003840154604080518781526001600160a01b039586166020820152938516908401529216606082015260808101919091527fede11861efc96225b5c38ea18f4f95678cd9a04edd36b31e24b257c5b91f3bed9060a001610cca565b805115611b7e576040805160608101825260028401546001600160a01b0390811682526000602080840182815294840182815260058801805460018101825590845291909220935193018054945191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b0319909616949093169390931793909317929092169190911790555b806020015115611bfc5760408051606081018252600080825260016020808401828152948401838152600588018054938401815584529220925192018054935191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b03199095166001600160a01b03949094169390931793909317161790555b60005b816060015151811015610d155782600501604051806060016040528084606001518481518110611c3157611c31612367565b6020908102919091018101516001600160a01b0390811683526000838301819052604093840181905285546001810187559581528290208451950180549285015194909301511515600160a81b0260ff60a81b19941515600160a01b026001600160a81b03199093169590911694909417179190911691909117905580611cb78161237d565b915050611bff565b828054828255906000526020600020908101928215611d14579160200282015b82811115611d1457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cdf565b50611d20929150611d45565b5090565b5080546000825590600052602060002090810190611d429190611d5a565b50565b5b80821115611d205760008155600101611d46565b5b80821115611d205780546001600160b01b0319168155600101611d5b565b600060208083528351808285015260005b81811015611da657858101830151858201604001528201611d8a565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215611dd957600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600081518084526020808501945080840160005b83811015611e4957815180516001600160a01b031688528381015115158489015260409081015115159088015260609096019590820190600101611e0a565b509495945050505050565b60208152600060018060a01b038084511660208401528060208501511660408401528060408501511660608401525060608301516080830152608083015160048110611eb057634e487b7160e01b600052602160045260246000fd5b8060a08401525060a083015160e060c0840152611ed1610100840182611df6565b905060c084015160e08401528091505092915050565b6001600160a01b0381168114611d4257600080fd5b8015158114611d4257600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611f4357611f43611f0a565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f7257611f72611f0a565b604052919050565b600067ffffffffffffffff821115611f9457611f94611f0a565b5060051b60200190565b600080600080600060a08688031215611fb657600080fd5b8535611fc181611ee7565b9450602086810135611fd281611efc565b94506040870135611fe281611efc565b93506060870135611ff281611efc565b9250608087013567ffffffffffffffff81111561200e57600080fd5b8701601f8101891361201f57600080fd5b803561203261202d82611f7a565b611f49565b81815260059190911b8201830190838101908b83111561205157600080fd5b928401925b8284101561207857833561206981611ee7565b82529284019290840190612056565b80955050505050509295509295909350565b60006020828403121561209c57600080fd5b81356120a781611ee7565b9392505050565b600081518084526020808501945080840160005b83811015611e495781516001600160a01b0316875295820195908201906001016120c2565b602081528151151560208201526020820151151560408201526040820151151560608201526000606083015160a0608084015261212760c08401826120ae565b9050608084015160a08401528091505092915050565b60008060006060848603121561215257600080fd5b833561215d81611ee7565b9250602084013561216d81611ee7565b929592945050506040919091013590565b6000806000806080858703121561219457600080fd5b8435935060208501356121a681611ee7565b925060408501356121b681611ee7565b9396929550929360600135925050565b60008060408084860312156121da57600080fd5b8335925060208085013567ffffffffffffffff8111156121f957600080fd5b8501601f8101871361220a57600080fd5b803561221861202d82611f7a565b8181526060918202830184019184820191908a84111561223757600080fd5b938501935b8385101561228f5780858c0312156122545760008081fd5b61225c611f20565b853560ff8116811461226e5760008081fd5b8152858701358782015287860135888201528352938401939185019161223c565b508096505050505050509250929050565b6000602082840312156122b257600080fd5b81516120a781611efc565b6000602082840312156122cf57600080fd5b81516120a781611ee7565b6001600160a01b03851681528315156020820152821515604082015260806060820181905260009061230e908301846120ae565b9695505050505050565b6001600160a01b038716815285151560208201528415156040820152831515606082015260c060808201819052600090612354908301856120ae565b90508260a0830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161239d57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212208f5d9e01b82bba25400a72f04035033f7e4339253a652bf71931c98cbdbca0b364736f6c63430008110033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
