Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
d29775ec
Unverified
Commit
d29775ec
authored
Jul 14, 2023
by
refcell.eth
Committed by
GitHub
Jul 14, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Inline-comment documentation for MIPS.sol and styling. (#6276)
parent
c3977fc6
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
842 additions
and
584 deletions
+842
-584
mips.go
op-bindings/bindings/mips.go
+1
-1
mips_more.go
op-bindings/bindings/mips_more.go
+2
-2
MIPS.sol
packages/contracts-bedrock/contracts/cannon/MIPS.sol
+839
-581
No files found.
op-bindings/bindings/mips.go
View file @
d29775ec
...
@@ -31,7 +31,7 @@ var (
...
@@ -31,7 +31,7 @@ var (
// MIPSMetaData contains all meta data concerning the MIPS contract.
// MIPSMetaData contains all meta data concerning the MIPS contract.
var
MIPSMetaData
=
&
bind
.
MetaData
{
var
MIPSMetaData
=
&
bind
.
MetaData
{
ABI
:
"[{
\"
inputs
\"
:[],
\"
name
\"
:
\"
BRK_START
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
oracle
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
contractIPreimageOracle
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
stateData
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
proof
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
name
\"
:
\"
step
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
ABI
:
"[{
\"
inputs
\"
:[],
\"
name
\"
:
\"
BRK_START
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
uint32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
uint32
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[],
\"
name
\"
:
\"
oracle
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
contractIPreimageOracle
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
address
\"
}],
\"
stateMutability
\"
:
\"
view
\"
,
\"
type
\"
:
\"
function
\"
},{
\"
inputs
\"
:[{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
stateData
\"
,
\"
type
\"
:
\"
bytes
\"
},{
\"
internalType
\"
:
\"
bytes
\"
,
\"
name
\"
:
\"
proof
\"
,
\"
type
\"
:
\"
bytes
\"
}],
\"
name
\"
:
\"
step
\"
,
\"
outputs
\"
:[{
\"
internalType
\"
:
\"
bytes32
\"
,
\"
name
\"
:
\"\"
,
\"
type
\"
:
\"
bytes32
\"
}],
\"
stateMutability
\"
:
\"
nonpayable
\"
,
\"
type
\"
:
\"
function
\"
}]"
,
Bin
:
"0x608060405234801561001057600080fd5b50611b2
1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a67565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e6565b63ffffffff16901b610959565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e6565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c4565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e6565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b4d565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b89610959565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611213565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611213565b8063ffffffff16600c1415610659576105ed6112f8565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611775565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee84600184611959565b6106fa85836001611213565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f5565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f8516601c0360031b1c63ffffffff1691505092915050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610943576000610945565b815b90861663ffffffff16179250505092915050565b6000610963611a67565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b357806008018261016001518663ffffffff16602081106109a257fe5b63ffffffff90921660209290920201525b6109bb610710565b95945050505050565b60006109ce611a67565b5060806000600463ffffffff881614806109ee57508663ffffffff166005145b15610a645760008261016001518663ffffffff1660208110610a0c57fe5b602002015190508063ffffffff168563ffffffff16148015610a3457508763ffffffff166004145b80610a5c57508063ffffffff168563ffffffff1614158015610a5c57508763ffffffff166005145b915050610ae1565b8663ffffffff1660061415610a825760008460030b13159050610ae1565b8663ffffffff1660071415610a9f5760008460030b139050610ae1565b8663ffffffff1660011415610ae157601f601087901c1680610ac55760008560030b1291505b8063ffffffff1660011415610adf5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b27576002610b0c8861ffff1660106108e6565b63ffffffff90811690911b8201600401166080840152610b39565b60808301805160040163ffffffff1690525b610b41610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f215760088263ffffffff1610158015610b815750600f8263ffffffff16105b15610c28578163ffffffff1660081415610b9d57506020610c23565b8163ffffffff1660091415610bb457506021610c23565b8163ffffffff16600a1415610bcb5750602a610c23565b8163ffffffff16600b1415610be25750602b610c23565b8163ffffffff16600c1415610bf957506024610c23565b8163ffffffff16600d1415610c1057506025610c23565b8163ffffffff16600e1415610c23575060265b600091505b63ffffffff8216610e7157601f600688901c16602063ffffffff83161015610d455760088263ffffffff1610610c6357869350505050610708565b63ffffffff8216610c835763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610ca75763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd2576103788163ffffffff168763ffffffff16901c826020036108e6565b8163ffffffff1660041415610cf6575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1a575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d45576103788763ffffffff168763ffffffff16901c886020036108e6565b8163ffffffff1660201480610d6057508163ffffffff166021145b15610d72578587019350505050610708565b8163ffffffff1660221480610d8d57508163ffffffff166023145b15610d9f578587039350505050610708565b8163ffffffff1660241415610dbb578587169350505050610708565b8163ffffffff1660251415610dd7578587179350505050610708565b8163ffffffff1660261415610df3578587189350505050610708565b8163ffffffff1660271415610e0f575050505082821719610708565b8163ffffffff16602a1415610e42578560030b8760030b12610e32576000610e35565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6b578563ffffffff168763ffffffff1610610e32576000610e35565b50610f1c565b8163ffffffff16600f1415610e945760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1c578063ffffffff1660021415610ebd57505050828202610708565b8063ffffffff1660201480610ed857508063ffffffff166021145b15610f1c578063ffffffff1660201415610ef0579419945b60005b6380000000871615610f12576401fffffffe600197881b169601610ef3565b9250610708915050565b6111ac565b60288263ffffffff16101561108b578163ffffffff1660201415610f6e57610f658660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e6565b92505050610708565b8163ffffffff1660211415610fa457610f658660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e6565b8163ffffffff1660221415610fd55750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610fee578392505050610708565b8163ffffffff1660241415611022578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff1660251415611057578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1c5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c35750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110fc5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a141561112d5750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611146578492505050610708565b8163ffffffff16602e141561117a5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611193578392505050610708565b8163ffffffff16603814156111ac578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b600061121d611a67565b506080602063ffffffff86161061129557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112a75750825b156112d557838161016001518663ffffffff16602081106112c457fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109bb610710565b6000611302611a67565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137a5781610fff81161561134c57610fff811661100003015b63ffffffff84166113705760e08801805163ffffffff838201169091529550611374565b8395505b50611728565b8563ffffffff16610fcd14156113965763400000009450611728565b8563ffffffff1661101814156113af5760019450611728565b8563ffffffff1661109614156113e757600161012088015260ff83166101008801526113d9610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a65763ffffffff8316611407576115a1565b63ffffffff83166005141561157e5760006114298363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d60408110156114dd57600080fd5b508051602090910151909250905060038516600481900382811015611500578092505b508185101561150d578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115648563fffffffc16600185611959565b60408a018051820163ffffffff16905296506115a1915050565b63ffffffff831660031415611595578094506115a1565b63ffffffff9450600993505b611728565b8563ffffffff16610fa4141561167a5763ffffffff8316600114806115d1575063ffffffff83166002145b806115e2575063ffffffff83166004145b156115ef578094506115a1565b63ffffffff8316600614156115955760006116118363fffffffc16600161081e565b6020890151909150600384166004038381101561162c578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a1565b8563ffffffff16610fd71415611728578163ffffffff166003141561171c5763ffffffff831615806116b2575063ffffffff83166005145b806116c3575063ffffffff83166003145b156116d157600094506115a1565b63ffffffff8316600114806116ec575063ffffffff83166002145b806116fd575063ffffffff83166006145b8061170e575063ffffffff83166004145b1561159557600194506115a1565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b01526004019091169052611769610710565b97505050505050505090565b600061177f611a67565b5060806000601063ffffffff8816141561179e575060c08101516118f6565b8663ffffffff16601114156117be5763ffffffff861660c08301526118f6565b8663ffffffff16601214156117d8575060a08101516118f6565b8663ffffffff16601314156117f85763ffffffff861660a08301526118f6565b8663ffffffff166018141561182d5763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f6565b8663ffffffff166019141561185f5763ffffffff86811681871602602081901c821660c08501521660a08301526118f6565b8663ffffffff16601a14156118aa578460030b8660030b8161187d57fe5b0763ffffffff1660c0830152600385810b9087900b8161189957fe5b0563ffffffff1660a08301526118f6565b8663ffffffff16601b14156118f6578463ffffffff168663ffffffff16816118ce57fe5b0663ffffffff90811660c0840152858116908716816118e957fe5b0463ffffffff1660a08301525b63ffffffff84161561192b57808261016001518563ffffffff166020811061191a57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff8082166060860152600490910116905261194e610710565b979650505050505050565b6000611964836119f5565b9050600384161561197457600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ea5760208401933582821c60011680156119c257600181146119d3576119e0565b6119cc8286610845565b94506119e0565b6119dd8583610845565b94505b505060010161199a565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af26023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611acd611ad2
565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
,
Bin
:
"0x608060405234801561001057600080fd5b50611b2
4806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a6a565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e9565b63ffffffff16901b61095c565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e9565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c7565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e9565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b50565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b8961095c565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611216565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611216565b8063ffffffff16600c1415610659576105ed6112fb565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611778565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee8460018461195c565b6106fa85836001611216565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f8565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610946576000610948565b815b90861663ffffffff16179250505092915050565b6000610966611a6a565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b657806008018261016001518663ffffffff16602081106109a557fe5b63ffffffff90921660209290920201525b6109be610710565b95945050505050565b60006109d1611a6a565b5060806000600463ffffffff881614806109f157508663ffffffff166005145b15610a675760008261016001518663ffffffff1660208110610a0f57fe5b602002015190508063ffffffff168563ffffffff16148015610a3757508763ffffffff166004145b80610a5f57508063ffffffff168563ffffffff1614158015610a5f57508763ffffffff166005145b915050610ae4565b8663ffffffff1660061415610a855760008460030b13159050610ae4565b8663ffffffff1660071415610aa25760008460030b139050610ae4565b8663ffffffff1660011415610ae457601f601087901c1680610ac85760008560030b1291505b8063ffffffff1660011415610ae25760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b2a576002610b0f8861ffff1660106108e9565b63ffffffff90811690911b8201600401166080840152610b3c565b60808301805160040163ffffffff1690525b610b44610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f245760088263ffffffff1610158015610b845750600f8263ffffffff16105b15610c2b578163ffffffff1660081415610ba057506020610c26565b8163ffffffff1660091415610bb757506021610c26565b8163ffffffff16600a1415610bce5750602a610c26565b8163ffffffff16600b1415610be55750602b610c26565b8163ffffffff16600c1415610bfc57506024610c26565b8163ffffffff16600d1415610c1357506025610c26565b8163ffffffff16600e1415610c26575060265b600091505b63ffffffff8216610e7457601f600688901c16602063ffffffff83161015610d485760088263ffffffff1610610c6657869350505050610708565b63ffffffff8216610c865763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610caa5763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd5576103788163ffffffff168763ffffffff16901c826020036108e9565b8163ffffffff1660041415610cf9575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1d575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d48576103788763ffffffff168763ffffffff16901c886020036108e9565b8163ffffffff1660201480610d6357508163ffffffff166021145b15610d75578587019350505050610708565b8163ffffffff1660221480610d9057508163ffffffff166023145b15610da2578587039350505050610708565b8163ffffffff1660241415610dbe578587169350505050610708565b8163ffffffff1660251415610dda578587179350505050610708565b8163ffffffff1660261415610df6578587189350505050610708565b8163ffffffff1660271415610e12575050505082821719610708565b8163ffffffff16602a1415610e45578560030b8760030b12610e35576000610e38565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6e578563ffffffff168763ffffffff1610610e35576000610e38565b50610f1f565b8163ffffffff16600f1415610e975760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1f578063ffffffff1660021415610ec057505050828202610708565b8063ffffffff1660201480610edb57508063ffffffff166021145b15610f1f578063ffffffff1660201415610ef3579419945b60005b6380000000871615610f15576401fffffffe600197881b169601610ef6565b9250610708915050565b6111af565b60288263ffffffff16101561108e578163ffffffff1660201415610f7157610f688660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e9565b92505050610708565b8163ffffffff1660211415610fa757610f688660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e9565b8163ffffffff1660221415610fd85750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610ff1578392505050610708565b8163ffffffff1660241415611025578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff166025141561105a578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1f5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c65750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110ff5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a14156111305750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611149578492505050610708565b8163ffffffff16602e141561117d5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611196578392505050610708565b8163ffffffff16603814156111af578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b6000611220611a6a565b506080602063ffffffff86161061129857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112aa5750825b156112d857838161016001518663ffffffff16602081106112c757fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109be610710565b6000611305611a6a565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137d5781610fff81161561134f57610fff811661100003015b63ffffffff84166113735760e08801805163ffffffff838201169091529550611377565b8395505b5061172b565b8563ffffffff16610fcd1415611399576340000000945061172b565b8563ffffffff1661101814156113b2576001945061172b565b8563ffffffff1661109614156113ea57600161012088015260ff83166101008801526113dc610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a95763ffffffff831661140a576115a4565b63ffffffff83166005141561158157600061142c8363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b657600080fd5b505afa1580156114ca573d6000803e3d6000fd5b505050506040513d60408110156114e057600080fd5b508051602090910151909250905060038516600481900382811015611503578092505b5081851015611510578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115678563fffffffc1660018561195c565b60408a018051820163ffffffff16905296506115a4915050565b63ffffffff831660031415611598578094506115a4565b63ffffffff9450600993505b61172b565b8563ffffffff16610fa4141561167d5763ffffffff8316600114806115d4575063ffffffff83166002145b806115e5575063ffffffff83166004145b156115f2578094506115a4565b63ffffffff8316600614156115985760006116148363fffffffc16600161081e565b6020890151909150600384166004038381101561162f578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a4565b8563ffffffff16610fd7141561172b578163ffffffff166003141561171f5763ffffffff831615806116b5575063ffffffff83166005145b806116c6575063ffffffff83166003145b156116d457600094506115a4565b63ffffffff8316600114806116ef575063ffffffff83166002145b80611700575063ffffffff83166006145b80611711575063ffffffff83166004145b1561159857600194506115a4565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261176c610710565b97505050505050505090565b6000611782611a6a565b5060806000601063ffffffff881614156117a1575060c08101516118f9565b8663ffffffff16601114156117c15763ffffffff861660c08301526118f9565b8663ffffffff16601214156117db575060a08101516118f9565b8663ffffffff16601314156117fb5763ffffffff861660a08301526118f9565b8663ffffffff16601814156118305763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f9565b8663ffffffff16601914156118625763ffffffff86811681871602602081901c821660c08501521660a08301526118f9565b8663ffffffff16601a14156118ad578460030b8660030b8161188057fe5b0763ffffffff1660c0830152600385810b9087900b8161189c57fe5b0563ffffffff1660a08301526118f9565b8663ffffffff16601b14156118f9578463ffffffff168663ffffffff16816118d157fe5b0663ffffffff90811660c0840152858116908716816118ec57fe5b0463ffffffff1660a08301525b63ffffffff84161561192e57808261016001518563ffffffff166020811061191d57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611951610710565b979650505050505050565b6000611967836119f8565b9050600384161561197757600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ed5760208401933582821c60011680156119c557600181146119d6576119e3565b6119cf8286610845565b94506119e3565b6119e08583610845565b94505b505060010161199d565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af56023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611ad0611ad5
565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
,
}
}
// MIPSABI is the input ABI used to generate the binding from.
// MIPSABI is the input ABI used to generate the binding from.
...
...
op-bindings/bindings/mips_more.go
View file @
d29775ec
...
@@ -13,9 +13,9 @@ const MIPSStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"cont
...
@@ -13,9 +13,9 @@ const MIPSStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"cont
var
MIPSStorageLayout
=
new
(
solc
.
StorageLayout
)
var
MIPSStorageLayout
=
new
(
solc
.
StorageLayout
)
var
MIPSDeployedBin
=
"0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a6
7565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e6565b63ffffffff16901b610959565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e6565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c4565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e6565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b4d565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b89610959565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611213565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611213565b8063ffffffff16600c1415610659576105ed6112f8565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611775565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee84600184611959565b6106fa85836001611213565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f5565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f8516601c0360031b1c63ffffffff1691505092915050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610943576000610945565b815b90861663ffffffff16179250505092915050565b6000610963611a67565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b357806008018261016001518663ffffffff16602081106109a257fe5b63ffffffff90921660209290920201525b6109bb610710565b95945050505050565b60006109ce611a67565b5060806000600463ffffffff881614806109ee57508663ffffffff166005145b15610a645760008261016001518663ffffffff1660208110610a0c57fe5b602002015190508063ffffffff168563ffffffff16148015610a3457508763ffffffff166004145b80610a5c57508063ffffffff168563ffffffff1614158015610a5c57508763ffffffff166005145b915050610ae1565b8663ffffffff1660061415610a825760008460030b13159050610ae1565b8663ffffffff1660071415610a9f5760008460030b139050610ae1565b8663ffffffff1660011415610ae157601f601087901c1680610ac55760008560030b1291505b8063ffffffff1660011415610adf5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b27576002610b0c8861ffff1660106108e6565b63ffffffff90811690911b8201600401166080840152610b39565b60808301805160040163ffffffff1690525b610b41610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f215760088263ffffffff1610158015610b815750600f8263ffffffff16105b15610c28578163ffffffff1660081415610b9d57506020610c23565b8163ffffffff1660091415610bb457506021610c23565b8163ffffffff16600a1415610bcb5750602a610c23565b8163ffffffff16600b1415610be25750602b610c23565b8163ffffffff16600c1415610bf957506024610c23565b8163ffffffff16600d1415610c1057506025610c23565b8163ffffffff16600e1415610c23575060265b600091505b63ffffffff8216610e7157601f600688901c16602063ffffffff83161015610d455760088263ffffffff1610610c6357869350505050610708565b63ffffffff8216610c835763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610ca75763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd2576103788163ffffffff168763ffffffff16901c826020036108e6565b8163ffffffff1660041415610cf6575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1a575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d45576103788763ffffffff168763ffffffff16901c886020036108e6565b8163ffffffff1660201480610d6057508163ffffffff166021145b15610d72578587019350505050610708565b8163ffffffff1660221480610d8d57508163ffffffff166023145b15610d9f578587039350505050610708565b8163ffffffff1660241415610dbb578587169350505050610708565b8163ffffffff1660251415610dd7578587179350505050610708565b8163ffffffff1660261415610df3578587189350505050610708565b8163ffffffff1660271415610e0f575050505082821719610708565b8163ffffffff16602a1415610e42578560030b8760030b12610e32576000610e35565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6b578563ffffffff168763ffffffff1610610e32576000610e35565b50610f1c565b8163ffffffff16600f1415610e945760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1c578063ffffffff1660021415610ebd57505050828202610708565b8063ffffffff1660201480610ed857508063ffffffff166021145b15610f1c578063ffffffff1660201415610ef0579419945b60005b6380000000871615610f12576401fffffffe600197881b169601610ef3565b9250610708915050565b6111ac565b60288263ffffffff16101561108b578163ffffffff1660201415610f6e57610f658660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e6565b92505050610708565b8163ffffffff1660211415610fa457610f658660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e6565b8163ffffffff1660221415610fd55750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610fee578392505050610708565b8163ffffffff1660241415611022578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff1660251415611057578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1c5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c35750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110fc5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a141561112d5750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611146578492505050610708565b8163ffffffff16602e141561117a5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611193578392505050610708565b8163ffffffff16603814156111ac578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b600061121d611a67565b506080602063ffffffff86161061129557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112a75750825b156112d557838161016001518663ffffffff16602081106112c457fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109bb610710565b6000611302611a67565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137a5781610fff81161561134c57610fff811661100003015b63ffffffff84166113705760e08801805163ffffffff838201169091529550611374565b8395505b50611728565b8563ffffffff16610fcd14156113965763400000009450611728565b8563ffffffff1661101814156113af5760019450611728565b8563ffffffff1661109614156113e757600161012088015260ff83166101008801526113d9610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a65763ffffffff8316611407576115a1565b63ffffffff83166005141561157e5760006114298363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b357600080fd5b505afa1580156114c7573d6000803e3d6000fd5b505050506040513d60408110156114dd57600080fd5b508051602090910151909250905060038516600481900382811015611500578092505b508185101561150d578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115648563fffffffc16600185611959565b60408a018051820163ffffffff16905296506115a1915050565b63ffffffff831660031415611595578094506115a1565b63ffffffff9450600993505b611728565b8563ffffffff16610fa4141561167a5763ffffffff8316600114806115d1575063ffffffff83166002145b806115e2575063ffffffff83166004145b156115ef578094506115a1565b63ffffffff8316600614156115955760006116118363fffffffc16600161081e565b6020890151909150600384166004038381101561162c578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a1565b8563ffffffff16610fd71415611728578163ffffffff166003141561171c5763ffffffff831615806116b2575063ffffffff83166005145b806116c3575063ffffffff83166003145b156116d157600094506115a1565b63ffffffff8316600114806116ec575063ffffffff83166002145b806116fd575063ffffffff83166006145b8061170e575063ffffffff83166004145b1561159557600194506115a1565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b01526004019091169052611769610710565b97505050505050505090565b600061177f611a67565b5060806000601063ffffffff8816141561179e575060c08101516118f6565b8663ffffffff16601114156117be5763ffffffff861660c08301526118f6565b8663ffffffff16601214156117d8575060a08101516118f6565b8663ffffffff16601314156117f85763ffffffff861660a08301526118f6565b8663ffffffff166018141561182d5763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f6565b8663ffffffff166019141561185f5763ffffffff86811681871602602081901c821660c08501521660a08301526118f6565b8663ffffffff16601a14156118aa578460030b8660030b8161187d57fe5b0763ffffffff1660c0830152600385810b9087900b8161189957fe5b0563ffffffff1660a08301526118f6565b8663ffffffff16601b14156118f6578463ffffffff168663ffffffff16816118ce57fe5b0663ffffffff90811660c0840152858116908716816118e957fe5b0463ffffffff1660a08301525b63ffffffff84161561192b57808261016001518563ffffffff166020811061191a57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff8082166060860152600490910116905261194e610710565b979650505050505050565b6000611964836119f5565b9050600384161561197457600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ea5760208401933582821c60011680156119c257600181146119d3576119e0565b6119cc8286610845565b94506119e0565b6119dd8583610845565b94505b505060010161199a565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af26023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611acd611ad2
565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
var
MIPSDeployedBin
=
"0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063155633fe146100465780637dc0d1d014610067578063f8e0cb9614610098575b600080fd5b61004e61016c565b6040805163ffffffff9092168252519081900360200190f35b61006f610174565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61015a600480360360408110156100ae57600080fd5b8101906020810181356401000000008111156100c957600080fd5b8201836020820111156100db57600080fd5b803590602001918460018302840111640100000000831117156100fd57600080fd5b91939092909160208101903564010000000081111561011b57600080fd5b82018360208201111561012d57600080fd5b8035906020019184600183028401116401000000008311171561014f57600080fd5b509092509050610190565b60408051918252519081900360200190f35b634000000081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600061019a611a6
a565b608081146101a757600080fd5b604051610600146101b757600080fd5b606486146101c457600080fd5b61016684146101d257600080fd5b6101ef565b8035602084810360031b9190911c8352920192910190565b8560806101fe602082846101d7565b9150915061020e602082846101d7565b9150915061021e600482846101d7565b9150915061022e600482846101d7565b9150915061023e600482846101d7565b9150915061024e600482846101d7565b9150915061025e600482846101d7565b9150915061026e600482846101d7565b9150915061027e600182846101d7565b9150915061028e600182846101d7565b9150915061029e600882846101d7565b6020810190819052909250905060005b60208110156102d0576102c3600483856101d7565b90935091506001016102ae565b505050806101200151156102ee576102e6610710565b915050610708565b6101408101805160010167ffffffffffffffff1690526060810151600090610316908261081e565b9050603f601a82901c16600281148061033557508063ffffffff166003145b15610382576103788163ffffffff1660021461035257601f610355565b60005b60ff16600261036b856303ffffff16601a6108e9565b63ffffffff16901b61095c565b9350505050610708565b6101608301516000908190601f601086901c81169190601587901c16602081106103a857fe5b602002015192508063ffffffff851615806103c957508463ffffffff16601c145b156103fa578661016001518263ffffffff16602081106103e557fe5b6020020151925050601f600b86901c166104b1565b60208563ffffffff16101561045d578463ffffffff16600c148061042457508463ffffffff16600d145b8061043557508463ffffffff16600e145b15610446578561ffff169250610458565b6104558661ffff1660106108e9565b92505b6104b1565b60288563ffffffff1610158061047957508463ffffffff166022145b8061048a57508463ffffffff166026145b156104b1578661016001518263ffffffff16602081106104a657fe5b602002015192508190505b60048563ffffffff16101580156104ce575060088563ffffffff16105b806104df57508463ffffffff166001145b156104fe576104f0858784876109c7565b975050505050505050610708565b63ffffffff60006020878316106105635761051e8861ffff1660106108e9565b9095019463fffffffc861661053481600161081e565b915060288863ffffffff161015801561055457508763ffffffff16603014155b1561056157809250600093505b505b600061057189888885610b50565b63ffffffff9081169150603f8a16908916158015610596575060088163ffffffff1610155b80156105a85750601c8163ffffffff16105b15610687578063ffffffff16600814806105c857508063ffffffff166009145b156105ff576105ed8163ffffffff166008146105e457856105e7565b60005b8961095c565b9b505050505050505050505050610708565b8063ffffffff16600a1415610620576105ed858963ffffffff8a1615611216565b8063ffffffff16600b1415610642576105ed858963ffffffff8a161515611216565b8063ffffffff16600c1415610659576105ed6112fb565b60108163ffffffff16101580156106765750601c8163ffffffff16105b15610687576105ed81898988611778565b8863ffffffff1660381480156106a2575063ffffffff861615155b156106d15760018b61016001518763ffffffff16602081106106c057fe5b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff146106ee576106ee8460018461195c565b6106fa85836001611216565b9b5050505050505050505050505b949350505050565b6000610728565b602083810382015183520192910190565b60806040518061073a60208285610717565b9150925061074a60208285610717565b9150925061075a60048285610717565b9150925061076a60048285610717565b9150925061077a60048285610717565b9150925061078a60048285610717565b9150925061079a60048285610717565b915092506107aa60048285610717565b915092506107ba60018285610717565b915092506107ca60018285610717565b915092506107da60088285610717565b60209091019350905060005b6020811015610808576107fb60048386610717565b90945091506001016107e6565b506000815281810382a081900390209150505b90565b60008061082a836119f8565b9050600384161561083a57600080fd5b602081019035610857565b60009081526020919091526040902090565b8460051c8160005b601b8110156108af5760208501943583821c60011680156108875760018114610898576108a5565b6108918285610845565b93506108a5565b6108a28483610845565b93505b505060010161085f565b5060805191508181146108ca57630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610946576000610948565b815b90861663ffffffff16179250505092915050565b6000610966611a6a565b5060e08051610100805163ffffffff90811690935284831690526080918516156109b657806008018261016001518663ffffffff16602081106109a557fe5b63ffffffff90921660209290920201525b6109be610710565b95945050505050565b60006109d1611a6a565b5060806000600463ffffffff881614806109f157508663ffffffff166005145b15610a675760008261016001518663ffffffff1660208110610a0f57fe5b602002015190508063ffffffff168563ffffffff16148015610a3757508763ffffffff166004145b80610a5f57508063ffffffff168563ffffffff1614158015610a5f57508763ffffffff166005145b915050610ae4565b8663ffffffff1660061415610a855760008460030b13159050610ae4565b8663ffffffff1660071415610aa25760008460030b139050610ae4565b8663ffffffff1660011415610ae457601f601087901c1680610ac85760008560030b1291505b8063ffffffff1660011415610ae25760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b2a576002610b0f8861ffff1660106108e9565b63ffffffff90811690911b8201600401166080840152610b3c565b60808301805160040163ffffffff1690525b610b44610710565b98975050505050505050565b6000603f601a86901c81169086166020821015610f245760088263ffffffff1610158015610b845750600f8263ffffffff16105b15610c2b578163ffffffff1660081415610ba057506020610c26565b8163ffffffff1660091415610bb757506021610c26565b8163ffffffff16600a1415610bce5750602a610c26565b8163ffffffff16600b1415610be55750602b610c26565b8163ffffffff16600c1415610bfc57506024610c26565b8163ffffffff16600d1415610c1357506025610c26565b8163ffffffff16600e1415610c26575060265b600091505b63ffffffff8216610e7457601f600688901c16602063ffffffff83161015610d485760088263ffffffff1610610c6657869350505050610708565b63ffffffff8216610c865763ffffffff86811691161b9250610708915050565b8163ffffffff1660021415610caa5763ffffffff86811691161c9250610708915050565b8163ffffffff1660031415610cd5576103788163ffffffff168763ffffffff16901c826020036108e9565b8163ffffffff1660041415610cf9575050505063ffffffff8216601f84161b610708565b8163ffffffff1660061415610d1d575050505063ffffffff8216601f84161c610708565b8163ffffffff1660071415610d48576103788763ffffffff168763ffffffff16901c886020036108e9565b8163ffffffff1660201480610d6357508163ffffffff166021145b15610d75578587019350505050610708565b8163ffffffff1660221480610d9057508163ffffffff166023145b15610da2578587039350505050610708565b8163ffffffff1660241415610dbe578587169350505050610708565b8163ffffffff1660251415610dda578587179350505050610708565b8163ffffffff1660261415610df6578587189350505050610708565b8163ffffffff1660271415610e12575050505082821719610708565b8163ffffffff16602a1415610e45578560030b8760030b12610e35576000610e38565b60015b60ff169350505050610708565b8163ffffffff16602b1415610e6e578563ffffffff168763ffffffff1610610e35576000610e38565b50610f1f565b8163ffffffff16600f1415610e975760108563ffffffff16901b92505050610708565b8163ffffffff16601c1415610f1f578063ffffffff1660021415610ec057505050828202610708565b8063ffffffff1660201480610edb57508063ffffffff166021145b15610f1f578063ffffffff1660201415610ef3579419945b60005b6380000000871615610f15576401fffffffe600197881b169601610ef6565b9250610708915050565b6111af565b60288263ffffffff16101561108e578163ffffffff1660201415610f7157610f688660031660080260180363ffffffff168563ffffffff16901c60ff1660086108e9565b92505050610708565b8163ffffffff1660211415610fa757610f688660021660080260100363ffffffff168563ffffffff16901c61ffff1660106108e9565b8163ffffffff1660221415610fd85750505063ffffffff60086003851602811681811b198416918316901b17610708565b8163ffffffff1660231415610ff1578392505050610708565b8163ffffffff1660241415611025578560031660080260180363ffffffff168463ffffffff16901c60ff1692505050610708565b8163ffffffff166025141561105a578560021660080260100363ffffffff168463ffffffff16901c61ffff1692505050610708565b8163ffffffff1660261415610f1f5750505063ffffffff60086003851602601803811681811c198416918316901c17610708565b8163ffffffff16602814156110c65750505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17610708565b8163ffffffff16602914156110ff5750505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17610708565b8163ffffffff16602a14156111305750505063ffffffff60086003851602811681811c198316918416901c17610708565b8163ffffffff16602b1415611149578492505050610708565b8163ffffffff16602e141561117d5750505063ffffffff60086003851602601803811681811b198316918416901b17610708565b8163ffffffff1660301415611196578392505050610708565b8163ffffffff16603814156111af578492505050610708565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e00000000000000000000000000604482015290519081900360640190fd5b6000611220611a6a565b506080602063ffffffff86161061129857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c6964207265676973746572000000000000000000000000000000000000604482015290519081900360640190fd5b63ffffffff8516158015906112aa5750825b156112d857838161016001518663ffffffff16602081106112c757fe5b63ffffffff90921660209290920201525b60808101805163ffffffff808216606085015260049091011690526109be610710565b6000611305611a6a565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa141561137d5781610fff81161561134f57610fff811661100003015b63ffffffff84166113735760e08801805163ffffffff838201169091529550611377565b8395505b5061172b565b8563ffffffff16610fcd1415611399576340000000945061172b565b8563ffffffff1661101814156113b2576001945061172b565b8563ffffffff1661109614156113ea57600161012088015260ff83166101008801526113dc610710565b97505050505050505061081b565b8563ffffffff16610fa314156115a95763ffffffff831661140a576115a4565b63ffffffff83166005141561158157600061142c8363fffffffc16600161081e565b6000805460208b01516040808d015181517fe03110e1000000000000000000000000000000000000000000000000000000008152600481019390935263ffffffff16602483015280519495509293849373ffffffffffffffffffffffffffffffffffffffff9093169263e03110e19260448082019391829003018186803b1580156114b657600080fd5b505afa1580156114ca573d6000803e3d6000fd5b505050506040513d60408110156114e057600080fd5b508051602090910151909250905060038516600481900382811015611503578092505b5081851015611510578491505b8260088302610100031c9250826008828460040301021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119861617945050506115678563fffffffc1660018561195c565b60408a018051820163ffffffff16905296506115a4915050565b63ffffffff831660031415611598578094506115a4565b63ffffffff9450600993505b61172b565b8563ffffffff16610fa4141561167d5763ffffffff8316600114806115d4575063ffffffff83166002145b806115e5575063ffffffff83166004145b156115f2578094506115a4565b63ffffffff8316600614156115985760006116148363fffffffc16600161081e565b6020890151909150600384166004038381101561162f578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b176020880152600060408801529350836115a4565b8563ffffffff16610fd7141561172b578163ffffffff166003141561171f5763ffffffff831615806116b5575063ffffffff83166005145b806116c6575063ffffffff83166003145b156116d457600094506115a4565b63ffffffff8316600114806116ef575063ffffffff83166002145b80611700575063ffffffff83166006145b80611711575063ffffffff83166004145b1561159857600194506115a4565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261176c610710565b97505050505050505090565b6000611782611a6a565b5060806000601063ffffffff881614156117a1575060c08101516118f9565b8663ffffffff16601114156117c15763ffffffff861660c08301526118f9565b8663ffffffff16601214156117db575060a08101516118f9565b8663ffffffff16601314156117fb5763ffffffff861660a08301526118f9565b8663ffffffff16601814156118305763ffffffff600387810b9087900b02602081901c821660c08501521660a08301526118f9565b8663ffffffff16601914156118625763ffffffff86811681871602602081901c821660c08501521660a08301526118f9565b8663ffffffff16601a14156118ad578460030b8660030b8161188057fe5b0763ffffffff1660c0830152600385810b9087900b8161189c57fe5b0563ffffffff1660a08301526118f9565b8663ffffffff16601b14156118f9578463ffffffff168663ffffffff16816118d157fe5b0663ffffffff90811660c0840152858116908716816118ec57fe5b0463ffffffff1660a08301525b63ffffffff84161561192e57808261016001518563ffffffff166020811061191d57fe5b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611951610710565b979650505050505050565b6000611967836119f8565b9050600384161561197757600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b8110156119ed5760208401933582821c60011680156119c557600181146119d6576119e3565b6119cf8286610845565b94506119e3565b6119e08583610845565b94505b505060010161199d565b505060805250505050565b60ff81166103800261016681019036906104e601811015611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611af56023913960400191505060405180910390fd5b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611ad0611ad5
565b905290565b604051806104000160405280602090602082028036833750919291505056fe636865636b207468617420746865726520697320656e6f7567682063616c6c64617461a164736f6c6343000706000a"
var
MIPSDeployedSourceMap
=
"
957:22415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1355:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1723:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14308:4789;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14308:4789:0;;-1:-1:-1;14308:4789:0;-1:-1:-1;14308:4789:0;:::i;:::-;;;;;;;;;;;;;;;;1355:45;1390:10;1355:45;:::o;1723:29::-;;;;;;:::o;14308:4789::-;14386:7;14401:18;;:::i;:::-;14501:4;14494:5;14491:15;14481:2;;14562:1;14560;14553:11;14481:2;14598:4;14592:11;14605;14589:28;14579:2;;14663:1;14661;14654:11;14579:2;14711:3;14693:16;14690:25;14680:2;;14777:1;14775;14768:11;14680:2;14821:3;14807:12;14804:21;14794:2;;14886:1;14884;14877:11;14794:2;14903:370;;;15121:24;;15109:2;15105:13;;;15102:1;15098:21;15094:52;;;;15155:20;;15201:21;;;15247:18;;;14981:292::o;:::-;15289:16;15340:4;15373:18;15388:2;15385:1;15382;15373:18;:::i;:::-;15365:26;;;;15417:18;15432:2;15429:1;15426;15417:18;:::i;:::-;15409:26;;;;15465:17;15480:1;15477;15474;15465:17;:::i;:::-;15457:25;;;;15515:17;15530:1;15527;15524;15515:17;:::i;:::-;15507:25;;;;15553:17;15568:1;15565;15562;15553:17;:::i;:::-;15545:25;;;;15595:17;15610:1;15607;15604;15595:17;:::i;:::-;15587:25;;;;15633:17;15648:1;15645;15642;15633:17;:::i;:::-;15625:25;;;;15671:17;15686:1;15683;15680;15671:17;:::i;:::-;15663:25;;;;15711:17;15726:1;15723;15720;15711:17;:::i;:::-;15703:25;;;;15755:17;15770:1;15767;15764;15755:17;:::i;:::-;15747:25;;;;15797:17;15812:1;15809;15806;15797:17;:::i;:::-;15846:2;15839:10;;15829:21;;;;15789:25;;-1:-1:-1;15839:10:0;-1:-1:-1;15917:1:0;15902:77;15927:2;15924:1;15921:9;15902:77;;;15960:17;15975:1;15972;15969;15960:17;:::i;:::-;15952:25;;-1:-1:-1;15952:25:0;-1:-1:-1;15945:1:0;15938:9;15902:77;;;15906:14;;;16006:5;:12;;;16003:86;;;16069:13;:11;:13::i;:::-;16062:20;;;;;16003:86;16094:10;;;:15;;16108:1;16094:15;;;;;16163:8;;;;-1:-1:-1;;16155:20:0;;-1:-1:-1;16155:7:0;:20::i;:::-;16141:34;-1:-1:-1;16198:10:0;16206:2;16198:10;;;;16259:1;16249:11;;;:26;;;16264:6;:11;;16274:1;16264:11;16249:26;16245:308;;;16484:62;16495:6;:11;;16505:1;16495:11;:20;;16513:2;16495:20;;;16509:1;16495:20;16484:62;;16544:1;16517:23;16520:4;16525:10;16520:15;16537:2;16517;:23::i;:::-;:28;;;;16484:10;:62::i;:::-;16477:69;;;;;;;16245:308;16754:15;;;;16581:9;;;;16702:4;16696:2;16688:10;;;16687:19;;;16754:15;16779:2;16771:10;;;16770:19;16754:36;;;;;;;;;;;;-1:-1:-1;16811:5:0;16826:11;;;;;:29;;;16841:6;:14;;16851:4;16841:14;16826:29;16822:636;;;16898:5;:15;;;16914:5;16898:22;;;;;;;;;;;;;;-1:-1:-1;;16951:4:0;16945:2;16937:10;;;16936:19;16822:636;;;16981:4;16972:6;:13;;;16968:490;;;17072:6;:13;;17082:3;17072:13;:30;;;;17089:6;:13;;17099:3;17089:13;17072:30;:47;;;;17106:6;:13;;17116:3;17106:13;17072:47;17068:181;;;17158:4;17163:6;17158:11;17153:16;;17068:181;;;17221:19;17224:4;17229:6;17224:11;17237:2;17221;:19::i;:::-;17216:24;;17068:181;16968:490;;;17275:4;17265:6;:14;;;;:32;;;;17283:6;:14;;17293:4;17283:14;17265:32;:50;;;;17301:6;:14;;17311:4;17301:14;17265:50;17261:197;;;17365:5;:15;;;17381:5;17365:22;;;;;;;;;;;;;17360:27;;17446:5;17438:13;;17261:197;17479:1;17469:6;:11;;;;:25;;;;;17493:1;17484:6;:10;;;17469:25;17468:42;;;;17499:6;:11;;17509:1;17499:11;17468:42;17464:107;;;17527:37;17540:6;17548:4;17554:5;17561:2;17527:12;:37::i;:::-;17520:44;;;;;;;;;;;17464:107;17596:13;17577:16;17716:4;17706:14;;;;17702:328;;17765:19;17768:4;17773:6;17768:11;17781:2;17765;:19::i;:::-;17759:25;;;;17811:10;17806:15;;17835:16;17806:15;17849:1;17835:7;:16::i;:::-;17829:22;;17873:4;17863:6;:14;;;;:32;;;;;17881:6;:14;;17891:4;17881:14;;17863:32;17859:165;;;17936:4;17924:16;;18014:1;18006:9;;17859:165;17702:328;;18047:10;18060:26;18068:4;18074:2;18078;18082:3;18060:7;:26::i;:::-;18089:10;18060:39;;;;-1:-1:-1;18177:4:0;18170:11;;;18201;;;:24;;;;;18224:1;18216:4;:9;;;;18201:24;:39;;;;;18236:4;18229;:11;;;18201:39;18197:589;;;18254:4;:9;;18262:1;18254:9;:22;;;;18267:4;:9;;18275:1;18267:9;18254:22;18250:102;;;18306:37;18317:4;:9;;18325:1;18317:9;:21;;18333:5;18317:21;;;18329:1;18317:21;18340:2;18306:10;:37::i;:::-;18299:44;;;;;;;;;;;;;;;18250:102;18364:4;:11;;18372:3;18364:11;18360:79;;;18402:28;18411:5;18418:2;18422:7;;;;18402:8;:28::i;18360:79::-;18450:4;:11;;18458:3;18450:11;18446:79;;;18488:28;18497:5;18504:2;18508:7;;;;;18488:8;:28::i;18446:79::-;18575:4;:11;;18583:3;18575:11;18571:58;;;18605:15;:13;:15::i;18571:58::-;18702:4;18694;:12;;;;:27;;;;;18717:4;18710;:11;;;18694:27;18690:90;;;18740:31;18751:4;18757:2;18761;18765:5;18740:10;:31::i;18690:90::-;18830:6;:14;;18840:4;18830:14;:28;;;;-1:-1:-1;18848:10:0;;;;;18830:28;18826:75;;;18893:1;18868:5;:15;;;18884:5;18868:22;;;;;;;;;:26;;;;:22;;;;;;:26;18826:75;18931:9;:26;;18944:13;18931:26;18927:74;;18967:27;18976:9;18987:1;18990:3;18967:8;:27::i;:::-;19066:26;19075:5;19082:3;19087:4;19066:8;:26::i;:::-;19059:33;;;;;;;;;;;;;14308:4789;;;;;;;:::o;2017:1331::-;2058:11;2186:176;;;2278:2;2274:13;;;2264:24;;2258:31;2247:43;;2310:13;;2341;;;2237:125::o;:::-;2381:4;2420;2414:11;2458:5;2482:21;2500:2;2496;2490:4;2482:21;:::i;:::-;2470:33;;;;2533:21;2551:2;2547;2541:4;2533:21;:::i;:::-;2521:33;;;;2588:20;2606:1;2602:2;2596:4;2588:20;:::i;:::-;2576:32;;;;2645:20;2663:1;2659:2;2653:4;2645:20;:::i;:::-;2633:32;;;;2690:20;2708:1;2704:2;2698:4;2690:20;:::i;:::-;2678:32;;;;2739:20;2757:1;2753:2;2747:4;2739:20;:::i;:::-;2727:32;;;;2784:20;2802:1;2798:2;2792:4;2784:20;:::i;:::-;2772:32;;;;2829:20;2847:1;2843:2;2837:4;2829:20;:::i;:::-;2817:32;;;;2876:20;2894:1;2890:2;2884:4;2876:20;:::i;:::-;2864:32;;;;2927:20;2945:1;2941:2;2935:4;2927:20;:::i;:::-;2915:32;;;;2976:20;2994:1;2990:2;2984:4;2976:20;:::i;:::-;3029:2;3019:13;;;;-1:-1:-1;2964:32:0;-1:-1:-1;3077:1:0;3062:84;3087:2;3084:1;3081:9;3062:84;;;3124:20;3142:1;3138:2;3132:4;3124:20;:::i;:::-;3112:32;;-1:-1:-1;3112:32:0;-1:-1:-1;3105:1:0;3098:9;3062:84;;;3066:14;3177:1;3173:2;3166:13;3222:5;3218:2;3214:14;3207:5;3202:27;3307:14;;;3290:32;;;-1:-1:-1;;2017:1331:0;;:::o;11710:1270::-;11781:10;11799:14;11816:23;11828:10;11816:11;:23::i;:::-;11799:40;;11875:1;11869:4;11865:12;11862:2;;;11890:1;11887;11880:12;11862:2;11992;11980:15;;;11943:20;12002:169;;;;12041:12;;;12127:2;12120:13;;;;12160:2;12147:16;;;12031:140::o;:::-;12197:4;12194:1;12190:12;12221:4;12344:1;12329:273;12354:2;12351:1;12348:9;12329:273;;;12453:2;12441:15;;;12402:20;12476:12;;;12490:1;12472:20;12501:42;;;;12557:1;12552:42;;;;12465:129;;12501:42;12518:23;12533:7;12527:4;12518:23;:::i;:::-;12510:31;;12501:42;;12552;12569:23;12587:4;12578:7;12569:23;:::i;:::-;12561:31;;12465:129;-1:-1:-1;;12372:1:0;12365:9;12329:273;;;12333:14;12630:4;12624:11;12609:26;;12699:7;12693:4;12690:17;12680:2;;12756:10;12753:1;12746:21;12786:2;12783:1;12776:13;12680:2;-1:-1:-1;;12902:2:0;12892:13;;12880:10;12876:30;12873:1;12869:38;12925:16;12943:10;12921:33;;-1:-1:-1;;11710:1270:0;;;;:::o;1757:256::-;1816:6;1847:14;;;;1855:5;;;;1847:14;;;;;;1846:21;;;;;1859:1;1898:2;:6;;;1892:13;;;;;1891:19;;1890:28;;;;;;;1940:8;;1939:14;1846:21;1985;;2005:1;1985:21;;;1996:6;1985:21;1973:8;;;;;:34;;-1:-1:-1;;;1757:256:0;;;;:::o;10382:401::-;10449:7;10464:18;;:::i;:::-;-1:-1:-1;10545:8:0;;;10570:12;;;10559:23;;;;;;;10588:19;;;;;10514:4;;10617:12;;;10613:140;;10666:6;10673:1;10666:8;10639:5;:15;;;10655:7;10639:24;;;;;;;;;:35;;;;:24;;;;;;:35;10613:140;10765:13;:11;:13::i;:::-;10758:20;10382:401;-1:-1:-1;;;;;10382:401:0:o;8224:1063::-;8317:7;8332:18;;:::i;:::-;-1:-1:-1;8382:4:0;8397:17;8443:1;8433:11;;;;;:26;;;8448:6;:11;;8458:1;8448:11;8433:26;8429:514;;;8482:9;8494:5;:15;;;8510:5;8494:22;;;;;;;;;;;;;8482:34;;8546:2;8540:8;;:2;:8;;;:23;;;;;8552:6;:11;;8562:1;8552:11;8540:23;8539:54;;;;8575:2;8569:8;;:2;:8;;;;:23;;;;;8581:6;:11;;8591:1;8581:11;8569:23;8524:69;;8429:514;;;;8610:6;:11;;8620:1;8610:11;8606:337;;;8653:1;8646:2;8640:14;;;;8625:29;;8606:337;;;8679:6;:11;;8689:1;8679:11;8675:268;;;8721:1;8715:2;8709:13;;;8694:28;;8675:268;;;8747:6;:11;;8757:1;8747:11;8743:200;;;8813:4;8807:2;8799:10;;;8798:19;8830:8;8826:42;;8867:1;8861:2;8855:13;;;8840:28;;8826:42;8889:3;:8;;8896:1;8889:8;8885:43;;;8927:1;8920:2;8914:14;;;;8899:29;;8885:43;8743:200;;8965:8;;;;;8990:12;;;;8979:23;;;;;9040:216;;;;9116:1;9095:19;9098:4;9103:6;9098:11;9111:2;9095;:19::i;:::-;:22;;;;;;;9081:37;;9090:1;9081:37;9066:52;:12;;;:52;9040:216;;;9213:12;;;;;9228:1;9213:16;9198:31;;;;9040:216;9269:13;:11;:13::i;:::-;9262:20;8224:1063;-1:-1:-1;;;;;;;;8224:1063:0:o;19101:4269::-;19188:6;19218:10;19226:2;19218:10;;;;;;19261:11;;19357:4;19348:13;;19344:3986;;;19458:1;19448:6;:11;;;;:27;;;;;19472:3;19463:6;:12;;;19448:27;19444:462;;;19491:6;:11;;19501:1;19491:11;19487:383;;;-1:-1:-1;19513:4:0;19487:383;;;19553:6;:11;;19563:1;19553:11;19549:321;;;-1:-1:-1;19575:4:0;19549:321;;;19611:6;:13;;19621:3;19611:13;19607:263;;;-1:-1:-1;19635:4:0;19607:263;;;19668:6;:13;;19678:3;19668:13;19664:206;;;-1:-1:-1;19692:4:0;19664:206;;;19726:6;:13;;19736:3;19726:13;19722:148;;;-1:-1:-1;19750:4:0;19722:148;;;19783:6;:13;;19793:3;19783:13;19779:91;;;-1:-1:-1;19807:4:0;19779:91;;;19839:6;:13;;19849:3;19839:13;19835:35;;;-1:-1:-1;19863:4:0;19835:35;19896:1;19887:10;;19444:462;19947:11;;;19943:1701;;19999:4;19994:1;19986:9;;;19985:18;20024:4;19986:9;20017:11;;;20013:588;;;20054:4;20046;:12;;;20042:549;;20069:2;20062:9;;;;;;;20042:549;20149:12;;;20145:446;;20172:11;;;;;;;;-1:-1:-1;20165:18:0;;-1:-1:-1;;20165:18:0;20145:446;20218:4;:12;;20226:4;20218:12;20214:377;;;20241:11;;;;;;;;-1:-1:-1;20234:18:0;;-1:-1:-1;;20234:18:0;20214:377;20287:4;:12;;20295:4;20287:12;20283:308;;;20310:25;20319:5;20313:11;;:2;:11;;;;20329:5;20326:2;:8;20310:2;:25::i;20283:308::-;20370:4;:12;;20378:4;20370:12;20366:225;;;-1:-1:-1;;;;20393:15:0;;;20403:4;20400:7;;20393:15;20386:22;;20366:225;20447:4;:12;;20455:4;20447:12;20443:148;;;-1:-1:-1;;;;20470:15:0;;;20480:4;20477:7;;20470:15;20463:22;;20443:148;20524:4;:12;;20532:4;20524:12;20520:71;;;20547:19;20556:2;20550:8;;:2;:8;;;;20563:2;20560;:5;20547:2;:19::i;20520:71::-;20689:4;:12;;20697:4;20689:12;:28;;;;20705:4;:12;;20713:4;20705:12;20689:28;20685:602;;;20731:2;20728;:5;20721:12;;;;;;;20685:602;20771:4;:12;;20779:4;20771:12;:28;;;;20787:4;:12;;20795:4;20787:12;20771:28;20767:520;;;20813:2;20810;:5;20803:12;;;;;;;20767:520;20853:4;:12;;20861:4;20853:12;20849:438;;;20879:2;20876;:5;20869:12;;;;;;;20849:438;20920:4;:12;;20928:4;20920:12;20916:371;;;20947:2;20944;:5;20936:14;;;;;;;20916:371;20986:4;:12;;20994:4;20986:12;20982:305;;;21013:2;21010;:5;21002:14;;;;;;;20982:305;21053:4;:12;;21061:4;21053:12;21049:238;;;-1:-1:-1;;;;21078:5:0;;;21076:8;21069:15;;21049:238;21120:4;:12;;21128:4;21120:12;21116:171;;;21169:2;21153:19;;21159:2;21153:19;;;:27;;21179:1;21153:27;;;21175:1;21153:27;21146:34;;;;;;;;;21116:171;21208:4;:12;;21216:4;21208:12;21204:83;;;21244:2;21241:5;;:2;:5;;;:13;;21253:1;21241:13;;21204:83;19943:1701;;;;21305:6;:13;;21315:3;21305:13;21301:343;;;21333:2;21329;:6;;;;21322:13;;;;;;21301:343;21361:6;:14;;21371:4;21361:14;21357:287;;;21404:4;:9;;21412:1;21404:9;21400:49;;;-1:-1:-1;;;21429:19:0;;;21415:34;;21400:49;21470:4;:12;;21478:4;21470:12;:28;;;;21486:4;:12;;21494:4;21486:12;21470:28;21466:170;;;21523:4;:12;;21531:4;21523:12;21519:26;;;21542:3;;;21519:26;21557:8;21571:45;21581:10;21578:13;;:18;21571:45;;21605:8;21600:3;21605:8;;;;;21600:3;21571:45;;;21624:1;-1:-1:-1;21617:8:0;;-1:-1:-1;;21617:8:0;21466:170;19344:3986;;;21669:4;21660:6;:13;;;21656:1674;;;21687:6;:14;;21697:4;21687:14;21683:776;;;21727:36;21743:2;21746:1;21743:4;21749:1;21742:8;21739:2;:11;21731:20;;:3;:20;;;;21755:4;21730:29;21761:1;21727:2;:36::i;:::-;21720:43;;;;;;21683:776;21782:6;:14;;21792:4;21782:14;21778:681;;;21822:39;21838:2;21841:1;21838:4;21844:1;21837:8;21834:2;:11;21826:20;;:3;:20;;;;21850:6;21825:31;21858:2;21822;:39::i;21778:681::-;21880:6;:14;;21890:4;21880:14;21876:583;;;-1:-1:-1;;;21927:17:0;21942:1;21939;21936:4;;21935:8;21927:17;;21968:32;;;22023:5;22018:10;;21927:17;;;;;22017:18;22010:25;;21876:583;22054:6;:14;;22064:4;22054:14;22050:409;;;22079:3;22072:10;;;;;;22050:409;22109:6;:14;;22119:4;22109:14;22105:354;;;22163:2;22166:1;22163:4;22169:1;22162:8;22159:2;:11;22151:20;;:3;:20;;;;22175:4;22150:29;22143:36;;;;;;22105:354;22198:6;:14;;22208:4;22198:14;22194:265;;;22252:2;22255:1;22252:4;22258:1;22251:8;22248:2;:11;22240:20;;:3;:20;;;;22264:6;22239:31;22232:38;;;;;;22194:265;22289:6;:14;;22299:4;22289:14;22285:174;;;-1:-1:-1;;;22336:20:0;22354:1;22351;22348:4;;22347:8;22344:2;:11;22336:20;;22380:35;;;22438:5;22433:10;;22336:20;;;;;22432:18;22425:25;;21656:1674;22475:6;:14;;22485:4;22475:14;22471:859;;;-1:-1:-1;;;22522:4:0;22518:26;22542:1;22539;22536:4;;22535:8;22532:2;:11;22518:26;;22586:21;;;22566:42;;;22624:10;;22519:7;;;22518:26;;22623:18;22616:25;;22471:859;22658:6;:14;;22668:4;22658:14;22654:676;;;-1:-1:-1;;;22705:6:0;22701:28;22727:1;22724;22721:4;;22720:8;22717:2;:11;22701:28;;22771:23;;;22751:44;;;22811:10;;22702:9;;;22701:28;;22810:18;22803:25;;22654:676;22845:6;:14;;22855:4;22845:14;22841:489;;;-1:-1:-1;;;22890:16:0;22904:1;22901;22898:4;;22897:8;22890:16;;22928:32;;;22982:5;22976:11;;22890:16;;;;;22975:19;22968:26;;22841:489;23011:6;:14;;23021:4;23011:14;23007:323;;;23048:2;23041:9;;;;;;23007:323;23067:6;:14;;23077:4;23067:14;23063:267;;;-1:-1:-1;;;23112:19:0;23129:1;23126;23123:4;;23122:8;23119:2;:11;23112:19;;23153:35;;;23210:5;23204:11;;23112:19;;;;;23203;23196:26;;23063:267;23239:6;:14;;23249:4;23239:14;23235:95;;;23264:3;23257:10;;;;;;23235:95;23290:6;:14;;23300:4;23290:14;23286:44;;;23315:2;23308:9;;;;;;23286:44;23336:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10787:455;10870:7;10885:18;;:::i;:::-;-1:-1:-1;10935:4:0;10969:2;10958:13;;;;10950:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11068:13;;;;;;;:28;;;11085:11;11068:28;11064:80;;;11134:3;11106:5;:15;;;11122:8;11106:25;;;;;;;;;:31;;;;:25;;;;;;:31;11064:80;11161:12;;;;;11150:23;;;;:8;;;:23;11209:1;11194:16;;;11179:31;;;11224:13;:11;:13::i;3352:4868::-;3395:7;3410:18;;:::i;:::-;-1:-1:-1;3495:15:0;;:18;;;;3460:4;3570:18;;;;3606;;;;3642;;;;;3460:4;;3475:17;;;;3570:18;3606;3671;;;3685:4;3671:18;3667:4396;;;3725:2;3742:4;3739:7;;:12;3735:98;;3819:4;3816:7;;3808:4;:16;3802:22;3735:98;3844:7;;;3840:105;;3868:10;;;;;3888:16;;;;;;;;3868:10;-1:-1:-1;3840:105:0;;;3934:2;3929:7;;3840:105;3667:4396;;;;3961:10;:18;;3975:4;3961:18;3957:4106;;;1390:10;4002:14;;3957:4106;;;4033:10;:18;;4047:4;4033:18;4029:4034;;;4097:1;4092:6;;4029:4034;;;4115:10;:18;;4129:4;4115:18;4111:3952;;;4178:4;4163:12;;;:19;4190:26;;;:14;;;:26;4231:13;:11;:13::i;:::-;4224:20;;;;;;;;;;;4111:3952;4261:10;:18;;4275:4;4261:18;4257:3806;;;4390:14;;;4386:1789;;;;;4481:22;;;1611:1;4481:22;4477:1698;;;4602:10;4615:27;4623:2;4628:10;4623:15;4640:1;4615:7;:27::i;:::-;4693:11;4724:6;;4744:17;;;;4763:20;;;;;4724:60;;;;;;;;;;;;;;;;;;;;4602:40;;-1:-1:-1;4693:11:0;;;;4724:6;;;;;:19;;:60;;;;;;;;;;;:6;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4724:60:0;;;;;;;;;-1:-1:-1;4724:60:0;-1:-1:-1;4897:1:0;4889:10;;4977:1;4973:17;;;5038;;;5035:2;;;5068:5;5058:15;;5035:2;;5137:6;5133:2;5130:14;5127:2;;;5157;5147:12;;5127:2;5249:3;5244:1;5236:6;5232:14;5227:3;5223:24;5219:34;5212:41;;5335:3;5331:1;5319:9;5310:6;5307:1;5303:14;5299:30;5295:38;5291:48;5284:55;;5445:1;5441;5437;5425:9;5422:1;5418:17;5414:25;5410:33;5406:41;5558:1;5554;5550;5541:6;5529:9;5526:1;5522:17;5518:30;5514:38;5510:46;5506:54;5488:72;;5644:10;5640:15;5634:4;5630:26;5622:34;;5746:3;5738:4;5734:9;5729:3;5725:19;5722:28;5715:35;;;;5826:33;5835:2;5840:10;5835:15;5852:1;5855:3;5826:8;:33::i;:::-;5869:20;;;:38;;;;;;;;;-1:-1:-1;4477:1698:0;;-1:-1:-1;;4477:1698:0;;5955:18;;;1534:1;5955:18;5951:224;;;6104:2;6099:7;;5951:224;;;6136:10;6131:15;;1682:3;6156:10;;5951:224;4257:3806;;;6191:10;:18;;6205:4;6191:18;6187:1876;;;6324:15;;;1465:1;6324:15;;:34;;-1:-1:-1;6343:15:0;;;1498:1;6343:15;6324:34;:57;;;-1:-1:-1;6362:19:0;;;1571:1;6362:19;6324:57;6320:1172;;;6398:2;6393:7;;6320:1172;;;6462:23;;;1652:1;6462:23;6458:1034;;;6517:10;6530:27;6538:2;6543:10;6538:15;6555:1;6530:7;:27::i;:::-;6621:17;;;;6517:40;;-1:-1:-1;6751:1:0;6743:10;;6831:1;6827:17;6892:13;;;6889:2;;;6914:5;6908:11;;6889:2;7158:14;;;6992:1;7154:22;;;7150:32;;;;7061:26;7085:1;6984:10;;;7065:18;;;7061:26;7146:43;6980:20;;7240:12;7290:17;;;:23;7346:1;7323:20;;;:24;6988:2;-1:-1:-1;6988:2:0;6458:1034;;6187:1876;7508:10;:18;;7522:4;7508:18;7504:559;;;7582:2;:7;;7588:1;7582:7;7578:479;;;7643:14;;;;;:40;;-1:-1:-1;7661:22:0;;;1611:1;7661:22;7643:40;:62;;;-1:-1:-1;7687:18:0;;;1534:1;7687:18;7643:62;7639:312;;;7724:1;7719:6;;7639:312;;;7758:15;;;1465:1;7758:15;;:34;;-1:-1:-1;7777:15:0;;;1498:1;7777:15;7758:34;:61;;;-1:-1:-1;7796:23:0;;;1652:1;7796:23;7758:61;:84;;;-1:-1:-1;7823:19:0;;;1571:1;7823:19;7758:84;7754:197;;;7861:1;7856:6;;7754:197;;7578:479;7980:10;7975:15;;1714:4;8000:11;;7578:479;8069:15;;;;;:23;;;;:18;;;;:23;;;;8098:15;;:23;;;:18;;;;:23;-1:-1:-1;8139:12:0;;;;8128:23;;;:8;;;:23;8187:1;8172:16;8157:31;;;;;8202:13;:11;:13::i;:::-;8195:20;;;;;;;;;3352:4868;:::o;9291:1087::-;9381:7;9396:18;;:::i;:::-;-1:-1:-1;9446:4:0;9461:10;9489:4;9481:12;;;;9477:732;;;-1:-1:-1;9501:8:0;;;;9477:732;;;9532:4;:12;;9540:4;9532:12;9528:681;;;9546:13;;;:8;;;:13;9528:681;;;9582:4;:12;;9590:4;9582:12;9578:631;;;-1:-1:-1;9602:8:0;;;;9578:631;;;9633:4;:12;;9641:4;9633:12;9629:580;;;9647:13;;;:8;;;:13;9629:580;;;9683:4;:12;;9691:4;9683:12;9679:530;;;9793:7;9750:16;9733;;;9750;;;;9733:33;9798:2;9793:7;;;;;9775:8;;;:26;9809:22;:8;;;:22;9679:530;;;9848:4;:12;;9856:4;9848:12;9844:365;;;9910:10;9899;;;9910;;;9899:21;9952:2;9947:7;;;;;9929:8;;;:26;9963:22;:8;;;:22;9844:365;;;10002:4;:12;;10010:4;10002:12;9998:211;;;10065:2;10049:19;;10055:2;10049:19;;;;;;;;10031:38;;:8;;;:38;10095:19;;;;;;;;;;;;;;10077:38;;:8;;;:38;9998:211;;;10132:4;:12;;10140:4;10132:12;10128:81;;;10176:2;10173:5;;:2;:5;;;;;;;;10162:16;;;;:8;;;:16;10197:5;;;;;;;;;;;;10186:16;;:8;;;:16;10128:81;10219:13;;;;10215:65;;10270:3;10242:5;:15;;;10258:8;10242:25;;;;;;;;;:31;;;;:25;;;;;;:31;10215:65;10297:12;;;;;10286:23;;;;:8;;;:23;10345:1;10330:16;;;10315:31;;;10360:13;:11;:13::i;:::-;10353:20;9291:1087;-1:-1:-1;;;;;;;9291:1087:0:o;13103:1145::-;13186:14;13203:23;13215:10;13203:11;:23::i;:::-;13186:40;;13262:1;13256:4;13252:12;13249:2;;;13277:1;13274;13267:12;13249:2;13385;13548:15;;;13403:2;13393:13;;13381:10;13377:30;13374:1;13370:38;13513:17;;;13330:20;;13498:10;13487:22;;;13483:27;13473:38;13470:61;13765:4;13762:1;13758:12;13912:1;13897:273;13922:2;13919:1;13916:9;13897:273;;;14021:2;14009:15;;;13970:20;14044:12;;;14058:1;14040:20;14069:42;;;;14125:1;14120:42;;;;14033:129;;14069:42;14086:23;14101:7;14095:4;14086:23;:::i;:::-;14078:31;;14069:42;;14120;14137:23;14155:4;14146:7;14137:23;:::i;:::-;14129:31;;14033:129;-1:-1:-1;;13940:1:0;13933:9;13897:273;;;-1:-1:-1;;14184:4:0;14177:18;-1:-1:-1;;;;13241:1003:0:o;11246:460::-;11521:19;;;11544:5;11521:29;11514:3;:37;;;11592:14;;11627;;11621:21;;;11613:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11688:13;11246:46
0;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
var
MIPSDeployedSourceMap
=
"
1075:32558:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1655:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2081:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21344:5721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21344:5721:0;;-1:-1:-1;21344:5721:0;-1:-1:-1;21344:5721:0;:::i;:::-;;;;;;;;;;;;;;;;1655:45;1690:10;1655:45;:::o;2081:29::-;;;;;;:::o;21344:5721::-;21422:7;21441:18;;:::i;:::-;21576:4;21569:5;21566:15;21556:2;;21645:1;21643;21636:11;21556:2;21693:4;21687:11;21700;21684:28;21674:2;;21766:1;21764;21757:11;21674:2;21826:3;21808:16;21805:25;21795:2;;21900:1;21898;21891:11;21795:2;21956:3;21942:12;21939:21;21929:2;;22029:1;22027;22020:11;21929:2;22059:416;;;22293:24;;22281:2;22277:13;;;22274:1;22270:21;22266:52;;;;22335:20;;22389:21;;;22443:18;;;22137:338::o;:::-;22552:16;22610:4;22662:18;22677:2;22674:1;22671;22662:18;:::i;:::-;22654:26;;;;22712:18;22727:2;22724:1;22721;22712:18;:::i;:::-;22704:26;;;;22766:17;22781:1;22778;22775;22766:17;:::i;:::-;22758:25;;;;22823:17;22838:1;22835;22832;22823:17;:::i;:::-;22815:25;;;;22868:17;22883:1;22880;22877;22868:17;:::i;:::-;22860:25;;;;22917:17;22932:1;22929;22926;22917:17;:::i;:::-;22909:25;;;;22962:17;22977:1;22974;22971;22962:17;:::i;:::-;22954:25;;;;23007:17;23022:1;23019;23016;23007:17;:::i;:::-;22999:25;;;;23054:17;23069:1;23066;23063;23054:17;:::i;:::-;23046:25;;;;23105:17;23120:1;23117;23114;23105:17;:::i;:::-;23097:25;;;;23154:17;23169:1;23166;23163;23154:17;:::i;:::-;23263:2;23256:10;;23246:21;;;;23146:25;;-1:-1:-1;23256:10:0;-1:-1:-1;23351:1:0;23336:105;23361:2;23358:1;23355:9;23336:105;;;23410:17;23425:1;23422;23419;23410:17;:::i;:::-;23402:25;;-1:-1:-1;23402:25:0;-1:-1:-1;23379:1:0;23372:9;23336:105;;;23340:14;;;23507:5;:12;;;23503:63;;;23542:13;:11;:13::i;:::-;23535:20;;;;;23503:63;23576:10;;;:15;;23590:1;23576:15;;;;;23653:8;;;;-1:-1:-1;;23645:20:0;;-1:-1:-1;23645:7:0;:20::i;:::-;23631:34;-1:-1:-1;23691:10:0;23699:2;23691:10;;;;23760:1;23750:11;;;:26;;;23765:6;:11;;23775:1;23765:11;23750:26;23746:332;;;24003:64;24014:6;:11;;24024:1;24014:11;:20;;24032:2;24014:20;;;24028:1;24014:20;24003:64;;24065:1;24036:25;24039:4;24046:10;24039:17;24058:2;24036;:25::i;:::-;:30;;;;24003:10;:64::i;:::-;23996:71;;;;;;;23746:332;24303:15;;;;24114:9;;;;24243:4;24237:2;24229:10;;;24228:19;;;24303:15;24328:2;24320:10;;;24319:19;24303:36;;;;;;;;;;;;-1:-1:-1;24364:5:0;24384:11;;;;;:29;;;24399:6;:14;;24409:4;24399:14;24384:29;24380:756;;;24468:5;:15;;;24484:5;24468:22;;;;;;;;;;;;;;-1:-1:-1;;24527:4:0;24521:2;24513:10;;;24512:19;24380:756;;;24561:4;24552:6;:13;;;24548:588;;;24670:6;:13;;24680:3;24670:13;:30;;;;24687:6;:13;;24697:3;24687:13;24670:30;:47;;;;24704:6;:13;;24714:3;24704:13;24670:47;24666:229;;;24772:4;24779:6;24772:13;24767:18;;24666:229;;;24859:21;24862:4;24869:6;24862:13;24877:2;24859;:21::i;:::-;24854:26;;24666:229;24548:588;;;24925:4;24915:6;:14;;;;:32;;;;24933:6;:14;;24943:4;24933:14;24915:32;:50;;;;24951:6;:14;;24961:4;24951:14;24915:50;24911:225;;;25027:5;:15;;;25043:5;25027:22;;;;;;;;;;;;;25022:27;;25120:5;25112:13;;24911:225;25161:1;25151:6;:11;;;;:25;;;;;25175:1;25166:6;:10;;;25151:25;25150:42;;;;25181:6;:11;;25191:1;25181:11;25150:42;25146:117;;;25215:37;25228:6;25236:4;25242:5;25249:2;25215:12;:37::i;:::-;25208:44;;;;;;;;;;;25146:117;25292:13;25273:16;25428:4;25418:14;;;;25414:400;;25489:19;25492:4;25497:6;25492:11;25505:2;25489;:19::i;:::-;25483:25;;;;25541:10;25536:15;;25571:16;25536:15;25585:1;25571:7;:16::i;:::-;25565:22;;25615:4;25605:6;:14;;;;:32;;;;;25623:6;:14;;25633:4;25623:14;;25605:32;25601:203;;;25694:4;25682:16;;25788:1;25780:9;;25601:203;25414:400;;25839:10;25852:26;25860:4;25866:2;25870;25874:3;25852:7;:26::i;:::-;25881:10;25852:39;;;;-1:-1:-1;25973:4:0;25966:11;;;26001;;;:24;;;;;26024:1;26016:4;:9;;;;26001:24;:39;;;;;26036:4;26029;:11;;;26001:39;25997:711;;;26060:4;:9;;26068:1;26060:9;:22;;;;26073:4;:9;;26081:1;26073:9;26060:22;26056:116;;;26120:37;26131:4;:9;;26139:1;26131:9;:21;;26147:5;26131:21;;;26143:1;26131:21;26154:2;26120:10;:37::i;:::-;26113:44;;;;;;;;;;;;;;;26056:116;26190:4;:11;;26198:3;26190:11;26186:93;;;26236:28;26245:5;26252:2;26256:7;;;;26236:8;:28::i;26186:93::-;26296:4;:11;;26304:3;26296:11;26292:93;;;26342:28;26351:5;26358:2;26362:7;;;;;26342:8;:28::i;26292:93::-;26447:4;:11;;26455:3;26447:11;26443:72;;;26485:15;:13;:15::i;26443:72::-;26606:4;26598;:12;;;;:27;;;;;26621:4;26614;:11;;;26598:27;26594:104;;;26652:31;26663:4;26669:2;26673;26677:5;26652:10;:31::i;26594:104::-;26760:6;:14;;26770:4;26760:14;:28;;;;-1:-1:-1;26778:10:0;;;;;26760:28;26756:85;;;26829:1;26804:5;:15;;;26820:5;26804:22;;;;;;;;;:26;;;;:22;;;;;;:26;26756:85;26879:9;:26;;26892:13;26879:26;26875:84;;26921:27;26930:9;26941:1;26944:3;26921:8;:27::i;:::-;27032:26;27041:5;27048:3;27053:4;27032:8;:26::i;:::-;27025:33;;;;;;;;;;;;;21344:5721;;;;;;;:::o;2597:1791::-;2638:12;2783:206;;;2883:2;2879:13;;;2869:24;;2863:31;2852:43;;2923:13;;2962;;;2834:155::o;:::-;3060:4;3144;3138:11;3172:5;3244:21;3262:2;3258;3252:4;3244:21;:::i;:::-;3232:33;;;;3302:21;3320:2;3316;3310:4;3302:21;:::i;:::-;3290:33;;;;3364:20;3382:1;3378:2;3372:4;3364:20;:::i;:::-;3352:32;;;;3429:20;3447:1;3443:2;3437:4;3429:20;:::i;:::-;3417:32;;;;3482:20;3500:1;3496:2;3490:4;3482:20;:::i;:::-;3470:32;;;;3539:20;3557:1;3553:2;3547:4;3539:20;:::i;:::-;3527:32;;;;3592:20;3610:1;3606:2;3600:4;3592:20;:::i;:::-;3580:32;;;;3645:20;3663:1;3659:2;3653:4;3645:20;:::i;:::-;3633:32;;;;3700:20;3718:1;3714:2;3708:4;3700:20;:::i;:::-;3688:32;;;;3759:20;3777:1;3773:2;3767:4;3759:20;:::i;:::-;3747:32;;;;3816:20;3834:1;3830:2;3824:4;3816:20;:::i;:::-;3877:2;3867:13;;;;-1:-1:-1;3804:32:0;-1:-1:-1;3975:1:0;3960:112;3985:2;3982:1;3979:9;3960:112;;;4038:20;4056:1;4052:2;4046:4;4038:20;:::i;:::-;4026:32;;-1:-1:-1;4026:32:0;-1:-1:-1;4003:1:0;3996:9;3960:112;;;3964:14;4135:1;4131:2;4124:13;4230:5;4226:2;4222:14;4215:5;4210:27;4336:14;;;4319:32;;;-1:-1:-1;;2597:1791:0;;:::o;17559:1741::-;17632:11;17715:14;17732:24;17744:11;17732;:24::i;:::-;17715:41;;17852:1;17845:5;17841:13;17838:2;;;17883:1;17880;17873:12;17838:2;18016;18004:15;;;17961:20;18114:141;;;;18161:12;;;18197:2;18190:13;;;;18238:2;18225:16;;;18143:112::o;:::-;18410:5;18407:1;18403:13;18441:4;18473:1;18458:375;18483:2;18480:1;18477:9;18458:375;;;18598:2;18586:15;;;18539:20;18629:12;;;18643:1;18625:20;18662:78;;;;18746:1;18741:78;;;;18618:201;;18662:78;18699:23;18714:7;18708:4;18699:23;:::i;:::-;18691:31;;18662:78;;18741;18778:23;18796:4;18787:7;18778:23;:::i;:::-;18770:31;;18618:201;-1:-1:-1;;18501:1:0;18494:9;18458:375;;;18462:14;18935:4;18929:11;18914:26;;19013:7;19007:4;19004:17;18994:2;;19051:10;19048:1;19041:21;19089:2;19086:1;19079:13;18994:2;-1:-1:-1;;19225:2:0;19214:14;;;;19202:10;19198:31;19195:1;19191:39;19255:16;;;;19273:10;19251:33;;17776:1518;-1:-1:-1;;;17776:1518:0:o;2209:280::-;2268:6;2303:16;;;;2311:7;;;;2303:16;;;;;;2302:23;;;;;2317:1;2360:2;:8;;;2354:15;;;;;2353:21;;2352:30;;;;;;;2408:8;;2407:14;2302:23;2459:21;;2479:1;2459:21;;;2470:6;2459:21;2445:10;;;;;:36;;-1:-1:-1;;;2209:280:0;;;;:::o;15048:624::-;15117:12;15176:18;;:::i;:::-;-1:-1:-1;15331:8:0;;;15360:12;;;15349:23;;;;;;;15382:20;;;;;15236:4;;15506:13;;;15502:82;;15563:6;15572:1;15563:10;15535:5;:15;;;15551:8;15535:25;;;;;;;;;:38;;;;:25;;;;;;:38;15502:82;15652:13;:11;:13::i;:::-;15645:20;15048:624;-1:-1:-1;;;;;15048:624:0:o;10480:1713::-;10577:12;10635:18;;:::i;:::-;-1:-1:-1;10695:4:0;10719:17;10818:1;10807:12;;;;;:28;;;10823:7;:12;;10834:1;10823:12;10807:28;10803:859;;;10851:9;10863:5;:15;;;10879:6;10863:23;;;;;;;;;;;;;10851:35;;10923:2;10916:9;;:3;:9;;;:25;;;;;10929:7;:12;;10940:1;10929:12;10916:25;10915:58;;;;10954:2;10947:9;;:3;:9;;;;:25;;;;;10960:7;:12;;10971:1;10960:12;10947:25;10900:73;;10803:859;;;;11073:7;:12;;11084:1;11073:12;11069:593;;;11130:1;11122:3;11116:15;;;;11101:30;;11069:593;;;11222:7;:12;;11233:1;11222:12;11218:444;;;11278:1;11271:3;11265:14;;;11250:29;;11218:444;;;11387:7;:12;;11398:1;11387:12;11383:279;;;11467:4;11461:2;11452:11;;;11451:20;11490:8;11486:76;;11546:1;11539:3;11533:14;;;11518:29;;11486:76;11579:3;:8;;11586:1;11579:8;11575:77;;;11636:1;11628:3;11622:15;;;;11607:30;;11575:77;11383:279;;11730:8;;;;;11800:12;;;;11789:23;;;;;11944:162;;;;12031:1;12005:22;12008:5;12016:6;12008:14;12024:2;12005;:22::i;:::-;:27;;;;;;;11991:42;;12000:1;11991:42;11976:57;:12;;;:57;11944:162;;;12079:12;;;;;12094:1;12079:16;12064:31;;;;11944:162;12173:13;:11;:13::i;:::-;12166:20;10480:1713;-1:-1:-1;;;;;;;;10480:1713:0:o;27111:6520::-;27198:6;27232:10;27240:2;27232:10;;;;;;27279:11;;27383:4;27374:13;;27370:6215;;;27502:1;27492:6;:11;;;;:27;;;;;27516:3;27507:6;:12;;;27492:27;27488:532;;;27543:6;:11;;27553:1;27543:11;27539:431;;;-1:-1:-1;27565:4:0;27539:431;;;27613:6;:11;;27623:1;27613:11;27609:361;;;-1:-1:-1;27635:4:0;27609:361;;;27679:6;:13;;27689:3;27679:13;27675:295;;;-1:-1:-1;27703:4:0;27675:295;;;27744:6;:13;;27754:3;27744:13;27740:230;;;-1:-1:-1;27768:4:0;27740:230;;;27810:6;:13;;27820:3;27810:13;27806:164;;;-1:-1:-1;27834:4:0;27806:164;;;27875:6;:13;;27885:3;27875:13;27871:99;;;-1:-1:-1;27899:4:0;27871:99;;;27939:6;:13;;27949:3;27939:13;27935:35;;;-1:-1:-1;27963:4:0;27935:35;28004:1;27995:10;;27488:532;28073:11;;;28069:3190;;28133:4;28128:1;28120:9;;;28119:18;28166:4;28120:9;28159:11;;;28155:1203;;;28250:4;28242;:12;;;28238:1102;;28289:2;28282:9;;;;;;;28238:1102;28391:12;;;28387:953;;28438:11;;;;;;;;-1:-1:-1;28431:18:0;;-1:-1:-1;;28431:18:0;28387:953;28550:4;:12;;28558:4;28550:12;28546:794;;;28597:11;;;;;;;;-1:-1:-1;28590:18:0;;-1:-1:-1;;28590:18:0;28546:794;28712:4;:12;;28720:4;28712:12;28708:632;;;28759:27;28768:5;28762:11;;:2;:11;;;;28780:5;28775:2;:10;28759:2;:27::i;28708:632::-;28896:4;:12;;28904:4;28896:12;28892:448;;;-1:-1:-1;;;;28943:17:0;;;28955:4;28950:9;;28943:17;28936:24;;28892:448;29071:4;:12;;29079:4;29071:12;29067:273;;;-1:-1:-1;;;;29118:17:0;;;29130:4;29125:9;;29118:17;29111:24;;29067:273;29249:4;:12;;29257:4;29249:12;29245:95;;;29296:21;29305:2;29299:8;;:2;:8;;;;29314:2;29309;:7;29296:2;:21::i;29245:95::-;29502:4;:12;;29510:4;29502:12;:28;;;;29518:4;:12;;29526:4;29518:12;29502:28;29498:1025;;;29566:2;29561;:7;29554:14;;;;;;;29498:1025;29644:4;:12;;29652:4;29644:12;:28;;;;29660:4;:12;;29668:4;29660:12;29644:28;29640:883;;;29708:2;29703;:7;29696:14;;;;;;;29640:883;29778:4;:12;;29786:4;29778:12;29774:749;;;29826:2;29821;:7;29814:14;;;;;;;29774:749;29895:4;:12;;29903:4;29895:12;29891:632;;;29944:2;29939;:7;29931:16;;;;;;;29891:632;30015:4;:12;;30023:4;30015:12;30011:512;;;30064:2;30059;:7;30051:16;;;;;;;30011:512;30135:4;:12;;30143:4;30135:12;30131:392;;;-1:-1:-1;;;;30180:7:0;;;30178:10;30171:17;;30131:392;30279:4;:12;;30287:4;30279:12;30275:248;;;30338:2;30320:21;;30326:2;30320:21;;;:29;;30348:1;30320:29;;;30344:1;30320:29;30313:36;;;;;;;;;30275:248;30450:4;:12;;30458:4;30450:12;30446:77;;;30494:2;30491:5;;:2;:5;;;:13;;30503:1;30491:13;;30446:77;28069:3190;;;;30600:6;:13;;30610:3;30600:13;30596:663;;;30646:2;30640;:8;;;;30633:15;;;;;;30596:663;30709:6;:14;;30719:4;30709:14;30705:554;;;30770:4;:9;;30778:1;30770:9;30766:92;;;-1:-1:-1;;;30817:21:0;;;30803:36;;30766:92;30902:4;:12;;30910:4;30902:12;:28;;;;30918:4;:12;;30926:4;30918:12;30902:28;30898:347;;;30958:4;:12;;30966:4;30958:12;30954:75;;;31003:3;;;30954:75;31050:8;31084:113;31094:10;31091:13;;:18;31084:113;;31166:8;31137:3;31166:8;;;;;31137:3;31084:113;;;31225:1;-1:-1:-1;31218:8:0;;-1:-1:-1;;31218:8:0;30898:347;27370:6215;;;31296:4;31287:6;:13;;;31283:2302;;;31338:6;:14;;31348:4;31338:14;31334:1088;;;31379:42;31397:2;31402:1;31397:6;31407:1;31396:12;31391:2;:17;31383:26;;:3;:26;;;;31413:4;31382:35;31419:1;31379:2;:42::i;:::-;31372:49;;;;;;31334:1088;31476:6;:14;;31486:4;31476:14;31472:950;;;31517:45;31535:2;31540:1;31535:6;31545:1;31534:12;31529:2;:17;31521:26;;:3;:26;;;;31551:6;31520:37;31559:2;31517;:45::i;31472:950::-;31618:6;:14;;31628:4;31618:14;31614:808;;;-1:-1:-1;;;31665:21:0;31684:1;31679;31674:6;;31673:12;31665:21;;31718:36;;;31785:5;31780:10;;31665:21;;;;;31779:18;31772:25;;31614:808;31852:6;:14;;31862:4;31852:14;31848:574;;;31893:3;31886:10;;;;;;31848:574;31952:6;:14;;31962:4;31952:14;31948:474;;;32008:2;32013:1;32008:6;32018:1;32007:12;32002:2;:17;31994:26;;:3;:26;;;;32024:4;31993:35;31986:42;;;;;;31948:474;32084:6;:14;;32094:4;32084:14;32080:342;;;32140:2;32145:1;32140:6;32150:1;32139:12;32134:2;:17;32126:26;;:3;:26;;;;32156:6;32125:37;32118:44;;;;;;32080:342;32218:6;:14;;32228:4;32218:14;32214:208;;;-1:-1:-1;;;32265:26:0;32289:1;32284;32279:6;;32278:12;32273:2;:17;32265:26;;32323:41;;;32395:5;32390:10;;32265:26;;;;;32389:18;32382:25;;31283:2302;32464:6;:14;;32474:4;32464:14;32460:1125;;;-1:-1:-1;;;32513:4:0;32507:34;32539:1;32534;32529:6;;32528:12;32523:2;:17;32507:34;;32589:27;;;32569:48;;;32639:10;;32508:9;;;32507:34;;32638:18;32631:25;;32460:1125;32699:6;:14;;32709:4;32699:14;32695:890;;;-1:-1:-1;;;32748:6:0;32742:36;32776:1;32771;32766:6;;32765:12;32760:2;:17;32742:36;;32826:29;;;32806:50;;;32878:10;;32743:11;;;32742:36;;32877:18;32870:25;;32695:890;32939:6;:14;;32949:4;32939:14;32935:650;;;-1:-1:-1;;;32982:20:0;33000:1;32995;32990:6;;32989:12;32982:20;;33030:36;;;33094:5;33088:11;;32982:20;;;;;33087:19;33080:26;;32935:650;33149:6;:14;;33159:4;33149:14;33145:440;;;33186:2;33179:9;;;;;;33145:440;33232:6;:14;;33242:4;33232:14;33228:357;;;-1:-1:-1;;;33275:25:0;33298:1;33293;33288:6;;33287:12;33282:2;:17;33275:25;;33328:41;;;33397:5;33391:11;;33275:25;;;;;33390:19;33383:26;;33228:357;33452:6;:14;;33462:4;33452:14;33448:137;;;33489:3;33482:10;;;;;;33448:137;33535:6;:14;;33545:4;33535:14;33531:54;;;33572:2;33565:9;;;;;;33531:54;33595:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15953:688;16039:12;16098:18;;:::i;:::-;-1:-1:-1;16158:4:0;16253:2;16241:14;;;;16233:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16362:14;;;;;;;:30;;;16380:12;16362:30;16358:94;;;16437:4;16408:5;:15;;;16424:9;16408:26;;;;;;;;;:33;;;;:26;;;;;;:33;16358:94;16499:12;;;;;16488:23;;;;:8;;;:23;16551:1;16536:16;;;16521:31;;;16621:13;:11;:13::i;4429:5665::-;4472:7;4525:18;;:::i;:::-;-1:-1:-1;4629:15:0;;:18;;;;4585:4;4716:18;;;;4756;;;;4796;;;;;4585:4;;4609:17;;;;4716:18;4756;4829;;;4843:4;4829:18;4825:5090;;;4895:2;4918:4;4915:7;;:12;4911:112;;5003:4;5000:7;;4992:4;:16;4986:22;4911:112;5040:7;;;5036:141;;5072:10;;;;;5100:16;;;;;;;;5072:10;-1:-1:-1;5036:141:0;;;5160:2;5155:7;;5036:141;4825:5090;;;;5197:10;:18;;5211:4;5197:18;5193:4722;;;1690:10;5250:14;;5193:4722;;;5285:10;:18;;5299:4;5285:18;5281:4634;;;5361:1;5356:6;;5281:4634;;;5383:10;:18;;5397:4;5383:18;5379:4536;;;5458:4;5443:12;;;:19;5476:26;;;:14;;;:26;5523:13;:11;:13::i;:::-;5516:20;;;;;;;;;;;5379:4536;5557:10;:18;;5571:4;5557:18;5553:4362;;;5704:14;;;5700:2017;;;;;5809:22;;;1923:1;5809:22;5805:1912;;;5946:10;5959:27;5967:2;5972:10;5967:15;5984:1;5959:7;:27::i;:::-;6045:11;6076:6;;6096:17;;;;6115:20;;;;;6076:60;;;;;;;;;;;;;;;;;;;;5946:40;;-1:-1:-1;6045:11:0;;;;6076:6;;;;;:19;;:60;;;;;;;;;;;:6;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6076:60:0;;;;;;;;;-1:-1:-1;6076:60:0;-1:-1:-1;6267:1:0;6259:10;;6357:1;6353:17;;;6428;;;6425:2;;;6458:5;6448:15;;6425:2;;6537:6;6533:2;6530:14;6527:2;;;6557;6547:12;;6527:2;6659:3;6654:1;6646:6;6642:14;6637:3;6633:24;6629:34;6622:41;;6755:3;6751:1;6739:9;6730:6;6727:1;6723:14;6719:30;6715:38;6711:48;6704:55;;6875:1;6871;6867;6855:9;6852:1;6848:17;6844:25;6840:33;6836:41;6998:1;6994;6990;6981:6;6969:9;6966:1;6962:17;6958:30;6954:38;6950:46;6946:54;6928:72;;7094:10;7090:15;7084:4;7080:26;7072:34;;7206:3;7198:4;7194:9;7189:3;7185:19;7182:28;7175:35;;;;7302:33;7311:2;7316:10;7311:15;7328:1;7331:3;7302:8;:33::i;:::-;7353:20;;;:38;;;;;;;;;-1:-1:-1;5805:1912:0;;-1:-1:-1;;5805:1912:0;;7453:18;;;1842:1;7453:18;7449:268;;;7618:2;7613:7;;7449:268;;;7664:10;7659:15;;1998:3;7692:10;;7449:268;5553:4362;;;7737:10;:18;;7751:4;7737:18;7733:2182;;;7888:15;;;1769:1;7888:15;;:34;;-1:-1:-1;7907:15:0;;;1804:1;7907:15;7888:34;:57;;;-1:-1:-1;7926:19:0;;;1881:1;7926:19;7888:57;7884:1340;;;7970:2;7965:7;;7884:1340;;;8040:23;;;1966:1;8040:23;8036:1188;;;8103:10;8116:27;8124:2;8129:10;8124:15;8141:1;8116:7;:27::i;:::-;8215:17;;;;8103:40;;-1:-1:-1;8363:1:0;8355:10;;8453:1;8449:17;8524:13;;;8521:2;;;8546:5;8540:11;;8521:2;8820:14;;;8634:1;8816:22;;;8812:32;;;;8713:26;8737:1;8626:10;;;8717:18;;;8713:26;8808:43;8622:20;;8912:12;8978:17;;;:23;9042:1;9019:20;;;:24;8630:2;-1:-1:-1;8630:2:0;8036:1188;;7733:2182;9244:10;:18;;9258:4;9244:18;9240:675;;;9330:2;:7;;9336:1;9330:7;9326:579;;;9399:14;;;;;:40;;-1:-1:-1;9417:22:0;;;1923:1;9417:22;9399:40;:62;;;-1:-1:-1;9443:18:0;;;1842:1;9443:18;9399:62;9395:376;;;9490:1;9485:6;;9395:376;;;9532:15;;;1769:1;9532:15;;:34;;-1:-1:-1;9551:15:0;;;1804:1;9551:15;9532:34;:61;;;-1:-1:-1;9570:23:0;;;1966:1;9570:23;9532:61;:84;;;-1:-1:-1;9597:19:0;;;1881:1;9597:19;9532:84;9528:243;;;9645:1;9640:6;;9528:243;;9326:579;9814:10;9809:15;;2032:4;9842:11;;9326:579;9925:15;;;;;:23;;;;:18;;;;:23;;;;9958:15;;:23;;;:18;;;;:23;-1:-1:-1;10003:12:0;;;;9992:23;;;:8;;;:23;10055:1;10040:16;10025:31;;;;;10074:13;:11;:13::i;:::-;10067:20;;;;;;;;;4429:5665;:::o;12534:2222::-;12628:12;12686:18;;:::i;:::-;-1:-1:-1;12746:4:0;12770:10;12879:4;12870:13;;;;12866:1545;;;-1:-1:-1;12905:8:0;;;;12866:1545;;;13012:5;:13;;13021:4;13012:13;13008:1403;;;13041:14;;;:8;;;:14;13008:1403;;;13159:5;:13;;13168:4;13159:13;13155:1256;;;-1:-1:-1;13194:8:0;;;;13155:1256;;;13301:5;:13;;13310:4;13301:13;13297:1114;;;13330:14;;;:8;;;:14;13297:1114;;;13459:5;:13;;13468:4;13459:13;13455:956;;;13578:9;13528:17;13508;;;13528;;;;13508:37;13585:2;13578:9;;;;;13560:8;;;:28;13602:22;:8;;;:22;13455:956;;;13749:5;:13;;13758:4;13749:13;13745:666;;;13812:11;13798;;;13812;;;13798:25;13863:2;13856:9;;;;;13838:8;;;:28;13880:22;:8;;;:22;13745:666;;;14041:5;:13;;14050:4;14041:13;14037:374;;;14107:3;14088:23;;14094:3;14088:23;;;;;;;;14070:42;;:8;;;:42;14144:23;;;;;;;;;;;;;;14126:42;;:8;;;:42;14037:374;;;14317:5;:13;;14326:4;14317:13;14313:98;;;14363:3;14357:9;;:3;:9;;;;;;;;14346:20;;;;:8;;;:20;14391:9;;;;;;;;;;;;14380:20;;:8;;;:20;14313:98;14496:14;;;;14492:77;;14555:3;14526:5;:15;;;14542:9;14526:26;;;;;;;;;:32;;;;:26;;;;;;:32;14492:77;14615:12;;;;;14604:23;;;;:8;;;:23;14667:1;14652:16;;;14637:31;;;14736:13;:11;:13::i;:::-;14729:20;12534:2222;-1:-1:-1;;;;;;;12534:2222:0:o;19636:1584::-;19784:14;19801:24;19813:11;19801;:24::i;:::-;19784:41;;19921:1;19914:5;19910:13;19907:2;;;19952:1;19949;19942:12;19907:2;20091;20273:15;;;20110:2;20099:14;;20087:10;20083:31;20080:1;20076:39;20233:16;;;20030:20;;20218:10;20207:22;;;20203:27;20193:38;20190:60;20679:5;20676:1;20672:13;20742:1;20727:375;20752:2;20749:1;20746:9;20727:375;;;20867:2;20855:15;;;20808:20;20898:12;;;20912:1;20894:20;20931:78;;;;21015:1;21010:78;;;;20887:201;;20931:78;20968:23;20983:7;20977:4;20968:23;:::i;:::-;20960:31;;20931:78;;21010;21047:23;21065:4;21056:7;21047:23;:::i;:::-;21039:31;;20887:201;-1:-1:-1;;20770:1:0;20763:9;20727:375;;;-1:-1:-1;;21193:4:0;21186:18;-1:-1:-1;;;;19845:1369:0:o;16845:500::-;17135:20;;;17159:7;17135:32;17128:3;:40;;;17217:14;;17256:17;;17250:24;;;17242:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:14;16845:50
0;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
func
init
()
{
func
init
()
{
if
err
:=
json
.
Unmarshal
([]
byte
(
MIPSStorageLayoutJSON
),
MIPSStorageLayout
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
([]
byte
(
MIPSStorageLayoutJSON
),
MIPSStorageLayout
);
err
!=
nil
{
...
...
packages/contracts-bedrock/contracts/cannon/MIPS.sol
View file @
d29775ec
...
@@ -3,31 +3,32 @@ pragma solidity 0.7.6;
...
@@ -3,31 +3,32 @@ pragma solidity 0.7.6;
import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol";
import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol";
// https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf
/// @title MIPS
// https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf
/// @notice The MIPS contract emulates a single MIPS instruction.
// https://en.wikibooks.org/wiki/MIPS_Assembly/Instruction_Formats
/// Note that delay slots are isolated instructions:
/// the nextPC in the state pre-schedules where the VM jumps next.
// https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf
/// The Step input is a packed VM state, with binary-merkle-tree
// page A-177
/// witness data for memory reads/writes.
/// The Step outputs a keccak256 hash of the packed VM State,
// MIPS linux kernel errors used by Go runtime:
/// and logs the resulting state for offchain usage.
// https://github.com/golang/go/blob/master/src/syscall/zerrors_linux_mips.go
/// @dev https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf
/// @dev https://www.cs.cmu.edu/afs/cs/academic/class/15740-f97/public/doc/mips-isa.pdf
// This MIPS contract emulates a single MIPS instruction.
/// (page A-177)
//
/// @dev https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf
// Note that delay slots are isolated instructions:
/// @dev https://en.wikibooks.org/wiki/MIPS_Assembly/Instruction_Formats
// the nextPC in the state pre-schedules where the VM jumps next.
/// @dev https://github.com/golang/go/blob/master/src/syscall/zerrors_linux_mips.go
//
/// MIPS linux kernel errors used by Go runtime
// The Step input is a packed VM state, with binary-merkle-tree witness data for memory reads/writes.
// The Step outputs a keccak256 hash of the packed VM State, and logs the resulting state for offchain usage.
contract MIPS {
contract MIPS {
/// @notice Stores the VM state.
/// Total state size: 32 + 32 + 6 * 4 + 1 + 1 + 8 + 32 * 4 = 226 bytes
/// If nextPC != pc + 4, then the VM is executing a branch/jump delay slot.
struct State {
struct State {
bytes32 memRoot;
bytes32 memRoot;
bytes32 preimageKey;
bytes32 preimageKey;
uint32 preimageOffset;
uint32 preimageOffset;
uint32 pc;
uint32 pc;
uint32 nextPC; // State is executing a branch/jump delay slot if nextPC != pc+4
uint32 nextPC;
uint32 lo;
uint32 lo;
uint32 hi;
uint32 hi;
uint32 heap;
uint32 heap;
...
@@ -37,8 +38,7 @@ contract MIPS {
...
@@ -37,8 +38,7 @@ contract MIPS {
uint32[32] registers;
uint32[32] registers;
}
}
// total State size: 32+32+6*4+1+1+8+32*4 = 226 bytes
/// @notice Start of the data segment.
uint32 constant public BRK_START = 0x40000000;
uint32 constant public BRK_START = 0x40000000;
uint32 constant FD_STDIN = 0;
uint32 constant FD_STDIN = 0;
...
@@ -52,16 +52,20 @@ contract MIPS {
...
@@ -52,16 +52,20 @@ contract MIPS {
uint32 constant EBADF = 0x9;
uint32 constant EBADF = 0x9;
uint32 constant EINVAL = 0x16;
uint32 constant EINVAL = 0x16;
/// @notice The pre-image oracle.
IPreimageOracle public oracle;
IPreimageOracle public oracle;
/// @notice Extends the value leftwards with its most significant bit (sign extension).
function SE(uint32 dat, uint32 idx) internal pure returns (uint32) {
function SE(uint32 dat, uint32 idx) internal pure returns (uint32) {
bool isSigned = (dat >> (idx-
1)) != 0;
bool isSigned = (dat >> (idx -
1)) != 0;
uint256 signed = ((1 << (32-
idx)) - 1) << idx;
uint256 signed = ((1 << (32 -
idx)) - 1) << idx;
uint256 mask = (1 << idx) - 1;
uint256 mask = (1 << idx) - 1;
return uint32(dat&
mask | (isSigned ? signed : 0));
return uint32(dat &
mask | (isSigned ? signed : 0));
}
}
function outputState() internal returns (bytes32 out) {
/// @notice Computes the hash of the MIPS state.
/// @return out_ The hash of the MIPS state.
function outputState() internal returns (bytes32 out_) {
assembly {
assembly {
// copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data
// copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data
function copyMem(from, to, size) -> fromOut, toOut {
function copyMem(from, to, size) -> fromOut, toOut {
...
@@ -69,9 +73,15 @@ contract MIPS {
...
@@ -69,9 +73,15 @@ contract MIPS {
fromOut := add(from, 32)
fromOut := add(from, 32)
toOut := add(to, size)
toOut := add(to, size)
}
}
let from := 0x80 // state
let start := mload(0x40) // free mem ptr
// From points to the MIPS State
let from := 0x80
// Copy to the free memory pointer
let start := mload(0x40)
let to := start
let to := start
// Copy state to free memory
from, to := copyMem(from, to, 32) // memRoot
from, to := copyMem(from, to, 32) // memRoot
from, to := copyMem(from, to, 32) // preimageKey
from, to := copyMem(from, to, 32) // preimageKey
from, to := copyMem(from, to, 4) // preimageOffset
from, to := copyMem(from, to, 4) // preimageOffset
...
@@ -84,19 +94,32 @@ contract MIPS {
...
@@ -84,19 +94,32 @@ contract MIPS {
from, to := copyMem(from, to, 1) // exited
from, to := copyMem(from, to, 1) // exited
from, to := copyMem(from, to, 8) // step
from, to := copyMem(from, to, 8) // step
from := add(from, 32) // offset to registers
from := add(from, 32) // offset to registers
for { let i := 0 } lt(i, 32) { i := add(i, 1) } { from, to := copyMem(from, to, 4) } // registers
mstore(to, 0) // clean up end
// Copy registers
log0(start, sub(to, start)) // log the resulting MIPS state, for debugging
for { let i := 0 } lt(i, 32) { i := add(i, 1) } {
out := keccak256(start, sub(to, start)
)
from, to := copyMem(from, to, 4
)
}
}
return out;
// Clean up end of memory
mstore(to, 0)
// Log the resulting MIPS state, for debugging
log0(start, sub(to, start))
// Compute the hash of the resulting MIPS state
out_ := keccak256(start, sub(to, start))
}
return out_;
}
}
/// @notice Handles a syscall.
function handleSyscall() internal returns (bytes32) {
function handleSyscall() internal returns (bytes32) {
// Load state from memory
State memory state;
State memory state;
assembly {
assembly {
state := 0x80
state := 0x80
}
}
uint32 syscall_no = state.registers[2];
uint32 syscall_no = state.registers[2];
uint32 v0 = 0;
uint32 v0 = 0;
uint32 v1 = 0;
uint32 v1 = 0;
...
@@ -209,177 +232,313 @@ contract MIPS {
...
@@ -209,177 +232,313 @@ contract MIPS {
return outputState();
return outputState();
}
}
function handleBranch(uint32 opcode, uint32 insn, uint32 rtReg, uint32 rs) internal returns (bytes32) {
/// @notice Handles a branch instruction, updating the MIPS state PC where needed.
/// @param _opcode The opcode of the branch instruction.
/// @param _insn The instruction to be executed.
/// @param _rtReg The register to be used for the branch.
/// @param _rs The register to be compared with the branch register.
/// @return out_ The hashed MIPS state.
function handleBranch(uint32 _opcode, uint32 _insn, uint32 _rtReg, uint32 _rs) internal returns (bytes32 out_) {
// Load state from memory
State memory state;
State memory state;
assembly {
assembly {
state := 0x80
state := 0x80
}
}
bool shouldBranch = false;
bool shouldBranch = false;
if (opcode == 4 || opcode == 5) { // beq/bne
// beq/bne: Branch on equal / not equal
uint32 rt = state.registers[rtReg];
if (_opcode == 4 || _opcode == 5) {
shouldBranch = (rs == rt && opcode == 4) || (rs != rt && opcode == 5);
uint32 rt = state.registers[_rtReg];
} else if (opcode == 6) { shouldBranch = int32(rs) <= 0; // blez
shouldBranch = (_rs == rt && _opcode == 4) || (_rs != rt && _opcode == 5);
} else if (opcode == 7) { shouldBranch = int32(rs) > 0; // bgtz
}
} else if (opcode == 1) {
// blez: Branches if instruction is less than or equal to zero
else if (_opcode == 6) {
shouldBranch = int32(_rs) <= 0;
}
// bgtz: Branches if instruction is greater than zero
else if (_opcode == 7) {
shouldBranch = int32(_rs) > 0;
}
// bltz/bgez: Branch on less than zero / greater than or equal to zero
else if (_opcode == 1) {
// regimm
// regimm
uint32 rtv = ((insn >> 16) & 0x1F);
uint32 rtv = ((_insn >> 16) & 0x1F);
if (rtv == 0) shouldBranch = int32(rs) < 0; // bltz
if (rtv == 0) {
if (rtv == 1) shouldBranch = int32(rs) >= 0; // bgez
shouldBranch = int32(_rs) < 0;
}
if (rtv == 1) {
shouldBranch = int32(_rs) >= 0;
}
}
}
// Update the state's previous PC
uint32 prevPC = state.pc;
uint32 prevPC = state.pc;
state.pc = state.nextPC; // execute the delay slot first
// Execute the delay slot first
state.pc = state.nextPC;
// If we should branch, update the PC to the branch target
// Otherwise, proceed to the next instruction
if (shouldBranch) {
if (shouldBranch) {
state.nextPC = prevPC + 4 + (SE(insn&0xFFFF, 16)<<2); // then continue with the instruction the branch jumps to.
state.nextPC = prevPC + 4 + (SE(_insn & 0xFFFF, 16) << 2);
} else {
} else {
state.nextPC = state.nextPC + 4; // branch not taken
state.nextPC = state.nextPC + 4;
}
}
return outputState();
// Return the hash of the resulting state
out_ = outputState();
}
}
function handleHiLo(uint32 func, uint32 rs, uint32 rt, uint32 storeReg) internal returns (bytes32) {
/// @notice Handles HI and LO register instructions.
/// @param _func The function code of the instruction.
/// @param _rs The value of the RS register.
/// @param _rt The value of the RT register.
/// @param _storeReg The register to store the result in.
/// @return out_ The hash of the resulting MIPS state.
function handleHiLo(uint32 _func, uint32 _rs, uint32 _rt, uint32 _storeReg) internal returns (bytes32 out_) {
// Load state from memory
State memory state;
State memory state;
assembly {
assembly {
state := 0x80
state := 0x80
}
}
uint32 val;
uint32 val;
if (func == 0x10) val = state.hi; // mfhi
else if (func == 0x11) state.hi = rs; // mthi
// mfhi: Move the contents of the HI register into the destination
else if (func == 0x12) val = state.lo; // mflo
if (_func == 0x10) {
else if (func == 0x13) state.lo = rs; // mtlo
val = state.hi;
else if (func == 0x18) { // mult
}
uint64 acc = uint64(int64(int32(rs))*int64(int32(rt)));
// mthi: Move the contents of the source into the HI register
state.hi = uint32(acc>>32);
else if (_func == 0x11) {
state.hi = _rs;
}
// mflo: Move the contents of the LO register into the destination
else if (_func == 0x12) {
val = state.lo;
}
// mtlo: Move the contents of the source into the LO register
else if (_func == 0x13) {
state.lo = _rs;
}
// mult: Multiplies `rs` by `rt` and stores the result in HI and LO registers
else if (_func == 0x18) {
uint64 acc = uint64(int64(int32(_rs)) * int64(int32(_rt)));
state.hi = uint32(acc >> 32);
state.lo = uint32(acc);
state.lo = uint32(acc);
} else if (func == 0x19) { // multu
}
uint64 acc = uint64(uint64(rs)*uint64(rt));
// multu: Unsigned multiplies `rs` by `rt` and stores the result in HI and LO registers
state.hi = uint32(acc>>32);
else if (_func == 0x19) {
uint64 acc = uint64(uint64(_rs) * uint64(_rt));
state.hi = uint32(acc >> 32);
state.lo = uint32(acc);
state.lo = uint32(acc);
} else if (func == 0x1a) { // div
}
state.hi = uint32(int32(rs)%int32(rt));
// div: Divides `rs` by `rt`.
state.lo = uint32(int32(rs)/int32(rt));
// Stores the quotient in LO
} else if (func == 0x1b) { // divu
// And the remainder in HI
state.hi = rs%rt;
else if (_func == 0x1a) {
state.lo = rs/rt;
state.hi = uint32(int32(_rs) % int32(_rt));
state.lo = uint32(int32(_rs) / int32(_rt));
}
// divu: Unsigned divides `rs` by `rt`.
// Stores the quotient in LO
// And the remainder in HI
else if (_func == 0x1b) {
state.hi = _rs % _rt;
state.lo = _rs / _rt;
}
}
if (storeReg != 0) {
// Store the result in the destination register, if applicable
state.registers[storeReg] = val;
if (_storeReg != 0) {
state.registers[_storeReg] = val;
}
}
// Update the PC
state.pc = state.nextPC;
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
state.nextPC = state.nextPC + 4;
return outputState();
// Return the hash of the resulting state
out_ = outputState();
}
}
function handleJump(uint32 linkReg, uint32 dest) internal returns (bytes32) {
/// @notice Handles a jump instruction, updating the MIPS state PC where needed.
/// @param _linkReg The register to store the link to the instruction after the delay slot instruction.
/// @param _dest The destination to jump to.
/// @return out_ The hashed MIPS state.
function handleJump(uint32 _linkReg, uint32 _dest) internal returns (bytes32 out_) {
// Load state from memory.
State memory state;
State memory state;
assembly {
assembly {
state := 0x80
state := 0x80
}
}
// Update the next PC to the jump destination.
uint32 prevPC = state.pc;
uint32 prevPC = state.pc;
state.pc = state.nextPC;
state.pc = state.nextPC;
state.nextPC = dest;
state.nextPC = _dest;
if (linkReg != 0) {
state.registers[linkReg] = prevPC+8; // set the link-register to the instr after the delay slot instruction.
// Update the link-register to the instruction after the delay slot instruction.
if (_linkReg != 0) {
state.registers[_linkReg] = prevPC + 8;
}
}
return outputState();
// Return the hash of the resulting state.
out_ = outputState();
}
}
function handleRd(uint32 storeReg, uint32 val, bool conditional) internal returns (bytes32) {
/// @notice Handles a storing a value into a register.
/// @param _storeReg The register to store the value into.
/// @param _val The value to store.
/// @param _conditional Whether or not the store is conditional.
/// @return out_ The hashed MIPS state.
function handleRd(uint32 _storeReg, uint32 _val, bool _conditional) internal returns (bytes32 out_) {
// Load state from memory.
State memory state;
State memory state;
assembly {
assembly {
state := 0x80
state := 0x80
}
}
require(storeReg < 32, "valid register");
// never write to reg 0, and it can be conditional (movz, movn)
// The destination register must be valid.
if (storeReg != 0 && conditional) {
require(_storeReg < 32, "valid register");
state.registers[storeReg] = val;
// Never write to reg 0, and it can be conditional (movz, movn).
if (_storeReg != 0 && _conditional) {
state.registers[_storeReg] = _val;
}
}
// Update the PC.
state.pc = state.nextPC;
state.pc = state.nextPC;
state.nextPC = state.nextPC + 4;
state.nextPC = state.nextPC + 4;
return outputState();
// Return the hash of the resulting state.
out_ = outputState();
}
}
function proofOffset(uint8 proofIndex) internal pure returns (uint256 offset) {
/// @notice Computes the offset of the proof in the calldata.
/// @param _proofIndex The index of the proof in the calldata.
/// @return offset_ The offset of the proof in the calldata.
function proofOffset(uint8 _proofIndex) internal pure returns (uint256 offset_) {
// A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries.
// A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries.
// And the leaf value itself needs to be encoded as well. And proof.offset == 358
// And the leaf value itself needs to be encoded as well. And proof.offset == 358
offset = 358 + (uint256(proofIndex) * (28*
32));
offset_ = 358 + (uint256(_proofIndex) * (28 *
32));
uint256 s = 0;
uint256 s = 0;
assembly { s := calldatasize() }
assembly { s := calldatasize() }
require(s >= (offset + 28*
32), "check that there is enough calldata");
require(s >= (offset_ + 28 *
32), "check that there is enough calldata");
return offset
;
return offset_
;
}
}
function readMem(uint32 addr, uint8 proofIndex) internal pure returns (uint32 out) {
/// @notice Reads a 32-bit value from memory.
uint256 offset = proofOffset(proofIndex);
/// @param _addr The address to read from.
/// @param _proofIndex The index of the proof in the calldata.
/// @return out_ The hashed MIPS state.
function readMem(uint32 _addr, uint8 _proofIndex) internal pure returns (uint32 out_) {
// Compute the offset of the proof in the calldata.
uint256 offset = proofOffset(_proofIndex);
assembly {
assembly {
if and(addr, 3) { revert(0, 0) } // quick addr alignment check
// Validate the address alignement.
if and(_addr, 3) {
revert(0, 0)
}
// Load the leaf value.
let leaf := calldataload(offset)
let leaf := calldataload(offset)
offset := add(offset, 32)
offset := add(offset, 32)
// Convenience function to hash two nodes together in scratch space.
function hashPair(a, b) -> h {
function hashPair(a, b) -> h {
mstore(0, a) // use scratch space slots to hash the two nodes together
mstore(0, a)
mstore(32, b)
mstore(32, b)
h := keccak256(0, 64)
h := keccak256(0, 64)
}
}
let path := shr(5, addr)
let node := leaf // starting from the leaf node, work back up by combining with siblings, to reconstruct the root
// Start with the leaf node.
// Work back up by combining with siblings, to reconstruct the root.
let path := shr(5, _addr)
let node := leaf
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
let sibling := calldataload(offset)
offset := add(offset, 32)
offset := add(offset, 32)
switch and(shr(i, path), 1)
switch and(shr(i, path), 1)
case 0 { node := hashPair(node, sibling) }
case 0 {
case 1 { node := hashPair(sibling, node) }
node := hashPair(node, sibling)
} case 1 {
node := hashPair(sibling, node)
}
}
let memRoot := mload(0x80) // load memRoot, first field of state
}
if iszero(eq(node, memRoot)) { // verify the root matches
// Load the memory root from the first field of state.
let memRoot := mload(0x80)
// Verify the root matches.
if iszero(eq(node, memRoot)) {
mstore(0, 0x0badf00d)
mstore(0, 0x0badf00d)
revert(0, 32)
revert(0, 32)
}
}
// bits to shift = (32 - 4 - (addr % 32)) * 8
let shamt := shl(3, sub(sub(32, 4), and(addr, 31)))
// Bits to shift = (32 - 4 - (addr % 32)) * 8
out := and(shr(shamt, leaf), 0xFFffFFff)
let shamt := shl(3, sub(sub(32, 4), and(_addr, 31)))
out_ := and(shr(shamt, leaf), 0xFFffFFff)
}
}
return out;
}
}
// writeMem writes the value by first overwriting the part of the leaf, and then recomputing the memory merkle root.
/// @notice Writes a 32-bit value to memory.
function writeMem(uint32 addr, uint8 proofIndex, uint32 value) internal pure {
/// This function first overwrites the part of the leaf.
uint256 offset = proofOffset(proofIndex);
/// Then it recomputes the memory merkle root.
/// @param _addr The address to write to.
/// @param _proofIndex The index of the proof in the calldata.
/// @param _val The value to write.
function writeMem(uint32 _addr, uint8 _proofIndex, uint32 _val) internal pure {
// Compute the offset of the proof in the calldata.
uint256 offset = proofOffset(_proofIndex);
assembly {
assembly {
if and(addr, 3) { revert(0, 0) } // quick addr alignment check
// Validate the address alignement.
if and(_addr, 3) {
revert(0, 0)
}
// Load the leaf value.
let leaf := calldataload(offset)
let leaf := calldataload(offset)
let shamt := shl(3, sub(sub(32, 4), and(addr, 31)))
let shamt := shl(3, sub(sub(32, 4), and(_addr, 31)))
// mask out 4 bytes, and OR in the value
leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, value))
// Mask out 4 bytes, and OR in the value
leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, _val))
offset := add(offset, 32)
offset := add(offset, 32)
// Convenience function to hash two nodes together in scratch space.
function hashPair(a, b) -> h {
function hashPair(a, b) -> h {
mstore(0, a) // use scratch space slots to hash the two nodes together
mstore(0, a)
mstore(32, b)
mstore(32, b)
h := keccak256(0, 64)
h := keccak256(0, 64)
}
}
let path := shr(5, addr)
let node := leaf // starting from the leaf node, work back up by combining with siblings, to reconstruct the root
// Start with the leaf node.
// Work back up by combining with siblings, to reconstruct the root.
let path := shr(5, _addr)
let node := leaf
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
for { let i := 0 } lt(i, 27) { i := add(i, 1) } {
let sibling := calldataload(offset)
let sibling := calldataload(offset)
offset := add(offset, 32)
offset := add(offset, 32)
switch and(shr(i, path), 1)
switch and(shr(i, path), 1)
case 0 { node := hashPair(node, sibling) }
case 0 {
case 1 { node := hashPair(sibling, node) }
node := hashPair(node, sibling)
} case 1 {
node := hashPair(sibling, node)
}
}
}
mstore(0x80, node) // store new memRoot, first field of state
// Store the new memory root in the first field of state.
mstore(0x80, node)
}
}
}
}
// will revert if any required input state is missing
/// @notice Executes a single step of the vm.
/// Will revert if any required input state is missing.
function step(bytes calldata stateData, bytes calldata proof) public returns (bytes32) {
function step(bytes calldata stateData, bytes calldata proof) public returns (bytes32) {
State memory state;
State memory state;
// packed data is ~6 times smaller
// Packed calldata is ~6 times smaller than state size
assembly {
assembly {
if iszero(eq(state, 0x80)) { // expected state mem offset check
if iszero(eq(state, 0x80)) { // expected state mem offset check
revert(0,0)
revert(0,0)
...
@@ -393,6 +552,7 @@ contract MIPS {
...
@@ -393,6 +552,7 @@ contract MIPS {
if iszero(eq(proof.offset, 358)) { // 100+32+226=358 expected proof offset
if iszero(eq(proof.offset, 358)) { // 100+32+226=358 expected proof offset
revert(0,0)
revert(0,0)
}
}
function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut {
function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut {
// calldata is packed, thus starting left-aligned, shift-right to pad and right-align
// calldata is packed, thus starting left-aligned, shift-right to pad and right-align
let w := shr(shl(3, sub(32, size)), calldataload(callOffset))
let w := shr(shl(3, sub(32, size)), calldataload(callOffset))
...
@@ -400,6 +560,8 @@ contract MIPS {
...
@@ -400,6 +560,8 @@ contract MIPS {
callOffsetOut := add(callOffset, size)
callOffsetOut := add(callOffset, size)
memOffsetOut := add(memOffset, 32)
memOffsetOut := add(memOffset, 32)
}
}
// Unpack state from calldata into memory
let c := stateData.offset // calldata offset
let c := stateData.offset // calldata offset
let m := 0x80 // mem offset
let m := 0x80 // mem offset
c, m := putField(c, m, 32) // memRoot
c, m := putField(c, m, 32) // memRoot
...
@@ -413,25 +575,31 @@ contract MIPS {
...
@@ -413,25 +575,31 @@ contract MIPS {
c, m := putField(c, m, 1) // exitCode
c, m := putField(c, m, 1) // exitCode
c, m := putField(c, m, 1) // exited
c, m := putField(c, m, 1) // exited
c, m := putField(c, m, 8) // step
c, m := putField(c, m, 8) // step
// Unpack register calldata into memory
mstore(m, add(m, 32)) // offset to registers
mstore(m, add(m, 32)) // offset to registers
m := add(m, 32)
m := add(m, 32)
for { let i := 0 } lt(i, 32) { i := add(i, 1) } { c, m := putField(c, m, 4) } // registers
for { let i := 0 } lt(i, 32) { i := add(i, 1) } {
c, m := putField(c, m, 4)
}
}
if(state.exited) { // don't change state once exited
}
// Don't change state once exited
if (state.exited) {
return outputState();
return outputState();
}
}
state.step += 1;
state.step += 1;
// instruction fetch
// instruction fetch
uint32 insn = readMem(state.pc, 0);
uint32 insn = readMem(state.pc, 0);
uint32 opcode = insn >> 26; // 6-bits
uint32 opcode = insn >> 26; // 6-bits
// j-type j/jal
// j-type j/jal
if (opcode == 2 || opcode == 3) {
if (opcode == 2 || opcode == 3) {
// TODO(CLI-4136): likely bug in original code: MIPS spec says this should be in the "current" region;
// TODO(CLI-4136): likely bug in original code: MIPS spec says this should be in the "current" region;
// a 256 MB aligned region (i.e. use top 4 bits of branch delay slot (pc+4))
// a 256 MB aligned region (i.e. use top 4 bits of branch delay slot (pc+4))
return handleJump(opcode == 2 ? 0 : 31, SE(insn&
0x03FFFFFF, 26) << 2);
return handleJump(opcode == 2 ? 0 : 31, SE(insn &
0x03FFFFFF, 26) << 2);
}
}
// register fetch
// register fetch
...
@@ -442,6 +610,7 @@ contract MIPS {
...
@@ -442,6 +610,7 @@ contract MIPS {
// R-type or I-type (stores rt)
// R-type or I-type (stores rt)
rs = state.registers[(insn >> 21) & 0x1F];
rs = state.registers[(insn >> 21) & 0x1F];
uint32 rdReg = rtReg;
uint32 rdReg = rtReg;
if (opcode == 0 || opcode == 0x1c) {
if (opcode == 0 || opcode == 0x1c) {
// R-type (stores rd)
// R-type (stores rd)
rt = state.registers[rtReg];
rt = state.registers[rtReg];
...
@@ -451,10 +620,10 @@ contract MIPS {
...
@@ -451,10 +620,10 @@ contract MIPS {
// don't sign extend for andi, ori, xori
// don't sign extend for andi, ori, xori
if (opcode == 0xC || opcode == 0xD || opcode == 0xe) {
if (opcode == 0xC || opcode == 0xD || opcode == 0xe) {
// ZeroExtImm
// ZeroExtImm
rt = insn&
0xFFFF;
rt = insn &
0xFFFF;
} else {
} else {
// SignExtImm
// SignExtImm
rt = SE(insn&
0xFFFF, 16);
rt = SE(insn &
0xFFFF, 16);
}
}
} else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) {
} else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) {
// store rt value with store
// store rt value with store
...
@@ -527,6 +696,7 @@ contract MIPS {
...
@@ -527,6 +696,7 @@ contract MIPS {
return handleRd(rdReg, val, true);
return handleRd(rdReg, val, true);
}
}
/// @notice Execute an instruction.
function execute(uint32 insn, uint32 rs, uint32 rt, uint32 mem) internal pure returns (uint32) {
function execute(uint32 insn, uint32 rs, uint32 rt, uint32 mem) internal pure returns (uint32) {
uint32 opcode = insn >> 26; // 6-bits
uint32 opcode = insn >> 26; // 6-bits
uint32 func = insn & 0x3f; // 6-bits
uint32 func = insn & 0x3f; // 6-bits
...
@@ -550,76 +720,164 @@ contract MIPS {
...
@@ -550,76 +720,164 @@ contract MIPS {
if (opcode == 0) {
if (opcode == 0) {
uint32 shamt = (insn >> 6) & 0x1f;
uint32 shamt = (insn >> 6) & 0x1f;
if (func < 0x20) {
if (func < 0x20) {
if (func >= 0x08) { return rs; // jr/jalr/div + others
// jr/jalr/div + others
// Shift and ShiftV
if (func >= 0x08) {
} else if (func == 0x00) { return rt << shamt; // sll
return rs;
} else if (func == 0x02) { return rt >> shamt; // srl
} else if (func == 0x03) { return SE(rt >> shamt, 32-shamt); // sra
} else if (func == 0x04) { return rt << (rs&0x1F); // sllv
} else if (func == 0x06) { return rt >> (rs&0x1F); // srlv
} else if (func == 0x07) { return SE(rt >> rs, 32-rs); // srav
}
}
// sll: Logical Shift Left
else if (func == 0x00) {
return rt << shamt;
}
}
// 0x10-0x13 = mfhi, mthi, mflo, mtlo
// srl: Logical Shift Right
else if (func == 0x02) {
return rt >> shamt;
}
// sra: Arithmetic Shift Right
else if (func == 0x03) {
return SE(rt >> shamt, 32 - shamt);
}
// sllv: Variable Logical Shift Left
else if (func == 0x04) {
return rt << (rs & 0x1F);
}
// srlv: Variable Logical Shift Right
else if (func == 0x06) {
return rt >> (rs & 0x1F);
}
// srav: Variable Arithmetic Shift Right
else if (func == 0x07) {
return SE(rt >> rs, 32 - rs);
}
}
// R-type (ArithLog)
// R-type (ArithLog)
if (func == 0x20 || func == 0x21) { return rs+rt; // add or addu
// 0x10-0x13 = mfhi, mthi, mflo, mtlo
} else if (func == 0x22 || func == 0x23) { return rs-rt; // sub or subu
// add or addu
} else if (func == 0x24) { return rs&rt; // and
if (func == 0x20 || func == 0x21) {
} else if (func == 0x25) { return (rs|rt); // or
return rs + rt;
} else if (func == 0x26) { return (rs^rt); // xor
}
} else if (func == 0x27) { return ~(rs|rt); // nor
// sub or subu
} else if (func == 0x2a) {
else if (func == 0x22 || func == 0x23) {
return int32(rs)<int32(rt) ? 1 : 0; // slt
return rs - rt;
} else if (func == 0x2B) {
}
return rs<rt ? 1 : 0; // sltu
// and
}
else if (func == 0x24) {
} else if (opcode == 0xf) { return rt<<16; // lui
return rs & rt;
} else if (opcode == 0x1c) { // SPECIAL2
}
if (func == 2) return uint32(int32(rs)*int32(rt)); // mul
// or
if (func == 0x20 || func == 0x21) { // clo
else if (func == 0x25) {
if (func == 0x20) rs = ~rs;
return (rs | rt);
uint32 i = 0; while (rs&0x80000000 != 0) { i++; rs <<= 1; } return i;
}
}
// xor
}
else if (func == 0x26) {
} else if (opcode < 0x28) {
return (rs ^ rt);
if (opcode == 0x20) { // lb
}
return SE((mem >> (24-(rs&3)*8)) & 0xFF, 8);
// nor
} else if (opcode == 0x21) { // lh
else if (func == 0x27) {
return SE((mem >> (16-(rs&2)*8)) & 0xFFFF, 16);
return ~(rs | rt);
} else if (opcode == 0x22) { // lwl
}
uint32 val = mem << ((rs&3)*8);
// slt: Set to 1 if less than
uint32 mask = uint32(0xFFFFFFFF) << ((rs&3)*8);
else if (func == 0x2a) {
return int32(rs) < int32(rt) ? 1 : 0;
}
// sltu: Set to 1 if less than unsigned
else if (func == 0x2B) {
return rs<rt ? 1 : 0;
}
}
// lui: Load Upper Immediate
else if (opcode == 0xf) {
return rt << 16;
}
// SPECIAL2
else if (opcode == 0x1c) {
// mul
if (func == 2) {
return uint32(int32(rs) * int32(rt));
}
// clo
if (func == 0x20 || func == 0x21) {
if (func == 0x20) {
rs = ~rs;
}
uint32 i = 0;
while (rs&0x80000000 != 0) {
i++;
rs <<= 1;
}
return i;
}
}
}
else if (opcode < 0x28) {
// lb
if (opcode == 0x20) {
return SE((mem >> (24 - (rs & 3) * 8)) & 0xFF, 8);
}
// lh
else if (opcode == 0x21) {
return SE((mem >> (16 - (rs & 2) * 8)) & 0xFFFF, 16);
}
// lwl
else if (opcode == 0x22) {
uint32 val = mem << ((rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) << ((rs & 3) * 8);
return (rt & ~mask) | val;
return (rt & ~mask) | val;
} else if (opcode == 0x23) { return mem; // lw
}
} else if (opcode == 0x24) { // lbu
// lw
return (mem >> (24-(rs&3)*8)) & 0xFF;
else if (opcode == 0x23) {
} else if (opcode == 0x25) { // lhu
return mem;
return (mem >> (16-(rs&2)*8)) & 0xFFFF;
}
} else if (opcode == 0x26) { // lwr
// lbu
uint32 val = mem >> (24-(rs&3)*8);
else if (opcode == 0x24) {
uint32 mask = uint32(0xFFFFFFFF) >> (24-(rs&3)*8);
return (mem >> (24 - (rs & 3) * 8)) & 0xFF;
}
// lhu
else if (opcode == 0x25) {
return (mem >> (16 - (rs & 2) * 8)) & 0xFFFF;
}
// lwr
else if (opcode == 0x26) {
uint32 val = mem >> (24 - (rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) >> (24 - (rs & 3) * 8);
return (rt & ~mask) | val;
return (rt & ~mask) | val;
}
}
} else if (opcode == 0x28) { // sb
}
uint32 val = (rt&0xFF) << (24-(rs&3)*8);
// sb
uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24-(rs&3)*8));
else if (opcode == 0x28) {
uint32 val = (rt & 0xFF) << (24 - (rs & 3) * 8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24 - (rs & 3) * 8));
return (mem & mask) | val;
return (mem & mask) | val;
} else if (opcode == 0x29) { // sh
}
uint32 val = (rt&0xFFFF) << (16-(rs&2)*8);
// sh
uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16-(rs&2)*8));
else if (opcode == 0x29) {
uint32 val = (rt & 0xFFFF) << (16 - (rs & 2) * 8);
uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16 - (rs & 2) * 8));
return (mem & mask) | val;
return (mem & mask) | val;
} else if (opcode == 0x2a) { // swl
}
uint32 val = rt >> ((rs&3)*8);
// swl
uint32 mask = uint32(0xFFFFFFFF) >> ((rs&3)*8);
else if (opcode == 0x2a) {
uint32 val = rt >> ((rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) >> ((rs & 3) * 8);
return (mem & ~mask) | val;
return (mem & ~mask) | val;
} else if (opcode == 0x2b) { // sw
}
// sw
else if (opcode == 0x2b) {
return rt;
return rt;
} else if (opcode == 0x2e) { // swr
}
uint32 val = rt << (24-(rs&3)*8);
// swr
uint32 mask = uint32(0xFFFFFFFF) << (24-(rs&3)*8);
else if (opcode == 0x2e) {
uint32 val = rt << (24 - (rs & 3) * 8);
uint32 mask = uint32(0xFFFFFFFF) << (24 - (rs & 3) * 8);
return (mem & ~mask) | val;
return (mem & ~mask) | val;
} else if (opcode == 0x30) { return mem; // ll
}
} else if (opcode == 0x38) { return rt; // sc
// ll
else if (opcode == 0x30) {
return mem;
}
// sc
else if (opcode == 0x38) {
return rt;
}
}
revert("invalid instruction");
revert("invalid instruction");
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment