aboutsummaryrefslogtreecommitdiffstats
path: root/packages/migrations/artifacts/2.0.0/TestAssetDataDecoders.json
blob: d5d043761bac8ca8b131b8724f6e129a1977c954 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
{
    "schemaVersion": "2.0.0",
    "contractName": "TestAssetDataDecoders",
    "compilerOutput": {
        "abi": [
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "target",
                        "type": "address"
                    }
                ],
                "name": "addAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "",
                        "type": "uint256"
                    }
                ],
                "name": "authorities",
                "outputs": [
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "assetData",
                        "type": "bytes[]"
                    },
                    {
                        "name": "from",
                        "type": "address[]"
                    },
                    {
                        "name": "to",
                        "type": "address[]"
                    },
                    {
                        "name": "amounts",
                        "type": "uint256[]"
                    }
                ],
                "name": "batchTransferFrom",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "target",
                        "type": "address"
                    }
                ],
                "name": "removeAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "assetData",
                        "type": "bytes"
                    }
                ],
                "name": "publicDecodeERC721Data",
                "outputs": [
                    {
                        "name": "token",
                        "type": "address"
                    },
                    {
                        "name": "tokenId",
                        "type": "uint256"
                    },
                    {
                        "name": "receiverData",
                        "type": "bytes"
                    }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "owner",
                "outputs": [
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "name": "index",
                        "type": "uint256"
                    }
                ],
                "name": "removeAuthorizedAddressAtIndex",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "assetData",
                        "type": "bytes"
                    },
                    {
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "transferFrom",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getProxyId",
                "outputs": [
                    {
                        "name": "",
                        "type": "uint8"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "name": "",
                        "type": "address"
                    }
                ],
                "name": "authorized",
                "outputs": [
                    {
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getAuthorizedAddresses",
                "outputs": [
                    {
                        "name": "",
                        "type": "address[]"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "name": "newOwner",
                        "type": "address"
                    }
                ],
                "name": "transferOwnership",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "indexed": true,
                        "name": "caller",
                        "type": "address"
                    }
                ],
                "name": "AuthorizedAddressAdded",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": true,
                        "name": "target",
                        "type": "address"
                    },
                    {
                        "indexed": true,
                        "name": "caller",
                        "type": "address"
                    }
                ],
                "name": "AuthorizedAddressRemoved",
                "type": "event"
            }
        ],
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405260008054600160a060020a0319163317905561161f806100256000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a723058205e6e02635caf7f511415c73a52e49706d73ee7ad23f2bc71fc3f3a04a13a07686c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x161F DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x5e PUSH15 0x2635CAF7F511415C73A52E49706D7 RETURNDATACOPY 0xe7 0xad 0x23 CALLCODE 0xbc PUSH18 0xFC3F3A04A13A07686C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ",
                "sourceMap": "744:871:9:-;;;363:5:17;:18;;-1:-1:-1;;;;;;363:18:17;371:10;363:18;;;744:871:9;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100be578063494503d4146100e0578063563c875d14610116578063707129391461013657806372c2f527146101565780638da5cb5b146101855780639ad267441461019a578063a85e59e4146101ba578063ae25532e146101da578063b9181611146101fc578063d39de6e914610229578063f2fde38b1461024b575b600080fd5b3480156100ca57600080fd5b506100de6100d9366004611114565b61026b565b005b3480156100ec57600080fd5b506101006100fb3660046112e6565b6103b2565b60405161010d9190611410565b60405180910390f35b34801561012257600080fd5b506100de610131366004611174565b6103da565b34801561014257600080fd5b506100de610151366004611114565b6104cd565b34801561016257600080fd5b506101766101713660046112b1565b61069b565b60405161010d9392919061148a565b34801561019157600080fd5b506101006106b6565b3480156101a657600080fd5b506100de6101b536600461113a565b6106c5565b3480156101c657600080fd5b506100de6101d5366004611234565b610887565b3480156101e657600080fd5b506101ef610933565b60405161010d9190611500565b34801561020857600080fd5b5061021c610217366004611114565b610939565b60405161010d91906114d1565b34801561023557600080fd5b5061023e61094e565b60405161010d91906114c0565b34801561025757600080fd5b506100de610266366004611114565b6109b0565b600054600160a060020a031633146102a15760405160e560020a62461bcd028152600401610298906114f0565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103165760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103c057fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104475760405160e560020a62461bcd02815260040161029891906114df565b50600090505b84518110156104c6576104be858281518110151561046757fe5b90602001906020020151858381518110151561047f57fe5b90602001906020020151858481518110151561049757fe5b9060200190602002015185858151811015156104af57fe5b90602001906020020151610a18565b60010161044d565b5050505050565b60008054600160a060020a031633146104fb5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105715760405160e560020a62461bcd02815260040161029891906114df565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b6002548110156106615781600160a060020a03166002828154811015156105b757fe5b600091825260209091200154600160a060020a03161415610659576002805460001981019081106105e457fe5b60009182526020909120015460028054600160a060020a03909216918390811061060a57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556002805460001901906106539082610edb565b50610661565b600101610594565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60008060606106a984610b99565b9196909550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061071f5760405160e560020a62461bcd02815260040161029891906114df565b5081600160a060020a031660028281548110151561073957fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107aa5760405160e560020a62461bcd02815260040161029891906114df565b50600160a060020a0382166000908152600160205260409020805460ff191690556002805460001981019081106107dd57fe5b60009182526020909120015460028054600160a060020a03909216918390811061080357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061084c9082610edb565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156108f45760405160e560020a62461bcd02815260040161029891906114df565b506104c685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a18565b60025b90565b60016020526000908152604090205460ff1681565b606060028054806020026020016040519081016040528092919081815260200182805480156109a657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610988575b5050505050905090565b600054600160a060020a031633146109dd5760405160e560020a62461bcd028152600401610298906114f0565b600160a060020a03811615610a15576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60408051808201909152600e81527f494e56414c49445f414d4f554e540000000000000000000000000000000000006020820152600090819060609060018514610a785760405160e560020a62461bcd02815260040161029891906114df565b50610a8287610b99565b925092509250600081511115610b14576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610add908990899087908790600401611446565b600060405180830381600087803b158015610af757600080fd5b505af1158015610b0b573d6000803e3d6000fd5b50505050610b90565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610b5d9089908990879060040161141e565b600060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050505b50505050505050565b6000806060610ba9846000610bd7565b9250610bb6846014610c7e565b9150603484511115610bd057610bcd846034610c91565b90505b9193909250565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610c615760405160e560020a62461bcd02815260040161029891906114df565b50506014818301810151910190600160a060020a03165b92915050565b6000610c8a8383610d8a565b9392505050565b60606000610c9f8484610c7e565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610d2e5760405160e560020a62461bcd02815260040161029891906114df565b50806040519080825280601f01601f191660200182016040528015610d5d578160200160208202803883390190505b509150610d83610d6c83610936565b60200184610d7987610936565b0160200183610e1e565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e145760405160e560020a62461bcd02815260040161029891906114df565b5050016020015190565b6020811015610e48576001816020036101000a038019835116818551168082178652505050610ed6565b82821415610e5557610ed6565b82821115610e9b5760208104602082039150818301828501815160005b84811015610e90578651885260209788019790960195600101610e72565b50905250610ed69050565b60208104602082039150818301828501845160005b84811015610ecf5783518352601f199384019390920191600101610eb0565b5086525050505b505050565b815481835581811115610ed657600083815260209020610ed691810190830161093691905b80821115610f145760008155600101610f00565b5090565b6000610c8a8235611588565b6000601f82018313610f3557600080fd5b8135610f48610f4382611535565b61150e565b91508181835260208401935060208101905083856020840282011115610f6d57600080fd5b60005b83811015610f995781610f838882610f18565b8452506020928301929190910190600101610f70565b5050505092915050565b6000601f82018313610fb457600080fd5b8135610fc2610f4382611535565b81815260209384019390925082018360005b83811015610f995781358601610fea88826110b9565b8452506020928301929190910190600101610fd4565b6000601f8201831361101157600080fd5b813561101f610f4382611535565b9150818183526020840193506020810190508385602084028201111561104457600080fd5b60005b83811015610f99578161105a8882611108565b8452506020928301929190910190600101611047565b600080601f8301841361108257600080fd5b50813567ffffffffffffffff81111561109a57600080fd5b6020830191508360018202830111156110b257600080fd5b9250929050565b6000601f820183136110ca57600080fd5b81356110d8610f4382611556565b915080825260208301602083018583830111156110f457600080fd5b6110ff83828461159f565b50505092915050565b6000610c8a8235610936565b60006020828403121561112657600080fd5b60006111328484610f18565b949350505050565b6000806040838503121561114d57600080fd5b60006111598585610f18565b925050602061116a85828601611108565b9150509250929050565b6000806000806080858703121561118a57600080fd5b843567ffffffffffffffff8111156111a157600080fd5b6111ad87828801610fa3565b945050602085013567ffffffffffffffff8111156111ca57600080fd5b6111d687828801610f24565b935050604085013567ffffffffffffffff8111156111f357600080fd5b6111ff87828801610f24565b925050606085013567ffffffffffffffff81111561121c57600080fd5b61122887828801611000565b91505092959194509250565b60008060008060006080868803121561124c57600080fd5b853567ffffffffffffffff81111561126357600080fd5b61126f88828901611070565b9550955050602061128288828901610f18565b935050604061129388828901610f18565b92505060606112a488828901611108565b9150509295509295909350565b6000602082840312156112c357600080fd5b813567ffffffffffffffff8111156112da57600080fd5b611132848285016110b9565b6000602082840312156112f857600080fd5b60006111328484611108565b61130d81611588565b82525050565b600061131e82611584565b8084526020840193506113308361157e565b60005b8281101561136057611346868351611304565b61134f8261157e565b602096909601959150600101611333565b5093949350505050565b61130d81611594565b600061137e82611584565b8084526113928160208601602086016115ab565b61139b816115db565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61130d81610936565b61130d81611599565b60208101610c788284611304565b6060810161142c8286611304565b6114396020830185611304565b61113260408301846113fe565b608081016114548287611304565b6114616020830186611304565b61146e60408301856113fe565b81810360608301526114808184611373565b9695505050505050565b606081016114988286611304565b6114a560208301856113fe565b81810360408301526114b78184611373565b95945050505050565b60208082528101610c8a8184611313565b60208101610c78828461136a565b60208082528101610c8a8184611373565b60208082528101610c78816113a8565b60208101610c788284611407565b60405181810167ffffffffffffffff8111828210171561152d57600080fd5b604052919050565b600067ffffffffffffffff82111561154c57600080fd5b5060209081020190565b600067ffffffffffffffff82111561156d57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156115c65781810151838201526020016115ae565b838111156115d5576000848401525b50505050565b601f01601f1916905600a265627a7a723058205e6e02635caf7f511415c73a52e49706d73ee7ad23f2bc71fc3f3a04a13a07686c6578706572696d656e74616cf50037",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x156 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1BA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1DA JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x24B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0xD9 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x26B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0xFB CALLDATASIZE PUSH1 0x4 PUSH2 0x12E6 JUMP JUMPDEST PUSH2 0x3B2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x1174 JUMP JUMPDEST PUSH2 0x3DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x4CD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x162 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x171 CALLDATASIZE PUSH1 0x4 PUSH2 0x12B1 JUMP JUMPDEST PUSH2 0x69B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x148A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH2 0x6B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x113A JUMP JUMPDEST PUSH2 0x6C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x887 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EF PUSH2 0x933 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x1500 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x939 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14D1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x235 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x94E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x10D SWAP2 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x1114 JUMP JUMPDEST PUSH2 0x9B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2A1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x316 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3C0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x447 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x4C6 JUMPI PUSH2 0x4BE DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x467 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x47F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x497 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4AF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x44D JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x571 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x661 JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5B7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x659 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x5E4 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x60A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x653 SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH2 0x661 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x594 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x6A9 DUP5 PUSH2 0xB99 JUMP JUMPDEST SWAP2 SWAP7 SWAP1 SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x71F JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x7DD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x803 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x84C SWAP1 DUP3 PUSH2 0xEDB JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8F4 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0x4C6 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9A6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x988 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP1 PUSH2 0x14F0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA15 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0x1 DUP6 EQ PUSH2 0xA78 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP PUSH2 0xA82 DUP8 PUSH2 0xB99 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xB14 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xADD SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1446 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xB5D SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x141E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0xBA9 DUP5 PUSH1 0x0 PUSH2 0xBD7 JUMP JUMPDEST SWAP3 POP PUSH2 0xBB6 DUP5 PUSH1 0x14 PUSH2 0xC7E JUMP JUMPDEST SWAP2 POP PUSH1 0x34 DUP5 MLOAD GT ISZERO PUSH2 0xBD0 JUMPI PUSH2 0xBCD DUP5 PUSH1 0x34 PUSH2 0xC91 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP4 DUP4 PUSH2 0xD8A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC9F DUP5 DUP5 PUSH2 0xC7E JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xD2E JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD5D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xD83 PUSH2 0xD6C DUP4 PUSH2 0x936 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xD79 DUP8 PUSH2 0x936 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0xE1E JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE14 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x298 SWAP2 SWAP1 PUSH2 0x14DF JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE48 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xE55 JUMPI PUSH2 0xED6 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xE9B JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xE90 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0xE72 JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0xED6 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0xECF JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xEB0 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xED6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xED6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x936 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF14 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF00 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xF35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xF48 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST PUSH2 0x150E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0xF83 DUP9 DUP3 PUSH2 0xF18 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xF70 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xFC2 PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0xFEA DUP9 DUP3 PUSH2 0x10B9 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0xFD4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x101F PUSH2 0xF43 DUP3 PUSH2 0x1535 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1044 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF99 JUMPI DUP2 PUSH2 0x105A DUP9 DUP3 PUSH2 0x1108 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1082 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x10B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10D8 PUSH2 0xF43 DUP3 PUSH2 0x1556 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x10F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10FF DUP4 DUP3 DUP5 PUSH2 0x159F JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC8A DUP3 CALLDATALOAD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0xF18 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1159 DUP6 DUP6 PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x116A DUP6 DUP3 DUP7 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x118A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11AD DUP8 DUP3 DUP9 ADD PUSH2 0xFA3 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11D6 DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x11F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x11FF DUP8 DUP3 DUP9 ADD PUSH2 0xF24 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x121C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1228 DUP8 DUP3 DUP9 ADD PUSH2 0x1000 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x126F DUP9 DUP3 DUP10 ADD PUSH2 0x1070 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x1282 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x1293 DUP9 DUP3 DUP10 ADD PUSH2 0xF18 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x12A4 DUP9 DUP3 DUP10 ADD PUSH2 0x1108 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1132 DUP5 DUP3 DUP6 ADD PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1132 DUP5 DUP5 PUSH2 0x1108 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1588 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1330 DUP4 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1360 JUMPI PUSH2 0x1346 DUP7 DUP4 MLOAD PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x134F DUP3 PUSH2 0x157E JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x1333 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x137E DUP3 PUSH2 0x1584 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1392 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x15AB JUMP JUMPDEST PUSH2 0x139B DUP2 PUSH2 0x15DB JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x936 JUMP JUMPDEST PUSH2 0x130D DUP2 PUSH2 0x1599 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1304 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x142C DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1439 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1132 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x13FE JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x1454 DUP3 DUP8 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x1461 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x146E PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1480 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1498 DUP3 DUP7 PUSH2 0x1304 JUMP JUMPDEST PUSH2 0x14A5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x13FE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14B7 DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1313 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x136A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC8A DUP2 DUP5 PUSH2 0x1373 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xC78 DUP2 PUSH2 0x13A8 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xC78 DUP3 DUP5 PUSH2 0x1407 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x152D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x154C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x156D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x15AE JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x15D5 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x5e PUSH15 0x2635CAF7F511415C73A52E49706D7 RETURNDATACOPY 0xe7 0xad 0x23 CALLCODE 0xbc PUSH18 0xFC3F3A04A13A07686C6578706572696D656E PUSH21 0x616CF5003700000000000000000000000000000000 ",
                "sourceMap": "744:871:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:3;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:3;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:2;;;;;;;;;1676:542:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:3;;;;;;;;;1181:432:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1181:432:9;;;;;;;;;;;;;;;;;;;292:20:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:17;;;;2391:525:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:3;;;;;;;;;1037:287:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:2;;;;;;;;;2122:112:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2122:112:1;;;;;;;;;;;;1080:43:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:3;;;;;;;;;;;;;;;;;3013:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:3;;;;;;;;;;;;566:167:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:17;;;;;;;;;1244:318:3;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:3;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:3;;;;;;;;;;-1:-1:-1;;;;;;1439:18:3;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:3;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:3;;;;;;;;-1:-1:-1;;1474:24:3;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:3;;-1:-1:-1;1129:28:3;:::o;1679:431:2:-;1000:10:3;1897:9:2;989:22:3;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1909:1:2;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:3:-;1909:6;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;1795:18:3;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:3;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:3;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:3;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:3;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:3;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:3;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:3;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:3;-1:-1:-1;;;;;2012:52:3;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:3;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:3;;;;;;;;1676:542;;:::o;1181:432:9:-;1295:13;1322:15;1351:25;1480:32;1502:9;1480:21;:32::i;:::-;1401:111;;;;-1:-1:-1;1401:111:9;;-1:-1:-1;1181:432:9;-1:-1:-1;;1181:432:9:o;292:20:17:-;;;-1:-1:-1;;;;;292:20:17;;:::o;2391:525:3:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:3;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:3;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:3;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:3;;;;;;;;;;-1:-1:-1;;;;;;2733:18:3;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:3;;;2782:11;2794:18;;-1:-1:-1;;2794:22:3;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:3;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:3;-1:-1:-1;;;;;2761:56:3;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:3;;;;;;:::i;:::-;-1:-1:-1;2865:44:3;;2898:10;;-1:-1:-1;;;;;2865:44:3;;;;;;;;2391:525;;:::o;1037:287:2:-;1000:10:3;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1210:107:2;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;2122:112:1:-;941:1;2122:112;;:::o;1080:43:3:-;;;;;;;;;;;;;;;:::o;3013:138::-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:3;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:17:-;460:5;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;662:22:17;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:17;-1:-1:-1;;;;;700:16:17;;;;;658:69;566:167;:::o;1194:830:1:-;1451:14;;;;;;;;;;;;;;;;;1534:13;;;;1590:25;;1436:1;1426:11;;1405:70;;;;-1:-1:-1;;;;;1405:70:1;;;;;;;;;;;1628:32;1650:9;1628:21;:32::i;:::-;1520:140;;;;;;1841:1;1819:12;:19;:23;1815:203;;;1858:68;;;;;-1:-1:-1;;;;;1858:35:1;;;;;:68;;1894:4;;1900:2;;1904:7;;1913:12;;1858:68;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1858:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1858:68:1;;;;1815:203;;;1957:50;;;;;-1:-1:-1;;;;;1957:31:1;;;;;:50;;1989:4;;1995:2;;1999:7;;1957:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1957:50:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1957:50:1;;;;1815:203;1194:830;;;;;;;:::o;2621:531::-;2736:13;2763:15;2792:25;2880;2892:9;2903:1;2880:11;:25::i;:::-;2872:33;;2925:26;2937:9;2948:2;2925:11;:26::i;:::-;2915:36;;2984:2;2965:9;:16;:21;2961:91;;;3017:24;3027:9;3038:2;3017:9;:24::i;:::-;3002:39;;2961:91;2621:531;;;;;:::o;2855:884:14:-;2976:14;3039:5;3047:2;3039:10;3027:1;:8;:22;;3091:38;;;;;;;;;;;;;;;;;;;;;;;3006:133;;;;;;;-1:-1:-1;;;;;3006:133:14;;;;;;;;;;-1:-1:-1;;3386:2:14;3641:13;;;;;3635:20;3377:11;;;-1:-1:-1;;;;;3631:69:14;2855:884;;;;;:::o;7053:195::-;7174:14;7219:21;7231:1;7234:5;7219:11;:21::i;:::-;7211:30;7053:195;-1:-1:-1;;;7053:195:14:o;8352:784::-;8471:19;8545:25;8573:21;8585:1;8588:5;8573:11;:21::i;:::-;8545:49;;8613:2;8604:11;;;;8749:17;8741:5;:25;8729:1;:8;:37;;8780:48;;;;;;;;;;;;;;;;;;;;;;;8708:130;;;;;;;-1:-1:-1;;;;;8708:130:14;;;;;;;;;;;8920:17;8910:28;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8910:28:14;;8901:37;;8948:157;8969:21;8983:6;8969:13;:21::i;:::-;8993:2;8969:26;9054:5;9035:16;9049:1;9035:13;:16::i;:::-;:24;9062:2;9035:29;9078:17;8948:7;:157::i;:::-;8352:784;;;;;:::o;5639:488::-;5760:14;5823:5;5831:2;5823:10;5811:1;:8;:22;;5847:38;;;;;;;;;;;;;;;;;;;;;;;5790:105;;;;;;;-1:-1:-1;;;;;5790:105:14;;;;;;;;;;-1:-1:-1;;6074:13:14;5976:2;6074:13;6068:20;;5639:488::o;1244:3897:15:-;1394:2;1385:6;:11;1381:3754;;;1683:1;1673:6;1669:2;1665:15;1660:3;1656:25;1652:33;1734:4;1730:9;1721:6;1715:13;1711:29;1783:4;1776;1770:11;1766:22;1824:1;1821;1818:8;1812:4;1805:22;1622:219;;;;;;1945:4;1935:6;:14;1931:59;;;1969:7;;1931:59;2679:4;2670:6;:13;2666:2459;;;2829:2;2821:6;2817:15;3125:2;3117:6;3113:15;3103:25;;3173:6;3165;3161:19;3223:6;3217:4;3213:17;3530:4;3524:11;3625:1;3611:219;3634:6;3631:1;3628:13;3611:219;;;3698:13;;3685:27;;3759:2;3795:13;;;;3747:15;;;;3655:1;3648:9;3611:219;;;-1:-1:-1;3899:18:15;;-1:-1:-1;2712:1223:15;;-1:-1:-1;2712:1223:15;;4099:2;4091:6;4087:15;4300:2;4292:6;4288:15;4278:25;;4348:6;4340;4336:19;4398:6;4392:4;4388:17;4708:6;4702:13;4805:1;4791:213;4814:6;4811:1;4808:13;4791:213;;;4878:11;;4865:25;;-1:-1:-1;;4923:13:15;;;;4969;;;;4835:1;4828:9;4791:213;;;-1:-1:-1;5074:19:15;;-1:-1:-1;;;3982:1129:15;1244:3897;;;:::o;744:871:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2327:335;;;2434:4;2422:17;;2418:27;-1:-1;2408:2;;2459:1;2456;2449:12;2408:2;-1:-1;2479:20;;2519:18;2508:30;;2505:2;;;2551:1;2548;2541:12;2505:2;2585:4;2577:6;2573:17;2561:29;;2635:3;2628;2620:6;2616:16;2606:8;2602:31;2599:40;2596:2;;;2652:1;2649;2642:12;2596:2;2401:261;;;;;;2671:432;;2761:4;2749:17;;2745:27;-1:-1;2735:2;;2786:1;2783;2776:12;2735:2;2823:6;2810:20;2845:60;2860:44;2897:6;2860:44;;2845:60;2836:69;;2925:6;2918:5;2911:21;2961:4;2953:6;2949:17;2994:4;2987:5;2983:16;3029:3;3020:6;3015:3;3011:16;3008:25;3005:2;;;3046:1;3043;3036:12;3005:2;3056:41;3090:6;3085:3;3080;3056:41;;;2728:375;;;;;;;;3560:118;;3627:46;3665:6;3652:20;3627:46;;3685:241;;3789:2;3777:9;3768:7;3764:23;3760:32;3757:2;;;3805:1;3802;3795:12;3757:2;3840:1;3857:53;3902:7;3882:9;3857:53;;;3847:63;3751:175;-1:-1;;;;3751:175;3933:366;;;4054:2;4042:9;4033:7;4029:23;4025:32;4022:2;;;4070:1;4067;4060:12;4022:2;4105:1;4122:53;4167:7;4147:9;4122:53;;;4112:63;;4084:97;4212:2;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;;;4220:63;;4191:98;4016:283;;;;;;4306:1171;;;;;4566:3;4554:9;4545:7;4541:23;4537:33;4534:2;;;4583:1;4580;4573:12;4534:2;4618:31;;4669:18;4658:30;;4655:2;;;4701:1;4698;4691:12;4655:2;4721:83;4796:7;4787:6;4776:9;4772:22;4721:83;;;4711:93;;4597:213;4869:2;4858:9;4854:18;4841:32;4893:18;4885:6;4882:30;4879:2;;;4925:1;4922;4915:12;4879:2;4945:78;5015:7;5006:6;4995:9;4991:22;4945:78;;;4935:88;;4820:209;5088:2;5077:9;5073:18;5060:32;5112:18;5104:6;5101:30;5098:2;;;5144:1;5141;5134:12;5098:2;5164:78;5234:7;5225:6;5214:9;5210:22;5164:78;;;5154:88;;5039:209;5307:2;5296:9;5292:18;5279:32;5331:18;5323:6;5320:30;5317:2;;;5363:1;5360;5353:12;5317:2;5383:78;5453:7;5444:6;5433:9;5429:22;5383:78;;;5373:88;;5258:209;4528:949;;;;;;;;5484:741;;;;;;5658:3;5646:9;5637:7;5633:23;5629:33;5626:2;;;5675:1;5672;5665:12;5626:2;5710:31;;5761:18;5750:30;;5747:2;;;5793:1;5790;5783:12;5747:2;5821:64;5877:7;5868:6;5857:9;5853:22;5821:64;;;5803:82;;;;5689:202;5922:2;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;;;5930:63;;5901:98;6030:2;6048:53;6093:7;6084:6;6073:9;6069:22;6048:53;;;6038:63;;6009:98;6138:2;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;;;6146:63;;6117:98;5620:605;;;;;;;;;6232:345;;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6361:1;6358;6351:12;6313:2;6396:31;;6447:18;6436:30;;6433:2;;;6479:1;6476;6469:12;6433:2;6499:62;6553:7;6544:6;6533:9;6529:22;6499:62;;6584:241;;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6739:1;6756:53;6801:7;6781:9;6756:53;;6832:110;6905:31;6930:5;6905:31;;;6900:3;6893:44;6887:55;;;6980:590;;7115:54;7163:5;7115:54;;;7187:6;7182:3;7175:19;7211:4;7206:3;7202:14;7195:21;;7256:56;7306:5;7256:56;;;7333:1;7318:230;7343:6;7340:1;7337:13;7318:230;;;7383:53;7432:3;7423:6;7417:13;7383:53;;;7453:60;7506:6;7453:60;;;7536:4;7527:14;;;;;7443:70;-1:-1;7365:1;7358:9;7318:230;;;-1:-1;7561:3;;7094:476;-1:-1;;;;7094:476;7578:101;7645:28;7667:5;7645:28;;7686:297;;7786:38;7818:5;7786:38;;;7841:6;7836:3;7829:19;7853:63;7909:6;7902:4;7897:3;7893:14;7886:4;7879:5;7875:16;7853:63;;;7948:29;7970:6;7948:29;;;7928:50;;;7941:4;7928:50;;7766:217;-1:-1;;;7766:217;8290:397;8445:2;8433:15;;8482:66;8477:2;8468:12;;8461:88;8583:66;8578:2;8569:12;;8562:88;8678:2;8669:12;;8426:261;8695:110;8768:31;8793:5;8768:31;;8812:104;8881:29;8904:5;8881:29;;8923:193;9031:2;9016:18;;9045:61;9020:9;9079:6;9045:61;;9123:395;9287:2;9272:18;;9301:61;9276:9;9335:6;9301:61;;;9373:62;9431:2;9420:9;9416:18;9407:6;9373:62;;;9446;9504:2;9493:9;9489:18;9480:6;9446:62;;9525:581;9735:3;9720:19;;9750:61;9724:9;9784:6;9750:61;;;9822:62;9880:2;9869:9;9865:18;9856:6;9822:62;;;9895;9953:2;9942:9;9938:18;9929:6;9895:62;;;10005:9;9999:4;9995:20;9990:2;9979:9;9975:18;9968:48;10030:66;10091:4;10082:6;10030:66;;;10022:74;9706:400;-1:-1;;;;;;9706:400;10113:479;10295:2;10280:18;;10309:61;10284:9;10343:6;10309:61;;;10381:62;10439:2;10428:9;10424:18;10415:6;10381:62;;;10491:9;10485:4;10481:20;10476:2;10465:9;10461:18;10454:48;10516:66;10577:4;10568:6;10516:66;;;10508:74;10266:326;-1:-1;;;;;10266:326;10599:341;10757:2;10771:47;;;10742:18;;10832:98;10742:18;10916:6;10832:98;;10947:181;11049:2;11034:18;;11063:55;11038:9;11091:6;11063:55;;11135:273;11259:2;11273:47;;;11244:18;;11334:64;11244:18;11384:6;11334:64;;11415:387;11596:2;11610:47;;;11581:18;;11671:121;11581:18;11671:121;;11809:185;11913:2;11898:18;;11927:57;11902:9;11957:6;11927:57;;12001:256;12063:2;12057:9;12089:17;;;12164:18;12149:34;;12185:22;;;12146:62;12143:2;;;12221:1;12218;12211:12;12143:2;12237;12230:22;12041:216;;-1:-1;12041:216;12264:258;;12423:18;12415:6;12412:30;12409:2;;;12455:1;12452;12445:12;12409:2;-1:-1;12484:4;12472:17;;;12502:15;;12346:176;13064:254;;13203:18;13195:6;13192:30;13189:2;;;13235:1;13232;13225:12;13189:2;-1:-1;13308:4;13279;13256:17;;;;-1:-1;;13252:33;13298:15;;13126:192;13592:121;13701:4;13689:17;;13670:43;13722:107;13812:12;;13796:33;14160:128;-1:-1;;;;;14229:54;;14212:76;14295:92;14368:13;14361:21;;14344:43;14480:88;14558:4;14547:16;;14530:38;14797:145;14878:6;14873:3;14868;14855:30;-1:-1;14934:1;14916:16;;14909:27;14848:94;14951:268;15016:1;15023:101;15037:6;15034:1;15031:13;15023:101;;;15104:11;;;15098:18;15085:11;;;15078:39;15059:2;15052:10;15023:101;;;15139:6;15136:1;15133:13;15130:2;;;15204:1;15195:6;15190:3;15186:16;15179:27;15130:2;15000:219;;;;;15227:97;15315:2;15295:14;-1:-1;;15291:28;;15275:49"
            }
        }
    },
    "sources": {
        "current/protocol/AssetProxy/ERC20Proxy.sol": {
            "id": 0
        },
        "current/protocol/AssetProxy/ERC721Proxy.sol": {
            "id": 1
        },
        "current/protocol/AssetProxy/MixinAssetProxy.sol": {
            "id": 2
        },
        "current/protocol/AssetProxy/MixinAuthorizable.sol": {
            "id": 3
        },
        "current/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
            "id": 4
        },
        "current/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
            "id": 5
        },
        "current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol": {
            "id": 6
        },
        "current/protocol/AssetProxy/mixins/MAssetProxy.sol": {
            "id": 7
        },
        "current/protocol/AssetProxy/mixins/MAuthorizable.sol": {
            "id": 8
        },
        "current/test/TestAssetDataDecoders/TestAssetDataDecoders.sol": {
            "id": 9
        },
        "current/tokens/ERC20Token/IERC20Token.sol": {
            "id": 10
        },
        "current/tokens/ERC721Token/ERC721Token.sol": {
            "id": 11
        },
        "current/tokens/ERC721Token/IERC721Receiver.sol": {
            "id": 12
        },
        "current/tokens/ERC721Token/IERC721Token.sol": {
            "id": 13
        },
        "current/utils/LibBytes/LibBytes.sol": {
            "id": 14
        },
        "current/utils/LibMem/LibMem.sol": {
            "id": 15
        },
        "current/utils/Ownable/IOwnable.sol": {
            "id": 16
        },
        "current/utils/Ownable/Ownable.sol": {
            "id": 17
        },
        "current/utils/SafeMath/SafeMath.sol": {
            "id": 18
        }
    },
    "sourceCodes": {
        "current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n    LibBytes,\n    MixinAssetProxy,\n    MixinAuthorizable\n{\n\n    // Id of this proxy.\n    uint8 constant PROXY_ID = 1;\n\n    /// @dev Internal version of `transferFrom`.\n    /// @param assetData Encoded byte array.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    function transferFromInternal(\n        bytes memory assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        // Decode asset data.\n        address token = readAddress(assetData, 0);\n\n        // Transfer tokens.\n        // We do a raw call so we can check the success separate\n        // from the return data.\n        bool success = token.call(abi.encodeWithSelector(\n            IERC20Token(token).transferFrom.selector,\n            from,\n            to,\n            amount\n        ));\n        require(\n            success,\n            TRANSFER_FAILED\n        );\n        \n        // Check return data.\n        // If there is no return data, we assume the token incorrectly\n        // does not return a bool. In this case we expect it to revert\n        // on failure, which was handled above.\n        // If the token does return data, we require that it is a single\n        // value that evaluates to true.\n        assembly {\n            if returndatasize {\n                success := 0\n                if eq(returndatasize, 32) {\n                    // First 64 bytes of memory are reserved scratch space\n                    returndatacopy(0, 0, 32)\n                    success := mload(0)\n                }\n            }\n        }\n        require(\n            success,\n            TRANSFER_FAILED\n        );\n    }\n\n    /// @dev Gets the proxy id associated with the proxy address.\n    /// @return Proxy id.\n    function getProxyId()\n        external\n        view\n        returns (uint8)\n    {\n        return PROXY_ID;\n    }\n}\n",
        "current/protocol/AssetProxy/ERC721Proxy.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC721Token/ERC721Token.sol\";\n\ncontract ERC721Proxy is\n    LibBytes,\n    MixinAssetProxy,\n    MixinAuthorizable\n{\n\n    // Id of this proxy.\n    uint8 constant PROXY_ID = 2;\n\n    /// @dev Internal version of `transferFrom`.\n    /// @param assetData Encoded byte array.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    function transferFromInternal(\n        bytes memory assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        // There exists only 1 of each token.\n        require(\n            amount == 1,\n            INVALID_AMOUNT\n        );\n    \n        // Decode asset data.\n        (\n            address token,\n            uint256 tokenId,\n            bytes memory receiverData\n        ) = decodeERC721AssetData(assetData);\n\n        // Transfer token. Saves gas by calling safeTransferFrom only\n        // when there is receiverData present. Either succeeds or throws.\n        if (receiverData.length > 0) {\n            ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData);\n        } else {\n            ERC721Token(token).transferFrom(from, to, tokenId);\n        }\n    }\n\n    /// @dev Gets the proxy id associated with the proxy address.\n    /// @return Proxy id.\n    function getProxyId()\n        external\n        view\n        returns (uint8)\n    {\n        return PROXY_ID;\n    }\n\n    /// @dev Decodes ERC721 Asset data.\n    /// @param assetData Encoded byte array.\n    /// @return proxyId Intended ERC721 proxy id.\n    /// @return token ERC721 token address.\n    /// @return tokenId ERC721 token id.\n    /// @return receiverData Additional data with no specific format, which\n    ///                      is passed to the receiving contract's onERC721Received.\n    function decodeERC721AssetData(bytes memory assetData)\n        internal\n        pure\n        returns (\n            address token,\n            uint256 tokenId,\n            bytes memory receiverData\n        )\n    {\n        // Decode asset data.\n        token = readAddress(assetData, 0);\n        tokenId = readUint256(assetData, 20);\n        if (assetData.length > 52) {\n            receiverData = readBytes(assetData, 52);\n        }\n\n        return (\n            token,\n            tokenId,\n            receiverData\n        );\n    }\n}\n",
        "current/protocol/AssetProxy/MixinAssetProxy.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./mixins/MAuthorizable.sol\";\nimport \"./mixins/MAssetProxy.sol\";\n\ncontract MixinAssetProxy is\n    MAuthorizable,\n    MAssetProxy\n{\n\n    /// @dev Transfers assets. Either succeeds or throws.\n    /// @param assetData Encoded byte array.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    function transferFrom(\n        bytes assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external\n        onlyAuthorized\n    {\n        transferFromInternal(\n            assetData,\n            from,\n            to,\n            amount\n        );\n    }\n\n    /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n    /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n    /// @param from Array of addresses to transfer assets from.\n    /// @param to Array of addresses to transfer assets to.\n    /// @param amounts Array of amounts of assets to transfer.\n    function batchTransferFrom(\n        bytes[] memory assetData,\n        address[] memory from,\n        address[] memory to,\n        uint256[] memory amounts\n    )\n        public\n        onlyAuthorized\n    {\n        for (uint256 i = 0; i < assetData.length; i++) {\n            transferFromInternal(\n                assetData[i],\n                from[i],\n                to[i],\n                amounts[i]\n            );\n        }\n    }\n}\n",
        "current/protocol/AssetProxy/MixinAuthorizable.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibAssetProxyErrors.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\ncontract MixinAuthorizable is\n    LibAssetProxyErrors,\n    Ownable,\n    MAuthorizable\n{\n\n    /// @dev Only authorized addresses can invoke functions with this modifier.\n    modifier onlyAuthorized {\n        require(\n            authorized[msg.sender],\n            SENDER_NOT_AUTHORIZED\n        );\n        _;\n    }\n\n    mapping (address => bool) public authorized;\n    address[] public authorities;\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        require(\n            !authorized[target],\n            TARGET_ALREADY_AUTHORIZED\n        );\n\n        authorized[target] = true;\n        authorities.push(target);\n        emit AuthorizedAddressAdded(target, msg.sender);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external\n        onlyOwner\n    {\n        require(\n            authorized[target],\n            TARGET_NOT_AUTHORIZED\n        );\n\n        delete authorized[target];\n        for (uint i = 0; i < authorities.length; i++) {\n            if (authorities[i] == target) {\n                authorities[i] = authorities[authorities.length - 1];\n                authorities.length -= 1;\n                break;\n            }\n        }\n        emit AuthorizedAddressRemoved(target, msg.sender);\n    }\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external\n    {\n        require(\n            index < authorities.length,\n            INDEX_OUT_OF_BOUNDS\n        );\n        require(\n            authorities[index] == target,\n            AUTHORIZED_ADDRESS_MISMATCH\n        );\n\n        delete authorized[target];\n        authorities[index] = authorities[authorities.length - 1];\n        authorities.length -= 1;\n        emit AuthorizedAddressRemoved(target, msg.sender);\n    }\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[] memory)\n    {\n        return authorities;\n    }\n}\n",
        "current/protocol/AssetProxy/interfaces/IAssetProxy.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IAuthorizable.sol\";\n\ncontract IAssetProxy is\n    IAuthorizable\n{\n\n    /// @dev Transfers assets. Either succeeds or throws.\n    /// @param assetData Byte array encoded for the respective asset proxy.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    function transferFrom(\n        bytes assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        external;\n    \n    /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n    /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n    /// @param from Array of addresses to transfer assets from.\n    /// @param to Array of addresses to transfer assets to.\n    /// @param amounts Array of amounts of assets to transfer.\n    function batchTransferFrom(\n        bytes[] memory assetData,\n        address[] memory from,\n        address[] memory to,\n        uint256[] memory amounts\n    )\n        public;\n\n    /// @dev Gets the proxy id associated with the proxy address.\n    /// @return Proxy id.\n    function getProxyId()\n        external\n        view\n        returns (uint8);\n}\n\n",
        "current/protocol/AssetProxy/interfaces/IAuthorizable.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\ncontract IAuthorizable is\n    IOwnable\n{\n\n    /// @dev Gets all authorized addresses.\n    /// @return Array of authorized addresses.\n    function getAuthorizedAddresses()\n        external\n        view\n        returns (address[]);\n\n    /// @dev Authorizes an address.\n    /// @param target Address to authorize.\n    function addAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    function removeAuthorizedAddress(address target)\n        external;\n\n    /// @dev Removes authorizion of an address.\n    /// @param target Address to remove authorization from.\n    /// @param index Index of target in authorities array.\n    function removeAuthorizedAddressAtIndex(\n        address target,\n        uint256 index\n    )\n        external;\n}\n",
        "current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibAssetProxyErrors {\n    /// Authorizable errors ///\n    string constant SENDER_NOT_AUTHORIZED = \"SENDER_NOT_AUTHORIZED\";              // Sender not authorized to call this method.\n    string constant TARGET_NOT_AUTHORIZED = \"TARGET_NOT_AUTHORIZED\";              // Target address not authorized to call this method.\n    string constant TARGET_ALREADY_AUTHORIZED = \"TARGET_ALREADY_AUTHORIZED\";      // Target address must not already be authorized.\n    string constant INDEX_OUT_OF_BOUNDS = \"INDEX_OUT_OF_BOUNDS\";                  // Specified array index is out of bounds.\n    string constant AUTHORIZED_ADDRESS_MISMATCH = \"AUTHORIZED_ADDRESS_MISMATCH\";  // Address at index does not match given target address.\n\n    /// AssetProxy errors ///\n    string constant INVALID_AMOUNT = \"INVALID_AMOUNT\";                            // Transfer amount must equal 1.\n    string constant TRANSFER_FAILED = \"TRANSFER_FAILED\";                          // Transfer failed.\n}\n",
        "current/protocol/AssetProxy/mixins/MAssetProxy.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../interfaces/IAssetProxy.sol\";\n\ncontract MAssetProxy is\n    IAssetProxy\n{\n\n    /// @dev Internal version of `transferFrom`.\n    /// @param assetData Encoded byte array.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    function transferFromInternal(\n        bytes memory assetData,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal;\n}\n",
        "current/protocol/AssetProxy/mixins/MAuthorizable.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\ncontract MAuthorizable is\n    IAuthorizable\n{\n\n    // Event logged when a new address is authorized.\n    event AuthorizedAddressAdded(\n        address indexed target,\n        address indexed caller\n    );\n\n    // Event logged when a currently authorized address is unauthorized.\n    event AuthorizedAddressRemoved(\n        address indexed target,\n        address indexed caller\n    );\n\n    /// @dev Only authorized addresses can invoke functions with this modifier.\n    modifier onlyAuthorized { revert(); _; }\n}\n",
        "current/test/TestAssetDataDecoders/TestAssetDataDecoders.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/AssetProxy/ERC20Proxy.sol\";\nimport \"../../protocol/AssetProxy/ERC721Proxy.sol\";\n\ncontract TestAssetDataDecoders is\n    ERC721Proxy\n{\n    /// @dev Decodes ERC721 Asset data.\n    /// @param assetData Encoded byte array.\n    /// @return proxyId Intended ERC721 proxy id.\n    /// @return token ERC721 token address.\n    /// @return tokenId ERC721 token id.\n    /// @return receiverData Additional data with no specific format, which\n    ///                      is passed to the receiving contract's onERC721Received.\n    function publicDecodeERC721Data(bytes memory assetData)\n        public\n        pure\n        returns (\n            address token,\n            uint256 tokenId,\n            bytes memory receiverData\n        )\n    {\n        (\n            token,\n            tokenId,\n            receiverData\n        ) = decodeERC721AssetData(assetData);\n\n        return (\n            token,\n            tokenId,\n            receiverData\n        );\n    }\n}\n",
        "current/tokens/ERC20Token/IERC20Token.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract IERC20Token {\n\n    /// @notice send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return Whether the transfer was successful or not\n    function transfer(address _to, uint256 _value)\n        public\n        returns (bool);\n\n    /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return Whether the transfer was successful or not\n    function transferFrom(address _from, address _to, uint256 _value)\n        public\n        returns (bool);\n    \n    /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Whether the approval was successful or not\n    function approve(address _spender, uint256 _value)\n        public\n        returns (bool);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return The balance\n    function balanceOf(address _owner)\n        public view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        public view\n        returns (uint256);\n\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n    \n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n}\n",
        "current/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n    IERC721Token,\n    SafeMath\n{\n    // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n    // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n    // Mapping from token ID to owner\n    mapping (uint256 => address) internal tokenOwner;\n\n    // Mapping from token ID to approved address\n    mapping (uint256 => address) internal tokenApprovals;\n\n    // Mapping from owner to number of owned token\n    mapping (address => uint256) internal ownedTokensCount;\n\n    // Mapping from owner to operator approvals\n    mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n    /**\n    * @dev Guarantees msg.sender is owner of the given token\n    * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n    */\n    modifier onlyOwnerOf(uint256 _tokenId) {\n        require(ownerOf(_tokenId) == msg.sender);\n        _;\n    }\n\n    /**\n    * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n    * @param _tokenId uint256 ID of the token to validate\n    */\n    modifier canTransfer(uint256 _tokenId) {\n        require(isApprovedOrOwner(msg.sender, _tokenId));\n        _;\n    }\n\n    function ERC721Token(\n        string _name,\n        string _symbol)\n        public\n    {\n        name_ = _name;\n        symbol_ = _symbol;\n    }\n\n    /**\n    * @dev Gets the token name\n    * @return string representing the token name\n    */\n    function name()\n        public\n        view\n        returns (string)\n    {\n        return name_;\n    }\n\n    /**\n    * @dev Gets the token symbol\n    * @return string representing the token symbol\n    */\n    function symbol()\n        public\n        view\n        returns (string)\n    {\n        return symbol_;\n    }\n\n    /**\n    * @dev Gets the balance of the specified address\n    * @param _owner address to query the balance of\n    * @return uint256 representing the amount owned by the passed address\n    */\n    function balanceOf(address _owner)\n        public\n        view\n        returns (uint256)\n    {\n        require(_owner != address(0));\n        return ownedTokensCount[_owner];\n    }\n\n    /**\n    * @dev Gets the owner of the specified token ID\n    * @param _tokenId uint256 ID of the token to query the owner of\n    * @return owner address currently marked as the owner of the given token ID\n    */\n    function ownerOf(uint256 _tokenId)\n        public\n        view\n        returns (address)\n    {\n        address owner = tokenOwner[_tokenId];\n        require(owner != address(0));\n        return owner;\n    }\n\n    /**\n    * @dev Returns whether the specified token exists\n    * @param _tokenId uint256 ID of the token to query the existance of\n    * @return whether the token exists\n    */\n    function exists(uint256 _tokenId)\n        public\n        view\n        returns (bool)\n    {\n        address owner = tokenOwner[_tokenId];\n        return owner != address(0);\n    }\n\n    /**\n    * @dev Approves another address to transfer the given token ID\n    * @dev The zero address indicates there is no approved address.\n    * @dev There can only be one approved address per token at a given time.\n    * @dev Can only be called by the token owner or an approved operator.\n    * @param _to address to be approved for the given token ID\n    * @param _tokenId uint256 ID of the token to be approved\n    */\n    function approve(address _to, uint256 _tokenId)\n        public\n    {\n        address owner = ownerOf(_tokenId);\n        require(_to != owner);\n        require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n        if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n            tokenApprovals[_tokenId] = _to;\n            emit Approval(owner, _to, _tokenId);\n        }\n    }\n\n    /**\n    * @dev Gets the approved address for a token ID, or zero if no address set\n    * @param _tokenId uint256 ID of the token to query the approval of\n    * @return address currently approved for a the given token ID\n    */\n    function getApproved(uint256 _tokenId)\n        public\n        view\n        returns (address)\n    {\n        return tokenApprovals[_tokenId];\n    }\n\n    /**\n    * @dev Sets or unsets the approval of a given operator\n    * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n    * @param _to operator address to set the approval\n    * @param _approved representing the status of the approval to be set\n    */\n    function setApprovalForAll(address _to, bool _approved)\n        public\n    {\n        require(_to != msg.sender);\n        operatorApprovals[msg.sender][_to] = _approved;\n        emit ApprovalForAll(msg.sender, _to, _approved);\n    }\n\n    /**\n    * @dev Tells whether an operator is approved by a given owner\n    * @param _owner owner address which you want to query the approval of\n    * @param _operator operator address which you want to query the approval of\n    * @return bool whether the given operator is approved by the given owner\n    */\n    function isApprovedForAll(address _owner, address _operator)\n        public\n        view\n        returns (bool)\n    {\n        return operatorApprovals[_owner][_operator];\n    }\n\n    /**\n    * @dev Transfers the ownership of a given token ID to another address\n    * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n    * @dev Requires the msg sender to be the owner, approved, or operator\n    * @param _from current owner of the token\n    * @param _to address to receive the ownership of the given token ID\n    * @param _tokenId uint256 ID of the token to be transferred\n    */\n    function transferFrom(address _from, address _to, uint256 _tokenId)\n        public\n        canTransfer(_tokenId)\n    {\n        require(_from != address(0));\n        require(_to != address(0));\n\n        clearApproval(_from, _tokenId);\n        removeTokenFrom(_from, _tokenId);\n        addTokenTo(_to, _tokenId);\n\n        emit Transfer(_from, _to, _tokenId);\n    }\n\n    /**\n    * @dev Safely transfers the ownership of a given token ID to another address\n    * @dev If the target address is a contract, it must implement `onERC721Received`,\n    *  which is called upon a safe transfer, and return the magic value\n    *  `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n    *  the transfer is reverted.\n    * @dev Requires the msg sender to be the owner, approved, or operator\n    * @param _from current owner of the token\n    * @param _to address to receive the ownership of the given token ID\n    * @param _tokenId uint256 ID of the token to be transferred\n    */\n    function safeTransferFrom(\n        address _from,\n        address _to,\n        uint256 _tokenId)\n        public\n        canTransfer(_tokenId)\n    {\n        // solium-disable-next-line arg-overflow\n        safeTransferFrom(_from, _to, _tokenId, \"\");\n    }\n\n    /**\n    * @dev Safely transfers the ownership of a given token ID to another address\n    * @dev If the target address is a contract, it must implement `onERC721Received`,\n    *  which is called upon a safe transfer, and return the magic value\n    *  `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n    *  the transfer is reverted.\n    * @dev Requires the msg sender to be the owner, approved, or operator\n    * @param _from current owner of the token\n    * @param _to address to receive the ownership of the given token ID\n    * @param _tokenId uint256 ID of the token to be transferred\n    * @param _data bytes data to send along with a safe transfer check\n    */\n    function safeTransferFrom(\n        address _from,\n        address _to,\n        uint256 _tokenId,\n        bytes _data)\n        public\n        canTransfer(_tokenId)\n    {\n        transferFrom(_from, _to, _tokenId);\n        // solium-disable-next-line arg-overflow\n        require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n    }\n\n    /**\n    * @dev Returns whether the given spender can transfer a given token ID\n    * @param _spender address of the spender to query\n    * @param _tokenId uint256 ID of the token to be transferred\n    * @return bool whether the msg.sender is approved for the given token ID,\n    *  is an operator of the owner, or is the owner of the token\n    */\n    function isApprovedOrOwner(address _spender, uint256 _tokenId)\n        internal\n        view\n        returns (bool)\n    {\n        address owner = ownerOf(_tokenId);\n        return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n    }\n\n    /**\n    * @dev Internal function to mint a new token\n    * @dev Reverts if the given token ID already exists\n    * @param _to The address that will own the minted token\n    * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n    */\n    function _mint(address _to, uint256 _tokenId)\n        internal\n    {\n        require(_to != address(0));\n        addTokenTo(_to, _tokenId);\n        emit Transfer(address(0), _to, _tokenId);\n    }\n\n    /**\n    * @dev Internal function to burn a specific token\n    * @dev Reverts if the token does not exist\n    * @param _tokenId uint256 ID of the token being burned by the msg.sender\n    */\n    function _burn(address _owner, uint256 _tokenId)\n        internal\n    {\n        clearApproval(_owner, _tokenId);\n        removeTokenFrom(_owner, _tokenId);\n        emit Transfer(_owner, address(0), _tokenId);\n    }\n\n    /**\n    * @dev Internal function to clear current approval of a given token ID\n    * @dev Reverts if the given address is not indeed the owner of the token\n    * @param _owner owner of the token\n    * @param _tokenId uint256 ID of the token to be transferred\n    */\n    function clearApproval(address _owner, uint256 _tokenId)\n        internal\n    {\n        require(ownerOf(_tokenId) == _owner);\n        if (tokenApprovals[_tokenId] != address(0)) {\n            tokenApprovals[_tokenId] = address(0);\n            emit Approval(_owner, address(0), _tokenId);\n        }\n    }\n\n    /**\n    * @dev Internal function to add a token ID to the list of a given address\n    * @param _to address representing the new owner of the given token ID\n    * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n    */\n    function addTokenTo(address _to, uint256 _tokenId)\n        internal\n    {\n        require(tokenOwner[_tokenId] == address(0));\n        tokenOwner[_tokenId] = _to;\n        ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n    }\n\n    /**\n    * @dev Internal function to remove a token ID from the list of a given address\n    * @param _from address representing the previous owner of the given token ID\n    * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n    */\n    function removeTokenFrom(address _from, uint256 _tokenId)\n        internal\n    {\n        require(ownerOf(_tokenId) == _from);\n        ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n        tokenOwner[_tokenId] = address(0);\n    }\n\n    /**\n    * @dev Internal function to invoke `onERC721Received` on a target address\n    * @dev The call is not executed if the target address is not a contract\n    * @param _from address representing the previous owner of the given token ID\n    * @param _to target address that will receive the tokens\n    * @param _tokenId uint256 ID of the token to be transferred\n    * @param _data bytes optional data to send along with the call\n    * @return whether the call correctly returned the expected magic value\n    */\n    function checkAndCallSafeTransfer(\n        address _from,\n        address _to,\n        uint256 _tokenId,\n        bytes _data)\n        internal\n        returns (bool)\n    {\n        if (!isContract(_to)) {\n            return true;\n        }\n        bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n        return (retval == ERC721_RECEIVED);\n    }\n\n    function isContract(address addr)\n        internal\n        view\n        returns (bool)\n    {\n        uint256 size;\n        // XXX Currently there is no better way to check if there is a contract in an address\n        // than to check the size of the code at that address.\n        // See https://ethereum.stackexchange.com/a/14016/36603\n        // for more details about how this works.\n        // TODO Check this again before the Serenity release, because all addresses will be\n        // contracts then.\n        assembly { size := extcodesize(addr) }  // solium-disable-line security/no-inline-assembly\n        return size > 0;\n    }\n}\n",
        "current/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n *      rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n    /**\n    * @dev Magic value to be returned upon successful reception of an NFT\n    *  Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n    *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n    */\n    bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n    /**\n    * @notice Handle the receipt of an NFT\n    * @dev The ERC721 smart contract calls this function on the recipient\n    *  after a `safetransfer`. This function MAY throw to revert and reject the\n    *  transfer. This function MUST use 50,000 gas or less. Return of other\n    *  than the magic value MUST result in the transaction being reverted.\n    *  Note: the contract address is always the message sender.\n    * @param _from The sending address\n    * @param _tokenId The NFT identifier which is being transfered\n    * @param _data Additional data with no specified format\n    * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n    */\n    function onERC721Received(\n        address _from,\n        uint256 _tokenId,\n        bytes _data)\n        public\n        returns (bytes4);\n}\n",
        "current/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n    string internal name_;\n    string internal symbol_;\n\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _tokenId\n    );\n    event Approval(\n        address indexed _owner,\n        address indexed _approved,\n        uint256 _tokenId\n    );\n    event ApprovalForAll(\n        address indexed _owner,\n        address indexed _operator,\n        bool _approved\n    );\n\n    function name()\n        public\n        view\n        returns (string);\n    function symbol()\n        public\n        view\n        returns (string);\n\n    function balanceOf(address _owner)\n        public\n        view\n        returns (uint256 _balance);\n    function ownerOf(uint256 _tokenId)\n        public\n        view\n        returns (address _owner);\n    function exists(uint256 _tokenId)\n        public\n        view\n        returns (bool _exists);\n\n    function approve(address _to, uint256 _tokenId)\n        public;\n    function getApproved(uint256 _tokenId)\n        public\n        view\n        returns (address _operator);\n\n    function setApprovalForAll(address _operator, bool _approved)\n        public;\n    function isApprovedForAll(address _owner, address _operator)\n        public\n        view\n        returns (bool);\n\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _tokenId)\n        public;\n    function safeTransferFrom(\n        address _from,\n        address _to,\n        uint256 _tokenId)\n        public;\n    function safeTransferFrom(\n        address _from,\n        address _to,\n        uint256 _tokenId,\n        bytes _data)\n        public;\n}\n",
        "current/utils/LibBytes/LibBytes.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n    LibMem\n{\n\n    // Revert reasons\n    string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n    string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n    string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n    string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n    string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n    string constant GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\";\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        require(\n            b.length > 0,\n            GREATER_THAN_ZERO_LENGTH_REQUIRED\n        );\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The 20 byte address that was popped off.\n    function popLast20Bytes(bytes memory b)\n        internal\n        pure\n        returns (address result)\n    {\n        require(\n            b.length >= 20,\n            GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n        );\n\n        // Store last 20 bytes.\n        result = readAddress(b, b.length - 20);\n\n        assembly {\n            // Subtract 20 from byte array length.\n            let newLen := sub(mload(b), 20)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n        );\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        require(\n            b.length >= index + 20,  // 20 is length of address\n            GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n        );\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        require(\n            b.length >= index + 32,\n            GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n        );\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        require(\n            b.length >= index + 32,\n            GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n        );\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        return uint256(readBytes32(b, index));\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n    /// @param b Byte array to read first 4 bytes from.\n    /// @return First 4 bytes of data.\n    function readFirst4(bytes memory b)\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        require(\n            b.length >= 4,\n            GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n        );\n        assembly {\n            result := mload(add(b, 32))\n        }\n        return result;\n    }\n\n    /// @dev Reads nested bytes from a specific position.\n    /// @param b Byte array containing nested bytes.\n    /// @param index Index of nested bytes.\n    /// @return result Nested bytes.\n    function readBytes(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Read length of nested bytes\n        uint256 nestedBytesLength = readUint256(b, index);\n        index += 32;\n\n        // Assert length of <b> is valid, given\n        // length of nested bytes\n        require(\n            b.length >= index + nestedBytesLength,\n            GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n        );\n\n        // Allocate memory and copy value to result\n        result = new bytes(nestedBytesLength);\n        memCopy(\n            getMemAddress(result) + 32, // +32 skips array length\n            getMemAddress(b) + index + 32,\n            nestedBytesLength\n        );\n\n        return result;\n    }\n\n    /// @dev Inserts bytes at a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes to insert.\n    function writeBytes(\n        bytes memory b,\n        uint256 index,\n        bytes memory input\n    )\n        internal\n        pure\n    {\n        // Assert length of <b> is valid, given\n        // length of input\n        require(\n            b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n            GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n        );\n\n        // Copy <input> into <b>\n        memCopy(\n            getMemAddress(b) + 32 + index,  // +32 to skip length of <b>\n            getMemAddress(input),           // includes length of <input>\n            input.length + 32               // +32 bytes to store <input> length\n        );\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function areBytesEqual(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        assembly {\n            // Get the number of words occupied by <lhs>\n            let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n            // Add 1 to the number of words, to account for the length field\n            lenFullWords := add(lenFullWords, 0x1)\n\n            // Test equality word-by-word.\n            // Terminates early if there is a mismatch.\n            for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n                let lhsWord := mload(add(lhs, mul(i, 0x20)))\n                let rhsWord := mload(add(rhs, mul(i, 0x20)))\n                equal := eq(lhsWord, rhsWord)\n                if eq(equal, 0) {\n                    // Break\n                    i := lenFullWords\n                }\n            }\n       }\n\n       return equal;\n    }\n\n    /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n    /// @param dest Byte array that will be overwritten with source bytes.\n    /// @param source Byte array to copy onto dest bytes.\n    function deepCopyBytes(\n        bytes memory dest,\n        bytes memory source\n    )\n        internal\n        pure\n    {\n        uint256 sourceLen = source.length;\n        // Dest length must be >= source length, or some bytes would not be copied.\n        require(\n            dest.length >= sourceLen,\n            GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\n        );\n        memCopy(\n            getMemAddress(dest) + 32,    // +32 to skip length of <dest>\n            getMemAddress(source) + 32,  // +32 to skip length of <source>\n            sourceLen\n        );\n    }\n}\n",
        "current/utils/LibMem/LibMem.sol": "/*\n\n  Copyright 2018 ZeroEx Intl.\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array.\n    function getMemAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // Record the total number of full words to copy\n                    let nWords := div(length, 32)\n\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // Record the total number of full words to copy\n                    let nWords := div(length, 32)\n\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n}\n",
        "current/utils/Ownable/IOwnable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n    function transferOwnership(address newOwner)\n        public;\n}\n",
        "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n    address public owner;\n\n    constructor ()\n        public\n    {\n        owner = msg.sender;\n    }\n\n    modifier onlyOwner() {\n        require(\n            msg.sender == owner,\n            \"Only contract owner is allowed to call this method.\"\n        );\n        _;\n    }\n\n    function transferOwnership(address newOwner)\n        public\n        onlyOwner\n    {\n        if (newOwner != address(0)) {\n            owner = newOwner;\n        }\n    }\n}\n",
        "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n    function safeMul(uint a, uint b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint c = a * b;\n        assert(a == 0 || c / a == b);\n        return c;\n    }\n\n    function safeDiv(uint a, uint b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint c = a / b;\n        return c;\n    }\n\n    function safeSub(uint a, uint b)\n        internal\n        pure\n        returns (uint256)\n    {\n        assert(b <= a);\n        return a - b;\n    }\n\n    function safeAdd(uint a, uint b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint c = a + b;\n        assert(c >= a);\n        return c;\n    }\n\n    function max64(uint64 a, uint64 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min64(uint64 a, uint64 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n\n    function max256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a >= b ? a : b;\n    }\n\n    function min256(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        return a < b ? a : b;\n    }\n}\n"
    },
    "sourceTreeHashHex": "0xd0be67a7643194e2fea3aaa4e9a3d50f944884d90bf6a4517138786ef0e4d9c8",
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.4.24+commit.e67f0147.js",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 200
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            }
        }
    },
    "networks": {}
}