{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "dadf674b-c85d-46f5-b0fb-17f33a757e2c",
   "metadata": {},
   "source": [
    "# ISystemtap: An Interactive Systemtap Notebook\n",
    "<img src=\"https://sourceware.org/systemtap/smileytap.svg\"  width=\"100em\" height=\"100em\" style=\"float: left; padding: 1em\">\n",
    "<img src=\"https://cdn.pixabay.com/photo/2014/04/02/10/55/plus-304947_1280.png\"  width=\"30em\" height=\"30em\" style=\"float: left; padding-top: 3em\">\n",
    "<img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Jupyter_logo.svg/1200px-Jupyter_logo.svg.png\"  width=\"85em\" height=\"85em\" style=\"padding: 1em\">\n",
    "\n",
    "## Introduction\n",
    "Welcome the ISystemtap. We will first introduce the core concept of **cells** and **namespaces**.\n",
    "\n",
    "* **cell** : A single code block. These come in various forms, specified by the **magic** first line `%%foo`. To see all the magic commands use the `%%help` **magic**. Only one cell can be executed at one time.\n",
    "* **namespace** : A group of cells, joined under a common name. This name is specified as the optional first argument of the **magic** command\n",
    "\n",
    "We'll start with the 2 most important ISystemtap cells. The `%%edit` cell which contains Systemtap script blocks and the `%%run` cell which combines and runs the blocks.\n",
    "To get started execute (`Ctrl-Enter`) the *helloworld* cells and the *global* cells"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "44aa1812-c82e-43ab-95fc-21830ac04462",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%edit helloworld\n",
    "probe oneshot{\n",
    "  printf(\"Hello ISystemtap\\nI am in the namespace %s\\n\", module_name())\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2a814ed8-3a90-47ce-90af-e6f3894b5374",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%run helloworld"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0af7af41-6033-44f0-a808-38d7603d9c25",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%edit\n",
    "global s = \"If a namespace is not specified I am in the\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3e109555-9608-46d2-9053-887e1de741d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%edit\n",
    "probe oneshot{\n",
    "  printf(\"%s %s namespace\\n\", s, module_name())\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "145d683d-d5cf-4ed9-be31-6c86efbb10d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%run"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9eeca457-2457-4fc5-afda-765ee0ff1c51",
   "metadata": {},
   "source": [
    "## Basic Controls\n",
    "Now we will investigate the basic controls of ISystemtap.\n",
    "\n",
    "Run the *controls* namespace and try starting and pausing the entire namespace as well as individual probes. You can also reset globals back to their initial values\n",
    "\n",
    "When you are done you can stop the namespace by clicking the Stop button or typing `I, I` into the cell input while in command mode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "12b64d69-550f-4dcc-9580-b88190dc8261",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%edit controls\n",
    "global t = 0\n",
    "probe timer.s(1) {\n",
    "  t++\n",
    "  printf(\"I have counted up to %d\\n\", t)\n",
    "}\n",
    "\n",
    "probe end {\n",
    "  printf(\"I have completed\\n\")\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a6e756e-70c2-4460-8132-bb141a0fc908",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%run controls"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78f98a74-79db-4828-ac78-e4e830527e6c",
   "metadata": {},
   "source": [
    "## Globals\n",
    "Now let's discuss the *Globals* tab in more detail and introduce a new cell type, the  `%%python` cell.\n",
    "\n",
    "We'll demonstrate this using one of the Systemtap example scripts: alias_suffixes.stp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4b9cf993-9090-4f3e-b9c0-62a988e7fab7",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%edit globals\n",
    "# Uses alias suffixes to track time intervals for a subset of kernel\n",
    "# functions. Based on func_time_stats.stp.\n",
    "\n",
    "global start, intervals\n",
    "\n",
    "# We can apply a suffix to multiple probe points designated by one alias:\n",
    "probe miscellany = syscall.{open,close,read,write} { }\n",
    "\n",
    "probe miscellany {\n",
    "      start[name, tid()] = gettimeofday_us()\n",
    "}\n",
    "\n",
    "# The 'return' suffix is passed on to each of the underlying probe points:\n",
    "probe miscellany.return {\n",
    "      t = gettimeofday_us()\n",
    "      if([name, tid()] in start) old_t = start[name, tid()]\n",
    "      if (old_t) intervals[name] <<< t - old_t\n",
    "      delete start[name, tid()]\n",
    "}\n",
    "\n",
    "probe begin {\n",
    "      printf(\"Collecting data... click Stop to end\\n\")\n",
    "}\n",
    "\n",
    "probe end {\n",
    "      foreach (name in intervals) {\n",
    "              printf(\"intervals for %s -- min:%dus avg:%dus max:%dus count:%d\\n\",\n",
    "                     name, @min(intervals[name]), @avg(intervals[name]),\n",
    "                     @max(intervals[name]), @count(intervals[name]))\n",
    "              print(@hist_log(intervals[name]))\n",
    "      }\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a3860fb5-a5c1-4823-b0d7-42e8ba85b789",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%run globals -g --suppress-time-limits --suppress-handler-errors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69a609f0-929b-45c4-a7f2-b46c888ba075",
   "metadata": {
    "tags": []
   },
   "source": [
    "As you can see the recorded globals are all visible under the *Globals* tab.\n",
    "\n",
    "The `%%python` cell has access to all of these globals. I'll use them to generate a new plot using bqplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3cab19cf-8cac-4fe5-8298-cc6d6ccd9a0f",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%python globals\n",
    "from bqplot import *\n",
    "import bqplot.pyplot as plt\n",
    "# We can access the globals\n",
    "print(start)\n",
    "print(intervals['write']['@avg'])\n",
    "\n",
    "# The bar labels and corresponding heights\n",
    "labels  = [syscall for syscall in intervals.keys()]\n",
    "counts  = [stats['@count'] for stats in intervals.values()]\n",
    "\n",
    "scale_x = OrdinalScale()\n",
    "scale_y = LinearScale()\n",
    "fig = plt.figure(\n",
    "    title=\"Total Hits\",\n",
    "    title_style={\"font-size\": \"2em\", \"fill\": \"red\"},\n",
    ")\n",
    "def_tt = Tooltip(fields=['x', 'y'], labels = ['Syscall','Hits'])\n",
    "bar = plt.bar(x = labels, y = counts,\n",
    "                scales = {'x': scale_x, \"y\": scale_y},\n",
    "                colors = ['red'], stroke = 'white', stroke_width=0.4,\n",
    "                tooltip = def_tt)\n",
    "# This is how we display plots using ISystemtap\n",
    "display(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9702396c-3b6f-4d38-83a9-804e59c76d1b",
   "metadata": {},
   "source": [
    "## Examples and Probe Listing\n",
    "Now we'll discuss the `%%examples` cell. This cell can search through, preview and run the Systemtap examples\n",
    "\n",
    "Try out the `regex.stp` script with the argument \n",
    "\n",
    "functioncallcount.stp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "79e42092-8008-4192-b4b5-6603a70d10b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%examples"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05fab6f1-7eb3-43a3-8162-425132978b9d",
   "metadata": {},
   "source": [
    "We also have the `%%probes` cell. This cell can list availible probes and their context variables\n",
    "\n",
    "Try listing `process.*`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9dd49171-9b3d-4a5d-8187-3719a1dec0bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "%%probes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8701f5ed-5b3b-4c19-a4d1-16f003dea0df",
   "metadata": {},
   "source": [
    "## Writing our own scripts\n",
    "Finally we'll discuss the `%%script` cell which is just a combination of the `%%edit` and `%%run` cells, Like `%%run` cells, `%%script` cells can take regular systemtap options, but `%%script`s can also take arguments (with the `--args=(a,b,c)` flag)\n",
    "\n",
    "Let's try and write our own script, and take advantage of the **Systemtap Language Server** which allows for `tab` completion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88542b19-c19f-4ca3-b6cf-c202e345d001",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "%%script my_own_script -v -g --suppress-time-limits --suppress-handler-errors --args(10)\n",
    "/*\n",
    "* Write a script which prints \"Hello World\" at the start\n",
    "* Then after 10 seconds, prints a histogram for the top 4 most used systemcalls\n",
    "*/\n",
    "\n",
    "# TODO: Define a global called word1\n",
    "gl word1 = \"Hello\"\n",
    "# ^\n",
    "\n",
    "global word2 = \"World\"\n",
    "\n",
    "probe begin {\n",
    "  # TODO: Complete the second argument to word2\n",
    "  printf(\"%s %s\\n\", word1, wo)\n",
    "  #                          ^\n",
    "}\n",
    "\n",
    "global runtime = 1\n",
    "# TODO: Complete the probe point to timer.s(1)\n",
    "probe tim{\n",
    "#        ^\n",
    "  runtime++\n",
    "  printf(\"%d seconds left\\n\", $1 - runtime)\n",
    "  if(runtime >= $1){\n",
    "    exit()\n",
    "  }\n",
    "}\n",
    "\n",
    "global syscall_counts\n",
    "# TODO: Complete the process path to \"/bin/python\"\n",
    "probe process(\"/bin/pyth\").syscall{\n",
    "#                       ^\n",
    "  if(execname() == \"jupyter-lab\"){\n",
    "    # TODO: Complete the context variable to $syscall\n",
    "    syscall_counts[syscall_name($sys)] <<< 1\n",
    "    #                               ^\n",
    "  }\n",
    "}\n",
    "\n",
    "probe end {\n",
    "  # Iterate over the processeses\n",
    "  foreach (syscall in syscall_counts- limit 4) {\n",
    "    # TODO: Complete the macro to @hist_linear\n",
    "    print(@(syscall_counts[syscall], 1, 1, 1))\n",
    "    #      ^\n",
    "  }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b00de04-75db-4dd7-9f4f-6487d25ce046",
   "metadata": {},
   "source": [
    "For more information on availible Systemtap functions, probes and tapsets take a look at the corresponding man pages. These can be accessed as follows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc0846a8-9be8-4985-90aa-8a403b9e7c82",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "!man function::module_name\n",
    "!echo ------------------------------------------------------------------------------\n",
    "!man tapset::dentry"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ISystemtap",
   "language": "systemtap",
   "name": "isystemtap"
  },
  "language_info": {
   "codemirror_mode": "systemtap",
   "file_extension": ".stp",
   "mimetype": "text/x-systemtap",
   "name": "systemtap"
  },
  "toc-autonumbering": false,
  "toc-showcode": false,
  "toc-showmarkdowntxt": false,
  "toc-showtags": false,
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "00bc93a4a07045a2a5878c14f4c704d8": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "TextModel",
      "state": {
       "description": "stdin>",
       "disabled": true,
       "layout": "IPY_MODEL_564d942a26124d9ead7828b639d30d40",
       "style": "IPY_MODEL_b6ccf94e55a54536b336cc26d69188ff"
      }
     },
     "025423bcf410487da647213afd6d8ed9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "0c9d82393cc74da3ad6b619ff2e07e67": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "1be39da724bb4088af6834588fd53861": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "236eddc370d44449b13dc449f8cca4ff": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "23a82c7e6e0e474ba74717b2aae90bdb": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e6663f2fb82e46fd976420fd676044b6",
        "IPY_MODEL_9ac12d04689d464b83c06e310a48dbb4",
        "IPY_MODEL_98da00dafc2a47f7aa88e28ca96db9ec"
       ],
       "layout": "IPY_MODEL_558c3bc3db4f4b4eaae8c4226af44cbd"
      }
     },
     "25a88d918394446ebb7191863e6516be": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "28845e2c01cf41d69c2612ca4757581f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "301b507d8a80485b9a67df78cdd82607": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "3138620b4e5d48c1a2434eeaf5058cad": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "37c335910f154a35a29da06b1306a4f9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_960bcd05fc7c4b41a4dd073d44f93a97",
        "IPY_MODEL_7f718a08f6b847aaaeed4b36d4c4172e"
       ],
       "layout": "IPY_MODEL_81b1e50b6f6c451ab791da96b3eeda1b"
      }
     },
     "437e3c09999c439981d95171ee6e8f1e": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_25a88d918394446ebb7191863e6516be"
      }
     },
     "4b37e61c18784011ad4652041db65460": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "LabelStyleModel",
      "state": {
       "description_width": "",
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "558c3bc3db4f4b4eaae8c4226af44cbd": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "564d942a26124d9ead7828b639d30d40": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "59d33233dcce4957b8e1df5377ff3419": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "68f7c943396c430c9e958c10104deccc": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "7f3a9125baea4e9680b680b81abd66ec": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "GridBoxModel",
      "state": {
       "layout": "IPY_MODEL_acf5ad72376644ad875836b3ea0c3d1b"
      }
     },
     "7f718a08f6b847aaaeed4b36d4c4172e": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_236eddc370d44449b13dc449f8cca4ff",
       "style": "IPY_MODEL_4b37e61c18784011ad4652041db65460",
       "value": "Memory: 0data/0text/0ctx/0net/0alloc KB"
      }
     },
     "81b1e50b6f6c451ab791da96b3eeda1b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "960bcd05fc7c4b41a4dd073d44f93a97": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "LabelModel",
      "state": {
       "layout": "IPY_MODEL_0c9d82393cc74da3ad6b619ff2e07e67",
       "style": "IPY_MODEL_f18256cebcb94bf496b59c92e37dffca",
       "value": "Uptime: 00:00:00"
      }
     },
     "98da00dafc2a47f7aa88e28ca96db9ec": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "danger",
       "disabled": true,
       "icon": "stop",
       "layout": "IPY_MODEL_28845e2c01cf41d69c2612ca4757581f",
       "style": "IPY_MODEL_1be39da724bb4088af6834588fd53861",
       "tooltip": "Quit script"
      }
     },
     "9ac12d04689d464b83c06e310a48dbb4": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "info",
       "disabled": true,
       "icon": "rotate-left",
       "layout": "IPY_MODEL_68f7c943396c430c9e958c10104deccc",
       "style": "IPY_MODEL_59d33233dcce4957b8e1df5377ff3419",
       "tooltip": "Reset all global variables to their initial states"
      }
     },
     "acf5ad72376644ad875836b3ea0c3d1b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_columns": "5ch 1fr 1fr 1fr 1fr 1fr"
      }
     },
     "b6ccf94e55a54536b336cc26d69188ff": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "TextStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "bd7a79ebefa94140867ecbc782aabe63": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_37c335910f154a35a29da06b1306a4f9",
        "IPY_MODEL_23a82c7e6e0e474ba74717b2aae90bdb",
        "IPY_MODEL_00bc93a4a07045a2a5878c14f4c704d8"
       ],
       "layout": "IPY_MODEL_025423bcf410487da647213afd6d8ed9"
      }
     },
     "bdfb3a020e94485699633db069724423": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "TabModel",
      "state": {
       "_view_count": 1,
       "children": [
        "IPY_MODEL_bd7a79ebefa94140867ecbc782aabe63",
        "IPY_MODEL_437e3c09999c439981d95171ee6e8f1e",
        "IPY_MODEL_7f3a9125baea4e9680b680b81abd66ec"
       ],
       "layout": "IPY_MODEL_301b507d8a80485b9a67df78cdd82607",
       "selected_index": 0,
       "titles": [
        "Controls",
        "Globals",
        "Probes"
       ]
      }
     },
     "c311ef8edc4c4b17a3da1cb6034e8509": {
      "model_module": "ipyevents",
      "model_module_version": "2.0.1",
      "model_name": "EventModel",
      "state": {
       "_supported_key_events": [
        "keydown",
        "keyup"
       ],
       "_supported_mouse_events": [
        "click",
        "auxclick",
        "dblclick",
        "mouseenter",
        "mouseleave",
        "mousedown",
        "mouseup",
        "mousemove",
        "wheel",
        "contextmenu",
        "dragstart",
        "drag",
        "dragend",
        "dragenter",
        "dragover",
        "dragleave",
        "drop"
       ],
       "_supported_touch_events": [
        "touchstart",
        "touchend",
        "touchmove",
        "touchcancel"
       ],
       "_view_module": "@jupyter-widgets/controls",
       "source": "IPY_MODEL_bdfb3a020e94485699633db069724423",
       "throttle_or_debounce": "",
       "watched_events": [
        "keydown",
        "click"
       ],
       "xy_coordinate_system": ""
      }
     },
     "e6663f2fb82e46fd976420fd676044b6": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "info",
       "disabled": true,
       "icon": "pause",
       "layout": "IPY_MODEL_fb02cb78989e41b7bc6289451df7e639",
       "style": "IPY_MODEL_3138620b4e5d48c1a2434eeaf5058cad",
       "tooltip": "Pause/resume script by toggling off/on all probes"
      }
     },
     "f18256cebcb94bf496b59c92e37dffca": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "LabelStyleModel",
      "state": {
       "description_width": "",
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "fb02cb78989e41b7bc6289451df7e639": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
