// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package bindings

import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)

// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)

// ICertManagerVerifiedCert is an auto generated low-level Go binding around an user-defined struct.
type ICertManagerVerifiedCert struct {
	Ca          bool
	NotAfter    uint64
	MaxPathLen  int64
	SubjectHash [32]byte
	PubKey      []byte
}

// CertManagerMetaData contains all meta data concerning the CertManager contract.
var CertManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BASIC_CONSTRAINTS_OID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CERT_ALGO_OID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EC_PUB_KEY_OID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEY_USAGE_OID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROOT_CA_CERT_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROOT_CA_CERT_MAX_PATH_LEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"int64\",\"internalType\":\"int64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROOT_CA_CERT_NOT_AFTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROOT_CA_CERT_PUB_KEY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROOT_CA_CERT_SUBJECT_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECP_384_R1_OID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verified\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCACert\",\"inputs\":[{\"name\":\"cert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"parentCertHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyClientCert\",\"inputs\":[{\"name\":\"cert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"parentCertHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structICertManager.VerifiedCert\",\"components\":[{\"name\":\"ca\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"notAfter\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxPathLen\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"subjectHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"pubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CertVerified\",\"inputs\":[{\"name\":\"certHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false}]",
	Bin: "0x608060405234801562000010575f80fd5b50620000b37f311d96fcd5c5e0ccf72ef548e2ea7d4c0cd53ad7c4cc49e67471aed41d61f1855f1b6040518060a001604052806001151581526020016396258ff56001600160401b031681526020015f1960070b81526020017f3c3e2e5f1dd14dee5db88341ba71521e939afdb7881aa24c9f1e1c007a2fa8b65f1b8152602001604051806080016040528060608152602001620062a0606091399052620000b9565b620002dd565b8051602080830151604080850151606086015160808701519251620000e49695929391920162000110565b60408051601f198184030181529181525f848152602081905220906200010b908262000211565b505050565b85151560f81b815260c085811b6001600160c01b031916600183015284901b60098201526011810183905281515f90815b8181101562000160576020818601810151603186840101520162000141565b505f92016031019182525095945050505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200019d57607f821691505b602082108103620001bc57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200010b57805f5260205f20601f840160051c81016020851015620001e95750805b601f840160051c820191505b818110156200020a575f8155600101620001f5565b5050505050565b81516001600160401b038111156200022d576200022d62000174565b62000245816200023e845462000188565b84620001c2565b602080601f8311600181146200027b575f8415620002635750858301515b5f19600386901b1c1916600185901b178555620002d5565b5f85815260208120601f198616915b82811015620002ab578886015182559484019460019091019084016200028a565b5085821015620002c957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b615fb580620002eb5f395ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80638fb57b6211610088578063aeb255ea11610063578063aeb255ea14610233578063af9bdbc21461025a578063c59e43e514610281578063f69a82fe14610294575f80fd5b80638fb57b62146101bd5780639ecc0050146101e4578063ab68988d1461021e575f80fd5b80634519a352116100b85780634519a3521461014b57806358e3139e146101725780635ab7090414610196575f80fd5b80630890702c146100de57806328c5463714610104578063441b31df14610124575b5f80fd5b6100f16100ec366004615539565b6102bb565b6040519081526020015b60405180910390f35b610117610112366004615539565b6102e3565b6040516100fb9190615671565b6100f17f3c3e2e5f1dd14dee5db88341ba71521e939afdb7881aa24c9f1e1c007a2fa8b681565b6100f17f6351d72a43cb42fb9a2531a28608c278c89629f8f025b5f5dc705f3fe45e950a81565b61017d6396258ff581565b60405167ffffffffffffffff90911681526020016100fb565b6100f17fbd74344bb507daeb9ed315bc535f24a236ccab72c5cd6945fb0efe5c037e209781565b6100f17f311d96fcd5c5e0ccf72ef548e2ea7d4c0cd53ad7c4cc49e67471aed41d61f18581565b61020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b60405160079190910b81526020016100fb565b61022661032c565b6040516100fb91906156c2565b6100f17f45529d8772b07ebd6d507a1680da791f4a2192882bf89d518801579f7a5167d281565b6100f17f53ce037f0dfaa43ef13b095f04e68a6b5e3f1519a01a3203a1e6440ba915b87e81565b61022661028f3660046156d4565b610348565b6100f17fb60fee1fd85f867dd7c8d16884a49a20287ebe4c0fb49294e9825988aa8e42b481565b815160208301205f906102d9848260016102d4876103df565b610557565b5090505b92915050565b6040805160a0810182525f8082526020820181905291810182905260608082019290925260808101919091526103258384805190602001205f6102d4866103df565b9392505050565b604051806080016040528060608152602001615e596060913981565b5f6020819052908152604090208054610360906156eb565b80601f016020809104026020016040519081016040528092919081815260200182805461038c906156eb565b80156103d75780601f106103ae576101008083540402835291602001916103d7565b820191905f5260205f20905b8154815290600101906020018083116103ba57829003601f168201915b505050505081565b6040805160a0810182525f808252602080830182905282840182905260608084018390526080840152848252819052918220805491929161041f906156eb565b80601f016020809104026020016040519081016040528092919081815260200182805461044b906156eb565b80156104965780601f1061046d57610100808354040283529160200191610496565b820191905f5260205f20905b81548152906001019060200180831161047957829003601f168201915b5050505050905080515f036104e15750506040805160a0810182525f808252602080830182905282840182905260608301829052835190810190935282526080810191909152919050565b600181015160098201516011830151603180850151855190915f91610514919061050c908290615769565b8891906109ee565b6040805160a08101825260ff9097161515875267ffffffffffffffff909516602087015260079390930b9385019390935260608401526080830152509392505050565b6040805160a0810182525f8082526020820181905291810182905260608082019290925260808101919091527f311d96fcd5c5e0ccf72ef548e2ea7d4c0cd53ad7c4cc49e67471aed41d61f1858414610776575f8260800151511161061d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f706172656e74206365727420756e76657269666965640000000000000000000060448201526064015b60405180910390fd5b42826020015167ffffffffffffffff161015610695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706172656e7420636572742065787069726564000000000000000000000000006044820152606401610614565b81516106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f706172656e742063657274206973206e6f7420612043410000000000000000006044820152606401610614565b8215806107105750604082015160070b15155b610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d6178506174684c656e206578636565646564000000000000000000000000006044820152606401610614565b5f610780856103df565b90508060800151515f1461087b5742816020015167ffffffffffffffff161015610806576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f63657274206578706972656400000000000000000000000000000000000000006044820152606401610614565b8051151584151514610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f63657274206973206e6f742061204341000000000000000000000000000000006044820152606401610614565b90506109e6565b5f61088587610ac9565b90505f6108928883610ad4565b90505f805f805f6108a48d878d610ba2565b94509450945094509450828a606001511461091b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f697373756572202f207375626a656374206d69736d61746368000000000000006044820152606401610614565b5f8a6040015160070b13801561094757505f8460070b12806109475750896040015160070b8460070b12155b156109605760018a6040015161095d919061577c565b93505b61096f8d878c60800151610d2c565b6040518060a001604052808c151581526020018667ffffffffffffffff1681526020018560070b81526020018381526020018281525097506109b18c89610ee1565b6040518c907f694e63280ec3524c75db17994cf1341b1dbc3efa9f68ad3f4b8da1f00804828e905f90a2509596505050505050505b949350505050565b82516060906109fd83856157c2565b1115610a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610614565b8167ffffffffffffffff811115610a7e57610a7e61550c565b6040519080825280601f01601f191660200182016040528015610aa8576020820181803683370190505b50905060208082019085850101610ac0828286610f52565b50509392505050565b5f6102dd825f610fc6565b5f8269ffffffffffffffffffff831681518110610af357610af36157d5565b01602001517f200000000000000000000000000000000000000000000000000000000000000090811614610b83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f74206120636f6e73747275637465642074797065000000000000000000006044820152606401610614565b61032583605084901c69ffffffffffffffffffff16610fc6565b610fc6565b5f808080606081610bb38989610ad4565b90505f610bc08a83610ad4565b90505f610bcd8b84611219565b90505f610bda8c83611219565b90507f53ce037f0dfaa43ef13b095f04e68a6b5e3f1519a01a3203a1e6440ba915b87e610c1f8d69ffffffffffffffffffff605085901c81169060a086901c1661123f565b14610c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420636572742073696720616c676f00000000000000000000006044820152606401610614565b5f610c918d856112bf565b905080600214610cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f76657273696f6e2073686f756c642062652033000000000000000000000000006044820152606401610614565b610d088d838d61148b565b809a50819b50829c50839d50849e5050505050505050505050939792965093509350565b5f610d378484611219565b90507f53ce037f0dfaa43ef13b095f04e68a6b5e3f1519a01a3203a1e6440ba915b87e610d7c8569ffffffffffffffffffff605085901c81169060a086901c1661123f565b14610de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c696420636572742073696720616c676f00000000000000000000006044820152606401610614565b5f610e038569ffffffffffffffffffff8616610dfe8761164b565b61168f565b90505f610e108684611219565b90505f610e1d87836117b6565b90505f610e2a888361198d565b90505f610e378983610ad4565b90505f610e448a83611219565b90505f80610e528c856119a8565b90925090505f80610e638e866119a8565b604051608087811b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000090811660208401526030830188905284821b166050830152606082018390529294509092505f91016040516020818303038152906040529050610ed08d8c83611bff565b505050505050505050505050505050565b8051602080830151604080850151606086015160808701519251610f0a96959293919201615802565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181525f84815260208190522090610f4d90826158b4565b505050565b60208110610f8a5781518352610f696020846157c2565b9250610f766020836157c2565b9150610f83602082615769565b9050610f52565b8015610f4d575f6001610f9e836020615769565b610faa90610100615aee565b610fb49190615769565b83518551821691191617845250505050565b5f828281518110610fd957610fd96157d5565b01602001517f1f000000000000000000000000000000000000000000000000000000000000009081169003611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f41534e2e312074616773206c6f6e676572207468616e20312d6279746520617260448201527f65206e6f7420737570706f7274656400000000000000000000000000000000006064820152608401610614565b5f808461109e8560016157c2565b815181106110ae576110ae6157d5565b01602001517f8000000000000000000000000000000000000000000000000000000000000000165f0361111357846110e78560016157c2565b815181106110f7576110f76157d5565b016020015160f81c915061110c8460026157c2565b9050611203565b5f856111208660016157c2565b81518110611130576111306157d5565b60209101015160f81c607f169050600181900361117257856111538660026157c2565b81518110611163576111636157d5565b016020015160f81c92506111e6565b8060ff1660020361119d5761119261118b8660026157c2565b8790611c78565b61ffff1692506111e6565b6111a8816020615af9565b6111b3906008615b12565b60ff166111ce876111c58860026157c2565b8460ff16611cfa565b901c925067ffffffffffffffff8311156111e6575f80fd5b60ff81166111f58660026157c2565b6111ff91906157c2565b9150505b605081901b841760a083901b1795945050505050565b5f61032583610b9d69ffffffffffffffffffff60a086901c811690605087901c166157c2565b82515f9061124d83856157c2565b11156112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610614565b5091016020012090565b5f8269ffffffffffffffffffff8316815181106112de576112de6157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f02000000000000000000000000000000000000000000000000000000000000001461138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f74207479706520494e5445474552000000000000000000000000000000006044820152606401610614565b82605083901c69ffffffffffffffffffff16815181106113b0576113b06157d5565b01602001517f8000000000000000000000000000000000000000000000000000000000000000161561143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f7420706f73697469766500000000000000000000000000000000000000006044820152606401610614565b69ffffffffffffffffffff60a083901c1661145a816020615769565b611465906008615b35565b61148185605086901c69ffffffffffffffffffff165b84611cfa565b901c949350505050565b5f80808060608161149c8989611219565b90506114cc605082901c69ffffffffffffffffffff1660a083901c69ffffffffffffffffffff165b8b919061123f565b93505f6114d98a83611219565b90505f6114e68b83611219565b905061150a8b69ffffffffffffffffffff605084901c81169060a085901c1661123f565b94505f6115178c83611219565b90505f6115248d83611219565b90508c69ffffffffffffffffffff821681518110611544576115446157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f81000000000000000000000000000000000000000000000000000000000000000361159e5761159b8d82611219565b90505b8c69ffffffffffffffffffff8216815181106115bc576115bc6157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f820000000000000000000000000000000000000000000000000000000000000003611616576116138d82611219565b90505b6116208d85611d56565b995061162d8d828d611e71565b98506116398d83612354565b95505050505050939792965093509350565b5f69ffffffffffffffffffff8216605083901c69ffffffffffffffffffff1660a084901c69ffffffffffffffffffff1661168591906157c2565b6102dd9190615769565b604080516101008101825267cbbb9d5dc1059ed8815267629a292a367cd5076020820152679159015a3070dd179181019190915267152fecd8f70e59396060828101919091526767332667ffc00b316080830152678eb44a876858151160a083015267db0c2e0d64f98fa760c08301526747b5481dbefa4fa460e08301529061171a85858584612543565b80516020808301516040808501516060860151608087015160a088015184517fffffffffffffffff00000000000000000000000000000000000000000000000060c0998a1b81169882019890985295881b8716602887015292871b8616603086015290861b85166038850152851b84169183019190915290921b1660488201526050016040516020818303038152906040529150509392505050565b5f8269ffffffffffffffffffff8316815181106117d5576117d56157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f030000000000000000000000000000000000000000000000000000000000000014611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f7420747970652042495420535452494e47000000000000000000000000006044820152606401610614565b82605083901c69ffffffffffffffffffff16815181106118a7576118a76157d5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f6e2d302d7061646465642042495420535452494e470000000000000000006044820152606401610614565b61032569ffffffffffffffffffff8316605084901c69ffffffffffffffffffff166119619060016157c2565b61197c600169ffffffffffffffffffff60a088901c16615769565b60a01b60509190911b919091171790565b5f61032583605084901c69ffffffffffffffffffff16610fc6565b5f808369ffffffffffffffffffff8416815181106119c8576119c86157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f020000000000000000000000000000000000000000000000000000000000000014611a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f74207479706520494e5445474552000000000000000000000000000000006044820152606401610614565b83605084901c69ffffffffffffffffffff1681518110611a9a57611a9a6157d5565b01602001517f80000000000000000000000000000000000000000000000000000000000000001615611b28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4e6f7420706f73697469766500000000000000000000000000000000000000006044820152606401610614565b5f60a084901c69ffffffffffffffffffff1690505f605085901c69ffffffffffffffffffff169050858181518110611b6257611b626157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000165f03611bab5780611b9981615b4c565b9150508180611ba790615b83565b9250505b6080611bb987836010611cfa565b901c611bc6836030615769565b611bd1906008615b35565b611bf088611be08560106157c2565b611beb601088615769565b611cfa565b9195501c925050509250929050565b611c12611c0a612e1c565b838386612f37565b610f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e76616c6964207369670000000000000000000000000000000000000000006044820152606401610614565b5f611c848260026157c2565b83511015611cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610614565b50016020015160f01c90565b5f6020821115611d08575f80fd5b8351611d1483856157c2565b1115611d1e575f80fd5b506020919092018101519190036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01191690565b5f80611d628484610ad4565b90505f611d6f8583611219565b90505f611d7c86846131c3565b9050611d8886836131c3565b935042811115611df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6365727469666963617465206e6f742076616c696420796574000000000000006044820152606401610614565b428467ffffffffffffffff161015611e68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6365727469666963617465206e6f742076616c696420616e796d6f72650000006044820152606401610614565b50505092915050565b5f8369ffffffffffffffffffff841681518110611e9057611e906157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa30000000000000000000000000000000000000000000000000000000000000014611f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420657874656e73696f6e7300000000000000000000000000006044820152606401610614565b611f4a8484610ad4565b92505f611f578585610ad4565b90505f611f7b69ffffffffffffffffffff60a087901c811690605088901c166157c2565b90505f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b5f611fae8986610ad4565b90505f611fd38a69ffffffffffffffffffff605085901c81169060a086901c1661123f565b90507f6351d72a43cb42fb9a2531a28608c278c89629f8f025b5f5dc705f3fe45e950a81148061202257507f45529d8772b07ebd6d507a1680da791f4a2192882bf89d518801579f7a5167d281145b15612180575f6120328b84611219565b90508a69ffffffffffffffffffff821681518110612052576120526157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f0100000000000000000000000000000000000000000000000000000000000000036121265760a081901c69ffffffffffffffffffff16600114612119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c696420637269746963616c20626f6f6c2076616c756500000000006044820152606401610614565b6121238b82611219565b90505b6121308b8261380d565b90507f9cae28d5bc34bd0465dace5d79f73d873769d6070fda4a0a238fa0c01ba16af6820161216f57600194506121688b828b6138dc565b975061217e565b6001935061217e8b828b613b37565b505b846121a269ffffffffffffffffffff60a089901c81169060508a901c166157c2565b036121ae5750506121c1565b6121b88a87611219565b95505050611fa3565b81612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6261736963436f6e73747261696e7473206e6f7420666f756e640000000000006044820152606401610614565b8061228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6b65795573616765206e6f7420666f756e6400000000000000000000000000006044820152606401610614565b85806122bd57508460070b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff145b612349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6d6178506174684c656e206d75737420626520756e646566696e656420666f7260448201527f20636c69656e74206365727400000000000000000000000000000000000000006064820152608401610614565b505050509392505050565b60605f6123618484610ad4565b90505f61236e8583610ad4565b90505f61237b8683611219565b90505f6123888785611219565b90505f61239588836117b6565b90507fb60fee1fd85f867dd7c8d16884a49a20287ebe4c0fb49294e9825988aa8e42b46123e2605086901c69ffffffffffffffffffff1660a087901c69ffffffffffffffffffff166114c4565b14612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206365727420616c676f2069640000000000000000000000006044820152606401610614565b7fbd74344bb507daeb9ed315bc535f24a236ccab72c5cd6945fb0efe5c037e2097612494605085901c69ffffffffffffffffffff1660a086901c69ffffffffffffffffffff166114c4565b146124fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c6964206365727420616c676f20706172616d0000000000000000006044820152606401610614565b5f61251d69ffffffffffffffffffff60a084901c811690605085901c166157c2565b905061253661252d606083615769565b8a9060606109ee565b9998505050505050505050565b60408051610a008101825267428a2f98d728ae228152677137449123ef65cd602082015267b5c0fbcfec4d3b2f9181019190915267e9b5dba58189dbbc6060820152673956c25bf348b53860808201526759f111f1b605d01960a082015267923f82a4af194f9b60c082015267ab1c5ed5da6d811860e082015267d807aa98a30302426101008201526712835b0145706fbe61012082015267243185be4ee4b28c61014082015267550c7dc3d5ffb4e26101608201526772be5d74f27b896f6101808201526780deb1fe3b1696b16101a0820152679bdc06a725c712356101c082015267c19bf174cf6926946101e082015267e49b69c19ef14ad261020082015267efbe4786384f25e3610220820152670fc19dc68b8cd5b561024082015267240ca1cc77ac9c65610260820152672de92c6f592b0275610280820152674a7484aa6ea6e4836102a0820152675cb0a9dcbd41fbd46102c08201526776f988da831153b56102e082015267983e5152ee66dfab61030082015267a831c66d2db4321061032082015267b00327c898fb213f61034082015267bf597fc7beef0ee461036082015267c6e00bf33da88fc261038082015267d5a79147930aa7256103a08201526706ca6351e003826f6103c082015267142929670a0e6e706103e08201526727b70a8546d22ffc610400820152672e1b21385c26c926610420820152674d2c6dfc5ac42aed6104408201526753380d139d95b3df61046082015267650a73548baf63de61048082015267766a0abb3c77b2a86104a08201526781c2c92e47edaee66104c08201526792722c851482353b6104e082015267a2bfe8a14cf1036461050082015267a81a664bbc42300161052082015267c24b8b70d0f8979161054082015267c76c51a30654be3061056082015267d192e819d6ef521861058082015267d69906245565a9106105a082015267f40e35855771202a6105c082015267106aa07032bbd1b86105e08201526719a4c116b8d2d0c8610600820152671e376c085141ab53610620820152672748774cdf8eeb996106408201526734b0bcb5e19b48a861066082015267391c0cb3c5c95a63610680820152674ed8aa4ae3418acb6106a0820152675b9cca4f7763e3736106c082015267682e6ff3d6b2b8a36106e082015267748f82ee5defb2fc6107008201526778a5636f43172f606107208201526784c87814a1f0ab72610740820152678cc702081a6439ec6107608201526790befffa23631e2861078082015267a4506cebde82bde96107a082015267bef9a3f7b2c679156107c082015267c67178f2e372532b6107e082015267ca273eceea26619c61080082015267d186b8c721c0c20761082082015267eada7dd6cde0eb1e61084082015267f57d4f7fee6ed1786108608201526706f067aa72176fba610880820152670a637dc5a2c898a66108a082015267113f9804bef90dae6108c0820152671b710b35131c471b6108e08201526728db77f523047d846109008201526732caab7b40c72493610920820152673c9ebe0a15c9bebc61094082015267431d67c49c100d4c610960820152674cc5d4becb3e42b661098082015267597f299cfc657e2a6109a0820152675fcb6fab3ad6faec6109c0820152676c44198c4a4758176109e08201528451612a0184866157c2565b1115612a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f55545f4f465f424f554e4453000000000000000000000000000000000000006044820152606401610614565b5f612a75868686613c2f565b905060808151612a859190615be4565b15612aec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f50414444494e475f4552524f52000000000000000000000000000000000000006044820152606401610614565b612af4615463565b612afc615482565b612b046154a1565b5f612b10608089615bf7565b612b1b906080615b35565b90505f5b85518201811015612e0f5781811015612b4457612b3f8b84838d01613d39565b612b51565b612b518684848403613d39565b5f5b6010811015612ba157838160108110612b6e57612b6e6157d5565b6020020151868260508110612b8557612b856157d5565b67ffffffffffffffff9092166020929092020152600101612b53565b5060105b6050811015612c5757856010820360508110612bc357612bc36157d5565b6020020151612bea87600f840360508110612be057612be06157d5565b6020020151613d91565b876007840360508110612bff57612bff6157d5565b6020020151612c26896002860360508110612c1c57612c1c6157d5565b6020020151613dbf565b010101868260508110612c3b57612c3b6157d5565b67ffffffffffffffff9092166020929092020152600101612ba5565b505f5b6008811015612ca857888160088110612c7557612c756157d5565b6020020151858260088110612c8c57612c8c6157d5565b67ffffffffffffffff9092166020929092020152600101612c5a565b505f5b6050811015612db3575f868260508110612cc757612cc76157d5565b6020020151898360508110612cde57612cde6157d5565b6020020151608088015160a089015160c08a01518219169116186080890151612d0690613de5565b89600760200201510101010190505f612d3e878260200201518860016020020151896002602002015180821690831691909216181890565b8751612d4990613e07565b60c08901805167ffffffffffffffff90811660e08c015260a08b018051821690925260808b018051821690925260608b0180518701821690925260408b018051821690925260208b01805182169092528a5181169091529101909201909116865250600101612cab565b505f5b6008811015612e0657848160088110612dd157612dd16157d5565b6020020151898260088110612de857612de86157d5565b6020020180519190910167ffffffffffffffff169052600101612db6565b50608001612b1f565b5050505050505050505050565b612e5c6040518060e00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604080516101408101909152603060e082018181528291615f196101008401398152602001604051806060016040528060308152602001615df9603091398152602001604051806060016040528060308152602001615ee9603091398152602001604051806060016040528060308152602001615e29603091398152602001604051806060016040528060308152602001615f79603091398152602001604051806060016040528060308152602001615f49603091398152602001604051806060016040528060308152602001615eb9603091399052919050565b5f612f5f60405180608001604052805f81526020015f81526020015f81526020015f81525090565b612f6884613e29565b60208301528152612f7883613e29565b6060830152604080830191909152805160e0810190915286515f91908190612f9f90613ed9565b8152602001612fb18960200151613ed9565b8152602001612fc38960400151613ed9565b8152602001612fd58960600151613ed9565b8152602001612fe78960800151613ed9565b8152602001612ff98960a00151613ed9565b815260200161300b8960c00151613ed9565b81525090505f61301e8260800151613f6d565b835160208101519051919250159015168061304957505f613046845f01518460a0015161403f565b12155b80613066575061306683602001515f602082015191511591141690565b8061308157505f61307f84602001518460c0015161403f565b135b15613091575f93505050506109e6565b6130b2818360800151845f01518560200151876040015188606001516140e4565b6130c1575f93505050506109e6565b8651603081101561310457604080516030808252606082019092525f916020820181803683375091925061310191505060208a01838303605001846141c2565b97505b505f613122826131138a613ed9565b86602001518660a001516141d0565b90505f61313c83865f015187602001518760a001516141d0565b90505f61314960036142e0565b90505f61317385876080015184895f01518a604001518b606001518d604001518e60600151614300565b905061318b85876080015184895f01518589896144e9565b508094505050506131a183838660a001516146d7565b84516020808201519084015191518451149114169a9950505050505050505050565b5f808369ffffffffffffffffffff8416815181106131e3576131e36157d5565b016020015160f81c905069ffffffffffffffffffff605084901c81169060a085901c16601783148015613216575080600d145b8061322f57508260ff16601814801561322f575080600f145b613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c69642054494d455354414d500000000000000000000000000000006044820152606401610614565b8560016132a283856157c2565b6132ac9190615769565b815181106132bc576132bc6157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f5a000000000000000000000000000000000000000000000000000000000000001461336c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f54494d455354414d50206d7573742062652055544300000000000000000000006044820152606401610614565b5f5b613379600183615769565b81101561342a575f8761338c83866157c2565b8151811061339c5761339c6157d5565b016020015160f81c9050603081108015906133bb575060398160ff1611155b613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e76616c69642063686172616374657220696e2054494d455354414d5000006044820152606401610614565b5060010161336e565b505f81600d03613477576005603088858151811061344a5761344a6157d5565b016020015161345c919060f81c615af9565b60ff161061346c5761076c613470565b6107d05b9050613504565b6030876134858560016157c2565b81518110613495576134956157d5565b01602001516134a7919060f81c615af9565b6134b2906064615b12565b60ff1660308885815181106134c9576134c96157d5565b01602001516134db919060f81c615af9565b6134ea9060ff166103e8615c0a565b6134f49190615c28565b90506135016002846157c2565b92505b6030876135128560016157c2565b81518110613522576135226157d5565b602001015160f81c60f81b60f81c6030898681518110613544576135446157d5565b0160200151613556919060f81c615af9565b61356190600a615b12565b61356b9190615c43565b6135759190615af9565b6135829060ff1682615c28565b90505f6030886135938660036157c2565b815181106135a3576135a36157d5565b016020015160f81c60308a6135b98860026157c2565b815181106135c9576135c96157d5565b01602001516135db919060f81c615af9565b6135e690600a615b12565b6135f09190615c43565b6135fa9190615af9565b90505f60308961360b8760056157c2565b8151811061361b5761361b6157d5565b016020015160f81c60308b6136318960046157c2565b81518110613641576136416157d5565b0160200151613653919060f81c615af9565b61365e90600a615b12565b6136689190615c43565b6136729190615af9565b90505f60308a6136838860076157c2565b81518110613693576136936157d5565b016020015160f81c60308c6136a98a60066157c2565b815181106136b9576136b96157d5565b01602001516136cb919060f81c615af9565b6136d690600a615b12565b6136e09190615c43565b6136ea9190615af9565b90505f60308b6136fb8960096157c2565b8151811061370b5761370b6157d5565b016020015160f81c60308d6137218b60086157c2565b81518110613731576137316157d5565b0160200151613743919060f81c615af9565b61374e90600a615b12565b6137589190615c43565b6137629190615af9565b90505f60308c6137738a600b6157c2565b81518110613783576137836157d5565b016020015160f81c60308e6137998c600a6157c2565b815181106137a9576137a96157d5565b01602001516137bb919060f81c615af9565b6137c690600a615b12565b6137d09190615c43565b6137da9190615af9565b90506137fd8661ffff168660ff168660ff168660ff168660ff168660ff16614723565b9c9b505050505050505050505050565b5f8269ffffffffffffffffffff83168151811061382c5761382c6157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f040000000000000000000000000000000000000000000000000000000000000014610b83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f742074797065204f4354455420535452494e4700000000000000000000006044820152606401610614565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f6139088585610ad4565b90505f8569ffffffffffffffffffff831681518110613929576139296157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f010000000000000000000000000000000000000000000000000000000000000003613a4b5760a082901c69ffffffffffffffffffff166001146139f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c6964206973434120626f6f6c2076616c75650000000000000000006044820152606401610614565b85605083901c69ffffffffffffffffffff1681518110613a1257613a126157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000908116149050613a488683611219565b91505b80151584151514613ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f69734341206d757374206265207472756520666f7220434120636572747300006044820152606401610614565b8569ffffffffffffffffffff831681518110613ad657613ad66157d5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f020000000000000000000000000000000000000000000000000000000000000003610ac057613b2d86836112bf565b9695505050505050565b5f613b4284846148ff565b90508115613bbc5780600416600414613bb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f436572745369676e206d7573742062652070726573656e7400000000000000006044820152606401610614565b613c29565b80608016608014613c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4469676974616c5369676e6174757265206d7573742062652070726573656e746044820152606401610614565b50505050565b60605f613c3d836008615b35565b60c01b90505f613c4e608085615be4565b90505f6070821015613c6c57613c65826077615769565b9050613c7a565b613c778260f7615769565b90505b5f8167ffffffffffffffff811115613c9457613c9461550c565b6040519080825280601f01601f191660200182016040528015613cbe576020820181803683370190505b5090505f613ce284613cd0898b6157c2565b613cda9190615769565b8a90866109ee565b604051909150613d1c9082907f80000000000000000000000000000000000000000000000000000000000000009085908990602001615c5c565b604051602081830303815290604052955050505050509392505050565b5f5b6010811015613c2957613d63613d52826008615b35565b613d5c90846157c2565b8590614a21565b838260108110613d7557613d756157d5565b67ffffffffffffffff9092166020929092020152600101613d3b565b5f60078267ffffffffffffffff16901c613dac836008614aa3565b613db7846001614aa3565b181892915050565b5f60068267ffffffffffffffff16901c613dda83603d614aa3565b613db7846013614aa3565b5f613df1826029614aa3565b613dfc836012614aa3565b613db784600e614aa3565b5f613e13826027614aa3565b613e1e836022614aa3565b613db784601c614aa3565b5f808251606014613e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f7420373638000000000000000000000000000000000000006044820152606401610614565b604080516080810182529250820190505f825260208301516010830152603083015160208301525f81526050830151601082015260608301516020820152915091565b5f8151603014613f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f553338343a206e6f7420333834000000000000000000000000000000000000006044820152606401610614565b6040805180820190915290505f81526020820151601082015260308201516020820152919050565b5f613f8061048060408051918201905290565b9050613fb682613f9060026142e0565b602082810151908201518103610420860181905291519251911191900303610400830152565b6060610120820152602061014082018190526040610160830181905260016101e0840152835161020084015283820180516102208501526102408401829052610260840192909252610280830181905283516103008401528151610320840152610360830181905261038083018190526103a08301529151610440820152905161046082015290565b815181515f919080821115614059576001925050506102dd565b8082101561408b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050506102dd565b505060208381015190830151808211156140aa576001925050506102dd565b808210156140dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff925050506102dd565b505092915050565b602082015182515f91159015168061410a57506020868101519084015187518551149114165b8061411c575060208201518251159015165b8061413557506020868101519083015187518451149114165b1561414157505f613b2d565b5f61414e88846002614adf565b90505f61415d89866003614adf565b6020880151885191925015901516614187576141848161417e8b888b614b23565b8a614c14565b90505b60208601518651159015166141a4576141a181878a614c14565b90505b60208181015190830151915192519114911416979650505050505050565b8082828560045afa50505050565b5f6141dc858484614c76565b90506142a18482876060018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b60608552602085602001526040856040015260018560c0015281518560e0015260208201518561010001526040816101208760055afa50949350505050565b5f6142f16040808051918201905290565b5f815260208101929092525090565b6143086154c0565b61431183614d03565b61431a83614d03565b602080840151908101919091525261433185614d03565b61433a85614d03565b6101008301516020810191909152525f5b60088110156144dc575f5b60088110156144d3576002818301106144cb57600382901b81178215614421577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830160031b82176143e28d8d8d8d8986604081106143b7576143b76157d5565b6020020151518a87604081106143cf576143cf6157d5565b6020020151600160200201518f8f614d29565b8684604081106143f4576143f46157d5565b602002015187856040811061440b5761440b6157d5565b60200201516001602002019190915252506144c9565b600383901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83011761448e8d8d8d8d898660408110614463576144636157d5565b6020020151518a876040811061447b5761447b6157d5565b6020020151600160200201518d8d614d29565b8684604081106144a0576144a06157d5565b60200201518785604081106144b7576144b76157d5565b60200201516001602002019190915252505b505b600101614356565b5060010161434b565b5098975050505050505050565b815181515f9182918291906145028c8c8c8c8780614e52565b9095509350690ffffffffffffffffff860b483901c1660b782901c17925082156145705761456a8c8c8c8c8c886040811061453f5761453f6157d5565b6020020151518d8960408110614557576145576157d5565b6020020151600160200201518b8b614d29565b90955093505b60045b60b88111614605576145898d8d8d8d8a8a614f11565b80965081975050508060b80382901c60071660038260b80385901c600716901b179350835f146145fd576145f78d8d8d8d8d89604081106145cc576145cc6157d5565b6020020151518e8a604081106145e4576145e46157d5565b6020020151600160200201518c8c614d29565b90965094505b600301614573565b505050602085810151908501516146208c8c8c8c8989614e52565b9095509350600860fc83901c1660ff82901c179250821561465a576146548c8c8c8c8c886040811061453f5761453f6157d5565b90955093505b60045b61010081116146c7576146748d8d8d8d8a8a614f11565b8096508197505050806101000382901c6007166003826101000385901c600716901b179350835f146146bf576146b98d8d8d8d8d89604081106145cc576145cc6157d5565b90965094505b60030161465d565b5050505097509795505050505050565b604083526020836020015260408360400152815183606001526020820151836080015260018360a0015280518360c0015260208101518360e001526040826101008560055afa50505050565b5f6107b2871015614732575f80fd5b856001111580156147445750600c8611155b61474c575f80fd5b8460011115801561475e5750601f8511155b614766575f80fd5b6017841115614773575f80fd5b603b831115614780575f80fd5b603b82111561478d575f80fd5b8686865f62253d8c60046064600c6147a6600e88615ce7565b6147b09190615d06565b6147bc88611324615d6d565b6147c69190615d6d565b6147d09190615d06565b6147db906003615d8c565b6147e59190615d06565b600c806147f3600e88615ce7565b6147fd9190615d06565b61480890600c615d8c565b614813600288615ce7565b61481d9190615ce7565b6148299061016f615d8c565b6148339190615d06565b6004600c614842600e89615ce7565b61484c9190615d06565b614858896112c0615d6d565b6148629190615d6d565b61486e906105b5615d8c565b6148789190615d06565b614884617d4b87615ce7565b61488e9190615d6d565b6148989190615d6d565b6148a29190615ce7565b6148ac9190615ce7565b90508587896148bc846018615b35565b6148c691906157c2565b6148d190603c615b35565b6148db91906157c2565b6148e690603c615b35565b6148f091906157c2565b9b9a5050505050505050505050565b5f8269ffffffffffffffffffff83168151811061491e5761491e6157d5565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0300000000000000000000000000000000000000000000000000000000000000146149ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f7420747970652042495420535452494e47000000000000000000000000006044820152606401610614565b5f6149ea600169ffffffffffffffffffff60a086901c16615769565b90506149f7816020615769565b614a02906008615b35565b6114818561147b69ffffffffffffffffffff605088901c1660016157c2565b5f614a2d8260086157c2565b83511015614a97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e646578206f7574206f6620626f756e6473000000000000000000000000006044820152606401610614565b50016020015160c01c90565b5f67ffffffffffffffff8381169083161c614abf836040615dd7565b67ffffffffffffffff168467ffffffffffffffff16901b17905092915050565b5f614af06040808051918201905290565b9050610240840193508251846060015260208301518460800152818460a001526040816101008660055afa509392505050565b5f614b346040808051918201905290565b9050614bfa838361018087018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120840193506040816101208660055afa509392505050565b5f614c256040808051918201905290565b6020858101518582015181019183018290528551875101911001815290505f614c4e828461403f565b1261032557602080820180519184015182039081905283518351929091119103038152610325565b5f614c876040808051918201905290565b9050614cbb82614c9760026142e0565b60208281015190820151810360c089018190529151925191119190030360a0860152565b604084526040846020015260408460400152825184606001526020830151846080015281518460e0015260208201518461010001526040816101208660055afa509392505050565b5f614d146040808051918201905290565b90508151815260208201516020820152919050565b5f80851580614d36575083155b15614d8e5785158015614d47575083155b15614d5657505f905080614e45565b8515614d7357614d6586614d03565b614d6e86614d03565b614d85565b614d7c84614d03565b614d8584614d03565b91509150614e45565b60208481015190870151855188511491141615614dd45760208381015190860151845187511491141615614dca57614d858a8a8a8a8a8a614e52565b505f905080614e45565b5f614de086858c6150ed565b90505f614dee88878d6150ed565b9050614dfb8c838361516d565b614e078c836002614adf565b9350614e1484898d6151a0565b614e1f84878d6151a0565b614e2a88858d6150ed565b9250614e378c8484615216565b614e4283888d6151a0565b50505b9850989650505050505050565b5f80835f03614e6557505f905080614f06565b602083015183511590151615614e7f57505f905080614f06565b5f614e8c89866002614adf565b9050614e99898289615216565b614ea481878a6152f2565b5f614eaf858a615347565b9050614ebc8a838361516d565b614ec88a836002614adf565b9350614ed584878b6151a0565b614ee084878b6151a0565b614eeb86858b6150ed565b9250614ef88a8484615216565b614f0383868b6151a0565b50505b965096945050505050565b5f80835f03614f2457505f905080614f06565b602083015183511590151615614f3e57505f905080614f06565b5f614f4b89866002614adf565b9050614f58898289615216565b614f6381878a6152f2565b5f614f6e858a615347565b9050614f7b8a838361516d565b614f878a836002614adf565b9350614f9484878b6151a0565b614f9f84878b6151a0565b614faa86858b6150ed565b9250614fb78a8484615216565b614fc283868b6151a0565b602083015183511590151615614fdf575f80935093505050614f06565b614fec8a838660026153a7565b614ff78a838a615216565b61500282888b6152f2565b61500d81848b6153d7565b6150188a838361516d565b6150258a878460026153a7565b61503086858b6151a0565b61503b86858b6151a0565b6150478585888c6153f6565b6150528a8684615216565b61505d85848b6151a0565b60208501518551159015161561507a575f80935093505050614f06565b6150878a838860026153a7565b6150928a838a615216565b61509d82888b6152f2565b6150a881868b6153d7565b6150b38a838361516d565b6150c08a858460026153a7565b6150cb84878b6151a0565b6150d684878b6151a0565b6150e28387868c6153f6565b614ef88a8484615216565b5f6150fe6040808051918201905290565b90505f61510b858561403f565b126151345760208085015181850151810391830182905284518651929091109103038152610325565b60208481015183820151810183830181815285518851019282109290920180855292860151810391829052855191119103038152610325565b6103608301925080518360600152602081015183608001526040816101208560055afa50610f4d61036084038383615216565b5f6151ab848461403f565b126151d2575060208281018051918301518203908190529151835191909211919003039052565b6151f48382602082810180519183015182019081905291518351019110019052565b5060208281018051918301518203908190529151835191909211919003039052565b6152da828261018086018251602093840151835193850151608081811c6fffffffffffffffffffffffffffffffff80851682810294821695841c86810287830280871c820188810180891b9287169290920160408d01528c8402878c02958e0297909402998b02988210921191909101861b90861c018601878101858101958610981196119590950195909501831b82841c01850184810180851b939092169290920198870198909852959093029086109190941001811b93901c92909201019052565b610120830192506040826101208560055afa50505050565b6153148383602082810180519183015182019081905291518351019110019052565b5f61531f848361403f565b12610f4d57602080840180519183015182039081905282518551929091119103038352505050565b5f6153586040808051918201905290565b6020808501518551600190811b60ff83901c1784521b9082015290505f61537f828461403f565b126102dd576020808201805191840151820390819052835183519290911191030381526102dd565b610240840193508151846060015260208201518460800152808460a001526040836101008660055afa5050505050565b6020808301518351600190811b60ff83901c1786521b90840152615314565b5f615401848461403f565b1261542a5760208084015181840151810391860182905283518551929091109103038452613c29565b60208381015182820151810186830181815284518751019282109290920180885292850151810391829052845191119103038452613c29565b60405180610a0001604052806050906020820280368337509192915050565b6040518061010001604052806008906020820280368337509192915050565b6040518061020001604052806010906020820280368337509192915050565b6040518061080001604052806040905b6154d86154ee565b8152602001906001900390816154d05790505090565b60405180604001604052806002906020820280368337509192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f806040838503121561554a575f80fd5b823567ffffffffffffffff80821115615561575f80fd5b818501915085601f830112615574575f80fd5b8135818111156155865761558661550c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156155cc576155cc61550c565b816040528281528860208487010111156155e4575f80fd5b826020860160208301375f602093820184015298969091013596505050505050565b5f5b83811015615620578181015183820152602001615608565b50505f910152565b5f815180845261563f816020860160208601615606565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815281511515602082015267ffffffffffffffff6020830151166040820152604082015160070b6060820152606082015160808201525f608083015160a0808401526109e660c0840182615628565b602081525f6103256020830184615628565b5f602082840312156156e4575f80fd5b5035919050565b600181811c908216806156ff57607f821691505b602082108103615736577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102dd576102dd61573c565b600782810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffff80000000000000008112677fffffffffffffff821317156102dd576102dd61573c565b808201808211156102dd576102dd61573c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85151560f81b81527fffffffffffffffff0000000000000000000000000000000000000000000000008560c01b1660018201528360c01b60098201528260118201525f8251615858816031850160208701615606565b919091016031019695505050505050565b601f821115610f4d57805f5260205f20601f840160051c8101602085101561588e5750805b601f840160051c820191505b818110156158ad575f815560010161589a565b5050505050565b815167ffffffffffffffff8111156158ce576158ce61550c565b6158e2816158dc84546156eb565b84615869565b602080601f831160018114615934575f84156158fe5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159c8565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561598057888601518255948401946001909101908401615961565b50858210156159bc57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115615a2957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a0f57615a0f61573c565b80851615615a1c57918102915b93841c93908002906159d5565b509250929050565b5f82615a3f575060016102dd565b81615a4b57505f6102dd565b8160018114615a615760028114615a6b57615a87565b60019150506102dd565b60ff841115615a7c57615a7c61573c565b50506001821b6102dd565b5060208310610133831016604e8410600b8410161715615aaa575081810a6102dd565b615ab483836159d0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615ae657615ae661573c565b029392505050565b5f6103258383615a31565b60ff82811682821603908111156102dd576102dd61573c565b60ff8181168382160290811690818114615b2e57615b2e61573c565b5092915050565b80820281158282048414176102dd576102dd61573c565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615b7c57615b7c61573c565b5060010190565b5f81615b9157615b9161573c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615bf257615bf2615bb7565b500690565b5f82615c0557615c05615bb7565b500490565b61ffff8181168382160280821691908281146140dc576140dc61573c565b61ffff818116838216019080821115615b2e57615b2e61573c565b60ff81811683821601908111156102dd576102dd61573c565b5f8551615c6d818460208a01615606565b7fff0000000000000000000000000000000000000000000000000000000000000086169083019081528451615ca9816001840160208901615606565b8082019150507fffffffffffffffff000000000000000000000000000000000000000000000000841660018201526009810191505095945050505050565b8181035f831280158383131683831282161715615b2e57615b2e61573c565b5f82615d1457615d14615bb7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615d6857615d6861573c565b500590565b8082018281125f8312801582168215821617156140dc576140dc61573c565b8082025f82127f800000000000000000000000000000000000000000000000000000000000000084141615615dc357615dc361573c565b81810583148215176102dd576102dd61573c565b67ffffffffffffffff828116828216039080821115615b2e57615b2e61573c56feb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5ffc0254eba608c1f36870e29ada90be46383292736e894bfff672d989444b5051e534a4b1f6dbe3c0bc581a32b7b176070ede12d69a3fea211b66e752cf7dd1dd095f6f1370f4170843d9dc100121e4cf63012809664487c9796284304dc53ff4ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffcffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffa164736f6c6343000818000afc0254eba608c1f36870e29ada90be46383292736e894bfff672d989444b5051e534a4b1f6dbe3c0bc581a32b7b176070ede12d69a3fea211b66e752cf7dd1dd095f6f1370f4170843d9dc100121e4cf63012809664487c9796284304dc53ff4",
}

// CertManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use CertManagerMetaData.ABI instead.
var CertManagerABI = CertManagerMetaData.ABI

// CertManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use CertManagerMetaData.Bin instead.
var CertManagerBin = CertManagerMetaData.Bin

// DeployCertManager deploys a new Ethereum contract, binding an instance of CertManager to it.
func DeployCertManager(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *CertManager, error) {
	parsed, err := CertManagerMetaData.GetAbi()
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	if parsed == nil {
		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
	}

	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CertManagerBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &CertManager{CertManagerCaller: CertManagerCaller{contract: contract}, CertManagerTransactor: CertManagerTransactor{contract: contract}, CertManagerFilterer: CertManagerFilterer{contract: contract}}, nil
}

// CertManager is an auto generated Go binding around an Ethereum contract.
type CertManager struct {
	CertManagerCaller     // Read-only binding to the contract
	CertManagerTransactor // Write-only binding to the contract
	CertManagerFilterer   // Log filterer for contract events
}

// CertManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type CertManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// CertManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type CertManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// CertManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type CertManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// CertManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type CertManagerSession struct {
	Contract     *CertManager      // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}

// CertManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type CertManagerCallerSession struct {
	Contract *CertManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}

// CertManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type CertManagerTransactorSession struct {
	Contract     *CertManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}

// CertManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type CertManagerRaw struct {
	Contract *CertManager // Generic contract binding to access the raw methods on
}

// CertManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type CertManagerCallerRaw struct {
	Contract *CertManagerCaller // Generic read-only contract binding to access the raw methods on
}

// CertManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type CertManagerTransactorRaw struct {
	Contract *CertManagerTransactor // Generic write-only contract binding to access the raw methods on
}

// NewCertManager creates a new instance of CertManager, bound to a specific deployed contract.
func NewCertManager(address common.Address, backend bind.ContractBackend) (*CertManager, error) {
	contract, err := bindCertManager(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &CertManager{CertManagerCaller: CertManagerCaller{contract: contract}, CertManagerTransactor: CertManagerTransactor{contract: contract}, CertManagerFilterer: CertManagerFilterer{contract: contract}}, nil
}

// NewCertManagerCaller creates a new read-only instance of CertManager, bound to a specific deployed contract.
func NewCertManagerCaller(address common.Address, caller bind.ContractCaller) (*CertManagerCaller, error) {
	contract, err := bindCertManager(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &CertManagerCaller{contract: contract}, nil
}

// NewCertManagerTransactor creates a new write-only instance of CertManager, bound to a specific deployed contract.
func NewCertManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*CertManagerTransactor, error) {
	contract, err := bindCertManager(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &CertManagerTransactor{contract: contract}, nil
}

// NewCertManagerFilterer creates a new log filterer instance of CertManager, bound to a specific deployed contract.
func NewCertManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*CertManagerFilterer, error) {
	contract, err := bindCertManager(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &CertManagerFilterer{contract: contract}, nil
}

// bindCertManager binds a generic wrapper to an already deployed contract.
func bindCertManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := CertManagerMetaData.GetAbi()
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_CertManager *CertManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _CertManager.Contract.CertManagerCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_CertManager *CertManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _CertManager.Contract.CertManagerTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_CertManager *CertManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _CertManager.Contract.CertManagerTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_CertManager *CertManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _CertManager.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_CertManager *CertManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _CertManager.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_CertManager *CertManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _CertManager.Contract.contract.Transact(opts, method, params...)
}

// BASICCONSTRAINTSOID is a free data retrieval call binding the contract method 0x4519a352.
//
// Solidity: function BASIC_CONSTRAINTS_OID() view returns(bytes32)
func (_CertManager *CertManagerCaller) BASICCONSTRAINTSOID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "BASIC_CONSTRAINTS_OID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// BASICCONSTRAINTSOID is a free data retrieval call binding the contract method 0x4519a352.
//
// Solidity: function BASIC_CONSTRAINTS_OID() view returns(bytes32)
func (_CertManager *CertManagerSession) BASICCONSTRAINTSOID() ([32]byte, error) {
	return _CertManager.Contract.BASICCONSTRAINTSOID(&_CertManager.CallOpts)
}

// BASICCONSTRAINTSOID is a free data retrieval call binding the contract method 0x4519a352.
//
// Solidity: function BASIC_CONSTRAINTS_OID() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) BASICCONSTRAINTSOID() ([32]byte, error) {
	return _CertManager.Contract.BASICCONSTRAINTSOID(&_CertManager.CallOpts)
}

// CERTALGOOID is a free data retrieval call binding the contract method 0xaf9bdbc2.
//
// Solidity: function CERT_ALGO_OID() view returns(bytes32)
func (_CertManager *CertManagerCaller) CERTALGOOID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "CERT_ALGO_OID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// CERTALGOOID is a free data retrieval call binding the contract method 0xaf9bdbc2.
//
// Solidity: function CERT_ALGO_OID() view returns(bytes32)
func (_CertManager *CertManagerSession) CERTALGOOID() ([32]byte, error) {
	return _CertManager.Contract.CERTALGOOID(&_CertManager.CallOpts)
}

// CERTALGOOID is a free data retrieval call binding the contract method 0xaf9bdbc2.
//
// Solidity: function CERT_ALGO_OID() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) CERTALGOOID() ([32]byte, error) {
	return _CertManager.Contract.CERTALGOOID(&_CertManager.CallOpts)
}

// ECPUBKEYOID is a free data retrieval call binding the contract method 0xf69a82fe.
//
// Solidity: function EC_PUB_KEY_OID() view returns(bytes32)
func (_CertManager *CertManagerCaller) ECPUBKEYOID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "EC_PUB_KEY_OID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// ECPUBKEYOID is a free data retrieval call binding the contract method 0xf69a82fe.
//
// Solidity: function EC_PUB_KEY_OID() view returns(bytes32)
func (_CertManager *CertManagerSession) ECPUBKEYOID() ([32]byte, error) {
	return _CertManager.Contract.ECPUBKEYOID(&_CertManager.CallOpts)
}

// ECPUBKEYOID is a free data retrieval call binding the contract method 0xf69a82fe.
//
// Solidity: function EC_PUB_KEY_OID() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) ECPUBKEYOID() ([32]byte, error) {
	return _CertManager.Contract.ECPUBKEYOID(&_CertManager.CallOpts)
}

// KEYUSAGEOID is a free data retrieval call binding the contract method 0xaeb255ea.
//
// Solidity: function KEY_USAGE_OID() view returns(bytes32)
func (_CertManager *CertManagerCaller) KEYUSAGEOID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "KEY_USAGE_OID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// KEYUSAGEOID is a free data retrieval call binding the contract method 0xaeb255ea.
//
// Solidity: function KEY_USAGE_OID() view returns(bytes32)
func (_CertManager *CertManagerSession) KEYUSAGEOID() ([32]byte, error) {
	return _CertManager.Contract.KEYUSAGEOID(&_CertManager.CallOpts)
}

// KEYUSAGEOID is a free data retrieval call binding the contract method 0xaeb255ea.
//
// Solidity: function KEY_USAGE_OID() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) KEYUSAGEOID() ([32]byte, error) {
	return _CertManager.Contract.KEYUSAGEOID(&_CertManager.CallOpts)
}

// ROOTCACERTHASH is a free data retrieval call binding the contract method 0x8fb57b62.
//
// Solidity: function ROOT_CA_CERT_HASH() view returns(bytes32)
func (_CertManager *CertManagerCaller) ROOTCACERTHASH(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "ROOT_CA_CERT_HASH")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// ROOTCACERTHASH is a free data retrieval call binding the contract method 0x8fb57b62.
//
// Solidity: function ROOT_CA_CERT_HASH() view returns(bytes32)
func (_CertManager *CertManagerSession) ROOTCACERTHASH() ([32]byte, error) {
	return _CertManager.Contract.ROOTCACERTHASH(&_CertManager.CallOpts)
}

// ROOTCACERTHASH is a free data retrieval call binding the contract method 0x8fb57b62.
//
// Solidity: function ROOT_CA_CERT_HASH() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) ROOTCACERTHASH() ([32]byte, error) {
	return _CertManager.Contract.ROOTCACERTHASH(&_CertManager.CallOpts)
}

// ROOTCACERTMAXPATHLEN is a free data retrieval call binding the contract method 0x9ecc0050.
//
// Solidity: function ROOT_CA_CERT_MAX_PATH_LEN() view returns(int64)
func (_CertManager *CertManagerCaller) ROOTCACERTMAXPATHLEN(opts *bind.CallOpts) (int64, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "ROOT_CA_CERT_MAX_PATH_LEN")

	if err != nil {
		return *new(int64), err
	}

	out0 := *abi.ConvertType(out[0], new(int64)).(*int64)

	return out0, err

}

// ROOTCACERTMAXPATHLEN is a free data retrieval call binding the contract method 0x9ecc0050.
//
// Solidity: function ROOT_CA_CERT_MAX_PATH_LEN() view returns(int64)
func (_CertManager *CertManagerSession) ROOTCACERTMAXPATHLEN() (int64, error) {
	return _CertManager.Contract.ROOTCACERTMAXPATHLEN(&_CertManager.CallOpts)
}

// ROOTCACERTMAXPATHLEN is a free data retrieval call binding the contract method 0x9ecc0050.
//
// Solidity: function ROOT_CA_CERT_MAX_PATH_LEN() view returns(int64)
func (_CertManager *CertManagerCallerSession) ROOTCACERTMAXPATHLEN() (int64, error) {
	return _CertManager.Contract.ROOTCACERTMAXPATHLEN(&_CertManager.CallOpts)
}

// ROOTCACERTNOTAFTER is a free data retrieval call binding the contract method 0x58e3139e.
//
// Solidity: function ROOT_CA_CERT_NOT_AFTER() view returns(uint64)
func (_CertManager *CertManagerCaller) ROOTCACERTNOTAFTER(opts *bind.CallOpts) (uint64, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "ROOT_CA_CERT_NOT_AFTER")

	if err != nil {
		return *new(uint64), err
	}

	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)

	return out0, err

}

// ROOTCACERTNOTAFTER is a free data retrieval call binding the contract method 0x58e3139e.
//
// Solidity: function ROOT_CA_CERT_NOT_AFTER() view returns(uint64)
func (_CertManager *CertManagerSession) ROOTCACERTNOTAFTER() (uint64, error) {
	return _CertManager.Contract.ROOTCACERTNOTAFTER(&_CertManager.CallOpts)
}

// ROOTCACERTNOTAFTER is a free data retrieval call binding the contract method 0x58e3139e.
//
// Solidity: function ROOT_CA_CERT_NOT_AFTER() view returns(uint64)
func (_CertManager *CertManagerCallerSession) ROOTCACERTNOTAFTER() (uint64, error) {
	return _CertManager.Contract.ROOTCACERTNOTAFTER(&_CertManager.CallOpts)
}

// ROOTCACERTPUBKEY is a free data retrieval call binding the contract method 0xab68988d.
//
// Solidity: function ROOT_CA_CERT_PUB_KEY() view returns(bytes)
func (_CertManager *CertManagerCaller) ROOTCACERTPUBKEY(opts *bind.CallOpts) ([]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "ROOT_CA_CERT_PUB_KEY")

	if err != nil {
		return *new([]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)

	return out0, err

}

// ROOTCACERTPUBKEY is a free data retrieval call binding the contract method 0xab68988d.
//
// Solidity: function ROOT_CA_CERT_PUB_KEY() view returns(bytes)
func (_CertManager *CertManagerSession) ROOTCACERTPUBKEY() ([]byte, error) {
	return _CertManager.Contract.ROOTCACERTPUBKEY(&_CertManager.CallOpts)
}

// ROOTCACERTPUBKEY is a free data retrieval call binding the contract method 0xab68988d.
//
// Solidity: function ROOT_CA_CERT_PUB_KEY() view returns(bytes)
func (_CertManager *CertManagerCallerSession) ROOTCACERTPUBKEY() ([]byte, error) {
	return _CertManager.Contract.ROOTCACERTPUBKEY(&_CertManager.CallOpts)
}

// ROOTCACERTSUBJECTHASH is a free data retrieval call binding the contract method 0x441b31df.
//
// Solidity: function ROOT_CA_CERT_SUBJECT_HASH() view returns(bytes32)
func (_CertManager *CertManagerCaller) ROOTCACERTSUBJECTHASH(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "ROOT_CA_CERT_SUBJECT_HASH")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// ROOTCACERTSUBJECTHASH is a free data retrieval call binding the contract method 0x441b31df.
//
// Solidity: function ROOT_CA_CERT_SUBJECT_HASH() view returns(bytes32)
func (_CertManager *CertManagerSession) ROOTCACERTSUBJECTHASH() ([32]byte, error) {
	return _CertManager.Contract.ROOTCACERTSUBJECTHASH(&_CertManager.CallOpts)
}

// ROOTCACERTSUBJECTHASH is a free data retrieval call binding the contract method 0x441b31df.
//
// Solidity: function ROOT_CA_CERT_SUBJECT_HASH() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) ROOTCACERTSUBJECTHASH() ([32]byte, error) {
	return _CertManager.Contract.ROOTCACERTSUBJECTHASH(&_CertManager.CallOpts)
}

// SECP384R1OID is a free data retrieval call binding the contract method 0x5ab70904.
//
// Solidity: function SECP_384_R1_OID() view returns(bytes32)
func (_CertManager *CertManagerCaller) SECP384R1OID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "SECP_384_R1_OID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// SECP384R1OID is a free data retrieval call binding the contract method 0x5ab70904.
//
// Solidity: function SECP_384_R1_OID() view returns(bytes32)
func (_CertManager *CertManagerSession) SECP384R1OID() ([32]byte, error) {
	return _CertManager.Contract.SECP384R1OID(&_CertManager.CallOpts)
}

// SECP384R1OID is a free data retrieval call binding the contract method 0x5ab70904.
//
// Solidity: function SECP_384_R1_OID() view returns(bytes32)
func (_CertManager *CertManagerCallerSession) SECP384R1OID() ([32]byte, error) {
	return _CertManager.Contract.SECP384R1OID(&_CertManager.CallOpts)
}

// Verified is a free data retrieval call binding the contract method 0xc59e43e5.
//
// Solidity: function verified(bytes32 ) view returns(bytes)
func (_CertManager *CertManagerCaller) Verified(opts *bind.CallOpts, arg0 [32]byte) ([]byte, error) {
	var out []interface{}
	err := _CertManager.contract.Call(opts, &out, "verified", arg0)

	if err != nil {
		return *new([]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)

	return out0, err

}

// Verified is a free data retrieval call binding the contract method 0xc59e43e5.
//
// Solidity: function verified(bytes32 ) view returns(bytes)
func (_CertManager *CertManagerSession) Verified(arg0 [32]byte) ([]byte, error) {
	return _CertManager.Contract.Verified(&_CertManager.CallOpts, arg0)
}

// Verified is a free data retrieval call binding the contract method 0xc59e43e5.
//
// Solidity: function verified(bytes32 ) view returns(bytes)
func (_CertManager *CertManagerCallerSession) Verified(arg0 [32]byte) ([]byte, error) {
	return _CertManager.Contract.Verified(&_CertManager.CallOpts, arg0)
}

// VerifyCACert is a paid mutator transaction binding the contract method 0x0890702c.
//
// Solidity: function verifyCACert(bytes cert, bytes32 parentCertHash) returns(bytes32)
func (_CertManager *CertManagerTransactor) VerifyCACert(opts *bind.TransactOpts, cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.contract.Transact(opts, "verifyCACert", cert, parentCertHash)
}

// VerifyCACert is a paid mutator transaction binding the contract method 0x0890702c.
//
// Solidity: function verifyCACert(bytes cert, bytes32 parentCertHash) returns(bytes32)
func (_CertManager *CertManagerSession) VerifyCACert(cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.Contract.VerifyCACert(&_CertManager.TransactOpts, cert, parentCertHash)
}

// VerifyCACert is a paid mutator transaction binding the contract method 0x0890702c.
//
// Solidity: function verifyCACert(bytes cert, bytes32 parentCertHash) returns(bytes32)
func (_CertManager *CertManagerTransactorSession) VerifyCACert(cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.Contract.VerifyCACert(&_CertManager.TransactOpts, cert, parentCertHash)
}

// VerifyClientCert is a paid mutator transaction binding the contract method 0x28c54637.
//
// Solidity: function verifyClientCert(bytes cert, bytes32 parentCertHash) returns((bool,uint64,int64,bytes32,bytes))
func (_CertManager *CertManagerTransactor) VerifyClientCert(opts *bind.TransactOpts, cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.contract.Transact(opts, "verifyClientCert", cert, parentCertHash)
}

// VerifyClientCert is a paid mutator transaction binding the contract method 0x28c54637.
//
// Solidity: function verifyClientCert(bytes cert, bytes32 parentCertHash) returns((bool,uint64,int64,bytes32,bytes))
func (_CertManager *CertManagerSession) VerifyClientCert(cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.Contract.VerifyClientCert(&_CertManager.TransactOpts, cert, parentCertHash)
}

// VerifyClientCert is a paid mutator transaction binding the contract method 0x28c54637.
//
// Solidity: function verifyClientCert(bytes cert, bytes32 parentCertHash) returns((bool,uint64,int64,bytes32,bytes))
func (_CertManager *CertManagerTransactorSession) VerifyClientCert(cert []byte, parentCertHash [32]byte) (*types.Transaction, error) {
	return _CertManager.Contract.VerifyClientCert(&_CertManager.TransactOpts, cert, parentCertHash)
}

// CertManagerCertVerifiedIterator is returned from FilterCertVerified and is used to iterate over the raw logs and unpacked data for CertVerified events raised by the CertManager contract.
type CertManagerCertVerifiedIterator struct {
	Event *CertManagerCertVerified // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *CertManagerCertVerifiedIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(CertManagerCertVerified)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(CertManagerCertVerified)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *CertManagerCertVerifiedIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *CertManagerCertVerifiedIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// CertManagerCertVerified represents a CertVerified event raised by the CertManager contract.
type CertManagerCertVerified struct {
	CertHash [32]byte
	Raw      types.Log // Blockchain specific contextual infos
}

// FilterCertVerified is a free log retrieval operation binding the contract event 0x694e63280ec3524c75db17994cf1341b1dbc3efa9f68ad3f4b8da1f00804828e.
//
// Solidity: event CertVerified(bytes32 indexed certHash)
func (_CertManager *CertManagerFilterer) FilterCertVerified(opts *bind.FilterOpts, certHash [][32]byte) (*CertManagerCertVerifiedIterator, error) {

	var certHashRule []interface{}
	for _, certHashItem := range certHash {
		certHashRule = append(certHashRule, certHashItem)
	}

	logs, sub, err := _CertManager.contract.FilterLogs(opts, "CertVerified", certHashRule)
	if err != nil {
		return nil, err
	}
	return &CertManagerCertVerifiedIterator{contract: _CertManager.contract, event: "CertVerified", logs: logs, sub: sub}, nil
}

// WatchCertVerified is a free log subscription operation binding the contract event 0x694e63280ec3524c75db17994cf1341b1dbc3efa9f68ad3f4b8da1f00804828e.
//
// Solidity: event CertVerified(bytes32 indexed certHash)
func (_CertManager *CertManagerFilterer) WatchCertVerified(opts *bind.WatchOpts, sink chan<- *CertManagerCertVerified, certHash [][32]byte) (event.Subscription, error) {

	var certHashRule []interface{}
	for _, certHashItem := range certHash {
		certHashRule = append(certHashRule, certHashItem)
	}

	logs, sub, err := _CertManager.contract.WatchLogs(opts, "CertVerified", certHashRule)
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(CertManagerCertVerified)
				if err := _CertManager.contract.UnpackLog(event, "CertVerified", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseCertVerified is a log parse operation binding the contract event 0x694e63280ec3524c75db17994cf1341b1dbc3efa9f68ad3f4b8da1f00804828e.
//
// Solidity: event CertVerified(bytes32 indexed certHash)
func (_CertManager *CertManagerFilterer) ParseCertVerified(log types.Log) (*CertManagerCertVerified, error) {
	event := new(CertManagerCertVerified)
	if err := _CertManager.contract.UnpackLog(event, "CertVerified", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
