{
  "_format": "hh-sol-artifact-1",
  "contractName": "CanonicalTransactionChain",
  "sourceName": "contracts/L1/rollup/CanonicalTransactionChain.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_libAddressManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_maxTransactionGasLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_enqueueGasCost",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_nextqIndex",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_totalElement",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_batchSize",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_numQueuedTransactions",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_timestamp",
          "type": "uint40"
        },
        {
          "indexed": false,
          "internalType": "uint40",
          "name": "_blockNumber",
          "type": "uint40"
        }
      ],
      "name": "CTCBatchReset",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "enqueueGasCost",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "enqueueL2GasPrepaid",
          "type": "uint256"
        }
      ],
      "name": "L2GasParamsUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_startingQueueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_numQueueElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "name": "QueueBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_startingQueueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_numQueueElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "name": "SequencerBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_batchRoot",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_batchSize",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_prevTotalElements",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_signature",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "TransactionBatchAppended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_l1TxOrigin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_gasLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "_queueIndex",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_timestamp",
          "type": "uint256"
        }
      ],
      "name": "TransactionEnqueued",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_ROLLUP_TX_SIZE",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_ROLLUP_TX_GAS",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "appendSequencerBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "batches",
      "outputs": [
        {
          "internalType": "contract IChainStorageContainer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasLimit",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "enqueue",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "enqueueGasCost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "enqueueL2GasPrepaid",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastBlockNumber",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastTimestamp",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNextQueueIndex",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNumPendingQueueElements",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "getQueueElement",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "transactionHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint40",
              "name": "timestamp",
              "type": "uint40"
            },
            {
              "internalType": "uint40",
              "name": "blockNumber",
              "type": "uint40"
            }
          ],
          "internalType": "struct Lib_BVMCodec.QueueElement",
          "name": "_element",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getQueueLength",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalBatches",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalBatches",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalElements",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_totalElements",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l2GasDiscountDivisor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "libAddressManager",
      "outputs": [
        {
          "internalType": "contract Lib_AddressManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxTransactionGasLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_batchIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint40",
          "name": "_totalElement",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "_batchSize",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "_nextqIndex",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "_numQueuedTransactions",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "_timestamp",
          "type": "uint40"
        },
        {
          "internalType": "uint40",
          "name": "_blockNumber",
          "type": "uint40"
        }
      ],
      "name": "resetIndex",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        }
      ],
      "name": "resolve",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_l2GasDiscountDivisor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_enqueueGasCost",
          "type": "uint256"
        }
      ],
      "name": "setGasParams",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162001f5c38038062001f5c833981016040819052620000349162000078565b600080546001600160a01b0319166001600160a01b0386161790556004839055600282905560018190556200006a8183620000c5565b60035550620000f392505050565b600080600080608085870312156200008f57600080fd5b84516001600160a01b0381168114620000a757600080fd5b60208601516040870151606090970151919890975090945092505050565b6000816000190483118215151615620000ee57634e487b7160e01b600052601160045260246000fd5b500290565b611e5980620001036000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063cfdf677e1161008c578063e654b1fb11610066578063e654b1fb146102de578063edcc4a45146102e7578063f722b41a146102fa57600080fd5b8063cfdf677e146102c6578063d0f89344146102ce578063e561dddc146102d657600080fd5b8063a17e44c6116100bd578063a17e44c6146102a2578063b8f77005146102b5578063ccf987c8146102bd57600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb3660046117e9565b610302565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610380565b60405164ffffffffff909116815260200161018f565b6101b861024d3660046118c5565b610394565b610229610441565b61026d61026836600461193b565b610455565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108b7565b61018561c35081565b61018560045481565b61026d6102b03660046119c2565b6108d2565b600654610229565b61018560025481565b6101b8610c9a565b61026d610cc2565b6101856111de565b61018560015481565b61026d6102f5366004611a41565b611265565b6102296113fc565b60408051606081018252600080825260208201819052918101919091526006828154811061033257610332611a63565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061038b611418565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103eb908590600401611afd565b60206040518083038186803b15801561040357600080fd5b505afa158015610417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043b9190611b17565b92915050565b60008061044c611418565b95945050505050565b61c350815111156104ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b60045482111561057f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104e4565b620186a0821015610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104e4565b6003548211156106fa5760006002546003548461062f9190611b63565b6106399190611b7a565b905060005a90508181116106cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104e4565b60005b825a6106de9084611b63565b10156106f657806106ee81611bb5565b9150506106d2565b5050505b60003332141561070b575033610724565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073d9493929190611bee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061084391611b63565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108a793929190611c37565b60405180910390a4505050505050565b6000806108c2611418565b50505064ffffffffff1692915050565b6108da610c9a565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561091f57600080fd5b505afa158015610933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109579190611c60565b87106109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016104e4565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2557600080fd5b505afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190611b17565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c65206279207468652061646472657373206d616e60448201527f61676572206f776e65722e00000000000000000000000000000000000000000060648201526084016104e4565b6000610b4a610b268789611c79565b610b308688611c79565b602890811b91909117605086901b17607885901b17901b90565b9050610b54610c9a565b6040517f167fd681000000000000000000000000000000000000000000000000000000008152600481018a90527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008316602482015273ffffffffffffffffffffffffffffffffffffffff919091169063167fd68190604401600060405180830381600087803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff898116918217909255604080519182528b831660208301528a8316908201528782166060820152868216608082015290851660a08201528a92507f293a9e87838119a52e3dd8eabf034ae7eda0da1bfdb33ee7721a6afca0b166b8915060c00160405180910390a25050505050505050565b6000610cbd604051806060016040528060218152602001611e0360219139610394565b905090565b60043560d81c60093560e890811c90600c35901c610cde6108b7565b8364ffffffffff1614610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104e4565b610db16040518060400160405280600d81526020017f42564d5f53657175656e63657200000000000000000000000000000000000000815250610394565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104e4565b6000610e7d62ffffff83166010611ca2565b610e8890600f611cdf565b905064ffffffffff8116361015610f21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104e4565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610fb2576000610f788263ffffffff166114d3565b8051909350839150610f8a9086611cf7565b9450826020015184610f9c9190611c79565b9350508080610faa90611d16565b915050610f54565b5060065464ffffffffff83161115611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104e4565b60006110838462ffffff8916611d3a565b63ffffffff1690506000808360200151600014156110ac5750506040820151606083015161111d565b600060066110bb600188611d5f565b64ffffffffff16815481106110d2576110d2611a63565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b61114161112b600143611b63565b408a62ffffff168564ffffffffff16858561155a565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89961116c8487611d5f565b846111756108b7565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006111e8610c9a565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190611c60565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112cb57600080fd5b505afa1580156112df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113039190611b17565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104e4565b600181905560028290556113ab8183611ca2565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b600554600654600091610cbd9164ffffffffff90911690611d5f565b6000806000806000611428610c9a565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561146d57600080fd5b505afa158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190611d7d565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6114fe6040518060800160405280600081526020016000815260200160008152602001600081525090565b600061150b601084611ca2565b61151690600f611cdf565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000611564610c9a565b9050600080611571611418565b50509150915060006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ca57600080fd5b505afa1580156115de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116029190611c60565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250905080600001517fa47512905cf577d4cfae2efc3df461008ddb7234e91ce7f4eefcdb51e1077ccf82602001518360400151846060015185608001518660a0015160405161169a959493929190611dbf565b60405180910390a260006116ad826117a0565b905060006116e88360400151866116c49190611c79565b6116ce8b87611c79565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561177b57600080fd5b505af115801561178f573d6000803e3d6000fd5b505050505050505050505050505050565b6020808201516040808401516060850151608086015160a087015193516000966117cc96959101611dbf565b604051602081830303815290604052805190602001209050919050565b6000602082840312156117fb57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561184c5761184c611802565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561189257611892611802565b816040528093508581528686860111156118ab57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156118d757600080fd5b813567ffffffffffffffff8111156118ee57600080fd5b8201601f810184136118ff57600080fd5b61190e84823560208401611831565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461193857600080fd5b50565b60008060006060848603121561195057600080fd5b833561195b81611916565b925060208401359150604084013567ffffffffffffffff81111561197e57600080fd5b8401601f8101861361198f57600080fd5b61199e86823560208401611831565b9150509250925092565b803564ffffffffff811681146119bd57600080fd5b919050565b600080600080600080600060e0888a0312156119dd57600080fd5b873596506119ed602089016119a8565b95506119fb604089016119a8565b9450611a09606089016119a8565b9350611a17608089016119a8565b9250611a2560a089016119a8565b9150611a3360c089016119a8565b905092959891949750929550565b60008060408385031215611a5457600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611ab857602081850181015186830182015201611a9c565b81811115611aca576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b106020830184611a92565b9392505050565b600060208284031215611b2957600080fd5b8151611b1081611916565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611b7557611b75611b34565b500390565b600082611bb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611be757611be7611b34565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611c2d6080830184611a92565b9695505050505050565b838152606060208201526000611c506060830185611a92565b9050826040830152949350505050565b600060208284031215611c7257600080fd5b5051919050565b600064ffffffffff808316818516808303821115611c9957611c99611b34565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cda57611cda611b34565b500290565b60008219821115611cf257611cf2611b34565b500190565b600063ffffffff808316818516808303821115611c9957611c99611b34565b600063ffffffff80831681811415611d3057611d30611b34565b6001019392505050565b600063ffffffff83811690831681811015611d5757611d57611b34565b039392505050565b600064ffffffffff83811690831681811015611d5757611d57611b34565b600060208284031215611d8f57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081168114611b1057600080fd5b85815284602082015283604082015260a060608201526000611de460a0830185611a92565b8281036080840152611df68185611a92565b9897505050505050505056fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a26469706673582212209d002244bfb75e3500e4cb634bf4eaa20b90de638f28e9fac2de2b126617ee8464736f6c63430008090033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063876ed5cb116100d8578063cfdf677e1161008c578063e654b1fb11610066578063e654b1fb146102de578063edcc4a45146102e7578063f722b41a146102fa57600080fd5b8063cfdf677e146102c6578063d0f89344146102ce578063e561dddc146102d657600080fd5b8063a17e44c6116100bd578063a17e44c6146102a2578063b8f77005146102b5578063ccf987c8146102bd57600080fd5b8063876ed5cb146102905780638d38c6c11461029957600080fd5b80635ae6256d1161012f57806378f4b2f21161011457806378f4b2f21461026f5780637a167a8a146102795780637aa63a861461028857600080fd5b80635ae6256d146102525780636fee07e01461025a57600080fd5b80632a7f18be116101605780632a7f18be146101dd5780633789977014610221578063461a44781461023f57600080fd5b80630b3dfa971461017c578063299ca47814610198575b600080fd5b61018560035481565b6040519081526020015b60405180910390f35b6000546101b89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101f06101eb3660046117e9565b610302565b604080518251815260208084015164ffffffffff90811691830191909152928201519092169082015260600161018f565b610229610380565b60405164ffffffffff909116815260200161018f565b6101b861024d3660046118c5565b610394565b610229610441565b61026d61026836600461193b565b610455565b005b610185620186a081565b60055464ffffffffff16610229565b6101856108b7565b61018561c35081565b61018560045481565b61026d6102b03660046119c2565b6108d2565b600654610229565b61018560025481565b6101b8610c9a565b61026d610cc2565b6101856111de565b61018560015481565b61026d6102f5366004611a41565b611265565b6102296113fc565b60408051606081018252600080825260208201819052918101919091526006828154811061033257610332611a63565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061038b611418565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103eb908590600401611afd565b60206040518083038186803b15801561040357600080fd5b505afa158015610417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043b9190611b17565b92915050565b60008061044c611418565b95945050505050565b61c350815111156104ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b60045482111561057f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104e4565b620186a0821015610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104e4565b6003548211156106fa5760006002546003548461062f9190611b63565b6106399190611b7a565b905060005a90508181116106cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104e4565b60005b825a6106de9084611b63565b10156106f657806106ee81611bb5565b9150506106d2565b5050505b60003332141561070b575033610724565b5033731111000000000000000000000000000000001111015b60008185858560405160200161073d9493929190611bee565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff000000000000000000009097169190931617949094179055915491935061084391611b63565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108a793929190611c37565b60405180910390a4505050505050565b6000806108c2611418565b50505064ffffffffff1692915050565b6108da610c9a565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561091f57600080fd5b505afa158015610933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109579190611c60565b87106109bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016104e4565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2557600080fd5b505afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190611b17565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c65206279207468652061646472657373206d616e60448201527f61676572206f776e65722e00000000000000000000000000000000000000000060648201526084016104e4565b6000610b4a610b268789611c79565b610b308688611c79565b602890811b91909117605086901b17607885901b17901b90565b9050610b54610c9a565b6040517f167fd681000000000000000000000000000000000000000000000000000000008152600481018a90527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008316602482015273ffffffffffffffffffffffffffffffffffffffff919091169063167fd68190604401600060405180830381600087803b158015610be657600080fd5b505af1158015610bfa573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff898116918217909255604080519182528b831660208301528a8316908201528782166060820152868216608082015290851660a08201528a92507f293a9e87838119a52e3dd8eabf034ae7eda0da1bfdb33ee7721a6afca0b166b8915060c00160405180910390a25050505050505050565b6000610cbd604051806060016040528060218152602001611e0360219139610394565b905090565b60043560d81c60093560e890811c90600c35901c610cde6108b7565b8364ffffffffff1614610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104e4565b610db16040518060400160405280600d81526020017f42564d5f53657175656e63657200000000000000000000000000000000000000815250610394565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104e4565b6000610e7d62ffffff83166010611ca2565b610e8890600f611cdf565b905064ffffffffff8116361015610f21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104e4565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610fb2576000610f788263ffffffff166114d3565b8051909350839150610f8a9086611cf7565b9450826020015184610f9c9190611c79565b9350508080610faa90611d16565b915050610f54565b5060065464ffffffffff83161115611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104e4565b60006110838462ffffff8916611d3a565b63ffffffff1690506000808360200151600014156110ac5750506040820151606083015161111d565b600060066110bb600188611d5f565b64ffffffffff16815481106110d2576110d2611a63565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b61114161112b600143611b63565b408a62ffffff168564ffffffffff16858561155a565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f89961116c8487611d5f565b846111756108b7565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b60006111e8610c9a565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190611c60565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112cb57600080fd5b505afa1580156112df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113039190611b17565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104e4565b600181905560028290556113ab8183611ca2565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b600554600654600091610cbd9164ffffffffff90911690611d5f565b6000806000806000611428610c9a565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561146d57600080fd5b505afa158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190611d7d565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6114fe6040518060800160405280600081526020016000815260200160008152602001600081525090565b600061150b601084611ca2565b61151690600f611cdf565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b6000611564610c9a565b9050600080611571611418565b50509150915060006040518060c001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ca57600080fd5b505afa1580156115de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116029190611c60565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250905080600001517fa47512905cf577d4cfae2efc3df461008ddb7234e91ce7f4eefcdb51e1077ccf82602001518360400151846060015185608001518660a0015160405161169a959493929190611dbf565b60405180910390a260006116ad826117a0565b905060006116e88360400151866116c49190611c79565b6116ce8b87611c79565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561177b57600080fd5b505af115801561178f573d6000803e3d6000fd5b505050505050505050505050505050565b6020808201516040808401516060850151608086015160a087015193516000966117cc96959101611dbf565b604051602081830303815290604052805190602001209050919050565b6000602082840312156117fb57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff8084111561184c5761184c611802565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561189257611892611802565b816040528093508581528686860111156118ab57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156118d757600080fd5b813567ffffffffffffffff8111156118ee57600080fd5b8201601f810184136118ff57600080fd5b61190e84823560208401611831565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461193857600080fd5b50565b60008060006060848603121561195057600080fd5b833561195b81611916565b925060208401359150604084013567ffffffffffffffff81111561197e57600080fd5b8401601f8101861361198f57600080fd5b61199e86823560208401611831565b9150509250925092565b803564ffffffffff811681146119bd57600080fd5b919050565b600080600080600080600060e0888a0312156119dd57600080fd5b873596506119ed602089016119a8565b95506119fb604089016119a8565b9450611a09606089016119a8565b9350611a17608089016119a8565b9250611a2560a089016119a8565b9150611a3360c089016119a8565b905092959891949750929550565b60008060408385031215611a5457600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611ab857602081850181015186830182015201611a9c565b81811115611aca576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b106020830184611a92565b9392505050565b600060208284031215611b2957600080fd5b8151611b1081611916565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611b7557611b75611b34565b500390565b600082611bb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611be757611be7611b34565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611c2d6080830184611a92565b9695505050505050565b838152606060208201526000611c506060830185611a92565b9050826040830152949350505050565b600060208284031215611c7257600080fd5b5051919050565b600064ffffffffff808316818516808303821115611c9957611c99611b34565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611cda57611cda611b34565b500290565b60008219821115611cf257611cf2611b34565b500190565b600063ffffffff808316818516808303821115611c9957611c99611b34565b600063ffffffff80831681811415611d3057611d30611b34565b6001019392505050565b600063ffffffff83811690831681811015611d5757611d57611b34565b039392505050565b600064ffffffffff83811690831681811015611d5757611d57611b34565b600060208284031215611d8f57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081168114611b1057600080fd5b85815284602082015283604082015260a060608201526000611de460a0830185611a92565b8281036080840152611df68185611a92565b9897505050505050505056fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a26469706673582212209d002244bfb75e3500e4cb634bf4eaa20b90de638f28e9fac2de2b126617ee8464736f6c63430008090033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
