{
  "contractName": "Strings",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/ilanolkies/code/rnsdomains/rns-artifacts/contracts/util/Strings.sol\":\"Strings\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/ilanolkies/code/rnsdomains/rns-artifacts/contracts/util/Strings.sol\":{\"keccak256\":\"0x0255758892f2cf826323bef967278cd1c46decbb5e379031e1e0276e09003c1c\",\"urls\":[\"bzzr://fee54bc7e4f7aca3d4e7722d0b4d668869e7d340f889da3926f0e7079f6858cf\",\"dweb:/ipfs/QmQ6HDe8wBFoFs4WmKmWg63MMTpa8BKRh5fLWr7qNKrwd1\"]}},\"version\":1}",
  "bytecode": "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723058201976d0fcbeb6178877976a4aee2f2ffaec0f9fb48a11e131fb6231b42bfc706964736f6c634300050a0032",
  "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a723058201976d0fcbeb6178877976a4aee2f2ffaec0f9fb48a11e131fb6231b42bfc706964736f6c634300050a0032",
  "sourceMap": "208:5267:16:-;;132:2:-1;166:7;155:9;146:7;137:37;255:7;249:14;246:1;241:23;235:4;232:33;222:2;;269:9;222:2;293:9;290:1;283:20;323:4;314:7;306:22;347:7;338;331:24",
  "deployedSourceMap": "208:5267:16:-;;;;;;;;",
  "source": "/*\n * @title String & slice utility library for Solidity contracts.\n * @author Nick Johnson <arachnid@notdot.net>\n *\n * Source: https://github.com/Arachnid/solidity-stringutils/\n */\n\npragma solidity ^0.5.2;\n\nlibrary Strings {\n    struct slice {\n        uint _len;\n        uint _ptr;\n    }\n\n    function memcpy(uint dest, uint src, uint len) private pure {\n        // Copy word-length chunks while possible\n        for(; len >= 32; len -= 32) {\n            assembly {\n                mstore(dest, mload(src))\n            }\n            dest += 32;\n            src += 32;\n        }\n\n        // Copy remaining bytes\n        uint mask = 256 ** (32 - len) - 1;\n        assembly {\n            let srcpart := and(mload(src), not(mask))\n            let destpart := and(mload(dest), mask)\n            mstore(dest, or(destpart, srcpart))\n        }\n    }\n\n    /*\n     * @dev Returns a slice containing the entire string.\n     * @param self The string to make a slice from.\n     * @return A newly allocated slice containing the entire string.\n     */\n    function toSlice(string memory self) internal pure returns (slice memory) {\n        uint ptr;\n        assembly {\n            ptr := add(self, 0x20)\n        }\n        return slice(bytes(self).length, ptr);\n    }\n\n    /*\n     * @dev Copies a slice to a new string.\n     * @param self The slice to copy.\n     * @return A newly allocated string containing the slice's text.\n     */\n    function toString(slice memory self) internal pure returns (string memory) {\n        string memory ret = new string(self._len);\n        uint retptr;\n        assembly { retptr := add(ret, 32) }\n\n        memcpy(retptr, self._ptr, self._len);\n        return ret;\n    }\n\n    // Returns the memory address of the first byte of the first occurrence of\n    // `needle` in `self`, or the first byte after `self` if not found.\n    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) {\n        uint ptr = selfptr;\n        uint idx;\n\n        if (needlelen <= selflen) {\n            if (needlelen <= 32) {\n                bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1));\n\n                bytes32 needledata;\n                assembly { needledata := and(mload(needleptr), mask) }\n\n                uint end = selfptr + selflen - needlelen;\n                bytes32 ptrdata;\n                assembly { ptrdata := and(mload(ptr), mask) }\n\n                while (ptrdata != needledata) {\n                    if (ptr >= end)\n                        return selfptr + selflen;\n                    ptr++;\n                    assembly { ptrdata := and(mload(ptr), mask) }\n                }\n                return ptr;\n            } else {\n                // For long needles, use hashing\n                bytes32 hash;\n                assembly { hash := keccak256(needleptr, needlelen) }\n\n                for (idx = 0; idx <= selflen - needlelen; idx++) {\n                    bytes32 testHash;\n                    assembly { testHash := keccak256(ptr, needlelen) }\n                    if (hash == testHash)\n                        return ptr;\n                    ptr += 1;\n                }\n            }\n        }\n        return selfptr + selflen;\n    }\n\n    /*\n     * @dev Splits the slice, setting `self` to everything after the first\n     *      occurrence of `needle`, and `token` to everything before it. If\n     *      `needle` does not occur in `self`, `self` is set to the empty slice,\n     *      and `token` is set to the entirety of `self`.\n     * @param self The slice to split.\n     * @param needle The text to search for in `self`.\n     * @param token An output parameter to which the first token is written.\n     * @return `token`.\n     */\n    function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) {\n        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);\n        token._ptr = self._ptr;\n        token._len = ptr - self._ptr;\n        if (ptr == self._ptr + self._len) {\n            // Not found\n            self._len = 0;\n        } else {\n            self._len -= token._len + needle._len;\n            self._ptr = ptr + needle._len;\n        }\n        return token;\n    }\n\n    /*\n     * @dev Splits the slice, setting `self` to everything after the first\n     *      occurrence of `needle`, and returning everything before it. If\n     *      `needle` does not occur in `self`, `self` is set to the empty slice,\n     *      and the entirety of `self` is returned.\n     * @param self The slice to split.\n     * @param needle The text to search for in `self`.\n     * @return The part of `self` up to the first occurrence of `delim`.\n     */\n    function split(slice memory self, slice memory needle) internal pure returns (slice memory token) {\n        split(self, needle, token);\n    }\n\n    /*\n     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.\n     * @param self The slice to search.\n     * @param needle The text to search for in `self`.\n     * @return The number of occurrences of `needle` found in `self`.\n     */\n    function count(slice memory self, slice memory needle) internal pure returns (uint cnt) {\n        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;\n        while (ptr <= self._ptr + self._len) {\n            cnt++;\n            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;\n        }\n    }\n}\n",
  "sourcePath": "/Users/ilanolkies/code/rnsdomains/rns-artifacts/contracts/util/Strings.sol",
  "ast": {
    "absolutePath": "/Users/ilanolkies/code/rnsdomains/rns-artifacts/contracts/util/Strings.sol",
    "exportedSymbols": {
      "Strings": [
        2358
      ]
    },
    "id": 2359,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1988,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "183:23:16"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2358,
        "linearizedBaseContracts": [
          2358
        ],
        "name": "Strings",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "Strings.slice",
            "id": 1993,
            "members": [
              {
                "constant": false,
                "id": 1990,
                "name": "_len",
                "nodeType": "VariableDeclaration",
                "scope": 1993,
                "src": "253:9:16",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1989,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "253:4:16",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1992,
                "name": "_ptr",
                "nodeType": "VariableDeclaration",
                "scope": 1993,
                "src": "272:9:16",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1991,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "272:4:16",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "slice",
            "nodeType": "StructDefinition",
            "scope": 2358,
            "src": "230:58:16",
            "visibility": "public"
          },
          {
            "body": {
              "id": 2032,
              "nodeType": "Block",
              "src": "354:488:16",
              "statements": [
                {
                  "body": {
                    "id": 2018,
                    "nodeType": "Block",
                    "src": "442:136:16",
                    "statements": [
                      {
                        "externalReferences": [
                          {
                            "src": {
                              "declaration": 1997,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "502:3:16",
                              "valueSize": 1
                            }
                          },
                          {
                            "dest": {
                              "declaration": 1995,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "490:4:16",
                              "valueSize": 1
                            }
                          }
                        ],
                        "id": 2009,
                        "nodeType": "InlineAssembly",
                        "operations": "{ mstore(dest, mload(src)) }",
                        "src": "456:65:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2012,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2010,
                            "name": "dest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1995,
                            "src": "534:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2011,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "542:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "534:10:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2013,
                        "nodeType": "ExpressionStatement",
                        "src": "534:10:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2014,
                            "name": "src",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1997,
                            "src": "558:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2015,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "565:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "558:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2017,
                        "nodeType": "ExpressionStatement",
                        "src": "558:9:16"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2004,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2002,
                      "name": "len",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1999,
                      "src": "420:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "3332",
                      "id": 2003,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "427:2:16",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_32_by_1",
                        "typeString": "int_const 32"
                      },
                      "value": "32"
                    },
                    "src": "420:9:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2019,
                  "initializationExpression": null,
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 2007,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftHandSide": {
                        "argumentTypes": null,
                        "id": 2005,
                        "name": "len",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "431:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "Assignment",
                      "operator": "-=",
                      "rightHandSide": {
                        "argumentTypes": null,
                        "hexValue": "3332",
                        "id": 2006,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "438:2:16",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_32_by_1",
                          "typeString": "int_const 32"
                        },
                        "value": "32"
                      },
                      "src": "431:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 2008,
                    "nodeType": "ExpressionStatement",
                    "src": "431:9:16"
                  },
                  "nodeType": "ForStatement",
                  "src": "414:164:16"
                },
                {
                  "assignments": [
                    2021
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2021,
                      "name": "mask",
                      "nodeType": "VariableDeclaration",
                      "scope": 2032,
                      "src": "620:9:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2020,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "620:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2030,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2029,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2027,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "hexValue": "323536",
                        "id": 2022,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "632:3:16",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_256_by_1",
                          "typeString": "int_const 256"
                        },
                        "value": "256"
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "**",
                      "rightExpression": {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2025,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "hexValue": "3332",
                              "id": 2023,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "640:2:16",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_32_by_1",
                                "typeString": "int_const 32"
                              },
                              "value": "32"
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2024,
                              "name": "len",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1999,
                              "src": "645:3:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "640:8:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 2026,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "639:10:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "632:17:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 2028,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "652:1:16",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "632:21:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "620:33:16"
                },
                {
                  "externalReferences": [
                    {
                      "src": {
                        "declaration": 1997,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "711:3:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "mask": {
                        "declaration": 2021,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "721:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "dest": {
                        "declaration": 1995,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "766:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "mask": {
                        "declaration": 2021,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "773:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "dest": {
                        "declaration": 1995,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "798:4:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2031,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let srcpart := and(mload(src), not(mask))\n    let destpart := and(mload(dest), mask)\n    mstore(dest, or(destpart, srcpart))\n}",
                  "src": "663:173:16"
                }
              ]
            },
            "documentation": null,
            "id": 2033,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "memcpy",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2000,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1995,
                  "name": "dest",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "310:9:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1994,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "310:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1997,
                  "name": "src",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "321:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1996,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "321:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1999,
                  "name": "len",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "331:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1998,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "331:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "309:31:16"
            },
            "returnParameters": {
              "id": 2001,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "354:0:16"
            },
            "scope": 2358,
            "src": "294:548:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2052,
              "nodeType": "Block",
              "src": "1116:136:16",
              "statements": [
                {
                  "assignments": [
                    2041
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2041,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2052,
                      "src": "1126:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2040,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1126:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2042,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1126:8:16"
                },
                {
                  "externalReferences": [
                    {
                      "ptr": {
                        "declaration": 2041,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1167:3:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "self": {
                        "declaration": 2035,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1178:4:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2043,
                  "nodeType": "InlineAssembly",
                  "operations": "{ ptr := add(self, 0x20) }",
                  "src": "1144:55:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2046,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2035,
                              "src": "1227:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 2045,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1221:5:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                              "typeString": "type(bytes storage pointer)"
                            },
                            "typeName": "bytes"
                          },
                          "id": 2047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1221:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 2048,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1221:18:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2049,
                        "name": "ptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2041,
                        "src": "1241:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2044,
                      "name": "slice",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "1215:5:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_struct$_slice_$1993_storage_ptr_$",
                        "typeString": "type(struct Strings.slice storage pointer)"
                      }
                    },
                    "id": 2050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "structConstructorCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1215:30:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "functionReturnParameters": 2039,
                  "id": 2051,
                  "nodeType": "Return",
                  "src": "1208:37:16"
                }
              ]
            },
            "documentation": null,
            "id": 2053,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toSlice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2036,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2035,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2053,
                  "src": "1059:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2034,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1059:6:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1058:20:16"
            },
            "returnParameters": {
              "id": 2039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2038,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2053,
                  "src": "1102:12:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2037,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "1102:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1101:14:16"
            },
            "scope": 2358,
            "src": "1042:210:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2082,
              "nodeType": "Block",
              "src": "1499:190:16",
              "statements": [
                {
                  "assignments": [
                    2061
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2061,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 2082,
                      "src": "1509:17:16",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 2060,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "1509:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2067,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2064,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1540:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2065,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "1540:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2063,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "1529:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_$",
                        "typeString": "function (uint256) pure returns (string memory)"
                      },
                      "typeName": {
                        "id": 2062,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "1533:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      }
                    },
                    "id": 2066,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1529:21:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory",
                      "typeString": "string memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1509:41:16"
                },
                {
                  "assignments": [
                    2069
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2069,
                      "name": "retptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2082,
                      "src": "1560:11:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2068,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1560:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2070,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1560:11:16"
                },
                {
                  "externalReferences": [
                    {
                      "retptr": {
                        "declaration": 2069,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1592:6:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 2061,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1606:3:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2071,
                  "nodeType": "InlineAssembly",
                  "operations": "{ retptr := add(ret, 32) }",
                  "src": "1581:35:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2073,
                        "name": "retptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2069,
                        "src": "1633:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2074,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1641:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2075,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "1641:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2076,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1652:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2077,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "1652:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2072,
                      "name": "memcpy",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2033,
                      "src": "1626:6:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (uint256,uint256,uint256) pure"
                      }
                    },
                    "id": 2078,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1626:36:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2079,
                  "nodeType": "ExpressionStatement",
                  "src": "1626:36:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2080,
                    "name": "ret",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2061,
                    "src": "1679:3:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 2059,
                  "id": 2081,
                  "nodeType": "Return",
                  "src": "1672:10:16"
                }
              ]
            },
            "documentation": null,
            "id": 2083,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toString",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2056,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2055,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2083,
                  "src": "1442:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2054,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "1442:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1441:19:16"
            },
            "returnParameters": {
              "id": 2059,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2058,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2083,
                  "src": "1484:13:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2057,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1484:6:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1483:15:16"
            },
            "scope": 2358,
            "src": "1424:265:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2203,
              "nodeType": "Block",
              "src": "1951:1267:16",
              "statements": [
                {
                  "assignments": [
                    2097
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2097,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2203,
                      "src": "1961:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2096,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1961:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2099,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 2098,
                    "name": "selfptr",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2087,
                    "src": "1972:7:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1961:18:16"
                },
                {
                  "assignments": [
                    2101
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2101,
                      "name": "idx",
                      "nodeType": "VariableDeclaration",
                      "scope": 2203,
                      "src": "1989:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2100,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1989:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2102,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1989:8:16"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2105,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2103,
                      "name": "needlelen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2089,
                      "src": "2012:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2104,
                      "name": "selflen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2085,
                      "src": "2025:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2012:20:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2198,
                  "nodeType": "IfStatement",
                  "src": "2008:1170:16",
                  "trueBody": {
                    "id": 2197,
                    "nodeType": "Block",
                    "src": "2034:1144:16",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2108,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2106,
                            "name": "needlelen",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2089,
                            "src": "2052:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2107,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2065:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "2052:15:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2195,
                          "nodeType": "Block",
                          "src": "2702:466:16",
                          "statements": [
                            {
                              "assignments": [
                                2164
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2164,
                                  "name": "hash",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2195,
                                  "src": "2769:12:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2163,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2769:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2165,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2769:12:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "hash": {
                                    "declaration": 2164,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2810:4:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needleptr": {
                                    "declaration": 2091,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2828:9:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needlelen": {
                                    "declaration": 2089,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2839:9:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2166,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    hash := keccak256(needleptr, needlelen)\n}",
                              "src": "2799:52:16"
                            },
                            {
                              "body": {
                                "id": 2193,
                                "nodeType": "Block",
                                "src": "2918:236:16",
                                "statements": [
                                  {
                                    "assignments": [
                                      2180
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2180,
                                        "name": "testHash",
                                        "nodeType": "VariableDeclaration",
                                        "scope": 2193,
                                        "src": "2940:16:16",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        "typeName": {
                                          "id": 2179,
                                          "name": "bytes32",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "2940:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2181,
                                    "initialValue": null,
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2940:16:16"
                                  },
                                  {
                                    "externalReferences": [
                                      {
                                        "testHash": {
                                          "declaration": 2180,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2989:8:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "ptr": {
                                          "declaration": 2097,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "3011:3:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "needlelen": {
                                          "declaration": 2089,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "3016:9:16",
                                          "valueSize": 1
                                        }
                                      }
                                    ],
                                    "id": 2182,
                                    "nodeType": "InlineAssembly",
                                    "operations": "{\n    testHash := keccak256(ptr, needlelen)\n}",
                                    "src": "2978:50:16"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      },
                                      "id": 2185,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2183,
                                        "name": "hash",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2164,
                                        "src": "3053:4:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 2184,
                                        "name": "testHash",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2180,
                                        "src": "3061:8:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "src": "3053:16:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 2188,
                                    "nodeType": "IfStatement",
                                    "src": "3049:56:16",
                                    "trueBody": {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2186,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "3102:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "functionReturnParameters": 2095,
                                      "id": 2187,
                                      "nodeType": "Return",
                                      "src": "3095:10:16"
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2191,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 2189,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "3127:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "+=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "hexValue": "31",
                                        "id": 2190,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "3134:1:16",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_1_by_1",
                                          "typeString": "int_const 1"
                                        },
                                        "value": "1"
                                      },
                                      "src": "3127:8:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2192,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3127:8:16"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2175,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2171,
                                  "name": "idx",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2101,
                                  "src": "2883:3:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2174,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2172,
                                    "name": "selflen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2085,
                                    "src": "2890:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2173,
                                    "name": "needlelen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2089,
                                    "src": "2900:9:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "2890:19:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2883:26:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2194,
                              "initializationExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2169,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 2167,
                                    "name": "idx",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2101,
                                    "src": "2874:3:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2168,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2880:1:16",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  },
                                  "src": "2874:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2170,
                                "nodeType": "ExpressionStatement",
                                "src": "2874:7:16"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2177,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "2911:5:16",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 2176,
                                    "name": "idx",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2101,
                                    "src": "2911:3:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2178,
                                "nodeType": "ExpressionStatement",
                                "src": "2911:5:16"
                              },
                              "nodeType": "ForStatement",
                              "src": "2869:285:16"
                            }
                          ]
                        },
                        "id": 2196,
                        "nodeType": "IfStatement",
                        "src": "2048:1120:16",
                        "trueBody": {
                          "id": 2162,
                          "nodeType": "Block",
                          "src": "2069:627:16",
                          "statements": [
                            {
                              "assignments": [
                                2110
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2110,
                                  "name": "mask",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2087:12:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2109,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2087:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2126,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2124,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "~",
                                    "prefix": true,
                                    "src": "2110:34:16",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 2122,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            "id": 2120,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "hexValue": "32",
                                              "id": 2112,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "number",
                                              "lValueRequested": false,
                                              "nodeType": "Literal",
                                              "src": "2112:1:16",
                                              "subdenomination": null,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_rational_2_by_1",
                                                "typeString": "int_const 2"
                                              },
                                              "value": "2"
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "**",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "components": [
                                                {
                                                  "argumentTypes": null,
                                                  "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  "id": 2118,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftExpression": {
                                                    "argumentTypes": null,
                                                    "hexValue": "38",
                                                    "id": 2113,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2118:1:16",
                                                    "subdenomination": null,
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_rational_8_by_1",
                                                      "typeString": "int_const 8"
                                                    },
                                                    "value": "8"
                                                  },
                                                  "nodeType": "BinaryOperation",
                                                  "operator": "*",
                                                  "rightExpression": {
                                                    "argumentTypes": null,
                                                    "components": [
                                                      {
                                                        "argumentTypes": null,
                                                        "commonType": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        },
                                                        "id": 2116,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                          "argumentTypes": null,
                                                          "hexValue": "3332",
                                                          "id": 2114,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": true,
                                                          "kind": "number",
                                                          "lValueRequested": false,
                                                          "nodeType": "Literal",
                                                          "src": "2123:2:16",
                                                          "subdenomination": null,
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_rational_32_by_1",
                                                            "typeString": "int_const 32"
                                                          },
                                                          "value": "32"
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "-",
                                                        "rightExpression": {
                                                          "argumentTypes": null,
                                                          "id": 2115,
                                                          "name": "needlelen",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 2089,
                                                          "src": "2128:9:16",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        },
                                                        "src": "2123:14:16",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      }
                                                    ],
                                                    "id": 2117,
                                                    "isConstant": false,
                                                    "isInlineArray": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "nodeType": "TupleExpression",
                                                    "src": "2122:16:16",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "src": "2118:20:16",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "id": 2119,
                                              "isConstant": false,
                                              "isInlineArray": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "TupleExpression",
                                              "src": "2117:22:16",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "2112:27:16",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "-",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 2121,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "2142:1:16",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          },
                                          "src": "2112:31:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "id": 2123,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "2111:33:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2102:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bytes32_$",
                                    "typeString": "type(bytes32)"
                                  },
                                  "typeName": "bytes32"
                                },
                                "id": 2125,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2102:43:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2087:58:16"
                            },
                            {
                              "assignments": [
                                2128
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2128,
                                  "name": "needledata",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2164:18:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2127,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2164:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2129,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2164:18:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "needledata": {
                                    "declaration": 2128,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2211:10:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needleptr": {
                                    "declaration": 2091,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2235:9:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "mask": {
                                    "declaration": 2110,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2247:4:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2130,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    needledata := and(mload(needleptr), mask)\n}",
                              "src": "2200:54:16"
                            },
                            {
                              "assignments": [
                                2132
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2132,
                                  "name": "end",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2272:8:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2131,
                                    "name": "uint",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2272:4:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2138,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2137,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2135,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2133,
                                    "name": "selfptr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2087,
                                    "src": "2283:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2134,
                                    "name": "selflen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2085,
                                    "src": "2293:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "2283:17:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2136,
                                  "name": "needlelen",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2089,
                                  "src": "2303:9:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2283:29:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2272:40:16"
                            },
                            {
                              "assignments": [
                                2140
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2140,
                                  "name": "ptrdata",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2330:15:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2139,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2330:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2141,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2330:15:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "ptrdata": {
                                    "declaration": 2140,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2374:7:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "ptr": {
                                    "declaration": 2097,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2395:3:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "mask": {
                                    "declaration": 2110,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2401:4:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2142,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    ptrdata := and(mload(ptr), mask)\n}",
                              "src": "2363:45:16"
                            },
                            {
                              "body": {
                                "id": 2158,
                                "nodeType": "Block",
                                "src": "2456:198:16",
                                "statements": [
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2148,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2146,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "2482:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 2147,
                                        "name": "end",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2132,
                                        "src": "2489:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "2482:10:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 2153,
                                    "nodeType": "IfStatement",
                                    "src": "2478:64:16",
                                    "trueBody": {
                                      "expression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2151,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2149,
                                          "name": "selfptr",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2087,
                                          "src": "2525:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "+",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 2150,
                                          "name": "selflen",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2085,
                                          "src": "2535:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "2525:17:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "functionReturnParameters": 2095,
                                      "id": 2152,
                                      "nodeType": "Return",
                                      "src": "2518:24:16"
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2155,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "++",
                                      "prefix": false,
                                      "src": "2564:5:16",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 2154,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "2564:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2156,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2564:5:16"
                                  },
                                  {
                                    "externalReferences": [
                                      {
                                        "ptrdata": {
                                          "declaration": 2140,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2602:7:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "ptr": {
                                          "declaration": 2097,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2623:3:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "mask": {
                                          "declaration": 2110,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2629:4:16",
                                          "valueSize": 1
                                        }
                                      }
                                    ],
                                    "id": 2157,
                                    "nodeType": "InlineAssembly",
                                    "operations": "{\n    ptrdata := and(mload(ptr), mask)\n}",
                                    "src": "2591:45:16"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                "id": 2145,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2143,
                                  "name": "ptrdata",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2140,
                                  "src": "2433:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2144,
                                  "name": "needledata",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2128,
                                  "src": "2444:10:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "src": "2433:21:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2159,
                              "nodeType": "WhileStatement",
                              "src": "2426:228:16"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2160,
                                "name": "ptr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2097,
                                "src": "2678:3:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 2095,
                              "id": 2161,
                              "nodeType": "Return",
                              "src": "2671:10:16"
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2201,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2199,
                      "name": "selfptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2087,
                      "src": "3194:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2200,
                      "name": "selflen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2085,
                      "src": "3204:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3194:17:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2095,
                  "id": 2202,
                  "nodeType": "Return",
                  "src": "3187:24:16"
                }
              ]
            },
            "documentation": null,
            "id": 2204,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "findPtr",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2092,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2085,
                  "name": "selflen",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1863:12:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2084,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1863:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2087,
                  "name": "selfptr",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1877:12:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2086,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1877:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2089,
                  "name": "needlelen",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1891:14:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2088,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1891:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2091,
                  "name": "needleptr",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1907:14:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2090,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1907:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1862:60:16"
            },
            "returnParameters": {
              "id": 2095,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2094,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1945:4:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2093,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1945:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1944:6:16"
            },
            "scope": 2358,
            "src": "1846:1372:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2281,
              "nodeType": "Block",
              "src": "3836:392:16",
              "statements": [
                {
                  "assignments": [
                    2216
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2216,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2281,
                      "src": "3846:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2215,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "3846:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2227,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2218,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3865:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2219,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "3865:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2220,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3876:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2221,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3876:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2222,
                          "name": "needle",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2208,
                          "src": "3887:6:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2223,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "3887:11:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2224,
                          "name": "needle",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2208,
                          "src": "3900:6:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2225,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3900:11:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2217,
                      "name": "findPtr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2204,
                      "src": "3857:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2226,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3857:55:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3846:66:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2233,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2228,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2210,
                        "src": "3922:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2230,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "_ptr",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1992,
                      "src": "3922:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2231,
                        "name": "self",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2206,
                        "src": "3935:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2232,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_ptr",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1992,
                      "src": "3935:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3922:22:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2234,
                  "nodeType": "ExpressionStatement",
                  "src": "3922:22:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2242,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2235,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2210,
                        "src": "3954:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2237,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "_len",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1990,
                      "src": "3954:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2241,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 2238,
                        "name": "ptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2216,
                        "src": "3967:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2239,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3973:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2240,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3973:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "3967:15:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3954:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2243,
                  "nodeType": "ExpressionStatement",
                  "src": "3954:28:16"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2250,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2244,
                      "name": "ptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2216,
                      "src": "3996:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2249,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2245,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "4003:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2246,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "4003:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2247,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "4015:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2248,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "4015:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "4003:21:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3996:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2277,
                    "nodeType": "Block",
                    "src": "4095:105:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2258,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4109:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2260,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_len",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1990,
                            "src": "4109:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2265,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2261,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2210,
                                "src": "4122:5:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2262,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4122:10:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2263,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2208,
                                "src": "4135:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2264,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4135:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "4122:24:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4109:37:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2267,
                        "nodeType": "ExpressionStatement",
                        "src": "4109:37:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2275,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2268,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4160:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2270,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_ptr",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1992,
                            "src": "4160:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2274,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2271,
                              "name": "ptr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2216,
                              "src": "4172:3:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2272,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2208,
                                "src": "4178:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2273,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4178:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "4172:17:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4160:29:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2276,
                        "nodeType": "ExpressionStatement",
                        "src": "4160:29:16"
                      }
                    ]
                  },
                  "id": 2278,
                  "nodeType": "IfStatement",
                  "src": "3992:208:16",
                  "trueBody": {
                    "id": 2257,
                    "nodeType": "Block",
                    "src": "4026:63:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2255,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2251,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4065:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2253,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_len",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1990,
                            "src": "4065:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2254,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4077:1:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4065:13:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2256,
                        "nodeType": "ExpressionStatement",
                        "src": "4065:13:16"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2279,
                    "name": "token",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2210,
                    "src": "4216:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "functionReturnParameters": 2214,
                  "id": 2280,
                  "nodeType": "Return",
                  "src": "4209:12:16"
                }
              ]
            },
            "documentation": null,
            "id": 2282,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "split",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2211,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2206,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3739:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2205,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3739:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2208,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3758:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2207,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3758:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2210,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3779:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2209,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3779:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3738:60:16"
            },
            "returnParameters": {
              "id": 2214,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2213,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3822:12:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2212,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3822:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3821:14:16"
            },
            "scope": 2358,
            "src": "3724:504:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2297,
              "nodeType": "Block",
              "src": "4797:43:16",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2292,
                        "name": "self",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2284,
                        "src": "4813:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2293,
                        "name": "needle",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2286,
                        "src": "4819:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2294,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2289,
                        "src": "4827:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        },
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        },
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      ],
                      "id": 2291,
                      "name": "split",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        2282,
                        2298
                      ],
                      "referencedDeclaration": 2282,
                      "src": "4807:5:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_struct$_slice_$1993_memory_ptr_$_t_struct$_slice_$1993_memory_ptr_$_t_struct$_slice_$1993_memory_ptr_$returns$_t_struct$_slice_$1993_memory_ptr_$",
                        "typeString": "function (struct Strings.slice memory,struct Strings.slice memory,struct Strings.slice memory) pure returns (struct Strings.slice memory)"
                      }
                    },
                    "id": 2295,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4807:26:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "id": 2296,
                  "nodeType": "ExpressionStatement",
                  "src": "4807:26:16"
                }
              ]
            },
            "documentation": null,
            "id": 2298,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "split",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2287,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2284,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4714:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2283,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4714:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2286,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4733:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2285,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4733:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4713:40:16"
            },
            "returnParameters": {
              "id": 2290,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2289,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4777:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2288,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4777:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4776:20:16"
            },
            "scope": 2358,
            "src": "4699:141:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2356,
              "nodeType": "Block",
              "src": "5197:276:16",
              "statements": [
                {
                  "assignments": [
                    2308
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2308,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2356,
                      "src": "5207:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2307,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "5207:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2322,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2321,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2310,
                            "name": "self",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2300,
                            "src": "5226:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2311,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_len",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1990,
                          "src": "5226:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2312,
                            "name": "self",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2300,
                            "src": "5237:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2313,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_ptr",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1992,
                          "src": "5237:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2314,
                            "name": "needle",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2302,
                            "src": "5248:6:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2315,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_len",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1990,
                          "src": "5248:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2316,
                            "name": "needle",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2302,
                            "src": "5261:6:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2317,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_ptr",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1992,
                          "src": "5261:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 2309,
                        "name": "findPtr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2204,
                        "src": "5218:7:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 2318,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5218:55:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2319,
                        "name": "needle",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2302,
                        "src": "5276:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2320,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_len",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1990,
                      "src": "5276:11:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5218:69:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5207:80:16"
                },
                {
                  "body": {
                    "id": 2354,
                    "nodeType": "Block",
                    "src": "5334:133:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "++",
                          "prefix": false,
                          "src": "5348:5:16",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 2330,
                            "name": "cnt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2305,
                            "src": "5348:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2332,
                        "nodeType": "ExpressionStatement",
                        "src": "5348:5:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2352,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2333,
                            "name": "ptr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2308,
                            "src": "5367:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2351,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2342,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2335,
                                      "name": "self",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2300,
                                      "src": "5381:4:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                        "typeString": "struct Strings.slice memory"
                                      }
                                    },
                                    "id": 2336,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_len",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1990,
                                    "src": "5381:9:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2340,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2337,
                                          "name": "ptr",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2308,
                                          "src": "5394:3:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2338,
                                            "name": "self",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2300,
                                            "src": "5400:4:16",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                              "typeString": "struct Strings.slice memory"
                                            }
                                          },
                                          "id": 2339,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "_ptr",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1992,
                                          "src": "5400:9:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "5394:15:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 2341,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "5393:17:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "5381:29:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2343,
                                  "name": "ptr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2308,
                                  "src": "5412:3:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2344,
                                    "name": "needle",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2302,
                                    "src": "5417:6:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                      "typeString": "struct Strings.slice memory"
                                    }
                                  },
                                  "id": 2345,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_len",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1990,
                                  "src": "5417:11:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2346,
                                    "name": "needle",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2302,
                                    "src": "5430:6:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                      "typeString": "struct Strings.slice memory"
                                    }
                                  },
                                  "id": 2347,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_ptr",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1992,
                                  "src": "5430:11:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2334,
                                "name": "findPtr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2204,
                                "src": "5373:7:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 2348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5373:69:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2349,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2302,
                                "src": "5445:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2350,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "5445:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "5373:83:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5367:89:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2353,
                        "nodeType": "ExpressionStatement",
                        "src": "5367:89:16"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2329,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2323,
                      "name": "ptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2308,
                      "src": "5304:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2328,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2324,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2300,
                          "src": "5311:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2325,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "5311:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2326,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2300,
                          "src": "5323:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2327,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "5323:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "5311:21:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5304:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2355,
                  "nodeType": "WhileStatement",
                  "src": "5297:170:16"
                }
              ]
            },
            "documentation": null,
            "id": 2357,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "count",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2303,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2300,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5124:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2299,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "5124:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2302,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5143:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2301,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "5143:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5123:40:16"
            },
            "returnParameters": {
              "id": 2306,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2305,
                  "name": "cnt",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5187:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2304,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "5187:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5186:10:16"
            },
            "scope": 2358,
            "src": "5109:364:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 2359,
        "src": "208:5267:16"
      }
    ],
    "src": "183:5293:16"
  },
  "legacyAST": {
    "absolutePath": "/Users/ilanolkies/code/rnsdomains/rns-artifacts/contracts/util/Strings.sol",
    "exportedSymbols": {
      "Strings": [
        2358
      ]
    },
    "id": 2359,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1988,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "183:23:16"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2358,
        "linearizedBaseContracts": [
          2358
        ],
        "name": "Strings",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "Strings.slice",
            "id": 1993,
            "members": [
              {
                "constant": false,
                "id": 1990,
                "name": "_len",
                "nodeType": "VariableDeclaration",
                "scope": 1993,
                "src": "253:9:16",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1989,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "253:4:16",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 1992,
                "name": "_ptr",
                "nodeType": "VariableDeclaration",
                "scope": 1993,
                "src": "272:9:16",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 1991,
                  "name": "uint",
                  "nodeType": "ElementaryTypeName",
                  "src": "272:4:16",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "slice",
            "nodeType": "StructDefinition",
            "scope": 2358,
            "src": "230:58:16",
            "visibility": "public"
          },
          {
            "body": {
              "id": 2032,
              "nodeType": "Block",
              "src": "354:488:16",
              "statements": [
                {
                  "body": {
                    "id": 2018,
                    "nodeType": "Block",
                    "src": "442:136:16",
                    "statements": [
                      {
                        "externalReferences": [
                          {
                            "src": {
                              "declaration": 1997,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "502:3:16",
                              "valueSize": 1
                            }
                          },
                          {
                            "dest": {
                              "declaration": 1995,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "490:4:16",
                              "valueSize": 1
                            }
                          }
                        ],
                        "id": 2009,
                        "nodeType": "InlineAssembly",
                        "operations": "{ mstore(dest, mload(src)) }",
                        "src": "456:65:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2012,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2010,
                            "name": "dest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1995,
                            "src": "534:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2011,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "542:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "534:10:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2013,
                        "nodeType": "ExpressionStatement",
                        "src": "534:10:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2014,
                            "name": "src",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1997,
                            "src": "558:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2015,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "565:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "558:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2017,
                        "nodeType": "ExpressionStatement",
                        "src": "558:9:16"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2004,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2002,
                      "name": "len",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1999,
                      "src": "420:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "3332",
                      "id": 2003,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "427:2:16",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_32_by_1",
                        "typeString": "int_const 32"
                      },
                      "value": "32"
                    },
                    "src": "420:9:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2019,
                  "initializationExpression": null,
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 2007,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftHandSide": {
                        "argumentTypes": null,
                        "id": 2005,
                        "name": "len",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1999,
                        "src": "431:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "Assignment",
                      "operator": "-=",
                      "rightHandSide": {
                        "argumentTypes": null,
                        "hexValue": "3332",
                        "id": 2006,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "438:2:16",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_32_by_1",
                          "typeString": "int_const 32"
                        },
                        "value": "32"
                      },
                      "src": "431:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 2008,
                    "nodeType": "ExpressionStatement",
                    "src": "431:9:16"
                  },
                  "nodeType": "ForStatement",
                  "src": "414:164:16"
                },
                {
                  "assignments": [
                    2021
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2021,
                      "name": "mask",
                      "nodeType": "VariableDeclaration",
                      "scope": 2032,
                      "src": "620:9:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2020,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "620:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2030,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2029,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2027,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "hexValue": "323536",
                        "id": 2022,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "632:3:16",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_256_by_1",
                          "typeString": "int_const 256"
                        },
                        "value": "256"
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "**",
                      "rightExpression": {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2025,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "hexValue": "3332",
                              "id": 2023,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "640:2:16",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_32_by_1",
                                "typeString": "int_const 32"
                              },
                              "value": "32"
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2024,
                              "name": "len",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1999,
                              "src": "645:3:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "640:8:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 2026,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "639:10:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "632:17:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 2028,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "652:1:16",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "632:21:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "620:33:16"
                },
                {
                  "externalReferences": [
                    {
                      "src": {
                        "declaration": 1997,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "711:3:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "mask": {
                        "declaration": 2021,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "721:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "dest": {
                        "declaration": 1995,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "766:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "mask": {
                        "declaration": 2021,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "773:4:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "dest": {
                        "declaration": 1995,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "798:4:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2031,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let srcpart := and(mload(src), not(mask))\n    let destpart := and(mload(dest), mask)\n    mstore(dest, or(destpart, srcpart))\n}",
                  "src": "663:173:16"
                }
              ]
            },
            "documentation": null,
            "id": 2033,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "memcpy",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2000,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 1995,
                  "name": "dest",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "310:9:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1994,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "310:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1997,
                  "name": "src",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "321:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1996,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "321:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1999,
                  "name": "len",
                  "nodeType": "VariableDeclaration",
                  "scope": 2033,
                  "src": "331:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1998,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "331:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "309:31:16"
            },
            "returnParameters": {
              "id": 2001,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "354:0:16"
            },
            "scope": 2358,
            "src": "294:548:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2052,
              "nodeType": "Block",
              "src": "1116:136:16",
              "statements": [
                {
                  "assignments": [
                    2041
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2041,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2052,
                      "src": "1126:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2040,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1126:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2042,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1126:8:16"
                },
                {
                  "externalReferences": [
                    {
                      "ptr": {
                        "declaration": 2041,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1167:3:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "self": {
                        "declaration": 2035,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1178:4:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2043,
                  "nodeType": "InlineAssembly",
                  "operations": "{ ptr := add(self, 0x20) }",
                  "src": "1144:55:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2046,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2035,
                              "src": "1227:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 2045,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1221:5:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                              "typeString": "type(bytes storage pointer)"
                            },
                            "typeName": "bytes"
                          },
                          "id": 2047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1221:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 2048,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1221:18:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2049,
                        "name": "ptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2041,
                        "src": "1241:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2044,
                      "name": "slice",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1993,
                      "src": "1215:5:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_struct$_slice_$1993_storage_ptr_$",
                        "typeString": "type(struct Strings.slice storage pointer)"
                      }
                    },
                    "id": 2050,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "structConstructorCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1215:30:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "functionReturnParameters": 2039,
                  "id": 2051,
                  "nodeType": "Return",
                  "src": "1208:37:16"
                }
              ]
            },
            "documentation": null,
            "id": 2053,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toSlice",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2036,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2035,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2053,
                  "src": "1059:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2034,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1059:6:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1058:20:16"
            },
            "returnParameters": {
              "id": 2039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2038,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2053,
                  "src": "1102:12:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2037,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "1102:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1101:14:16"
            },
            "scope": 2358,
            "src": "1042:210:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2082,
              "nodeType": "Block",
              "src": "1499:190:16",
              "statements": [
                {
                  "assignments": [
                    2061
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2061,
                      "name": "ret",
                      "nodeType": "VariableDeclaration",
                      "scope": 2082,
                      "src": "1509:17:16",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 2060,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "1509:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2067,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2064,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1540:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2065,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "1540:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2063,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "1529:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_string_memory_$",
                        "typeString": "function (uint256) pure returns (string memory)"
                      },
                      "typeName": {
                        "id": 2062,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "1533:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      }
                    },
                    "id": 2066,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1529:21:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory",
                      "typeString": "string memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1509:41:16"
                },
                {
                  "assignments": [
                    2069
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2069,
                      "name": "retptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2082,
                      "src": "1560:11:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2068,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1560:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2070,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1560:11:16"
                },
                {
                  "externalReferences": [
                    {
                      "retptr": {
                        "declaration": 2069,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1592:6:16",
                        "valueSize": 1
                      }
                    },
                    {
                      "ret": {
                        "declaration": 2061,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1606:3:16",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 2071,
                  "nodeType": "InlineAssembly",
                  "operations": "{ retptr := add(ret, 32) }",
                  "src": "1581:35:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2073,
                        "name": "retptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2069,
                        "src": "1633:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2074,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1641:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2075,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "1641:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2076,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2055,
                          "src": "1652:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2077,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "1652:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2072,
                      "name": "memcpy",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2033,
                      "src": "1626:6:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (uint256,uint256,uint256) pure"
                      }
                    },
                    "id": 2078,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1626:36:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2079,
                  "nodeType": "ExpressionStatement",
                  "src": "1626:36:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2080,
                    "name": "ret",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2061,
                    "src": "1679:3:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 2059,
                  "id": 2081,
                  "nodeType": "Return",
                  "src": "1672:10:16"
                }
              ]
            },
            "documentation": null,
            "id": 2083,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toString",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2056,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2055,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2083,
                  "src": "1442:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2054,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "1442:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1441:19:16"
            },
            "returnParameters": {
              "id": 2059,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2058,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2083,
                  "src": "1484:13:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2057,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1484:6:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1483:15:16"
            },
            "scope": 2358,
            "src": "1424:265:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2203,
              "nodeType": "Block",
              "src": "1951:1267:16",
              "statements": [
                {
                  "assignments": [
                    2097
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2097,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2203,
                      "src": "1961:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2096,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1961:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2099,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 2098,
                    "name": "selfptr",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2087,
                    "src": "1972:7:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1961:18:16"
                },
                {
                  "assignments": [
                    2101
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2101,
                      "name": "idx",
                      "nodeType": "VariableDeclaration",
                      "scope": 2203,
                      "src": "1989:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2100,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "1989:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2102,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1989:8:16"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2105,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2103,
                      "name": "needlelen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2089,
                      "src": "2012:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2104,
                      "name": "selflen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2085,
                      "src": "2025:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2012:20:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 2198,
                  "nodeType": "IfStatement",
                  "src": "2008:1170:16",
                  "trueBody": {
                    "id": 2197,
                    "nodeType": "Block",
                    "src": "2034:1144:16",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2108,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2106,
                            "name": "needlelen",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2089,
                            "src": "2052:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 2107,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2065:2:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "2052:15:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2195,
                          "nodeType": "Block",
                          "src": "2702:466:16",
                          "statements": [
                            {
                              "assignments": [
                                2164
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2164,
                                  "name": "hash",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2195,
                                  "src": "2769:12:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2163,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2769:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2165,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2769:12:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "hash": {
                                    "declaration": 2164,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2810:4:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needleptr": {
                                    "declaration": 2091,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2828:9:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needlelen": {
                                    "declaration": 2089,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2839:9:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2166,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    hash := keccak256(needleptr, needlelen)\n}",
                              "src": "2799:52:16"
                            },
                            {
                              "body": {
                                "id": 2193,
                                "nodeType": "Block",
                                "src": "2918:236:16",
                                "statements": [
                                  {
                                    "assignments": [
                                      2180
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 2180,
                                        "name": "testHash",
                                        "nodeType": "VariableDeclaration",
                                        "scope": 2193,
                                        "src": "2940:16:16",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        "typeName": {
                                          "id": 2179,
                                          "name": "bytes32",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "2940:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 2181,
                                    "initialValue": null,
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2940:16:16"
                                  },
                                  {
                                    "externalReferences": [
                                      {
                                        "testHash": {
                                          "declaration": 2180,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2989:8:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "ptr": {
                                          "declaration": 2097,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "3011:3:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "needlelen": {
                                          "declaration": 2089,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "3016:9:16",
                                          "valueSize": 1
                                        }
                                      }
                                    ],
                                    "id": 2182,
                                    "nodeType": "InlineAssembly",
                                    "operations": "{\n    testHash := keccak256(ptr, needlelen)\n}",
                                    "src": "2978:50:16"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      },
                                      "id": 2185,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2183,
                                        "name": "hash",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2164,
                                        "src": "3053:4:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 2184,
                                        "name": "testHash",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2180,
                                        "src": "3061:8:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "src": "3053:16:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 2188,
                                    "nodeType": "IfStatement",
                                    "src": "3049:56:16",
                                    "trueBody": {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2186,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "3102:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "functionReturnParameters": 2095,
                                      "id": 2187,
                                      "nodeType": "Return",
                                      "src": "3095:10:16"
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2191,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 2189,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "3127:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "+=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "hexValue": "31",
                                        "id": 2190,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "3134:1:16",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_1_by_1",
                                          "typeString": "int_const 1"
                                        },
                                        "value": "1"
                                      },
                                      "src": "3127:8:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2192,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3127:8:16"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2175,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2171,
                                  "name": "idx",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2101,
                                  "src": "2883:3:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2174,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2172,
                                    "name": "selflen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2085,
                                    "src": "2890:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2173,
                                    "name": "needlelen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2089,
                                    "src": "2900:9:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "2890:19:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2883:26:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2194,
                              "initializationExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2169,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 2167,
                                    "name": "idx",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2101,
                                    "src": "2874:3:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2168,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2880:1:16",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  },
                                  "src": "2874:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2170,
                                "nodeType": "ExpressionStatement",
                                "src": "2874:7:16"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2177,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "2911:5:16",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 2176,
                                    "name": "idx",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2101,
                                    "src": "2911:3:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2178,
                                "nodeType": "ExpressionStatement",
                                "src": "2911:5:16"
                              },
                              "nodeType": "ForStatement",
                              "src": "2869:285:16"
                            }
                          ]
                        },
                        "id": 2196,
                        "nodeType": "IfStatement",
                        "src": "2048:1120:16",
                        "trueBody": {
                          "id": 2162,
                          "nodeType": "Block",
                          "src": "2069:627:16",
                          "statements": [
                            {
                              "assignments": [
                                2110
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2110,
                                  "name": "mask",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2087:12:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2109,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2087:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2126,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2124,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "~",
                                    "prefix": true,
                                    "src": "2110:34:16",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "components": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 2122,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            "id": 2120,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "hexValue": "32",
                                              "id": 2112,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "number",
                                              "lValueRequested": false,
                                              "nodeType": "Literal",
                                              "src": "2112:1:16",
                                              "subdenomination": null,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_rational_2_by_1",
                                                "typeString": "int_const 2"
                                              },
                                              "value": "2"
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "**",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "components": [
                                                {
                                                  "argumentTypes": null,
                                                  "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  "id": 2118,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftExpression": {
                                                    "argumentTypes": null,
                                                    "hexValue": "38",
                                                    "id": 2113,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2118:1:16",
                                                    "subdenomination": null,
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_rational_8_by_1",
                                                      "typeString": "int_const 8"
                                                    },
                                                    "value": "8"
                                                  },
                                                  "nodeType": "BinaryOperation",
                                                  "operator": "*",
                                                  "rightExpression": {
                                                    "argumentTypes": null,
                                                    "components": [
                                                      {
                                                        "argumentTypes": null,
                                                        "commonType": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        },
                                                        "id": 2116,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                          "argumentTypes": null,
                                                          "hexValue": "3332",
                                                          "id": 2114,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": true,
                                                          "kind": "number",
                                                          "lValueRequested": false,
                                                          "nodeType": "Literal",
                                                          "src": "2123:2:16",
                                                          "subdenomination": null,
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_rational_32_by_1",
                                                            "typeString": "int_const 32"
                                                          },
                                                          "value": "32"
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "-",
                                                        "rightExpression": {
                                                          "argumentTypes": null,
                                                          "id": 2115,
                                                          "name": "needlelen",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 2089,
                                                          "src": "2128:9:16",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        },
                                                        "src": "2123:14:16",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      }
                                                    ],
                                                    "id": 2117,
                                                    "isConstant": false,
                                                    "isInlineArray": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "nodeType": "TupleExpression",
                                                    "src": "2122:16:16",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "src": "2118:20:16",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "id": 2119,
                                              "isConstant": false,
                                              "isInlineArray": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "TupleExpression",
                                              "src": "2117:22:16",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "2112:27:16",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "-",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 2121,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "2142:1:16",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_1_by_1",
                                              "typeString": "int_const 1"
                                            },
                                            "value": "1"
                                          },
                                          "src": "2112:31:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "id": 2123,
                                      "isConstant": false,
                                      "isInlineArray": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "TupleExpression",
                                      "src": "2111:33:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2102:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bytes32_$",
                                    "typeString": "type(bytes32)"
                                  },
                                  "typeName": "bytes32"
                                },
                                "id": 2125,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2102:43:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2087:58:16"
                            },
                            {
                              "assignments": [
                                2128
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2128,
                                  "name": "needledata",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2164:18:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2127,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2164:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2129,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2164:18:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "needledata": {
                                    "declaration": 2128,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2211:10:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "needleptr": {
                                    "declaration": 2091,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2235:9:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "mask": {
                                    "declaration": 2110,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2247:4:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2130,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    needledata := and(mload(needleptr), mask)\n}",
                              "src": "2200:54:16"
                            },
                            {
                              "assignments": [
                                2132
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2132,
                                  "name": "end",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2272:8:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2131,
                                    "name": "uint",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2272:4:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2138,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2137,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2135,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2133,
                                    "name": "selfptr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2087,
                                    "src": "2283:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2134,
                                    "name": "selflen",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2085,
                                    "src": "2293:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "2283:17:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2136,
                                  "name": "needlelen",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2089,
                                  "src": "2303:9:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2283:29:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2272:40:16"
                            },
                            {
                              "assignments": [
                                2140
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2140,
                                  "name": "ptrdata",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 2162,
                                  "src": "2330:15:16",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 2139,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2330:7:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2141,
                              "initialValue": null,
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2330:15:16"
                            },
                            {
                              "externalReferences": [
                                {
                                  "ptrdata": {
                                    "declaration": 2140,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2374:7:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "ptr": {
                                    "declaration": 2097,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2395:3:16",
                                    "valueSize": 1
                                  }
                                },
                                {
                                  "mask": {
                                    "declaration": 2110,
                                    "isOffset": false,
                                    "isSlot": false,
                                    "src": "2401:4:16",
                                    "valueSize": 1
                                  }
                                }
                              ],
                              "id": 2142,
                              "nodeType": "InlineAssembly",
                              "operations": "{\n    ptrdata := and(mload(ptr), mask)\n}",
                              "src": "2363:45:16"
                            },
                            {
                              "body": {
                                "id": 2158,
                                "nodeType": "Block",
                                "src": "2456:198:16",
                                "statements": [
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2148,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 2146,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "2482:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 2147,
                                        "name": "end",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2132,
                                        "src": "2489:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "2482:10:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 2153,
                                    "nodeType": "IfStatement",
                                    "src": "2478:64:16",
                                    "trueBody": {
                                      "expression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2151,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2149,
                                          "name": "selfptr",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2087,
                                          "src": "2525:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "+",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 2150,
                                          "name": "selflen",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2085,
                                          "src": "2535:7:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "2525:17:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "functionReturnParameters": 2095,
                                      "id": 2152,
                                      "nodeType": "Return",
                                      "src": "2518:24:16"
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2155,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "++",
                                      "prefix": false,
                                      "src": "2564:5:16",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 2154,
                                        "name": "ptr",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2097,
                                        "src": "2564:3:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2156,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2564:5:16"
                                  },
                                  {
                                    "externalReferences": [
                                      {
                                        "ptrdata": {
                                          "declaration": 2140,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2602:7:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "ptr": {
                                          "declaration": 2097,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2623:3:16",
                                          "valueSize": 1
                                        }
                                      },
                                      {
                                        "mask": {
                                          "declaration": 2110,
                                          "isOffset": false,
                                          "isSlot": false,
                                          "src": "2629:4:16",
                                          "valueSize": 1
                                        }
                                      }
                                    ],
                                    "id": 2157,
                                    "nodeType": "InlineAssembly",
                                    "operations": "{\n    ptrdata := and(mload(ptr), mask)\n}",
                                    "src": "2591:45:16"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                "id": 2145,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2143,
                                  "name": "ptrdata",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2140,
                                  "src": "2433:7:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2144,
                                  "name": "needledata",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2128,
                                  "src": "2444:10:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "src": "2433:21:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2159,
                              "nodeType": "WhileStatement",
                              "src": "2426:228:16"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2160,
                                "name": "ptr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2097,
                                "src": "2678:3:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 2095,
                              "id": 2161,
                              "nodeType": "Return",
                              "src": "2671:10:16"
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2201,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2199,
                      "name": "selfptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2087,
                      "src": "3194:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2200,
                      "name": "selflen",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2085,
                      "src": "3204:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3194:17:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2095,
                  "id": 2202,
                  "nodeType": "Return",
                  "src": "3187:24:16"
                }
              ]
            },
            "documentation": null,
            "id": 2204,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "findPtr",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2092,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2085,
                  "name": "selflen",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1863:12:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2084,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1863:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2087,
                  "name": "selfptr",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1877:12:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2086,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1877:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2089,
                  "name": "needlelen",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1891:14:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2088,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1891:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2091,
                  "name": "needleptr",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1907:14:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2090,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1907:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1862:60:16"
            },
            "returnParameters": {
              "id": 2095,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2094,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2204,
                  "src": "1945:4:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2093,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "1945:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1944:6:16"
            },
            "scope": 2358,
            "src": "1846:1372:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2281,
              "nodeType": "Block",
              "src": "3836:392:16",
              "statements": [
                {
                  "assignments": [
                    2216
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2216,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2281,
                      "src": "3846:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2215,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "3846:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2227,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2218,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3865:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2219,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "3865:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2220,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3876:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2221,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3876:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2222,
                          "name": "needle",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2208,
                          "src": "3887:6:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2223,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "3887:11:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2224,
                          "name": "needle",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2208,
                          "src": "3900:6:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2225,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3900:11:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2217,
                      "name": "findPtr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2204,
                      "src": "3857:7:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2226,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3857:55:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3846:66:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2233,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2228,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2210,
                        "src": "3922:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2230,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "_ptr",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1992,
                      "src": "3922:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2231,
                        "name": "self",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2206,
                        "src": "3935:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2232,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_ptr",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1992,
                      "src": "3935:9:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3922:22:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2234,
                  "nodeType": "ExpressionStatement",
                  "src": "3922:22:16"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2242,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2235,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2210,
                        "src": "3954:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2237,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberName": "_len",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1990,
                      "src": "3954:10:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2241,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 2238,
                        "name": "ptr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2216,
                        "src": "3967:3:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2239,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "3973:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2240,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "3973:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "3967:15:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3954:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2243,
                  "nodeType": "ExpressionStatement",
                  "src": "3954:28:16"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2250,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2244,
                      "name": "ptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2216,
                      "src": "3996:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2249,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2245,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "4003:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2246,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "4003:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2247,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2206,
                          "src": "4015:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2248,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "4015:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "4003:21:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3996:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 2277,
                    "nodeType": "Block",
                    "src": "4095:105:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2258,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4109:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2260,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_len",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1990,
                            "src": "4109:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2265,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2261,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2210,
                                "src": "4122:5:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2262,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4122:10:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2263,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2208,
                                "src": "4135:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2264,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4135:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "4122:24:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4109:37:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2267,
                        "nodeType": "ExpressionStatement",
                        "src": "4109:37:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2275,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2268,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4160:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2270,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_ptr",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1992,
                            "src": "4160:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2274,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2271,
                              "name": "ptr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2216,
                              "src": "4172:3:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2272,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2208,
                                "src": "4178:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2273,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "4178:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "4172:17:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4160:29:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2276,
                        "nodeType": "ExpressionStatement",
                        "src": "4160:29:16"
                      }
                    ]
                  },
                  "id": 2278,
                  "nodeType": "IfStatement",
                  "src": "3992:208:16",
                  "trueBody": {
                    "id": 2257,
                    "nodeType": "Block",
                    "src": "4026:63:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2255,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2251,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2206,
                              "src": "4065:4:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                "typeString": "struct Strings.slice memory"
                              }
                            },
                            "id": 2253,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_len",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1990,
                            "src": "4065:9:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2254,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4077:1:16",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4065:13:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2256,
                        "nodeType": "ExpressionStatement",
                        "src": "4065:13:16"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2279,
                    "name": "token",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2210,
                    "src": "4216:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "functionReturnParameters": 2214,
                  "id": 2280,
                  "nodeType": "Return",
                  "src": "4209:12:16"
                }
              ]
            },
            "documentation": null,
            "id": 2282,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "split",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2211,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2206,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3739:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2205,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3739:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2208,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3758:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2207,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3758:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2210,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3779:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2209,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3779:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3738:60:16"
            },
            "returnParameters": {
              "id": 2214,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2213,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 2282,
                  "src": "3822:12:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2212,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "3822:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3821:14:16"
            },
            "scope": 2358,
            "src": "3724:504:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2297,
              "nodeType": "Block",
              "src": "4797:43:16",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2292,
                        "name": "self",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2284,
                        "src": "4813:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2293,
                        "name": "needle",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2286,
                        "src": "4819:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2294,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2289,
                        "src": "4827:5:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        },
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        },
                        {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      ],
                      "id": 2291,
                      "name": "split",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        2282,
                        2298
                      ],
                      "referencedDeclaration": 2282,
                      "src": "4807:5:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_struct$_slice_$1993_memory_ptr_$_t_struct$_slice_$1993_memory_ptr_$_t_struct$_slice_$1993_memory_ptr_$returns$_t_struct$_slice_$1993_memory_ptr_$",
                        "typeString": "function (struct Strings.slice memory,struct Strings.slice memory,struct Strings.slice memory) pure returns (struct Strings.slice memory)"
                      }
                    },
                    "id": 2295,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4807:26:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                      "typeString": "struct Strings.slice memory"
                    }
                  },
                  "id": 2296,
                  "nodeType": "ExpressionStatement",
                  "src": "4807:26:16"
                }
              ]
            },
            "documentation": null,
            "id": 2298,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "split",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2287,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2284,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4714:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2283,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4714:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2286,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4733:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2285,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4733:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4713:40:16"
            },
            "returnParameters": {
              "id": 2290,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2289,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 2298,
                  "src": "4777:18:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2288,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "4777:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4776:20:16"
            },
            "scope": 2358,
            "src": "4699:141:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2356,
              "nodeType": "Block",
              "src": "5197:276:16",
              "statements": [
                {
                  "assignments": [
                    2308
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2308,
                      "name": "ptr",
                      "nodeType": "VariableDeclaration",
                      "scope": 2356,
                      "src": "5207:8:16",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2307,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "5207:4:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2322,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2321,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2310,
                            "name": "self",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2300,
                            "src": "5226:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2311,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_len",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1990,
                          "src": "5226:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2312,
                            "name": "self",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2300,
                            "src": "5237:4:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2313,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_ptr",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1992,
                          "src": "5237:9:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2314,
                            "name": "needle",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2302,
                            "src": "5248:6:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2315,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_len",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1990,
                          "src": "5248:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2316,
                            "name": "needle",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2302,
                            "src": "5261:6:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                              "typeString": "struct Strings.slice memory"
                            }
                          },
                          "id": 2317,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_ptr",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1992,
                          "src": "5261:11:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 2309,
                        "name": "findPtr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2204,
                        "src": "5218:7:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 2318,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5218:55:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2319,
                        "name": "needle",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2302,
                        "src": "5276:6:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                          "typeString": "struct Strings.slice memory"
                        }
                      },
                      "id": 2320,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_len",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1990,
                      "src": "5276:11:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5218:69:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5207:80:16"
                },
                {
                  "body": {
                    "id": 2354,
                    "nodeType": "Block",
                    "src": "5334:133:16",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "++",
                          "prefix": false,
                          "src": "5348:5:16",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 2330,
                            "name": "cnt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2305,
                            "src": "5348:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2332,
                        "nodeType": "ExpressionStatement",
                        "src": "5348:5:16"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2352,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2333,
                            "name": "ptr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2308,
                            "src": "5367:3:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2351,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2342,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2335,
                                      "name": "self",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2300,
                                      "src": "5381:4:16",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                        "typeString": "struct Strings.slice memory"
                                      }
                                    },
                                    "id": 2336,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_len",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1990,
                                    "src": "5381:9:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2340,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2337,
                                          "name": "ptr",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2308,
                                          "src": "5394:3:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2338,
                                            "name": "self",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2300,
                                            "src": "5400:4:16",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                              "typeString": "struct Strings.slice memory"
                                            }
                                          },
                                          "id": 2339,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "_ptr",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1992,
                                          "src": "5400:9:16",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "5394:15:16",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 2341,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "5393:17:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "5381:29:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2343,
                                  "name": "ptr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2308,
                                  "src": "5412:3:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2344,
                                    "name": "needle",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2302,
                                    "src": "5417:6:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                      "typeString": "struct Strings.slice memory"
                                    }
                                  },
                                  "id": 2345,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_len",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1990,
                                  "src": "5417:11:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2346,
                                    "name": "needle",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2302,
                                    "src": "5430:6:16",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                      "typeString": "struct Strings.slice memory"
                                    }
                                  },
                                  "id": 2347,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_ptr",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1992,
                                  "src": "5430:11:16",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2334,
                                "name": "findPtr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2204,
                                "src": "5373:7:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 2348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5373:69:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2349,
                                "name": "needle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2302,
                                "src": "5445:6:16",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                                  "typeString": "struct Strings.slice memory"
                                }
                              },
                              "id": 2350,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_len",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1990,
                              "src": "5445:11:16",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "5373:83:16",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5367:89:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2353,
                        "nodeType": "ExpressionStatement",
                        "src": "5367:89:16"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2329,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2323,
                      "name": "ptr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2308,
                      "src": "5304:3:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 2328,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2324,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2300,
                          "src": "5311:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2325,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_ptr",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1992,
                        "src": "5311:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 2326,
                          "name": "self",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2300,
                          "src": "5323:4:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                            "typeString": "struct Strings.slice memory"
                          }
                        },
                        "id": 2327,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "_len",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1990,
                        "src": "5323:9:16",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "5311:21:16",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5304:28:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2355,
                  "nodeType": "WhileStatement",
                  "src": "5297:170:16"
                }
              ]
            },
            "documentation": null,
            "id": 2357,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "count",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 2303,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2300,
                  "name": "self",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5124:17:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2299,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "5124:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2302,
                  "name": "needle",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5143:19:16",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_slice_$1993_memory_ptr",
                    "typeString": "struct Strings.slice"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2301,
                    "name": "slice",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1993,
                    "src": "5143:5:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_slice_$1993_storage_ptr",
                      "typeString": "struct Strings.slice"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5123:40:16"
            },
            "returnParameters": {
              "id": 2306,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2305,
                  "name": "cnt",
                  "nodeType": "VariableDeclaration",
                  "scope": 2357,
                  "src": "5187:8:16",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2304,
                    "name": "uint",
                    "nodeType": "ElementaryTypeName",
                    "src": "5187:4:16",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5186:10:16"
            },
            "scope": 2358,
            "src": "5109:364:16",
            "stateMutability": "pure",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 2359,
        "src": "208:5267:16"
      }
    ],
    "src": "183:5293:16"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.10+commit.5a6ea5b1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.0.10",
  "updatedAt": "2019-07-03T18:04:40.098Z",
  "devdoc": {
    "methods": {}
  },
  "userdoc": {
    "methods": {}
  }
}