diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6f14377..164f4b3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -5,7 +5,3 @@ - [ ] I have performed a self-review of my code - [ ] This pull request is as small as possible and only tackles one problem - [ ] I have added tests that cover the functionality / test the bug - -# GitHub Copilot - -copilot:all diff --git a/package.json b/package.json index 1100e5d..5842d1e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "parse-call-data": "ts-node --transpile-only src/cli.ts", "lint": "eslint .", "lint:fix": "eslint --fix .", - "test": "jest" + "test": "jest", + "pre-commit": "pnpm lint:fix && pnpm build && pnpm test" }, "files": [ "dist", diff --git a/src/cli.ts b/src/cli.ts index 5ef20a6..819bb19 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -8,7 +8,6 @@ import { stringify } from './lib/stringify' import { parseCallDataString } from './parse-call-data-string' import { bridge, - bridgeSwap, feeBridge, stargateSwap, swap, @@ -22,7 +21,7 @@ const run = async () => { const callDataStrings = process.argv.length === 2 - ? [swap, bridge, stargateSwap, bridgeSwap, swapBridge, feeBridge] + ? [swap, bridge, stargateSwap, swapBridge, feeBridge] : process.argv.slice(2) const parsed = await Promise.all( diff --git a/src/parser/parser.acceptance.test.ts b/src/parser/parser.acceptance.test.ts index 0f86dc8..698b589 100644 --- a/src/parser/parser.acceptance.test.ts +++ b/src/parser/parser.acceptance.test.ts @@ -4,7 +4,6 @@ import { isStringObject } from 'util/types' import { AbiCache, CacheType, initCache } from '../abi-cache' import { bridge, - bridgeSwap, collectTokenInsuranceFees, feeBridge, optimizedSwap, @@ -17,12 +16,7 @@ import { import { AMAROK_PAYLOAD_ABI } from './calldata-parsers/abis/amarok' import { STARGATE_PAYLOAD_ABI } from './calldata-parsers/abis/stargate' import { parseCallData } from './calldata-parsers/parse-call-data' -import { - AmarokDataStruct, - CallDataInformation, - StargateDataStruct, - SwapDataStruct, -} from './parameter-map' +import { CallDataInformation, SwapDataStruct } from './parameter-map' import { listToSwapData } from './build-parameter-map' const validateAndExtract = ( @@ -90,8 +84,7 @@ describe('Acceptance tests', () => { expect(swapDataCalls.every(isCalldataInformation)).toBe(true) }) - // eslint-disable-next-line jest/no-disabled-tests - it.skip('should parse a swap(fee-collection) + bridge transfer', () => { + it('should parse a swap(fee-collection) + bridge transfer', () => { const results = parseCallData(feeBridge, cache) const result = validateAndExtract(results) const swapData = validateAndExtractSwapData(result) @@ -101,41 +94,21 @@ describe('Acceptance tests', () => { expect(swapDataCalls.every(isCalldataInformation)).toBe(true) }) - // eslint-disable-next-line jest/no-disabled-tests - it.skip('bridge + swap transfer', () => { - const results = parseCallData(bridgeSwap, cache) - const result = validateAndExtract(results) - - const amarokData = result.functionParameters._amarokData as AmarokDataStruct - - expect(amarokData).toBeDefined() - - const [toolCallData] = amarokData.callData as CallDataInformation[] - - expect(toolCallData).toBeDefined() - - const rawCallData = - '0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a00000000000000000000000000000000000000000000000000000000000ec8b500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010438ed173900000000000000000000000000000000000000000000000000000000000ec8b50000000000000000000000000000000000000000000000000ab39f39a4a41bd800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000dd1305150d27aecc60c066630105db419977e367000000000000000000000000000000000000000000000000000000006411c21700000000000000000000000000000000000000000000000000000000000000020000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a00000000000000000000000000000000000000000000000000000000' - const parsed = AbiCoder.defaultAbiCoder().decode( - AMAROK_PAYLOAD_ABI, - rawCallData - ) - - expect(toolCallData.functionParameters).toStrictEqual(parsed) - }) - it('swap + stargate + swap transfer', () => { const results = parseCallData(stargateSwap, cache) const result = validateAndExtract(results) - const stargateData = result.functionParameters - ._stargateData as StargateDataStruct + const stargateData = result.functionParameters._stargateData expect(stargateData).toBeDefined() + if (!stargateData) return + const toolCallData = stargateData.callData expect(toolCallData).toBeDefined() + if (typeof toolCallData === 'string') return + const rawCallData = '0xe4062395cfea8e25cd957ffcec1fcad26d4007a21a7eedef7631ff6940ef48bf000000000000000000000000000000000000000000000000000000000000008000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000d01319f4b65b79124549de409d36f25e04b3e551000000000000000000000000d01319f4b65b79124549de409d36f25e04b3e551000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000001cf96c00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010438ed173900000000000000000000000000000000000000000000000000000000001cf96c0000000000000000000000000000000000000000000000000003725db9f3984c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000be27f03c8e6a61e2a4b1ee7940dbcb9204744d1c0000000000000000000000000000000000000000000000000000000064ca49e20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000' const parsed = AbiCoder.defaultAbiCoder().decode( @@ -154,14 +127,18 @@ describe('Acceptance tests', () => { it('swap + amarok + swap transfer', () => { const results = parseCallData(swapAmarokSwap, cache) const result = validateAndExtract(results) - const amarokData = result.functionParameters._amarokData as AmarokDataStruct + const amarokData = result.functionParameters._amarokData expect(amarokData).toBeDefined() + if (!amarokData) return + const toolCallData = amarokData.callData expect(toolCallData).toBeDefined() + if (typeof toolCallData === 'string') return + const rawCallData = '0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000044d51423298160e91492da091acd9acd6697bab0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f176bfca6293ced00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010418cbafe50000000000000000000000000000000000000000000000000f176bfca6293ced000000000000000000000000000000000000000000000000000fb29df7ac71a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000be27f03c8e6a61e2a4b1ee7940dbcb9204744d1c0000000000000000000000000000000000000000000000000000000064c92b7700000000000000000000000000000000000000000000000000000000000000020000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c00000000000000000000000000000000000000000000000000000000' const parsed = AbiCoder.defaultAbiCoder().decode( diff --git a/src/testdata/encoded.ts b/src/testdata/encoded.ts index e71ff30..1808498 100644 --- a/src/testdata/encoded.ts +++ b/src/testdata/encoded.ts @@ -8,12 +8,12 @@ export const bridge = // https://polygonscan.com/tx/0x3380fb0fea5c11d76add2921f253e24585810a18270e51aac78e30e464dff5da export const stargateSwap = '0xbe1eace700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200e4062395cfea8e25cd957ffcec1fcad26d4007a21a7eedef7631ff6940ef48bf0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea000000000000000000000000000000000000000000000000000000000001e8480000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000087374617267617465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6a756d7065722e65786368616e676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000001cf96c000000000000000000000000000000000000000000000000000000000032bc480000000000000000000000000000000000000000000000001def701b808159d1000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000014c850013fc01a264018d58d112000e32835d15fbc00000000000000000000000000000000000000000000000000000000000000000000000000000000000002e0e4062395cfea8e25cd957ffcec1fcad26d4007a21a7eedef7631ff6940ef48bf000000000000000000000000000000000000000000000000000000000000008000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000d01319f4b65b79124549de409d36f25e04b3e551000000000000000000000000d01319f4b65b79124549de409d36f25e04b3e551000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000001cf96c00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010438ed173900000000000000000000000000000000000000000000000000000000001cf96c0000000000000000000000000000000000000000000000000003725db9f3984c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000be27f03c8e6a61e2a4b1ee7940dbcb9204744d1c0000000000000000000000000000000000000000000000000000000064ca49e20000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000' -export const bridgeSwap = '' // Swap + Stargate bridge // https://polygonscan.com/tx/0xbca872cfe9972a69c7d9ca2e421edc952bb205d6826f07c8b927bfbe528d5e41 export const swapBridge = '0x83f319170000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000008009cda19eba7fdfa5a2c7ac21528573ec4aa6df59a85d87881424941f980fe6c370000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea000000000000000000000000000000000000000000000000000000000000a7142000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006616d61726f6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6a756d7065722e65786368616e676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000039e3e49c99834c9573c9fc7ff5a4b226cd7b0e630000000000000000000000006d310348d5c12009854dfcf72e0df9027e8cb4f40000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000484301a37200000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa841740000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000a7141000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000064ca4af100000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e7c5a418dd1395068e539514b8c4dc398a12e9e0000000000000000000000006c30be15d88462b788dea7c6a860a2ccaf7b2670000000000000000000000000000000000000000000000000000000000000000200000000000000000000000007a0e5cc33f3f28cf655d7a76334d0b1bab5b7040000000000000000000000001093ced81987bf532c2b7907b2a8525cd0c1729500000000000000000000000000000000000000000000000000000000000000030000000000000000000000006e7c5a418dd1395068e539514b8c4dc398a12e9e0000000000000000000000001093ced81987bf532c2b7907b2a8525cd0c1729500000000000000000000000039e3e49c99834c9573c9fc7ff5a4b226cd7b0e6300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea0000000000000000000000000000000000000000000000000078de284daf43abe00000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000552008c0f6870c2f77e5cc1d2eb9bdff03e30ea0000000000000000000000000000000000000000000000000000000006172626f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' -export const feeBridge = '' +export const feeBridge = + '0xa74ccb35000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000005eb2000000000000000000000000d270e80338187197b5d1050fda674d23e7b6923800000000000000000000000000000000000000000000000000000000000000050000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174f381f0b902bbea31daf86df1c4b6cefeca2e2da4abbda8858027b9300d2a14f2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000011fde4f9bab1cd8339029e5f0e16d7405f4b06605230743dbc50940587fa38cd1000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000d270e80338187197b5d1050fda674d23e7b69238000000000000000000000000000000000000000000000000000000004761ed000000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009616c6c6272696467650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6a756d7065722e65786368616e6765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000894b3e1e30be0727eb138d2cceb0a99d2fc4c55d000000000000000000000000894b3e1e30be0727eb138d2cceb0a99d2fc4c55d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000047868c0000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064c6aabf84000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000249f000000000000000000000000001231deb6f5749ef6ce6943a275a1d3e7486f4eae00000000000000000000000000000000000000000000000000000000' // Swap + bridge with amarok + swap export const swapAmarokSwap = '0x83f319170000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000009807377db70374f6fe6446262e56b0afe3f1ac1b332d7fc5e3890f94fa9eb6cff65000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000044d51423298160e91492da091acd9acd6697bab0000000000000000000000000000000000000000000000000f2f1f86a4f322560000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006616d61726f6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6a756d7065722e65786368616e6765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000e05dd51e4eb5636f4f0e8e7fbe82ea31a2ecef16000000000000000000000000a867241cdc8d3b0c07c85cc06f25a0cd3b5474d8000000000000000000000000fa5ed56a203466cbbc2430a43c66b9d8723528e7000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000604301a3720000000000000000000000000fa5ed56a203466cbbc2430a43c66b9d8723528e7000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000f2f1f86a4f32222000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000064c92b770000000000000000000000000000000000000000000000000000000000000003000000000000000000000000bce44767af0a53a108b3b7ba4f740e03d228ec0a000000000000000000000000bce44767af0a53a108b3b7ba4f740e03d228ec0a00000000000000000000000017ebc315760bb47384224a5f3bf829222fbd3aa70000000000000000000000000000000000000000000000000000000000000003000000000000000000000000e4d9faddd9bca5d8393bee915dc56e916ab94d27000000000000000000000000e754841b77c874135caca3386676e886459c2d61000000000000000000000000692a0b300366d1042679397e40f3d2cb4b8f7d300000000000000000000000000000000000000000000000000000000000000004000000000000000000000000bce44767af0a53a108b3b7ba4f740e03d228ec0a000000000000000000000000bce44767af0a53a108b3b7ba4f740e03d228ec0a000000000000000000000000692a0b300366d1042679397e40f3d2cb4b8f7d30000000000000000000000000e05dd51e4eb5636f4f0e8e7fbe82ea31a2ecef16000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fa5ed56a203466cbbc2430a43c66b9d8723528e7000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc800000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000c850013fc01a264018d58d112000e32835d15fbc0000000000000000000000000000000000000000000000000003b6b9565b28fe0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000044d51423298160e91492da091acd9acd6697bab0000000000000000000000000000000000000000000000000000000000626e62000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000044d51423298160e91492da091acd9acd6697bab0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f176bfca6293ced00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010418cbafe50000000000000000000000000000000000000000000000000f176bfca6293ced000000000000000000000000000000000000000000000000000fb29df7ac71a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000be27f03c8e6a61e2a4b1ee7940dbcb9204744d1c0000000000000000000000000000000000000000000000000000000064c92b7700000000000000000000000000000000000000000000000000000000000000020000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c00000000000000000000000000000000000000000000000000000000'