[
  {
    "path": ".eslintignore",
    "content": "node_modules\ndist\ncoverage\n**/*.d.ts\ntest\n_temp_extension\nbabel.config.ts\njest.config.ts\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  extends: [\n    'eslint:recommended',\n    'plugin:@typescript-eslint/eslint-recommended',\n    'plugin:@typescript-eslint/recommended',\n    'plugin:prettier/recommended',\n    'plugin:react/recommended'\n  ],\n  settings: {\n    react: {\n      createClass: \"createReactClass\", // Regex for Component Factory to use,\n                                         // default to \"createReactClass\"\n      pragma: \"React\",  // Pragma to use, default to \"React\"\n      fragment: \"Fragment\",  // Fragment to use (may be a property of <pragma>), default to \"Fragment\"\n      version: \"detect\", // React version. \"detect\" automatically picks the version you have installed.\n                           // You can also use `16.0`, `16.3`, etc, if you want to override the detected value.\n                           // default to latest and warns if missing\n                           // It will default to \"detect\" in the future\n      flowVersion: \"0.53\" // Flow version\n    }\n  },\n  parser: '@typescript-eslint/parser',\n  parserOptions: {\n    project: 'tsconfig.json',\n    sourceType: 'module'\n  },\n  plugins: ['@typescript-eslint', 'react'],\n  rules: {\n    '@typescript-eslint/camelcase': 'off',\n    '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }],\n    '@typescript-eslint/no-explicit-any': 'off',\n    '@typescript-eslint/no-namespace': 'off',\n    '@typescript-eslint/no-use-before-define': 'off',\n    '@typescript-eslint/no-control-regex': 'off',\n    '@typescript-eslint/quotes': [\n      'error',\n      'single',\n      { avoidEscape: true, allowTemplateLiterals: false }\n    ],\n    curly: ['error', 'all'],\n    eqeqeq: 'error',\n    'prefer-arrow-callback': 'error'\n  },\n  ignorePatterns: ['.eslintrc.js']\n};\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  push:\n    branches: master\n  pull_request:\n    branches: '*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v2\n    - name: Install node\n      uses: actions/setup-node@v2\n      with:\n       node-version: '16.x'\n    - name: Install Python\n      uses: actions/setup-python@v2\n      with:\n        python-version: '3.7'\n        architecture: 'x64'\n    - name: Install dependencies\n      run: python -m pip install jupyterlab\n    - name: Build the extension\n      run: |\n        jlpm\n        jlpm run eslint:check\n        python -m pip install .\n\n        python -m jupyterlab.browser_check\n"
  },
  {
    "path": ".gitignore",
    "content": "*.bundle.*\nlib/\nnode_modules/\n*.egg-info/\n.ipynb_checkpoints\n*.tsbuildinfo\n*.ipynb\n.eslintcache\nsnippets/\ndist/\n\n*/labextension/*.tgz\n# Created by https://www.gitignore.io/api/python\n# Edit at https://www.gitignore.io/?templates=python\n\n### Python ###\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# Mr Developer\n.mr.developer.cfg\n.project\n.pydevproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n.DS_Store\n\n# End of https://www.gitignore.io/api/python\n\n\n# Jupyter Stuff\n_temp_extension/\nyarn.lock"
  },
  {
    "path": ".husky/.gitignore",
    "content": "_\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx --no-install lint-staged\njlpm lint-staged"
  },
  {
    "path": ".prettierignore",
    "content": "node_modules\n**/node_modules\n**/lib\n**/package.json\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"chrome\",\n            \"request\": \"launch\",\n            \"name\": \"Launch Chrome against localhost\",\n            \"url\": \"http://localhost:8080\",\n            \"webRoot\": \"${workspaceFolder}\"\n        }\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"workbench.colorCustomizations\": {\n        \"activityBar.activeBackground\": \"#1f6fd0\",\n        \"activityBar.background\": \"#1f6fd0\",\n        \"activityBar.foreground\": \"#e7e7e7\",\n        \"activityBar.inactiveForeground\": \"#e7e7e799\",\n        \"activityBarBadge.background\": \"#ee90bb\",\n        \"activityBarBadge.foreground\": \"#15202b\",\n        \"commandCenter.border\": \"#e7e7e799\",\n        \"sash.hoverBorder\": \"#1f6fd0\",\n        \"statusBar.background\": \"#1857a4\",\n        \"statusBar.foreground\": \"#e7e7e7\",\n        \"statusBarItem.hoverBackground\": \"#1f6fd0\",\n        \"statusBarItem.remoteBackground\": \"#1857a4\",\n        \"statusBarItem.remoteForeground\": \"#e7e7e7\",\n        \"titleBar.activeBackground\": \"#1857a4\",\n        \"titleBar.activeForeground\": \"#e7e7e7\",\n        \"titleBar.inactiveBackground\": \"#1857a499\",\n        \"titleBar.inactiveForeground\": \"#e7e7e799\"\n    },\n    \"peacock.remoteColor\": \"#1857a4\"\n}"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2020, jupytercalpoly\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n-----------------------------------------------------------------------------------------------------------------\nSome lines of code in this extension are from Elyra's code snippet extension (https://github.com/elyra-ai/elyra).\n-----------------------------------------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include LICENSE\ninclude README.md\ninclude pyproject.toml\ninclude install.json\n\ninclude package.json\ninclude ts*.json\ngraft jupyterlab-code-snippets/labextension\n\n# Javascript files\ngraft src\ngraft style\nprune **/node_modules\nprune lib\n\n# Patterns to exclude from any directory\nglobal-exclude *~\nglobal-exclude *.pyc\nglobal-exclude *.pyo\nglobal-exclude .git\nglobal-exclude .ipynb_checkpoints\n"
  },
  {
    "path": "PRESSRELEASE.md",
    "content": "# **JupyterLab Code Snippets**\n\n## **JupyterLab Code Snippets empowers you to write code more rapidly**\n\nDo you find yourself typing in the same code blocks over and over again? Are you tired of clicking through tabs online for starter code or browsing old notebook files to find the right import statements? Save, reuse, and share code snippets using JupyterLab Code Snippets! In the past, you would spend more time scouring the internet than actually working. Searching old code for snippets is like searching for your lost keys; it’s frustrating!\n\nJupyterLab Code Snippets allows you to create and store code snippets that can be inserted into any JupyterLab workspace and save you from the hassle of typing repetitive code. Code snippets are pieces of code or individual cells that are frequently used. Simply browse or search snippets in the Snippets panel to use wherever you need in JupyterLab.\n\nUsing JupyterLab code snippets is easy! Simply open the snippet explorer and browse through the provided predefined code snippets. Still can’t find what you need? Simply highlight code and right-click to save as a snippet or drag cells into the panel. Find snippets by utilizing the search, filter, and preview features. For a fresh start, select the plus icon in the snippet panel to construct a completely new, custom snippet. Also, edit your snippet quickly at any time by clicking the edit icon on the snippet. To use your snippets, you can drag and drop a code snippet to insert it as a cell or press the insert icon on the snippet to inject the code where your cursor is located within the JupyterLab workspace.\n\n*“I’ve grown accustomed to opening an old notebook and searching through it in order to find the necessary import statements every time I start a new project. But, with the JupyterLab Code Snippets extension, I saved a lot of time by storing them as snippets and inserting them directly into my workflow.” - amazed customer*\n\nThis new extension unlocks the exciting ability to seamlessly incorporate code snippets. You can now store the frequently used code as a snippet and use it quickly. Save time, save energy, and get down to business with JupyterLab Code Snippets!\n"
  },
  {
    "path": "PROGRESS.md",
    "content": "# Log of Features and Updates\n\n## Feature List\n\n- [x] Scrollable snippet panel displaying snippets\n- [x] Right click and save highlighted code (lines of code)\n- [x] Copy snippet\n- [x] Delete snippet\n- [x] Insert snippet\n- [x] Drag cell into panel to save (lines of code)\n- [x] Search bar for snippets\n- [x] Snippet preview (on the side)\n- [x] Drag snippet into notebook\n- [x] Move snippet within snippet explorer\n- [x] Filters on snippet panel\n- [x] Code snippet editor\n- [x] Plus button to create new snippet\n- [x] Multi-cell Saving\n\n## Future development\n- [ ] Tab completion\n- [ ] Templated Fields\n- [ ] Color Code Tags\n\n## Demo 3 (Aug 25)\n- Design review\n- Usability tests\n- Minimap preview\n- Removing extra icons\n- Filter with cell tags\n- Code snippet editor\n- ‘+’ create snippets\n- Design refinements\n\n## Demo 2 (Aug 5)\n- Search ability\n  - search by name/language\n  - search bolding\n- Snippet preview\n  - editing mode\n  - snippet description\n- Drag and drop\n  - drag snippet into notebook - create new cell\n- Undo/redo functionality\n  \n## Log of Changes/Progress\n\n### 7/20/2020 - 7/24/2020:\n\n- Improve drag and drop cell onto snippet panel interface.\n- Improve code snippet preview\n\n### 7/13/2020 - 7/17/2020:\n\n- Create preview of snippets\n- Add bookmark User Interface\n\n### 7/6/2020 - 7/10/2020:\n\n- Add predefined snippets\n- Copy button to the clipboard\n- Delete Snippets\n- Search snippets by name\n- Allow user to scroll through snippets\n\n\n### 6/29/2020 - 7/3/2020:\n\n- Implement right click Notebook operation to save highlighted code as snippet.\n- Look at/use Elyra side panel code to display snippets\n  Preview snippets (double click or hover-scroll)\n  \n### 6/22/2020 - 6/26/2020:\n\n- Set up repos\n- Research JupyterLab and Elyra codebase\n"
  },
  {
    "path": "README.md",
    "content": "# JupyterLab Code Snippet\n\n## Save, reuse, and share code snippets using JupyterLab Code Snippets\n\n![Github Actions Status](https://github.com/jupytercalpoly/jupyterlab-code-snippets/workflows/Build/badge.svg) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupytercalpoly/jupyterlab-code-snippets.git/master?urlpath=lab) [![npm version](https://badge.fury.io/js/jupyterlab-code-snippets.svg)](https://badge.fury.io/js/jupyterlab-code-snippets 'View this project on npm') [![PyPI version](https://badge.fury.io/py/jupyterlab-code-snippets.svg)](https://badge.fury.io/py/jupyterlab-code-snippets) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/jupyterlab-code-snippets.svg)](https://anaconda.org/conda-forge/jupyterlab-code-snippets) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Documentation Status](https://readthedocs.org/projects/jupyterlab-code-snippets-documentation/badge/?version=latest)](https://jupyterlab-code-snippets-documentation.readthedocs.io/en/latest/?badge=latest)\n\nThis extension is a derivative of [Elyra](https://github.com/elyra-ai/elyra)'s original design and further developed by Jupyter Cal Poly Team.\n\nRead [Press Release](./PRESSRELEASE.md) for more information.\n\nCheck out [the Current Progress](./PROGRESS.md) to keep up with our feature updates!\n\nThis extension is composed of a NPM package named `jupyterlab-code-snippets`\nfor the frontend extension.\n\n![Alt Text](Design/overview.gif)\n\n## Requirements\n\n- JupyterLab >= 3.5.3\n- Python >= 3.7\n\n## Install\n\nInstall using jupyter:\n\n```bash\njupyter labextension install jupyterlab-code-snippets\n```\n\nInstall using pip:\n\n```bash\npip install jupyterlab-code-snippets\n```\n\n```bash\nconda install -c conda-forge jupyterlab-code-snippets\n```\n\n## Troubleshoot\n\nIf it is installed, try:\n\n```bash\njupyter lab clean\njupyter lab build\n```\n\n## Contributing\n\n### Install\n\nThe `jlpm` command is JupyterLab's pinned version of\n[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use\n`yarn` or `npm` in lieu of `jlpm` below.\n\n```bash\n# Clone the repo to your local environment\n# Move to jupyter-lab-code-snippets directory\n\n# Install dependencies\njlpm\n# Build Typescript source\njlpm build\n# Link your development version of the extension with JupyterLab\njupyter labextension install .\n# Rebuild Typescript source after making changes\njlpm build\n# Rebuild JupyterLab after making any changes\njupyter lab build\n```\n\nYou can watch the source directory and run JupyterLab in watch mode to watch for changes in the extension's source and automatically rebuild the extension and application.\n\n```bash\n# Watch the source directory in another terminal tab\njlpm watch\n# Run jupyterlab in watch mode in one terminal tab\njupyter lab --watch\n```\n\nNow every change will be built locally and bundled into JupyterLab. Be sure to refresh your browser page after saving file changes to reload the extension (note: you'll need to wait for webpack to finish, which can take 10s+ at times).\n\n### Uninstall\n\n```bash\njupyter labextension uninstall jupyterlab-code-snippets\n```\n\nOR\n\n```bash\npip uninstall jupyterlab-code-snippets\n```\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = require('@jupyterlab/testutils/lib/babel.config');\n// module.exports = {\n//   presets: [\n//     [\n//       '@babel/preset-env',\n//       {\n//         targets: {\n//           node: 'current'\n//         }\n//       }\n//     ], '@babel/preset-react'\n//   ]\n// };\n"
  },
  {
    "path": "binder/environment.yml",
    "content": "# a mybinder.org-ready environment for demoing code_snippet\n# this environment may also be used locally on Linux/MacOS/Windows, e.g.\n#\n#   conda env update --file binder/environment.yml\n#   conda activate code_snippet-demo\n#\nname: code_snippet-demo\n\nchannels:\n  - conda-forge\n\ndependencies:\n  # runtime dependencies\n  - python >=3.8,<3.9.0a0\n  - jupyterlab >=3,<4.0.0a0\n  # labextension build dependencies\n  - nodejs >=14,<15\n  - pip\n  - wheel\n  # additional packages for demos\n  # - ipywidgets\n"
  },
  {
    "path": "binder/postBuild",
    "content": "#!/usr/bin/env python3\n\"\"\" perform a development install of code_snippet\n\n    On Binder, this will run _after_ the environment has been fully created from\n    the environment.yml in this directory.\n\n    This script should also run locally on Linux/MacOS/Windows:\n\n        python3 binder/postBuild\n\"\"\"\nimport subprocess\nimport sys\nfrom pathlib import Path\n\n\nROOT = Path.cwd()\n\nprint(\"Current Working dir:\", ROOT)\n\ndef _(*args, **kwargs):\n    \"\"\" Run a command, echoing the args\n\n        fails hard if something goes wrong\n    \"\"\"\n    print(\"\\n\\t\", \" \".join(args), \"\\n\")\n    return_code = subprocess.call(args, **kwargs)\n    if return_code != 0:\n        print(\"\\nERROR\", return_code, \" \".join(args))\n        sys.exit(return_code)\n\n# verify the environment is self-consistent before even starting\n# _(sys.executable, \"-m\", \"pip\", \"check\")\n\n# install the labextension\n_(sys.executable, \"-m\", \"pip\", \"install\", \"-e\", \".\")\n\n# verify the environment the extension didn't break anything\n# _(sys.executable, \"-m\", \"pip\", \"check\")\n\n# list the extensions\n# _(\"jupyter\", \"server\", \"extension\", \"list\")\n\n# initially list installed extensions to determine if there are any surprises\n# _(\"jupyter\", \"labextension\", \"list\")\n\nprint(\"JupyterLab with code_snippet is ready to run with:\\n\")\nprint(\"\\tjupyter lab\\n\")\n\n# remove unnecessary directories when using the binder\n_('rm', '-rf', './lib')\n_('rm', '-rf', './src')\n_('rm', '-rf', './style')\n_('rm', '-rf', './_temp_extension')\n_('rm', '-rf', './Design')\n_('rm', '-rf', './binder')\n_('rm', '-rf', './docs')\n_('rm', '-rf', './code_snippet')\n_('rm', '-rf', './code_snippet.egg-info')\n_('rm', '-rf', './schema')\n_('rm', '-rf', './node_modules')\n_('rm', '-rf', './coverage')\n_('rm', '-rf', './test')\n_('rm', '-rf', './testutils')\n_('rm', './install.json')\n_('rm', './package.json')\n_('rm', './PROGRESS.md')\n_('rm', './setup.py')\n_('rm', './pyproject.toml')\n_('rm', './tsconfig.json')\n_('rm', './tsconfig.test.json')\n_('rm', './babel.config.js')\n_('rm', './jest.config.js')\n_('rm', './tsconfig.tsbuildinfo')\n_('rm', './yarn.lock')\n_('rm', './MANIFEST.in')\n"
  },
  {
    "path": "binder/requirements.txt",
    "content": "jupyterlab>=3.0"
  },
  {
    "path": "binder/workspace.json",
    "content": "{\"data\":{\"layout-restorer:data\":{\"main\":{\"dock\":{\"type\":\"tab-area\",\"currentIndex\":1,\"widgets\":[\"notebook:Untitled.ipynb\"]},\"mode\":\"multiple-document\",\"current\":\"notebook:Untitled.ipynb\"},\"left\":{\"collapsed\":false,\"current\":\"code-snippet-extension\",\"widgets\":[\"filebrowser\",\"running-sessions\",\"command-palette\",\"jp-property-inspector\",\"tab-manager\",\"code-snippet-extension\",\"extensionmanager.main-view\"]},\"right\":{\"collapsed\":true,\"widgets\":[]}},\"file-browser-filebrowser:cwd\":{\"path\":\"\"},\"@jupyterlab/settingeditor-extension:plugin\":{\"sizes\":[0.09057971014492754,0.9094202898550725],\"container\":{\"plugin\":\"@jupyterlab/shortcuts-extension:shortcuts\",\"sizes\":[0.48376993166287013,0.5162300683371298]}},\"notebook:Untitled.ipynb\":{\"data\":{\"path\":\"Untitled.ipynb\",\"factory\":\"Notebook\"}}},\"metadata\":{\"id\":\"/lab\"}}\n"
  },
  {
    "path": "coverage/CodeSnippetContentsService.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetContentsService.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"index.html\">All files</a> CodeSnippetContentsService.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>24/24</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>2/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>6/6</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>24/24</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a>\n<a name='L46'></a><a href='#L46'>46</a>\n<a name='L47'></a><a href='#L47'>47</a>\n<a name='L48'></a><a href='#L48'>48</a>\n<a name='L49'></a><a href='#L49'>49</a>\n<a name='L50'></a><a href='#L50'>50</a>\n<a name='L51'></a><a href='#L51'>51</a>\n<a name='L52'></a><a href='#L52'>52</a>\n<a name='L53'></a><a href='#L53'>53</a>\n<a name='L54'></a><a href='#L54'>54</a>\n<a name='L55'></a><a href='#L55'>55</a>\n<a name='L56'></a><a href='#L56'>56</a>\n<a name='L57'></a><a href='#L57'>57</a>\n<a name='L58'></a><a href='#L58'>58</a>\n<a name='L59'></a><a href='#L59'>59</a>\n<a name='L60'></a><a href='#L60'>60</a>\n<a name='L61'></a><a href='#L61'>61</a>\n<a name='L62'></a><a href='#L62'>62</a>\n<a name='L63'></a><a href='#L63'>63</a>\n<a name='L64'></a><a href='#L64'>64</a>\n<a name='L65'></a><a href='#L65'>65</a>\n<a name='L66'></a><a href='#L66'>66</a>\n<a name='L67'></a><a href='#L67'>67</a>\n<a name='L68'></a><a href='#L68'>68</a>\n<a name='L69'></a><a href='#L69'>69</a>\n<a name='L70'></a><a href='#L70'>70</a>\n<a name='L71'></a><a href='#L71'>71</a>\n<a name='L72'></a><a href='#L72'>72</a>\n<a name='L73'></a><a href='#L73'>73</a>\n<a name='L74'></a><a href='#L74'>74</a>\n<a name='L75'></a><a href='#L75'>75</a>\n<a name='L76'></a><a href='#L76'>76</a>\n<a name='L77'></a><a href='#L77'>77</a>\n<a name='L78'></a><a href='#L78'>78</a>\n<a name='L79'></a><a href='#L79'>79</a>\n<a name='L80'></a><a href='#L80'>80</a>\n<a name='L81'></a><a href='#L81'>81</a>\n<a name='L82'></a><a href='#L82'>82</a>\n<a name='L83'></a><a href='#L83'>83</a>\n<a name='L84'></a><a href='#L84'>84</a>\n<a name='L85'></a><a href='#L85'>85</a>\n<a name='L86'></a><a href='#L86'>86</a>\n<a name='L87'></a><a href='#L87'>87</a>\n<a name='L88'></a><a href='#L88'>88</a>\n<a name='L89'></a><a href='#L89'>89</a>\n<a name='L90'></a><a href='#L90'>90</a>\n<a name='L91'></a><a href='#L91'>91</a>\n<a name='L92'></a><a href='#L92'>92</a>\n<a name='L93'></a><a href='#L93'>93</a>\n<a name='L94'></a><a href='#L94'>94</a>\n<a name='L95'></a><a href='#L95'>95</a>\n<a name='L96'></a><a href='#L96'>96</a>\n<a name='L97'></a><a href='#L97'>97</a>\n<a name='L98'></a><a href='#L98'>98</a>\n<a name='L99'></a><a href='#L99'>99</a>\n<a name='L100'></a><a href='#L100'>100</a>\n<a name='L101'></a><a href='#L101'>101</a>\n<a name='L102'></a><a href='#L102'>102</a>\n<a name='L103'></a><a href='#L103'>103</a>\n<a name='L104'></a><a href='#L104'>104</a>\n<a name='L105'></a><a href='#L105'>105</a>\n<a name='L106'></a><a href='#L106'>106</a>\n<a name='L107'></a><a href='#L107'>107</a>\n<a name='L108'></a><a href='#L108'>108</a>\n<a name='L109'></a><a href='#L109'>109</a>\n<a name='L110'></a><a href='#L110'>110</a>\n<a name='L111'></a><a href='#L111'>111</a>\n<a name='L112'></a><a href='#L112'>112</a>\n<a name='L113'></a><a href='#L113'>113</a>\n<a name='L114'></a><a href='#L114'>114</a>\n<a name='L115'></a><a href='#L115'>115</a>\n<a name='L116'></a><a href='#L116'>116</a>\n<a name='L117'></a><a href='#L117'>117</a>\n<a name='L118'></a><a href='#L118'>118</a>\n<a name='L119'></a><a href='#L119'>119</a>\n<a name='L120'></a><a href='#L120'>120</a>\n<a name='L121'></a><a href='#L121'>121</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import { ContentsManager, Drive, Contents } from '@jupyterlab/services';\n&nbsp;\nexport interface ICodeSnippet {\n  name: string;\n  description: string;\n  language: string;\n  // code separated by new line\n  code: string[];\n  id: number;\n  tags?: string[];\n}\n&nbsp;\n/**\n * Singleton contentsService class\n */\nexport class CodeSnippetContentsService {\n  drive: Drive;\n  contentsManager: ContentsManager;\n  private static instance: CodeSnippetContentsService;\n  private constructor() {\n    const drive = new Drive({ name: 'snippetDrive ' });\n    const contentsManager = new ContentsManager({ defaultDrive: drive });\n    this.drive = drive;\n    this.contentsManager = contentsManager;\n  }\n&nbsp;\n  static getInstance(): CodeSnippetContentsService {\n    if (!this.instance) {\n      this.instance = new CodeSnippetContentsService();\n    }\n    return this.instance;\n  }\n&nbsp;\n  /**\n   * Get the metadata information in the given path\n   * @param path path to a file/directory\n   */\n  async getData(\n    path: string,\n    type: Contents.ContentType\n  ): Promise&lt;Contents.IModel&gt; {\n    try {\n      const data = await this.contentsManager.get(path, {\n        type: type,\n        //   format: 'text',\n        content: true\n      });\n      return data;\n    } catch (error) {\n      return error;\n    }\n    // const data = await this.contentsManager.get(path, {\n    //   type: type,\n    //   //   format: 'text',\n    //   content: true\n    // });\n    // return data;\n  }\n&nbsp;\n  /**\n   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path\n   * @param path path to a file/directory\n   * @param options options that specify if it's a file or directory and additial information\n   * Usage: save('snippets', { type: 'directory' }) to create/save a directory\n   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})\n   */\n  async save(\n    path: string,\n    options?: Partial&lt;Contents.IModel&gt;\n  ): Promise&lt;Contents.IModel&gt; {\n    try {\n      const changedModel = await this.contentsManager.save(path, options);\n      return changedModel;\n    } catch (error) {\n      return error;\n    }\n  }\n&nbsp;\n  /**\n   * Change the order of snippets\n   * @param oldPath\n   * @param newPath\n   */\n&nbsp;\n  /**\n   * Rename the file or directory (not case sensitive)\n   * @param oldPath change from\n   * @param newPath change to\n   */\n  async rename(oldPath: string, newPath: string): Promise&lt;Contents.IModel&gt; {\n    try {\n      const changedModel = await this.contentsManager.rename(oldPath, newPath);\n      return changedModel;\n    } catch (error) {\n      return error;\n    }\n    // const changedModel = await this.contentsManager.rename(oldPath, newPath);\n    // return changedModel;\n  }\n&nbsp;\n  /**\n   * Delete the file/directory in the given path\n   * @param path path to a file/directory\n   */\n  async delete(path: string): Promise&lt;void&gt; {\n    try {\n      await this.contentsManager.delete(path);\n    } catch (error) {\n      return;\n    }\n  }\n&nbsp;\n  // async renameAndSave(\n  //   oldPath: string,\n  //   newPath: string\n  // ): Promise&lt;Contents.IModel&gt; {\n  //   this.rename(oldPath, newPath);\n  //   this.save(newPath);\n  // }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/CodeSnippetWidgetModel.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"index.html\">All files</a> CodeSnippetWidgetModel.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>46/46</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">88.89% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>16/18</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>14/14</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>42/42</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a>\n<a name='L46'></a><a href='#L46'>46</a>\n<a name='L47'></a><a href='#L47'>47</a>\n<a name='L48'></a><a href='#L48'>48</a>\n<a name='L49'></a><a href='#L49'>49</a>\n<a name='L50'></a><a href='#L50'>50</a>\n<a name='L51'></a><a href='#L51'>51</a>\n<a name='L52'></a><a href='#L52'>52</a>\n<a name='L53'></a><a href='#L53'>53</a>\n<a name='L54'></a><a href='#L54'>54</a>\n<a name='L55'></a><a href='#L55'>55</a>\n<a name='L56'></a><a href='#L56'>56</a>\n<a name='L57'></a><a href='#L57'>57</a>\n<a name='L58'></a><a href='#L58'>58</a>\n<a name='L59'></a><a href='#L59'>59</a>\n<a name='L60'></a><a href='#L60'>60</a>\n<a name='L61'></a><a href='#L61'>61</a>\n<a name='L62'></a><a href='#L62'>62</a>\n<a name='L63'></a><a href='#L63'>63</a>\n<a name='L64'></a><a href='#L64'>64</a>\n<a name='L65'></a><a href='#L65'>65</a>\n<a name='L66'></a><a href='#L66'>66</a>\n<a name='L67'></a><a href='#L67'>67</a>\n<a name='L68'></a><a href='#L68'>68</a>\n<a name='L69'></a><a href='#L69'>69</a>\n<a name='L70'></a><a href='#L70'>70</a>\n<a name='L71'></a><a href='#L71'>71</a>\n<a name='L72'></a><a href='#L72'>72</a>\n<a name='L73'></a><a href='#L73'>73</a>\n<a name='L74'></a><a href='#L74'>74</a>\n<a name='L75'></a><a href='#L75'>75</a>\n<a name='L76'></a><a href='#L76'>76</a>\n<a name='L77'></a><a href='#L77'>77</a>\n<a name='L78'></a><a href='#L78'>78</a>\n<a name='L79'></a><a href='#L79'>79</a>\n<a name='L80'></a><a href='#L80'>80</a>\n<a name='L81'></a><a href='#L81'>81</a>\n<a name='L82'></a><a href='#L82'>82</a>\n<a name='L83'></a><a href='#L83'>83</a>\n<a name='L84'></a><a href='#L84'>84</a>\n<a name='L85'></a><a href='#L85'>85</a>\n<a name='L86'></a><a href='#L86'>86</a>\n<a name='L87'></a><a href='#L87'>87</a>\n<a name='L88'></a><a href='#L88'>88</a>\n<a name='L89'></a><a href='#L89'>89</a>\n<a name='L90'></a><a href='#L90'>90</a>\n<a name='L91'></a><a href='#L91'>91</a>\n<a name='L92'></a><a href='#L92'>92</a>\n<a name='L93'></a><a href='#L93'>93</a>\n<a name='L94'></a><a href='#L94'>94</a>\n<a name='L95'></a><a href='#L95'>95</a>\n<a name='L96'></a><a href='#L96'>96</a>\n<a name='L97'></a><a href='#L97'>97</a>\n<a name='L98'></a><a href='#L98'>98</a>\n<a name='L99'></a><a href='#L99'>99</a>\n<a name='L100'></a><a href='#L100'>100</a>\n<a name='L101'></a><a href='#L101'>101</a>\n<a name='L102'></a><a href='#L102'>102</a>\n<a name='L103'></a><a href='#L103'>103</a>\n<a name='L104'></a><a href='#L104'>104</a>\n<a name='L105'></a><a href='#L105'>105</a>\n<a name='L106'></a><a href='#L106'>106</a>\n<a name='L107'></a><a href='#L107'>107</a>\n<a name='L108'></a><a href='#L108'>108</a>\n<a name='L109'></a><a href='#L109'>109</a>\n<a name='L110'></a><a href='#L110'>110</a>\n<a name='L111'></a><a href='#L111'>111</a>\n<a name='L112'></a><a href='#L112'>112</a>\n<a name='L113'></a><a href='#L113'>113</a>\n<a name='L114'></a><a href='#L114'>114</a>\n<a name='L115'></a><a href='#L115'>115</a>\n<a name='L116'></a><a href='#L116'>116</a>\n<a name='L117'></a><a href='#L117'>117</a>\n<a name='L118'></a><a href='#L118'>118</a>\n<a name='L119'></a><a href='#L119'>119</a>\n<a name='L120'></a><a href='#L120'>120</a>\n<a name='L121'></a><a href='#L121'>121</a>\n<a name='L122'></a><a href='#L122'>122</a>\n<a name='L123'></a><a href='#L123'>123</a>\n<a name='L124'></a><a href='#L124'>124</a>\n<a name='L125'></a><a href='#L125'>125</a>\n<a name='L126'></a><a href='#L126'>126</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">17x</span>\n<span class=\"cline-any cline-yes\">17x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">19x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {\n  ICodeSnippet,\n  CodeSnippetContentsService\n} from './CodeSnippetContentsService';\n&nbsp;\nexport interface ICodeSnippetWidgetModel {\n  /**\n   * The list of code snippets in the code snippet explorer\n   */\n  readonly _snippets: ICodeSnippet[];\n}\n&nbsp;\nexport class CodeSnippetWidgetModel implements ICodeSnippetWidgetModel {\n  _snippets: ICodeSnippet[];\n&nbsp;\n  constructor(snippets: ICodeSnippet[]) {\n    this._snippets = snippets;\n  }\n&nbsp;\n  get snippets(): ICodeSnippet[] {\n    this.sortSnippets();\n    return this._snippets;\n  }\n&nbsp;\n  set snippets(snippetList: ICodeSnippet[]) {\n    this._snippets = snippetList;\n  }\n&nbsp;\n  reorderSnippet(): void {\n    this.sortSnippets();\n    for (let i = 0; i &lt; this._snippets.length; i++) {\n      this._snippets[i].id = i;\n    }\n  }\n&nbsp;\n  renameSnippet(oldName: string, newName: string): void {\n    for (const snippet of this._snippets) {\n      if (snippet.name === oldName) {\n        snippet.name = newName;\n        CodeSnippetContentsService.getInstance().save(\n          'snippets/' + snippet.name + '.json',\n          { type: 'file', format: 'text', content: JSON.stringify(snippet) }\n        );\n        break;\n      }\n    }\n  }\n&nbsp;\n  addSnippet(newSnippet: ICodeSnippet, index: number): void {\n    // append a new snippet created from input form to the end\n    if (newSnippet.id === -1) {\n      newSnippet.id = this._snippets.length;\n    }\n    this.insertSnippet(newSnippet, index);\n  }\n&nbsp;\n  sortSnippets(): void {\n    this._snippets.sort((a, b) =&gt; a.id - b.id);\n  }\n&nbsp;\n  // move snippetes within explorer\n  moveSnippet(fromIdx: number, toIdx: number): void {\n    if (toIdx &gt; fromIdx) {\n      toIdx = toIdx - 1;\n    }\n    if (toIdx === fromIdx) {\n      return;\n    }\n    const snippetToInsert = this._snippets[fromIdx];\n    this.deleteSnippet(fromIdx);\n    snippetToInsert.id = toIdx;\n&nbsp;\n    this.insertSnippet(snippetToInsert, toIdx);\n    this.updateSnippetContents();\n  }\n&nbsp;\n  /**\n   * Delete a snippet from the list\n   * @param index index to delete. If it's not given, the last one gets deleted.\n   */\n  deleteSnippet(index = <span class=\"branch-0 cbranch-no\" title=\"branch not covered\" >-1)</span>: void {\n    const numSnippets = this._snippets.length;\n    if (index &lt; 0 || index &gt; numSnippets) {\n      this._snippets.pop();\n    } else {\n      // Update list\n      for (let i = index + 1; i &lt; numSnippets; i++) {\n        this._snippets[i].id = this._snippets[i].id - 1;\n      }\n      this._snippets.splice(index, 1);\n    }\n  }\n&nbsp;\n  clearSnippets(): void {\n    this._snippets = [];\n  }\n&nbsp;\n  updateSnippetContents(): void {\n    this._snippets.forEach(snippet =&gt; {\n      CodeSnippetContentsService.getInstance().save(\n        'snippets/' + snippet.name + '.json',\n        { type: 'file', format: 'text', content: JSON.stringify(snippet) }\n      );\n    });\n  }\n&nbsp;\n  /**\n   * insert a snippet to the certain index of the snippet list\n   * @param newSnippet new snippet to insert\n   * @param index index to insert. If it's not given, the snippet is added at the end of the list.\n   */\n  private insertSnippet(newSnippet: ICodeSnippet, index = <span class=\"branch-0 cbranch-no\" title=\"branch not covered\" >-1)</span>: void {\n    const numSnippets = this._snippets.length;\n    // add it at the end of the list\n    if (index &lt; 0 || index &gt;= numSnippets) {\n      this._snippets.push(newSnippet);\n    } else {\n      // Update list\n      for (let i = index; i &lt; numSnippets; i++) {\n        this._snippets[i].id = this._snippets[i].id + 1;\n      }\n      this._snippets.splice(index, 0, newSnippet);\n    }\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/base.css",
    "content": "body, html {\n  margin:0; padding: 0;\n  height: 100%;\n}\nbody {\n    font-family: Helvetica Neue, Helvetica, Arial;\n    font-size: 14px;\n    color:#333;\n}\n.small { font-size: 12px; }\n*, *:after, *:before {\n  -webkit-box-sizing:border-box;\n     -moz-box-sizing:border-box;\n          box-sizing:border-box;\n  }\nh1 { font-size: 20px; margin: 0;}\nh2 { font-size: 14px; }\npre {\n    font: 12px/1.4 Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n    margin: 0;\n    padding: 0;\n    -moz-tab-size: 2;\n    -o-tab-size:  2;\n    tab-size: 2;\n}\na { color:#0074D9; text-decoration:none; }\na:hover { text-decoration:underline; }\n.strong { font-weight: bold; }\n.space-top1 { padding: 10px 0 0 0; }\n.pad2y { padding: 20px 0; }\n.pad1y { padding: 10px 0; }\n.pad2x { padding: 0 20px; }\n.pad2 { padding: 20px; }\n.pad1 { padding: 10px; }\n.space-left2 { padding-left:55px; }\n.space-right2 { padding-right:20px; }\n.center { text-align:center; }\n.clearfix { display:block; }\n.clearfix:after {\n  content:'';\n  display:block;\n  height:0;\n  clear:both;\n  visibility:hidden;\n  }\n.fl { float: left; }\n@media only screen and (max-width:640px) {\n  .col3 { width:100%; max-width:100%; }\n  .hide-mobile { display:none!important; }\n}\n\n.quiet {\n  color: #7f7f7f;\n  color: rgba(0,0,0,0.5);\n}\n.quiet a { opacity: 0.7; }\n\n.fraction {\n  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n  font-size: 10px;\n  color: #555;\n  background: #E8E8E8;\n  padding: 4px 5px;\n  border-radius: 3px;\n  vertical-align: middle;\n}\n\ndiv.path a:link, div.path a:visited { color: #333; }\ntable.coverage {\n  border-collapse: collapse;\n  margin: 10px 0 0 0;\n  padding: 0;\n}\n\ntable.coverage td {\n  margin: 0;\n  padding: 0;\n  vertical-align: top;\n}\ntable.coverage td.line-count {\n    text-align: right;\n    padding: 0 5px 0 20px;\n}\ntable.coverage td.line-coverage {\n    text-align: right;\n    padding-right: 10px;\n    min-width:20px;\n}\n\ntable.coverage td span.cline-any {\n    display: inline-block;\n    padding: 0 5px;\n    width: 100%;\n}\n.missing-if-branch {\n    display: inline-block;\n    margin-right: 5px;\n    border-radius: 3px;\n    position: relative;\n    padding: 0 4px;\n    background: #333;\n    color: yellow;\n}\n\n.skip-if-branch {\n    display: none;\n    margin-right: 10px;\n    position: relative;\n    padding: 0 4px;\n    background: #ccc;\n    color: white;\n}\n.missing-if-branch .typ, .skip-if-branch .typ {\n    color: inherit !important;\n}\n.coverage-summary {\n  border-collapse: collapse;\n  width: 100%;\n}\n.coverage-summary tr { border-bottom: 1px solid #bbb; }\n.keyline-all { border: 1px solid #ddd; }\n.coverage-summary td, .coverage-summary th { padding: 10px; }\n.coverage-summary tbody { border: 1px solid #bbb; }\n.coverage-summary td { border-right: 1px solid #bbb; }\n.coverage-summary td:last-child { border-right: none; }\n.coverage-summary th {\n  text-align: left;\n  font-weight: normal;\n  white-space: nowrap;\n}\n.coverage-summary th.file { border-right: none !important; }\n.coverage-summary th.pct { }\n.coverage-summary th.pic,\n.coverage-summary th.abs,\n.coverage-summary td.pct,\n.coverage-summary td.abs { text-align: right; }\n.coverage-summary td.file { white-space: nowrap;  }\n.coverage-summary td.pic { min-width: 120px !important;  }\n.coverage-summary tfoot td { }\n\n.coverage-summary .sorter {\n    height: 10px;\n    width: 7px;\n    display: inline-block;\n    margin-left: 0.5em;\n    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;\n}\n.coverage-summary .sorted .sorter {\n    background-position: 0 -20px;\n}\n.coverage-summary .sorted-desc .sorter {\n    background-position: 0 -10px;\n}\n.status-line {  height: 10px; }\n/* yellow */\n.cbranch-no { background: yellow !important; color: #111; }\n/* dark red */\n.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }\n.low .chart { border:1px solid #C21F39 }\n.highlighted,\n.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{\n  background: #C21F39 !important;\n}\n/* medium red */\n.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }\n/* light red */\n.low, .cline-no { background:#FCE1E5 }\n/* light green */\n.high, .cline-yes { background:rgb(230,245,208) }\n/* medium green */\n.cstat-yes { background:rgb(161,215,106) }\n/* dark green */\n.status-line.high, .high .cover-fill { background:rgb(77,146,33) }\n.high .chart { border:1px solid rgb(77,146,33) }\n/* dark yellow (gold) */\n.status-line.medium, .medium .cover-fill { background: #f9cd0b; }\n.medium .chart { border:1px solid #f9cd0b; }\n/* light yellow */\n.medium { background: #fff4c2; }\n\n.cstat-skip { background: #ddd; color: #111; }\n.fstat-skip { background: #ddd; color: #111 !important; }\n.cbranch-skip { background: #ddd !important; color: #111; }\n\nspan.cline-neutral { background: #eaeaea; }\n\n.coverage-summary td.empty {\n    opacity: .5;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    line-height: 1;\n    color: #888;\n}\n\n.cover-fill, .cover-empty {\n  display:inline-block;\n  height: 12px;\n}\n.chart {\n  line-height: 0;\n}\n.cover-empty {\n    background: white;\n}\n.cover-full {\n    border-right: none !important;\n}\npre.prettyprint {\n    border: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n.com { color: #999 !important; }\n.ignore-none { color: #999; font-weight: normal; }\n\n.wrapper {\n  min-height: 100%;\n  height: auto !important;\n  height: 100%;\n  margin: 0 auto -48px;\n}\n.footer, .push {\n  height: 48px;\n}\n"
  },
  {
    "path": "coverage/block-navigation.js",
    "content": "/* eslint-disable */\nvar jumpToCode = (function init() {\n    // Classes of code we would like to highlight in the file view\n    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];\n\n    // Elements to highlight in the file listing view\n    var fileListingElements = ['td.pct.low'];\n\n    // We don't want to select elements that are direct descendants of another match\n    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `\n\n    // Selecter that finds elements on the page to which we can jump\n    var selector =\n        fileListingElements.join(', ') +\n        ', ' +\n        notSelector +\n        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`\n\n    // The NodeList of matching elements\n    var missingCoverageElements = document.querySelectorAll(selector);\n\n    var currentIndex;\n\n    function toggleClass(index) {\n        missingCoverageElements\n            .item(currentIndex)\n            .classList.remove('highlighted');\n        missingCoverageElements.item(index).classList.add('highlighted');\n    }\n\n    function makeCurrent(index) {\n        toggleClass(index);\n        currentIndex = index;\n        missingCoverageElements.item(index).scrollIntoView({\n            behavior: 'smooth',\n            block: 'center',\n            inline: 'center'\n        });\n    }\n\n    function goToPrevious() {\n        var nextIndex = 0;\n        if (typeof currentIndex !== 'number' || currentIndex === 0) {\n            nextIndex = missingCoverageElements.length - 1;\n        } else if (missingCoverageElements.length > 1) {\n            nextIndex = currentIndex - 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    function goToNext() {\n        var nextIndex = 0;\n\n        if (\n            typeof currentIndex === 'number' &&\n            currentIndex < missingCoverageElements.length - 1\n        ) {\n            nextIndex = currentIndex + 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    return function jump(event) {\n        switch (event.which) {\n            case 78: // n\n            case 74: // j\n                goToNext();\n                break;\n            case 66: // b\n            case 75: // k\n            case 80: // p\n                goToPrevious();\n                break;\n        }\n    };\n})();\nwindow.addEventListener('keydown', jumpToCode);\n"
  },
  {
    "path": "coverage/clover.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage generated=\"1604606156495\" clover=\"3.2.0\">\n  <project timestamp=\"1604606156495\" name=\"All files\">\n    <metrics statements=\"0\" coveredstatements=\"0\" conditionals=\"0\" coveredconditionals=\"0\" methods=\"0\" coveredmethods=\"0\" elements=\"0\" coveredelements=\"0\" complexity=\"0\" loc=\"0\" ncloc=\"0\" packages=\"0\" files=\"0\" classes=\"0\"/>\n  </project>\n</coverage>\n"
  },
  {
    "path": "coverage/coverage-final.json",
    "content": "{\"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetContentsService.ts\": {\"path\":\"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetContentsService.ts\",\"statementMap\":{\"0\":{\"start\":{\"line\":1,\"column\":0},\"end\":{\"line\":1,\"column\":72}},\"1\":{\"start\":{\"line\":21,\"column\":18},\"end\":{\"line\":21,\"column\":54}},\"2\":{\"start\":{\"line\":22,\"column\":28},\"end\":{\"line\":22,\"column\":72}},\"3\":{\"start\":{\"line\":23,\"column\":4},\"end\":{\"line\":23,\"column\":23}},\"4\":{\"start\":{\"line\":24,\"column\":4},\"end\":{\"line\":24,\"column\":43}},\"5\":{\"start\":{\"line\":28,\"column\":4},\"end\":{\"line\":30,\"column\":null}},\"6\":{\"start\":{\"line\":29,\"column\":6},\"end\":{\"line\":29,\"column\":55}},\"7\":{\"start\":{\"line\":31,\"column\":4},\"end\":{\"line\":31,\"column\":25}},\"8\":{\"start\":{\"line\":42,\"column\":4},\"end\":{\"line\":51,\"column\":null}},\"9\":{\"start\":{\"line\":43,\"column\":19},\"end\":{\"line\":47,\"column\":8}},\"10\":{\"start\":{\"line\":48,\"column\":6},\"end\":{\"line\":48,\"column\":18}},\"11\":{\"start\":{\"line\":50,\"column\":6},\"end\":{\"line\":50,\"column\":19}},\"12\":{\"start\":{\"line\":71,\"column\":4},\"end\":{\"line\":76,\"column\":null}},\"13\":{\"start\":{\"line\":72,\"column\":27},\"end\":{\"line\":72,\"column\":73}},\"14\":{\"start\":{\"line\":73,\"column\":6},\"end\":{\"line\":73,\"column\":26}},\"15\":{\"start\":{\"line\":75,\"column\":6},\"end\":{\"line\":75,\"column\":19}},\"16\":{\"start\":{\"line\":91,\"column\":4},\"end\":{\"line\":96,\"column\":null}},\"17\":{\"start\":{\"line\":92,\"column\":27},\"end\":{\"line\":92,\"column\":78}},\"18\":{\"start\":{\"line\":93,\"column\":6},\"end\":{\"line\":93,\"column\":26}},\"19\":{\"start\":{\"line\":95,\"column\":6},\"end\":{\"line\":95,\"column\":19}},\"20\":{\"start\":{\"line\":106,\"column\":4},\"end\":{\"line\":110,\"column\":null}},\"21\":{\"start\":{\"line\":107,\"column\":6},\"end\":{\"line\":107,\"column\":46}},\"22\":{\"start\":{\"line\":109,\"column\":6},\"end\":{\"line\":109,\"column\":13}},\"23\":{\"start\":{\"line\":16,\"column\":0},\"end\":{\"line\":16,\"column\":13}}},\"fnMap\":{\"0\":{\"name\":\"(anonymous_7)\",\"decl\":{\"start\":{\"line\":20,\"column\":2},\"end\":{\"line\":20,\"column\":null}},\"loc\":{\"start\":{\"line\":20,\"column\":2},\"end\":{\"line\":25,\"column\":3}}},\"1\":{\"name\":\"(anonymous_8)\",\"decl\":{\"start\":{\"line\":27,\"column\":2},\"end\":{\"line\":27,\"column\":8}},\"loc\":{\"start\":{\"line\":27,\"column\":20},\"end\":{\"line\":32,\"column\":3}}},\"2\":{\"name\":\"(anonymous_9)\",\"decl\":{\"start\":{\"line\":38,\"column\":8},\"end\":{\"line\":38,\"column\":15}},\"loc\":{\"start\":{\"line\":40,\"column\":30},\"end\":{\"line\":58,\"column\":null}}},\"3\":{\"name\":\"(anonymous_11)\",\"decl\":{\"start\":{\"line\":67,\"column\":8},\"end\":{\"line\":67,\"column\":12}},\"loc\":{\"start\":{\"line\":69,\"column\":38},\"end\":{\"line\":77,\"column\":null}}},\"4\":{\"name\":\"(anonymous_13)\",\"decl\":{\"start\":{\"line\":90,\"column\":8},\"end\":{\"line\":90,\"column\":14}},\"loc\":{\"start\":{\"line\":90,\"column\":47},\"end\":{\"line\":99,\"column\":null}}},\"5\":{\"name\":\"(anonymous_15)\",\"decl\":{\"start\":{\"line\":105,\"column\":8},\"end\":{\"line\":105,\"column\":14}},\"loc\":{\"start\":{\"line\":105,\"column\":27},\"end\":{\"line\":111,\"column\":null}}}},\"branchMap\":{\"0\":{\"loc\":{\"start\":{\"line\":28,\"column\":4},\"end\":{\"line\":30,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":28,\"column\":4},\"end\":{\"line\":30,\"column\":null}},{\"start\":{\"line\":28,\"column\":4},\"end\":{\"line\":30,\"column\":null}}]}},\"s\":{\"0\":2,\"1\":2,\"2\":2,\"3\":2,\"4\":2,\"5\":4,\"6\":2,\"7\":4,\"8\":2,\"9\":2,\"10\":1,\"11\":1,\"12\":4,\"13\":4,\"14\":1,\"15\":3,\"16\":2,\"17\":2,\"18\":1,\"19\":1,\"20\":1,\"21\":1,\"22\":1,\"23\":2},\"f\":{\"0\":2,\"1\":4,\"2\":2,\"3\":4,\"4\":2,\"5\":1},\"b\":{\"0\":[2,2]}}\n,\"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetWidgetModel.ts\": {\"path\":\"/Users/jaewookahn/projects/code_snippet/code_snippets/src/CodeSnippetWidgetModel.ts\",\"statementMap\":{\"0\":{\"start\":{\"line\":1,\"column\":0},\"end\":{\"line\":1,\"column\":null}},\"1\":{\"start\":{\"line\":17,\"column\":4},\"end\":{\"line\":17,\"column\":30}},\"2\":{\"start\":{\"line\":21,\"column\":4},\"end\":{\"line\":21,\"column\":24}},\"3\":{\"start\":{\"line\":22,\"column\":4},\"end\":{\"line\":22,\"column\":26}},\"4\":{\"start\":{\"line\":26,\"column\":4},\"end\":{\"line\":26,\"column\":33}},\"5\":{\"start\":{\"line\":30,\"column\":4},\"end\":{\"line\":30,\"column\":24}},\"6\":{\"start\":{\"line\":31,\"column\":4},\"end\":{\"line\":33,\"column\":null}},\"7\":{\"start\":{\"line\":31,\"column\":17},\"end\":{\"line\":31,\"column\":18}},\"8\":{\"start\":{\"line\":32,\"column\":6},\"end\":{\"line\":32,\"column\":31}},\"9\":{\"start\":{\"line\":37,\"column\":4},\"end\":{\"line\":46,\"column\":null}},\"10\":{\"start\":{\"line\":38,\"column\":6},\"end\":{\"line\":45,\"column\":null}},\"11\":{\"start\":{\"line\":39,\"column\":8},\"end\":{\"line\":39,\"column\":31}},\"12\":{\"start\":{\"line\":40,\"column\":8},\"end\":{\"line\":43,\"column\":10}},\"13\":{\"start\":{\"line\":44,\"column\":8},\"end\":{\"line\":44,\"column\":14}},\"14\":{\"start\":{\"line\":51,\"column\":4},\"end\":{\"line\":53,\"column\":null}},\"15\":{\"start\":{\"line\":52,\"column\":6},\"end\":{\"line\":52,\"column\":44}},\"16\":{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":54,\"column\":42}},\"17\":{\"start\":{\"line\":58,\"column\":4},\"end\":{\"line\":58,\"column\":47}},\"18\":{\"start\":{\"line\":58,\"column\":34},\"end\":{\"line\":58,\"column\":45}},\"19\":{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":65,\"column\":null}},\"20\":{\"start\":{\"line\":64,\"column\":6},\"end\":{\"line\":64,\"column\":24}},\"21\":{\"start\":{\"line\":66,\"column\":4},\"end\":{\"line\":68,\"column\":null}},\"22\":{\"start\":{\"line\":67,\"column\":6},\"end\":{\"line\":67,\"column\":13}},\"23\":{\"start\":{\"line\":69,\"column\":28},\"end\":{\"line\":69,\"column\":51}},\"24\":{\"start\":{\"line\":70,\"column\":4},\"end\":{\"line\":70,\"column\":32}},\"25\":{\"start\":{\"line\":71,\"column\":4},\"end\":{\"line\":71,\"column\":31}},\"26\":{\"start\":{\"line\":73,\"column\":4},\"end\":{\"line\":73,\"column\":47}},\"27\":{\"start\":{\"line\":74,\"column\":4},\"end\":{\"line\":74,\"column\":33}},\"28\":{\"start\":{\"line\":82,\"column\":24},\"end\":{\"line\":82,\"column\":45}},\"29\":{\"start\":{\"line\":83,\"column\":4},\"end\":{\"line\":91,\"column\":null}},\"30\":{\"start\":{\"line\":84,\"column\":6},\"end\":{\"line\":84,\"column\":27}},\"31\":{\"start\":{\"line\":87,\"column\":6},\"end\":{\"line\":89,\"column\":null}},\"32\":{\"start\":{\"line\":87,\"column\":19},\"end\":{\"line\":87,\"column\":28}},\"33\":{\"start\":{\"line\":88,\"column\":8},\"end\":{\"line\":88,\"column\":56}},\"34\":{\"start\":{\"line\":90,\"column\":6},\"end\":{\"line\":90,\"column\":38}},\"35\":{\"start\":{\"line\":95,\"column\":4},\"end\":{\"line\":95,\"column\":24}},\"36\":{\"start\":{\"line\":99,\"column\":4},\"end\":{\"line\":104,\"column\":7}},\"37\":{\"start\":{\"line\":100,\"column\":6},\"end\":{\"line\":103,\"column\":8}},\"38\":{\"start\":{\"line\":113,\"column\":24},\"end\":{\"line\":113,\"column\":45}},\"39\":{\"start\":{\"line\":115,\"column\":4},\"end\":{\"line\":123,\"column\":null}},\"40\":{\"start\":{\"line\":116,\"column\":6},\"end\":{\"line\":116,\"column\":38}},\"41\":{\"start\":{\"line\":119,\"column\":6},\"end\":{\"line\":121,\"column\":null}},\"42\":{\"start\":{\"line\":119,\"column\":19},\"end\":{\"line\":119,\"column\":24}},\"43\":{\"start\":{\"line\":120,\"column\":8},\"end\":{\"line\":120,\"column\":56}},\"44\":{\"start\":{\"line\":122,\"column\":6},\"end\":{\"line\":122,\"column\":50}},\"45\":{\"start\":{\"line\":13,\"column\":0},\"end\":{\"line\":13,\"column\":13}}},\"fnMap\":{\"0\":{\"name\":\"(anonymous_0)\",\"decl\":{\"start\":{\"line\":16,\"column\":2},\"end\":{\"line\":16,\"column\":14}},\"loc\":{\"start\":{\"line\":16,\"column\":38},\"end\":{\"line\":18,\"column\":3}}},\"1\":{\"name\":\"(anonymous_1)\",\"decl\":{\"start\":{\"line\":20,\"column\":2},\"end\":{\"line\":20,\"column\":6}},\"loc\":{\"start\":{\"line\":20,\"column\":14},\"end\":{\"line\":23,\"column\":3}}},\"2\":{\"name\":\"(anonymous_2)\",\"decl\":{\"start\":{\"line\":25,\"column\":2},\"end\":{\"line\":25,\"column\":6}},\"loc\":{\"start\":{\"line\":25,\"column\":42},\"end\":{\"line\":27,\"column\":3}}},\"3\":{\"name\":\"(anonymous_3)\",\"decl\":{\"start\":{\"line\":29,\"column\":2},\"end\":{\"line\":29,\"column\":16}},\"loc\":{\"start\":{\"line\":29,\"column\":16},\"end\":{\"line\":34,\"column\":3}}},\"4\":{\"name\":\"(anonymous_4)\",\"decl\":{\"start\":{\"line\":36,\"column\":2},\"end\":{\"line\":36,\"column\":15}},\"loc\":{\"start\":{\"line\":36,\"column\":48},\"end\":{\"line\":47,\"column\":3}}},\"5\":{\"name\":\"(anonymous_5)\",\"decl\":{\"start\":{\"line\":49,\"column\":2},\"end\":{\"line\":49,\"column\":12}},\"loc\":{\"start\":{\"line\":49,\"column\":52},\"end\":{\"line\":55,\"column\":3}}},\"6\":{\"name\":\"(anonymous_6)\",\"decl\":{\"start\":{\"line\":57,\"column\":2},\"end\":{\"line\":57,\"column\":14}},\"loc\":{\"start\":{\"line\":57,\"column\":14},\"end\":{\"line\":59,\"column\":3}}},\"7\":{\"name\":\"(anonymous_7)\",\"decl\":{\"start\":{\"line\":58,\"column\":24},\"end\":{\"line\":58,\"column\":25}},\"loc\":{\"start\":{\"line\":58,\"column\":34},\"end\":{\"line\":58,\"column\":45}}},\"8\":{\"name\":\"(anonymous_8)\",\"decl\":{\"start\":{\"line\":62,\"column\":2},\"end\":{\"line\":62,\"column\":13}},\"loc\":{\"start\":{\"line\":62,\"column\":44},\"end\":{\"line\":75,\"column\":3}}},\"9\":{\"name\":\"(anonymous_9)\",\"decl\":{\"start\":{\"line\":81,\"column\":2},\"end\":{\"line\":81,\"column\":15}},\"loc\":{\"start\":{\"line\":81,\"column\":26},\"end\":{\"line\":92,\"column\":3}}},\"10\":{\"name\":\"(anonymous_10)\",\"decl\":{\"start\":{\"line\":94,\"column\":2},\"end\":{\"line\":94,\"column\":15}},\"loc\":{\"start\":{\"line\":94,\"column\":15},\"end\":{\"line\":96,\"column\":3}}},\"11\":{\"name\":\"(anonymous_11)\",\"decl\":{\"start\":{\"line\":98,\"column\":2},\"end\":{\"line\":98,\"column\":23}},\"loc\":{\"start\":{\"line\":98,\"column\":23},\"end\":{\"line\":105,\"column\":3}}},\"12\":{\"name\":\"(anonymous_12)\",\"decl\":{\"start\":{\"line\":99,\"column\":27},\"end\":{\"line\":99,\"column\":34}},\"loc\":{\"start\":{\"line\":99,\"column\":37},\"end\":{\"line\":104,\"column\":5}}},\"13\":{\"name\":\"(anonymous_13)\",\"decl\":{\"start\":{\"line\":112,\"column\":10},\"end\":{\"line\":112,\"column\":23}},\"loc\":{\"start\":{\"line\":112,\"column\":60},\"end\":{\"line\":124,\"column\":3}}}},\"branchMap\":{\"0\":{\"loc\":{\"start\":{\"line\":38,\"column\":6},\"end\":{\"line\":45,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":38,\"column\":6},\"end\":{\"line\":45,\"column\":null}},{\"start\":{\"line\":38,\"column\":6},\"end\":{\"line\":45,\"column\":null}}]},\"1\":{\"loc\":{\"start\":{\"line\":51,\"column\":4},\"end\":{\"line\":53,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":51,\"column\":4},\"end\":{\"line\":53,\"column\":null}},{\"start\":{\"line\":51,\"column\":4},\"end\":{\"line\":53,\"column\":null}}]},\"2\":{\"loc\":{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":65,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":65,\"column\":null}},{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":65,\"column\":null}}]},\"3\":{\"loc\":{\"start\":{\"line\":66,\"column\":4},\"end\":{\"line\":68,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":66,\"column\":4},\"end\":{\"line\":68,\"column\":null}},{\"start\":{\"line\":66,\"column\":4},\"end\":{\"line\":68,\"column\":null}}]},\"4\":{\"loc\":{\"start\":{\"line\":81,\"column\":24},\"end\":{\"line\":81,\"column\":26}},\"type\":\"default-arg\",\"locations\":[{\"start\":{\"line\":81,\"column\":24},\"end\":{\"line\":81,\"column\":26}}]},\"5\":{\"loc\":{\"start\":{\"line\":83,\"column\":4},\"end\":{\"line\":91,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":83,\"column\":4},\"end\":{\"line\":91,\"column\":null}},{\"start\":{\"line\":83,\"column\":4},\"end\":{\"line\":91,\"column\":null}}]},\"6\":{\"loc\":{\"start\":{\"line\":83,\"column\":8},\"end\":{\"line\":83,\"column\":17}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":83,\"column\":8},\"end\":{\"line\":83,\"column\":17}},{\"start\":{\"line\":83,\"column\":21},\"end\":{\"line\":83,\"column\":40}}]},\"7\":{\"loc\":{\"start\":{\"line\":112,\"column\":58},\"end\":{\"line\":112,\"column\":60}},\"type\":\"default-arg\",\"locations\":[{\"start\":{\"line\":112,\"column\":58},\"end\":{\"line\":112,\"column\":60}}]},\"8\":{\"loc\":{\"start\":{\"line\":115,\"column\":4},\"end\":{\"line\":123,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":115,\"column\":4},\"end\":{\"line\":123,\"column\":null}},{\"start\":{\"line\":115,\"column\":4},\"end\":{\"line\":123,\"column\":null}}]},\"9\":{\"loc\":{\"start\":{\"line\":115,\"column\":8},\"end\":{\"line\":115,\"column\":17}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":115,\"column\":8},\"end\":{\"line\":115,\"column\":17}},{\"start\":{\"line\":115,\"column\":21},\"end\":{\"line\":115,\"column\":41}}]}},\"s\":{\"0\":1,\"1\":1,\"2\":17,\"3\":17,\"4\":2,\"5\":1,\"6\":1,\"7\":1,\"8\":2,\"9\":1,\"10\":2,\"11\":1,\"12\":1,\"13\":1,\"14\":3,\"15\":1,\"16\":3,\"17\":19,\"18\":14,\"19\":2,\"20\":1,\"21\":2,\"22\":1,\"23\":1,\"24\":1,\"25\":1,\"26\":1,\"27\":1,\"28\":3,\"29\":3,\"30\":1,\"31\":2,\"32\":2,\"33\":2,\"34\":2,\"35\":1,\"36\":1,\"37\":2,\"38\":4,\"39\":4,\"40\":3,\"41\":1,\"42\":1,\"43\":1,\"44\":1,\"45\":1},\"f\":{\"0\":1,\"1\":17,\"2\":2,\"3\":1,\"4\":1,\"5\":3,\"6\":19,\"7\":14,\"8\":2,\"9\":3,\"10\":1,\"11\":1,\"12\":2,\"13\":4},\"b\":{\"0\":[1,1],\"1\":[1,2],\"2\":[1,1],\"3\":[1,1],\"4\":[0],\"5\":[1,2],\"6\":[3,2],\"7\":[0],\"8\":[3,1],\"9\":[4,3]}}\n}\n"
  },
  {
    "path": "coverage/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for All files</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1>All files</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>70/70</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">90% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>18/20</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>20/20</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>66/66</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file high\" data-value=\"CodeSnippetContentsService.ts\"><a href=\"CodeSnippetContentsService.ts.html\">CodeSnippetContentsService.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"24\" class=\"abs high\">24/24</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"2\" class=\"abs high\">2/2</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"6\" class=\"abs high\">6/6</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"24\" class=\"abs high\">24/24</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"CodeSnippetWidgetModel.ts\"><a href=\"CodeSnippetWidgetModel.ts.html\">CodeSnippetWidgetModel.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"46\" class=\"abs high\">46/46</td>\n\t<td data-value=\"88.89\" class=\"pct high\">88.89%</td>\n\t<td data-value=\"18\" class=\"abs high\">16/18</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"14\" class=\"abs high\">14/14</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"42\" class=\"abs high\">42/42</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/CodeSnippetContentsService.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetContentsService.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"index.html\">All files</a> CodeSnippetContentsService.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>24/24</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>2/2</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>6/6</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>24/24</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a>\n<a name='L46'></a><a href='#L46'>46</a>\n<a name='L47'></a><a href='#L47'>47</a>\n<a name='L48'></a><a href='#L48'>48</a>\n<a name='L49'></a><a href='#L49'>49</a>\n<a name='L50'></a><a href='#L50'>50</a>\n<a name='L51'></a><a href='#L51'>51</a>\n<a name='L52'></a><a href='#L52'>52</a>\n<a name='L53'></a><a href='#L53'>53</a>\n<a name='L54'></a><a href='#L54'>54</a>\n<a name='L55'></a><a href='#L55'>55</a>\n<a name='L56'></a><a href='#L56'>56</a>\n<a name='L57'></a><a href='#L57'>57</a>\n<a name='L58'></a><a href='#L58'>58</a>\n<a name='L59'></a><a href='#L59'>59</a>\n<a name='L60'></a><a href='#L60'>60</a>\n<a name='L61'></a><a href='#L61'>61</a>\n<a name='L62'></a><a href='#L62'>62</a>\n<a name='L63'></a><a href='#L63'>63</a>\n<a name='L64'></a><a href='#L64'>64</a>\n<a name='L65'></a><a href='#L65'>65</a>\n<a name='L66'></a><a href='#L66'>66</a>\n<a name='L67'></a><a href='#L67'>67</a>\n<a name='L68'></a><a href='#L68'>68</a>\n<a name='L69'></a><a href='#L69'>69</a>\n<a name='L70'></a><a href='#L70'>70</a>\n<a name='L71'></a><a href='#L71'>71</a>\n<a name='L72'></a><a href='#L72'>72</a>\n<a name='L73'></a><a href='#L73'>73</a>\n<a name='L74'></a><a href='#L74'>74</a>\n<a name='L75'></a><a href='#L75'>75</a>\n<a name='L76'></a><a href='#L76'>76</a>\n<a name='L77'></a><a href='#L77'>77</a>\n<a name='L78'></a><a href='#L78'>78</a>\n<a name='L79'></a><a href='#L79'>79</a>\n<a name='L80'></a><a href='#L80'>80</a>\n<a name='L81'></a><a href='#L81'>81</a>\n<a name='L82'></a><a href='#L82'>82</a>\n<a name='L83'></a><a href='#L83'>83</a>\n<a name='L84'></a><a href='#L84'>84</a>\n<a name='L85'></a><a href='#L85'>85</a>\n<a name='L86'></a><a href='#L86'>86</a>\n<a name='L87'></a><a href='#L87'>87</a>\n<a name='L88'></a><a href='#L88'>88</a>\n<a name='L89'></a><a href='#L89'>89</a>\n<a name='L90'></a><a href='#L90'>90</a>\n<a name='L91'></a><a href='#L91'>91</a>\n<a name='L92'></a><a href='#L92'>92</a>\n<a name='L93'></a><a href='#L93'>93</a>\n<a name='L94'></a><a href='#L94'>94</a>\n<a name='L95'></a><a href='#L95'>95</a>\n<a name='L96'></a><a href='#L96'>96</a>\n<a name='L97'></a><a href='#L97'>97</a>\n<a name='L98'></a><a href='#L98'>98</a>\n<a name='L99'></a><a href='#L99'>99</a>\n<a name='L100'></a><a href='#L100'>100</a>\n<a name='L101'></a><a href='#L101'>101</a>\n<a name='L102'></a><a href='#L102'>102</a>\n<a name='L103'></a><a href='#L103'>103</a>\n<a name='L104'></a><a href='#L104'>104</a>\n<a name='L105'></a><a href='#L105'>105</a>\n<a name='L106'></a><a href='#L106'>106</a>\n<a name='L107'></a><a href='#L107'>107</a>\n<a name='L108'></a><a href='#L108'>108</a>\n<a name='L109'></a><a href='#L109'>109</a>\n<a name='L110'></a><a href='#L110'>110</a>\n<a name='L111'></a><a href='#L111'>111</a>\n<a name='L112'></a><a href='#L112'>112</a>\n<a name='L113'></a><a href='#L113'>113</a>\n<a name='L114'></a><a href='#L114'>114</a>\n<a name='L115'></a><a href='#L115'>115</a>\n<a name='L116'></a><a href='#L116'>116</a>\n<a name='L117'></a><a href='#L117'>117</a>\n<a name='L118'></a><a href='#L118'>118</a>\n<a name='L119'></a><a href='#L119'>119</a>\n<a name='L120'></a><a href='#L120'>120</a>\n<a name='L121'></a><a href='#L121'>121</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import { ContentsManager, Drive, Contents } from '@jupyterlab/services';\n&nbsp;\nexport interface ICodeSnippet {\n  name: string;\n  description: string;\n  language: string;\n  // code separated by new line\n  code: string[];\n  id: number;\n  tags?: string[];\n}\n&nbsp;\n/**\n * Singleton contentsService class\n */\nexport class CodeSnippetContentsService {\n  drive: Drive;\n  contentsManager: ContentsManager;\n  private static instance: CodeSnippetContentsService;\n  private constructor() {\n    const drive = new Drive({ name: 'snippetDrive ' });\n    const contentsManager = new ContentsManager({ defaultDrive: drive });\n    this.drive = drive;\n    this.contentsManager = contentsManager;\n  }\n&nbsp;\n  static getInstance(): CodeSnippetContentsService {\n    if (!this.instance) {\n      this.instance = new CodeSnippetContentsService();\n    }\n    return this.instance;\n  }\n&nbsp;\n  /**\n   * Get the metadata information in the given path\n   * @param path path to a file/directory\n   */\n  async getData(\n    path: string,\n    type: Contents.ContentType\n  ): Promise&lt;Contents.IModel&gt; {\n    try {\n      const data = await this.contentsManager.get(path, {\n        type: type,\n        //   format: 'text',\n        content: true\n      });\n      return data;\n    } catch (error) {\n      return error;\n    }\n    // const data = await this.contentsManager.get(path, {\n    //   type: type,\n    //   //   format: 'text',\n    //   content: true\n    // });\n    // return data;\n  }\n&nbsp;\n  /**\n   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path\n   * @param path path to a file/directory\n   * @param options options that specify if it's a file or directory and additial information\n   * Usage: save('snippets', { type: 'directory' }) to create/save a directory\n   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})\n   */\n  async save(\n    path: string,\n    options?: Partial&lt;Contents.IModel&gt;\n  ): Promise&lt;Contents.IModel&gt; {\n    try {\n      const changedModel = await this.contentsManager.save(path, options);\n      return changedModel;\n    } catch (error) {\n      return error;\n    }\n  }\n&nbsp;\n  /**\n   * Change the order of snippets\n   * @param oldPath\n   * @param newPath\n   */\n&nbsp;\n  /**\n   * Rename the file or directory (not case sensitive)\n   * @param oldPath change from\n   * @param newPath change to\n   */\n  async rename(oldPath: string, newPath: string): Promise&lt;Contents.IModel&gt; {\n    try {\n      const changedModel = await this.contentsManager.rename(oldPath, newPath);\n      return changedModel;\n    } catch (error) {\n      return error;\n    }\n    // const changedModel = await this.contentsManager.rename(oldPath, newPath);\n    // return changedModel;\n  }\n&nbsp;\n  /**\n   * Delete the file/directory in the given path\n   * @param path path to a file/directory\n   */\n  async delete(path: string): Promise&lt;void&gt; {\n    try {\n      await this.contentsManager.delete(path);\n    } catch (error) {\n      return;\n    }\n  }\n&nbsp;\n  // async renameAndSave(\n  //   oldPath: string,\n  //   newPath: string\n  // ): Promise&lt;Contents.IModel&gt; {\n  //   this.rename(oldPath, newPath);\n  //   this.save(newPath);\n  // }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/CodeSnippetWidgetModel.ts.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for CodeSnippetWidgetModel.ts</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1><a href=\"index.html\">All files</a> CodeSnippetWidgetModel.ts</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>46/46</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">88.89% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>16/18</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>14/14</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>42/42</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <pre><table class=\"coverage\">\n<tr><td class=\"line-count quiet\"><a name='L1'></a><a href='#L1'>1</a>\n<a name='L2'></a><a href='#L2'>2</a>\n<a name='L3'></a><a href='#L3'>3</a>\n<a name='L4'></a><a href='#L4'>4</a>\n<a name='L5'></a><a href='#L5'>5</a>\n<a name='L6'></a><a href='#L6'>6</a>\n<a name='L7'></a><a href='#L7'>7</a>\n<a name='L8'></a><a href='#L8'>8</a>\n<a name='L9'></a><a href='#L9'>9</a>\n<a name='L10'></a><a href='#L10'>10</a>\n<a name='L11'></a><a href='#L11'>11</a>\n<a name='L12'></a><a href='#L12'>12</a>\n<a name='L13'></a><a href='#L13'>13</a>\n<a name='L14'></a><a href='#L14'>14</a>\n<a name='L15'></a><a href='#L15'>15</a>\n<a name='L16'></a><a href='#L16'>16</a>\n<a name='L17'></a><a href='#L17'>17</a>\n<a name='L18'></a><a href='#L18'>18</a>\n<a name='L19'></a><a href='#L19'>19</a>\n<a name='L20'></a><a href='#L20'>20</a>\n<a name='L21'></a><a href='#L21'>21</a>\n<a name='L22'></a><a href='#L22'>22</a>\n<a name='L23'></a><a href='#L23'>23</a>\n<a name='L24'></a><a href='#L24'>24</a>\n<a name='L25'></a><a href='#L25'>25</a>\n<a name='L26'></a><a href='#L26'>26</a>\n<a name='L27'></a><a href='#L27'>27</a>\n<a name='L28'></a><a href='#L28'>28</a>\n<a name='L29'></a><a href='#L29'>29</a>\n<a name='L30'></a><a href='#L30'>30</a>\n<a name='L31'></a><a href='#L31'>31</a>\n<a name='L32'></a><a href='#L32'>32</a>\n<a name='L33'></a><a href='#L33'>33</a>\n<a name='L34'></a><a href='#L34'>34</a>\n<a name='L35'></a><a href='#L35'>35</a>\n<a name='L36'></a><a href='#L36'>36</a>\n<a name='L37'></a><a href='#L37'>37</a>\n<a name='L38'></a><a href='#L38'>38</a>\n<a name='L39'></a><a href='#L39'>39</a>\n<a name='L40'></a><a href='#L40'>40</a>\n<a name='L41'></a><a href='#L41'>41</a>\n<a name='L42'></a><a href='#L42'>42</a>\n<a name='L43'></a><a href='#L43'>43</a>\n<a name='L44'></a><a href='#L44'>44</a>\n<a name='L45'></a><a href='#L45'>45</a>\n<a name='L46'></a><a href='#L46'>46</a>\n<a name='L47'></a><a href='#L47'>47</a>\n<a name='L48'></a><a href='#L48'>48</a>\n<a name='L49'></a><a href='#L49'>49</a>\n<a name='L50'></a><a href='#L50'>50</a>\n<a name='L51'></a><a href='#L51'>51</a>\n<a name='L52'></a><a href='#L52'>52</a>\n<a name='L53'></a><a href='#L53'>53</a>\n<a name='L54'></a><a href='#L54'>54</a>\n<a name='L55'></a><a href='#L55'>55</a>\n<a name='L56'></a><a href='#L56'>56</a>\n<a name='L57'></a><a href='#L57'>57</a>\n<a name='L58'></a><a href='#L58'>58</a>\n<a name='L59'></a><a href='#L59'>59</a>\n<a name='L60'></a><a href='#L60'>60</a>\n<a name='L61'></a><a href='#L61'>61</a>\n<a name='L62'></a><a href='#L62'>62</a>\n<a name='L63'></a><a href='#L63'>63</a>\n<a name='L64'></a><a href='#L64'>64</a>\n<a name='L65'></a><a href='#L65'>65</a>\n<a name='L66'></a><a href='#L66'>66</a>\n<a name='L67'></a><a href='#L67'>67</a>\n<a name='L68'></a><a href='#L68'>68</a>\n<a name='L69'></a><a href='#L69'>69</a>\n<a name='L70'></a><a href='#L70'>70</a>\n<a name='L71'></a><a href='#L71'>71</a>\n<a name='L72'></a><a href='#L72'>72</a>\n<a name='L73'></a><a href='#L73'>73</a>\n<a name='L74'></a><a href='#L74'>74</a>\n<a name='L75'></a><a href='#L75'>75</a>\n<a name='L76'></a><a href='#L76'>76</a>\n<a name='L77'></a><a href='#L77'>77</a>\n<a name='L78'></a><a href='#L78'>78</a>\n<a name='L79'></a><a href='#L79'>79</a>\n<a name='L80'></a><a href='#L80'>80</a>\n<a name='L81'></a><a href='#L81'>81</a>\n<a name='L82'></a><a href='#L82'>82</a>\n<a name='L83'></a><a href='#L83'>83</a>\n<a name='L84'></a><a href='#L84'>84</a>\n<a name='L85'></a><a href='#L85'>85</a>\n<a name='L86'></a><a href='#L86'>86</a>\n<a name='L87'></a><a href='#L87'>87</a>\n<a name='L88'></a><a href='#L88'>88</a>\n<a name='L89'></a><a href='#L89'>89</a>\n<a name='L90'></a><a href='#L90'>90</a>\n<a name='L91'></a><a href='#L91'>91</a>\n<a name='L92'></a><a href='#L92'>92</a>\n<a name='L93'></a><a href='#L93'>93</a>\n<a name='L94'></a><a href='#L94'>94</a>\n<a name='L95'></a><a href='#L95'>95</a>\n<a name='L96'></a><a href='#L96'>96</a>\n<a name='L97'></a><a href='#L97'>97</a>\n<a name='L98'></a><a href='#L98'>98</a>\n<a name='L99'></a><a href='#L99'>99</a>\n<a name='L100'></a><a href='#L100'>100</a>\n<a name='L101'></a><a href='#L101'>101</a>\n<a name='L102'></a><a href='#L102'>102</a>\n<a name='L103'></a><a href='#L103'>103</a>\n<a name='L104'></a><a href='#L104'>104</a>\n<a name='L105'></a><a href='#L105'>105</a>\n<a name='L106'></a><a href='#L106'>106</a>\n<a name='L107'></a><a href='#L107'>107</a>\n<a name='L108'></a><a href='#L108'>108</a>\n<a name='L109'></a><a href='#L109'>109</a>\n<a name='L110'></a><a href='#L110'>110</a>\n<a name='L111'></a><a href='#L111'>111</a>\n<a name='L112'></a><a href='#L112'>112</a>\n<a name='L113'></a><a href='#L113'>113</a>\n<a name='L114'></a><a href='#L114'>114</a>\n<a name='L115'></a><a href='#L115'>115</a>\n<a name='L116'></a><a href='#L116'>116</a>\n<a name='L117'></a><a href='#L117'>117</a>\n<a name='L118'></a><a href='#L118'>118</a>\n<a name='L119'></a><a href='#L119'>119</a>\n<a name='L120'></a><a href='#L120'>120</a>\n<a name='L121'></a><a href='#L121'>121</a>\n<a name='L122'></a><a href='#L122'>122</a>\n<a name='L123'></a><a href='#L123'>123</a>\n<a name='L124'></a><a href='#L124'>124</a>\n<a name='L125'></a><a href='#L125'>125</a>\n<a name='L126'></a><a href='#L126'>126</a></td><td class=\"line-coverage quiet\"><span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">17x</span>\n<span class=\"cline-any cline-yes\">17x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">19x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">2x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">4x</span>\n<span class=\"cline-any cline-yes\">3x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-yes\">1x</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span>\n<span class=\"cline-any cline-neutral\">&nbsp;</span></td><td class=\"text\"><pre class=\"prettyprint lang-js\">import {\n  ICodeSnippet,\n  CodeSnippetContentsService\n} from './CodeSnippetContentsService';\n&nbsp;\nexport interface ICodeSnippetWidgetModel {\n  /**\n   * The list of code snippets in the code snippet explorer\n   */\n  readonly _snippets: ICodeSnippet[];\n}\n&nbsp;\nexport class CodeSnippetWidgetModel implements ICodeSnippetWidgetModel {\n  _snippets: ICodeSnippet[];\n&nbsp;\n  constructor(snippets: ICodeSnippet[]) {\n    this._snippets = snippets;\n  }\n&nbsp;\n  get snippets(): ICodeSnippet[] {\n    this.sortSnippets();\n    return this._snippets;\n  }\n&nbsp;\n  set snippets(snippetList: ICodeSnippet[]) {\n    this._snippets = snippetList;\n  }\n&nbsp;\n  reorderSnippet(): void {\n    this.sortSnippets();\n    for (let i = 0; i &lt; this._snippets.length; i++) {\n      this._snippets[i].id = i;\n    }\n  }\n&nbsp;\n  renameSnippet(oldName: string, newName: string): void {\n    for (const snippet of this._snippets) {\n      if (snippet.name === oldName) {\n        snippet.name = newName;\n        CodeSnippetContentsService.getInstance().save(\n          'snippets/' + snippet.name + '.json',\n          { type: 'file', format: 'text', content: JSON.stringify(snippet) }\n        );\n        break;\n      }\n    }\n  }\n&nbsp;\n  addSnippet(newSnippet: ICodeSnippet, index: number): void {\n    // append a new snippet created from input form to the end\n    if (newSnippet.id === -1) {\n      newSnippet.id = this._snippets.length;\n    }\n    this.insertSnippet(newSnippet, index);\n  }\n&nbsp;\n  sortSnippets(): void {\n    this._snippets.sort((a, b) =&gt; a.id - b.id);\n  }\n&nbsp;\n  // move snippetes within explorer\n  moveSnippet(fromIdx: number, toIdx: number): void {\n    if (toIdx &gt; fromIdx) {\n      toIdx = toIdx - 1;\n    }\n    if (toIdx === fromIdx) {\n      return;\n    }\n    const snippetToInsert = this._snippets[fromIdx];\n    this.deleteSnippet(fromIdx);\n    snippetToInsert.id = toIdx;\n&nbsp;\n    this.insertSnippet(snippetToInsert, toIdx);\n    this.updateSnippetContents();\n  }\n&nbsp;\n  /**\n   * Delete a snippet from the list\n   * @param index index to delete. If it's not given, the last one gets deleted.\n   */\n  deleteSnippet(index = <span class=\"branch-0 cbranch-no\" title=\"branch not covered\" >-1)</span>: void {\n    const numSnippets = this._snippets.length;\n    if (index &lt; 0 || index &gt; numSnippets) {\n      this._snippets.pop();\n    } else {\n      // Update list\n      for (let i = index + 1; i &lt; numSnippets; i++) {\n        this._snippets[i].id = this._snippets[i].id - 1;\n      }\n      this._snippets.splice(index, 1);\n    }\n  }\n&nbsp;\n  clearSnippets(): void {\n    this._snippets = [];\n  }\n&nbsp;\n  updateSnippetContents(): void {\n    this._snippets.forEach(snippet =&gt; {\n      CodeSnippetContentsService.getInstance().save(\n        'snippets/' + snippet.name + '.json',\n        { type: 'file', format: 'text', content: JSON.stringify(snippet) }\n      );\n    });\n  }\n&nbsp;\n  /**\n   * insert a snippet to the certain index of the snippet list\n   * @param newSnippet new snippet to insert\n   * @param index index to insert. If it's not given, the snippet is added at the end of the list.\n   */\n  private insertSnippet(newSnippet: ICodeSnippet, index = <span class=\"branch-0 cbranch-no\" title=\"branch not covered\" >-1)</span>: void {\n    const numSnippets = this._snippets.length;\n    // add it at the end of the list\n    if (index &lt; 0 || index &gt;= numSnippets) {\n      this._snippets.push(newSnippet);\n    } else {\n      // Update list\n      for (let i = index; i &lt; numSnippets; i++) {\n        this._snippets[i].id = this._snippets[i].id + 1;\n      }\n      this._snippets.splice(index, 0, newSnippet);\n    }\n  }\n}\n&nbsp;</pre></td></tr></table></pre>\n\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/base.css",
    "content": "body, html {\n  margin:0; padding: 0;\n  height: 100%;\n}\nbody {\n    font-family: Helvetica Neue, Helvetica, Arial;\n    font-size: 14px;\n    color:#333;\n}\n.small { font-size: 12px; }\n*, *:after, *:before {\n  -webkit-box-sizing:border-box;\n     -moz-box-sizing:border-box;\n          box-sizing:border-box;\n  }\nh1 { font-size: 20px; margin: 0;}\nh2 { font-size: 14px; }\npre {\n    font: 12px/1.4 Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n    margin: 0;\n    padding: 0;\n    -moz-tab-size: 2;\n    -o-tab-size:  2;\n    tab-size: 2;\n}\na { color:#0074D9; text-decoration:none; }\na:hover { text-decoration:underline; }\n.strong { font-weight: bold; }\n.space-top1 { padding: 10px 0 0 0; }\n.pad2y { padding: 20px 0; }\n.pad1y { padding: 10px 0; }\n.pad2x { padding: 0 20px; }\n.pad2 { padding: 20px; }\n.pad1 { padding: 10px; }\n.space-left2 { padding-left:55px; }\n.space-right2 { padding-right:20px; }\n.center { text-align:center; }\n.clearfix { display:block; }\n.clearfix:after {\n  content:'';\n  display:block;\n  height:0;\n  clear:both;\n  visibility:hidden;\n  }\n.fl { float: left; }\n@media only screen and (max-width:640px) {\n  .col3 { width:100%; max-width:100%; }\n  .hide-mobile { display:none!important; }\n}\n\n.quiet {\n  color: #7f7f7f;\n  color: rgba(0,0,0,0.5);\n}\n.quiet a { opacity: 0.7; }\n\n.fraction {\n  font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n  font-size: 10px;\n  color: #555;\n  background: #E8E8E8;\n  padding: 4px 5px;\n  border-radius: 3px;\n  vertical-align: middle;\n}\n\ndiv.path a:link, div.path a:visited { color: #333; }\ntable.coverage {\n  border-collapse: collapse;\n  margin: 10px 0 0 0;\n  padding: 0;\n}\n\ntable.coverage td {\n  margin: 0;\n  padding: 0;\n  vertical-align: top;\n}\ntable.coverage td.line-count {\n    text-align: right;\n    padding: 0 5px 0 20px;\n}\ntable.coverage td.line-coverage {\n    text-align: right;\n    padding-right: 10px;\n    min-width:20px;\n}\n\ntable.coverage td span.cline-any {\n    display: inline-block;\n    padding: 0 5px;\n    width: 100%;\n}\n.missing-if-branch {\n    display: inline-block;\n    margin-right: 5px;\n    border-radius: 3px;\n    position: relative;\n    padding: 0 4px;\n    background: #333;\n    color: yellow;\n}\n\n.skip-if-branch {\n    display: none;\n    margin-right: 10px;\n    position: relative;\n    padding: 0 4px;\n    background: #ccc;\n    color: white;\n}\n.missing-if-branch .typ, .skip-if-branch .typ {\n    color: inherit !important;\n}\n.coverage-summary {\n  border-collapse: collapse;\n  width: 100%;\n}\n.coverage-summary tr { border-bottom: 1px solid #bbb; }\n.keyline-all { border: 1px solid #ddd; }\n.coverage-summary td, .coverage-summary th { padding: 10px; }\n.coverage-summary tbody { border: 1px solid #bbb; }\n.coverage-summary td { border-right: 1px solid #bbb; }\n.coverage-summary td:last-child { border-right: none; }\n.coverage-summary th {\n  text-align: left;\n  font-weight: normal;\n  white-space: nowrap;\n}\n.coverage-summary th.file { border-right: none !important; }\n.coverage-summary th.pct { }\n.coverage-summary th.pic,\n.coverage-summary th.abs,\n.coverage-summary td.pct,\n.coverage-summary td.abs { text-align: right; }\n.coverage-summary td.file { white-space: nowrap;  }\n.coverage-summary td.pic { min-width: 120px !important;  }\n.coverage-summary tfoot td { }\n\n.coverage-summary .sorter {\n    height: 10px;\n    width: 7px;\n    display: inline-block;\n    margin-left: 0.5em;\n    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;\n}\n.coverage-summary .sorted .sorter {\n    background-position: 0 -20px;\n}\n.coverage-summary .sorted-desc .sorter {\n    background-position: 0 -10px;\n}\n.status-line {  height: 10px; }\n/* yellow */\n.cbranch-no { background: yellow !important; color: #111; }\n/* dark red */\n.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }\n.low .chart { border:1px solid #C21F39 }\n.highlighted,\n.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{\n  background: #C21F39 !important;\n}\n/* medium red */\n.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }\n/* light red */\n.low, .cline-no { background:#FCE1E5 }\n/* light green */\n.high, .cline-yes { background:rgb(230,245,208) }\n/* medium green */\n.cstat-yes { background:rgb(161,215,106) }\n/* dark green */\n.status-line.high, .high .cover-fill { background:rgb(77,146,33) }\n.high .chart { border:1px solid rgb(77,146,33) }\n/* dark yellow (gold) */\n.status-line.medium, .medium .cover-fill { background: #f9cd0b; }\n.medium .chart { border:1px solid #f9cd0b; }\n/* light yellow */\n.medium { background: #fff4c2; }\n\n.cstat-skip { background: #ddd; color: #111; }\n.fstat-skip { background: #ddd; color: #111 !important; }\n.cbranch-skip { background: #ddd !important; color: #111; }\n\nspan.cline-neutral { background: #eaeaea; }\n\n.coverage-summary td.empty {\n    opacity: .5;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    line-height: 1;\n    color: #888;\n}\n\n.cover-fill, .cover-empty {\n  display:inline-block;\n  height: 12px;\n}\n.chart {\n  line-height: 0;\n}\n.cover-empty {\n    background: white;\n}\n.cover-full {\n    border-right: none !important;\n}\npre.prettyprint {\n    border: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n.com { color: #999 !important; }\n.ignore-none { color: #999; font-weight: normal; }\n\n.wrapper {\n  min-height: 100%;\n  height: auto !important;\n  height: 100%;\n  margin: 0 auto -48px;\n}\n.footer, .push {\n  height: 48px;\n}\n"
  },
  {
    "path": "coverage/lcov-report/block-navigation.js",
    "content": "/* eslint-disable */\nvar jumpToCode = (function init() {\n    // Classes of code we would like to highlight in the file view\n    var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];\n\n    // Elements to highlight in the file listing view\n    var fileListingElements = ['td.pct.low'];\n\n    // We don't want to select elements that are direct descendants of another match\n    var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `\n\n    // Selecter that finds elements on the page to which we can jump\n    var selector =\n        fileListingElements.join(', ') +\n        ', ' +\n        notSelector +\n        missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`\n\n    // The NodeList of matching elements\n    var missingCoverageElements = document.querySelectorAll(selector);\n\n    var currentIndex;\n\n    function toggleClass(index) {\n        missingCoverageElements\n            .item(currentIndex)\n            .classList.remove('highlighted');\n        missingCoverageElements.item(index).classList.add('highlighted');\n    }\n\n    function makeCurrent(index) {\n        toggleClass(index);\n        currentIndex = index;\n        missingCoverageElements.item(index).scrollIntoView({\n            behavior: 'smooth',\n            block: 'center',\n            inline: 'center'\n        });\n    }\n\n    function goToPrevious() {\n        var nextIndex = 0;\n        if (typeof currentIndex !== 'number' || currentIndex === 0) {\n            nextIndex = missingCoverageElements.length - 1;\n        } else if (missingCoverageElements.length > 1) {\n            nextIndex = currentIndex - 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    function goToNext() {\n        var nextIndex = 0;\n\n        if (\n            typeof currentIndex === 'number' &&\n            currentIndex < missingCoverageElements.length - 1\n        ) {\n            nextIndex = currentIndex + 1;\n        }\n\n        makeCurrent(nextIndex);\n    }\n\n    return function jump(event) {\n        switch (event.which) {\n            case 78: // n\n            case 74: // j\n                goToNext();\n                break;\n            case 66: // b\n            case 75: // k\n            case 80: // p\n                goToPrevious();\n                break;\n        }\n    };\n})();\nwindow.addEventListener('keydown', jumpToCode);\n"
  },
  {
    "path": "coverage/lcov-report/index.html",
    "content": "\n<!doctype html>\n<html lang=\"en\">\n\n<head>\n    <title>Code coverage report for All files</title>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"prettify.css\" />\n    <link rel=\"stylesheet\" href=\"base.css\" />\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.png\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type='text/css'>\n        .coverage-summary .sorter {\n            background-image: url(sort-arrow-sprite.png);\n        }\n    </style>\n</head>\n    \n<body>\n<div class='wrapper'>\n    <div class='pad1'>\n        <h1>All files</h1>\n        <div class='clearfix'>\n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Statements</span>\n                <span class='fraction'>70/70</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">90% </span>\n                <span class=\"quiet\">Branches</span>\n                <span class='fraction'>18/20</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Functions</span>\n                <span class='fraction'>20/20</span>\n            </div>\n        \n            \n            <div class='fl pad1y space-right2'>\n                <span class=\"strong\">100% </span>\n                <span class=\"quiet\">Lines</span>\n                <span class='fraction'>66/66</span>\n            </div>\n        \n            \n        </div>\n        <p class=\"quiet\">\n            Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.\n        </p>\n    </div>\n    <div class='status-line high'></div>\n    <div class=\"pad1\">\n<table class=\"coverage-summary\">\n<thead>\n<tr>\n   <th data-col=\"file\" data-fmt=\"html\" data-html=\"true\" class=\"file\">File</th>\n   <th data-col=\"pic\" data-type=\"number\" data-fmt=\"html\" data-html=\"true\" class=\"pic\"></th>\n   <th data-col=\"statements\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Statements</th>\n   <th data-col=\"statements_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"branches\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Branches</th>\n   <th data-col=\"branches_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"functions\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Functions</th>\n   <th data-col=\"functions_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n   <th data-col=\"lines\" data-type=\"number\" data-fmt=\"pct\" class=\"pct\">Lines</th>\n   <th data-col=\"lines_raw\" data-type=\"number\" data-fmt=\"html\" class=\"abs\"></th>\n</tr>\n</thead>\n<tbody><tr>\n\t<td class=\"file high\" data-value=\"CodeSnippetContentsService.ts\"><a href=\"CodeSnippetContentsService.ts.html\">CodeSnippetContentsService.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"24\" class=\"abs high\">24/24</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"2\" class=\"abs high\">2/2</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"6\" class=\"abs high\">6/6</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"24\" class=\"abs high\">24/24</td>\n\t</tr>\n\n<tr>\n\t<td class=\"file high\" data-value=\"CodeSnippetWidgetModel.ts\"><a href=\"CodeSnippetWidgetModel.ts.html\">CodeSnippetWidgetModel.ts</a></td>\n\t<td data-value=\"100\" class=\"pic high\">\n\t<div class=\"chart\"><div class=\"cover-fill cover-full\" style=\"width: 100%\"></div><div class=\"cover-empty\" style=\"width: 0%\"></div></div>\n\t</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"46\" class=\"abs high\">46/46</td>\n\t<td data-value=\"88.89\" class=\"pct high\">88.89%</td>\n\t<td data-value=\"18\" class=\"abs high\">16/18</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"14\" class=\"abs high\">14/14</td>\n\t<td data-value=\"100\" class=\"pct high\">100%</td>\n\t<td data-value=\"42\" class=\"abs high\">42/42</td>\n\t</tr>\n\n</tbody>\n</table>\n</div>\n                <div class='push'></div><!-- for sticky footer -->\n            </div><!-- /wrapper -->\n            <div class='footer quiet pad2 space-top1 center small'>\n                Code coverage generated by\n                <a href=\"https://istanbul.js.org/\" target=\"_blank\">istanbul</a>\n                at Tue Nov 17 2020 11:49:34 GMT-0800 (Pacific Standard Time)\n            </div>\n        </div>\n        <script src=\"prettify.js\"></script>\n        <script>\n            window.onload = function () {\n                prettyPrint();\n            };\n        </script>\n        <script src=\"sorter.js\"></script>\n        <script src=\"block-navigation.js\"></script>\n    </body>\n</html>\n    "
  },
  {
    "path": "coverage/lcov-report/prettify.css",
    "content": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}\n"
  },
  {
    "path": "coverage/lcov-report/prettify.js",
    "content": "/* eslint-disable */\nwindow.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=[\"break,continue,do,else,for,if,return,while\"];var u=[h,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];var p=[u,\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"];var l=[p,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"];var x=[p,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"];var R=[x,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"];var r=\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\";var w=[p,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"];var s=\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\";var I=[h,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"];var f=[h,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"];var H=[h,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/;var C=\"str\";var z=\"kwd\";var j=\"com\";var O=\"typ\";var G=\"lit\";var L=\"pun\";var F=\"pln\";var m=\"tag\";var E=\"dec\";var J=\"src\";var P=\"atn\";var n=\"atv\";var N=\"nocode\";var M=\"(?:^^\\\\.?|[+-]|\\\\!|\\\\!=|\\\\!==|\\\\#|\\\\%|\\\\%=|&|&&|&&=|&=|\\\\(|\\\\*|\\\\*=|\\\\+=|\\\\,|\\\\-=|\\\\->|\\\\/|\\\\/=|:|::|\\\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\@|\\\\[|\\\\^|\\\\^=|\\\\^\\\\^|\\\\^\\\\^=|\\\\{|\\\\||\\\\|=|\\\\|\\\\||\\\\|\\\\|=|\\\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*\";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if(\"0\"<=af&&af<=\"7\"){return parseInt(ah.substring(1),8)}else{if(af===\"u\"||af===\"x\"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?\"\\\\x0\":\"\\\\x\")+af.toString(16)}var ag=String.fromCharCode(af);if(ag===\"\\\\\"||ag===\"-\"||ag===\"[\"||ag===\"]\"){ag=\"\\\\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp(\"\\\\\\\\u[0-9A-Fa-f]{4}|\\\\\\\\x[0-9A-Fa-f]{2}|\\\\\\\\[0-3][0-7]{0,2}|\\\\\\\\[0-7]{1,2}|\\\\\\\\[\\\\s\\\\S]|-|[^-\\\\\\\\]\",\"g\"));var ak=[];var af=[];var ao=aq[0]===\"^\";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&\"-\"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=[\"[\"];if(ao){an.push(\"^\")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push(\"-\")}an.push(T(at[1]))}}an.push(\"]\");return an.join(\"\")}function W(al){var aj=al.source.match(new RegExp(\"(?:\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]|\\\\\\\\u[A-Fa-f0-9]{4}|\\\\\\\\x[A-Fa-f0-9]{2}|\\\\\\\\[0-9]+|\\\\\\\\[^ux0-9]|\\\\(\\\\?[:!=]|[\\\\(\\\\)\\\\^]|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+)\",\"g\"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag===\"(\"){++am}else{if(\"\\\\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag===\"(\"){++am;if(an[am]===undefined){aj[ak]=\"(?:\"}}else{if(\"\\\\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]=\"\\\\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if(\"^\"===aj[ak]&&\"^\"!==aj[ak+1]){aj[ak]=\"\"}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai===\"[\"){aj[ak]=X(ag)}else{if(ai!==\"\\\\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return\"[\"+String.fromCharCode(ap&~32,ap|32)+\"]\"})}}}}return aj.join(\"\")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(\"\"+ae)}aa.push(\"(?:\"+W(ae)+\")\")}return new RegExp(aa.join(\"|\"),ac?\"gi\":\"g\")}function a(V){var U=/(?:^|\\s)nocode(?:\\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue(\"white-space\")}}var Y=S&&\"pre\"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if(\"BR\"===ad||\"LI\"===ad){X[W]=\"\\n\";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \\t\\r\\n]+/g,\" \")}else{ac=ac.replace(/\\r\\n?/g,\"\\n\")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join(\"\").replace(/\\n$/,\"\"),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=\"\"+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\\0-\\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap===\"string\"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&\"lang-\"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]===\"string\")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,null,\"'\\\"\"])}else{if(T.multiLineStrings){W.push([C,/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"])}else{W.push([C,/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"])}}if(T.verbatimStrings){S.push([C,/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,null,\"#\"])}S.push([C,/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,null])}else{W.push([j,/^#[^\\r\\n]*/,null,\"#\"])}}if(T.cStyleComments){S.push([j,/^\\/\\/[^\\r\\n]*/,null]);S.push([j,/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null])}if(T.regexLiterals){var X=(\"/(?=[^/*])(?:[^/\\\\x5B\\\\x5C]|\\\\x5C[\\\\s\\\\S]|\\\\x5B(?:[^\\\\x5C\\\\x5D]|\\\\x5C[\\\\s\\\\S])*(?:\\\\x5D|$))+/\");S.push([\"lang-regex\",new RegExp(\"^\"+M+\"(\"+X+\")\")])}var V=T.types;if(V){S.push([O,V])}var U=(\"\"+T.keywords).replace(/^ | $/g,\"\");if(U.length){S.push([z,new RegExp(\"^(?:\"+U.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null])}W.push([F,/^\\s+/,null,\" \\r\\n\\t\\xA0\"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp(\"^(?:0x[a-f0-9]+|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)(?:e[+\\\\-]?\\\\d+)?)[a-z]*\",\"i\"),null,\"0123456789\"],[F,/^\\\\[\\s\\S]?/,null],[L,/^.[^\\s\\w\\.$@\\'\\\"\\`\\/\\#\\\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\\s)nocode(?:\\s|$)/;var ab=/\\r\\n?|\\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue(\"white-space\")}}var Z=S&&\"pre\"===S.substring(0,3);var af=ac.createElement(\"LI\");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if(\"BR\"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute(\"value\",ag)}var aa=ac.createElement(\"OL\");aa.className=\"linenums\";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className=\"L\"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode(\"\\xA0\"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\\bMSIE\\b/.test(navigator.userAgent);var am=/\\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,\"\\r\")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement(\"SPAN\");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn(\"cannot override language handler %s\",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\\s*</.test(S)?\"default-markup\":\"default-code\"}return t[T]}c(K,[\"default-code\"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\\w[^>]*(?:>|$)/],[j,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);c(g([[F,/^[\\s]+/,null,\" \\t\\r\\n\"],[n,/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\"\\\"'\"]],[[m,/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[P,/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[L,/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]);c(g([],[[n,/^[\\s\\S]+/]]),[\"uq.val\"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);c(i({keywords:\"null,true,false\"}),[\"json\"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),[\"cs\"]);c(i({keywords:x,cStyleComments:true}),[\"java\"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),[\"bsh\",\"csh\",\"sh\"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),[\"cv\",\"py\"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"perl\",\"pl\",\"pm\"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"rb\"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),[\"js\"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),[\"coffee\"]);c(g([],[[C,/^[\\s\\S]+/]]),[\"regex\"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if(\"console\" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement(\"PRE\");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y(\"pre\"),Y(\"code\"),Y(\"xmp\")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;var ae=/\\bprettyprint\\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf(\"prettyprint\")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&\"CODE\"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName===\"pre\"||ak.tagName===\"code\"||ak.tagName===\"xmp\")&&ak.className&&ak.className.indexOf(\"prettyprint\")>=0){al=true;break}}if(!al){var af=aj.className.match(/\\blinenums\\b(?::(\\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-handlebars\",/^<script\\b[^>]*type\\s*=\\s*['\"]?text\\/x-handlebars-template['\"]?\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\\s*[\\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\\s*[\\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\\s*[\\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),[\"handlebars\",\"hbs\"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \\t\\r\\n\\f]+/,null,\" \\t\\r\\n\\f\"]],[[PR.PR_STRING,/^\\\"(?:[^\\n\\r\\f\\\\\\\"]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\\"/,null],[PR.PR_STRING,/^\\'(?:[^\\n\\r\\f\\\\\\']|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\'/,null],[\"lang-css-str\",/^url\\(([^\\)\\\"\\']*)\\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\\!important|@import|@page|@media|@charset|inherit)(?=[^\\-\\w]|$)/i,null],[\"lang-css-kw\",/^(-?(?:[_a-z]|(?:\\\\[0-9a-f]+ ?))(?:[_a-z0-9\\-]|\\\\(?:\\\\[0-9a-f]+ ?))*)\\s*:/i],[PR.PR_COMMENT,/^\\/\\*[^*]*\\*+(?:[^\\/*][^*]*\\*+)*\\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\\d+|\\d*\\.\\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\\s\\w\\'\\\"]+/]]),[\"css\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i]]),[\"css-kw\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\\)\\\"\\']+/]]),[\"css-str\"]);\n"
  },
  {
    "path": "coverage/lcov-report/sorter.js",
    "content": "/* eslint-disable */\nvar addSorting = (function() {\n    'use strict';\n    var cols,\n        currentSort = {\n            index: 0,\n            desc: false\n        };\n\n    // returns the summary table element\n    function getTable() {\n        return document.querySelector('.coverage-summary');\n    }\n    // returns the thead element of the summary table\n    function getTableHeader() {\n        return getTable().querySelector('thead tr');\n    }\n    // returns the tbody element of the summary table\n    function getTableBody() {\n        return getTable().querySelector('tbody');\n    }\n    // returns the th element for nth column\n    function getNthColumn(n) {\n        return getTableHeader().querySelectorAll('th')[n];\n    }\n\n    // loads all columns\n    function loadColumns() {\n        var colNodes = getTableHeader().querySelectorAll('th'),\n            colNode,\n            cols = [],\n            col,\n            i;\n\n        for (i = 0; i < colNodes.length; i += 1) {\n            colNode = colNodes[i];\n            col = {\n                key: colNode.getAttribute('data-col'),\n                sortable: !colNode.getAttribute('data-nosort'),\n                type: colNode.getAttribute('data-type') || 'string'\n            };\n            cols.push(col);\n            if (col.sortable) {\n                col.defaultDescSort = col.type === 'number';\n                colNode.innerHTML =\n                    colNode.innerHTML + '<span class=\"sorter\"></span>';\n            }\n        }\n        return cols;\n    }\n    // attaches a data attribute to every tr element with an object\n    // of data values keyed by column name\n    function loadRowData(tableRow) {\n        var tableCols = tableRow.querySelectorAll('td'),\n            colNode,\n            col,\n            data = {},\n            i,\n            val;\n        for (i = 0; i < tableCols.length; i += 1) {\n            colNode = tableCols[i];\n            col = cols[i];\n            val = colNode.getAttribute('data-value');\n            if (col.type === 'number') {\n                val = Number(val);\n            }\n            data[col.key] = val;\n        }\n        return data;\n    }\n    // loads all row data\n    function loadData() {\n        var rows = getTableBody().querySelectorAll('tr'),\n            i;\n\n        for (i = 0; i < rows.length; i += 1) {\n            rows[i].data = loadRowData(rows[i]);\n        }\n    }\n    // sorts the table using the data for the ith column\n    function sortByIndex(index, desc) {\n        var key = cols[index].key,\n            sorter = function(a, b) {\n                a = a.data[key];\n                b = b.data[key];\n                return a < b ? -1 : a > b ? 1 : 0;\n            },\n            finalSorter = sorter,\n            tableBody = document.querySelector('.coverage-summary tbody'),\n            rowNodes = tableBody.querySelectorAll('tr'),\n            rows = [],\n            i;\n\n        if (desc) {\n            finalSorter = function(a, b) {\n                return -1 * sorter(a, b);\n            };\n        }\n\n        for (i = 0; i < rowNodes.length; i += 1) {\n            rows.push(rowNodes[i]);\n            tableBody.removeChild(rowNodes[i]);\n        }\n\n        rows.sort(finalSorter);\n\n        for (i = 0; i < rows.length; i += 1) {\n            tableBody.appendChild(rows[i]);\n        }\n    }\n    // removes sort indicators for current column being sorted\n    function removeSortIndicators() {\n        var col = getNthColumn(currentSort.index),\n            cls = col.className;\n\n        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');\n        col.className = cls;\n    }\n    // adds sort indicators for current column being sorted\n    function addSortIndicators() {\n        getNthColumn(currentSort.index).className += currentSort.desc\n            ? ' sorted-desc'\n            : ' sorted';\n    }\n    // adds event listeners for all sorter widgets\n    function enableUI() {\n        var i,\n            el,\n            ithSorter = function ithSorter(i) {\n                var col = cols[i];\n\n                return function() {\n                    var desc = col.defaultDescSort;\n\n                    if (currentSort.index === i) {\n                        desc = !currentSort.desc;\n                    }\n                    sortByIndex(i, desc);\n                    removeSortIndicators();\n                    currentSort.index = i;\n                    currentSort.desc = desc;\n                    addSortIndicators();\n                };\n            };\n        for (i = 0; i < cols.length; i += 1) {\n            if (cols[i].sortable) {\n                // add the click event handler on the th so users\n                // dont have to click on those tiny arrows\n                el = getNthColumn(i).querySelector('.sorter').parentElement;\n                if (el.addEventListener) {\n                    el.addEventListener('click', ithSorter(i));\n                } else {\n                    el.attachEvent('onclick', ithSorter(i));\n                }\n            }\n        }\n    }\n    // adds sorting functionality to the UI\n    return function() {\n        if (!getTable()) {\n            return;\n        }\n        cols = loadColumns();\n        loadData();\n        addSortIndicators();\n        enableUI();\n    };\n})();\n\nwindow.addEventListener('load', addSorting);\n"
  },
  {
    "path": "coverage/lcov.info",
    "content": "TN:\nSF:src/CodeSnippetContentsService.ts\nFN:20,(anonymous_7)\nFN:27,(anonymous_8)\nFN:38,(anonymous_9)\nFN:67,(anonymous_11)\nFN:90,(anonymous_13)\nFN:105,(anonymous_15)\nFNF:6\nFNH:6\nFNDA:2,(anonymous_7)\nFNDA:4,(anonymous_8)\nFNDA:2,(anonymous_9)\nFNDA:4,(anonymous_11)\nFNDA:2,(anonymous_13)\nFNDA:1,(anonymous_15)\nDA:1,2\nDA:16,2\nDA:21,2\nDA:22,2\nDA:23,2\nDA:24,2\nDA:28,4\nDA:29,2\nDA:31,4\nDA:42,2\nDA:43,2\nDA:48,1\nDA:50,1\nDA:71,4\nDA:72,4\nDA:73,1\nDA:75,3\nDA:91,2\nDA:92,2\nDA:93,1\nDA:95,1\nDA:106,1\nDA:107,1\nDA:109,1\nLF:24\nLH:24\nBRDA:28,0,0,2\nBRDA:28,0,1,2\nBRF:2\nBRH:2\nend_of_record\nTN:\nSF:src/CodeSnippetWidgetModel.ts\nFN:16,(anonymous_0)\nFN:20,(anonymous_1)\nFN:25,(anonymous_2)\nFN:29,(anonymous_3)\nFN:36,(anonymous_4)\nFN:49,(anonymous_5)\nFN:57,(anonymous_6)\nFN:58,(anonymous_7)\nFN:62,(anonymous_8)\nFN:81,(anonymous_9)\nFN:94,(anonymous_10)\nFN:98,(anonymous_11)\nFN:99,(anonymous_12)\nFN:112,(anonymous_13)\nFNF:14\nFNH:14\nFNDA:1,(anonymous_0)\nFNDA:17,(anonymous_1)\nFNDA:2,(anonymous_2)\nFNDA:1,(anonymous_3)\nFNDA:1,(anonymous_4)\nFNDA:3,(anonymous_5)\nFNDA:19,(anonymous_6)\nFNDA:14,(anonymous_7)\nFNDA:2,(anonymous_8)\nFNDA:3,(anonymous_9)\nFNDA:1,(anonymous_10)\nFNDA:1,(anonymous_11)\nFNDA:2,(anonymous_12)\nFNDA:4,(anonymous_13)\nDA:1,1\nDA:13,1\nDA:17,1\nDA:21,17\nDA:22,17\nDA:26,2\nDA:30,1\nDA:31,1\nDA:32,2\nDA:37,1\nDA:38,2\nDA:39,1\nDA:40,1\nDA:44,1\nDA:51,3\nDA:52,1\nDA:54,3\nDA:58,19\nDA:63,2\nDA:64,1\nDA:66,2\nDA:67,1\nDA:69,1\nDA:70,1\nDA:71,1\nDA:73,1\nDA:74,1\nDA:82,3\nDA:83,3\nDA:84,1\nDA:87,2\nDA:88,2\nDA:90,2\nDA:95,1\nDA:99,1\nDA:100,2\nDA:113,4\nDA:115,4\nDA:116,3\nDA:119,1\nDA:120,1\nDA:122,1\nLF:42\nLH:42\nBRDA:38,0,0,1\nBRDA:38,0,1,1\nBRDA:51,1,0,1\nBRDA:51,1,1,2\nBRDA:63,2,0,1\nBRDA:63,2,1,1\nBRDA:66,3,0,1\nBRDA:66,3,1,1\nBRDA:81,4,0,0\nBRDA:83,5,0,1\nBRDA:83,5,1,2\nBRDA:83,6,0,3\nBRDA:83,6,1,2\nBRDA:112,7,0,0\nBRDA:115,8,0,3\nBRDA:115,8,1,1\nBRDA:115,9,0,4\nBRDA:115,9,1,3\nBRF:18\nBRH:16\nend_of_record\n"
  },
  {
    "path": "coverage/prettify.css",
    "content": ".pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}\n"
  },
  {
    "path": "coverage/prettify.js",
    "content": "/* eslint-disable */\nwindow.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=[\"break,continue,do,else,for,if,return,while\"];var u=[h,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"];var p=[u,\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"];var l=[p,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"];var x=[p,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"];var R=[x,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"];var r=\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\";var w=[p,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"];var s=\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\";var I=[h,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"];var f=[h,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"];var H=[h,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/;var C=\"str\";var z=\"kwd\";var j=\"com\";var O=\"typ\";var G=\"lit\";var L=\"pun\";var F=\"pln\";var m=\"tag\";var E=\"dec\";var J=\"src\";var P=\"atn\";var n=\"atv\";var N=\"nocode\";var M=\"(?:^^\\\\.?|[+-]|\\\\!|\\\\!=|\\\\!==|\\\\#|\\\\%|\\\\%=|&|&&|&&=|&=|\\\\(|\\\\*|\\\\*=|\\\\+=|\\\\,|\\\\-=|\\\\->|\\\\/|\\\\/=|:|::|\\\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\@|\\\\[|\\\\^|\\\\^=|\\\\^\\\\^|\\\\^\\\\^=|\\\\{|\\\\||\\\\|=|\\\\|\\\\||\\\\|\\\\|=|\\\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*\";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi,\"\"))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if(\"0\"<=af&&af<=\"7\"){return parseInt(ah.substring(1),8)}else{if(af===\"u\"||af===\"x\"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?\"\\\\x0\":\"\\\\x\")+af.toString(16)}var ag=String.fromCharCode(af);if(ag===\"\\\\\"||ag===\"-\"||ag===\"[\"||ag===\"]\"){ag=\"\\\\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp(\"\\\\\\\\u[0-9A-Fa-f]{4}|\\\\\\\\x[0-9A-Fa-f]{2}|\\\\\\\\[0-3][0-7]{0,2}|\\\\\\\\[0-7]{1,2}|\\\\\\\\[\\\\s\\\\S]|-|[^-\\\\\\\\]\",\"g\"));var ak=[];var af=[];var ao=aq[0]===\"^\";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&\"-\"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=[\"[\"];if(ao){an.push(\"^\")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push(\"-\")}an.push(T(at[1]))}}an.push(\"]\");return an.join(\"\")}function W(al){var aj=al.source.match(new RegExp(\"(?:\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]|\\\\\\\\u[A-Fa-f0-9]{4}|\\\\\\\\x[A-Fa-f0-9]{2}|\\\\\\\\[0-9]+|\\\\\\\\[^ux0-9]|\\\\(\\\\?[:!=]|[\\\\(\\\\)\\\\^]|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+)\",\"g\"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag===\"(\"){++am}else{if(\"\\\\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag===\"(\"){++am;if(an[am]===undefined){aj[ak]=\"(?:\"}}else{if(\"\\\\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]=\"\\\\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if(\"^\"===aj[ak]&&\"^\"!==aj[ak+1]){aj[ak]=\"\"}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai===\"[\"){aj[ak]=X(ag)}else{if(ai!==\"\\\\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return\"[\"+String.fromCharCode(ap&~32,ap|32)+\"]\"})}}}}return aj.join(\"\")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(\"\"+ae)}aa.push(\"(?:\"+W(ae)+\")\")}return new RegExp(aa.join(\"|\"),ac?\"gi\":\"g\")}function a(V){var U=/(?:^|\\s)nocode(?:\\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue(\"white-space\")}}var Y=S&&\"pre\"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if(\"BR\"===ad||\"LI\"===ad){X[W]=\"\\n\";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \\t\\r\\n]+/g,\" \")}else{ac=ac.replace(/\\r\\n?/g,\"\\n\")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join(\"\").replace(/\\n$/,\"\"),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=\"\"+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\\0-\\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap===\"string\"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&\"lang-\"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]===\"string\")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,null,\"'\\\"\"])}else{if(T.multiLineStrings){W.push([C,/^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,null,\"'\\\"`\"])}else{W.push([C,/^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,null,\"\\\"'\"])}}if(T.verbatimStrings){S.push([C,/^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,\"#\"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,null,\"#\"])}S.push([C,/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,null])}else{W.push([j,/^#[^\\r\\n]*/,null,\"#\"])}}if(T.cStyleComments){S.push([j,/^\\/\\/[^\\r\\n]*/,null]);S.push([j,/^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,null])}if(T.regexLiterals){var X=(\"/(?=[^/*])(?:[^/\\\\x5B\\\\x5C]|\\\\x5C[\\\\s\\\\S]|\\\\x5B(?:[^\\\\x5C\\\\x5D]|\\\\x5C[\\\\s\\\\S])*(?:\\\\x5D|$))+/\");S.push([\"lang-regex\",new RegExp(\"^\"+M+\"(\"+X+\")\")])}var V=T.types;if(V){S.push([O,V])}var U=(\"\"+T.keywords).replace(/^ | $/g,\"\");if(U.length){S.push([z,new RegExp(\"^(?:\"+U.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),null])}W.push([F,/^\\s+/,null,\" \\r\\n\\t\\xA0\"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp(\"^(?:0x[a-f0-9]+|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)(?:e[+\\\\-]?\\\\d+)?)[a-z]*\",\"i\"),null,\"0123456789\"],[F,/^\\\\[\\s\\S]?/,null],[L,/^.[^\\s\\w\\.$@\\'\\\"\\`\\/\\#\\\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\\s)nocode(?:\\s|$)/;var ab=/\\r\\n?|\\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue(\"white-space\")}}var Z=S&&\"pre\"===S.substring(0,3);var af=ac.createElement(\"LI\");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if(\"BR\"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute(\"value\",ag)}var aa=ac.createElement(\"OL\");aa.className=\"linenums\";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className=\"L\"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode(\"\\xA0\"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\\bMSIE\\b/.test(navigator.userAgent);var am=/\\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,\"\\r\")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement(\"SPAN\");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn(\"cannot override language handler %s\",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\\s*</.test(S)?\"default-markup\":\"default-code\"}return t[T]}c(K,[\"default-code\"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\\w[^>]*(?:>|$)/],[j,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);c(g([[F,/^[\\s]+/,null,\" \\t\\r\\n\"],[n,/^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/,null,\"\\\"'\"]],[[m,/^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],[P,/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],[L,/^[=<>\\/]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],[\"lang-css\",/^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],[\"lang-css\",/^style\\s*=\\s*\\'([^\\']+)\\'/i],[\"lang-css\",/^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]]),[\"in.tag\"]);c(g([],[[n,/^[\\s\\S]+/]]),[\"uq.val\"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);c(i({keywords:\"null,true,false\"}),[\"json\"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),[\"cs\"]);c(i({keywords:x,cStyleComments:true}),[\"java\"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),[\"bsh\",\"csh\",\"sh\"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),[\"cv\",\"py\"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"perl\",\"pl\",\"pm\"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),[\"rb\"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),[\"js\"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),[\"coffee\"]);c(g([],[[C,/^[\\s\\S]+/]]),[\"regex\"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if(\"console\" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement(\"PRE\");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y(\"pre\"),Y(\"code\"),Y(\"xmp\")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;var ae=/\\bprettyprint\\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf(\"prettyprint\")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&\"CODE\"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName===\"pre\"||ak.tagName===\"code\"||ak.tagName===\"xmp\")&&ak.className&&ak.className.indexOf(\"prettyprint\")>=0){al=true;break}}if(!al){var af=aj.className.match(/\\blinenums\\b(?::(\\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\\!--[\\s\\S]*?(?:-\\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<\\?([\\s\\S]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\s\\S]+?)(?:%>|$)/],[\"lang-\",/^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],[\"lang-handlebars\",/^<script\\b[^>]*type\\s*=\\s*['\"]?text\\/x-handlebars-template['\"]?\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-js\",/^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\\s*[\\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\\s*[\\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\\s*[\\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),[\"handlebars\",\"hbs\"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \\t\\r\\n\\f]+/,null,\" \\t\\r\\n\\f\"]],[[PR.PR_STRING,/^\\\"(?:[^\\n\\r\\f\\\\\\\"]|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\\"/,null],[PR.PR_STRING,/^\\'(?:[^\\n\\r\\f\\\\\\']|\\\\(?:\\r\\n?|\\n|\\f)|\\\\[\\s\\S])*\\'/,null],[\"lang-css-str\",/^url\\(([^\\)\\\"\\']*)\\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\\!important|@import|@page|@media|@charset|inherit)(?=[^\\-\\w]|$)/i,null],[\"lang-css-kw\",/^(-?(?:[_a-z]|(?:\\\\[0-9a-f]+ ?))(?:[_a-z0-9\\-]|\\\\(?:\\\\[0-9a-f]+ ?))*)\\s*:/i],[PR.PR_COMMENT,/^\\/\\*[^*]*\\*+(?:[^\\/*][^*]*\\*+)*\\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\\d+|\\d*\\.\\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\\s\\w\\'\\\"]+/]]),[\"css\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\\\[\\da-f]+ ?))(?:[_a-z\\d\\-]|\\\\(?:\\\\[\\da-f]+ ?))*/i]]),[\"css-kw\"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\\)\\\"\\']+/]]),[\"css-str\"]);\n"
  },
  {
    "path": "coverage/sorter.js",
    "content": "/* eslint-disable */\nvar addSorting = (function() {\n    'use strict';\n    var cols,\n        currentSort = {\n            index: 0,\n            desc: false\n        };\n\n    // returns the summary table element\n    function getTable() {\n        return document.querySelector('.coverage-summary');\n    }\n    // returns the thead element of the summary table\n    function getTableHeader() {\n        return getTable().querySelector('thead tr');\n    }\n    // returns the tbody element of the summary table\n    function getTableBody() {\n        return getTable().querySelector('tbody');\n    }\n    // returns the th element for nth column\n    function getNthColumn(n) {\n        return getTableHeader().querySelectorAll('th')[n];\n    }\n\n    // loads all columns\n    function loadColumns() {\n        var colNodes = getTableHeader().querySelectorAll('th'),\n            colNode,\n            cols = [],\n            col,\n            i;\n\n        for (i = 0; i < colNodes.length; i += 1) {\n            colNode = colNodes[i];\n            col = {\n                key: colNode.getAttribute('data-col'),\n                sortable: !colNode.getAttribute('data-nosort'),\n                type: colNode.getAttribute('data-type') || 'string'\n            };\n            cols.push(col);\n            if (col.sortable) {\n                col.defaultDescSort = col.type === 'number';\n                colNode.innerHTML =\n                    colNode.innerHTML + '<span class=\"sorter\"></span>';\n            }\n        }\n        return cols;\n    }\n    // attaches a data attribute to every tr element with an object\n    // of data values keyed by column name\n    function loadRowData(tableRow) {\n        var tableCols = tableRow.querySelectorAll('td'),\n            colNode,\n            col,\n            data = {},\n            i,\n            val;\n        for (i = 0; i < tableCols.length; i += 1) {\n            colNode = tableCols[i];\n            col = cols[i];\n            val = colNode.getAttribute('data-value');\n            if (col.type === 'number') {\n                val = Number(val);\n            }\n            data[col.key] = val;\n        }\n        return data;\n    }\n    // loads all row data\n    function loadData() {\n        var rows = getTableBody().querySelectorAll('tr'),\n            i;\n\n        for (i = 0; i < rows.length; i += 1) {\n            rows[i].data = loadRowData(rows[i]);\n        }\n    }\n    // sorts the table using the data for the ith column\n    function sortByIndex(index, desc) {\n        var key = cols[index].key,\n            sorter = function(a, b) {\n                a = a.data[key];\n                b = b.data[key];\n                return a < b ? -1 : a > b ? 1 : 0;\n            },\n            finalSorter = sorter,\n            tableBody = document.querySelector('.coverage-summary tbody'),\n            rowNodes = tableBody.querySelectorAll('tr'),\n            rows = [],\n            i;\n\n        if (desc) {\n            finalSorter = function(a, b) {\n                return -1 * sorter(a, b);\n            };\n        }\n\n        for (i = 0; i < rowNodes.length; i += 1) {\n            rows.push(rowNodes[i]);\n            tableBody.removeChild(rowNodes[i]);\n        }\n\n        rows.sort(finalSorter);\n\n        for (i = 0; i < rows.length; i += 1) {\n            tableBody.appendChild(rows[i]);\n        }\n    }\n    // removes sort indicators for current column being sorted\n    function removeSortIndicators() {\n        var col = getNthColumn(currentSort.index),\n            cls = col.className;\n\n        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');\n        col.className = cls;\n    }\n    // adds sort indicators for current column being sorted\n    function addSortIndicators() {\n        getNthColumn(currentSort.index).className += currentSort.desc\n            ? ' sorted-desc'\n            : ' sorted';\n    }\n    // adds event listeners for all sorter widgets\n    function enableUI() {\n        var i,\n            el,\n            ithSorter = function ithSorter(i) {\n                var col = cols[i];\n\n                return function() {\n                    var desc = col.defaultDescSort;\n\n                    if (currentSort.index === i) {\n                        desc = !currentSort.desc;\n                    }\n                    sortByIndex(i, desc);\n                    removeSortIndicators();\n                    currentSort.index = i;\n                    currentSort.desc = desc;\n                    addSortIndicators();\n                };\n            };\n        for (i = 0; i < cols.length; i += 1) {\n            if (cols[i].sortable) {\n                // add the click event handler on the th so users\n                // dont have to click on those tiny arrows\n                el = getNthColumn(i).querySelector('.sorter').parentElement;\n                if (el.addEventListener) {\n                    el.addEventListener('click', ithSorter(i));\n                } else {\n                    el.attachEvent('onclick', ithSorter(i));\n                }\n            }\n        }\n    }\n    // adds sorting functionality to the UI\n    return function() {\n        if (!getTable()) {\n            return;\n        }\n        cols = loadColumns();\n        loadData();\n        addSortIndicators();\n        enableUI();\n    };\n})();\n\nwindow.addEventListener('load', addSorting);\n"
  },
  {
    "path": "cypress/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mock data for responses to routes\"\n}"
  },
  {
    "path": "cypress/integration/codeSnippetService.spec.js",
    "content": "describe('Test Code Snippet Extension on load', () => {\n    beforeEach(() => {\n        cy.visit('http://localhost:8888/lab')\n    })\n\n    // it('Create code snippet settings on load', () => {\n    //     cy.get('.jp-PluginList > ul > li').eq(1).should('have.attr', 'data-id', 'jupyterlab-code-snippets:snippets')\n    // })\n\n    it('Create default snippets in the beginning', () => {\n        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 3)\n    })\n})\n\ndescribe('Test Code Snippet Manipulation', () => {\n    beforeEach(() => {\n        cy.visit('http://localhost:8888/lab')\n    })\n\n    it('Create a new code snippet', () => {\n        // adding a snippet\n        cy.get('.jp-Notebook').rightclick()\n            .get('.lm-Menu-itemLabel').eq(13).click()\n            .wait(500)\n            .get('.jp-codeSnippet-dialog-input').eq(0).click().type(\"test\").should('have.value', 'test')\n            .wait(500)\n            .get('.jp-codeSnippet-dialog-input').eq(1).click().type(\"testing with cypress\").should('have.value', 'testing with cypress')\n            .wait(500)\n            .get('.jp-codeSnippet-dialog-input').eq(2).click().type(\"Python\").should('have.value', 'Python')\n            .get('.jp-mod-accept').click();\n\n        cy.get('.lm-Widget').eq(0).click({force: true});\n\n        // checking the snippet\n        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 4);\n    })\n\n    it('Delete a new code snippet', () => {\n        // delete snippet\n        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-button').click()\n            .get('.jp-codeSnippet-more-options-delete').click()\n            .get('.jp-mod-accept').click()\n\n        // checking the snippet\n        cy.get('.jp-codeSnippetsContainer').find('.jp-codeSnippet-item').should('have.length', 3);\n    })\n    \n    it('Renaming a snippet', () => {\n        cy.wait(500)\n        // rename snippet\n        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-name > span').eq(1).dblclick()\n            .get('#jp-codeSnippet-rename').type('new_test')\n\n        cy.wait(500)\n        // rename with duplicate name\n        cy.get('.jp-codeSnippet-item #1 > .jp-codeSnippetsContainer-name > span').eq(1).dblclick()\n        .get('#jp-codeSnippet-rename').type('new_test')\n        .get('.lm-StackedPanel').eq(0).click({force:true})\n        .get('.jp-mod-accept').click()\n\n    })\n\n    it('Create a new code snippet from scratch', () => {\n        cy.get('.jp-createSnippetBtn').click().get('.jp-codeSnippet-editor-name').type('create_test').should('have.value', 'create_test')\n            .get('.jp-codeSnippet-editor-description').type('testing').should('have.value', 'testing')\n            .get('.saveBtn').click()\n    })\n\n    it.only('Edit a snippet', () => {\n        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-button').click()\n            .get('.jp-codeSnippet-more-options-edit').click()\n            .wait(500)\n            .get('.jp-codeSnippet-editor-name').clear().type('test_editing').should('have.value', 'test_editing')\n            .wait(500)\n            .get('.jp-codeSnippet-editor-name').clear().type('test_editing').should('have.value', 'test_editing')\n            .get('.saveBtn').click()\n\n        cy.get('.jp-codeSnippet-item #0 > .jp-codeSnippetsContainer-name > span').eq(1).contains('test_editing')\n    })\n    // it.only('moving a snippet', () => {\n    //     cy.visit('http://localhost:8888/lab')\n\n    //     cy.wait(500)\n    //     cy.get('.jp-codeSnippet-drag-hover').eq(0)\n    //         .dragTo(':nth-child(3) > .jp-codeSnippet-metadata')\n    //         .get('.jp-codeSnippet-item #1 > .jp-codeSnippetsContainer-name > span').eq(1).contains('test')\n    // })\n})"
  },
  {
    "path": "cypress/integration/examples/actions.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Actions', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/actions')\n  })\n\n  // https://on.cypress.io/interacting-with-elements\n\n  it('.type() - type into a DOM element', () => {\n    // https://on.cypress.io/type\n    cy.get('.action-email')\n      .type('fake@email.com').should('have.value', 'fake@email.com')\n\n      // .type() with special character sequences\n      .type('{leftarrow}{rightarrow}{uparrow}{downarrow}')\n      .type('{del}{selectall}{backspace}')\n\n      // .type() with key modifiers\n      .type('{alt}{option}') //these are equivalent\n      .type('{ctrl}{control}') //these are equivalent\n      .type('{meta}{command}{cmd}') //these are equivalent\n      .type('{shift}')\n\n      // Delay each keypress by 0.1 sec\n      .type('slow.typing@email.com', { delay: 100 })\n      .should('have.value', 'slow.typing@email.com')\n\n    cy.get('.action-disabled')\n      // Ignore error checking prior to type\n      // like whether the input is visible or disabled\n      .type('disabled error checking', { force: true })\n      .should('have.value', 'disabled error checking')\n  })\n\n  it('.focus() - focus on a DOM element', () => {\n    // https://on.cypress.io/focus\n    cy.get('.action-focus').focus()\n      .should('have.class', 'focus')\n      .prev().should('have.attr', 'style', 'color: orange;')\n  })\n\n  it('.blur() - blur off a DOM element', () => {\n    // https://on.cypress.io/blur\n    cy.get('.action-blur').type('About to blur').blur()\n      .should('have.class', 'error')\n      .prev().should('have.attr', 'style', 'color: red;')\n  })\n\n  it('.clear() - clears an input or textarea element', () => {\n    // https://on.cypress.io/clear\n    cy.get('.action-clear').type('Clear this text')\n      .should('have.value', 'Clear this text')\n      .clear()\n      .should('have.value', '')\n  })\n\n  it('.submit() - submit a form', () => {\n    // https://on.cypress.io/submit\n    cy.get('.action-form')\n      .find('[type=\"text\"]').type('HALFOFF')\n\n    cy.get('.action-form').submit()\n      .next().should('contain', 'Your form has been submitted!')\n  })\n\n  it('.click() - click on a DOM element', () => {\n    // https://on.cypress.io/click\n    cy.get('.action-btn').click()\n\n    // You can click on 9 specific positions of an element:\n    //  -----------------------------------\n    // | topLeft        top       topRight |\n    // |                                   |\n    // |                                   |\n    // |                                   |\n    // | left          center        right |\n    // |                                   |\n    // |                                   |\n    // |                                   |\n    // | bottomLeft   bottom   bottomRight |\n    //  -----------------------------------\n\n    // clicking in the center of the element is the default\n    cy.get('#action-canvas').click()\n\n    cy.get('#action-canvas').click('topLeft')\n    cy.get('#action-canvas').click('top')\n    cy.get('#action-canvas').click('topRight')\n    cy.get('#action-canvas').click('left')\n    cy.get('#action-canvas').click('right')\n    cy.get('#action-canvas').click('bottomLeft')\n    cy.get('#action-canvas').click('bottom')\n    cy.get('#action-canvas').click('bottomRight')\n\n    // .click() accepts an x and y coordinate\n    // that controls where the click occurs :)\n\n    cy.get('#action-canvas')\n      .click(80, 75) // click 80px on x coord and 75px on y coord\n      .click(170, 75)\n      .click(80, 165)\n      .click(100, 185)\n      .click(125, 190)\n      .click(150, 185)\n      .click(170, 165)\n\n    // click multiple elements by passing multiple: true\n    cy.get('.action-labels>.label').click({ multiple: true })\n\n    // Ignore error checking prior to clicking\n    cy.get('.action-opacity>.btn').click({ force: true })\n  })\n\n  it('.dblclick() - double click on a DOM element', () => {\n    // https://on.cypress.io/dblclick\n\n    // Our app has a listener on 'dblclick' event in our 'scripts.js'\n    // that hides the div and shows an input on double click\n    cy.get('.action-div').dblclick().should('not.be.visible')\n    cy.get('.action-input-hidden').should('be.visible')\n  })\n\n  it('.rightclick() - right click on a DOM element', () => {\n    // https://on.cypress.io/rightclick\n\n    // Our app has a listener on 'contextmenu' event in our 'scripts.js'\n    // that hides the div and shows an input on right click\n    cy.get('.rightclick-action-div').rightclick().should('not.be.visible')\n    cy.get('.rightclick-action-input-hidden').should('be.visible')\n  })\n\n  it('.check() - check a checkbox or radio element', () => {\n    // https://on.cypress.io/check\n\n    // By default, .check() will check all\n    // matching checkbox or radio elements in succession, one after another\n    cy.get('.action-checkboxes [type=\"checkbox\"]').not('[disabled]')\n      .check().should('be.checked')\n\n    cy.get('.action-radios [type=\"radio\"]').not('[disabled]')\n      .check().should('be.checked')\n\n    // .check() accepts a value argument\n    cy.get('.action-radios [type=\"radio\"]')\n      .check('radio1').should('be.checked')\n\n    // .check() accepts an array of values\n    cy.get('.action-multiple-checkboxes [type=\"checkbox\"]')\n      .check(['checkbox1', 'checkbox2']).should('be.checked')\n\n    // Ignore error checking prior to checking\n    cy.get('.action-checkboxes [disabled]')\n      .check({ force: true }).should('be.checked')\n\n    cy.get('.action-radios [type=\"radio\"]')\n      .check('radio3', { force: true }).should('be.checked')\n  })\n\n  it('.uncheck() - uncheck a checkbox element', () => {\n    // https://on.cypress.io/uncheck\n\n    // By default, .uncheck() will uncheck all matching\n    // checkbox elements in succession, one after another\n    cy.get('.action-check [type=\"checkbox\"]')\n      .not('[disabled]')\n      .uncheck().should('not.be.checked')\n\n    // .uncheck() accepts a value argument\n    cy.get('.action-check [type=\"checkbox\"]')\n      .check('checkbox1')\n      .uncheck('checkbox1').should('not.be.checked')\n\n    // .uncheck() accepts an array of values\n    cy.get('.action-check [type=\"checkbox\"]')\n      .check(['checkbox1', 'checkbox3'])\n      .uncheck(['checkbox1', 'checkbox3']).should('not.be.checked')\n\n    // Ignore error checking prior to unchecking\n    cy.get('.action-check [disabled]')\n      .uncheck({ force: true }).should('not.be.checked')\n  })\n\n  it('.select() - select an option in a <select> element', () => {\n    // https://on.cypress.io/select\n\n    // at first, no option should be selected\n    cy.get('.action-select')\n      .should('have.value', '--Select a fruit--')\n\n    // Select option(s) with matching text content\n    cy.get('.action-select').select('apples')\n    // confirm the apples were selected\n    // note that each value starts with \"fr-\" in our HTML\n    cy.get('.action-select').should('have.value', 'fr-apples')\n\n    cy.get('.action-select-multiple')\n      .select(['apples', 'oranges', 'bananas'])\n      // when getting multiple values, invoke \"val\" method first\n      .invoke('val')\n      .should('deep.equal', ['fr-apples', 'fr-oranges', 'fr-bananas'])\n\n    // Select option(s) with matching value\n    cy.get('.action-select').select('fr-bananas')\n      // can attach an assertion right away to the element\n      .should('have.value', 'fr-bananas')\n\n    cy.get('.action-select-multiple')\n      .select(['fr-apples', 'fr-oranges', 'fr-bananas'])\n      .invoke('val')\n      .should('deep.equal', ['fr-apples', 'fr-oranges', 'fr-bananas'])\n\n    // assert the selected values include oranges\n    cy.get('.action-select-multiple')\n      .invoke('val').should('include', 'fr-oranges')\n  })\n\n  it('.scrollIntoView() - scroll an element into view', () => {\n    // https://on.cypress.io/scrollintoview\n\n    // normally all of these buttons are hidden,\n    // because they're not within\n    // the viewable area of their parent\n    // (we need to scroll to see them)\n    cy.get('#scroll-horizontal button')\n      .should('not.be.visible')\n\n    // scroll the button into view, as if the user had scrolled\n    cy.get('#scroll-horizontal button').scrollIntoView()\n      .should('be.visible')\n\n    cy.get('#scroll-vertical button')\n      .should('not.be.visible')\n\n    // Cypress handles the scroll direction needed\n    cy.get('#scroll-vertical button').scrollIntoView()\n      .should('be.visible')\n\n    cy.get('#scroll-both button')\n      .should('not.be.visible')\n\n    // Cypress knows to scroll to the right and down\n    cy.get('#scroll-both button').scrollIntoView()\n      .should('be.visible')\n  })\n\n  it('.trigger() - trigger an event on a DOM element', () => {\n    // https://on.cypress.io/trigger\n\n    // To interact with a range input (slider)\n    // we need to set its value & trigger the\n    // event to signal it changed\n\n    // Here, we invoke jQuery's val() method to set\n    // the value and trigger the 'change' event\n    cy.get('.trigger-input-range')\n      .invoke('val', 25)\n      .trigger('change')\n      .get('input[type=range]').siblings('p')\n      .should('have.text', '25')\n  })\n\n  it('cy.scrollTo() - scroll the window or element to a position', () => {\n    // https://on.cypress.io/scrollto\n\n    // You can scroll to 9 specific positions of an element:\n    //  -----------------------------------\n    // | topLeft        top       topRight |\n    // |                                   |\n    // |                                   |\n    // |                                   |\n    // | left          center        right |\n    // |                                   |\n    // |                                   |\n    // |                                   |\n    // | bottomLeft   bottom   bottomRight |\n    //  -----------------------------------\n\n    // if you chain .scrollTo() off of cy, we will\n    // scroll the entire window\n    cy.scrollTo('bottom')\n\n    cy.get('#scrollable-horizontal').scrollTo('right')\n\n    // or you can scroll to a specific coordinate:\n    // (x axis, y axis) in pixels\n    cy.get('#scrollable-vertical').scrollTo(250, 250)\n\n    // or you can scroll to a specific percentage\n    // of the (width, height) of the element\n    cy.get('#scrollable-both').scrollTo('75%', '25%')\n\n    // control the easing of the scroll (default is 'swing')\n    cy.get('#scrollable-vertical').scrollTo('center', { easing: 'linear' })\n\n    // control the duration of the scroll (in ms)\n    cy.get('#scrollable-both').scrollTo('center', { duration: 2000 })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/aliasing.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Aliasing', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/aliasing')\n  })\n\n  it('.as() - alias a DOM element for later use', () => {\n    // https://on.cypress.io/as\n\n    // Alias a DOM element for use later\n    // We don't have to traverse to the element\n    // later in our code, we reference it with @\n\n    cy.get('.as-table').find('tbody>tr')\n      .first().find('td').first()\n      .find('button').as('firstBtn')\n\n    // when we reference the alias, we place an\n    // @ in front of its name\n    cy.get('@firstBtn').click()\n\n    cy.get('@firstBtn')\n      .should('have.class', 'btn-success')\n      .and('contain', 'Changed')\n  })\n\n  it('.as() - alias a route for later use', () => {\n    // Alias the route to wait for its response\n    cy.intercept('GET', '**/comments/*').as('getComment')\n\n    // we have code that gets a comment when\n    // the button is clicked in scripts.js\n    cy.get('.network-btn').click()\n\n    // https://on.cypress.io/wait\n    cy.wait('@getComment').its('response.statusCode').should('eq', 200)\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/assertions.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Assertions', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/assertions')\n  })\n\n  describe('Implicit Assertions', () => {\n    it('.should() - make an assertion about the current subject', () => {\n      // https://on.cypress.io/should\n      cy.get('.assertion-table')\n        .find('tbody tr:last')\n        .should('have.class', 'success')\n        .find('td')\n        .first()\n        // checking the text of the <td> element in various ways\n        .should('have.text', 'Column content')\n        .should('contain', 'Column content')\n        .should('have.html', 'Column content')\n        // chai-jquery uses \"is()\" to check if element matches selector\n        .should('match', 'td')\n        // to match text content against a regular expression\n        // first need to invoke jQuery method text()\n        // and then match using regular expression\n        .invoke('text')\n        .should('match', /column content/i)\n\n      // a better way to check element's text content against a regular expression\n      // is to use \"cy.contains\"\n      // https://on.cypress.io/contains\n      cy.get('.assertion-table')\n        .find('tbody tr:last')\n        // finds first <td> element with text content matching regular expression\n        .contains('td', /column content/i)\n        .should('be.visible')\n\n      // for more information about asserting element's text\n      // see https://on.cypress.io/using-cypress-faq#How-do-I-get-an-element’s-text-contents\n    })\n\n    it('.and() - chain multiple assertions together', () => {\n      // https://on.cypress.io/and\n      cy.get('.assertions-link')\n        .should('have.class', 'active')\n        .and('have.attr', 'href')\n        .and('include', 'cypress.io')\n    })\n  })\n\n  describe('Explicit Assertions', () => {\n    // https://on.cypress.io/assertions\n    it('expect - make an assertion about a specified subject', () => {\n      // We can use Chai's BDD style assertions\n      expect(true).to.be.true\n      const o = { foo: 'bar' }\n\n      expect(o).to.equal(o)\n      expect(o).to.deep.equal({ foo: 'bar' })\n      // matching text using regular expression\n      expect('FooBar').to.match(/bar$/i)\n    })\n\n    it('pass your own callback function to should()', () => {\n      // Pass a function to should that can have any number\n      // of explicit assertions within it.\n      // The \".should(cb)\" function will be retried\n      // automatically until it passes all your explicit assertions or times out.\n      cy.get('.assertions-p')\n        .find('p')\n        .should(($p) => {\n          // https://on.cypress.io/$\n          // return an array of texts from all of the p's\n          // @ts-ignore TS6133 unused variable\n          const texts = $p.map((i, el) => Cypress.$(el).text())\n\n          // jquery map returns jquery object\n          // and .get() convert this to simple array\n          const paragraphs = texts.get()\n\n          // array should have length of 3\n          expect(paragraphs, 'has 3 paragraphs').to.have.length(3)\n\n          // use second argument to expect(...) to provide clear\n          // message with each assertion\n          expect(paragraphs, 'has expected text in each paragraph').to.deep.eq([\n            'Some text from first p',\n            'More text from second p',\n            'And even more text from third p',\n          ])\n        })\n    })\n\n    it('finds element by class name regex', () => {\n      cy.get('.docs-header')\n        .find('div')\n        // .should(cb) callback function will be retried\n        .should(($div) => {\n          expect($div).to.have.length(1)\n\n          const className = $div[0].className\n\n          expect(className).to.match(/heading-/)\n        })\n        // .then(cb) callback is not retried,\n        // it either passes or fails\n        .then(($div) => {\n          expect($div, 'text content').to.have.text('Introduction')\n        })\n    })\n\n    it('can throw any error', () => {\n      cy.get('.docs-header')\n        .find('div')\n        .should(($div) => {\n          if ($div.length !== 1) {\n            // you can throw your own errors\n            throw new Error('Did not find 1 element')\n          }\n\n          const className = $div[0].className\n\n          if (!className.match(/heading-/)) {\n            throw new Error(`Could not find class \"heading-\" in ${className}`)\n          }\n        })\n    })\n\n    it('matches unknown text between two elements', () => {\n      /**\n       * Text from the first element.\n       * @type {string}\n      */\n      let text\n\n      /**\n       * Normalizes passed text,\n       * useful before comparing text with spaces and different capitalization.\n       * @param {string} s Text to normalize\n      */\n      const normalizeText = (s) => s.replace(/\\s/g, '').toLowerCase()\n\n      cy.get('.two-elements')\n        .find('.first')\n        .then(($first) => {\n          // save text from the first element\n          text = normalizeText($first.text())\n        })\n\n      cy.get('.two-elements')\n        .find('.second')\n        .should(($div) => {\n          // we can massage text before comparing\n          const secondText = normalizeText($div.text())\n\n          expect(secondText, 'second text').to.equal(text)\n        })\n    })\n\n    it('assert - assert shape of an object', () => {\n      const person = {\n        name: 'Joe',\n        age: 20,\n      }\n\n      assert.isObject(person, 'value is object')\n    })\n\n    it('retries the should callback until assertions pass', () => {\n      cy.get('#random-number')\n        .should(($div) => {\n          const n = parseFloat($div.text())\n\n          expect(n).to.be.gte(1).and.be.lte(10)\n        })\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/connectors.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Connectors', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/connectors')\n  })\n\n  it('.each() - iterate over an array of elements', () => {\n    // https://on.cypress.io/each\n    cy.get('.connectors-each-ul>li')\n      .each(($el, index, $list) => {\n        console.log($el, index, $list)\n      })\n  })\n\n  it('.its() - get properties on the current subject', () => {\n    // https://on.cypress.io/its\n    cy.get('.connectors-its-ul>li')\n      // calls the 'length' property yielding that value\n      .its('length')\n      .should('be.gt', 2)\n  })\n\n  it('.invoke() - invoke a function on the current subject', () => {\n    // our div is hidden in our script.js\n    // $('.connectors-div').hide()\n\n    // https://on.cypress.io/invoke\n    cy.get('.connectors-div').should('be.hidden')\n      // call the jquery method 'show' on the 'div.container'\n      .invoke('show')\n      .should('be.visible')\n  })\n\n  it('.spread() - spread an array as individual args to callback function', () => {\n    // https://on.cypress.io/spread\n    const arr = ['foo', 'bar', 'baz']\n\n    cy.wrap(arr).spread((foo, bar, baz) => {\n      expect(foo).to.eq('foo')\n      expect(bar).to.eq('bar')\n      expect(baz).to.eq('baz')\n    })\n  })\n\n  describe('.then()', () => {\n    it('invokes a callback function with the current subject', () => {\n      // https://on.cypress.io/then\n      cy.get('.connectors-list > li')\n        .then(($lis) => {\n          expect($lis, '3 items').to.have.length(3)\n          expect($lis.eq(0), 'first item').to.contain('Walk the dog')\n          expect($lis.eq(1), 'second item').to.contain('Feed the cat')\n          expect($lis.eq(2), 'third item').to.contain('Write JavaScript')\n        })\n    })\n\n    it('yields the returned value to the next command', () => {\n      cy.wrap(1)\n        .then((num) => {\n          expect(num).to.equal(1)\n\n          return 2\n        })\n        .then((num) => {\n          expect(num).to.equal(2)\n        })\n    })\n\n    it('yields the original subject without return', () => {\n      cy.wrap(1)\n        .then((num) => {\n          expect(num).to.equal(1)\n          // note that nothing is returned from this callback\n        })\n        .then((num) => {\n          // this callback receives the original unchanged value 1\n          expect(num).to.equal(1)\n        })\n    })\n\n    it('yields the value yielded by the last Cypress command inside', () => {\n      cy.wrap(1)\n        .then((num) => {\n          expect(num).to.equal(1)\n          // note how we run a Cypress command\n          // the result yielded by this Cypress command\n          // will be passed to the second \".then\"\n          cy.wrap(2)\n        })\n        .then((num) => {\n          // this callback receives the value yielded by \"cy.wrap(2)\"\n          expect(num).to.equal(2)\n        })\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/cookies.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Cookies', () => {\n  beforeEach(() => {\n    Cypress.Cookies.debug(true)\n\n    cy.visit('https://example.cypress.io/commands/cookies')\n\n    // clear cookies again after visiting to remove\n    // any 3rd party cookies picked up such as cloudflare\n    cy.clearCookies()\n  })\n\n  it('cy.getCookie() - get a browser cookie', () => {\n    // https://on.cypress.io/getcookie\n    cy.get('#getCookie .set-a-cookie').click()\n\n    // cy.getCookie() yields a cookie object\n    cy.getCookie('token').should('have.property', 'value', '123ABC')\n  })\n\n  it('cy.getCookies() - get browser cookies', () => {\n    // https://on.cypress.io/getcookies\n    cy.getCookies().should('be.empty')\n\n    cy.get('#getCookies .set-a-cookie').click()\n\n    // cy.getCookies() yields an array of cookies\n    cy.getCookies().should('have.length', 1).should((cookies) => {\n      // each cookie has these properties\n      expect(cookies[0]).to.have.property('name', 'token')\n      expect(cookies[0]).to.have.property('value', '123ABC')\n      expect(cookies[0]).to.have.property('httpOnly', false)\n      expect(cookies[0]).to.have.property('secure', false)\n      expect(cookies[0]).to.have.property('domain')\n      expect(cookies[0]).to.have.property('path')\n    })\n  })\n\n  it('cy.setCookie() - set a browser cookie', () => {\n    // https://on.cypress.io/setcookie\n    cy.getCookies().should('be.empty')\n\n    cy.setCookie('foo', 'bar')\n\n    // cy.getCookie() yields a cookie object\n    cy.getCookie('foo').should('have.property', 'value', 'bar')\n  })\n\n  it('cy.clearCookie() - clear a browser cookie', () => {\n    // https://on.cypress.io/clearcookie\n    cy.getCookie('token').should('be.null')\n\n    cy.get('#clearCookie .set-a-cookie').click()\n\n    cy.getCookie('token').should('have.property', 'value', '123ABC')\n\n    // cy.clearCookies() yields null\n    cy.clearCookie('token').should('be.null')\n\n    cy.getCookie('token').should('be.null')\n  })\n\n  it('cy.clearCookies() - clear browser cookies', () => {\n    // https://on.cypress.io/clearcookies\n    cy.getCookies().should('be.empty')\n\n    cy.get('#clearCookies .set-a-cookie').click()\n\n    cy.getCookies().should('have.length', 1)\n\n    // cy.clearCookies() yields null\n    cy.clearCookies()\n\n    cy.getCookies().should('be.empty')\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/cypress_api.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Cypress.Commands', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  // https://on.cypress.io/custom-commands\n\n  it('.add() - create a custom command', () => {\n    Cypress.Commands.add('console', {\n      prevSubject: true,\n    }, (subject, method) => {\n      // the previous subject is automatically received\n      // and the commands arguments are shifted\n\n      // allow us to change the console method used\n      method = method || 'log'\n\n      // log the subject to the console\n      // @ts-ignore TS7017\n      console[method]('The subject is', subject)\n\n      // whatever we return becomes the new subject\n      // we don't want to change the subject so\n      // we return whatever was passed in\n      return subject\n    })\n\n    // @ts-ignore TS2339\n    cy.get('button').console('info').then(($button) => {\n      // subject is still $button\n    })\n  })\n})\n\ncontext('Cypress.Cookies', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  // https://on.cypress.io/cookies\n  it('.debug() - enable or disable debugging', () => {\n    Cypress.Cookies.debug(true)\n\n    // Cypress will now log in the console when\n    // cookies are set or cleared\n    cy.setCookie('fakeCookie', '123ABC')\n    cy.clearCookie('fakeCookie')\n    cy.setCookie('fakeCookie', '123ABC')\n    cy.clearCookie('fakeCookie')\n    cy.setCookie('fakeCookie', '123ABC')\n  })\n\n  it('.preserveOnce() - preserve cookies by key', () => {\n    // normally cookies are reset after each test\n    cy.getCookie('fakeCookie').should('not.be.ok')\n\n    // preserving a cookie will not clear it when\n    // the next test starts\n    cy.setCookie('lastCookie', '789XYZ')\n    Cypress.Cookies.preserveOnce('lastCookie')\n  })\n\n  it('.defaults() - set defaults for all cookies', () => {\n    // now any cookie with the name 'session_id' will\n    // not be cleared before each new test runs\n    Cypress.Cookies.defaults({\n      preserve: 'session_id',\n    })\n  })\n})\n\ncontext('Cypress.arch', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Get CPU architecture name of underlying OS', () => {\n    // https://on.cypress.io/arch\n    expect(Cypress.arch).to.exist\n  })\n})\n\ncontext('Cypress.config()', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Get and set configuration options', () => {\n    // https://on.cypress.io/config\n    let myConfig = Cypress.config()\n\n    expect(myConfig).to.have.property('animationDistanceThreshold', 5)\n    expect(myConfig).to.have.property('baseUrl', null)\n    expect(myConfig).to.have.property('defaultCommandTimeout', 4000)\n    expect(myConfig).to.have.property('requestTimeout', 5000)\n    expect(myConfig).to.have.property('responseTimeout', 30000)\n    expect(myConfig).to.have.property('viewportHeight', 660)\n    expect(myConfig).to.have.property('viewportWidth', 1000)\n    expect(myConfig).to.have.property('pageLoadTimeout', 60000)\n    expect(myConfig).to.have.property('waitForAnimations', true)\n\n    expect(Cypress.config('pageLoadTimeout')).to.eq(60000)\n\n    // this will change the config for the rest of your tests!\n    Cypress.config('pageLoadTimeout', 20000)\n\n    expect(Cypress.config('pageLoadTimeout')).to.eq(20000)\n\n    Cypress.config('pageLoadTimeout', 60000)\n  })\n})\n\ncontext('Cypress.dom', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  // https://on.cypress.io/dom\n  it('.isHidden() - determine if a DOM element is hidden', () => {\n    let hiddenP = Cypress.$('.dom-p p.hidden').get(0)\n    let visibleP = Cypress.$('.dom-p p.visible').get(0)\n\n    // our first paragraph has css class 'hidden'\n    expect(Cypress.dom.isHidden(hiddenP)).to.be.true\n    expect(Cypress.dom.isHidden(visibleP)).to.be.false\n  })\n})\n\ncontext('Cypress.env()', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  // We can set environment variables for highly dynamic values\n\n  // https://on.cypress.io/environment-variables\n  it('Get environment variables', () => {\n    // https://on.cypress.io/env\n    // set multiple environment variables\n    Cypress.env({\n      host: 'veronica.dev.local',\n      api_server: 'http://localhost:8888/v1/',\n    })\n\n    // get environment variable\n    expect(Cypress.env('host')).to.eq('veronica.dev.local')\n\n    // set environment variable\n    Cypress.env('api_server', 'http://localhost:8888/v2/')\n    expect(Cypress.env('api_server')).to.eq('http://localhost:8888/v2/')\n\n    // get all environment variable\n    expect(Cypress.env()).to.have.property('host', 'veronica.dev.local')\n    expect(Cypress.env()).to.have.property('api_server', 'http://localhost:8888/v2/')\n  })\n})\n\ncontext('Cypress.log', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Control what is printed to the Command Log', () => {\n    // https://on.cypress.io/cypress-log\n  })\n})\n\ncontext('Cypress.platform', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Get underlying OS name', () => {\n    // https://on.cypress.io/platform\n    expect(Cypress.platform).to.be.exist\n  })\n})\n\ncontext('Cypress.version', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Get current version of Cypress being run', () => {\n    // https://on.cypress.io/version\n    expect(Cypress.version).to.be.exist\n  })\n})\n\ncontext('Cypress.spec', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/cypress-api')\n  })\n\n  it('Get current spec information', () => {\n    // https://on.cypress.io/spec\n    // wrap the object so we can inspect it easily by clicking in the command log\n    cy.wrap(Cypress.spec).should('include.keys', ['name', 'relative', 'absolute'])\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/files.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\n/// JSON fixture file can be loaded directly using\n// the built-in JavaScript bundler\n// @ts-ignore\nconst requiredExample = require('../../fixtures/example')\n\ncontext('Files', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/files')\n  })\n\n  beforeEach(() => {\n    // load example.json fixture file and store\n    // in the test context object\n    cy.fixture('example.json').as('example')\n  })\n\n  it('cy.fixture() - load a fixture', () => {\n    // https://on.cypress.io/fixture\n\n    // Instead of writing a response inline you can\n    // use a fixture file's content.\n\n    // when application makes an Ajax request matching \"GET **/comments/*\"\n    // Cypress will intercept it and reply with the object in `example.json` fixture\n    cy.intercept('GET', '**/comments/*', { fixture: 'example.json' }).as('getComment')\n\n    // we have code that gets a comment when\n    // the button is clicked in scripts.js\n    cy.get('.fixture-btn').click()\n\n    cy.wait('@getComment').its('response.body')\n      .should('have.property', 'name')\n      .and('include', 'Using fixtures to represent data')\n  })\n\n  it('cy.fixture() or require - load a fixture', function () {\n    // we are inside the \"function () { ... }\"\n    // callback and can use test context object \"this\"\n    // \"this.example\" was loaded in \"beforeEach\" function callback\n    expect(this.example, 'fixture in the test context')\n      .to.deep.equal(requiredExample)\n\n    // or use \"cy.wrap\" and \"should('deep.equal', ...)\" assertion\n    // @ts-ignore\n    cy.wrap(this.example, 'fixture vs require')\n      .should('deep.equal', requiredExample)\n  })\n\n  it('cy.readFile() - read file contents', () => {\n    // https://on.cypress.io/readfile\n\n    // You can read a file and yield its contents\n    // The filePath is relative to your project's root.\n    cy.readFile('cypress.json').then((json) => {\n      expect(json).to.be.an('object')\n    })\n  })\n\n  it('cy.writeFile() - write to a file', () => {\n    // https://on.cypress.io/writefile\n\n    // You can write to a file\n\n    // Use a response from a request to automatically\n    // generate a fixture file for use later\n    cy.request('https://jsonplaceholder.cypress.io/users')\n      .then((response) => {\n        cy.writeFile('cypress/fixtures/users.json', response.body)\n      })\n\n    cy.fixture('users').should((users) => {\n      expect(users[0].name).to.exist\n    })\n\n    // JavaScript arrays and objects are stringified\n    // and formatted into text.\n    cy.writeFile('cypress/fixtures/profile.json', {\n      id: 8739,\n      name: 'Jane',\n      email: 'jane@example.com',\n    })\n\n    cy.fixture('profile').should((profile) => {\n      expect(profile.name).to.eq('Jane')\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/local_storage.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Local Storage', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/local-storage')\n  })\n  // Although local storage is automatically cleared\n  // in between tests to maintain a clean state\n  // sometimes we need to clear the local storage manually\n\n  it('cy.clearLocalStorage() - clear all data in local storage', () => {\n    // https://on.cypress.io/clearlocalstorage\n    cy.get('.ls-btn').click().should(() => {\n      expect(localStorage.getItem('prop1')).to.eq('red')\n      expect(localStorage.getItem('prop2')).to.eq('blue')\n      expect(localStorage.getItem('prop3')).to.eq('magenta')\n    })\n\n    // clearLocalStorage() yields the localStorage object\n    cy.clearLocalStorage().should((ls) => {\n      expect(ls.getItem('prop1')).to.be.null\n      expect(ls.getItem('prop2')).to.be.null\n      expect(ls.getItem('prop3')).to.be.null\n    })\n\n    // Clear key matching string in Local Storage\n    cy.get('.ls-btn').click().should(() => {\n      expect(localStorage.getItem('prop1')).to.eq('red')\n      expect(localStorage.getItem('prop2')).to.eq('blue')\n      expect(localStorage.getItem('prop3')).to.eq('magenta')\n    })\n\n    cy.clearLocalStorage('prop1').should((ls) => {\n      expect(ls.getItem('prop1')).to.be.null\n      expect(ls.getItem('prop2')).to.eq('blue')\n      expect(ls.getItem('prop3')).to.eq('magenta')\n    })\n\n    // Clear keys matching regex in Local Storage\n    cy.get('.ls-btn').click().should(() => {\n      expect(localStorage.getItem('prop1')).to.eq('red')\n      expect(localStorage.getItem('prop2')).to.eq('blue')\n      expect(localStorage.getItem('prop3')).to.eq('magenta')\n    })\n\n    cy.clearLocalStorage(/prop1|2/).should((ls) => {\n      expect(ls.getItem('prop1')).to.be.null\n      expect(ls.getItem('prop2')).to.be.null\n      expect(ls.getItem('prop3')).to.eq('magenta')\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/location.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Location', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/location')\n  })\n\n  it('cy.hash() - get the current URL hash', () => {\n    // https://on.cypress.io/hash\n    cy.hash().should('be.empty')\n  })\n\n  it('cy.location() - get window.location', () => {\n    // https://on.cypress.io/location\n    cy.location().should((location) => {\n      expect(location.hash).to.be.empty\n      expect(location.href).to.eq('https://example.cypress.io/commands/location')\n      expect(location.host).to.eq('example.cypress.io')\n      expect(location.hostname).to.eq('example.cypress.io')\n      expect(location.origin).to.eq('https://example.cypress.io')\n      expect(location.pathname).to.eq('/commands/location')\n      expect(location.port).to.eq('')\n      expect(location.protocol).to.eq('https:')\n      expect(location.search).to.be.empty\n    })\n  })\n\n  it('cy.url() - get the current URL', () => {\n    // https://on.cypress.io/url\n    cy.url().should('eq', 'https://example.cypress.io/commands/location')\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/misc.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Misc', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/misc')\n  })\n\n  it('.end() - end the command chain', () => {\n    // https://on.cypress.io/end\n\n    // cy.end is useful when you want to end a chain of commands\n    // and force Cypress to re-query from the root element\n    cy.get('.misc-table').within(() => {\n      // ends the current chain and yields null\n      cy.contains('Cheryl').click().end()\n\n      // queries the entire table again\n      cy.contains('Charles').click()\n    })\n  })\n\n  it('cy.exec() - execute a system command', () => {\n    // execute a system command.\n    // so you can take actions necessary for\n    // your test outside the scope of Cypress.\n    // https://on.cypress.io/exec\n\n    // we can use Cypress.platform string to\n    // select appropriate command\n    // https://on.cypress/io/platform\n    cy.log(`Platform ${Cypress.platform} architecture ${Cypress.arch}`)\n\n    // on CircleCI Windows build machines we have a failure to run bash shell\n    // https://github.com/cypress-io/cypress/issues/5169\n    // so skip some of the tests by passing flag \"--env circle=true\"\n    const isCircleOnWindows = Cypress.platform === 'win32' && Cypress.env('circle')\n\n    if (isCircleOnWindows) {\n      cy.log('Skipping test on CircleCI')\n\n      return\n    }\n\n    // cy.exec problem on Shippable CI\n    // https://github.com/cypress-io/cypress/issues/6718\n    const isShippable = Cypress.platform === 'linux' && Cypress.env('shippable')\n\n    if (isShippable) {\n      cy.log('Skipping test on ShippableCI')\n\n      return\n    }\n\n    cy.exec('echo Jane Lane')\n      .its('stdout').should('contain', 'Jane Lane')\n\n    if (Cypress.platform === 'win32') {\n      cy.exec('print cypress.json')\n        .its('stderr').should('be.empty')\n    } else {\n      cy.exec('cat cypress.json')\n        .its('stderr').should('be.empty')\n\n      cy.exec('pwd')\n        .its('code').should('eq', 0)\n    }\n  })\n\n  it('cy.focused() - get the DOM element that has focus', () => {\n    // https://on.cypress.io/focused\n    cy.get('.misc-form').find('#name').click()\n    cy.focused().should('have.id', 'name')\n\n    cy.get('.misc-form').find('#description').click()\n    cy.focused().should('have.id', 'description')\n  })\n\n  context('Cypress.Screenshot', function () {\n    it('cy.screenshot() - take a screenshot', () => {\n      // https://on.cypress.io/screenshot\n      cy.screenshot('my-image')\n    })\n\n    it('Cypress.Screenshot.defaults() - change default config of screenshots', function () {\n      Cypress.Screenshot.defaults({\n        blackout: ['.foo'],\n        capture: 'viewport',\n        clip: { x: 0, y: 0, width: 200, height: 200 },\n        scale: false,\n        disableTimersAndAnimations: true,\n        screenshotOnRunFailure: true,\n        onBeforeScreenshot () { },\n        onAfterScreenshot () { },\n      })\n    })\n  })\n\n  it('cy.wrap() - wrap an object', () => {\n    // https://on.cypress.io/wrap\n    cy.wrap({ foo: 'bar' })\n      .should('have.property', 'foo')\n      .and('include', 'bar')\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/navigation.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Navigation', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io')\n    cy.get('.navbar-nav').contains('Commands').click()\n    cy.get('.dropdown-menu').contains('Navigation').click()\n  })\n\n  it('cy.go() - go back or forward in the browser\\'s history', () => {\n    // https://on.cypress.io/go\n\n    cy.location('pathname').should('include', 'navigation')\n\n    cy.go('back')\n    cy.location('pathname').should('not.include', 'navigation')\n\n    cy.go('forward')\n    cy.location('pathname').should('include', 'navigation')\n\n    // clicking back\n    cy.go(-1)\n    cy.location('pathname').should('not.include', 'navigation')\n\n    // clicking forward\n    cy.go(1)\n    cy.location('pathname').should('include', 'navigation')\n  })\n\n  it('cy.reload() - reload the page', () => {\n    // https://on.cypress.io/reload\n    cy.reload()\n\n    // reload the page without using the cache\n    cy.reload(true)\n  })\n\n  it('cy.visit() - visit a remote url', () => {\n    // https://on.cypress.io/visit\n\n    // Visit any sub-domain of your current domain\n\n    // Pass options to the visit\n    cy.visit('https://example.cypress.io/commands/navigation', {\n      timeout: 50000, // increase total time for the visit to resolve\n      onBeforeLoad (contentWindow) {\n        // contentWindow is the remote page's window object\n        expect(typeof contentWindow === 'object').to.be.true\n      },\n      onLoad (contentWindow) {\n        // contentWindow is the remote page's window object\n        expect(typeof contentWindow === 'object').to.be.true\n      },\n    })\n    })\n})\n"
  },
  {
    "path": "cypress/integration/examples/network_requests.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Network Requests', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/network-requests')\n  })\n\n  // Manage HTTP requests in your app\n\n  it('cy.request() - make an XHR request', () => {\n    // https://on.cypress.io/request\n    cy.request('https://jsonplaceholder.cypress.io/comments')\n      .should((response) => {\n        expect(response.status).to.eq(200)\n        // the server sometimes gets an extra comment posted from another machine\n        // which gets returned as 1 extra object\n        expect(response.body).to.have.property('length').and.be.oneOf([500, 501])\n        expect(response).to.have.property('headers')\n        expect(response).to.have.property('duration')\n      })\n  })\n\n  it('cy.request() - verify response using BDD syntax', () => {\n    cy.request('https://jsonplaceholder.cypress.io/comments')\n    .then((response) => {\n      // https://on.cypress.io/assertions\n      expect(response).property('status').to.equal(200)\n      expect(response).property('body').to.have.property('length').and.be.oneOf([500, 501])\n      expect(response).to.include.keys('headers', 'duration')\n    })\n  })\n\n  it('cy.request() with query parameters', () => {\n    // will execute request\n    // https://jsonplaceholder.cypress.io/comments?postId=1&id=3\n    cy.request({\n      url: 'https://jsonplaceholder.cypress.io/comments',\n      qs: {\n        postId: 1,\n        id: 3,\n      },\n    })\n    .its('body')\n    .should('be.an', 'array')\n    .and('have.length', 1)\n    .its('0') // yields first element of the array\n    .should('contain', {\n      postId: 1,\n      id: 3,\n    })\n  })\n\n  it('cy.request() - pass result to the second request', () => {\n    // first, let's find out the userId of the first user we have\n    cy.request('https://jsonplaceholder.cypress.io/users?_limit=1')\n      .its('body') // yields the response object\n      .its('0') // yields the first element of the returned list\n      // the above two commands its('body').its('0')\n      // can be written as its('body.0')\n      // if you do not care about TypeScript checks\n      .then((user) => {\n        expect(user).property('id').to.be.a('number')\n        // make a new post on behalf of the user\n        cy.request('POST', 'https://jsonplaceholder.cypress.io/posts', {\n          userId: user.id,\n          title: 'Cypress Test Runner',\n          body: 'Fast, easy and reliable testing for anything that runs in a browser.',\n        })\n      })\n      // note that the value here is the returned value of the 2nd request\n      // which is the new post object\n      .then((response) => {\n        expect(response).property('status').to.equal(201) // new entity created\n        expect(response).property('body').to.contain({\n          title: 'Cypress Test Runner',\n        })\n\n        // we don't know the exact post id - only that it will be > 100\n        // since JSONPlaceholder has built-in 100 posts\n        expect(response.body).property('id').to.be.a('number')\n          .and.to.be.gt(100)\n\n        // we don't know the user id here - since it was in above closure\n        // so in this test just confirm that the property is there\n        expect(response.body).property('userId').to.be.a('number')\n      })\n  })\n\n  it('cy.request() - save response in the shared test context', () => {\n    // https://on.cypress.io/variables-and-aliases\n    cy.request('https://jsonplaceholder.cypress.io/users?_limit=1')\n      .its('body').its('0') // yields the first element of the returned list\n      .as('user') // saves the object in the test context\n      .then(function () {\n        // NOTE 👀\n        //  By the time this callback runs the \"as('user')\" command\n        //  has saved the user object in the test context.\n        //  To access the test context we need to use\n        //  the \"function () { ... }\" callback form,\n        //  otherwise \"this\" points at a wrong or undefined object!\n        cy.request('POST', 'https://jsonplaceholder.cypress.io/posts', {\n          userId: this.user.id,\n          title: 'Cypress Test Runner',\n          body: 'Fast, easy and reliable testing for anything that runs in a browser.',\n        })\n        .its('body').as('post') // save the new post from the response\n      })\n      .then(function () {\n        // When this callback runs, both \"cy.request\" API commands have finished\n        // and the test context has \"user\" and \"post\" objects set.\n        // Let's verify them.\n        expect(this.post, 'post has the right user id').property('userId').to.equal(this.user.id)\n      })\n  })\n\n  it('cy.intercept() - route responses to matching requests', () => {\n    // https://on.cypress.io/intercept\n\n    let message = 'whoa, this comment does not exist'\n\n    // Listen to GET to comments/1\n    cy.intercept('GET', '**/comments/*').as('getComment')\n\n    // we have code that gets a comment when\n    // the button is clicked in scripts.js\n    cy.get('.network-btn').click()\n\n    // https://on.cypress.io/wait\n    cy.wait('@getComment').its('response.statusCode').should('be.oneOf', [200, 304])\n\n    // Listen to POST to comments\n    cy.intercept('POST', '**/comments').as('postComment')\n\n    // we have code that posts a comment when\n    // the button is clicked in scripts.js\n    cy.get('.network-post').click()\n    cy.wait('@postComment').should(({ request, response }) => {\n      expect(request.body).to.include('email')\n      expect(request.headers).to.have.property('content-type')\n      expect(response && response.body).to.have.property('name', 'Using POST in cy.intercept()')\n    })\n\n    // Stub a response to PUT comments/ ****\n    cy.intercept({\n      method: 'PUT',\n      url: '**/comments/*',\n    }, {\n      statusCode: 404,\n      body: { error: message },\n      headers: { 'access-control-allow-origin': '*' },\n      delayMs: 500,\n    }).as('putComment')\n\n    // we have code that puts a comment when\n    // the button is clicked in scripts.js\n    cy.get('.network-put').click()\n\n    cy.wait('@putComment')\n\n    // our 404 statusCode logic in scripts.js executed\n    cy.get('.network-put-comment').should('contain', message)\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/querying.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Querying', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/querying')\n  })\n\n  // The most commonly used query is 'cy.get()', you can\n  // think of this like the '$' in jQuery\n\n  it('cy.get() - query DOM elements', () => {\n    // https://on.cypress.io/get\n\n    cy.get('#query-btn').should('contain', 'Button')\n\n    cy.get('.query-btn').should('contain', 'Button')\n\n    cy.get('#querying .well>button:first').should('contain', 'Button')\n    //              ↲\n    // Use CSS selectors just like jQuery\n\n    cy.get('[data-test-id=\"test-example\"]').should('have.class', 'example')\n\n    // 'cy.get()' yields jQuery object, you can get its attribute\n    // by invoking `.attr()` method\n    cy.get('[data-test-id=\"test-example\"]')\n      .invoke('attr', 'data-test-id')\n      .should('equal', 'test-example')\n\n    // or you can get element's CSS property\n    cy.get('[data-test-id=\"test-example\"]')\n      .invoke('css', 'position')\n      .should('equal', 'static')\n\n    // or use assertions directly during 'cy.get()'\n    // https://on.cypress.io/assertions\n    cy.get('[data-test-id=\"test-example\"]')\n      .should('have.attr', 'data-test-id', 'test-example')\n      .and('have.css', 'position', 'static')\n  })\n\n  it('cy.contains() - query DOM elements with matching content', () => {\n    // https://on.cypress.io/contains\n    cy.get('.query-list')\n      .contains('bananas')\n      .should('have.class', 'third')\n\n    // we can pass a regexp to `.contains()`\n    cy.get('.query-list')\n      .contains(/^b\\w+/)\n      .should('have.class', 'third')\n\n    cy.get('.query-list')\n      .contains('apples')\n      .should('have.class', 'first')\n\n    // passing a selector to contains will\n    // yield the selector containing the text\n    cy.get('#querying')\n      .contains('ul', 'oranges')\n      .should('have.class', 'query-list')\n\n    cy.get('.query-button')\n      .contains('Save Form')\n      .should('have.class', 'btn')\n  })\n\n  it('.within() - query DOM elements within a specific element', () => {\n    // https://on.cypress.io/within\n    cy.get('.query-form').within(() => {\n      cy.get('input:first').should('have.attr', 'placeholder', 'Email')\n      cy.get('input:last').should('have.attr', 'placeholder', 'Password')\n    })\n  })\n\n  it('cy.root() - query the root DOM element', () => {\n    // https://on.cypress.io/root\n\n    // By default, root is the document\n    cy.root().should('match', 'html')\n\n    cy.get('.query-ul').within(() => {\n      // In this within, the root is now the ul DOM element\n      cy.root().should('have.class', 'query-ul')\n    })\n  })\n\n  it('best practices - selecting elements', () => {\n    // https://on.cypress.io/best-practices#Selecting-Elements\n    cy.get('[data-cy=best-practices-selecting-elements]').within(() => {\n      // Worst - too generic, no context\n      cy.get('button').click()\n\n      // Bad. Coupled to styling. Highly subject to change.\n      cy.get('.btn.btn-large').click()\n\n      // Average. Coupled to the `name` attribute which has HTML semantics.\n      cy.get('[name=submission]').click()\n\n      // Better. But still coupled to styling or JS event listeners.\n      cy.get('#main').click()\n\n      // Slightly better. Uses an ID but also ensures the element\n      // has an ARIA role attribute\n      cy.get('#main[role=button]').click()\n\n      // Much better. But still coupled to text content that may change.\n      cy.contains('Submit').click()\n\n      // Best. Insulated from all changes.\n      cy.get('[data-cy=submit]').click()\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/spies_stubs_clocks.spec.js",
    "content": "/// <reference types=\"cypress\" />\n// remove no check once Cypress.sinon is typed\n// https://github.com/cypress-io/cypress/issues/6720\n\ncontext('Spies, Stubs, and Clock', () => {\n  it('cy.spy() - wrap a method in a spy', () => {\n    // https://on.cypress.io/spy\n    cy.visit('https://example.cypress.io/commands/spies-stubs-clocks')\n\n    const obj = {\n      foo () {},\n    }\n\n    const spy = cy.spy(obj, 'foo').as('anyArgs')\n\n    obj.foo()\n\n    expect(spy).to.be.called\n  })\n\n  it('cy.spy() retries until assertions pass', () => {\n    cy.visit('https://example.cypress.io/commands/spies-stubs-clocks')\n\n    const obj = {\n      /**\n       * Prints the argument passed\n       * @param x {any}\n      */\n      foo (x) {\n        console.log('obj.foo called with', x)\n      },\n    }\n\n    cy.spy(obj, 'foo').as('foo')\n\n    setTimeout(() => {\n      obj.foo('first')\n    }, 500)\n\n    setTimeout(() => {\n      obj.foo('second')\n    }, 2500)\n\n    cy.get('@foo').should('have.been.calledTwice')\n  })\n\n  it('cy.stub() - create a stub and/or replace a function with stub', () => {\n    // https://on.cypress.io/stub\n    cy.visit('https://example.cypress.io/commands/spies-stubs-clocks')\n\n    const obj = {\n      /**\n       * prints both arguments to the console\n       * @param a {string}\n       * @param b {string}\n      */\n      foo (a, b) {\n        console.log('a', a, 'b', b)\n      },\n    }\n\n    const stub = cy.stub(obj, 'foo').as('foo')\n\n    obj.foo('foo', 'bar')\n\n    expect(stub).to.be.called\n  })\n\n  it('cy.clock() - control time in the browser', () => {\n    // https://on.cypress.io/clock\n\n    // create the date in UTC so its always the same\n    // no matter what local timezone the browser is running in\n    const now = new Date(Date.UTC(2017, 2, 14)).getTime()\n\n    cy.clock(now)\n    cy.visit('https://example.cypress.io/commands/spies-stubs-clocks')\n    cy.get('#clock-div').click()\n      .should('have.text', '1489449600')\n  })\n\n  it('cy.tick() - move time in the browser', () => {\n    // https://on.cypress.io/tick\n\n    // create the date in UTC so its always the same\n    // no matter what local timezone the browser is running in\n    const now = new Date(Date.UTC(2017, 2, 14)).getTime()\n\n    cy.clock(now)\n    cy.visit('https://example.cypress.io/commands/spies-stubs-clocks')\n    cy.get('#tick-div').click()\n      .should('have.text', '1489449600')\n\n    cy.tick(10000) // 10 seconds passed\n    cy.get('#tick-div').click()\n      .should('have.text', '1489449610')\n  })\n\n  it('cy.stub() matches depending on arguments', () => {\n    // see all possible matchers at\n    // https://sinonjs.org/releases/latest/matchers/\n    const greeter = {\n      /**\n       * Greets a person\n       * @param {string} name\n      */\n      greet (name) {\n        return `Hello, ${name}!`\n      },\n    }\n\n    cy.stub(greeter, 'greet')\n      .callThrough() // if you want non-matched calls to call the real method\n      .withArgs(Cypress.sinon.match.string).returns('Hi')\n      .withArgs(Cypress.sinon.match.number).throws(new Error('Invalid name'))\n\n    expect(greeter.greet('World')).to.equal('Hi')\n    // @ts-ignore\n    expect(() => greeter.greet(42)).to.throw('Invalid name')\n    expect(greeter.greet).to.have.been.calledTwice\n\n    // non-matched calls goes the actual method\n    // @ts-ignore\n    expect(greeter.greet()).to.equal('Hello, undefined!')\n  })\n\n  it('matches call arguments using Sinon matchers', () => {\n    // see all possible matchers at\n    // https://sinonjs.org/releases/latest/matchers/\n    const calculator = {\n      /**\n       * returns the sum of two arguments\n       * @param a {number}\n       * @param b {number}\n      */\n      add (a, b) {\n        return a + b\n      },\n    }\n\n    const spy = cy.spy(calculator, 'add').as('add')\n\n    expect(calculator.add(2, 3)).to.equal(5)\n\n    // if we want to assert the exact values used during the call\n    expect(spy).to.be.calledWith(2, 3)\n\n    // let's confirm \"add\" method was called with two numbers\n    expect(spy).to.be.calledWith(Cypress.sinon.match.number, Cypress.sinon.match.number)\n\n    // alternatively, provide the value to match\n    expect(spy).to.be.calledWith(Cypress.sinon.match(2), Cypress.sinon.match(3))\n\n    // match any value\n    expect(spy).to.be.calledWith(Cypress.sinon.match.any, 3)\n\n    // match any value from a list\n    expect(spy).to.be.calledWith(Cypress.sinon.match.in([1, 2, 3]), 3)\n\n    /**\n     * Returns true if the given number is event\n     * @param {number} x\n     */\n    const isEven = (x) => x % 2 === 0\n\n    // expect the value to pass a custom predicate function\n    // the second argument to \"sinon.match(predicate, message)\" is\n    // shown if the predicate does not pass and assertion fails\n    expect(spy).to.be.calledWith(Cypress.sinon.match(isEven, 'isEven'), 3)\n\n    /**\n     * Returns a function that checks if a given number is larger than the limit\n     * @param {number} limit\n     * @returns {(x: number) => boolean}\n     */\n    const isGreaterThan = (limit) => (x) => x > limit\n\n    /**\n     * Returns a function that checks if a given number is less than the limit\n     * @param {number} limit\n     * @returns {(x: number) => boolean}\n     */\n    const isLessThan = (limit) => (x) => x < limit\n\n    // you can combine several matchers using \"and\", \"or\"\n    expect(spy).to.be.calledWith(\n      Cypress.sinon.match.number,\n      Cypress.sinon.match(isGreaterThan(2), '> 2').and(Cypress.sinon.match(isLessThan(4), '< 4')),\n    )\n\n    expect(spy).to.be.calledWith(\n      Cypress.sinon.match.number,\n      Cypress.sinon.match(isGreaterThan(200), '> 200').or(Cypress.sinon.match(3)),\n    )\n\n    // matchers can be used from BDD assertions\n    cy.get('@add').should('have.been.calledWith',\n      Cypress.sinon.match.number, Cypress.sinon.match(3))\n\n    // you can alias matchers for shorter test code\n    const { match: M } = Cypress.sinon\n\n    cy.get('@add').should('have.been.calledWith', M.number, M(3))\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/traversal.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Traversal', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/traversal')\n  })\n\n  it('.children() - get child DOM elements', () => {\n    // https://on.cypress.io/children\n    cy.get('.traversal-breadcrumb')\n      .children('.active')\n      .should('contain', 'Data')\n  })\n\n  it('.closest() - get closest ancestor DOM element', () => {\n    // https://on.cypress.io/closest\n    cy.get('.traversal-badge')\n      .closest('ul')\n      .should('have.class', 'list-group')\n  })\n\n  it('.eq() - get a DOM element at a specific index', () => {\n    // https://on.cypress.io/eq\n    cy.get('.traversal-list>li')\n      .eq(1).should('contain', 'siamese')\n  })\n\n  it('.filter() - get DOM elements that match the selector', () => {\n    // https://on.cypress.io/filter\n    cy.get('.traversal-nav>li')\n      .filter('.active').should('contain', 'About')\n  })\n\n  it('.find() - get descendant DOM elements of the selector', () => {\n    // https://on.cypress.io/find\n    cy.get('.traversal-pagination')\n      .find('li').find('a')\n      .should('have.length', 7)\n  })\n\n  it('.first() - get first DOM element', () => {\n    // https://on.cypress.io/first\n    cy.get('.traversal-table td')\n      .first().should('contain', '1')\n  })\n\n  it('.last() - get last DOM element', () => {\n    // https://on.cypress.io/last\n    cy.get('.traversal-buttons .btn')\n      .last().should('contain', 'Submit')\n  })\n\n  it('.next() - get next sibling DOM element', () => {\n    // https://on.cypress.io/next\n    cy.get('.traversal-ul')\n      .contains('apples').next().should('contain', 'oranges')\n  })\n\n  it('.nextAll() - get all next sibling DOM elements', () => {\n    // https://on.cypress.io/nextall\n    cy.get('.traversal-next-all')\n      .contains('oranges')\n      .nextAll().should('have.length', 3)\n  })\n\n  it('.nextUntil() - get next sibling DOM elements until next el', () => {\n    // https://on.cypress.io/nextuntil\n    cy.get('#veggies')\n      .nextUntil('#nuts').should('have.length', 3)\n  })\n\n  it('.not() - remove DOM elements from set of DOM elements', () => {\n    // https://on.cypress.io/not\n    cy.get('.traversal-disabled .btn')\n      .not('[disabled]').should('not.contain', 'Disabled')\n  })\n\n  it('.parent() - get parent DOM element from DOM elements', () => {\n    // https://on.cypress.io/parent\n    cy.get('.traversal-mark')\n      .parent().should('contain', 'Morbi leo risus')\n  })\n\n  it('.parents() - get parent DOM elements from DOM elements', () => {\n    // https://on.cypress.io/parents\n    cy.get('.traversal-cite')\n      .parents().should('match', 'blockquote')\n  })\n\n  it('.parentsUntil() - get parent DOM elements from DOM elements until el', () => {\n    // https://on.cypress.io/parentsuntil\n    cy.get('.clothes-nav')\n      .find('.active')\n      .parentsUntil('.clothes-nav')\n      .should('have.length', 2)\n  })\n\n  it('.prev() - get previous sibling DOM element', () => {\n    // https://on.cypress.io/prev\n    cy.get('.birds').find('.active')\n      .prev().should('contain', 'Lorikeets')\n  })\n\n  it('.prevAll() - get all previous sibling DOM elements', () => {\n    // https://on.cypress.io/prevall\n    cy.get('.fruits-list').find('.third')\n      .prevAll().should('have.length', 2)\n  })\n\n  it('.prevUntil() - get all previous sibling DOM elements until el', () => {\n    // https://on.cypress.io/prevuntil\n    cy.get('.foods-list').find('#nuts')\n      .prevUntil('#veggies').should('have.length', 3)\n  })\n\n  it('.siblings() - get all sibling DOM elements', () => {\n    // https://on.cypress.io/siblings\n    cy.get('.traversal-pills .active')\n      .siblings().should('have.length', 2)\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/utilities.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Utilities', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/utilities')\n  })\n\n  it('Cypress._ - call a lodash method', () => {\n    // https://on.cypress.io/_\n    cy.request('https://jsonplaceholder.cypress.io/users')\n      .then((response) => {\n        let ids = Cypress._.chain(response.body).map('id').take(3).value()\n\n        expect(ids).to.deep.eq([1, 2, 3])\n      })\n  })\n\n  it('Cypress.$ - call a jQuery method', () => {\n    // https://on.cypress.io/$\n    let $li = Cypress.$('.utility-jquery li:first')\n\n    cy.wrap($li)\n      .should('not.have.class', 'active')\n      .click()\n      .should('have.class', 'active')\n  })\n\n  it('Cypress.Blob - blob utilities and base64 string conversion', () => {\n    // https://on.cypress.io/blob\n    cy.get('.utility-blob').then(($div) => {\n      // https://github.com/nolanlawson/blob-util#imgSrcToDataURL\n      // get the dataUrl string for the javascript-logo\n      return Cypress.Blob.imgSrcToDataURL('https://example.cypress.io/assets/img/javascript-logo.png', undefined, 'anonymous')\n      .then((dataUrl) => {\n        // create an <img> element and set its src to the dataUrl\n        let img = Cypress.$('<img />', { src: dataUrl })\n\n        // need to explicitly return cy here since we are initially returning\n        // the Cypress.Blob.imgSrcToDataURL promise to our test\n        // append the image\n        $div.append(img)\n\n        cy.get('.utility-blob img').click()\n          .should('have.attr', 'src', dataUrl)\n      })\n    })\n  })\n\n  it('Cypress.minimatch - test out glob patterns against strings', () => {\n    // https://on.cypress.io/minimatch\n    let matching = Cypress.minimatch('/users/1/comments', '/users/*/comments', {\n      matchBase: true,\n    })\n\n    expect(matching, 'matching wildcard').to.be.true\n\n    matching = Cypress.minimatch('/users/1/comments/2', '/users/*/comments', {\n      matchBase: true,\n    })\n\n    expect(matching, 'comments').to.be.false\n\n    // ** matches against all downstream path segments\n    matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/**', {\n      matchBase: true,\n    })\n\n    expect(matching, 'comments').to.be.true\n\n    // whereas * matches only the next path segment\n\n    matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/*', {\n      matchBase: false,\n    })\n\n    expect(matching, 'comments').to.be.false\n  })\n\n  it('Cypress.Promise - instantiate a bluebird promise', () => {\n    // https://on.cypress.io/promise\n    let waited = false\n\n    /**\n     * @return Bluebird<string>\n     */\n    function waitOneSecond () {\n      // return a promise that resolves after 1 second\n      // @ts-ignore TS2351 (new Cypress.Promise)\n      return new Cypress.Promise((resolve, reject) => {\n        setTimeout(() => {\n          // set waited to true\n          waited = true\n\n          // resolve with 'foo' string\n          resolve('foo')\n        }, 1000)\n      })\n    }\n\n    cy.then(() => {\n      // return a promise to cy.then() that\n      // is awaited until it resolves\n      // @ts-ignore TS7006\n      return waitOneSecond().then((str) => {\n        expect(str).to.eq('foo')\n        expect(waited).to.be.true\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/viewport.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Viewport', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/viewport')\n  })\n\n  it('cy.viewport() - set the viewport size and dimension', () => {\n    // https://on.cypress.io/viewport\n\n    cy.get('#navbar').should('be.visible')\n    cy.viewport(320, 480)\n\n    // the navbar should have collapse since our screen is smaller\n    cy.get('#navbar').should('not.be.visible')\n    cy.get('.navbar-toggle').should('be.visible').click()\n    cy.get('.nav').find('a').should('be.visible')\n\n    // lets see what our app looks like on a super large screen\n    cy.viewport(2999, 2999)\n\n    // cy.viewport() accepts a set of preset sizes\n    // to easily set the screen to a device's width and height\n\n    // We added a cy.wait() between each viewport change so you can see\n    // the change otherwise it is a little too fast to see :)\n\n    cy.viewport('macbook-15')\n    cy.wait(200)\n    cy.viewport('macbook-13')\n    cy.wait(200)\n    cy.viewport('macbook-11')\n    cy.wait(200)\n    cy.viewport('ipad-2')\n    cy.wait(200)\n    cy.viewport('ipad-mini')\n    cy.wait(200)\n    cy.viewport('iphone-6+')\n    cy.wait(200)\n    cy.viewport('iphone-6')\n    cy.wait(200)\n    cy.viewport('iphone-5')\n    cy.wait(200)\n    cy.viewport('iphone-4')\n    cy.wait(200)\n    cy.viewport('iphone-3')\n    cy.wait(200)\n\n    // cy.viewport() accepts an orientation for all presets\n    // the default orientation is 'portrait'\n    cy.viewport('ipad-2', 'portrait')\n    cy.wait(200)\n    cy.viewport('iphone-4', 'landscape')\n    cy.wait(200)\n\n    // The viewport will be reset back to the default dimensions\n    // in between tests (the  default can be set in cypress.json)\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/waiting.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Waiting', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/waiting')\n  })\n  // BE CAREFUL of adding unnecessary wait times.\n  // https://on.cypress.io/best-practices#Unnecessary-Waiting\n\n  // https://on.cypress.io/wait\n  it('cy.wait() - wait for a specific amount of time', () => {\n    cy.get('.wait-input1').type('Wait 1000ms after typing')\n    cy.wait(1000)\n    cy.get('.wait-input2').type('Wait 1000ms after typing')\n    cy.wait(1000)\n    cy.get('.wait-input3').type('Wait 1000ms after typing')\n    cy.wait(1000)\n  })\n\n  it('cy.wait() - wait for a specific route', () => {\n    // Listen to GET to comments/1\n    cy.intercept('GET', '**/comments/*').as('getComment')\n\n    // we have code that gets a comment when\n    // the button is clicked in scripts.js\n    cy.get('.network-btn').click()\n\n    // wait for GET comments/1\n    cy.wait('@getComment').its('response.statusCode').should('be.oneOf', [200, 304])\n  })\n})\n"
  },
  {
    "path": "cypress/integration/examples/window.spec.js",
    "content": "/// <reference types=\"cypress\" />\n\ncontext('Window', () => {\n  beforeEach(() => {\n    cy.visit('https://example.cypress.io/commands/window')\n  })\n\n  it('cy.window() - get the global window object', () => {\n    // https://on.cypress.io/window\n    cy.window().should('have.property', 'top')\n  })\n\n  it('cy.document() - get the document object', () => {\n    // https://on.cypress.io/document\n    cy.document().should('have.property', 'charset').and('eq', 'UTF-8')\n  })\n\n  it('cy.title() - get the title', () => {\n    // https://on.cypress.io/title\n    cy.title().should('include', 'Kitchen Sink')\n  })\n})\n"
  },
  {
    "path": "cypress/plugins/index.js",
    "content": "/// <reference types=\"cypress\" />\n// ***********************************************************\n// This example plugins/index.js can be used to load plugins\n//\n// You can change the location of this file or turn off loading\n// the plugins file with the 'pluginsFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/plugins-guide\n// ***********************************************************\n\n// This function is called when a project is opened or re-opened (e.g. due to\n// the project's config changing)\n\n/**\n * @type {Cypress.PluginConfig}\n */\nmodule.exports = (on, config) => {\n  // `on` is used to hook into various events Cypress emits\n  // `config` is the resolved Cypress config\n}\n"
  },
  {
    "path": "cypress/support/commands.js",
    "content": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom commands and overwrite\n// existing commands.\n//\n// For more comprehensive examples of custom\n// commands please read more here:\n// https://on.cypress.io/custom-commands\n// ***********************************************\n//\n//\n// -- This is a parent command --\n// Cypress.Commands.add(\"login\", (email, password) => { ... })\n//\n//\n// -- This is a child command --\n// Cypress.Commands.add(\"drag\", { prevSubject: 'element'}, (subject, options) => { ... })\n//\n//\n// -- This is a dual command --\n// Cypress.Commands.add(\"dismiss\", { prevSubject: 'optional'}, (subject, options) => { ... })\n//\n//\n// -- This will overwrite an existing command --\n// Cypress.Commands.overwrite(\"visit\", (originalFn, url, options) => { ... })\n\n\nCypress.Commands.add(\"dragTo\", { prevSubject: \"element\" }, (subject, targetEl) => {\n    cy.wrap(subject).trigger(\"dragstart\");\n    cy.get(targetEl).trigger(\"drop\");\n  }\n);"
  },
  {
    "path": "cypress/support/index.js",
    "content": "// ***********************************************************\n// This example support/index.js is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n\n// Import commands.js using ES2015 syntax:\nimport './commands'\n\n// Alternatively you can use CommonJS syntax:\n// require('./commands')\n"
  },
  {
    "path": "cypress.json",
    "content": "{}\n"
  },
  {
    "path": "docs/contributor/codebase.rst",
    "content": "Codebase Orientation\n--------------------\n\nDirectories\n~~~~~~~~~~~\n\nCode Snippets: ``snippets/``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis comprises the sample code snippets for the extension. Refer to\n`Code Snippet Metadata`_ to learn more about the content of each code\nsnippet.\n\nBinder setup: ``binder/``\n^^^^^^^^^^^^^^^^^^^^^^^^^\nThis contains an environment specification for ``repo2docker`` which\nallows the repository to be tested on `mybinder.org`_. This\nspecification is developer focused. For a more user-focused binder see\nthe `JupyterLab demo`_.\n\nTest: ``test/`` ``cypress/``\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n``test/`` contains unit test scripts using jest. And, ``cypress/`` contains integration test scripts using Cypress.\n\nDesign: ``design/``\n^^^^^^^^^^^^^^^^^^^\nThis directory contains gifs or images that show the design perspective of\nour extension.\n\nStyle: ``style/``\n^^^^^^^^^^^^^^^^^^^\nThis directory contains all of the CSS styling used in the extension.\n\nDocumentation: ``docs/``\n^^^^^^^^^^^^^^^^^^^^^^^^\nThis directory contains the Sphinx project for this documentation.\n\nFiles\n~~~~~\nDescription of each file in ``src/``\n\n-  CodeSnippetContentsService.ts: this contains a wrapper class that\n   uses the functions defined in @jupyterlab/contentsSerivce.\n-  CodeSnippetDisplay.tsx: this contains a major React component that defines key code snippets UI and renders\n   code snippets.\n-  CodeSnippetEditor.tsx : this contains a React component that creates\n   an editor for each code snippet.\n-  CodeSnippetEditorTags.tsx: this contains a React component that\n   renders code snippet tags in code snippet editor.\n-  CodeSnippetFilterTools.tsx: this contains a react component that renders a\n   search bar and filter box.\n-  CodeSnippetInputDialog.ts: this contains a class that defines\n   the content of the custom code snippet form.\n-  CodeSnippetLanguages.ts: this contains a list of supported languages\n   and their corresponding icons.\n-  CodeSnippetMenu.ts: this contains a lumino widget that creates dropdown\n   dialog when three dots icon is clicked.\n-  CodeSnippetMessage.ts: this contains a class that creates a message as a modal window after creating, copying, or downloading snippet.\n-  CodeSnippetPreview.ts: this contains a lumino widget that creates a preview minimap.\n-  CodeSnippetService.ts: this contains a wrapper class that handles the backend storage of the code snippets in JupyterLab Settings API.\n-  CodeSnippetUtilities.ts: this contains a few utility functions that are used across the codebase.\n-  CodeSnippetWidget.tsx: this contains a Lumino react widget that acts as a container of code snippets.\n-  index.ts: this contains the activation of our extension.\n\n.. _Code Snippet Metadata: https://jupyterlab-code-snippets-documentation.readthedocs.io/en/latest/contributor/snippet_metadata.html\n.. _mybinder.org: https://mybinder.org/\n.. _JupyterLab demo: https://mybinder.org/v2/gh/jupytercalpoly/jupyterlab-code-snippets.git/master?urlpath=lab\n"
  },
  {
    "path": "docs/contributor/contribute.rst",
    "content": ".. _contribute:\n\nHow to Contribute\n-----------------\nGeneral Guidelines for Contributing\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor general documentation about contributing to Jupyter projects, see\nthe `Project Jupyter Contributor\nDocumentation <https://jupyter.readthedocs.io/en/latest/contributing/content-contributor.html>`__\nand `Code of\nConduct <https://github.com/jupyter/governance/blob/master/conduct/code_of_conduct.md>`__.\n\nAll source code is written in\n`TypeScript <http://www.typescriptlang.org/Handbook>`__. See the `Style\nGuide <https://github.com/jupyterlab/jupyterlab/wiki/TypeScript-Style-Guide>`__.\n\nAll source code is formatted using `prettier <https://prettier.io>`__.\nWhen code is modified and committed, all staged files will be\nautomatically formatted using pre-commit git hooks (with help from the\n`lint-staged <https://github.com/okonet/lint-staged>`__ and\n`husky <https://github.com/typicode/husky>`__ libraries). The benefit of\nusing a code formatter like prettier is that it removes the topic of\ncode style from the conversation when reviewing pull requests, thereby\nspeeding up the review process.\n\nYou may also use the prettier npm script (e.g. ``npm run prettier`` or\n``yarn prettier`` or ``jlpm prettier``) to format the entire code base.\nWe recommend installing a prettier extension for your code editor and\nconfiguring it to format your code with a keyboard shortcut or\nautomatically on save.\n\nContributing Installation\n~~~~~~~~~~~~~~~~~~~~~~~~~\n.. code:: bash\n\n    # Clone the repo to your local environment\n    # Move to jupyterlab-code-snippets directory\n    \n    # Install dependencies\n    jlpm\n    # Build Typescript source\n    jlpm build\n    # Link your development version of the extension with JupyterLab\n    jupyter labextension install .\n    # Rebuild Typescript source after making changes\n    jlpm build\n    # Rebuild JupyterLab after making any changes\n    jupyter lab build\n\nYou can watch the source directory and run JupyterLab in watch mode to watch for changes in the extension's source and automatically rebuild the extension and application.\n\n.. code:: bash\n\n    # Watch the source directory in another terminal tab\n    jlpm watch\n    # Run jupyterlab in watch mode in one terminal tab\n    jupyter lab --watch\n\nNow every change will be built locally and bundled into JupyterLab. Be sure to refresh your browser page after saving file changes to reload the extension (note: you'll need to wait for webpack to finish, which can take 10s+ at times).\n"
  },
  {
    "path": "docs/contributor/snippet_metadata.rst",
    "content": ".. _snippet_metadata:\n\nCode Snippet Metadata \n-------------------\nThis extension uses JupyterLab Contents Service and creates a\n``snippets/`` if it doesn’t exist. This is where code snippet json files\nare stored, following a schema defined below.\n\n.. code::\n\n   {\n      name: string,\n      description: string,\n      language: string,\n      code: string[],\n      id: number,\n      tags?: string[]\n   }\n\nThis is a sample code snippet json file:\n\n.. code:: json\n\n   {\n     \"name\": \"import_statements\",\n     \"description\": \"Import statements for matlibplot.\",\n     \"language\": \"python\",\n     \"code\": [\n           \"import matplotlib as mpl\",\n           \"import matplotlib.pyplot as plt\"\n     ],\n     \"id\": 1,\n     \"tags\":[\"import statements\"]\n   }\n"
  },
  {
    "path": "docs/getting_started/changelog.rst",
    "content": ".. _changelog:\n\nChangelog\n---------\n\nv2.1.1\n^^^^^^\n* Made font size of preview configurable in settings\n\nv2.1.0\n^^^^^^\n* Made snippets globally accessible.\n* Improved search : can search for code, language, and name in search bar.\n* Expanded tags : now can filter by language tag and by snippet tag.\n* Added ability to download snippets to local directory.\n* Made right click to open the code snippet contextMenu possible anywhere on code snippet in addition to the three dots.\n* Made possible to create or move a snippet while snippets are filtered.\n* Set the language of a new snippet as the kernel language by default.\n* Improved snippet creation process by making description optional and allowing uppercase and spaces in snippet names.\n* Made minor UI and bug fixes.\n\nv2.0.1\n^^^^^^\n* Fixed the issue with creating the snippet from scratch or editing the snippet in the editor.\n\nv2.0.0\n^^^^^^\n* Fixed the issue with the keyboard shortcut by making it user-configurable.\n* Fixed broken behavior of drag and drop.\n* Made the UI more consistent.\n* Added a new feature to rename the code snippet in the code snippet panel easily by double-clicking its name.\n* Improved the search feature with fuzzy search.\n* Added a function to save the entire cell(s) as a code snippet without highlighting code.\n* Added multi-cell saving by right clicking and saving as a code snippet.\n* Changed preview height to match the height of code snippet box at the maximum.\n\nv1.0.4\n^^^^^^\n* Fixed the issue with deleting a snippet while searching or filtering\n* Fixed the issue with adding a snippet while searching or filtering\n\nv1.0.3\n^^^^^^\n* Fixed the issue with keyboard shortcut to create a code snippet with highlighted text\n\nv1.0.2\n^^^^^^\n* Fixed editing or deleting errors during filtering or searching\n* Fixed a name inlinement with language icon\n\nv1.0.1\n^^^^^^\n* Insert, copy, and edit icons are removed and replaced by a single icon with dropdown\n* Replaced language from text to icon\n* Added a keybinding for saving highlighted code as code snippet\n\nv1.0.0\n^^^^^^\n* Added minimap-like preview\n* Added plus icon to create a code snippet from scratch\n* Added code snippet tags for filter functionality\n* Fixed drag image and confirmation message\n* Added delete dialog\n\nv0.1.1\n^^^^^^\n* Editing a snippet\n\nv0.1.0\n^^^^^^\n* Creating, deleting,and using snippet to JupyterLab workspace\n* Undo/Redo deletion of snippet\n* Searching and previewing Snippets\n* Moving snippet within explorer\n"
  },
  {
    "path": "docs/getting_started/installation.rst",
    "content": ".. _installation:\n\nInstallation\n------------\n\nRequirements\n~~~~~~~~~~~~\nJupyterLab >= 3.0\n\nInstall with jupyter\n~~~~~~~~~~~~~~~~~~~~\n.. code:: bash\n\n    jupyter labextension install jupyterlab-code-snippets\n    jupyter lab clean\n    jupyter lab build\n    \nInstall with pip\n~~~~~~~~~~~~~~~~\n.. code:: bash\n\n    pip install jupyterlab-code-snippets\n    jupyter lab clean\n    jupyter lab build\n\nUninstall\n~~~~~~~~~\n.. code:: bash\njupyter labextension uninstall jupyterlab-code-snippets\n\npip uninstall jupyterlab-code-snippets\n"
  },
  {
    "path": "docs/getting_started/overview.rst",
    "content": ".. _overview:\n\nOverview\n--------\n\nJupyterLab Code Snippets empowers you to write code more rapidly\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. image:: ../../Design/overview.gif\n\nDo you find yourself typing in the same code blocks over and over again?\nAre you tired of clicking through tabs online for starter code or\nbrowsing old notebook files to find the right import statements? Save,\nreuse, and share code snippets using JupyterLab Code Snippets! In the\npast, you would spend more time scouring the internet than actually\nworking. Searching old code for snippets is like searching for your lost\nkeys; it’s frustrating!\n\nJupyterLab Code Snippets allows you to create and store code snippets\nthat can be inserted into any JupyterLab workspace and save you from the\nhassle of typing repetitive code. Code snippets are pieces of code or\nindividual cells that are frequently used. Simply browse or search\nsnippets in the Snippets panel to use wherever you need in JupyterLab.\n\nUsing JupyterLab code snippets is easy! Simply open the snippet explorer\nand browse through the provided predefined code snippets. Still can’t\nfind what you need? Simply highlight code and right-click to save as a\nsnippet or drag cells into the panel. Find snippets by utilizing the\nsearch, filter, and preview features. For a fresh start, select the plus\nicon in the snippet panel to construct a completely new, custom snippet.\nAlso, edit your snippet quickly at any time by clicking the edit icon on\nthe snippet. To use your snippets, you can drag and drop a code snippet\nto insert it as a cell or press the insert icon on the snippet to inject\nthe code where your cursor is located within the JupyterLab workspace.\n\n*“I’ve grown accustomed to opening an old notebook and searching through\nit in order to find the necessary import statements every time I start a\nnew project. But, with the JupyterLab Code Snippets extension, I saved a\nlot of time by storing them as snippets and inserting them directly into\nmy workflow.” - amazed customer*\n\nThis new extension unlocks the exciting ability to seamlessly\nincorporate code snippets. You can now store the frequently used code as\na snippet and use it quickly. Save time, save energy, and get down to\nbusiness with JupyterLab Code Snippets!\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. jupyterlab-code-snippet documentation master file, created by\n   sphinx-quickstart on Fri Aug 21 12:18:14 2020.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\nJupyterLab Code Snippets Documentation\n=====================================================\n\nJupyterLab Code Snippets empowers you to write code more rapidly. `Try it on Binder <https://mybinder.org/v2/gh/jupytercalpoly/jupyterlab-code-snippets.git/master?urlpath=lab>`__.\n\n.. image:: ../Design/overview.gif\n   :align: center\n\n.. toctree::\n   :maxdepth: 1\n   :caption: Getting Started\n\n   getting_started/overview\n   getting_started/installation\n   getting_started/start\n   getting_started/changelog\n\n.. toctree::\n   :maxdepth: 1\n   :caption: User Guide\n   \n   user/ux\n   user/features\n   user/transition\n\n.. toctree::\n   :maxdepth: 1\n   :caption: Contributor Guide\n   \n   contributor/codebase\n   contributor/contribute\n   contributor/snippet_metadata\n"
  },
  {
    "path": "docs/user/features.rst",
    "content": "Features\n========\n\nCode Snippet Explorer\n---------------------\n\nOn the left side bar of the JupyterLab, you can click the snippet icon (</>) to open/close the code snippet explorer that contains all the saved snippets as below.\nYou can scroll/resize code snippet explorer, order the snippets with drag and drop, and manage and search the snippets.\n\n.. image:: ../../Design/CodeSnippetExtensionPanel.png\n    :align: center\n\nCreation of a New Snippet\n-------------------------\n\nThere are several ways to create a new snippet.\n\n1. Highlight lines of code and right click (or use keyboard shortcut (cmd-shift-A or ctrl-shift-A)) to save the code as a snippet. Or, you can select cell(s) and right click (or use keyboard shortcut (cmd-shift-A or ctrl-shift-A)) to save content as a snippet. Then, you will see the \"Save As Code Snippet\" option in JupyterLab context menu as below:\n\n    .. image:: ../../Design/right_click.png\n        :align: center\n\n    Clicking the option will open the dialog as below where you can input name, description, language, and tags of the snippet.\n\n    .. image:: ../../Design/code_snippet_input_dialog.png\n        :align: center\n\n2. More easily, just drag notebook cell(s) to the code snippet explorer on the left to create a new snippet. It will also open the dialog as above for your inputs.\n\n3. Hit the plus button next to the search bar (refer to `Search of Code Snippets`_) to create a new snippet from scratch.\n\n.. image:: ../../Design/create_from_scratch.png\n        :align: center\n\nUse of Code Snippets\n--------------------\n\nClick the three dots or right click anywhere on the snippet you want to use. It will open code snippet menu as below to insert, copy, edit, download, or delete the snippet.\n\n.. image:: ../../Design/CodeSnippetMenu.png\n    :align: center\n\nInsert\n^^^^^^\nClick the insert option to insert. It will warn you if the language is different from the kernel langauge. \nAdditionally, on hover with six dots on the left (refer to `Search of Code Snippets`_), drag snippet into any JupyterLab workspace to insert the snippet!\n\nCopy\n^^^^\nClick the copy option to copy. It will create a message on the bottom right corner as below.\n\n.. image:: ../../Design/copy_snippet.png\n    :align: center\n\nEdit\n^^^^\nEdit the saved snippets by clicking the edit option. It will open a code snippet editor as below.\n\n.. image:: ../../Design/code_snippet_edit.png\n    :align: center\n\nDownload\n^^^^^^^^\nDownload snippets and share them with others by clicking the download option. It will open a box as below to input **relative path** to download the snippets.\n\n.. image:: ../../Design/download_snippets_box.png\n    :align: center\n\nDelete\n^^^^^^\nDelete snippets by clicking delete option. It will open a warning box as below.\n\n.. image:: ../../Design/delete_snippet.png\n    :align: center\n\nSearch of Code Snippets\n-----------------------\n\nWith the filter box as below, **search** snippets with name, language, and code with search bar or **filter** them with language/filter tags!  \n\n.. image:: ../../Design/code_snippet_filter_box.png\n    :align: center\n\nFurthermore, hover over snippets to see the preview of each snippet.\n\n.. image:: ../../Design/code_snippet_preview.png\n    :align: center\n\nChange Font Size of Snippet Preivew\n-----------------------------------\nIn the JupyterLab Settings -> Advanced Settings Editor, users can set the size of code in snippet preview to see part of its content clearly.\n\n.. image:: ../../Design/changePreivewFontSize.gif\n    :align: center\n"
  },
  {
    "path": "docs/user/transition.rst",
    "content": "Transition to 2.1.0\n===================\n\nThe 2.1.0 update has made snippets globally accessible across notebooks by saving \nthem at the JupyterLab Settings API endpoint.\n\nOne side effect of this change is that snippets created in the previous version of \nthis extension will not be supported. The /snippets folder will continue to be available\nif previously created in a project folder.\n\nIn addition, the searching/tag feature has been expanded as well.\n\n\nTransferring Single Snippets\n----------------------------\n\nTo add old snippets to the new snippet location, simply copy the JSON object and go to:\nSettings > Advanced Settings Editor > Code Snippet Manager\n\nIn the User Preferences panel there will be an array of snippets existing globally\n(something like \"snippets\" : [...]) where the ... are the globally accessible\nsnippets.\n\nAt the end of the existing list, paste the copied JSON object, make sure the id value is\nsequential to what already is in the list. Save using the save icon in the top right corner.\nSnippet should appear in the snippets panel!\n\nOpen JSON file of snippet to upload:\n\n.. image:: ../../Design/smallOpenJSON.png\n   :align: center\n\nCopy the JSON object:\n\n.. image:: ../../Design/copy_JSON.png\n   :align: center\n\nNavigate to settings:\n\n.. image:: ../../Design/smallGoToSettings.png\n   :align: center\n\nPaste JSON object into list of snippets:\n\n.. image:: ../../Design/saveASingleSnippet.gif\n   :align: center\n\n\nAfter saving, new snippet should appear at the bottom of the snippets list in the snippet panel:\n\n.. image:: ../../Design/smallSnippetAdded.png\n   :align: center\n\n\nTransferring Multiple Snippets\n------------------------------\n\nTo help with converting entire /snippets folder worth of snippets we have developed a python\nscript to help with the transition:\n\n.. code::\n\n    import os\n    import json\n    import glob\n\n    def extract_id(json):\n        try:\n            return json['id']\n        except KeyError:\n            return 0\n\n    snippets = []\n    counter = 0\n    for filepath in glob.glob(os.path.join('snippets', '*.json')):\n        with open(filepath) as f:\n            content = json.load(f)\n            content['id'] = counter\n            snippets.append(content)\n            counter+=1\n\n    snippets.sort(key=extract_id)\n    print('{\"snippets\": [\\n')\n    for snip in snippets:\n        if not('tags' in snip):\n            snip[\"tags\"] = []\n        if snippets.index(snip) == len(snippets)-1:\n            print(json.dumps(snip, indent=4, sort_keys=True))\n        else:\n            print(json.dumps(snip, indent=4, sort_keys=True), end=\",\\n\")\n    print(\"]\\n}\\n\")\n\n\nThis script will concatenate and print out all of the json objects in a /snippets folder\nin a project. After running the script, copy the output and paste into the User Preferences\npanel in settings, similar to the single snippet upload.\n\n**NOTE**: If adding objects to existing list of snippets in user preferences, change *counter* variable\nto n+1 where n is the ID of the last snippet stored in user preferences.\n\nThis script will print something like : \n\n.. code::\n\n\n   {\"snippets\": [\n\n   {\n      \"code\": [\n         \"print(\\\"hello\\\")\"\n      ],\n      \"description\": \"\",\n      \"id\": 0,\n      \"language\": \"Python\",\n      \"name\": \"new_snippet_3\",\n      \"tags\": [\n         \"import statements\"\n      ]\n   },\n   {\n      \"code\": [\n         \"def most_frequent(list):\",\n         \"    return max(set(list), key = list.count)\",\n         \"  \",\n         \"\",\n         \"numbers = [1,2,1,2,3,2,1,4,2]\",\n         \"most_frequent(numbers)  \"\n      ],\n      \"description\": \"This method returns the most frequent element that appears in a list.\",\n      \"id\": 1,\n      \"language\": \"Python\",\n      \"name\": \"most_frequent\",\n      \"tags\": []\n   }\n   ]\n   }\n\nAfter generating this dictionary, one can simply delete the current contents of user preferences \n(Advanced Settings > Code Snippet Manager > User Preferences) and paste this dictionary instead.\nThis will delete the current snippets at the endpoint (which will be default snippets if the extension is \nfreshly updated/installed) and replace them with the old snippets.\n\n**NOTE**: If adding objects onto an existing list of objects, make sure the ID numbers are all in sequential,\nascending order.\n\nSearch and Tag Update\n---------------------\n\n.. image:: ../../Design/smallUnselectedTags.png\n   :align: center\n\n**NOTE 1**: Snippet tags function on an OR basis, as in when the \"data analytics\" tag and the \"import statements\" tag are selected together, \nthe panel displays any tags that are tagged as import statements OR tagged as \"data analytics.\"\n\nex) Snippet tags selected together:\n\n.. image:: ../../Design/smallSnippetTagsSelected.png\n   :align: center\n\nex) Language tags selected together:\n\n.. image:: ../../Design/smallLanguageTagsSelected.png\n   :align: center\n\n**NOTE 2**: Language tags and snippets tags have an AND relationship. As in when the \"Python\" tag and the \"data analytics\" tags are selected together, \nonly snippets that are both in the language Python AND tagged as data analytics will appear.\n\n.. image:: ../../Design/smallLangAndSnippetTag.png\n   :align: center\n\n**NOTE 3**: When language tags are selected, only snippet tags in that language will appear for ease of selection.\n\n.. image:: ../../Design/smallPythonTagOnly.png\n   :align: center\n\n**NOTE 4**: If 2 of the same language tags appear in the Language Tags section this indicates that one of the snippets\ncontains a snippet tag that matches the language name. To get rid of the duplicate tag, filter through snippets and\nuntag any snippets that have that Language in their snippet tags.\n"
  },
  {
    "path": "docs/user/ux.rst",
    "content": ".. _ux:\n\nUser Experience\n---------------\n\nAdd snippet\n^^^^^^^^^^^\n* Drag code cell(s) to panel.\n* Highlight code and save as snippet.\n* Click plus button on panel to create a custom snippet.\n* Select cell(s) and use context menu to save all code within selection as snippet.\n* Select cell(s) and use keyboard shortcut (cmd-shift-A or ctrl-shift-A) to save all code within selection as snippet.\n\nFind snippet\n^^^^^^^^^^^^\n* Preview snippet on hover.\n* Filter snippets by tags in \"Filter by Tags\" dropdown.\n* Search a snippet's name or language in the search bar.\n\nEdit snippet\n^^^^^^^^^^^^\n* Click 3 dots (or right click) and select \"Edit snippet\" in dropdown.\n\nUse snippet\n^^^^^^^^^^^\n*  Drag and drop snippet using 6 dot drag icon (visible on hover) to notebook.\n\n   *  Will put snippet code into a cell upon insertion.\n   \n* Click 3 dots (or right click) and select \"Insert snippet\" to insert snippet where cursor was on notebook.\n* Click 3 dots (or right click) and select \"Copy to clipboard\" to copy snippet and paste it wherever desired.\n\nDownload snippet\n^^^^^^^^^^^^^^^^\n* Click 3 dots (or right click) and select \"Download snippet\" and input the relative path to download. If the path is not given, it downloads it to the current directory.\n* Easy way to share snippets with others.\n\nDelete snippet\n^^^^^^^^^^^^^^\n* Click 3 dots (or right click) and select \"Delete snippet\" and confirm delete in dialog."
  },
  {
    "path": "install.json",
    "content": "{\n  \"packageManager\": \"python\",\n  \"packageName\": \"jupyterlab-code-snippets\",\n  \"uninstallInstructions\": \"Use your Python package manager (pip, conda, etc.) to uninstall the package jupyterlab-code-snippets\"\n}\n"
  },
  {
    "path": "jest.config.js",
    "content": "const func = require('@jupyterlab/testutils/lib/jest-config');\nmodule.exports = func(__dirname);\n// const path = require('path');\n\n// module.exports = {\n//   verbose: false,\n//   preset: 'ts-jest/presets/js-with-babel',\n//   transform: {\n//     '^.+\\\\.tsx?$': 'ts-jest',\n//     '^.+\\\\.(js|jsx)$': 'babel-jest'\n//   },\n//   setupFiles: ['<rootDir>/testutils/jest-setup-files.js'],\n//   moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],\n//   testPathIgnorePatterns: ['/lib/', '/node_modules/'],\n//   coverageReporters: ['json', 'lcov', 'text', 'html'],\n//   coverageDirectory: path.join('./', 'coverage'),\n//   testRegex: '(/__tests__/.*|(\\\\.|/)(test|spec))\\\\.tsx?$',\n//   globals: {\n//     'ts-jest': {\n//       tsconfig: './tsconfig.test.json'\n//     }\n//   }\n// };"
  },
  {
    "path": "junit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites name=\"jest tests\" tests=\"0\" failures=\"0\" time=\"0\">\n</testsuites>"
  },
  {
    "path": "jupyterlab-code-snippets/_version.py",
    "content": "# This file is auto-generated by Hatchling. As such, do not:\n#   - modify\n#   - track in version control e.g. be sure to add to .gitignore\n__version__ = VERSION = '2.2.0'\n"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/build_log.json",
    "content": "[\n  {\n    \"bail\": true,\n    \"module\": {\n      \"rules\": [\n        {\n          \"test\": {},\n          \"use\": [\n            \"style-loader\",\n            \"css-loader\"\n          ]\n        },\n        {\n          \"test\": {},\n          \"use\": \"raw-loader\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"raw-loader\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"file-loader\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"file-loader\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"url-loader?limit=10000&mimetype=application/font-woff\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"url-loader?limit=10000&mimetype=application/font-woff\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"url-loader?limit=10000&mimetype=application/octet-stream\"\n        },\n        {\n          \"test\": {},\n          \"use\": \"file-loader\"\n        },\n        {\n          \"test\": {},\n          \"issuer\": {},\n          \"use\": {\n            \"loader\": \"svg-url-loader\",\n            \"options\": {\n              \"encoding\": \"none\",\n              \"limit\": 10000\n            }\n          }\n        },\n        {\n          \"test\": {},\n          \"issuer\": {},\n          \"use\": {\n            \"loader\": \"raw-loader\"\n          }\n        },\n        {\n          \"test\": {},\n          \"type\": \"javascript/auto\"\n        },\n        {\n          \"test\": {},\n          \"resolve\": {\n            \"fullySpecified\": false\n          }\n        },\n        {\n          \"test\": {},\n          \"resolve\": {\n            \"fullySpecified\": false\n          }\n        },\n        {\n          \"test\": {},\n          \"use\": \"file-loader\"\n        }\n      ]\n    },\n    \"resolve\": {\n      \"alias\": {\n        \"@phosphor/algorithm$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/algorithm/dist/index.js\",\n        \"@phosphor/application$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/application/dist/index.js\",\n        \"@phosphor/commands$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/commands/dist/index.js\",\n        \"@phosphor/coreutils$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/coreutils/dist/index.node.js\",\n        \"@phosphor/disposable$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/disposable/dist/index.js\",\n        \"@phosphor/domutils$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/domutils/dist/index.js\",\n        \"@phosphor/dragdrop$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/dragdrop/dist/index.js\",\n        \"@phosphor/dragdrop/style\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/widgets/style\",\n        \"@phosphor/messaging$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/messaging/dist/index.js\",\n        \"@phosphor/properties$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/properties/dist/index.js\",\n        \"@phosphor/signaling\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/signaling/dist/index.js\",\n        \"@phosphor/widgets/style\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/widgets/style\",\n        \"@phosphor/virtualdom$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/virtualdom/dist/index.js\",\n        \"@phosphor/widgets$\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/@lumino/widgets/dist/index.js\"\n      },\n      \"fallback\": {\n        \"url\": false,\n        \"buffer\": false,\n        \"crypto\": false,\n        \"path\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/path-browserify/index.js\",\n        \"process\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/node_modules/process/browser.js\"\n      }\n    },\n    \"watchOptions\": {\n      \"poll\": 500,\n      \"aggregateTimeout\": 1000\n    },\n    \"output\": {\n      \"hashFunction\": \"sha256\",\n      \"filename\": \"[name].[contenthash].js\",\n      \"path\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/jupyterlab-code-snippets/labextension/static\",\n      \"publicPath\": \"auto\"\n    },\n    \"plugins\": [\n      {\n        \"definitions\": {\n          \"process\": \"process/browser\"\n        }\n      },\n      {\n        \"_options\": {\n          \"name\": \"jupyterlab-code-snippets\",\n          \"library\": {\n            \"type\": \"var\",\n            \"name\": [\n              \"_JUPYTERLAB\",\n              \"jupyterlab-code-snippets\"\n            ]\n          },\n          \"filename\": \"remoteEntry.[contenthash].js\",\n          \"exposes\": {\n            \"./index\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/lib/index.js\",\n            \"./extension\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/lib/index.js\",\n            \"./style\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/style/index.js\"\n          },\n          \"shared\": {\n            \"@jupyterlab/application\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/application-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/apputils-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/cell-toolbar-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/celltags-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/codemirror-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/completer-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/console-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/coreutils\": {\n              \"requiredVersion\": \"^5.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/csvviewer-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/debugger-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/docmanager-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/docprovider-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/documentsearch-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/extensionmanager-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/filebrowser-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/fileeditor-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/help-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/htmlviewer-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/hub-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/imageviewer-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/inspector-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/javascript-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/json-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/launcher-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/logconsole-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/mainmenu-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/markdownviewer-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/mathjax2-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/notebook-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/pdf-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/rendermime-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/running-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/settingeditor-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/shortcuts-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/statusbar-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/terminal-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/theme-dark-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/theme-light-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/toc-extension\": {\n              \"requiredVersion\": \"^5.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/tooltip-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/translation-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/ui-components-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/vdom-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/vega5-extension\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/apputils\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/attachments\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/cell-toolbar\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/cells\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/celltags\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/codeeditor\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/codemirror\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/completer\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/console\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/csvviewer\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/debugger\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/docmanager\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/docprovider\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/docregistry\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/documentsearch\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/extensionmanager\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/filebrowser\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/fileeditor\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/htmlviewer\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/imageviewer\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/inspector\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/launcher\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/logconsole\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/mainmenu\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/markdownviewer\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/mathjax2\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/metapackage\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/nbconvert-css\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/nbformat\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/notebook\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/observables\": {\n              \"requiredVersion\": \"^4.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/outputarea\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/property-inspector\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/rendermime\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/rendermime-interfaces\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/running\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@jupyterlab/services\": {\n              \"requiredVersion\": \"^6.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/settingeditor\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/settingregistry\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/shared-models\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/statedb\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/statusbar\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/terminal\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/toc\": {\n              \"requiredVersion\": \"^5.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/tooltip\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/translation\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/ui-components\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@jupyterlab/vdom\": {\n              \"requiredVersion\": \"^3.5.3\",\n              \"import\": false\n            },\n            \"@lumino/algorithm\": {\n              \"requiredVersion\": \"^1.9.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/application\": {\n              \"requiredVersion\": \"^1.27.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/commands\": {\n              \"requiredVersion\": \"^1.19.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/coreutils\": {\n              \"requiredVersion\": \"^1.11.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/disposable\": {\n              \"requiredVersion\": \"^1.10.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/domutils\": {\n              \"requiredVersion\": \"^1.8.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/dragdrop\": {\n              \"requiredVersion\": \"^1.13.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/messaging\": {\n              \"requiredVersion\": \"^1.10.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/properties\": {\n              \"requiredVersion\": \"^1.8.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/signaling\": {\n              \"requiredVersion\": \"^1.10.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/virtualdom\": {\n              \"requiredVersion\": \"^1.14.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@lumino/widgets\": {\n              \"requiredVersion\": \"^1.33.0\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"react\": {\n              \"requiredVersion\": \"^17.0.1\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"react-dom\": {\n              \"requiredVersion\": \"^17.0.1\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"yjs\": {\n              \"requiredVersion\": \"^13.5.17\",\n              \"import\": false,\n              \"singleton\": true\n            },\n            \"@types/react\": {},\n            \"@types/react-dom\": {},\n            \"jupyterlab-code-snippets\": {\n              \"version\": \"2.2.0\",\n              \"singleton\": true,\n              \"import\": \"/home/jaewookahn/Project/jupyterlab-code-snippets/lib/index.js\"\n            }\n          }\n        }\n      },\n      {}\n    ],\n    \"mode\": \"development\",\n    \"devtool\": \"source-map\",\n    \"entry\": {}\n  }\n]"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/package.json",
    "content": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share code snippets using JupyterLab Code Snippets\",\n  \"keywords\": [\n    \"jupyter\",\n    \"jupyterlab\",\n    \"jupyterlab-extension\"\n  ],\n  \"homepage\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git/issues\"\n  },\n  \"license\": \"BSD-3-Clause\",\n  \"author\": {\n    \"name\": \"Jay Ahn, Kiran Pinnipati\",\n    \"email\": \"aju960219@gmail.com\"\n  },\n  \"files\": [\n    \"lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}\",\n    \"style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}\",\n    \"schema/*.json\",\n    \"style/index.js\"\n  ],\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"style\": \"style/index.css\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\"\n  },\n  \"scripts\": {\n    \"build\": \"jlpm run build:lib && jlpm run build:labextension:dev\",\n    \"build:labextension\": \"jupyter labextension build .\",\n    \"build:labextension:dev\": \"jupyter labextension build --development True .\",\n    \"build:lib\": \"tsc\",\n    \"build:prod\": \"jlpm run clean && jlpm run build:lib && jlpm run build:labextension\",\n    \"clean\": \"jlpm run clean:lib\",\n    \"clean:labextension\": \"rimraf jupyterlab-code-snippets/labextension\",\n    \"clean:lib\": \"rimraf lib tsconfig.tsbuildinfo\",\n    \"clean:all\": \"jlpm clean:lib && jlpm clean:labextension\",\n    \"eslint\": \"eslint . --ext .ts,.tsx --fix\",\n    \"eslint:check\": \"eslint . --ext .ts,.tsx\",\n    \"format\": \"prettier \\\"src/**/*.{ts, tsx}\\\" --check\",\n    \"install:extension\": \"jlpm build\",\n    \"prepare\": \"jlpm run clean && jlpm run build:prod\",\n    \"watch\": \"run-p watch:src watch:labextension\",\n    \"watch:labextension\": \"jupyter labextension watch .\",\n    \"watch:src\": \"tsc -w\",\n    \"test\": \"jest --watch\",\n    \"test:cov\": \"jest --collect-coverage\",\n    \"cypress\": \"cypress open\",\n    \"postintall\": \"husky install\",\n    \"prepublishOnly\": \"pinst --disable\",\n    \"postpublish\": \"pinst --enable\"\n  },\n  \"dependencies\": {\n    \"@jupyterlab/application\": \"^3.5.2\",\n    \"@jupyterlab/apputils\": \"^3.5.2\",\n    \"@jupyterlab/cells\": \"^3.5.0\",\n    \"@jupyterlab/celltags\": \"^3.5.2\",\n    \"@jupyterlab/coreutils\": \"5.5.2\",\n    \"@jupyterlab/docmanager\": \"^3.5.2\",\n    \"@jupyterlab/docregistry\": \"^3.5.0\",\n    \"@jupyterlab/fileeditor\": \"^3.5.2\",\n    \"@jupyterlab/nbconvert-css\": \"^3.5.2\",\n    \"@jupyterlab/nbformat\": \"^3.5.2\",\n    \"@jupyterlab/notebook\": \"^3.5.2\",\n    \"@jupyterlab/rendermime\": \"^3.5.2\",\n    \"@jupyterlab/services\": \"^6.5.2\",\n    \"@lumino/algorithm\": \"^1.3.3\",\n    \"@lumino/coreutils\": \"^1.5.3\",\n    \"@lumino/dragdrop\": \"^1.7.1\",\n    \"@lumino/messaging\": \"^1.4.3\",\n    \"@lumino/properties\": \"^1.2.3\",\n    \"@lumino/signaling\": \"^1.4.3\",\n    \"@lumino/widgets\": \"^1.36.0\",\n    \"@types/react\": \"^16.9.56\",\n    \"@types/react-dom\": \"^16.9.9\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7\",\n    \"@babel/preset-env\": \"^7.12.1\",\n    \"@babel/preset-react\": \"^7.12.5\",\n    \"@jupyterlab/builder\": \"^3.5.2\",\n    \"@jupyterlab/testutils\": \"^3.5.2\",\n    \"@testing-library/react\": \"^11.1.1\",\n    \"@types/enzyme\": \"^3.10.8\",\n    \"@types/enzyme-adapter-react-16\": \"^1.0.6\",\n    \"@types/jest\": \"^26.0.15\",\n    \"@types/node-fetch\": \"^2.5.7\",\n    \"@types/react-test-renderer\": \"^16.9.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^4.8.1\",\n    \"@typescript-eslint/parser\": \"^4.8.1\",\n    \"babel-jest\": \"^26.6.3\",\n    \"cypress\": \"^6.5.0\",\n    \"enzyme\": \"^3.11.0\",\n    \"enzyme-adapter-react-16\": \"^1.15.5\",\n    \"eslint\": \"^7.14.0\",\n    \"eslint-config-prettier\": \"^6.15.0\",\n    \"eslint-plugin-prettier\": \"^3.1.4\",\n    \"eslint-plugin-react\": \"^7.20.4\",\n    \"got\": \"^11.8.5\",\n    \"husky\": \"^5.1.3\",\n    \"jest\": \"^26.6.3\",\n    \"jest-fetch-mock\": \"^3.0.3\",\n    \"lint-staged\": \"^10.5.4\",\n    \"marked\": \"^4.0.17\",\n    \"mkdirp\": \"^1.0.3\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"pinst\": \"^2.1.6\",\n    \"prettier\": \"^2.2.1\",\n    \"react-test-renderer\": \"^17.0.1\",\n    \"rimraf\": \"^3.0.2\",\n    \"ts-jest\": \"^26.4.4\",\n    \"typescript\": \"~4.1.3\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"^16.9.56\"\n  },\n  \"sideEffects\": [\n    \"style/*.css\",\n    \"style/index.js\"\n  ],\n  \"jupyterlab\": {\n    \"extension\": true,\n    \"schemaDir\": \"schema\",\n    \"outputDir\": \"jupyterlab-code-snippets/labextension\",\n    \"_build\": {\n      \"load\": \"static/remoteEntry.0a192b189a42c6f0af60.js\",\n      \"extension\": \"./extension\",\n      \"style\": \"./style\"\n    }\n  },\n  \"lint-staged\": {\n    \"src/*.{js,jsx,ts,tsx}\": [\n      \"eslint --cache --fix\"\n    ],\n    \"src/*.js\": \"eslint --cache --fix\"\n  },\n  \"styleModule\": \"style/index.js\"\n}\n"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/schemas/jupyterlab-code-snippets/package.json.orig",
    "content": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share code snippets using JupyterLab Code Snippets\",\n  \"keywords\": [\n    \"jupyter\",\n    \"jupyterlab\",\n    \"jupyterlab-extension\"\n  ],\n  \"homepage\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git/issues\"\n  },\n  \"license\": \"BSD-3-Clause\",\n  \"author\": {\n    \"name\": \"Jay Ahn, Kiran Pinnipati\",\n    \"email\": \"aju960219@gmail.com\"\n  },\n  \"files\": [\n    \"lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}\",\n    \"style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}\",\n    \"schema/*.json\",\n    \"style/index.js\"\n  ],\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"style\": \"style/index.css\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\"\n  },\n  \"scripts\": {\n    \"build\": \"jlpm run build:lib && jlpm run build:labextension:dev\",\n    \"build:labextension\": \"jupyter labextension build .\",\n    \"build:labextension:dev\": \"jupyter labextension build --development True .\",\n    \"build:lib\": \"tsc\",\n    \"build:prod\": \"jlpm run clean && jlpm run build:lib && jlpm run build:labextension\",\n    \"clean\": \"jlpm run clean:lib\",\n    \"clean:labextension\": \"rimraf jupyterlab-code-snippets/labextension\",\n    \"clean:lib\": \"rimraf lib tsconfig.tsbuildinfo\",\n    \"clean:all\": \"jlpm clean:lib && jlpm clean:labextension\",\n    \"eslint\": \"eslint . --ext .ts,.tsx --fix\",\n    \"eslint:check\": \"eslint . --ext .ts,.tsx\",\n    \"format\": \"prettier \\\"src/**/*.{ts, tsx}\\\" --check\",\n    \"install:extension\": \"jlpm build\",\n    \"prepare\": \"jlpm run clean && jlpm run build:prod\",\n    \"watch\": \"run-p watch:src watch:labextension\",\n    \"watch:labextension\": \"jupyter labextension watch .\",\n    \"watch:src\": \"tsc -w\",\n    \"test\": \"jest --watch\",\n    \"test:cov\": \"jest --collect-coverage\",\n    \"cypress\": \"cypress open\",\n    \"postintall\": \"husky install\",\n    \"prepublishOnly\": \"pinst --disable\",\n    \"postpublish\": \"pinst --enable\"\n  },\n  \"dependencies\": {\n    \"@jupyterlab/application\": \"^3.5.2\",\n    \"@jupyterlab/apputils\": \"^3.5.2\",\n    \"@jupyterlab/cells\": \"^3.5.0\",\n    \"@jupyterlab/celltags\": \"^3.5.2\",\n    \"@jupyterlab/coreutils\": \"5.5.2\",\n    \"@jupyterlab/docmanager\": \"^3.5.2\",\n    \"@jupyterlab/docregistry\": \"^3.5.0\",\n    \"@jupyterlab/fileeditor\": \"^3.5.2\",\n    \"@jupyterlab/nbconvert-css\": \"^3.5.2\",\n    \"@jupyterlab/nbformat\": \"^3.5.2\",\n    \"@jupyterlab/notebook\": \"^3.5.2\",\n    \"@jupyterlab/rendermime\": \"^3.5.2\",\n    \"@jupyterlab/services\": \"^6.5.2\",\n    \"@lumino/algorithm\": \"^1.3.3\",\n    \"@lumino/coreutils\": \"^1.5.3\",\n    \"@lumino/dragdrop\": \"^1.7.1\",\n    \"@lumino/messaging\": \"^1.4.3\",\n    \"@lumino/properties\": \"^1.2.3\",\n    \"@lumino/signaling\": \"^1.4.3\",\n    \"@lumino/widgets\": \"^1.36.0\",\n    \"@types/react\": \"^16.9.56\",\n    \"@types/react-dom\": \"^16.9.9\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7\",\n    \"@babel/preset-env\": \"^7.12.1\",\n    \"@babel/preset-react\": \"^7.12.5\",\n    \"@jupyterlab/builder\": \"^3.5.2\",\n    \"@jupyterlab/testutils\": \"^3.5.2\",\n    \"@testing-library/react\": \"^11.1.1\",\n    \"@types/enzyme\": \"^3.10.8\",\n    \"@types/enzyme-adapter-react-16\": \"^1.0.6\",\n    \"@types/jest\": \"^26.0.15\",\n    \"@types/node-fetch\": \"^2.5.7\",\n    \"@types/react-test-renderer\": \"^16.9.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^4.8.1\",\n    \"@typescript-eslint/parser\": \"^4.8.1\",\n    \"babel-jest\": \"^26.6.3\",\n    \"cypress\": \"^6.5.0\",\n    \"enzyme\": \"^3.11.0\",\n    \"enzyme-adapter-react-16\": \"^1.15.5\",\n    \"eslint\": \"^7.14.0\",\n    \"eslint-config-prettier\": \"^6.15.0\",\n    \"eslint-plugin-prettier\": \"^3.1.4\",\n    \"eslint-plugin-react\": \"^7.20.4\",\n    \"got\": \"^11.8.5\",\n    \"husky\": \"^5.1.3\",\n    \"jest\": \"^26.6.3\",\n    \"jest-fetch-mock\": \"^3.0.3\",\n    \"lint-staged\": \"^10.5.4\",\n    \"marked\": \"^4.0.17\",\n    \"mkdirp\": \"^1.0.3\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"pinst\": \"^2.1.6\",\n    \"prettier\": \"^2.2.1\",\n    \"react-test-renderer\": \"^17.0.1\",\n    \"rimraf\": \"^3.0.2\",\n    \"ts-jest\": \"^26.4.4\",\n    \"typescript\": \"~4.1.3\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"^16.9.56\"\n  },\n  \"sideEffects\": [\n    \"style/*.css\",\n    \"style/index.js\"\n  ],\n  \"jupyterlab\": {\n    \"extension\": true,\n    \"schemaDir\": \"schema\",\n    \"outputDir\": \"jupyterlab-code-snippets/labextension\"\n  },\n  \"lint-staged\": {\n    \"src/*.{js,jsx,ts,tsx}\": [\n      \"eslint --cache --fix\"\n    ],\n    \"src/*.js\": \"eslint --cache --fix\"\n  },\n  \"styleModule\": \"style/index.js\"\n}\n"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/schemas/jupyterlab-code-snippets/snippets.json",
    "content": "{\n    \"jupyter.lab.setting-icon\": \"custom-ui-components:codeSnippetIcon\",\n    \"jupyter.lab.setting-icon-label\": \"Code Snippet\",\n    \"title\": \"Code Snippet Manager\",\n    \"description\": \"Code Snippet Manager Settings\",\n    \"version\": \"1.0.0\",\n    \"jupyter.lab.shortcuts\": [\n        {\n          \"command\": \"codeSnippet:save-as-snippet\",\n          \"keys\": [\"Accel Shift A\"],\n          \"selector\": \".jp-Notebook\"\n        },\n        {\n          \"command\": \"codeSnippet:save-as-snippet\",\n          \"keys\": [\"Accel Shift A\"],\n          \"selector\": \".jp-FileEditor\"\n        }\n    ],\n    \"properties\": {\n        \"snippets\": {\n            \"title\": \"List of code snippets\",\n            \"description\": \"A snippet is defined by a 'id', 'name', and 'language'\",\n            \"items\": { \"$ref\": \"#/definitions/snippet\" },\n            \"type\": \"array\",\n            \"default\": []\n        },\n        \"snippetPreviewFontSize\": {\n            \"title\": \"Font Size of Preview\",\n            \"type\": \"number\",\n            \"default\": 3,\n            \"description\": \"Change the font size of preview to see its content\"\n        }\n    },\n    \"additionalProperties\": false,\n    \"type\": \"object\",\n    \"definitions\": {\n        \"snippet\": {\n            \"properties\": {\n                \"id\": {\n                    \"title\": \"Unique id\", \n                    \"type\": \"number\" \n                },\n                \"name\": { \n                    \"title\": \"Unique name\",\n                    \"type\": \"string\"\n                 },\n                \"description\": {\n                    \"title\": \"Description\", \n                    \"type\": \"string\"\n                },\n                \"language\": { \n                    \"title\": \"Language\", \n                    \"type\": \"string\"\n                },\n                \"code\": {\n                    \"title\": \"Code\",\n                    \"type\": \"string\"\n                },\n                \"tags\": {\n                    \"title\": \"Tags\",\n                    \"items\": { \"$ref\": \"#/definitions/tag\"},\n                    \"type\": \"array\",\n                    \"default\": []\n                }\n            },\n            \"required\": [\"id\", \"name\", \"language\", \"code\"],\n            \"additionalProperties\": false,\n            \"type\": \"object\"\n        },\n        \"tag\": {\n            \"title\": \"Unique Tag Name\",\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/lib_index_js.be5d61b481146873348d.js",
    "content": "\"use strict\";\n(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push([[\"lib_index_js\"],{\n\n/***/ \"./lib/CodeSnippetContentsService.js\":\n/*!*******************************************!*\\\n  !*** ./lib/CodeSnippetContentsService.js ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetContentsService\": () => (/* binding */ CodeSnippetContentsService)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/services */ \"webpack/sharing/consume/default/@jupyterlab/services\");\n/* harmony import */ var _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n/**\n * Singleton contentsService class\n */\nclass CodeSnippetContentsService {\n    constructor() {\n        const drive = new _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__.Drive({ name: 'snippetDrive ' });\n        const contentsManager = new _jupyterlab_services__WEBPACK_IMPORTED_MODULE_0__.ContentsManager({ defaultDrive: drive });\n        this.drive = drive;\n        this.contentsManager = contentsManager;\n    }\n    static getInstance() {\n        if (!this.instance) {\n            this.instance = new CodeSnippetContentsService();\n        }\n        return this.instance;\n    }\n    /**\n     * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path\n     * @param path path to a file/directory\n     * @param options options that specify if it's a file or directory and additial information\n     * Usage: save('snippets', { type: 'directory' }) to create/save a directory\n     *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})\n     */\n    async save(path, options) {\n        try {\n            const changedModel = await this.contentsManager.save(path, options);\n            return changedModel;\n        }\n        catch (error) {\n            return error;\n        }\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetDisplay.js\":\n/*!***********************************!*\\\n  !*** ./lib/CodeSnippetDisplay.js ***!\n  \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetDisplay\": () => (/* binding */ CodeSnippetDisplay)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/coreutils */ \"webpack/sharing/consume/default/@jupyterlab/coreutils\");\n/* harmony import */ var _jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/docregistry */ \"webpack/sharing/consume/default/@jupyterlab/docregistry\");\n/* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _jupyterlab_fileeditor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jupyterlab/fileeditor */ \"webpack/sharing/consume/default/@jupyterlab/fileeditor\");\n/* harmony import */ var _jupyterlab_fileeditor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_fileeditor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jupyterlab/notebook */ \"webpack/sharing/consume/default/@jupyterlab/notebook\");\n/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @jupyterlab/cells */ \"webpack/sharing/consume/default/@jupyterlab/cells\");\n/* harmony import */ var _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @lumino/widgets */ \"webpack/sharing/consume/default/@lumino/widgets\");\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @lumino/algorithm */ \"webpack/sharing/consume/default/@lumino/algorithm\");\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_lumino_algorithm__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _lumino_dragdrop__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @lumino/dragdrop */ \"webpack/sharing/consume/default/@lumino/dragdrop\");\n/* harmony import */ var _lumino_dragdrop__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_lumino_dragdrop__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @lumino/coreutils */ \"webpack/sharing/consume/default/@lumino/coreutils\");\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _CodeSnippetFilterTools__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./CodeSnippetFilterTools */ \"./lib/CodeSnippetFilterTools.js\");\n/* harmony import */ var _CodeSnippetPreview__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./CodeSnippetPreview */ \"./lib/CodeSnippetPreview.js\");\n/* harmony import */ var _CodeSnippetMenu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./CodeSnippetMenu */ \"./lib/CodeSnippetMenu.js\");\n/* harmony import */ var _CodeSnippetContentsService__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./CodeSnippetContentsService */ \"./lib/CodeSnippetContentsService.js\");\n/* harmony import */ var _style_icon_jupyter_moreicon_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../style/icon/jupyter_moreicon.svg */ \"./style/icon/jupyter_moreicon.svg\");\n/* harmony import */ var _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./CodeSnippetLanguages */ \"./lib/CodeSnippetLanguages.js\");\n/* harmony import */ var _CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CodeSnippetMessage */ \"./lib/CodeSnippetMessage.js\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n// Some lines of code are from Elyra Code Snippet.\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The CSS class added to code snippet widget.\n */\nconst CODE_SNIPPETS_HEADER_CLASS = 'jp-codeSnippetsHeader';\nconst CODE_SNIPPET_TITLE = 'jp-codeSnippet-title';\nconst CODE_SNIPPETS_CONTAINER = 'jp-codeSnippetsContainer';\nconst DISPLAY_NAME_CLASS = 'jp-codeSnippetsContainer-name';\nconst BUTTON_CLASS = 'jp-codeSnippetsContainer-button';\nconst TITLE_CLASS = 'jp-codeSnippetsContainer-title';\nconst ACTION_BUTTONS_WRAPPER_CLASS = 'jp-codeSnippetsContainer-action-buttons';\nconst ACTION_BUTTON_CLASS = 'jp-codeSnippetsContainer-actionButton';\nconst SEARCH_BOLD = 'jp-codeSnippet-search-bolding';\nconst SNIPPET_DRAG_IMAGE = 'jp-codeSnippet-drag-image';\nconst CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';\nconst CODE_SNIPPET_DRAG_HOVER_SELECTED = 'jp-codeSnippet-drag-hover-selected';\nconst CODE_SNIPPET_METADATA = 'jp-codeSnippet-metadata';\nconst CODE_SNIPPET_DESC = 'jp-codeSnippet-description';\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_MORE_OPTIONS = 'jp-codeSnippet-options';\nconst CODE_SNIPPET_MORE_OTPIONS_CONTENT = 'jp-codeSnippet-more-options-content';\nconst CODE_SNIPPET_MORE_OTPIONS_COPY = 'jp-codeSnippet-more-options-copy';\nconst CODE_SNIPPET_MORE_OTPIONS_INSERT = 'jp-codeSnippet-more-options-insert';\nconst CODE_SNIPPET_MORE_OTPIONS_EDIT = 'jp-codeSnippet-more-options-edit';\nconst CODE_SNIPPET_MORE_OTPIONS_DELETE = 'jp-codeSnippet-more-options-delete';\nconst CODE_SNIPPET_MORE_OTPIONS_EXPORT = 'jp-codeSnippet-more-options-export';\nconst CODE_SNIPPET_CREATE_NEW_BTN = 'jp-createSnippetBtn';\nconst CODE_SNIPPET_NAME = 'jp-codeSnippet-name';\nconst OPTIONS_BODY = 'jp-codeSnippet-options-body';\n/**\n * The threshold in pixels to start a drag event.\n */\nconst DRAG_THRESHOLD = 3;\n/**\n * A class used to indicate a snippet item.\n */\nconst CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';\n/**\n * The mimetype used for Jupyter cell data.\n */\nconst JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';\n/**\n * Icon for more options\n */\nconst moreOptionsIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.LabIcon({\n    name: 'custom-ui-components:moreOptions',\n    svgstr: _style_icon_jupyter_moreicon_svg__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n});\n/**\n * A React Component for code-snippets display list.\n */\nclass CodeSnippetDisplay extends (react__WEBPACK_IMPORTED_MODULE_11___default().Component) {\n    constructor(props) {\n        super(props);\n        this.filterSnippets = (codeSnippets, searchValue, filterTags, selectedLangTags) => {\n            // filter with search\n            let filteredSnippets = codeSnippets.slice();\n            const matchedIndices = {};\n            if (searchValue !== '') {\n                const matchResults = [];\n                const filteredSnippetsScore = [];\n                // language, title, code\n                filteredSnippets.forEach((snippet) => {\n                    const matchResult = _lumino_algorithm__WEBPACK_IMPORTED_MODULE_8__.StringExt.matchSumOfSquares((snippet.language + snippet.name + snippet.code).toLowerCase(), searchValue.replace(' ', '').toLowerCase());\n                    if (matchResult) {\n                        matchResults.push(matchResult);\n                        filteredSnippetsScore.push({\n                            score: matchResult.score,\n                            snippet: snippet,\n                        });\n                    }\n                });\n                // sort snippets by its score\n                filteredSnippetsScore.sort((a, b) => a.score - b.score);\n                const newFilteredSnippets = [];\n                filteredSnippetsScore.forEach((snippetScore) => newFilteredSnippets.push(snippetScore.snippet));\n                filteredSnippets = newFilteredSnippets;\n                // sort the matchResults by its score\n                matchResults.sort((a, b) => a.score - b.score);\n                matchResults.forEach((res, id) => {\n                    matchedIndices[filteredSnippets[id].id] = res.indices;\n                });\n            }\n            // filter with tags\n            if (filterTags.length !== 0) {\n                filteredSnippets = filteredSnippets.filter((codeSnippet) => {\n                    return filterTags.some((filterTag) => {\n                        if (codeSnippet.tags) {\n                            if (selectedLangTags.length !== 0) {\n                                // lang tags selected\n                                if (codeSnippet.tags.includes(filterTag) &&\n                                    selectedLangTags.includes(codeSnippet.language)) {\n                                    return true;\n                                }\n                                //if only language tags are selected\n                                else if (filterTags.length === selectedLangTags.length &&\n                                    filterTags.every((value) => selectedLangTags.includes(value))) {\n                                    if (selectedLangTags.includes(codeSnippet.language)) {\n                                        return true;\n                                    }\n                                }\n                            }\n                            else {\n                                // no lang tags selected\n                                if (codeSnippet.tags.includes(filterTag)) {\n                                    return true;\n                                }\n                            }\n                        }\n                        return false;\n                    });\n                });\n            }\n            // find id's that are not in filteredSnippets\n            const willBeRemovedIds = [];\n            for (const key in matchedIndices) {\n                let hasKey = false;\n                for (const codeSnippet of filteredSnippets) {\n                    if (codeSnippet.id === parseInt(key)) {\n                        hasKey = true;\n                    }\n                }\n                if (hasKey === false) {\n                    willBeRemovedIds.push(parseInt(key));\n                }\n            }\n            // if the snippet does not have the tag, remove its mathed index\n            willBeRemovedIds.forEach((id) => delete matchedIndices[id]);\n            return {\n                filteredCodeSnippets: filteredSnippets,\n                matchedIndices: matchedIndices,\n            };\n        };\n        // Handle code snippet insert into a notebook or document\n        this.insertCodeSnippet = async (snippet) => {\n            var _a, _b;\n            const widget = this.props.getCurrentWidget();\n            if (widget instanceof _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_2__.DocumentWidget &&\n                widget.content instanceof _jupyterlab_fileeditor__WEBPACK_IMPORTED_MODULE_3__.FileEditor) {\n                const documentWidget = widget;\n                // code editor\n                const fileEditor = documentWidget.content.editor;\n                const markdownRegex = /^\\.(md|mkdn?|mdown|markdown)$/;\n                if (_jupyterlab_coreutils__WEBPACK_IMPORTED_MODULE_1__.PathExt.extname(documentWidget.context.path).match(markdownRegex) !==\n                    null) {\n                    // Wrap snippet into a code block when inserting it into a markdown file\n                    fileEditor.replaceSelection('```' + snippet.language + '\\n' + snippet.code + '\\n```');\n                }\n                else if (documentWidget.constructor.name === 'PythonFileEditor') {\n                    this.verifyLanguageAndInsert(snippet, 'python', fileEditor);\n                }\n                else {\n                    fileEditor.replaceSelection(snippet.code);\n                }\n            }\n            else if (widget instanceof _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_4__.NotebookPanel) {\n                const notebookWidget = widget;\n                const notebookCell = notebookWidget.content.activeCell;\n                // editor\n                const notebookCellEditor = notebookCell.editor;\n                if (notebookCell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6__.CodeCell) {\n                    const kernelInfo = await ((_b = (_a = notebookWidget.sessionContext.session) === null || _a === void 0 ? void 0 : _a.kernel) === null || _b === void 0 ? void 0 : _b.info);\n                    const kernelLanguage = (kernelInfo === null || kernelInfo === void 0 ? void 0 : kernelInfo.language_info.name) || '';\n                    this.verifyLanguageAndInsert(snippet, kernelLanguage, notebookCellEditor);\n                }\n                else if (notebookCell instanceof _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6__.MarkdownCell) {\n                    // Wrap snippet into a code block when inserting it into a markdown cell\n                    notebookCellEditor.replaceSelection('```' + snippet.language + '\\n' + snippet.code + '\\n```');\n                }\n                else {\n                    notebookCellEditor.replaceSelection(snippet.code);\n                }\n            }\n            else {\n                this.showErrDialog('Code snippet insert failed: Unsupported widget');\n            }\n        };\n        // Handle language compatibility between code snippet and editor\n        this.verifyLanguageAndInsert = async (snippet, editorLanguage, editor) => {\n            if (editorLanguage &&\n                snippet.language.toLowerCase() !== editorLanguage.toLowerCase()) {\n                const result = await this.showWarnDialog(editorLanguage, snippet.name);\n                if (result.button.accept) {\n                    editor.replaceSelection(snippet.code);\n                }\n            }\n            else {\n                // Language match or editorLanguage is unavailable\n                editor.replaceSelection(snippet.code);\n            }\n        };\n        // Display warning dialog when inserting a code snippet incompatible with editor's language\n        this.showWarnDialog = async (editorLanguage, snippetName) => {\n            return (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.showDialog)({\n                title: 'Warning',\n                body: 'Code snippet \"' +\n                    snippetName +\n                    '\" is incompatible with ' +\n                    editorLanguage +\n                    '. Continue?',\n                buttons: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.cancelButton(), _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.okButton()],\n            });\n        };\n        // Display error dialog when inserting a code snippet into unsupported widget (i.e. not an editor)\n        this.showErrDialog = (errMsg) => {\n            return (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.showDialog)({\n                title: 'Error',\n                body: errMsg,\n                buttons: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.okButton()],\n            });\n        };\n        // Create 6 dots drag/drop image on hover\n        this.dragHoverStyle = (id) => {\n            document\n                .querySelector(`#${CODE_SNIPPET_DRAG_HOVER}${id}`)\n                .classList // .getElementsByClassName(CODE_SNIPPET_DRAG_HOVER)\n                // [id].classList.\n                .add(CODE_SNIPPET_DRAG_HOVER_SELECTED);\n        };\n        // Remove 6 dots off hover\n        this.dragHoverStyleRemove = (id) => {\n            if (document.getElementsByClassName(CODE_SNIPPET_DRAG_HOVER_SELECTED)) {\n                document\n                    .querySelector(`#${CODE_SNIPPET_DRAG_HOVER}${id}`)\n                    .classList.remove(CODE_SNIPPET_DRAG_HOVER_SELECTED);\n            }\n        };\n        // Bold text in snippet name based on search\n        this.boldNameOnSearch = (id, language, name, matchedIndices) => {\n            const displayName = language + name;\n            // check if the searchValue is not ''\n            if (this.state.searchValue !== '') {\n                const elements = [];\n                if (matchedIndices) {\n                    // get first match index in the name\n                    let i = 0;\n                    while (i < matchedIndices.length) {\n                        if (matchedIndices[i] >= language.length) {\n                            elements.push(displayName.substring(language.length, matchedIndices[i]));\n                            break;\n                        }\n                        i++;\n                    }\n                    // when there is no match in name but language\n                    if (i >= matchedIndices.length) {\n                        return react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"span\", null, name);\n                    }\n                    else {\n                        // current and next indices are bold indices\n                        let currIndex = matchedIndices[i];\n                        let nextIndex;\n                        // check if the match is the end of the name\n                        if (i < matchedIndices.length - 1) {\n                            i++;\n                            nextIndex = matchedIndices[i];\n                        }\n                        else {\n                            nextIndex = null;\n                        }\n                        while (nextIndex !== null) {\n                            // make the current index bold\n                            elements.push(react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"mark\", { key: id + '_' + currIndex, className: SEARCH_BOLD }, displayName.substring(currIndex, currIndex + 1)));\n                            // add the regular string until we reach the next bold index\n                            elements.push(displayName.substring(currIndex + 1, nextIndex));\n                            currIndex = nextIndex;\n                            if (i < matchedIndices.length - 1) {\n                                i++;\n                                nextIndex = matchedIndices[i];\n                            }\n                            else {\n                                nextIndex = null;\n                            }\n                        }\n                        if (nextIndex === null) {\n                            elements.push(react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"mark\", { key: id + '_' + currIndex, className: SEARCH_BOLD }, displayName.substring(currIndex, currIndex + 1)));\n                            elements.push(displayName.substring(currIndex + 1, displayName.length));\n                        }\n                        return react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"span\", null, elements);\n                    }\n                }\n            }\n            return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"span\", { title: 'Double click to rename', className: CODE_SNIPPET_NAME, onDoubleClick: this.handleRenameSnippet }, name));\n        };\n        // Render display of code snippet list\n        this.renderCodeSnippet = (codeSnippet, matchedIndices) => {\n            const id = codeSnippet.id;\n            const buttonClasses = BUTTON_CLASS;\n            const displayName = '[' + codeSnippet.language + '] ' + codeSnippet.name;\n            const name = codeSnippet.name;\n            const language = codeSnippet.language;\n            const actionButtons = [\n                {\n                    title: 'Insert, copy, edit, and delete',\n                    icon: moreOptionsIcon,\n                    onClick: (event) => {\n                        (0,_CodeSnippetMenu__WEBPACK_IMPORTED_MODULE_13__.showMoreOptions)({\n                            body: new OptionsHandler(this, codeSnippet),\n                        });\n                        this._setOptionsPosition(event);\n                    },\n                },\n            ];\n            return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { key: codeSnippet.name, className: CODE_SNIPPET_ITEM, id: `${CODE_SNIPPET_ITEM}${id}`, title: 'Right click for more options', onMouseOver: () => {\n                    this.dragHoverStyle(id);\n                }, onMouseOut: () => {\n                    this.dragHoverStyleRemove(id);\n                }, onContextMenu: (event) => {\n                    event.preventDefault();\n                    (0,_CodeSnippetMenu__WEBPACK_IMPORTED_MODULE_13__.showMoreOptions)({\n                        body: new OptionsHandler(this, codeSnippet),\n                    });\n                    this._setOptionsPosition(event);\n                } },\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { className: CODE_SNIPPET_DRAG_HOVER, title: \"Drag to move\", id: `${CODE_SNIPPET_DRAG_HOVER}${id}`, onMouseDown: (event) => {\n                        this.handleDragSnippet(event);\n                    } }),\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { className: CODE_SNIPPET_METADATA, onMouseEnter: () => {\n                        (0,_CodeSnippetPreview__WEBPACK_IMPORTED_MODULE_14__.showPreview)({\n                            id: id,\n                            title: displayName,\n                            body: new PreviewHandler(),\n                            codeSnippet: codeSnippet,\n                        }, this.props.editorServices);\n                        this._setPreviewPosition(id);\n                    }, onMouseLeave: () => {\n                        this._evtMouseLeave();\n                    } },\n                    react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { key: displayName, className: TITLE_CLASS, id: `${TITLE_CLASS}${id}` },\n                        react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { id: id.toString(), className: DISPLAY_NAME_CLASS },\n                            this.renderLanguageIcon(language),\n                            this.boldNameOnSearch(id, language, name, matchedIndices)),\n                        react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { className: ACTION_BUTTONS_WRAPPER_CLASS, id: id.toString() }, actionButtons.map((btn) => {\n                            return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"button\", { key: btn.title, title: btn.title, className: buttonClasses + ' ' + ACTION_BUTTON_CLASS, onClick: (event) => {\n                                    btn.onClick(event);\n                                } },\n                                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(btn.icon.react, { tag: \"span\", elementPosition: \"center\", width: \"16px\", height: \"16px\" })));\n                        }))),\n                    this.renderDescription(codeSnippet, id))));\n        };\n        this.handleFilter = (searchValue, filterTags, selectedLangTags) => {\n            this.setState({\n                searchValue: searchValue,\n                filterTags: filterTags,\n                selectedLangTags: selectedLangTags,\n            });\n        };\n        this.getActiveTagsDictionary = () => {\n            const tagsAndLangs = new Map();\n            for (const codeSnippet of this.props.codeSnippets) {\n                if (codeSnippet.tags) {\n                    // check if tag is in dict, if it is add lang to value (if not already present)\n                    // if tag not in dict add tag as key and lang as first val\n                    for (const tag of codeSnippet.tags) {\n                        if (tag !== codeSnippet.language) {\n                            if (tagsAndLangs.has(tag)) {\n                                const langs = tagsAndLangs.get(tag);\n                                if (!langs.includes(codeSnippet.language)) {\n                                    langs.push(codeSnippet.language);\n                                }\n                                tagsAndLangs.set(tag, langs);\n                            }\n                            else {\n                                tagsAndLangs.set(tag, [codeSnippet.language]);\n                            }\n                        }\n                    }\n                }\n            }\n            return tagsAndLangs;\n        };\n        this.state = {\n            searchValue: '',\n            filterTags: [],\n            selectedLangTags: [],\n            searchOptions: [],\n        };\n        this._drag = null;\n        this._dragData = null;\n        this.handleDragMove = this.handleDragMove.bind(this);\n        this._evtMouseUp = this._evtMouseUp.bind(this);\n        this.handleRenameSnippet = this.handleRenameSnippet.bind(this);\n        this.setSearchOptions = this.setSearchOptions.bind(this);\n    }\n    // rename snippet on double click\n    async handleRenameSnippet(event) {\n        const target = event.target;\n        const oldName = target.innerHTML;\n        const new_element = document.createElement('input');\n        new_element.setAttribute('type', 'text');\n        new_element.id = 'jp-codeSnippet-rename';\n        new_element.innerHTML = target.innerHTML;\n        target.replaceWith(new_element);\n        new_element.value = target.innerHTML;\n        new_element.focus();\n        new_element.setSelectionRange(0, new_element.value.length);\n        new_element.onblur = async () => {\n            if (target.innerHTML !== new_element.value) {\n                const newName = new_element.value;\n                const isDuplicateName = this.props.codeSnippetManager.duplicateNameExists(newName);\n                if (isDuplicateName) {\n                    await (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.showDialog)({\n                        title: 'Duplicate Name of Code Snippet',\n                        body: react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"p\", null,\n                            \" \",\n                            `\"${newName}\" already exists.`,\n                            \" \"),\n                        buttons: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.okButton({ label: 'Dismiss' })],\n                    });\n                }\n                else {\n                    this.props.codeSnippetManager\n                        .renameSnippet(oldName, newName)\n                        .then(async (res) => {\n                        if (res) {\n                            target.innerHTML = new_element.value;\n                        }\n                        else {\n                            console.log('Error in renaming snippet!');\n                        }\n                    });\n                }\n            }\n            new_element.replaceWith(target);\n        };\n        new_element.onkeydown = (event) => {\n            switch (event.code) {\n                case 'Enter': // Enter\n                    event.stopPropagation();\n                    event.preventDefault();\n                    new_element.blur();\n                    break;\n                case 'NumpadEnter': // Enter\n                    event.stopPropagation();\n                    event.preventDefault();\n                    new_element.blur();\n                    break;\n                case 'Escape': // Escape\n                    event.stopPropagation();\n                    event.preventDefault();\n                    new_element.blur();\n                    break;\n                case 'ArrowUp': // Up arrow\n                    event.stopPropagation();\n                    event.preventDefault();\n                    new_element.selectionStart = new_element.selectionEnd = 0;\n                    break;\n                case 'ArrowDown': // Down arrow\n                    event.stopPropagation();\n                    event.preventDefault();\n                    new_element.selectionStart = new_element.selectionEnd =\n                        new_element.value.length;\n                    break;\n                default:\n                    break;\n            }\n        };\n    }\n    handleDragSnippet(event) {\n        const { button } = event;\n        // if button is not the left click\n        if (!(button === 0)) {\n            return;\n        }\n        const target = event.target;\n        this._dragData = {\n            pressX: event.clientX,\n            pressY: event.clientY,\n            dragImage: target.nextSibling.firstChild.cloneNode(true),\n        };\n        const dragImageTextColor = getComputedStyle(document.body).getPropertyValue('--jp-content-font-color3');\n        this._dragData.dragImage.children[0].style.color =\n            dragImageTextColor;\n        // add CSS style\n        this._dragData.dragImage.classList.add(SNIPPET_DRAG_IMAGE);\n        target.addEventListener('mouseup', this._evtMouseUp, true);\n        target.addEventListener('mousemove', this.handleDragMove, true);\n        // since a browser has its own drag'n'drop support for images and some other elements.\n        target.ondragstart = () => false;\n        event.preventDefault();\n    }\n    _evtMouseUp(event) {\n        event.preventDefault();\n        event.stopPropagation();\n        const target = event.target;\n        target.removeEventListener('mousemove', this.handleDragMove, true);\n        target.removeEventListener('mouseup', this._evtMouseUp, true);\n    }\n    handleDragMove(event) {\n        event.preventDefault();\n        event.stopPropagation();\n        const data = this._dragData;\n        if (data &&\n            this.shouldStartDrag(data.pressX, data.pressY, event.clientX, event.clientY)) {\n            const idx = event.target.id.slice(CODE_SNIPPET_DRAG_HOVER.length);\n            const codeSnippet = this.props.codeSnippets.filter((codeSnippet) => codeSnippet.id === parseInt(idx))[0];\n            void this.startDrag(data.dragImage, codeSnippet, event.clientX, event.clientY);\n        }\n    }\n    /**\n     * Detect if a drag event should be started. This is down if the\n     * mouse is moved beyond a certain distance (DRAG_THRESHOLD).\n     *\n     * @param prevX - X Coordinate of the mouse pointer during the mousedown event\n     * @param prevY - Y Coordinate of the mouse pointer during the mousedown event\n     * @param nextX - Current X Coordinate of the mouse pointer\n     * @param nextY - Current Y Coordinate of the mouse pointer\n     */\n    shouldStartDrag(prevX, prevY, nextX, nextY) {\n        const dx = Math.abs(nextX - prevX);\n        const dy = Math.abs(nextY - prevY);\n        return dx >= 0 || dy >= DRAG_THRESHOLD;\n    }\n    async startDrag(dragImage, codeSnippet, clientX, clientY) {\n        const target = event.target;\n        const model = new _jupyterlab_cells__WEBPACK_IMPORTED_MODULE_6__.CodeCellModel({});\n        model.value.text = codeSnippet.code;\n        model.metadata;\n        const selected = [model.toJSON()];\n        this._drag = new _lumino_dragdrop__WEBPACK_IMPORTED_MODULE_9__.Drag({\n            mimeData: new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_10__.MimeData(),\n            dragImage: dragImage,\n            supportedActions: 'copy-move',\n            proposedAction: 'copy',\n            source: this,\n        });\n        this._drag.mimeData.setData(JUPYTER_CELL_MIME, selected);\n        const textContent = codeSnippet.code;\n        this._drag.mimeData.setData('text/plain', textContent);\n        // Remove mousemove and mouseup listeners and start the drag.\n        target.removeEventListener('mousemove', this.handleDragMove, true);\n        target.removeEventListener('mouseup', this._evtMouseUp, true);\n        return this._drag.start(clientX, clientY).then(() => {\n            this.dragHoverStyleRemove(codeSnippet.id);\n            this._drag = null;\n            this._dragData = null;\n        });\n    }\n    _evtMouseLeave() {\n        const preview = document.querySelector('.jp-codeSnippet-preview');\n        if (preview) {\n            if (!preview.classList.contains('inactive')) {\n                preview.classList.add('inactive');\n            }\n        }\n    }\n    //Set the position of the preview to be next to the snippet title.\n    _setPreviewPosition(id) {\n        const realTarget = document.querySelector(`#${TITLE_CLASS}${id}`);\n        const newTarget = document.querySelector(`#${CODE_SNIPPET_ITEM}${id}`);\n        // (CODE_SNIPPET_ITEM)[id];\n        // distDown is the number of pixels to shift the preview down\n        const distDown = realTarget.getBoundingClientRect().top - 43; //this is bumping it up\n        const elementSnippet = newTarget;\n        const heightSnippet = elementSnippet.clientHeight;\n        const heightPreview = heightSnippet.toString(10) + 'px';\n        document.documentElement.style.setProperty('--preview-max-height', heightPreview);\n        const final = distDown.toString(10) + 'px';\n        document.documentElement.style.setProperty('--preview-distance', final);\n    }\n    //Set the position of the option to be under to the three dots on snippet.\n    _setOptionsPosition(event) {\n        const target = event.target;\n        let top;\n        if (target.tagName === 'path') {\n            top = target.getBoundingClientRect().top + 10;\n        }\n        else {\n            top = target.getBoundingClientRect().top + 18;\n        }\n        if (top > 0.7 * window.screen.height) {\n            top -= 120;\n        }\n        const leftAsString = (target.parentElement.style.left + event.pageX).toString() + 'px';\n        const topAsString = top.toString(10) + 'px';\n        document.documentElement.style.setProperty('--more-options-top', topAsString);\n        document.documentElement.style.setProperty('--more-options-left', leftAsString);\n    }\n    renderLanguageIcon(language) {\n        switch (language) {\n            case 'Python': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.pythonIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Gfm': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.markdownIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Java': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.javaIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'R': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.rKernelIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Julia': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.juliaIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Matlab': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.matlabIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Scheme': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.schemeIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Processing': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.processingIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Scala': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.scalaIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Groovy': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.groovyIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Fortran': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.fortranIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Haskell': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.haskellIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Ruby': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.rubyIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'TypeScript': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.typescriptIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'JavaScript': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.javascriptIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'CoffeeScript': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.coffeescriptIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'LiveScript': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.livescriptIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'C#': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.csharpIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'F#': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.fsharpIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Go': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.goIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Erlang': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.erlangIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'OCaml': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.ocamlIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Forth': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.forthIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Perl': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.perlIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'PHP': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.phpIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Clojure': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.clojureIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Lua': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.luaIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'PureScript': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.purescriptIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'C++': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.cppIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Prolog': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.prologIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Common Lisp': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.lispIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'C': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.cIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Kotlin': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.kotlinIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'NodeJS': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.nodejsIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Coconut': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.coconutIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Babel': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.babelIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'SAS': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.sasIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'sbt': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.sbtIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Rust': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.rustIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Q#': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.qsharpIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Markdown': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.markdownIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            case 'Powershell': {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_15__.powershellIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n            default: {\n                return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.fileIcon.react, { tag: \"span\", height: \"16px\", width: \"16px\", right: \"7px\", top: \"5px\", \"margin-right\": \"3px\" }));\n            }\n        }\n    }\n    renderDescription(codeSnippet, id) {\n        if (codeSnippet.description && codeSnippet.description.length !== 0) {\n            return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { className: CODE_SNIPPET_DESC, id: id.toString() },\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"p\", { id: id.toString() }, `${codeSnippet.description}`)));\n        }\n        else {\n            return null;\n        }\n    }\n    getActiveTags() {\n        let tags = [];\n        const languages = [];\n        for (const codeSnippet of this.props.codeSnippets) {\n            if (codeSnippet.tags) {\n                tags = tags.concat(codeSnippet.tags.filter((tag) => !tags.includes(tag)));\n            }\n            if (!languages.includes(codeSnippet.language)) {\n                languages.push(codeSnippet.language);\n            }\n        }\n        return [tags, languages];\n    }\n    deleteCommand(codeSnippet) {\n        (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.showDialog)({\n            title: 'Delete snippet?',\n            body: 'Are you sure you want to delete \"' + codeSnippet.name + '\"? ',\n            buttons: [\n                _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.cancelButton(),\n                _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.warnButton({\n                    label: 'Delete',\n                }),\n            ],\n        }).then((response) => {\n            if (response.button.accept) {\n                const widgetId = `${CODE_SNIPPET_EDITOR}-${codeSnippet.id}`;\n                const editor = (0,_lumino_algorithm__WEBPACK_IMPORTED_MODULE_8__.find)(this.props.app.shell.widgets('main'), (widget, _) => {\n                    return widget.id === widgetId;\n                });\n                if (editor) {\n                    editor.dispose();\n                }\n                // deleting snippets when there is one snippet active\n                this.props.codeSnippetManager\n                    .deleteSnippet(codeSnippet.id)\n                    .then((result) => {\n                    if (result) {\n                        this.props.updateCodeSnippetWidget();\n                    }\n                    else {\n                        console.log('Error in deleting the snippet');\n                        return;\n                    }\n                });\n            }\n        });\n    }\n    exportCommand(codeSnippet) {\n        // Request a text\n        _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.InputDialog.getText({\n            title: 'Export Snippet?',\n            label: 'Directory to Export: ',\n            placeholder: 'share/snippet',\n            okLabel: 'Export',\n        }).then((value) => {\n            if (value.button.accept) {\n                const dirs = value.value.split('/');\n                const codeSnippetContentsManager = _CodeSnippetContentsService__WEBPACK_IMPORTED_MODULE_16__.CodeSnippetContentsService.getInstance();\n                let path = '';\n                for (let i = 0; i < dirs.length; i++) {\n                    path += dirs[i] + '/';\n                    codeSnippetContentsManager\n                        .save(path, { type: 'directory' })\n                        .catch((_) => {\n                        alert('Path should be a relative path');\n                    });\n                }\n                path += codeSnippet.name + '.json';\n                codeSnippetContentsManager.save(path, {\n                    type: 'file',\n                    format: 'text',\n                    content: JSON.stringify(codeSnippet),\n                });\n                (0,_CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_17__.showMessage)('export');\n            }\n        });\n    }\n    // remove dropdown menu\n    removeOptionsNode() {\n        const temp = document.getElementsByClassName(CODE_SNIPPET_MORE_OPTIONS)[0];\n        if (!temp.classList.contains('inactive')) {\n            temp.classList.add('inactive');\n        }\n    }\n    // create dropdown menu\n    createOptionsNode(codeSnippet) {\n        const body = document.createElement('div');\n        body.className = OPTIONS_BODY;\n        const optionsContainer = document.createElement('div');\n        optionsContainer.className = CODE_SNIPPET_MORE_OTPIONS_CONTENT;\n        const insertSnip = document.createElement('div');\n        insertSnip.className = CODE_SNIPPET_MORE_OTPIONS_INSERT;\n        insertSnip.textContent = 'Insert snippet';\n        insertSnip.onclick = () => {\n            this.insertCodeSnippet(codeSnippet);\n            this.removeOptionsNode();\n        };\n        const copySnip = document.createElement('div');\n        copySnip.className = CODE_SNIPPET_MORE_OTPIONS_COPY;\n        copySnip.textContent = 'Copy snippet to clipboard';\n        copySnip.onclick = () => {\n            _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Clipboard.copyToSystem(codeSnippet.code);\n            (0,_CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_17__.showMessage)('copy');\n            this.removeOptionsNode();\n        };\n        const editSnip = document.createElement('div');\n        editSnip.className = CODE_SNIPPET_MORE_OTPIONS_EDIT;\n        editSnip.textContent = 'Edit snippet';\n        editSnip.onclick = () => {\n            const allSnippetTags = this.getActiveTags()[0]; // snippet tags only\n            const allLangTags = this.getActiveTags()[1];\n            this.props.openCodeSnippetEditor({\n                name: codeSnippet.name,\n                description: codeSnippet.description,\n                language: codeSnippet.language,\n                code: codeSnippet.code,\n                id: codeSnippet.id,\n                tags: codeSnippet.tags,\n                allSnippetTags: allSnippetTags,\n                allLangTags: allLangTags,\n                fromScratch: false,\n            });\n            this.removeOptionsNode();\n        };\n        const deleteSnip = document.createElement('div');\n        deleteSnip.className = CODE_SNIPPET_MORE_OTPIONS_DELETE;\n        deleteSnip.textContent = 'Delete snippet';\n        deleteSnip.onclick = () => {\n            this.deleteCommand(codeSnippet);\n            this.removeOptionsNode();\n        };\n        const exportSnip = document.createElement('div');\n        exportSnip.className = CODE_SNIPPET_MORE_OTPIONS_EXPORT;\n        exportSnip.textContent = 'Export snippet';\n        exportSnip.onclick = () => {\n            this.exportCommand(codeSnippet);\n            this.removeOptionsNode();\n        };\n        optionsContainer.appendChild(insertSnip);\n        optionsContainer.appendChild(copySnip);\n        optionsContainer.appendChild(editSnip);\n        optionsContainer.appendChild(exportSnip);\n        optionsContainer.appendChild(deleteSnip);\n        body.append(optionsContainer);\n        return body;\n    }\n    setSearchOptions(selectedOptions) {\n        this.setState({\n            searchOptions: selectedOptions,\n        });\n    }\n    render() {\n        const { filteredCodeSnippets, matchedIndices } = this.filterSnippets(this.props.codeSnippets, this.state.searchValue, this.state.filterTags, this.state.selectedLangTags);\n        return (react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", null,\n            react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"header\", { className: CODE_SNIPPETS_HEADER_CLASS },\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"span\", { className: CODE_SNIPPET_TITLE }, 'Snippets'),\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"button\", { className: CODE_SNIPPET_CREATE_NEW_BTN, onClick: () => {\n                        this.props.openCodeSnippetEditor({\n                            name: '',\n                            description: '',\n                            language: 'Python',\n                            code: '',\n                            id: this.props.codeSnippets.length,\n                            tags: [],\n                            allSnippetTags: this.getActiveTags()[0],\n                            allLangTags: this.getActiveTags()[1],\n                            fromScratch: true,\n                        });\n                    } },\n                    react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_5__.addIcon.react, { tag: \"span\", right: \"7px\", top: \"5px\" }))),\n            react__WEBPACK_IMPORTED_MODULE_11___default().createElement(_CodeSnippetFilterTools__WEBPACK_IMPORTED_MODULE_18__.FilterTools, { tagDictionary: this.getActiveTagsDictionary(), languageTags: this.getActiveTags()[1], snippetTags: this.getActiveTags()[0], onFilter: this.handleFilter }),\n            react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", { className: CODE_SNIPPETS_CONTAINER },\n                react__WEBPACK_IMPORTED_MODULE_11___default().createElement(\"div\", null, filteredCodeSnippets.map((codeSnippet) => this.renderCodeSnippet(codeSnippet, matchedIndices[codeSnippet.id]))))));\n    }\n}\nclass OptionsHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_7__.Widget {\n    constructor(display, codeSnippet) {\n        super({ node: display.createOptionsNode(codeSnippet) });\n    }\n}\nclass PreviewHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_7__.Widget {\n    constructor() {\n        super({ node: Private.createPreviewNode() });\n    }\n}\nclass Private {\n    static createPreviewContent() {\n        const body = document.createElement('div');\n        return body;\n    }\n    /**\n     * Create structure for preview of snippet data.\n     */\n    static createPreviewNode() {\n        return this.createPreviewContent();\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetEditor.js\":\n/*!**********************************!*\\\n  !*** ./lib/CodeSnippetEditor.js ***!\n  \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetEditor\": () => (/* binding */ CodeSnippetEditor)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/codeeditor */ \"webpack/sharing/consume/default/@jupyterlab/codeeditor\");\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _CodeSnippetService__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CodeSnippetService */ \"./lib/CodeSnippetService.js\");\n/* harmony import */ var _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CodeSnippetLanguages */ \"./lib/CodeSnippetLanguages.js\");\n/* harmony import */ var _CodeSnippetEditorTags__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CodeSnippetEditorTags */ \"./lib/CodeSnippetEditorTags.js\");\n/* harmony import */ var _CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CodeSnippetMessage */ \"./lib/CodeSnippetMessage.js\");\n/* harmony import */ var _CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CodeSnippetUtilities */ \"./lib/CodeSnippetUtilities.js\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n// Some lines of code are from Elyra Code Snippet.\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\n\n\n\n\n\n\n\n\n/**\n * CSS style classes\n */\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_EDITOR_TITLE = 'jp-codeSnippet-editor-title';\nconst CODE_SNIPPET_EDITOR_METADATA = 'jp-codeSnippet-editor-metadata';\nconst CODE_SNIPPET_EDITOR_INPUT_ACTIVE = 'jp-codeSnippet-editor-active';\nconst CODE_SNIPPET_EDITOR_NAME_INPUT = 'jp-codeSnippet-editor-name';\nconst CODE_SNIPPET_EDITOR_LABEL = 'jp-codeSnippet-editor-label';\nconst CODE_SNIPPET_EDITOR_DESC_INPUT = 'jp-codeSnippet-editor-description';\nconst CODE_SNIPPET_EDITOR_LANG_INPUT = 'jp-codeSnippet-editor-language';\nconst CODE_SNIPPET_EDITOR_MIRROR = 'jp-codeSnippetInput-editor';\nconst CODE_SNIPPET_EDITOR_INPUTAREA = 'jp-codeSnippetInputArea';\nconst CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR = 'jp-codeSnippetInputArea-editor';\nconst EDITOR_DIRTY_CLASS = 'jp-mod-dirty';\nclass CodeSnippetEditor extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ReactWidget {\n    constructor(editorServices, tracker, codeSnippetWidget, args) {\n        super();\n        this.addClass(CODE_SNIPPET_EDITOR);\n        this.contentsService = _CodeSnippetService__WEBPACK_IMPORTED_MODULE_4__.CodeSnippetService.getCodeSnippetService();\n        this.editorServices = editorServices;\n        this.tracker = tracker;\n        this._codeSnippetEditorMetaData = args;\n        this.oldCodeSnippetName = args.name;\n        this.saved = true;\n        this._hasRefreshedSinceAttach = false;\n        this.codeSnippetWidget = codeSnippetWidget;\n        this.renderCodeInput = this.renderCodeInput.bind(this);\n        this.handleInputFieldChange = this.handleInputFieldChange.bind(this);\n        this.activateCodeMirror = this.activateCodeMirror.bind(this);\n        this.saveChange = this.saveChange.bind(this);\n        this.updateSnippet = this.updateSnippet.bind(this);\n        this.handleChangeOnTag = this.handleChangeOnTag.bind(this);\n    }\n    get codeSnippetEditorMetadata() {\n        return this._codeSnippetEditorMetaData;\n    }\n    deactivateEditor(event) {\n        let target = event.target;\n        while (target && target.parentElement) {\n            if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR) ||\n                target.classList.contains(CODE_SNIPPET_EDITOR_NAME_INPUT) ||\n                target.classList.contains(CODE_SNIPPET_EDITOR_DESC_INPUT)) {\n                break;\n            }\n            target = target.parentElement;\n        }\n        const nameInput = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`);\n        const descriptionInput = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`);\n        const editor = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} #code-${this._codeSnippetEditorMetaData.id}`);\n        if (target.classList.contains(CODE_SNIPPET_EDITOR_NAME_INPUT)) {\n            this.deactivateDescriptionField(descriptionInput);\n            this.deactivateCodeMirror(editor);\n        }\n        else if (target.classList.contains(CODE_SNIPPET_EDITOR_DESC_INPUT)) {\n            this.deactivateNameField(nameInput);\n            this.deactivateCodeMirror(editor);\n        }\n        else if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n            this.deactivateNameField(nameInput);\n            this.deactivateDescriptionField(descriptionInput);\n        }\n        else {\n            this.deactivateNameField(nameInput);\n            this.deactivateDescriptionField(descriptionInput);\n            this.deactivateCodeMirror(editor);\n        }\n    }\n    deactivateNameField(nameInput) {\n        if (nameInput.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n            nameInput.classList.remove(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n        }\n    }\n    deactivateDescriptionField(descriptionInput) {\n        if (descriptionInput.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n            descriptionInput.classList.remove(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n        }\n    }\n    activeFieldState(event) {\n        const target = event.target;\n        if (!target.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n            target.classList.add(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n        }\n    }\n    onUpdateRequest(msg) {\n        super.onUpdateRequest(msg);\n        if (!this.editor &&\n            document.getElementById('code-' + this._codeSnippetEditorMetaData.id)) {\n            const editorFactory = this.editorServices.factoryService.newInlineEditor;\n            const getMimeTypeByLanguage = this.editorServices.mimeTypeService.getMimeTypeByLanguage;\n            this.editor = editorFactory({\n                host: document.getElementById('code-' + this._codeSnippetEditorMetaData.id),\n                model: new _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_0__.CodeEditor.Model({\n                    value: this._codeSnippetEditorMetaData.code,\n                    mimeType: getMimeTypeByLanguage({\n                        name: this._codeSnippetEditorMetaData.language,\n                        codemirror_mode: this._codeSnippetEditorMetaData.language,\n                    }),\n                }),\n            });\n            this.editor.model.value.changed.connect((args) => {\n                this._codeSnippetEditorMetaData.code = args.text.split('\\n');\n                if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n                    this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n                }\n                this.saved = false;\n            });\n        }\n        if (this.isVisible) {\n            this._hasRefreshedSinceAttach = true;\n            this.editor.refresh();\n        }\n    }\n    onAfterAttach(msg) {\n        super.onAfterAttach(msg);\n        this._hasRefreshedSinceAttach = false;\n        if (this.isVisible) {\n            this.update();\n        }\n        window.addEventListener('beforeunload', (e) => {\n            if (!this.saved) {\n                e.preventDefault();\n                e.returnValue = '';\n            }\n        });\n    }\n    onAfterShow(msg) {\n        if (!this._hasRefreshedSinceAttach) {\n            this.update();\n        }\n    }\n    /**\n     * Initial focus on the editor when it gets activated!\n     * @param msg\n     */\n    onActivateRequest(msg) {\n        this.editor.focus();\n    }\n    onCloseRequest(msg) {\n        if (!this.saved) {\n            (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.showDialog)({\n                title: 'Close without saving?',\n                body: (react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"p\", null,\n                    ' ',\n                    `\"${this._codeSnippetEditorMetaData.name}\" has unsaved changes, close without saving?`,\n                    ' ')),\n                buttons: [\n                    _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Dialog.cancelButton(),\n                    _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Dialog.warnButton({ label: 'Discard' }),\n                    _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.Dialog.okButton({ label: 'Save' }),\n                ],\n            }).then((response) => {\n                if (response.button.accept) {\n                    if (response.button.label === 'Discard') {\n                        this.dispose();\n                        super.onCloseRequest(msg);\n                    }\n                    else if (response.button.label === 'Save') {\n                        const name = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`).value;\n                        const description = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`).value;\n                        const language = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`).value;\n                        const validity = (0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_5__.validateInputs)(name, description, language);\n                        if (validity) {\n                            this.updateSnippet().then((value) => {\n                                if (value) {\n                                    this.dispose();\n                                    super.onCloseRequest(msg);\n                                }\n                            });\n                        }\n                    }\n                }\n            });\n        }\n        else {\n            this.dispose();\n            super.onCloseRequest(msg);\n        }\n    }\n    /**\n     * Visualize the editor more look like an editor\n     * @param event\n     */\n    activateCodeMirror(event) {\n        let target = event.target;\n        while (target && target.parentElement) {\n            if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n                break;\n            }\n            target = target.parentElement;\n        }\n        const editor = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} #code-${this._codeSnippetEditorMetaData.id}`);\n        if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n            if (!editor.classList.contains('active')) {\n                editor.classList.add('active');\n            }\n        }\n    }\n    deactivateCodeMirror(editor) {\n        if (editor.classList.contains('active')) {\n            editor.classList.remove('active');\n        }\n    }\n    handleInputFieldChange(event) {\n        if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n            this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n        }\n        const target = event.target;\n        if (!target.classList.contains('FieldChanged')) {\n            target.classList.add('FieldChanged');\n        }\n        this.saved = false;\n    }\n    saveChange(event) {\n        const name = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`).value;\n        const description = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`).value;\n        const language = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`).value;\n        const validity = (0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_5__.validateInputs)(name, description, language);\n        if (validity) {\n            this.updateSnippet();\n        }\n    }\n    async updateSnippet() {\n        const name = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`).value;\n        const description = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`).value;\n        const language = document.querySelector(`.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`).value;\n        this._codeSnippetEditorMetaData.name = name;\n        this._codeSnippetEditorMetaData.description = description;\n        this._codeSnippetEditorMetaData.language = language;\n        const newName = this._codeSnippetEditorMetaData.name;\n        const oldName = this.oldCodeSnippetName;\n        const newSnippet = {\n            name: this._codeSnippetEditorMetaData.name,\n            description: this._codeSnippetEditorMetaData.description,\n            language: this._codeSnippetEditorMetaData.language,\n            code: this._codeSnippetEditorMetaData.code,\n            id: this._codeSnippetEditorMetaData.id,\n            tags: this._codeSnippetEditorMetaData.tags,\n        };\n        this._codeSnippetEditorMetaData;\n        const isDuplicatName = this.contentsService.duplicateNameExists(newName);\n        // update new name as an old name\n        this.oldCodeSnippetName = this._codeSnippetEditorMetaData.name;\n        // add new snippet\n        if (this._codeSnippetEditorMetaData.fromScratch) {\n            if (isDuplicatName) {\n                const oldSnippet = this.contentsService.getSnippetByName(newName)[0];\n                await (0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_5__.saveOverWriteFile)(this.contentsService, oldSnippet, newSnippet);\n            }\n            else {\n                this.contentsService.addSnippet(newSnippet).then((res) => {\n                    if (!res) {\n                        console.log('Error in adding snippet');\n                        return false;\n                    }\n                });\n                (0,_CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_6__.showMessage)('confirm');\n            }\n        }\n        // modify existing snippet\n        else {\n            if (newName !== oldName) {\n                if (isDuplicatName) {\n                    // overwrite\n                    const oldSnippet = this.contentsService.getSnippetByName(newName)[0];\n                    await (0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_5__.saveOverWriteFile)(this.contentsService, oldSnippet, newSnippet).then((res) => {\n                        if (res) {\n                            // get the id of snippet you are editting\n                            const removedSnippet = this.contentsService.getSnippetByName(oldName)[0];\n                            // delete the one you are editing\n                            this.contentsService.deleteSnippet(removedSnippet.id);\n                        }\n                        else {\n                            return false;\n                        }\n                    });\n                }\n            }\n            this.contentsService\n                .modifyExistingSnippet(oldName, newSnippet)\n                .then((res) => {\n                if (!res) {\n                    console.log('Error in modifying snippet');\n                    return false;\n                }\n            });\n        }\n        this.saved = true;\n        // remove the dirty state\n        this.title.className = this.title.className.replace(` ${EDITOR_DIRTY_CLASS}`, '');\n        // change label\n        this.title.label =\n            '[' +\n                this._codeSnippetEditorMetaData.language +\n                '] ' +\n                this._codeSnippetEditorMetaData.name;\n        if (!this._codeSnippetEditorMetaData.fromScratch) {\n            // update tracker\n            this.tracker.save(this);\n        }\n        // update the display in code snippet explorer\n        this.codeSnippetWidget.updateCodeSnippetWidget();\n        // close editor if it's from scratch\n        if (this._codeSnippetEditorMetaData.fromScratch) {\n            this.dispose();\n        }\n        return true;\n    }\n    handleChangeOnTag(tags) {\n        if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n            this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n        }\n        this._codeSnippetEditorMetaData.tags = tags\n            .filter((tag) => tag.clicked)\n            .map((tag) => tag.name);\n        this._codeSnippetEditorMetaData.allSnippetTags = tags.map((tag) => tag.name);\n        this.saved = false;\n    }\n    handleOnBlur(event) {\n        const target = event.target;\n        if (!target.classList.contains('touched')) {\n            target.classList.add('touched');\n        }\n    }\n    /**\n     * TODO: clean CSS style class - \"Use constant\"\n     */\n    renderCodeInput() {\n        return (react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"section\", { className: CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR, onMouseDown: this.activateCodeMirror },\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", { className: CODE_SNIPPET_EDITOR_MIRROR, id: 'code-' + this._codeSnippetEditorMetaData.id.toString() })));\n    }\n    renderLanguages() {\n        _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_7__.SUPPORTED_LANGUAGES.sort();\n        return (react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", null,\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"input\", { className: CODE_SNIPPET_EDITOR_LANG_INPUT, list: \"languages\", name: \"language\", defaultValue: this._codeSnippetEditorMetaData.language, onChange: this.handleInputFieldChange, required: true }),\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"datalist\", { id: \"languages\" }, _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_7__.SUPPORTED_LANGUAGES.map((lang) => this.renderLanguageOptions(lang)))));\n    }\n    renderLanguageOptions(option) {\n        return react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"option\", { key: option, value: option });\n    }\n    render() {\n        const fromScratch = this._codeSnippetEditorMetaData.fromScratch;\n        return (react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"div\", { className: CODE_SNIPPET_EDITOR_INPUTAREA, onMouseDown: (event) => {\n                this.deactivateEditor(event);\n            } },\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"span\", { className: CODE_SNIPPET_EDITOR_TITLE }, fromScratch ? 'New Code Snippet' : 'Edit Code Snippet'),\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"section\", { className: CODE_SNIPPET_EDITOR_METADATA },\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"label\", { className: CODE_SNIPPET_EDITOR_LABEL }, \"Name (required)\"),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"input\", { className: CODE_SNIPPET_EDITOR_NAME_INPUT, defaultValue: this._codeSnippetEditorMetaData.name, placeholder: 'Ex. starter code', type: \"text\", required: true, onMouseDown: (event) => this.activeFieldState(event), onChange: (event) => {\n                        this.handleInputFieldChange(event);\n                    }, onBlur: this.handleOnBlur }),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"label\", { className: CODE_SNIPPET_EDITOR_LABEL }, \"Description (optional)\"),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"input\", { className: CODE_SNIPPET_EDITOR_DESC_INPUT, defaultValue: this._codeSnippetEditorMetaData.description, placeholder: 'Description', type: \"text\", onMouseDown: (event) => this.activeFieldState(event), onChange: (event) => {\n                        this.handleInputFieldChange(event);\n                    }, onBlur: this.handleOnBlur }),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"label\", { className: CODE_SNIPPET_EDITOR_LABEL }, \"Language (required)\"),\n                this.renderLanguages(),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"label\", { className: CODE_SNIPPET_EDITOR_LABEL }, \"Tags\"),\n                react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_CodeSnippetEditorTags__WEBPACK_IMPORTED_MODULE_8__.CodeSnippetEditorTags, { allSnippetTags: this._codeSnippetEditorMetaData.allSnippetTags\n                        ? this._codeSnippetEditorMetaData.allSnippetTags.map((tag) => ({\n                            name: tag,\n                            clicked: this._codeSnippetEditorMetaData.tags &&\n                                this._codeSnippetEditorMetaData.tags.includes(tag)\n                                ? true\n                                : false,\n                        }))\n                        : [], langTags: this._codeSnippetEditorMetaData.allLangTags, handleChange: this.handleChangeOnTag })),\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(\"span\", { className: CODE_SNIPPET_EDITOR_LABEL }, \"Code\"),\n            this.renderCodeInput(),\n            react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_2__.Button, { className: \"saveBtn\", onClick: this.saveChange }, fromScratch ? 'Create & Close' : 'Save')));\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetEditorTags.js\":\n/*!**************************************!*\\\n  !*** ./lib/CodeSnippetEditorTags.js ***!\n  \\**************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetEditorTags\": () => (/* binding */ CodeSnippetEditorTags)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\n/**\n * CSS STYLING\n */\nconst CODE_SNIPPET_EDITOR_TAG = 'jp-codeSnippet-editor-tag';\nconst CODE_SNIPPET_EDITOR_TAG_PLUS_ICON = 'jp-codeSnippet-editor-tag-plusIcon';\nconst CODE_SNIPPET_EDITOR_TAG_LIST = 'jp-codeSnippet-editor-tagList';\nclass CodeSnippetEditorTags extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\n    constructor(props) {\n        super(props);\n        this.state = {\n            allSnippetTags: [],\n            plusIconClicked: false,\n        };\n        this.renderTags = this.renderTags.bind(this);\n        this.handleClick = this.handleClick.bind(this);\n    }\n    componentDidMount() {\n        this.setState({\n            allSnippetTags: this.props.allSnippetTags,\n            plusIconClicked: false,\n        });\n    }\n    componentDidUpdate(prevProps) {\n        if (prevProps !== this.props) {\n            this.setState({\n                allSnippetTags: this.props.allSnippetTags,\n            });\n        }\n    }\n    handleClick(event) {\n        const target = event.target;\n        const clickedTag = target.innerText;\n        this.handleClickHelper(clickedTag);\n    }\n    handleOnChange() {\n        this.props.handleChange(this.state.allSnippetTags);\n    }\n    handleClickHelper(\n    // parent: HTMLElement,\n    clickedTag) {\n        this.setState((state) => ({\n            allSnippetTags: state.allSnippetTags.map((tag) => tag.name === clickedTag ? Object.assign(Object.assign({}, tag), { clicked: !tag.clicked }) : tag),\n        }), this.handleOnChange);\n    }\n    addTagOnClick(event) {\n        this.setState({ plusIconClicked: true });\n        const inputElement = event.target;\n        if (inputElement.value === 'Add Tag') {\n            inputElement.value = '';\n            inputElement.style.width = '62px';\n            inputElement.style.minWidth = '62px';\n        }\n    }\n    addTagOnKeyDown(event) {\n        const inputElement = event.target;\n        if (inputElement.value !== '' && event.key === 'Enter') {\n            if (this.state.allSnippetTags.find((tag) => tag.name === inputElement.value)) {\n                alert('Duplicate Tag Name!');\n                return;\n            }\n            if (this.props.langTags.includes(inputElement.value)) {\n                alert('This tag already exists in language tags!\\nIf you want to create this tag, lowercase the first letter.');\n                return;\n            }\n            const newTag = { name: inputElement.value, clicked: true };\n            this.setState((state) => ({\n                allSnippetTags: [...state.allSnippetTags, newTag],\n                plusIconClicked: false,\n            }), this.handleOnChange);\n        }\n    }\n    addTagOnBlur(event) {\n        const inputElement = event.target;\n        inputElement.value = 'Add Tag';\n        inputElement.style.width = '50px';\n        inputElement.style.minWidth = '50px';\n        inputElement.blur();\n        this.setState({ plusIconClicked: false });\n    }\n    renderTags() {\n        const hasTags = this.state.allSnippetTags;\n        const inputBox = this.state.plusIconClicked === true ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"ul\", { className: `${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag`, key: 'editor-new-tag' },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"input\", { onClick: (event) => this.addTagOnClick(event), onKeyDown: (event) => this.addTagOnKeyDown(event), onBlur: (event) => this.addTagOnBlur(event), autoFocus: true }))) : (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"ul\", { className: `${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag` },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { onClick: () => this.setState({ plusIconClicked: true }) }, \"Add Tag\"),\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.addIcon.react, { tag: \"span\", className: CODE_SNIPPET_EDITOR_TAG_PLUS_ICON, elementPosition: \"center\", height: \"16px\", width: \"16px\", marginLeft: \"2px\" })));\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"li\", { className: CODE_SNIPPET_EDITOR_TAG_LIST },\n            hasTags\n                ? this.state.allSnippetTags.map((tag, index) => (() => {\n                    if (!tag.clicked) {\n                        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"ul\", { className: `${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag`, id: 'editor' + '-' + tag.name + '-' + index, key: 'editor' + '-' + tag.name + '-' + index },\n                            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { onClick: this.handleClick }, tag.name)));\n                    }\n                    else {\n                        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"ul\", { className: `${CODE_SNIPPET_EDITOR_TAG} tag applied-tag`, id: 'editor' + '-' + tag.name + '-' + index, key: 'editor' + '-' + tag.name + '-' + index },\n                            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { onClick: this.handleClick }, tag.name),\n                            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.checkIcon.react, { tag: \"span\", elementPosition: \"center\", height: \"18px\", width: \"18px\", marginLeft: \"5px\", marginRight: \"-3px\" })));\n                    }\n                })())\n                : null,\n            inputBox));\n    }\n    render() {\n        return react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", null, this.renderTags());\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetFilterTools.js\":\n/*!***************************************!*\\\n  !*** ./lib/CodeSnippetFilterTools.js ***!\n  \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"FilterTools\": () => (/* binding */ FilterTools)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\nconst FILTER_ARROW_UP = 'jp-codeSnippet-filter-arrow-up';\nconst FILTER_OPTION = 'jp-codeSnippet-filter-option';\nconst FILTER_TAGS = 'jp-codeSnippet-filter-tags';\nconst FILTER_TAG = 'jp-codeSnippet-filter-tag';\nconst FILTER_CHECK = 'jp-codeSnippet-filter-check';\nconst FILTER_TITLE = 'jp-codeSnippet-filter-title';\nconst FILTER_TOOLS = 'jp-codeSnippet-filterTools';\nconst FILTER_SEARCHBAR = 'jp-codeSnippet-searchbar';\nconst FILTER_SEARCHWRAPPER = 'jp-codeSnippet-searchwrapper';\nconst FILTER_CLASS = 'jp-codeSnippet-filter';\nconst FILTER_BUTTON = 'jp-codeSnippet-filter-btn';\nclass FilterTools extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\n    constructor(props) {\n        super(props);\n        this.handleSearch = (event) => {\n            this.setState({ searchValue: event.target.value }, this.filterSnippets);\n        };\n        this.state = { show: false, selectedTags: [], searchValue: '' }; //--> selectedTags & selectedLangTags\n        this.createFilterBox = this.createFilterBox.bind(this);\n        this.renderFilterOption = this.renderFilterOption.bind(this);\n        this.renderTags = this.renderTags.bind(this);\n        this.renderAppliedTag = this.renderAppliedTag.bind(this);\n        this.renderUnappliedTag = this.renderUnappliedTag.bind(this);\n        this.handleClick = this.handleClick.bind(this);\n        this.filterSnippets = this.filterSnippets.bind(this);\n    }\n    componentDidUpdate(prevProps) {\n        if (prevProps !== this.props) {\n            // get all the tags together in one list\n            const concatTags = this.props.snippetTags.concat(this.props.languageTags);\n            this.setState((state) => ({\n                selectedTags: state.selectedTags\n                    .filter((tag) => concatTags.includes(tag))\n                    .sort(),\n            }));\n        }\n    }\n    createFilterBox() {\n        const filterArrow = document.querySelector(`.${FILTER_ARROW_UP}`);\n        const filterOption = document.querySelector(`.${FILTER_OPTION}`);\n        filterArrow.classList.toggle('idle');\n        filterOption.classList.toggle('idle');\n    }\n    renderTags(tags, type) {\n        const selectedLanguageTags = this.state.selectedTags.filter((tag) => this.props.languageTags.includes(tag));\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_TAGS }, tags.sort().map((tag, index) => {\n            // language tags\n            if (type === 'language' && this.props.languageTags.includes(tag)) {\n                if (this.state.selectedTags.includes(tag)) {\n                    return this.renderAppliedTag(tag, index.toString());\n                }\n                else {\n                    return this.renderUnappliedTag(tag, index.toString());\n                }\n            }\n            else if (\n            // snippet tags\n            type === 'snippet' &&\n                !this.props.languageTags.includes(tag)) {\n                if (selectedLanguageTags.length !== 0) {\n                    // if languages are selected, only display snippet tags that have snippets in those languages\n                    const langsMatch = this.props.tagDictionary\n                        .get(tag)\n                        .some((r) => selectedLanguageTags.includes(r));\n                    if (langsMatch) {\n                        if (this.state.selectedTags.includes(tag)) {\n                            return this.renderAppliedTag(tag, index.toString());\n                        }\n                        else {\n                            return this.renderUnappliedTag(tag, index.toString());\n                        }\n                    }\n                }\n                else {\n                    if (this.state.selectedTags.includes(tag)) {\n                        return this.renderAppliedTag(tag, index.toString());\n                    }\n                    else {\n                        return this.renderUnappliedTag(tag, index.toString());\n                    }\n                }\n            }\n        })));\n    }\n    renderAppliedTag(tag, index) {\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: `${FILTER_TAG} tag applied-tag`, id: 'filter' + '-' + tag + '-' + index, key: 'filter' + '-' + tag + '-' + index },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { onClick: this.handleClick }, tag),\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.checkIcon.react, { className: FILTER_CHECK, tag: \"span\", elementPosition: \"center\", height: \"18px\", width: \"18px\", marginLeft: \"5px\", marginRight: \"-3px\" })));\n    }\n    renderUnappliedTag(tag, index) {\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: `${FILTER_TAG} tag unapplied-tag`, id: 'filter' + '-' + tag + '-' + index, key: 'filter' + '-' + tag + '-' + index },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { onClick: this.handleClick }, tag)));\n    }\n    handleClick(event) {\n        const target = event.target;\n        const clickedTag = target.innerText;\n        const parent = target.parentElement;\n        this.setState((state) => ({\n            selectedTags: this.handleClickHelper(parent, state.selectedTags, clickedTag),\n        }), this.filterSnippets);\n    }\n    handleClickHelper(parent, currentTags, clickedTag) {\n        if (parent.classList.contains('unapplied-tag')) {\n            parent.classList.replace('unapplied-tag', 'applied-tag');\n            currentTags.splice(-1, 0, clickedTag);\n        }\n        else if (parent.classList.contains('applied-tag')) {\n            parent.classList.replace('applied-tag', 'unapplied-tag');\n            const idx = currentTags.indexOf(clickedTag);\n            currentTags.splice(idx, 1);\n        }\n        return currentTags.sort();\n    }\n    filterSnippets() {\n        this.props.onFilter(this.state.searchValue, this.state.selectedTags, this.state.selectedTags.filter((tag) => this.props.languageTags.includes(tag)));\n    }\n    renderFilterOption() {\n        // get all the tags together in one list\n        const concatTags = this.props.snippetTags.concat(this.props.languageTags);\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: `${FILTER_OPTION} idle` },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_TITLE },\n                react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", null, \"language tags\")),\n            this.renderTags(concatTags, 'language'),\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_TITLE },\n                react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"span\", null, \"snippet tags\")),\n            this.renderTags(concatTags, 'snippet')));\n    }\n    render() {\n        return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_TOOLS },\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_SEARCHBAR },\n                react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.InputGroup, { className: FILTER_SEARCHWRAPPER, type: \"text\", placeholder: \"SEARCH SNIPPETS\", onChange: this.handleSearch, rightIcon: \"ui-components:search\", value: this.state.searchValue })),\n            react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: FILTER_CLASS },\n                react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"button\", { className: FILTER_BUTTON, onClick: this.createFilterBox }, \"Filter By Tags\"),\n                react__WEBPACK_IMPORTED_MODULE_1___default().createElement(\"div\", { className: `${FILTER_ARROW_UP} idle` }),\n                this.renderFilterOption())));\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetInputDialog.js\":\n/*!***************************************!*\\\n  !*** ./lib/CodeSnippetInputDialog.js ***!\n  \\***************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetInputDialog\": () => (/* binding */ CodeSnippetInputDialog),\n/* harmony export */   \"isValidFileName\": () => (/* binding */ isValidFileName),\n/* harmony export */   \"showInputDialog\": () => (/* binding */ showInputDialog)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lumino/widgets */ \"webpack/sharing/consume/default/@lumino/widgets\");\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _CodeSnippetService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CodeSnippetService */ \"./lib/CodeSnippetService.js\");\n/* harmony import */ var _CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CodeSnippetMessage */ \"./lib/CodeSnippetMessage.js\");\n/* harmony import */ var _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CodeSnippetLanguages */ \"./lib/CodeSnippetLanguages.js\");\n/* harmony import */ var _CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CodeSnippetUtilities */ \"./lib/CodeSnippetUtilities.js\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\n\n\n\n\n\n/**\n * The class name added to file dialogs.\n */\nconst FILE_DIALOG_CLASS = 'jp-codeSnippet-fileDialog';\n/**\n * CSS STYLING\n */\nconst CODE_SNIPPET_DIALOG_NAME_INPUT = 'jp-codeSnippet-dialog-name-input';\nconst CODE_SNIPPET_DIALOG_DESC_INPUT = 'jp-codeSnippet-dialog-desc-input';\nconst CODE_SNIPPET_DIALOG_LANG_INPUT = 'jp-codeSnippet-dialog-lang-input';\nconst CODE_SNIPPET_INPUTTAG_PLUS_ICON = 'jp-codeSnippet-inputTag-plusIcon';\nconst CODE_SNIPPET_INPUTTAG_LIST = 'jp-codeSnippet-inputTagList';\nconst CODE_SNIPPET_INPUT_TAG = 'jp-codeSnippet-inputTag';\nconst CODE_SNIPPET_INPUT_TAG_CHECK = 'jp-codeSnippet-inputTag-check';\nclass CodeSnippetDialog extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog {\n    onAfterAttach(msg) {\n        const node = this.node;\n        node.addEventListener('keydown', this, false);\n        node.addEventListener('contextmenu', this, true);\n        node.addEventListener('click', this, true);\n        document.addEventListener('focus', this, true);\n        const body = this.node.querySelector('.jp-Dialog-body');\n        const el = body.querySelector(`.${CODE_SNIPPET_DIALOG_NAME_INPUT}`);\n        this.first = el;\n        el.focus();\n    }\n    onAfterDetach(msg) {\n        const node = this.node;\n        node.removeEventListener('keydown', this, false);\n        node.removeEventListener('contextmenu', this, true);\n        node.removeEventListener('click', this, true);\n        document.removeEventListener('focus', this, true);\n    }\n    _evtKeydown(event) {\n        switch (event.key) {\n            case 'Escape':\n                event.stopPropagation();\n                event.preventDefault();\n                this.reject();\n                break;\n            case 'Tab': {\n                const last_button = document.querySelector('.jp-mod-accept');\n                if (document.activeElement === last_button && !event.shiftKey) {\n                    event.stopPropagation();\n                    event.preventDefault();\n                    this.first.focus();\n                }\n                break;\n            }\n            case 'Enter':\n                event.stopPropagation();\n                event.preventDefault();\n                this.resolve();\n                break;\n            default:\n                break;\n        }\n    }\n}\nfunction showCodeSnippetDialog(options = {}) {\n    const dialog = new CodeSnippetDialog(options);\n    return dialog.launch();\n}\n/**\n * Save an input with a dialog. This is what actually displays everything.\n * Result.value is the value retrieved from .getValue(). ---> .getValue() returns an array of inputs.\n */\nfunction CodeSnippetInputDialog(codeSnippetWidget, code, language, idx) {\n    const tags = [];\n    const langTags = [];\n    const codeSnippetManager = _CodeSnippetService__WEBPACK_IMPORTED_MODULE_3__.CodeSnippetService.getCodeSnippetService();\n    const snippets = codeSnippetManager.snippets;\n    // get all active tags\n    for (const snippet of snippets) {\n        if (snippet.tags) {\n            for (const tag of snippet.tags) {\n                if (!tags.includes(tag)) {\n                    tags.push(tag);\n                }\n            }\n        }\n        if (!langTags.includes(snippet.language)) {\n            langTags.push(snippet.language);\n        }\n    }\n    const body = new InputHandler(tags, language, langTags);\n    return showInputDialog(codeSnippetWidget, tags, idx, codeSnippetManager, code, language, body);\n}\n/**\n * This function creates the actual input form and processes the inputs given.\n */\nfunction showInputDialog(codeSnippetWidget, tags, idx, codeSnippetManager, code, language, body) {\n    return showCodeSnippetDialog({\n        title: 'Save Code Snippet',\n        body: body,\n        buttons: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.cancelButton(), _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.okButton({ label: 'Save' })],\n    }).then((result) => {\n        if (!result.value) {\n            return null;\n        }\n        const nameInput = result.value[0];\n        const descriptionInput = result.value[1];\n        const languageInput = result.value[2];\n        if (!(0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_4__.validateInputs)(nameInput, descriptionInput, languageInput)) {\n            showInputDialog(codeSnippetWidget, tags, idx, codeSnippetManager, code, language, body);\n        }\n        else {\n            const tags = result.value.slice(3);\n            const newSnippet = {\n                name: nameInput.replace(' ', ''),\n                description: descriptionInput,\n                language: languageInput,\n                code: code,\n                id: idx,\n                tags: tags,\n            };\n            for (const snippet of codeSnippetManager.snippets) {\n                if (snippet.name === newSnippet.name) {\n                    (0,_CodeSnippetUtilities__WEBPACK_IMPORTED_MODULE_4__.saveOverWriteFile)(codeSnippetManager, snippet, newSnippet).then((res) => {\n                        if (res) {\n                            codeSnippetWidget.renderCodeSnippetsSignal.emit(codeSnippetManager.snippets);\n                        }\n                    });\n                    return;\n                }\n            }\n            createNewSnippet(codeSnippetWidget, newSnippet, codeSnippetManager);\n        }\n    });\n}\nfunction createNewSnippet(codeSnippetWidget, newSnippet, codeSnippetManager) {\n    codeSnippetManager.addSnippet(newSnippet).then((res) => {\n        if (!res) {\n            console.log('Error in adding snippet');\n            return;\n        }\n    });\n    codeSnippetWidget.renderCodeSnippetsSignal.emit(codeSnippetManager.snippets);\n    (0,_CodeSnippetMessage__WEBPACK_IMPORTED_MODULE_5__.showMessage)('confirm');\n}\n/**\n * Test whether a name is a valid file name\n *\n * Disallows \"/\", \"\\\", and \":\" in file names, as well as names with zero length.\n */\nfunction isValidFileName(name) {\n    const validNameExp = /[/\\\\:]/;\n    return name.length > 0 && !validNameExp.test(name);\n}\n/**\n * A widget used to get input data.\n */\nclass InputHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget {\n    /**\n     * Construct a new \"code snippet\" dialog.\n     * readonly inputNode: HTMLInputElement; <--- in Widget class\n     */\n    constructor(snippetTags, language, langTags) {\n        super({ node: Private.createInputNode(snippetTags, language, langTags) });\n        this.addClass(FILE_DIALOG_CLASS);\n    }\n    getValue() {\n        const inputs = [];\n        inputs.push(this.node.querySelector(`.${CODE_SNIPPET_DIALOG_NAME_INPUT}`).value, this.node.querySelector(`.${CODE_SNIPPET_DIALOG_DESC_INPUT}`).value, this.node.querySelector(`.${CODE_SNIPPET_DIALOG_LANG_INPUT}`).value);\n        inputs.push(...Private.selectedTags);\n        // reset selectedTags\n        Private.selectedTags = [];\n        return inputs;\n    }\n}\n/**\n * A namespace for private data.\n */\nclass Private {\n    static handleOnBlur(event) {\n        const target = event.target;\n        if (!target.classList.contains('touched')) {\n            target.classList.add('touched');\n        }\n    }\n    /**\n     * Create the node for a code snippet form handler. This is what's creating all of the elements to be displayed.\n     */\n    static createInputNode(snippetTags, language, langTags) {\n        Private.allSnippetTags = snippetTags;\n        Private.allLangTags = langTags;\n        const body = document.createElement('form');\n        const nameTitle = document.createElement('label');\n        nameTitle.textContent = 'Snippet Name (required)';\n        const name = document.createElement('input');\n        name.className = CODE_SNIPPET_DIALOG_NAME_INPUT;\n        name.required = true;\n        name.placeholder = 'Ex. starter code';\n        name.onblur = Private.handleOnBlur;\n        const descriptionTitle = document.createElement('label');\n        descriptionTitle.textContent = 'Description (optional)';\n        const description = document.createElement('input');\n        description.className = CODE_SNIPPET_DIALOG_DESC_INPUT;\n        description.placeholder = 'Description';\n        description.onblur = Private.handleOnBlur;\n        const languageTitle = document.createElement('label');\n        languageTitle.textContent = 'Language (required)';\n        const languageInput = document.createElement('input');\n        languageInput.className = CODE_SNIPPET_DIALOG_LANG_INPUT;\n        languageInput.setAttribute('list', 'languages');\n        // capitalize the first character\n        languageInput.value = language[0].toUpperCase() + language.slice(1);\n        languageInput.required = true;\n        const languageOption = document.createElement('datalist');\n        languageOption.id = 'languages';\n        languageOption.onblur = Private.handleOnBlur;\n        _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_6__.SUPPORTED_LANGUAGES.sort();\n        for (const supportedLanguage of _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_6__.SUPPORTED_LANGUAGES) {\n            const option = document.createElement('option');\n            option.value = supportedLanguage;\n            languageOption.appendChild(option);\n        }\n        const tagList = document.createElement('li');\n        tagList.classList.add(CODE_SNIPPET_INPUTTAG_LIST);\n        for (const tag of snippetTags) {\n            const tagElem = document.createElement('ul');\n            tagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag unapplied-tag`;\n            const tagBtn = document.createElement('button');\n            tagBtn.innerText = tag;\n            tagBtn.onclick = Private.handleClick;\n            tagElem.appendChild(tagBtn);\n            tagList.appendChild(tagElem);\n        }\n        const addTagElem = document.createElement('ul');\n        addTagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag unapplied-tag`;\n        const newTagName = document.createElement('button');\n        newTagName.innerText = 'Add Tag';\n        newTagName.style.cursor = 'pointer';\n        addTagElem.appendChild(newTagName);\n        const plusIcon = _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.addIcon.element({\n            tag: 'span',\n            className: CODE_SNIPPET_INPUTTAG_PLUS_ICON,\n            elementPosition: 'center',\n            height: '16px',\n            width: '16px',\n            marginLeft: '2px',\n        });\n        newTagName.onclick = Private.addTag;\n        addTagElem.appendChild(plusIcon);\n        tagList.append(addTagElem);\n        body.appendChild(nameTitle);\n        body.appendChild(name);\n        body.appendChild(descriptionTitle);\n        body.appendChild(description);\n        body.appendChild(languageTitle);\n        body.appendChild(languageInput);\n        body.appendChild(languageOption);\n        body.appendChild(tagList);\n        return body;\n    }\n    // replace the newTagName to input and delete plusIcon and insertbefore current tag on keydown or blur (refer to cell tags)\n    static addTag(event) {\n        const target = event.target;\n        const plusIcon = document.querySelector('.jp-codeSnippet-inputTag-plusIcon');\n        plusIcon.remove();\n        const newTagName = document.createElement('input');\n        target.parentElement.replaceChild(newTagName, target);\n        newTagName.onkeydown = Private.addTagOnKeyDown;\n        newTagName.onblur = Private.addTagOnBlur;\n        newTagName.focus();\n        return false;\n    }\n    static addTagOnKeyDown(event) {\n        const inputElement = event.target;\n        if (inputElement.value !== '' && event.key === 'Enter') {\n            // duplicate tag\n            if (Private.allSnippetTags.includes(inputElement.value)) {\n                alert('Duplicate Tag Name!');\n                return;\n            }\n            if (Private.allLangTags.includes(inputElement.value)) {\n                alert('This tag already exists in language tags!\\nIf you want to create this tag, lowercase the first letter.');\n                return;\n            }\n            event.preventDefault();\n            // create new tag\n            const tagList = document.querySelector('.jp-codeSnippet-inputTagList');\n            const tagElem = document.createElement('ul');\n            tagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag applied-tag`;\n            const tagBtn = document.createElement('button');\n            tagBtn.innerText = inputElement.value;\n            tagBtn.onclick = Private.handleClick;\n            tagElem.appendChild(tagBtn);\n            tagList.insertBefore(tagElem, inputElement.parentElement);\n            // add check mark when tag gets selected\n            const iconContainer = _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.checkIcon.element({\n                className: CODE_SNIPPET_INPUT_TAG_CHECK,\n                tag: 'span',\n                elementPosition: 'center',\n                height: '18px',\n                width: '18px',\n                marginLeft: '5px',\n                marginRight: '-3px',\n            });\n            const color = getComputedStyle(document.documentElement).getPropertyValue('--jp-ui-font-color1');\n            tagBtn.style.color = color;\n            tagElem.appendChild(iconContainer);\n            // add it to the selected tags\n            Private.selectedTags.push(tagBtn.innerText);\n            Private.allSnippetTags.push(tagBtn.innerText);\n            // reset InputElement\n            inputElement.blur();\n            event.stopPropagation();\n        }\n        else if (event.key === 'Escape') {\n            inputElement.blur();\n            event.stopPropagation();\n        }\n    }\n    static addTagOnBlur(event) {\n        const inputElement = event.target;\n        // add plusIcon\n        const plusIcon = _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.addIcon.element({\n            tag: 'span',\n            className: CODE_SNIPPET_INPUTTAG_PLUS_ICON,\n            elementPosition: 'center',\n            height: '16px',\n            width: '16px',\n            marginLeft: '2px',\n        });\n        // change input to span\n        const newTagName = document.createElement('button');\n        newTagName.innerText = 'Add Tag';\n        newTagName.style.cursor = 'pointer';\n        inputElement.parentElement.replaceChild(newTagName, inputElement);\n        newTagName.parentElement.appendChild(plusIcon);\n        newTagName.onclick = Private.addTag;\n    }\n    static handleClick(event) {\n        const target = event.target;\n        const parent = target.parentElement;\n        if (parent.classList.contains('unapplied-tag')) {\n            Private.selectedTags.push(target.innerText);\n            parent.classList.replace('unapplied-tag', 'applied-tag');\n            const iconContainer = _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_1__.checkIcon.element({\n                className: CODE_SNIPPET_INPUT_TAG_CHECK,\n                tag: 'span',\n                elementPosition: 'center',\n                height: '18px',\n                width: '18px',\n                marginLeft: '5px',\n                marginRight: '-3px',\n            });\n            const color = getComputedStyle(document.documentElement).getPropertyValue('--jp-ui-font-color1');\n            target.style.color = color;\n            if (parent.children.length === 1) {\n                parent.appendChild(iconContainer);\n            }\n        }\n        else if (parent.classList.contains('applied-tag')) {\n            const idx = Private.selectedTags.indexOf(target.innerText);\n            Private.selectedTags.splice(idx, 1);\n            parent.classList.replace('applied-tag', 'unapplied-tag');\n            const color = getComputedStyle(document.documentElement).getPropertyValue('--jp-ui-font-color2');\n            target.style.color = color;\n            if (parent.children.length !== 1) {\n                // remove check icon\n                parent.removeChild(parent.children.item(1));\n            }\n        }\n        return false;\n    }\n}\nPrivate.selectedTags = [];\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetLanguages.js\":\n/*!*************************************!*\\\n  !*** ./lib/CodeSnippetLanguages.js ***!\n  \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"SUPPORTED_LANGUAGES\": () => (/* binding */ SUPPORTED_LANGUAGES),\n/* harmony export */   \"babelIcon\": () => (/* binding */ babelIcon),\n/* harmony export */   \"cIcon\": () => (/* binding */ cIcon),\n/* harmony export */   \"clojureIcon\": () => (/* binding */ clojureIcon),\n/* harmony export */   \"coconutIcon\": () => (/* binding */ coconutIcon),\n/* harmony export */   \"coffeescriptIcon\": () => (/* binding */ coffeescriptIcon),\n/* harmony export */   \"cppIcon\": () => (/* binding */ cppIcon),\n/* harmony export */   \"csharpIcon\": () => (/* binding */ csharpIcon),\n/* harmony export */   \"erlangIcon\": () => (/* binding */ erlangIcon),\n/* harmony export */   \"forthIcon\": () => (/* binding */ forthIcon),\n/* harmony export */   \"fortranIcon\": () => (/* binding */ fortranIcon),\n/* harmony export */   \"fsharpIcon\": () => (/* binding */ fsharpIcon),\n/* harmony export */   \"goIcon\": () => (/* binding */ goIcon),\n/* harmony export */   \"groovyIcon\": () => (/* binding */ groovyIcon),\n/* harmony export */   \"haskellIcon\": () => (/* binding */ haskellIcon),\n/* harmony export */   \"javaIcon\": () => (/* binding */ javaIcon),\n/* harmony export */   \"javascriptIcon\": () => (/* binding */ javascriptIcon),\n/* harmony export */   \"juliaIcon\": () => (/* binding */ juliaIcon),\n/* harmony export */   \"kotlinIcon\": () => (/* binding */ kotlinIcon),\n/* harmony export */   \"lispIcon\": () => (/* binding */ lispIcon),\n/* harmony export */   \"livescriptIcon\": () => (/* binding */ livescriptIcon),\n/* harmony export */   \"luaIcon\": () => (/* binding */ luaIcon),\n/* harmony export */   \"markdownIcon\": () => (/* binding */ markdownIcon),\n/* harmony export */   \"matlabIcon\": () => (/* binding */ matlabIcon),\n/* harmony export */   \"nodejsIcon\": () => (/* binding */ nodejsIcon),\n/* harmony export */   \"ocamlIcon\": () => (/* binding */ ocamlIcon),\n/* harmony export */   \"perlIcon\": () => (/* binding */ perlIcon),\n/* harmony export */   \"phpIcon\": () => (/* binding */ phpIcon),\n/* harmony export */   \"powershellIcon\": () => (/* binding */ powershellIcon),\n/* harmony export */   \"processingIcon\": () => (/* binding */ processingIcon),\n/* harmony export */   \"prologIcon\": () => (/* binding */ prologIcon),\n/* harmony export */   \"purescriptIcon\": () => (/* binding */ purescriptIcon),\n/* harmony export */   \"qsharpIcon\": () => (/* binding */ qsharpIcon),\n/* harmony export */   \"rubyIcon\": () => (/* binding */ rubyIcon),\n/* harmony export */   \"rustIcon\": () => (/* binding */ rustIcon),\n/* harmony export */   \"sasIcon\": () => (/* binding */ sasIcon),\n/* harmony export */   \"sbtIcon\": () => (/* binding */ sbtIcon),\n/* harmony export */   \"scalaIcon\": () => (/* binding */ scalaIcon),\n/* harmony export */   \"schemeIcon\": () => (/* binding */ schemeIcon),\n/* harmony export */   \"typescriptIcon\": () => (/* binding */ typescriptIcon)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _style_icon_language_icons_babel_svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../style/icon/language_icons/babel.svg */ \"./style/icon/language_icons/babel.svg\");\n/* harmony import */ var _style_icon_language_icons_c_svg__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../style/icon/language_icons/c.svg */ \"./style/icon/language_icons/c.svg\");\n/* harmony import */ var _style_icon_language_icons_clojure_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../style/icon/language_icons/clojure.svg */ \"./style/icon/language_icons/clojure.svg\");\n/* harmony import */ var _style_icon_language_icons_coconut_svg__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../style/icon/language_icons/coconut.svg */ \"./style/icon/language_icons/coconut.svg\");\n/* harmony import */ var _style_icon_language_icons_coffeescript_svg__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../style/icon/language_icons/coffeescript.svg */ \"./style/icon/language_icons/coffeescript.svg\");\n/* harmony import */ var _style_icon_language_icons_cpp_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../style/icon/language_icons/cpp.svg */ \"./style/icon/language_icons/cpp.svg\");\n/* harmony import */ var _style_icon_language_icons_csharp_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../style/icon/language_icons/csharp.svg */ \"./style/icon/language_icons/csharp.svg\");\n/* harmony import */ var _style_icon_language_icons_erlang_svg__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../style/icon/language_icons/erlang.svg */ \"./style/icon/language_icons/erlang.svg\");\n/* harmony import */ var _style_icon_language_icons_forth_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../style/icon/language_icons/forth.svg */ \"./style/icon/language_icons/forth.svg\");\n/* harmony import */ var _style_icon_language_icons_fortran_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../style/icon/language_icons/fortran.svg */ \"./style/icon/language_icons/fortran.svg\");\n/* harmony import */ var _style_icon_language_icons_fsharp_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../style/icon/language_icons/fsharp.svg */ \"./style/icon/language_icons/fsharp.svg\");\n/* harmony import */ var _style_icon_language_icons_go_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../style/icon/language_icons/go.svg */ \"./style/icon/language_icons/go.svg\");\n/* harmony import */ var _style_icon_language_icons_groovy_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../style/icon/language_icons/groovy.svg */ \"./style/icon/language_icons/groovy.svg\");\n/* harmony import */ var _style_icon_language_icons_haskell_svg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../style/icon/language_icons/haskell.svg */ \"./style/icon/language_icons/haskell.svg\");\n/* harmony import */ var _style_icon_language_icons_java_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../style/icon/language_icons/java.svg */ \"./style/icon/language_icons/java.svg\");\n/* harmony import */ var _style_icon_language_icons_javascript_svg__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../style/icon/language_icons/javascript.svg */ \"./style/icon/language_icons/javascript.svg\");\n/* harmony import */ var _style_icon_language_icons_julia_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../style/icon/language_icons/julia.svg */ \"./style/icon/language_icons/julia.svg\");\n/* harmony import */ var _style_icon_language_icons_kotlin_svg__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../style/icon/language_icons/kotlin.svg */ \"./style/icon/language_icons/kotlin.svg\");\n/* harmony import */ var _style_icon_language_icons_lisp_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../style/icon/language_icons/lisp.svg */ \"./style/icon/language_icons/lisp.svg\");\n/* harmony import */ var _style_icon_language_icons_livescript_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../style/icon/language_icons/livescript.svg */ \"./style/icon/language_icons/livescript.svg\");\n/* harmony import */ var _style_icon_language_icons_lua_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../style/icon/language_icons/lua.svg */ \"./style/icon/language_icons/lua.svg\");\n/* harmony import */ var _style_icon_language_icons_matlab_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../style/icon/language_icons/matlab.svg */ \"./style/icon/language_icons/matlab.svg\");\n/* harmony import */ var _style_icon_language_icons_nodejs_svg__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../style/icon/language_icons/nodejs.svg */ \"./style/icon/language_icons/nodejs.svg\");\n/* harmony import */ var _style_icon_language_icons_ocaml_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../style/icon/language_icons/ocaml.svg */ \"./style/icon/language_icons/ocaml.svg\");\n/* harmony import */ var _style_icon_language_icons_perl_svg__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../style/icon/language_icons/perl.svg */ \"./style/icon/language_icons/perl.svg\");\n/* harmony import */ var _style_icon_language_icons_php_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../style/icon/language_icons/php.svg */ \"./style/icon/language_icons/php.svg\");\n/* harmony import */ var _style_icon_language_icons_processing_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../style/icon/language_icons/processing.svg */ \"./style/icon/language_icons/processing.svg\");\n/* harmony import */ var _style_icon_language_icons_prolog_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../style/icon/language_icons/prolog.svg */ \"./style/icon/language_icons/prolog.svg\");\n/* harmony import */ var _style_icon_language_icons_purescript_svg__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../style/icon/language_icons/purescript.svg */ \"./style/icon/language_icons/purescript.svg\");\n/* harmony import */ var _style_icon_language_icons_qsharp_svg__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../style/icon/language_icons/qsharp.svg */ \"./style/icon/language_icons/qsharp.svg\");\n/* harmony import */ var _style_icon_language_icons_ruby_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../style/icon/language_icons/ruby.svg */ \"./style/icon/language_icons/ruby.svg\");\n/* harmony import */ var _style_icon_language_icons_rust_svg__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../style/icon/language_icons/rust.svg */ \"./style/icon/language_icons/rust.svg\");\n/* harmony import */ var _style_icon_language_icons_sas_svg__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../style/icon/language_icons/sas.svg */ \"./style/icon/language_icons/sas.svg\");\n/* harmony import */ var _style_icon_language_icons_sbt_svg__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../style/icon/language_icons/sbt.svg */ \"./style/icon/language_icons/sbt.svg\");\n/* harmony import */ var _style_icon_language_icons_scala_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../style/icon/language_icons/scala.svg */ \"./style/icon/language_icons/scala.svg\");\n/* harmony import */ var _style_icon_language_icons_scheme_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../style/icon/language_icons/scheme.svg */ \"./style/icon/language_icons/scheme.svg\");\n/* harmony import */ var _style_icon_language_icons_typescript_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../style/icon/language_icons/typescript.svg */ \"./style/icon/language_icons/typescript.svg\");\n/* harmony import */ var _style_icon_language_icons_markdown_svg__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../style/icon/language_icons/markdown.svg */ \"./style/icon/language_icons/markdown.svg\");\n/* harmony import */ var _style_icon_language_icons_powershell_svg__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../style/icon/language_icons/powershell.svg */ \"./style/icon/language_icons/powershell.svg\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * List of languages supported by JupyterLab\n */\nconst SUPPORTED_LANGUAGES = [\n    'Python',\n    'Java',\n    'R',\n    'Julia',\n    'Matlab',\n    'Octave',\n    'Scheme',\n    'Processing',\n    'Scala',\n    'Groovy',\n    'Agda',\n    'Fortran',\n    'Haskell',\n    'Ruby',\n    'TypeScript',\n    'JavaScript',\n    'CoffeeScript',\n    'LiveScript',\n    'C#',\n    'F#',\n    'Go',\n    'Galileo',\n    'Gfm',\n    'Erlang',\n    'PARI/GP',\n    'Aldor',\n    'OCaml',\n    'Forth',\n    'Perl',\n    'PHP',\n    'Scilab',\n    'bash',\n    'zsh',\n    'Clojure',\n    'Hy',\n    'Lua',\n    'PureScript',\n    'Q',\n    'Cryptol',\n    'C++',\n    'Xonsh',\n    'Prolog',\n    'Common Lisp',\n    'Maxima',\n    'C',\n    'Kotlin',\n    'Pike',\n    'NodeJS',\n    'Singular',\n    'TaQL',\n    'Coconut',\n    'Babel',\n    'Clojurescript',\n    'sbt',\n    'Guile',\n    'SAS',\n    'Stata',\n    'Racekt',\n    'SQL',\n    'HiveQL',\n    'Rust',\n    'Rascal',\n    'Q#',\n    'Markdown',\n    'Powershell',\n];\n/**\n * Language icons\n */\nconst babelIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:babel',\n    svgstr: _style_icon_language_icons_babel_svg__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n});\nconst javaIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:java',\n    svgstr: _style_icon_language_icons_java_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n});\nconst juliaIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:julia',\n    svgstr: _style_icon_language_icons_julia_svg__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n});\nconst matlabIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:matlab',\n    svgstr: _style_icon_language_icons_matlab_svg__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n});\nconst schemeIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:scheme',\n    svgstr: _style_icon_language_icons_scheme_svg__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n});\nconst processingIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:processing',\n    svgstr: _style_icon_language_icons_processing_svg__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n});\nconst scalaIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:scala',\n    svgstr: _style_icon_language_icons_scala_svg__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n});\nconst groovyIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:groovy',\n    svgstr: _style_icon_language_icons_groovy_svg__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n});\nconst fortranIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:fortran',\n    svgstr: _style_icon_language_icons_fortran_svg__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n});\nconst haskellIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:haskell',\n    svgstr: _style_icon_language_icons_haskell_svg__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n});\nconst rubyIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:ruby',\n    svgstr: _style_icon_language_icons_ruby_svg__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n});\nconst typescriptIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:typescript',\n    svgstr: _style_icon_language_icons_typescript_svg__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n});\nconst javascriptIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:javascript',\n    svgstr: _style_icon_language_icons_javascript_svg__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n});\nconst coffeescriptIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:coffeescript',\n    svgstr: _style_icon_language_icons_coffeescript_svg__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n});\nconst livescriptIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:livescript',\n    svgstr: _style_icon_language_icons_livescript_svg__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n});\nconst csharpIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:csharp',\n    svgstr: _style_icon_language_icons_csharp_svg__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n});\nconst fsharpIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:fsharp',\n    svgstr: _style_icon_language_icons_fsharp_svg__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n});\nconst goIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:go',\n    svgstr: _style_icon_language_icons_go_svg__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n});\nconst erlangIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:erlang',\n    svgstr: _style_icon_language_icons_erlang_svg__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n});\nconst ocamlIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:ocaml',\n    svgstr: _style_icon_language_icons_ocaml_svg__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n});\nconst forthIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:forth',\n    svgstr: _style_icon_language_icons_forth_svg__WEBPACK_IMPORTED_MODULE_21__[\"default\"],\n});\nconst perlIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:perl',\n    svgstr: _style_icon_language_icons_perl_svg__WEBPACK_IMPORTED_MODULE_22__[\"default\"],\n});\nconst phpIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:php',\n    svgstr: _style_icon_language_icons_php_svg__WEBPACK_IMPORTED_MODULE_23__[\"default\"],\n});\nconst clojureIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:clojure',\n    svgstr: _style_icon_language_icons_clojure_svg__WEBPACK_IMPORTED_MODULE_24__[\"default\"],\n});\nconst luaIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:lua',\n    svgstr: _style_icon_language_icons_lua_svg__WEBPACK_IMPORTED_MODULE_25__[\"default\"],\n});\nconst purescriptIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:purescript',\n    svgstr: _style_icon_language_icons_purescript_svg__WEBPACK_IMPORTED_MODULE_26__[\"default\"],\n});\nconst cppIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:cpp',\n    svgstr: _style_icon_language_icons_cpp_svg__WEBPACK_IMPORTED_MODULE_27__[\"default\"],\n});\nconst prologIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:prolog',\n    svgstr: _style_icon_language_icons_prolog_svg__WEBPACK_IMPORTED_MODULE_28__[\"default\"],\n});\nconst lispIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:lisp',\n    svgstr: _style_icon_language_icons_lisp_svg__WEBPACK_IMPORTED_MODULE_29__[\"default\"],\n});\nconst cIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:c',\n    svgstr: _style_icon_language_icons_c_svg__WEBPACK_IMPORTED_MODULE_30__[\"default\"],\n});\nconst kotlinIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:kotlin',\n    svgstr: _style_icon_language_icons_kotlin_svg__WEBPACK_IMPORTED_MODULE_31__[\"default\"],\n});\nconst nodejsIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:nodejs',\n    svgstr: _style_icon_language_icons_nodejs_svg__WEBPACK_IMPORTED_MODULE_32__[\"default\"],\n});\nconst sasIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:sas',\n    svgstr: _style_icon_language_icons_sas_svg__WEBPACK_IMPORTED_MODULE_33__[\"default\"],\n});\nconst coconutIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:coconut',\n    svgstr: _style_icon_language_icons_coconut_svg__WEBPACK_IMPORTED_MODULE_34__[\"default\"],\n});\nconst sbtIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:sbt',\n    svgstr: _style_icon_language_icons_sbt_svg__WEBPACK_IMPORTED_MODULE_35__[\"default\"],\n});\nconst rustIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:rust',\n    svgstr: _style_icon_language_icons_rust_svg__WEBPACK_IMPORTED_MODULE_36__[\"default\"],\n});\nconst qsharpIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:qsharp',\n    svgstr: _style_icon_language_icons_qsharp_svg__WEBPACK_IMPORTED_MODULE_37__[\"default\"],\n});\nconst markdownIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:markdown',\n    svgstr: _style_icon_language_icons_markdown_svg__WEBPACK_IMPORTED_MODULE_38__[\"default\"],\n});\nconst powershellIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_0__.LabIcon({\n    name: 'custom-ui-components:powershell',\n    svgstr: _style_icon_language_icons_powershell_svg__WEBPACK_IMPORTED_MODULE_39__[\"default\"],\n});\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetMenu.js\":\n/*!********************************!*\\\n  !*** ./lib/CodeSnippetMenu.js ***!\n  \\********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"OptionsMessage\": () => (/* binding */ OptionsMessage),\n/* harmony export */   \"showMoreOptions\": () => (/* binding */ showMoreOptions)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/widgets */ \"webpack/sharing/consume/default/@lumino/widgets\");\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lumino_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lumino/messaging */ \"webpack/sharing/consume/default/@lumino/messaging\");\n/* harmony import */ var _lumino_messaging__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_messaging__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/coreutils */ \"webpack/sharing/consume/default/@lumino/coreutils\");\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lumino/algorithm */ \"webpack/sharing/consume/default/@lumino/algorithm\");\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_lumino_algorithm__WEBPACK_IMPORTED_MODULE_4__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\n\n\n\n/**\n * The class name for options box\n */\nconst OPTIONS_CLASS = 'jp-codeSnippet-options';\nconst OPTIONS_CONTENT = 'jp-codeSnippet-options-content';\nconst OPTIONS_BODY = 'jp-codeSnippet-options-body';\n/**\n * Create and show a code snippet options.\n *\n * @param options - The code snippet options setup options.\n *\n * @returns A promise that resolves with whether the code snippet options was accepted.\n */\nfunction showMoreOptions(options = {}) {\n    const optionsMessage = new OptionsMessage(options);\n    return optionsMessage.launch();\n}\n/**\n * A widget used to show options message.\n */\nclass OptionsMessage extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget {\n    constructor(options = {}) {\n        super();\n        this.addClass(OPTIONS_CLASS);\n        const renderer = OptionsMessage.defaultRenderer;\n        this._host = options.host || document.body;\n        const layout = (this.layout = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.PanelLayout());\n        const content = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Panel();\n        content.addClass(OPTIONS_CONTENT);\n        layout.addWidget(content);\n        const body = renderer.createBody(options.body);\n        content.addWidget(body);\n        if (OptionsMessage.tracker.size > 0) {\n            const previous = OptionsMessage.tracker.currentWidget;\n            previous.reject();\n            OptionsMessage.tracker.dispose();\n        }\n        void OptionsMessage.tracker.add(this);\n    }\n    /**\n     * Launch the code snippet options as a modal window.\n     *\n     * @returns a promise that resolves with the result of the code snippet options.\n     */\n    launch() {\n        // Return the existing code snippet options if already open.\n        if (this._promise) {\n            return this._promise.promise;\n        }\n        const promise = (this._promise = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_3__.PromiseDelegate());\n        const promises = Promise.all(Private.launchQueue);\n        Private.launchQueue.push(this._promise.promise);\n        return promises.then(() => {\n            _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget.attach(this, this._host);\n            return promise.promise;\n        });\n    }\n    /**\n     * Handle the DOM events for the directory listing.\n     *\n     * @param event - The DOM event sent to the widget.\n     *\n     * #### Notes\n     * This method implements the DOM `EventListener` interface and is\n     * called in response to events on the panel's DOM node. It should\n     * not be called directly by user code.\n     */\n    handleEvent(event) {\n        switch (event.type) {\n            case 'click':\n                this._evtClick(event);\n                break;\n            case 'contextmenu':\n                this._evtClick(event);\n                break;\n            default:\n                break;\n        }\n    }\n    /**\n     * Handle the `'click'` event for a code snippet options button.\n     *\n     * @param event - The DOM event sent to the widget\n     */\n    _evtClick(event) {\n        const content = this.node.getElementsByClassName(OPTIONS_CONTENT)[0];\n        if (!content.contains(event.target)) {\n            event.stopPropagation();\n            event.preventDefault();\n            this.reject();\n        }\n    }\n    /**\n     * Reject the current code snippet options with a default reject value.\n     *\n     * #### Notes\n     * Will be a no-op if the code snippet options is not shown.\n     */\n    reject() {\n        if (!this._promise) {\n            return;\n        }\n        this._resolve();\n    }\n    /**\n     * Resolve a button item.\n     */\n    _resolve() {\n        // Prevent loopback.\n        const promise = this._promise;\n        if (!promise) {\n            this.dispose();\n            return;\n        }\n        this._promise = null;\n        _lumino_algorithm__WEBPACK_IMPORTED_MODULE_4__.ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n        this.dispose();\n        promise.resolve();\n    }\n    /**\n     * Dispose of the resources used by the code snippet options.\n     */\n    dispose() {\n        const promise = this._promise;\n        if (promise) {\n            this._promise = null;\n            promise.reject(void 0);\n            _lumino_algorithm__WEBPACK_IMPORTED_MODULE_4__.ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n        }\n        super.dispose();\n    }\n    /**\n     *  A message handler invoked on an `'after-attach'` message.\n     */\n    onAfterAttach(msg) {\n        const node = this.node;\n        node.addEventListener('click', this, true);\n        node.addEventListener('contextmenu', this, true);\n    }\n    /**\n     *  A message handler invoked on an `'after-detach'` message.\n     */\n    onAfterDetach(msg) {\n        const node = this.node;\n        node.removeEventListener('click', this, true);\n        node.removeEventListener('contextmenu', this, true);\n    }\n}\n(function (OptionsMessage) {\n    class Renderer {\n        /**\n         * Create the body of the code snippet options.\n         *\n         * @param value - The input value for the body.\n         *\n         * @returns A widget for the body.\n         */\n        createBody(value) {\n            let body;\n            if (typeof value === 'string') {\n                body = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget({ node: document.createElement('span') });\n                body.node.textContent = value;\n            }\n            else if (value instanceof _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget) {\n                body = value;\n            }\n            else {\n                body = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.ReactWidget.create(value);\n                // Immediately update the body even though it has not yet attached in\n                // order to trigger a render of the DOM nodes from the React element.\n                _lumino_messaging__WEBPACK_IMPORTED_MODULE_2__.MessageLoop.sendMessage(body, _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget.Msg.UpdateRequest);\n            }\n            body.addClass(OPTIONS_BODY);\n            return body;\n        }\n    }\n    OptionsMessage.Renderer = Renderer;\n    /**\n     * The default renderer instance.\n     */\n    OptionsMessage.defaultRenderer = new Renderer();\n    /**\n     * The code snippet options widget tracker.\n     */\n    OptionsMessage.tracker = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.WidgetTracker({\n        namespace: '@jupyterlab/code_snippet:OptionsWidget',\n    });\n})(OptionsMessage || (OptionsMessage = {}));\n/**\n * The namespace for module private data.\n */\nvar Private;\n(function (Private) {\n    /**\n     * The queue for launching code snippet optionss.\n     */\n    Private.launchQueue = [];\n})(Private || (Private = {}));\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetMessage.js\":\n/*!***********************************!*\\\n  !*** ./lib/CodeSnippetMessage.js ***!\n  \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetMessage\": () => (/* binding */ CodeSnippetMessage),\n/* harmony export */   \"showMessage\": () => (/* binding */ showMessage)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/widgets */ \"webpack/sharing/consume/default/@lumino/widgets\");\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _style_icon_jupyter_checkmark_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../style/icon/jupyter_checkmark.svg */ \"./style/icon/jupyter_checkmark.svg\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n// import { WidgetTracker, ReactWidget } from '@jupyterlab/apputils';\n\n\n\n/**\n * The class name for message\n */\n// const CONFIRM_CLASS = 'jp-codeSnippet-confirm';\nconst CONFIRM_CONTENT = 'jp-codeSnippet-Message-content';\nconst CONFIRM_BODY = 'jp-codeSnippet-Message-body';\nconst CODE_SNIPPET_CONFIRM_TEXT = 'jp-codeSnippet-confirm-text';\n/**\n * Create and show a dialog.\n *\n * @param options - The dialog setup options.\n *\n * @returns A promise that resolves with whether the dialog was accepted.\n */\nfunction showMessage(type) {\n    const confirmMessage = new CodeSnippetMessage({\n        body: new MessageHandler(type),\n        buttons: [],\n    });\n    return confirmMessage.launch();\n}\n/**\n * A widget used to show message.\n */\nclass CodeSnippetMessage extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog {\n    constructor(options = {}) {\n        super(options);\n        this.children().next().addClass(CONFIRM_CONTENT);\n    }\n    onAfterAttach(msg) {\n        const node = this.node;\n        node.addEventListener('click', this, true);\n        document.addEventListener('keydown', this, false);\n    }\n    /**\n     *  A message handler invoked on an `'after-detach'` message.\n     */\n    onAfterDetach(msg) {\n        const node = this.node;\n        node.removeEventListener('click', this, true);\n        document.removeEventListener('keydown', this, false);\n    }\n    handleEvent(event) {\n        switch (event.type) {\n            case 'keydown':\n                this._evtKeydown(event);\n                break;\n            case 'click':\n                this._evtClick(event);\n                break;\n        }\n    }\n    _evtKeydown(event) {\n        // Check for escape key\n        switch (event.key) {\n            case 'Escape':\n                event.stopPropagation();\n                event.preventDefault();\n                this.reject();\n                break;\n        }\n    }\n}\nclass MessageHandler extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_1__.Widget {\n    constructor(type) {\n        super({ node: Private.createMessageNode(type) });\n        this.addClass(CONFIRM_BODY);\n    }\n}\n/**\n * The namespace for module private data.\n */\nvar Private;\n(function (Private) {\n    // create a confirm message when new snippet is created successfully\n    function createMessageNode(type) {\n        const body = document.createElement('div');\n        body.innerHTML = _style_icon_jupyter_checkmark_svg__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n        const messageContainer = document.createElement('div');\n        messageContainer.className = CODE_SNIPPET_CONFIRM_TEXT;\n        const message = document.createElement('text');\n        if (type === 'confirm') {\n            message.textContent = 'Saved as Snippet!';\n        }\n        else if (type === 'copy') {\n            message.textContent = 'Saved to Clipboard!';\n        }\n        else if (type === 'export') {\n            message.textContent = 'Exported the Snippet!';\n        }\n        messageContainer.appendChild(message);\n        body.append(messageContainer);\n        return body;\n    }\n    Private.createMessageNode = createMessageNode;\n})(Private || (Private = {}));\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetPreview.js\":\n/*!***********************************!*\\\n  !*** ./lib/CodeSnippetPreview.js ***!\n  \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"Preview\": () => (/* binding */ Preview),\n/* harmony export */   \"showPreview\": () => (/* binding */ showPreview)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/codeeditor */ \"webpack/sharing/consume/default/@jupyterlab/codeeditor\");\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @lumino/widgets */ \"webpack/sharing/consume/default/@lumino/widgets\");\n/* harmony import */ var _lumino_widgets__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_lumino_widgets__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _lumino_messaging__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @lumino/messaging */ \"webpack/sharing/consume/default/@lumino/messaging\");\n/* harmony import */ var _lumino_messaging__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_lumino_messaging__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @lumino/coreutils */ \"webpack/sharing/consume/default/@lumino/coreutils\");\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lumino/algorithm */ \"webpack/sharing/consume/default/@lumino/algorithm\");\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _CodeSnippetService__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CodeSnippetService */ \"./lib/CodeSnippetService.js\");\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n\n\n\n\n\n\n/**\n * The class name for preview box.\n */\nconst PREVIEW_CLASS = 'jp-codeSnippet-preview';\nconst PREVIEW_CONTENT = 'jp-codeSnippet-preview-content';\nconst PREVIEW_BODY = 'jp-codeSnippet-preview-body';\n/**\n * Create and show a preview.\n *\n * @param options - The preview setup options.\n *\n */\nfunction showPreview(options = {}, editorServices) {\n    //Insert check method to see if the preview is already open\n    const preview = new Preview(options, editorServices);\n    if (preview.ready === false) {\n        return;\n    }\n    return preview.launch();\n}\n/**\n * A widget used to show preview\n */\nclass Preview extends _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget {\n    constructor(options = {}, editorServices) {\n        super();\n        this.ready = true;\n        this._title = options.title;\n        this._id = options.id;\n        this.codeSnippet = options.codeSnippet;\n        this.editorServices = editorServices;\n        this.codeSnippetService = _CodeSnippetService__WEBPACK_IMPORTED_MODULE_6__.CodeSnippetService.getCodeSnippetService();\n        this.addClass(PREVIEW_CLASS);\n        const layout = (this.layout = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.PanelLayout());\n        const content = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Panel();\n        content.addClass(PREVIEW_CONTENT);\n        content.id = PREVIEW_CONTENT + this._id;\n        layout.addWidget(content);\n        if (Preview.tracker.size > 0) {\n            const previous = Preview.tracker.currentWidget;\n            previous.reject();\n            Preview.tracker.dispose();\n        }\n        if (this.ready === true) {\n            void Preview.tracker.add(this);\n        }\n    }\n    /**\n     * Launch the preview as a modal window.\n     */\n    launch() {\n        // Return the existing preview if already open.\n        if (this._promise) {\n            return this._promise.promise;\n        }\n        const promise = (this._promise = new _lumino_coreutils__WEBPACK_IMPORTED_MODULE_4__.PromiseDelegate());\n        const promises = Promise.all(Private.launchQueue);\n        Private.launchQueue.push(this._promise.promise);\n        return promises.then(() => {\n            _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget.attach(this, document.getElementById('jp-main-dock-panel'));\n            return promise.promise;\n        });\n    }\n    /**\n     * Reject the current preview with a default reject value.\n     *\n     * #### Notes\n     * Will be a no-op if the preview is not shown.\n     */\n    reject() {\n        if (!this._promise) {\n            return;\n        }\n        this._resolve();\n    }\n    /**\n     * Resolve a button item.\n     */\n    _resolve() {\n        // Prevent loopback.\n        const promise = this._promise;\n        if (!promise) {\n            this.dispose();\n            return;\n        }\n        this._promise = null;\n        _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__.ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n        this.dispose();\n        promise.resolve();\n    }\n    /**\n     * Dispose of the resources used by the preview.\n     */\n    dispose() {\n        const promise = this._promise;\n        if (promise) {\n            this._promise = null;\n            promise.reject(void 0);\n            _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__.ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n        }\n        super.dispose();\n    }\n    /**\n     *  A message handler invoked on an `'after-attach'` message.\n     */\n    onAfterAttach(msg) {\n        super.onAfterAttach(msg);\n        this._hasRefreshedSinceAttach = false;\n        if (this.isVisible) {\n            this.update();\n        }\n    }\n    onAfterShow(msg) {\n        if (!this._hasRefreshedSinceAttach) {\n            this.update();\n        }\n    }\n    onUpdateRequest(msg) {\n        super.onUpdateRequest(msg);\n        if (!this.editor && document.getElementById(PREVIEW_CONTENT + this._id)) {\n            const editorFactory = this.editorServices.factoryService.newInlineEditor;\n            const getMimeTypeByLanguage = this.editorServices.mimeTypeService.getMimeTypeByLanguage;\n            let previewFontSize = this.codeSnippetService.settings.get('snippetPreviewFontSize').composite;\n            if (this.codeSnippetService.settings.get('snippetPreviewFontSize').user !==\n                undefined) {\n                previewFontSize = this.codeSnippetService.settings.get('snippetPreviewFontSize').user;\n            }\n            this.editor = editorFactory({\n                host: document.getElementById(PREVIEW_CONTENT + this._id),\n                config: { readOnly: true, fontSize: previewFontSize },\n                model: new _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_1__.CodeEditor.Model({\n                    value: this.codeSnippet.code,\n                    mimeType: getMimeTypeByLanguage({\n                        name: this.codeSnippet.language,\n                        codemirror_mode: this.codeSnippet.language,\n                    }),\n                }),\n            });\n        }\n        if (this.isVisible) {\n            this._hasRefreshedSinceAttach = true;\n            this.editor.refresh();\n        }\n    }\n}\n(function (Preview) {\n    class Renderer {\n        /**\n         * Create the body of the preview.\n         *\n         * @param value - The input value for the body.\n         *\n         * @returns A widget for the body.\n         */\n        createBody(value) {\n            let body;\n            if (typeof value === 'string') {\n                body = new _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget({ node: document.createElement('span') });\n                body.node.textContent = value;\n            }\n            else if (value instanceof _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget) {\n                body = value;\n            }\n            else {\n                body = _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.ReactWidget.create(value);\n                // Immediately update the body even though it has not yet attached in\n                // order to trigger a render of the DOM nodes from the React element.\n                _lumino_messaging__WEBPACK_IMPORTED_MODULE_3__.MessageLoop.sendMessage(body, _lumino_widgets__WEBPACK_IMPORTED_MODULE_2__.Widget.Msg.UpdateRequest);\n            }\n            body.addClass(PREVIEW_BODY);\n            return body;\n        }\n    }\n    Preview.Renderer = Renderer;\n    /**\n     * The default renderer instance.\n     */\n    Preview.defaultRenderer = new Renderer();\n    /**\n     * The preview widget tracker.\n     */\n    Preview.tracker = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.WidgetTracker({\n        namespace: '@jupyterlab/code_snippet:preview',\n    });\n})(Preview || (Preview = {}));\n/**\n * The namespace for module private data.\n */\nvar Private;\n(function (Private) {\n    /**\n     * The queue for launching previews.\n     */\n    Private.launchQueue = [];\n})(Private || (Private = {}));\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetService.js\":\n/*!***********************************!*\\\n  !*** ./lib/CodeSnippetService.js ***!\n  \\***********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetService\": () => (/* binding */ CodeSnippetService)\n/* harmony export */ });\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @lumino/coreutils */ \"webpack/sharing/consume/default/@lumino/coreutils\");\n/* harmony import */ var _lumino_coreutils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _CodeSnippetWidget__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CodeSnippetWidget */ \"./lib/CodeSnippetWidget.js\");\n\n\nclass CodeSnippetService {\n    constructor(settings, app) {\n        this.settingManager = settings;\n        // when user changes the snippets using settingsEditor\n        this.settingManager.changed.connect(async (plugin) => {\n            const newCodeSnippetList = plugin.get('snippets').user;\n            if (!_lumino_coreutils__WEBPACK_IMPORTED_MODULE_0__.JSONExt.deepEqual(newCodeSnippetList, this.codeSnippetList)) {\n                this.codeSnippetList = this.convertToICodeSnippetList(newCodeSnippetList);\n                const leftWidgets = app.shell.widgets('left').iter();\n                let current = leftWidgets.next();\n                while (current) {\n                    if (current instanceof _CodeSnippetWidget__WEBPACK_IMPORTED_MODULE_1__.CodeSnippetWidget) {\n                        current.updateCodeSnippetWidget();\n                        break;\n                    }\n                    current = leftWidgets.next();\n                }\n                // order code snippet and sync it with setting\n                this.orderSnippets();\n                await plugin\n                    .set('snippets', this.codeSnippetList)\n                    .catch((e) => {\n                    console.log('Error in syncing orders of snippets with those in settings');\n                    console.log(e);\n                });\n            }\n        });\n        // load user's saved snippets\n        if (this.settingManager.get('snippets').user) {\n            const userSnippets = this.convertToICodeSnippetList(this.settingManager.get('snippets').user);\n            this.codeSnippetList = userSnippets;\n        }\n        // set default preview font size\n        if (this.settingManager.get('snippetPreviewFontSize').user === undefined) {\n            this.settingManager.set('snippetPreviewFontSize', this.settingManager.default('snippetPreviewFontSize'));\n        }\n    }\n    convertToICodeSnippetList(snippets) {\n        const snippetList = [];\n        snippets.forEach((snippet) => {\n            const newSnippet = snippet;\n            snippetList.push(newSnippet);\n        });\n        return snippetList;\n    }\n    static init(settings, app) {\n        if (!this.codeSnippetService) {\n            this.codeSnippetService = new CodeSnippetService(settings, app);\n        }\n    }\n    static getCodeSnippetService() {\n        return this.codeSnippetService;\n    }\n    get settings() {\n        return this.settingManager;\n    }\n    get snippets() {\n        return this.codeSnippetList;\n    }\n    getSnippetByName(snippetName) {\n        return this.codeSnippetList.filter((snippet) => snippet.name.toLowerCase() === snippetName.toLowerCase());\n    }\n    async addSnippet(snippet) {\n        const id = snippet.id;\n        this.codeSnippetList.splice(id, 0, snippet);\n        const numSnippets = this.codeSnippetList.length;\n        // update id's of snippets.\n        let i = id + 1;\n        for (; i < numSnippets; i++) {\n            this.codeSnippetList[i].id += 1;\n        }\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n    async deleteSnippet(id) {\n        let numSnippets = this.codeSnippetList.length;\n        // should never satisfy this condition\n        if (id >= numSnippets) {\n            console.log('error in codeSnippetService');\n        }\n        if (id === numSnippets - 1) {\n            this.codeSnippetList.pop();\n        }\n        else {\n            this.codeSnippetList.splice(id, 1);\n            numSnippets = this.codeSnippetList.length;\n            let i = id;\n            for (; i < numSnippets; i++) {\n                this.codeSnippetList[i].id -= 1;\n            }\n        }\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n    async renameSnippet(oldName, newName) {\n        for (const snippet of this.codeSnippetList) {\n            if (snippet.name === oldName) {\n                snippet.name = newName;\n                break;\n            }\n        }\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n    duplicateNameExists(newName) {\n        for (const snippet of this.codeSnippetList) {\n            if (snippet.name.toLowerCase() === newName.toLowerCase()) {\n                return true;\n            }\n        }\n        return false;\n    }\n    async modifyExistingSnippet(oldName, newSnippet) {\n        for (const snippet of this.codeSnippetList) {\n            if (snippet.name.toLowerCase() === oldName.toLowerCase()) {\n                this.codeSnippetList.splice(snippet.id, 1, newSnippet);\n                break;\n            }\n        }\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n    async moveSnippet(fromIdx, toIdx) {\n        if (toIdx > fromIdx) {\n            toIdx = toIdx - 1;\n        }\n        if (toIdx === fromIdx) {\n            return;\n        }\n        const snippetToMove = this.codeSnippetList[fromIdx];\n        this.deleteSnippet(fromIdx).then((res) => {\n            if (!res) {\n                console.log('Error in moving snippet(delete)');\n                return false;\n            }\n        });\n        snippetToMove.id = toIdx;\n        this.addSnippet(snippetToMove).then((res) => {\n            if (!res) {\n                console.log('Error in moving snippet(add)');\n                return false;\n            }\n        });\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n    // order snippets just in case when it gets shared between users\n    async orderSnippets() {\n        this.codeSnippetList.sort((a, b) => a.id - b.id);\n        this.codeSnippetList.forEach((snippet, i) => (snippet.id = i));\n        await this.settingManager\n            .set('snippets', this.codeSnippetList)\n            .catch((_) => {\n            return false;\n        });\n        return true;\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetUtilities.js\":\n/*!*************************************!*\\\n  !*** ./lib/CodeSnippetUtilities.js ***!\n  \\*************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"saveOverWriteFile\": () => (/* binding */ saveOverWriteFile),\n/* harmony export */   \"validateInputs\": () => (/* binding */ validateInputs)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CodeSnippetLanguages */ \"./lib/CodeSnippetLanguages.js\");\n\n\n/**\n * Test whether user typed in all required inputs.\n */\nfunction validateInputs(name, description, language) {\n    let status = true;\n    let message = '';\n    if (name === '') {\n        message += 'Name must be filled out\\n';\n        status = false;\n    }\n    if (language === '') {\n        message += 'Language must be filled out';\n        status = false;\n    }\n    if (!_CodeSnippetLanguages__WEBPACK_IMPORTED_MODULE_1__.SUPPORTED_LANGUAGES.includes(language)) {\n        message += 'Language must be one of the options';\n        status = false;\n    }\n    if (status === false) {\n        alert(message);\n    }\n    return status;\n}\n/**\n * Rename a file, warning for overwriting another.\n */\nasync function saveOverWriteFile(codeSnippetManager, oldSnippet, newSnippet) {\n    const newName = newSnippet.name;\n    return await shouldOverwrite(newName).then((res) => {\n        if (res) {\n            newSnippet.id = oldSnippet.id;\n            codeSnippetManager.deleteSnippet(oldSnippet.id).then((res) => {\n                if (!res) {\n                    console.log('Error in overwriting a snippet (delete)');\n                    return false;\n                }\n            });\n            codeSnippetManager.addSnippet(newSnippet).then((res) => {\n                if (!res) {\n                    console.log('Error in overwriting a snippet (add)');\n                    return false;\n                }\n            });\n            return true;\n        }\n    });\n}\n/**\n * Ask the user whether to overwrite a file.\n */\nasync function shouldOverwrite(newName) {\n    const options = {\n        title: 'Overwrite code snippet?',\n        body: `\"${newName}\" already exists, overwrite?`,\n        buttons: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.cancelButton(), _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.Dialog.warnButton({ label: 'Overwrite' })],\n    };\n    return (0,_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.showDialog)(options).then((result) => {\n        return result.button.accept;\n    });\n}\n\n\n/***/ }),\n\n/***/ \"./lib/CodeSnippetWidget.js\":\n/*!**********************************!*\\\n  !*** ./lib/CodeSnippetWidget.js ***!\n  \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"CodeSnippetWidget\": () => (/* binding */ CodeSnippetWidget)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lumino_signaling__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @lumino/signaling */ \"webpack/sharing/consume/default/@lumino/signaling\");\n/* harmony import */ var _lumino_signaling__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lumino_signaling__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _CodeSnippetService__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CodeSnippetService */ \"./lib/CodeSnippetService.js\");\n/* harmony import */ var _CodeSnippetDisplay__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CodeSnippetDisplay */ \"./lib/CodeSnippetDisplay.js\");\n/* harmony import */ var _CodeSnippetInputDialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CodeSnippetInputDialog */ \"./lib/CodeSnippetInputDialog.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"webpack/sharing/consume/default/react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n// Some lines of code are from Elyra Code Snippet.\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\n\n\n\n\n\n/**\n * A class used to indicate a snippet item.\n */\nconst CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';\n/**\n * The mimetype used for Jupyter cell data.\n */\nconst JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';\n/**\n * A class used to indicate a drop target.\n */\nconst DROP_TARGET_CLASS = 'jp-codeSnippet-dropTarget';\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';\nconst commands = {\n    OPEN_CODE_SNIPPET_EDITOR: `${CODE_SNIPPET_EDITOR}:open`,\n};\n/**\n * A widget for Code Snippets.\n */\nclass CodeSnippetWidget extends _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.ReactWidget {\n    constructor(getCurrentWidget, app, editorServices) {\n        super();\n        this.app = app;\n        this.editorServices = editorServices;\n        this.getCurrentWidget = getCurrentWidget;\n        this.renderCodeSnippetsSignal = new _lumino_signaling__WEBPACK_IMPORTED_MODULE_1__.Signal(this);\n        this.codeSnippetManager = _CodeSnippetService__WEBPACK_IMPORTED_MODULE_3__.CodeSnippetService.getCodeSnippetService();\n        this.moveCodeSnippet = this.moveCodeSnippet.bind(this);\n        this.openCodeSnippetEditor = this.openCodeSnippetEditor.bind(this);\n        this.updateCodeSnippetWidget = this.updateCodeSnippetWidget.bind(this);\n        this.node.setAttribute('data-lm-dragscroll', 'true');\n    }\n    updateCodeSnippetWidget() {\n        if (this.codeSnippetManager) {\n            const newSnippets = this.codeSnippetManager.snippets;\n            newSnippets && this.renderCodeSnippetsSignal.emit(newSnippets);\n        }\n    }\n    onAfterShow(msg) {\n        this.updateCodeSnippetWidget();\n    }\n    openCodeSnippetEditor(args) {\n        this.app.commands.execute(commands.OPEN_CODE_SNIPPET_EDITOR, args);\n    }\n    /**\n     * Handle the DOM events for the widget.\n     *\n     * @param event - The DOM event sent to the widget.\n     *\n     * #### Notes\n     * This method implements the DOM `EventListener` interface and is\n     * called in response to events on the notebook panel's node. It should\n     * not be called directly by user code.\n     */\n    handleEvent(event) {\n        switch (event.type) {\n            case 'lm-dragenter':\n                this._evtDragEnter(event);\n                break;\n            case 'lm-dragleave':\n                this._evtDragLeave(event);\n                break;\n            case 'lm-dragover':\n                this._evtDragOver(event);\n                break;\n            case 'lm-drop':\n                this._evtDrop(event);\n                break;\n            default:\n                break;\n        }\n    }\n    /**\n     * A message handler invoked on an `'after-attach'` message.\n     * @param msg\n     */\n    onAfterAttach(msg) {\n        super.onAfterAttach(msg);\n        const node = this.node;\n        node.addEventListener('lm-dragenter', this);\n        node.addEventListener('lm-dragleave', this);\n        node.addEventListener('lm-dragover', this);\n        node.addEventListener('lm-drop', this);\n    }\n    /**\n     * Handle `before-detach` messages for the widget.\n     * @param msg\n     */\n    onBeforeDetach(msg) {\n        const node = this.node;\n        node.removeEventListener('lm-dragenter', this);\n        node.removeEventListener('lm-dragleave', this);\n        node.removeEventListener('lm-dragover', this);\n        node.removeEventListener('lm-drop', this);\n    }\n    /**\n     * Find the snippet containing the target html element.\n     *\n     * #### Notes\n     * Returns undefined if the cell is not found.\n     */\n    _findSnippet(node) {\n        // Trace up the DOM hierarchy to find the root cell node.\n        // Then find the corresponding child and select it.\n        let n = node;\n        while (n && n !== this.node) {\n            if (n.classList.contains(CODE_SNIPPET_ITEM)) {\n                return n;\n            }\n            n = n.parentElement;\n        }\n        return undefined;\n    }\n    /**\n     * Handle the `'lm-dragenter'` event for the widget.\n     */\n    _evtDragEnter(event) {\n        if (!event.mimeData.hasData(JUPYTER_CELL_MIME)) {\n            return;\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        const target = event.target;\n        if (!event.mimeData.hasData('snippet/id')) {\n            const snippetId = target.id.slice(CODE_SNIPPET_DRAG_HOVER.length);\n            event.mimeData.setData('snippet/id', parseInt(snippetId));\n        }\n        const snippet = this._findSnippet(target);\n        if (snippet === undefined) {\n            return;\n        }\n        const snippetNode = snippet;\n        snippetNode.classList.add(DROP_TARGET_CLASS);\n    }\n    /**\n     * Handle the `'lm-dragleave'` event for the widget.\n     */\n    _evtDragLeave(event) {\n        if (!event.mimeData.hasData(JUPYTER_CELL_MIME)) {\n            return;\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        const elements = this.node.getElementsByClassName(DROP_TARGET_CLASS);\n        if (elements.length) {\n            elements[0].classList.remove(DROP_TARGET_CLASS);\n        }\n    }\n    /**\n     * Handle the `'lm-dragover'` event for the widget.\n     */\n    _evtDragOver(event) {\n        const data = this.findCellData(event.mimeData);\n        if (data === undefined) {\n            return;\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        event.dropAction = event.proposedAction;\n        const elements = this.node.getElementsByClassName(DROP_TARGET_CLASS);\n        if (elements.length) {\n            elements[0].classList.remove(DROP_TARGET_CLASS);\n        }\n        const target = event.target;\n        const snippet = this._findSnippet(target);\n        if (snippet === undefined) {\n            return;\n        }\n        const snippetNode = snippet;\n        snippetNode.classList.add(DROP_TARGET_CLASS);\n    }\n    findCellData(mime) {\n        const code = mime.getData('text/plain');\n        return code;\n    }\n    /**\n     * Handle the `'lm-drop'` event for the widget.\n     */\n    async _evtDrop(event) {\n        const data = this.findCellData(event.mimeData);\n        if (data === undefined) {\n            return;\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        if (event.proposedAction === 'none') {\n            event.dropAction = 'none';\n            return;\n        }\n        let target = event.target;\n        while (target && target.parentElement) {\n            if (target.classList.contains(DROP_TARGET_CLASS)) {\n                target.classList.remove(DROP_TARGET_CLASS);\n                break;\n            }\n            target = target.parentElement;\n        }\n        const snippet = this._findSnippet(target);\n        // if target is CodeSnippetWidget, then snippet is undefined\n        let idx;\n        if (snippet !== undefined) {\n            idx = parseInt(snippet.id.slice(CODE_SNIPPET_ITEM.length));\n        }\n        else {\n            idx = this.codeSnippetManager.snippets.length;\n        }\n        /**\n         * moving snippets inside the snippet panel\n         */\n        const source = event.source;\n        if (source instanceof _CodeSnippetDisplay__WEBPACK_IMPORTED_MODULE_4__.CodeSnippetDisplay) {\n            event.dropAction = 'move';\n            if (event.mimeData.hasData('snippet/id')) {\n                const srcIdx = event.mimeData.getData('snippet/id');\n                this.moveCodeSnippet(srcIdx, idx);\n            }\n        }\n        else {\n            const notebook = event.mimeData.getData('internal:cells')[0].parent;\n            const language = notebook.model.defaultKernelLanguage;\n            // Handle the case where we are copying cells\n            event.dropAction = 'copy';\n            (0,_CodeSnippetInputDialog__WEBPACK_IMPORTED_MODULE_5__.CodeSnippetInputDialog)(this, data, language, idx);\n        }\n        // Reorder snippet just to make sure id's are in order.\n        this.codeSnippetManager.orderSnippets().then((res) => {\n            if (!res) {\n                console.log('Error in ordering snippets');\n                return;\n            }\n        });\n    }\n    // move code snippet within code snippet explorer\n    moveCodeSnippet(srcIdx, targetIdx) {\n        this.codeSnippetManager\n            .moveSnippet(srcIdx, targetIdx)\n            .then((res) => {\n            if (!res) {\n                console.log('Error in moving snippet');\n                return;\n            }\n        });\n        const newSnippets = this.codeSnippetManager.snippets;\n        this.renderCodeSnippetsSignal.emit(newSnippets);\n    }\n    render() {\n        return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_0__.UseSignal, { signal: this.renderCodeSnippetsSignal, initialArgs: [] }, (_, codeSnippets) => (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(\"div\", null,\n            react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_CodeSnippetDisplay__WEBPACK_IMPORTED_MODULE_4__.CodeSnippetDisplay, { codeSnippets: codeSnippets, codeSnippetManager: this.codeSnippetManager, app: this.app, getCurrentWidget: this.getCurrentWidget, openCodeSnippetEditor: this.openCodeSnippetEditor, editorServices: this.editorServices, updateCodeSnippetWidget: this.updateCodeSnippetWidget })))));\n    }\n}\n\n\n/***/ }),\n\n/***/ \"./lib/index.js\":\n/*!**********************!*\\\n  !*** ./lib/index.js ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @jupyterlab/application */ \"webpack/sharing/consume/default/@jupyterlab/application\");\n/* harmony import */ var _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @jupyterlab/apputils */ \"webpack/sharing/consume/default/@jupyterlab/apputils\");\n/* harmony import */ var _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jupyterlab/settingregistry */ \"webpack/sharing/consume/default/@jupyterlab/settingregistry\");\n/* harmony import */ var _jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @jupyterlab/codeeditor */ \"webpack/sharing/consume/default/@jupyterlab/codeeditor\");\n/* harmony import */ var _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @jupyterlab/ui-components */ \"webpack/sharing/consume/default/@jupyterlab/ui-components\");\n/* harmony import */ var _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @lumino/algorithm */ \"webpack/sharing/consume/default/@lumino/algorithm\");\n/* harmony import */ var _lumino_algorithm__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _style_icon_jupyter_snippeteditoricon_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../style/icon/jupyter_snippeteditoricon.svg */ \"./style/icon/jupyter_snippeteditoricon.svg\");\n/* harmony import */ var _style_icon_jupyter_snippeticon_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../style/icon/jupyter_snippeticon.svg */ \"./style/icon/jupyter_snippeticon.svg\");\n/* harmony import */ var _CodeSnippetInputDialog__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CodeSnippetInputDialog */ \"./lib/CodeSnippetInputDialog.js\");\n/* harmony import */ var _CodeSnippetWidget__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./CodeSnippetWidget */ \"./lib/CodeSnippetWidget.js\");\n/* harmony import */ var _CodeSnippetEditor__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./CodeSnippetEditor */ \"./lib/CodeSnippetEditor.js\");\n/* harmony import */ var _CodeSnippetService__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./CodeSnippetService */ \"./lib/CodeSnippetService.js\");\n/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @jupyterlab/notebook */ \"webpack/sharing/consume/default/@jupyterlab/notebook\");\n/* harmony import */ var _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @jupyterlab/docregistry */ \"webpack/sharing/consume/default/@jupyterlab/docregistry\");\n/* harmony import */ var _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_7__);\n// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n// Some lines of code are from Elyra Code Snippet.\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Code Snippet Constants\nconst CODE_SNIPPET_EXTENSION_ID = 'code-snippet-extension';\nconst CODE_SNIPPET_SETTING_ID = 'jupyterlab-code-snippets:snippets';\n/**\n * Snippet Editor Icon\n */\nconst editorIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__.LabIcon({\n    name: 'custom-ui-components:codeSnippetEditorIcon',\n    svgstr: _style_icon_jupyter_snippeteditoricon_svg__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n});\n/**\n * Snippet Icon\n */\nconst codeSnippetIcon = new _jupyterlab_ui_components__WEBPACK_IMPORTED_MODULE_4__.LabIcon({\n    name: 'custom-ui-components:codeSnippetIcon',\n    svgstr: _style_icon_jupyter_snippeticon_svg__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n});\n/**\n * Initialization data for the code_snippets extension.\n */\nconst code_snippet_extension = {\n    id: CODE_SNIPPET_EXTENSION_ID,\n    autoStart: true,\n    requires: [_jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.ICommandPalette, _jupyterlab_application__WEBPACK_IMPORTED_MODULE_0__.ILayoutRestorer, _jupyterlab_codeeditor__WEBPACK_IMPORTED_MODULE_3__.IEditorServices],\n    activate: activateCodeSnippet,\n};\nfunction activateCodeSnippet(app, palette, restorer, editorServices) {\n    console.log('JupyterLab extension jupyterlab-code-snippets is activated!');\n    const getCurrentWidget = () => {\n        return app.shell.currentWidget;\n    };\n    const codeSnippetWidget = new _CodeSnippetWidget__WEBPACK_IMPORTED_MODULE_10__.CodeSnippetWidget(getCurrentWidget, app, editorServices);\n    codeSnippetWidget.id = CODE_SNIPPET_EXTENSION_ID;\n    codeSnippetWidget.title.icon = codeSnippetIcon;\n    codeSnippetWidget.title.caption = 'Code Snippet Explorer';\n    restorer.add(codeSnippetWidget, CODE_SNIPPET_EXTENSION_ID);\n    // Rank has been chosen somewhat arbitrarily to give priority to the running\n    // sessions widget in the sidebar.\n    app.shell.add(codeSnippetWidget, 'left', { rank: 900 });\n    // open code Snippet Editor\n    const openCodeSnippetEditor = (args) => {\n        // codeSnippetEditors are in the main area\n        const widgetId = `jp-codeSnippet-editor-${args.id}`;\n        // when the editor is already open\n        const openEditor = (0,_lumino_algorithm__WEBPACK_IMPORTED_MODULE_5__.find)(app.shell.widgets('main'), (widget, _) => {\n            return widget.id === widgetId;\n        });\n        if (openEditor) {\n            app.shell.activateById(widgetId);\n            return;\n        }\n        const codeSnippetEditor = new _CodeSnippetEditor__WEBPACK_IMPORTED_MODULE_11__.CodeSnippetEditor(editorServices, tracker, codeSnippetWidget, args);\n        codeSnippetEditor.id = widgetId;\n        codeSnippetEditor.addClass(widgetId);\n        codeSnippetEditor.title.label =\n            args.name === ''\n                ? 'New Code Snippet'\n                : '[' + args.language + '] ' + args.name;\n        codeSnippetEditor.title.closable = true;\n        codeSnippetEditor.title.icon = editorIcon;\n        if (!tracker.has(codeSnippetEditor)) {\n            tracker.add(codeSnippetEditor);\n        }\n        if (!codeSnippetEditor.isAttached) {\n            app.shell.add(codeSnippetEditor, 'main', {\n                mode: 'tab-after',\n            });\n        }\n        // Activate the code Snippet Editor\n        app.shell.activateById(codeSnippetEditor.id);\n    };\n    const editorSaveCommand = 'jp-codeSnippet-editor:save';\n    app.commands.addCommand(editorSaveCommand, {\n        execute: () => {\n            const editor = tracker.currentWidget;\n            editor.updateSnippet();\n        },\n    });\n    // Add keybinding to save\n    app.commands.addKeyBinding({\n        command: editorSaveCommand,\n        args: {},\n        keys: ['Accel S'],\n        selector: '.jp-codeSnippet-editor',\n    });\n    const editorCommand = 'jp-codeSnippet-editor:open';\n    app.commands.addCommand(editorCommand, {\n        execute: (args) => {\n            openCodeSnippetEditor(args);\n        },\n    });\n    // Add an application command\n    const saveCommand = 'codeSnippet:save-as-snippet';\n    const toggled = false;\n    app.commands.addCommand(saveCommand, {\n        label: 'Save As Code Snippet',\n        isEnabled: () => true,\n        isVisible: () => true,\n        isToggled: () => toggled,\n        iconClass: 'some-css-icon-class',\n        execute: () => {\n            let language = '';\n            // get the language of document or notebook\n            if (app.shell.currentWidget instanceof _jupyterlab_notebook__WEBPACK_IMPORTED_MODULE_6__.NotebookPanel) {\n                language = app.shell.currentWidget.sessionContext\n                    .kernelPreference.language;\n            }\n            else if (app.shell.currentWidget instanceof _jupyterlab_docregistry__WEBPACK_IMPORTED_MODULE_7__.DocumentWidget) {\n                language = app.shell.currentWidget.context.model\n                    .defaultKernelLanguage;\n            }\n            const highlightedCode = getSelectedText();\n            if (highlightedCode === '') {\n                //if user just right-clicks cell(s) to save\n                const curr = document.getElementsByClassName('jp-Cell jp-mod-selected');\n                let code = '';\n                // changed i = 1 to i = 0.\n                for (let i = 0; i < curr.length; i++) {\n                    //loop through each cell\n                    const text = curr[i];\n                    const cellInputWrappers = text.getElementsByClassName('jp-Cell-inputWrapper');\n                    for (const cellInputWrapper of cellInputWrappers) {\n                        const codeLines = cellInputWrapper.querySelectorAll('.CodeMirror-line');\n                        for (const codeLine of codeLines) {\n                            let codeLineText = codeLine.textContent;\n                            if (codeLineText.charCodeAt(0) === 8203) {\n                                //check if first char in line is invalid\n                                codeLineText = ''; //replace invalid line with empty string\n                            }\n                            code += codeLineText + '\\n';\n                        }\n                    }\n                }\n                (0,_CodeSnippetInputDialog__WEBPACK_IMPORTED_MODULE_12__.CodeSnippetInputDialog)(codeSnippetWidget, code, language, codeSnippetWidget.codeSnippetManager.snippets.length);\n            }\n            else {\n                (0,_CodeSnippetInputDialog__WEBPACK_IMPORTED_MODULE_12__.CodeSnippetInputDialog)(codeSnippetWidget, highlightedCode, language, codeSnippetWidget.codeSnippetManager.snippets.length);\n            }\n        },\n    });\n    // Put the saveCommand above in context menu\n    app.contextMenu.addItem({\n        type: 'separator',\n        selector: '.jp-Notebook',\n        rank: 13,\n    });\n    app.contextMenu.addItem({\n        command: saveCommand,\n        selector: '.jp-Notebook',\n        rank: 14,\n    });\n    app.contextMenu.addItem({\n        type: 'separator',\n        selector: '.jp-Notebook',\n        rank: 15,\n    });\n    // Put the saveCommand in non-notebook file context menu\n    app.contextMenu.addItem({\n        type: 'separator',\n        selector: '.jp-FileEditor',\n        rank: 7,\n    });\n    app.contextMenu.addItem({\n        command: saveCommand,\n        selector: '.jp-FileEditor',\n        rank: 8,\n    });\n    app.contextMenu.addItem({\n        type: 'separator',\n        selector: '.jp-FileEditor',\n        rank: 9,\n    });\n    // Track and restore the widget state\n    const tracker = new _jupyterlab_apputils__WEBPACK_IMPORTED_MODULE_1__.WidgetTracker({\n        namespace: 'codeSnippetEditor',\n    });\n    restorer.restore(tracker, {\n        command: editorCommand,\n        args: (widget) => {\n            const editorMetadata = widget.codeSnippetEditorMetadata;\n            return {\n                name: editorMetadata.name,\n                description: editorMetadata.description,\n                language: editorMetadata.language,\n                code: editorMetadata.code,\n                id: editorMetadata.id,\n                tags: editorMetadata.tags,\n                allSnippetTags: editorMetadata.allSnippetTags,\n                allLangTags: editorMetadata.allLangTags,\n                fromScratch: editorMetadata.fromScratch,\n            };\n        },\n        name: (widget) => {\n            return widget.id;\n        },\n    });\n}\nconst codeSnippetExtensionSetting = {\n    id: CODE_SNIPPET_SETTING_ID,\n    autoStart: true,\n    requires: [_jupyterlab_settingregistry__WEBPACK_IMPORTED_MODULE_2__.ISettingRegistry],\n    activate: (app, settingRegistry) => {\n        void settingRegistry\n            .load(CODE_SNIPPET_SETTING_ID)\n            .then((settings) => {\n            _CodeSnippetService__WEBPACK_IMPORTED_MODULE_13__.CodeSnippetService.init(settings, app);\n            console.log('JupyterLab extension jupyterlab-code-snippets setting is activated!');\n        })\n            .catch((e) => console.log(e));\n    },\n};\nfunction getSelectedText() {\n    let selectedText;\n    // window.getSelection\n    if (window.getSelection) {\n        selectedText = window.getSelection();\n    }\n    // document.getSelection\n    else if (document.getSelection) {\n        selectedText = document.getSelection();\n    }\n    return selectedText.toString();\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ([code_snippet_extension, codeSnippetExtensionSetting]);\n\n\n/***/ }),\n\n/***/ \"./style/icon/jupyter_checkmark.svg\":\n/*!******************************************!*\\\n  !*** ./style/icon/jupyter_checkmark.svg ***!\n  \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM8 15L3 10L4.41 8.59L8 12.17L15.59 4.58L17 6L8 15Z\\\" fill=\\\"#388E3C\\\"/>\\n</svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/jupyter_moreicon.svg\":\n/*!*****************************************!*\\\n  !*** ./style/icon/jupyter_moreicon.svg ***!\n  \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M6 10C4.9 10 4 10.9 4 12C4 13.1 4.9 14 6 14C7.1 14 8 13.1 8 12C8 10.9 7.1 10 6 10ZM18 10C16.9 10 16 10.9 16 12C16 13.1 16.9 14 18 14C19.1 14 20 13.1 20 12C20 10.9 19.1 10 18 10ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10Z\\\" fill=\\\"#616161\\\"/>\\n</svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/jupyter_snippeteditoricon.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/jupyter_snippeteditoricon.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"13\\\" height=\\\"13\\\" viewBox=\\\"0 0 13 13\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<rect x=\\\"0.5\\\" y=\\\"0.5\\\" width=\\\"12\\\" height=\\\"12\\\" fill=\\\"white\\\" stroke=\\\"#0097A7\\\"/>\\n<path d=\\\"M6.79894 3.5L7.45729 3.63333L6.20106 9.5L5.54271 9.36667L6.79894 3.5ZM9.04942 6.5L7.84357 5.30333V4.36L10 6.5L7.84357 8.63667V7.69333L9.04942 6.5ZM3 6.5L5.15643 4.36V5.30333L3.95058 6.5L5.15643 7.69333V8.63667L3 6.5Z\\\" fill=\\\"#0097A7\\\"/>\\n</svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/jupyter_snippeticon.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/jupyter_snippeticon.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"22\\\" height=\\\"18\\\" viewBox=\\\"0 0 22 18\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path class=\\\"jp-icon3\\\" d=\\\"M11.89 0L13.85 0.4L10.11 18L8.14996 17.6L11.89 0ZM18.59 9L15 5.41V2.58L21.42 9L15 15.41V12.58L18.59 9ZM0.579956 9L6.99996 2.58V5.41L3.40996 9L6.99996 12.58V15.41L0.579956 9Z\\\" fill=\\\"#616161\\\"/>\\n</svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/babel.svg\":\n/*!*********************************************!*\\\n  !*** ./style/icon/language_icons/babel.svg ***!\n  \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m18.23 11.21c-.03-.16-.47-.71-1.32-1.65-.02-.19.29-.45.9-.8l1.74-1.55c.39-.5.62-1.28.69-2.38l-.02-.26c-.07-.78-.63-1.4-1.69-1.89-.63-.42-1.76-.65-3.38-.68-1.35.11-3.11.59-5.28 1.43-.6.43-1.28.86-2.04 1.28l.01.14.21-.08c.08-.01.13.03.14.11l.13-.07.07-.01.01.06c0 .07-.47.44-1.76 1.35l-.06.12c-.31.02-.61.25-.91.67l.08.12.25-.09.18.24c.32-.33.66-.62 1.03-.87.19.05.29.11.44.16 1.02-.75 2.03-1.3 3.04-1.64l.01.14c-.2.27-.32.42-.38.42l.1.23c.01.19-2.55 7-6.66 14.44l.08.19c.35-.08.58-.17.75-.26l.01.13.4-.03-.67 1.76.14.06c.57-.64 1-1.29 1.3-1.88 1.67-.49 2.94-.97 3.82-1.44.88-.08 1.56-.31 2.02-.7l.92-.47c1.27-.98 2.22-1.67 2.87-2.08 1.33-.98 2.2-1.93 2.6-2.85l.23-1.37m-3.46 2.31-1.77 1.39c-1.29.85-2 1.3-2.09 1.3-2.07 1.13-3.36 1.72-3.86 1.76l-.05.01c.04-.23.96-2.12 2.75-5.67.78-.06 2.02-.43 3.71-1.1l.41-.03c.85-.08 1.49.09 1.91.49l.03.26c-.31.9-.67 1.44-1.04 1.59m1.09-5.78c-.18.22-.68.59-1.5 1.11-.27.03-1.27.42-3.01 1.18l-.28-.05-.01-.12c-.02-.25.09-.57.34-.95.13-.7.28-1.12.44-1.2l1.45-3.28c-.02-.22.29-.35.93-.46l.21-.02.01.18 1.16-.16c1.15-.1 1.75.14 1.8.7l.13-.02-.03-.32.15-.02c.35.19.52.4.54.68.02.18-.08.41-.29.68-.09.01-.14-.06-.15-.18l-.14.01-.03.4c-.58.87-1.01 1.31-1.27 1.34z\\\" style=\\\"fill:#fdd835\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/c.svg\":\n/*!*****************************************!*\\\n  !*** ./style/icon/language_icons/c.svg ***!\n  \\*****************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m16.45 15.97.42 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.14-1.27-1.68-2.88-1.68-4.83.04-2.31.72-4.08 2.04-5.32 1.28-1.25 2.92-1.89 4.9-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.6 2.49-1.04-.34c-.4-.1-.87-.15-1.4-.15-1.15-.01-2.11.36-2.86 1.1-.76.73-1.14 1.85-1.18 3.34.01 1.36.37 2.42 1.08 3.2.71.77 1.7 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.09-.32z\\\" style=\\\"fill:#0277bd\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/clojure.svg\":\n/*!***********************************************!*\\\n  !*** ./style/icon/language_icons/clojure.svg ***!\n  \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 256 256\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><g transform=\\\"matrix(.94843 0 0 .94843 6.4961 6.3946)\\\"><g><path d=\\\"m123.32 130.3c-1.15 2.492-2.419 5.292-3.733 8.272-4.645 10.524-9.789 23.33-11.668 31.534-.675 2.922-1.093 6.543-1.085 10.558 0 1.588.085 3.257.22 4.957 6.567 2.413 13.66 3.74 21.067 3.753 6.743-.013 13.221-1.127 19.284-3.143-1.425-1.303-2.785-2.692-4.023-4.257-8.22-10.482-12.806-25.844-20.062-51.674\\\" style=\\\"fill:#64dd17\\\"/><path d=\\\"m92.97 78.225c-15.699 11.064-25.972 29.312-26.011 49.992.039 20.371 10.003 38.383 25.307 49.493 3.754-15.637 13.164-29.955 27.275-58.655-.838-2.302-1.793-4.822-2.862-7.469-3.909-9.806-9.551-21.194-14.586-26.351-2.567-2.694-5.682-5.022-9.123-7.01\\\" style=\\\"fill:#64dd17\\\"/><path d=\\\"m181.39 198.37c-8.1-1.015-14.785-2.24-20.633-4.303-9.836 4.884-20.913 7.643-32.642 7.643-40.584 0-73.483-32.894-73.488-73.49 0-22.027 9.704-41.773 25.056-55.24-4.106-.992-8.388-1.571-12.762-1.563-21.562.203-44.323 12.136-53.799 44.363-.886 4.691-.675 8.238-.675 12.442 0 63.885 51.791 115.68 115.67 115.68 39.122 0 73.682-19.439 94.611-49.169-11.32 2.821-22.206 4.17-31.528 4.199-3.494 0-6.774-.187-9.811-.558\\\" style=\\\"fill:#7cb342\\\"/><path d=\\\"m159.66 175.95c.714.354 2.333.932 4.586 1.571 15.157-11.127 25.007-29.05 25.046-49.307h-.006c-.057-33.771-27.386-61.096-61.165-61.163-6.714.013-13.164 1.121-19.203 3.122 12.419 14.156 18.391 34.386 24.168 56.515.003.01.008.018.01.026.011.018 1.848 6.145 5.002 14.274 3.132 8.118 7.594 18.168 12.46 25.492 3.195 4.908 6.709 8.435 9.102 9.47\\\" style=\\\"fill:#29b6f6\\\"/><path d=\\\"m128.12 12.541c-38.744 0-73.016 19.073-94.008 48.318 10.925-6.842 22.08-9.31 31.815-9.222 13.446.039 24.017 4.208 29.089 7.06 1.225.706 2.388 1.466 3.527 2.247 9.05-3.986 19.05-6.215 29.574-6.215 40.589.005 73.493 32.899 73.499 73.488h-.006c0 20.464-8.37 38.967-21.863 52.291 3.312.371 6.844.602 10.451.584 12.811.006 26.658-2.821 37.039-11.552 6.769-5.702 12.44-14.051 15.585-26.569.615-4.835.969-9.75.969-14.752 0-63.882-51.786-115.68-115.67-115.68\\\" style=\\\"fill:#1e88e5\\\"/></g></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/coconut.svg\":\n/*!***********************************************!*\\\n  !*** ./style/icon/language_icons/coconut.svg ***!\n  \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m8.0417 3.0359c-.28774.078252-.56654.16598-.73703.23713-.52668.21982-.98314.49155-1.3848.82444-.12441.10311-.24788.19883-.27468.21042-.12652.054729-.70093.65437-1.0071 1.0516-1.7319 2.2465-2.4417 5.5125-1.8599 8.565.075453.39591.33846 1.362.46441 1.7055.76461 2.0854 2.1369 3.7186 3.9283 4.6731 1.4125.75259 3.0843 1.0604 4.8224.88717.34798-.03467.52376-.06278 1.0844-.16574.23343-.04287 1.3817-.38454 1.6589-.49424 2.3921-.94675 4.3656-2.5822 5.5722-4.6185.50665-.85507.79584-1.6685 1.0291-2.8814.36994-1.9236-.5021-4.2624-2.3238-6.2294-2.6435-2.8542-6.788-4.4585-10.181-3.9422-.20701.031508-.50408.098905-.79182.17716zm.4205 1.5069c.27995-.075961.57525-.13864.81289-.1667.65238-.077031 1.3037-.069092 1.9943.023737 3.131.42089 6.308 2.4879 7.8054 5.0768.49823.8614.78835 1.7899.80342 2.5787.01211.63417-.129 1.1793-.43165 1.6782-.15489.25532-.3045.43314-.54842.6473-.61288.53812-1.4549.87659-2.5016 1.0051-.54773.06723-.91934.20565-1.2289.46014-.06823.05609-.64296.58818-1.2792 1.1823-1.2482 1.1656-1.2374 1.1562-1.4202 1.1033-.04719-.01365-.11537-.05265-.15105-.08639-.12965-.12259-.12528-.1612.07962-1.2241.1048-.5436.18866-1.0528.18768-1.132-.0034-.27051-.11283-.54687-.29759-.75093-.11288-.12462-.29934-.24365-.54652-.34914-2.3593-1.0069-4.3434-2.7757-5.2958-4.7217-.2041-.41706-.29285-.65253-.41172-1.0883-.28952-1.0613-.22-1.9129.21878-2.683.32221-.56549.77766-.96396 1.4876-1.3018.17803-.084725.44303-.17557.72299-.25153z\\\" style=\\\"fill:#8d6e63;stroke-width:.023397\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/coffeescript.svg\":\n/*!****************************************************!*\\\n  !*** ./style/icon/language_icons/coffeescript.svg ***!\n  \\****************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m2 21h18v-2h-18m18-11h-2v-3h2m0-2h-16v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4 -4v-3h2a2 2 0 0 0 2 -2v-3c0-1.11-.9-2-2-2z\\\" fill=\\\"#42a5f5\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/cpp.svg\":\n/*!*******************************************!*\\\n  !*** ./style/icon/language_icons/cpp.svg ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m10 15.97.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.12-1.27-1.68-2.88-1.68-4.83.05-2.31.72-4.08 2-5.32 1.32-1.25 2.96-1.89 4.94-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32m.5-4.97h2v-2h2v2h2v2h-2v2h-2v-2h-2v-2m7 0h2v-2h2v2h2v2h-2v2h-2v-2h-2z\\\" style=\\\"fill:#0277bd\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/csharp.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/csharp.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m11.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.12-1.27-1.68-2.88-1.68-4.83.05-2.31.72-4.08 2-5.32 1.32-1.25 2.96-1.89 4.94-1.89.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32m2.39 3.03l.61-4h-1.5l.34-2h1.5l.32-2h-1.5l.34-2h1.5l.61-4h2l-.61 4h1l.61-4h2l-.61 4h1.5l-.34 2h-1.5l-.32 2h1.5l-.34 2h-1.5l-.61 4h-2l.61-4h-1l-.61 4h-2m2.95-6h1l.32-2h-1l-.32 2z\\\" fill=\\\"#0277bd\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/erlang.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/erlang.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 30 30\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(0,-267)\\\">\\n<path d=\\\"m5.2074 271.33c-.047558.0515-.096794.10075-.14366.15316-2.3762 2.6622-3.5642 6.2773-3.5642 10.846 0 4.4183 1.1557 7.8618 3.4591 10.339h19.415c2.5529-1.1508 4.1269-3.43 4.1269-3.43l-3.1468-2.52-1.4538 1.382c-.8666.77235-.84504.93111-2.3146 1.7796-1.4956.67375-3.0405.96588-4.6339.96588-2.5159 0-4.4233-.90829-5.7232-2.0586-1.2859-1.1503-1.9849-4.5111-2.0967-6.6803l17.458.0672-.18252-1.4722s-.84698-7.1283-2.5413-9.3717zm8.7593.84595c1.5655 0 3.2206.53467 3.9614 1.4714.7408.93668.93123 1.667.97316 3.5239h-9.7914c.11182-1.9555.43618-2.8104 1.3727-3.6978.93649-.88737 2.0305-1.2975 3.4841-1.2975z\\\" fill=\\\"#f44336\\\"/>\\n</g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/forth.svg\":\n/*!*********************************************!*\\\n  !*** ./style/icon/language_icons/forth.svg ***!\n  \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"256\\\" height=\\\"256\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 67.733 67.733\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:osb=\\\"http://www.openswatchbook.org/uri/2009/osb\\\">\\n <path d=\\\"m10.321 12.006c-0.21038 0-0.37976 0.1735-0.37976 0.3892v12.63c0 0.2157 0.16938 0.38961 0.37976 0.38961h16.925c0.21038 0 0.37976-0.17391 0.37976-0.38961v-12.63c0-0.2157-0.16938-0.3892-0.37976-0.3892zm30.167 0c-0.21038 0-0.37976 0.1735-0.37976 0.3892v12.63c0 0.2157 0.16938 0.38961 0.37976 0.38961h16.925c0.21038 0 0.37976-0.17391 0.37976-0.38961v-12.63c0-0.2157-0.16938-0.3892-0.37976-0.3892zm-30.167 22.322c-0.21038 0-0.37976 0.1735-0.37976 0.3892v12.63c0 0.2157 0.16938 0.38961 0.37976 0.38961h16.925c0.21038 0 0.37976-0.17391 0.37976-0.38961v-12.63c0-0.2157-0.16938-0.3892-0.37976-0.3892zm30.167 0c-0.21038 0-0.37976 0.1735-0.37976 0.3892v12.63c0 0.2157 0.16938 0.38961 0.37976 0.38961h4.0525v4.3514h-4.0308c-0.20757 0-0.37483 0.16726-0.37483 0.37483v2.8898c0 0.20757 0.16726 0.37442 0.37483 0.37442h8.3029c0.20758 0 0.37442-0.16685 0.37442-0.37442v-4.135h3.7976c0.20757 0 0.37442-0.16726 0.37442-0.37483v-3.1062h4.0542c0.21038 0 0.37976-0.17391 0.37976-0.38961v-12.63c0-0.2157-0.16938-0.3892-0.37976-0.3892z\\\" fill=\\\"#ef5350\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/fortran.svg\":\n/*!***********************************************!*\\\n  !*** ./style/icon/language_icons/fortran.svg ***!\n  \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg id=\\\"svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 16 16\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><g transform=\\\"translate(3.2316e-7 1.1732e-6)\\\" style=\\\"fill:#ff7043\\\" aria-label=\\\"F\\\"><path d=\\\"m12.564 5.0924h-.61515q-.17224-.64796-.72177-1.3861-.54133-.73818-1.0417-.812-.25426-.032808-.60695-.049212-.34448-.016404-.78739-.016404h-1.9521v4.6751h1.3369q.60695 0 .94323-.12303.33628-.13123.57414-.3937.16404-.18044.29527-.55774.13943-.38549.18044-.8202h.62335v4.5685h-.62335q-.024606-.36089-.17224-.8202-.13943-.45931-.30347-.66436-.24606-.30347-.62335-.4101-.36909-.11483-.89402-.11483h-1.3369v4.0108q0 .27067.10663.48392.10663.21325.37729.34448.12303.05741.53313.13943.4101.08202.62335.09022v.58234h-5.0442v-.58234q.24606-.0164.65616-.04921.4101-.04101.53313-.09842.24606-.10663.35269-.31168.11483-.21325.11483-.50852v-8.3988q0-.27067-.090222-.47572-.090222-.21325-.37729-.34448-.22145-.10663-.59874-.18865-.36909-.08202-.59054-.098424v-.58234h9.1288z\\\" style=\\\"fill:#ff7043;stroke-width:1.1453\\\"/></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/fsharp.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/fsharp.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"533.33\\\" height=\\\"533.33\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 500 500\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(.3386 -.59284)\\\">\\n<path d=\\\"m235.91 36.659-213.94 213.94 213.94 213.94v-84.361l-129.7-129.7 129.7-129.7z\\\" fill=\\\"#378bba\\\"/>\\n<path d=\\\"m235.91 156.61-93.622 93.62 93.622 93.622z\\\" fill=\\\"#378bba\\\"/>\\n<path d=\\\"m263.42 36.64 213.94 213.94-213.94 213.94v-84.361l129.7-129.7-129.7-129.7z\\\" fill=\\\"#30b9db\\\"/>\\n</g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/go.svg\":\n/*!******************************************!*\\\n  !*** ./style/icon/language_icons/go.svg ***!\n  \\******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 300 300\\\" xml:space=\\\"preserve\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><style type=\\\"text/css\\\">\\n\\t.st0{fill:#2DBCAF;}\\n\\t.st1{fill:#5DC9E1;}\\n\\t.st2{fill:#FDDD00;}\\n\\t.st3{fill:#CE3262;}\\n\\t.st4{fill:#00ACD7;}\\n\\t.st5{fill:#FFFFFF;}\\n</style><g transform=\\\"matrix(1.4595 0 0 1.4595 -35.938 -9.1601)\\\" style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><path class=\\\"st4\\\" d=\\\"m40.2 101.1c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h35.7c.4 0 .5.3.3.6l-1.7 2.6c-.2.3-.7.6-1 .6z\\\" style=\\\"fill:#00acc1\\\"/></g></g></g><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><path class=\\\"st4\\\" d=\\\"m25.1 110.3c-.4 0-.5-.2-.3-.5l2.1-2.7c.2-.3.7-.5 1.1-.5h45.6c.4 0 .6.3.5.6l-.8 2.4c-.1.4-.5.6-.9.6z\\\" style=\\\"fill:#00acc1\\\"/></g></g></g><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><path class=\\\"st4\\\" d=\\\"m49.3 119.5c-.4 0-.5-.3-.3-.6l1.4-2.5c.2-.3.6-.6 1-.6h20c.4 0 .6.3.6.7l-.2 2.4c0 .4-.4.7-.7.7z\\\" style=\\\"fill:#00acc1\\\"/></g></g></g><g style=\\\"fill:#00acc1\\\"><g id=\\\"CXHf1q_3_\\\" style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><g style=\\\"fill:#00acc1\\\"><path class=\\\"st4\\\" d=\\\"m153.1 99.3c-6.3 1.6-10.6 2.8-16.8 4.4-1.5.4-1.6.5-2.9-1-1.5-1.7-2.6-2.8-4.7-3.8-6.3-3.1-12.4-2.2-18.1 1.5-6.8 4.4-10.3 10.9-10.2 19 .1 8 5.6 14.6 13.5 15.7 6.8.9 12.5-1.5 17-6.6.9-1.1 1.7-2.3 2.7-3.7h-19.3c-2.1 0-2.6-1.3-1.9-3 1.3-3.1 3.7-8.3 5.1-10.9.3-.6 1-1.6 2.5-1.6h36.4c-.2 2.7-.2 5.4-.6 8.1-1.1 7.2-3.8 13.8-8.2 19.6-7.2 9.5-16.6 15.4-28.5 17-9.8 1.3-18.9-.6-26.9-6.6-7.4-5.6-11.6-13-12.7-22.2-1.3-10.9 1.9-20.7 8.5-29.3 7.1-9.3 16.5-15.2 28-17.3 9.4-1.7 18.4-.6 26.5 4.9 5.3 3.5 9.1 8.3 11.6 14.1.6.9.2 1.4-1 1.7z\\\" style=\\\"fill:#00acc1\\\"/></g><g style=\\\"fill:#00acc1\\\"><path class=\\\"st4\\\" d=\\\"m186.2 154.6c-9.1-.2-17.4-2.8-24.4-8.8-5.9-5.1-9.6-11.6-10.8-19.3-1.8-11.3 1.3-21.3 8.1-30.2 7.3-9.6 16.1-14.6 28-16.7 10.2-1.8 19.8-.8 28.5 5.1 7.9 5.4 12.8 12.7 14.1 22.3 1.7 13.5-2.2 24.5-11.5 33.9-6.6 6.7-14.7 10.9-24 12.8-2.7.5-5.4.6-8 .9zm23.8-40.4c-.1-1.3-.1-2.3-.3-3.3-1.8-9.9-10.9-15.5-20.4-13.3-9.3 2.1-15.3 8-17.5 17.4-1.8 7.8 2 15.7 9.2 18.9 5.5 2.4 11 2.1 16.3-.6 7.9-4.1 12.2-10.5 12.7-19.1z\\\" style=\\\"fill:#00acc1\\\"/></g></g></g></g></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/groovy.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/groovy.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m12 1.8809a10.119 10.119 0 0 0 -10.119 10.119 10.119 10.119 0 0 0 10.119 10.119 10.119 10.119 0 0 0 10.119 -10.119 10.119 10.119 0 0 0 -10.119 -10.119zm1.2539 2.4219c.90983 0 1.6469.2609 2.2129.7793.57129.51839.85742 1.1885.85742 2.0137 0 .88867-.31893 1.6725-.95898 2.3496-.64006.67708-1.3765 1.0156-2.207 1.0156-.48665 0-.89022-.11938-1.2129-.35742-.31738-.23804-.47656-.53174-.47656-.88086 0-.21159.05998-.39852.18164-.5625.12695-.16398.27352-.24609.4375-.24609.15869 0 .23828.092204.23828.27734 0 .16398.05998.29093.18164.38086.12166.089925.26123.13477.41992.13477.42318 0 .8287-.28866 1.2148-.86523.39144-.58187.58789-1.2021.58789-1.8633 0-.46549-.15161-.84383-.45312-1.1348-.30151-.29622-.68994-.44531-1.166-.44531-.71411 0-1.4063.31836-2.0781.95312-.6665.63477-1.2116 1.4691-1.6348 2.5059-.41789 1.0315-.62695 2.0143-.62695 2.9453 0 .85693.18441 1.5391.55469 2.0469.37028.50252.86296.75391 1.4766.75391 1.0368 0 2.0278-.73397 2.9746-2.1992l1.4922-.21289c.18514-.02645.27734.01839.27734.13476 0 .0529-.07202.27962-.21484.68164-.14282.40202-.33732 1.0741-.58594 2.0156.8199-.47607 1.4547-1.0035 1.9043-1.5801v.91406c-.3597.41789-1.0469.88843-2.0625 1.4121-.21159 1.4071-.68156 2.4928-1.4062 3.2598-.72469.7723-1.5388 1.1602-2.4434 1.1602-.43376 0-.77482-.10173-1.0234-.30274-.24333-.20101-.36523-.47762-.36523-.83203 0-.98389.95565-1.9395 2.8652-2.8652.20101-.71411.39551-1.3564.58594-1.9277-.33325.48136-.81641.90706-1.4512 1.2773-.63476.37028-1.2247.55469-1.7695.55469-.88867 0-1.6283-.38338-2.2207-1.1504-.58716-.7723-.88086-1.7481-.88086-2.9277 0-1.2431.3335-2.4204 1-3.5313.6665-1.1161 1.5406-2.0073 2.625-2.6738 1.0844-.67179 2.1348-1.0078 3.1504-1.0078zm-1.2227 12.188c-1.3753.68766-2.0625 1.3647-2.0625 2.0312 0 .35441.16927.5332.50781.5332.6665 0 1.1844-.85588 1.5547-2.5645z\\\" fill=\\\"#26c6da\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/haskell.svg\":\n/*!***********************************************!*\\\n  !*** ./style/icon/language_icons/haskell.svg ***!\n  \\***********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg width=\\\"300\\\" height=\\\"300\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 300.00001 300\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g stroke-width=\\\"2.4224\\\">\\n  <path d=\\\"m23.928 240.5 59.94-89.852-59.94-89.855h44.955l59.94 89.855-59.94 89.852z\\\" fill=\\\"#ef5350\\\"/>\\n  <path d=\\\"m83.869 240.5 59.94-89.852-59.94-89.855h44.955l119.88 179.71h-44.95l-37.46-56.156-37.468 56.156z\\\" fill=\\\"#ffa726\\\"/>\\n  <path d=\\\"m228.72 188.08-19.98-29.953h69.93v29.956h-49.95zm-29.97-44.924-19.98-29.953h99.901v29.953z\\\" fill=\\\"#ffee58\\\"/>\\n </g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/java.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/language_icons/java.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m2 21h18v-2h-18m18-11h-2v-3h2m0-2h-16v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4 -4v-3h2a2 2 0 0 0 2 -2v-3c0-1.11-.9-2-2-2z\\\" fill=\\\"#f44336\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/javascript.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/javascript.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m3 3h18v18h-18v-18m4.73 15.04c.4.85 1.19 1.55 2.54 1.55 1.5 0 2.53-.8 2.53-2.55v-5.78h-1.7v5.74c0 .86-.35 1.08-.9 1.08-.58 0-.82-.4-1.09-.87l-1.38.83m5.98-.18c.5.98 1.51 1.73 3.09 1.73 1.6 0 2.8-.83 2.8-2.36 0-1.41-.81-2.04-2.25-2.66l-.42-.18c-.73-.31-1.04-.52-1.04-1.02 0-.41.31-.73.81-.73.48 0 .8.21 1.09.73l1.31-.87c-.55-.96-1.33-1.33-2.4-1.33-1.51 0-2.48.96-2.48 2.23 0 1.38.81 2.03 2.03 2.55l.42.18c.78.34 1.24.55 1.24 1.13 0 .48-.45.83-1.15.83-.83 0-1.31-.43-1.67-1.03l-1.38.8z\\\" fill=\\\"#ffca28\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/julia.svg\":\n/*!*********************************************!*\\\n  !*** ./style/icon/language_icons/julia.svg ***!\n  \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 50 50\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(0,-247)\\\">\\n<g transform=\\\"translate(.21075 -.010315)\\\">\\n<circle cx=\\\"13.497\\\" cy=\\\"281.63\\\" r=\\\"9.5549\\\" fill=\\\"#bc342d\\\"/>\\n<circle cx=\\\"36.081\\\" cy=\\\"281.63\\\" r=\\\"9.5549\\\" fill=\\\"#864e9f\\\"/>\\n<circle cx=\\\"24.722\\\" cy=\\\"262.39\\\" r=\\\"9.5549\\\" fill=\\\"#328a22\\\"/>\\n</g>\\n</g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/kotlin.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/kotlin.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\">\\n<defs>\\n<linearGradient id=\\\"linearGradient4183\\\" x1=\\\"1.7253\\\" x2=\\\"22.185\\\" y1=\\\"22.67\\\" y2=\\\"1.9823\\\" gradientTransform=\\\"matrix(.89324 0 0 .89324 1.3055 1.1285)\\\" gradientUnits=\\\"userSpaceOnUse\\\">\\n<stop stop-color=\\\"#0296d8\\\" offset=\\\"0\\\"/>\\n<stop stop-color=\\\"#8371d9\\\" offset=\\\"1\\\"/>\\n</linearGradient>\\n<linearGradient id=\\\"linearGradient4206\\\" x1=\\\"1.8691\\\" x2=\\\"22.798\\\" y1=\\\"22.382\\\" y2=\\\"3.3774\\\" gradientTransform=\\\"matrix(.89324 0 0 .89324 1.323 1.1285)\\\" gradientUnits=\\\"userSpaceOnUse\\\">\\n<stop stop-color=\\\"#cb55c0\\\" offset=\\\"0\\\"/>\\n<stop stop-color=\\\"#f28e0e\\\" offset=\\\"1\\\"/>\\n</linearGradient>\\n</defs>\\n<path d=\\\"m2.9751 2.976v18.048h18.05v-.02966l-4.4784-4.5116-4.4802-4.5151 4.4802-4.5151 4.4435-4.4767z\\\" fill=\\\"url(#linearGradient4183)\\\"/>\\n<path d=\\\"m12.223 2.976-9.2307 9.2307v8.8173h.083741l9.0319-9.0319-.02443-.02443 4.4802-4.5151 4.4435-4.4767h-8.7841z\\\" fill=\\\"url(#linearGradient4206)\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/lisp.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/language_icons/lisp.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"24\\\" height=\\\"24\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m12 2c-5.5166 3e-7 -10 4.4834-10 10s4.4834 10 10 10 10-4.4834 10-10-4.4834-10-10-10zm0 1.6191c4.6321 3e-7 8.3809 3.7488 8.3809 8.3809 0 3.3074-1.9159 6.1557-4.6953 7.5195-0.05691 0.0062-0.1128 0.017435-0.16992 0.021485-0.10582 0.0076-0.21226 0.009735-0.31836 0.009765-0.1499-2e-5 -0.30007-0.006514-0.44922-0.021484-0.14912-0.01496-0.29843-0.03859-0.44531-0.068359-0.14691-0.02976-0.29235-0.065096-0.43555-0.10938-0.14316-0.044309-0.28189-0.09786-0.41992-0.15625-0.13807-0.058379-0.2747-0.12149-0.40625-0.19336-0.13151-0.07184-0.25913-0.15173-0.38281-0.23633-0.1237-0.08467-0.24084-0.17489-0.35547-0.27148-0.11466-0.09657-0.22563-0.19715-0.33008-0.30469-0.10444-0.1075-0.20368-0.22244-0.29688-0.33984-0.09314-0.11741-0.18077-0.23911-0.26172-0.36523-0.080987-0.12613-0.15467-0.25508-0.22266-0.38867-0.06799-0.13356-0.12928-0.27243-0.18359-0.41211-0.054337-0.13971-0.10247-0.2794-0.14258-0.42383-0.04007-0.14445-0.072216-0.29173-0.097656-0.43945-0.02548-0.14769-0.044067-0.29581-0.054687-0.44531-0.0076-0.10582-0.011689-0.21226-0.011719-0.31836 1.9e-5 -0.1499 0.006464-0.30007 0.021484-0.44922 0.01496-0.14912 0.040543-0.29843 0.070313-0.44531 0.02976-0.14691 0.065095-0.29235 0.10938-0.43555 0.04431-0.14322 0.095907-0.2838 0.1543-0.42187 0.05838-0.13802 0.12345-0.2728 0.19531-0.4043 0.07183-0.13156 0.15173-0.25908 0.23633-0.38281 0.08466-0.1237 0.1749-0.24278 0.27148-0.35742 0.04786-0.05679 0.096841-0.11378 0.14453-0.16406s0.096681-0.10337 0.14453-0.16016c0.09659-0.11463 0.18682-0.23567 0.27148-0.35938 0.084604-0.12374 0.16253-0.25125 0.23438-0.38281 0.071868-0.1315 0.13888-0.26628 0.19726-0.4043 0.05838-0.13808 0.10803-0.27866 0.15234-0.42188 0.04429-0.14321 0.081558-0.28864 0.11133-0.43555 0.02977-0.14688 0.053409-0.29619 0.068359-0.44531 0.01498-0.14915 0.021465-0.29932 0.021485-0.44922-2.6e-5 -0.10609-0.004229-0.21058-0.011719-0.31641-0.0106-0.1495-0.029207-0.29958-0.054688-0.44727-0.025449-0.14773-0.057584-0.29305-0.097656-0.4375-0.040117-0.14443-0.08629-0.28802-0.14062-0.42773-0.054316-0.13969-0.11756-0.2766-0.18555-0.41016-0.067991-0.13359-0.14168-0.2645-0.22266-0.39062-0.080951-0.12612-0.16858-0.24782-0.26172-0.36523-0.093187-0.11739-0.19244-0.22844-0.29688-0.33594-0.10445-0.10754-0.21346-0.21202-0.32812-0.30859-0.11463-0.09659-0.23371-0.18682-0.35742-0.27148-0.12369-0.084603-0.2513-0.16058-0.38281-0.23242-0.13155-0.071871-0.26818-0.13889-0.40625-0.19727-0.13803-0.058379-0.27675-0.10803-0.41992-0.15234-0.1432-0.044284-0.28864-0.083515-0.43555-0.11328-0.14688-0.029767-0.29619-0.051448-0.44531-0.066406-0.14915-0.014986-0.29932-0.023418-0.44922-0.023438-0.078538 1.88e-5 -0.15596 0.0056309-0.23438 0.0097657 1.0982-0.52798 2.324-0.83203 3.625-0.83203zm1.5312 2.7852c0.72596 0.99434 1.3381 1.8137 1.4707 2.916 0.17547 1.459-1.6175 5.1557-2.334 6.2187h1.4648c0.51679-0.80134 1.6526-3.2498 1.9863-4.2656 0.38311 0.69597 1.2971 3.367 1.5039 4.2656h1.334c-0.50631-1.9586-1.5148-5.0413-3.9531-9.0918 0 3e-7 -0.98948-0.042969-1.4727-0.042969zm-8.5234 2.0566h1.334c0.2068 0.8986 1.1208 3.5697 1.5039 4.2656 0.3337-1.0158 1.4695-3.4643 1.9863-4.2656h1.4648c-0.7165 1.063-2.5095 4.7598-2.334 6.2188 0.1326 1.1023 0.74474 1.9217 1.4707 2.916-0.48318 0-1.4727-0.042969-1.4727-0.042969-2.4383-4.0505-3.4468-7.1332-3.9531-9.0918z\\\" fill=\\\"#ef5350\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/livescript.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/livescript.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg width=\\\"40mm\\\" height=\\\"40mm\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 40 40\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g transform=\\\"translate(0,-257)\\\" fill=\\\"#317eac\\\">\\n  <rect x=\\\"5.4186\\\" y=\\\"260.18\\\" width=\\\"3.6853\\\" height=\\\"34.207\\\"/>\\n  <rect transform=\\\"rotate(90)\\\" x=\\\"288.2\\\" y=\\\"-37.074\\\" width=\\\"3.6853\\\" height=\\\"34.207\\\"/>\\n  <rect transform=\\\"rotate(45)\\\" x=\\\"208.79\\\" y=\\\"166.91\\\" width=\\\"2.8348\\\" height=\\\"34.207\\\"/>\\n  <rect x=\\\"10.73\\\" y=\\\"262.47\\\" width=\\\"2.8348\\\" height=\\\"22.08\\\"/>\\n  <rect x=\\\"15.36\\\" y=\\\"262.52\\\" width=\\\"2.8348\\\" height=\\\"17.382\\\"/>\\n  <rect x=\\\"19.99\\\" y=\\\"262.47\\\" width=\\\"2.8348\\\" height=\\\"12.802\\\"/>\\n  <rect x=\\\"24.526\\\" y=\\\"262.49\\\" width=\\\"2.8348\\\" height=\\\"8.2544\\\"/>\\n  <rect x=\\\"28.783\\\" y=\\\"262.46\\\" width=\\\"2.8348\\\" height=\\\"5.1972\\\"/>\\n  <rect transform=\\\"matrix(0,-1,-1,0,0,0)\\\" x=\\\"-286.54\\\" y=\\\"-34.801\\\" width=\\\"2.8348\\\" height=\\\"22.08\\\"/>\\n  <rect transform=\\\"matrix(0,-1,-1,0,0,0)\\\" x=\\\"-281.91\\\" y=\\\"-34.753\\\" width=\\\"2.8348\\\" height=\\\"17.382\\\"/>\\n  <rect transform=\\\"matrix(0,-1,-1,0,0,0)\\\" x=\\\"-277.28\\\" y=\\\"-34.801\\\" width=\\\"2.8348\\\" height=\\\"12.802\\\"/>\\n  <rect transform=\\\"matrix(0,-1,-1,0,0,0)\\\" x=\\\"-272.75\\\" y=\\\"-34.781\\\" width=\\\"2.8348\\\" height=\\\"8.2544\\\"/>\\n  <rect transform=\\\"matrix(0,-1,-1,0,0,0)\\\" x=\\\"-268.49\\\" y=\\\"-34.809\\\" width=\\\"2.8348\\\" height=\\\"5.1972\\\"/>\\n </g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/lua.svg\":\n/*!*******************************************!*\\\n  !*** ./style/icon/language_icons/lua.svg ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<g transform=\\\"translate(-.20339 -.1017)\\\">\\n<circle cx=\\\"12.203\\\" cy=\\\"12.102\\\" r=\\\"10.322\\\" fill=\\\"none\\\" stroke=\\\"#42a5f5\\\"/>\\n<path d=\\\"m12.33 5.7461a6.4831 6.3814 0 0 0 -6.4824 6.3809 6.4831 6.3814 0 0 0 6.4824 6.3809 6.4831 6.3814 0 0 0 6.4844 -6.3809 6.4831 6.3814 0 0 0 -6.4844 -6.3809zm1.8594 1.916a2.329 2.2925 0 0 1 2.3301 2.293 2.329 2.2925 0 0 1 -2.3301 2.291 2.329 2.2925 0 0 1 -2.3281 -2.291 2.329 2.2925 0 0 1 2.3281 -2.293z\\\" fill=\\\"#42a5f5\\\" fill-rule=\\\"evenodd\\\"/>\\n<ellipse cx=\\\"19.631\\\" cy=\\\"4.6154\\\" rx=\\\"2.329\\\" ry=\\\"2.2925\\\" fill=\\\"#42a5f5\\\" fill-rule=\\\"evenodd\\\"/>\\n</g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/markdown.svg\":\n/*!************************************************!*\\\n  !*** ./style/icon/language_icons/markdown.svg ***!\n  \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M2.25 15.75v-8h2l3 3 3-3h2v8h-2v-5.17l-3 3-3-3v5.17h-2m14-8h3v4h2.5l-4 4.5-4-4.5h2.5z\\\" fill=\\\"#42a5f5\\\"/></svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/matlab.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/matlab.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 720 720\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<title>Layer 1</title>\\n<g fill-rule=\\\"evenodd\\\">\\n<path d=\\\"m209.25 329.98-156.88 57.656 121.32 85.822 96.752-95.805-61.197-47.674z\\\" fill=\\\"#4db6ac\\\"/>\\n<path d=\\\"m480.19 71.446c-13.123 1.784-9.5653 1.013-28.4 16.091-18.009 14.417-69.925 100.35-97.674 129.26-24.688 25.721-34.46 12.199-60.102 33.661-25.68 21.494-65.273 64.464-65.273 64.464l63.978 47.319 101.43-139.48c23.948-32.932 23.693-37.266 36.743-71.821 6.3846-16.906 17.76-29.899 27.756-45.808 12.488-19.874 30.186-34.855 21.543-33.68z\\\" fill=\\\"#00897b\\\"/>\\n<path d=\\\"m478.21 69.796c-31.267-.18821-62.068 137.25-115.56 242.69-54.543 107.52-162.24 176.82-162.24 176.82 18.157 8.2431 34.682 4.9095 54.236 23.395 13.375 16.164 52.091 95.975 75.174 146.12 0 0 18.965-10.297 42.994-27.694 24.03-17.398 53.124-41.897 73.384-70.301 26.884-37.692 47.897-61.042 65.703-75.271s32.404-19.336 46.459-20.54c50.237-4.3047 124.58 85.792 124.58 85.792s-155.67-480.71-204.74-481.01z\\\" fill=\\\"#ffb74d\\\"/>\\n</g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/nodejs.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/nodejs.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\">\\n    <path fill=\\\"#8bc34a\\\" d=\\\"m12 1.85c-.27 0-.55.07-.78.2l-7.44 4.3c-.48.28-.78.8-.78 1.36v8.58c0 .56.3 1.08.78 1.36l1.95 1.12c.95.46 1.27.47 1.71.47 1.4 0 2.21-.85 2.21-2.33v-8.47c0-.12-.1-.22-.22-.22h-.93c-.13 0-.23.1-.23.22v8.47c0 .66-.68 1.31-1.77.76l-2.05-1.17c-.07-.05-.11-.13-.11-.21v-8.58c0-.09.04-.17.11-.21l7.44-4.29c.06-.04.16-.04.22 0l7.44 4.29c.07.04.11.12.11.21v8.58c0 .08-.04.16-.11.21l-7.44 4.29c-.06.04-.16.04-.23 0l-1.88-1.14c-.08-.03-.16-.04-.21-.01-.53.3-.63.36-1.12.51-.12.04-.31.11.07.32l2.48 1.47c.24.14.5.21.78.21s.54-.07.78-.21l7.44-4.29c.48-.28.78-.8.78-1.36v-8.58c0-.56-.3-1.08-.78-1.36l-7.44-4.3c-.23-.13-.5-.2-.78-.2m2 6.15c-2.12 0-3.39.89-3.39 2.39 0 1.61 1.26 2.08 3.3 2.28 2.43.24 2.62.6 2.62 1.08 0 .83-.67 1.18-2.23 1.18-1.98 0-2.4-.49-2.55-1.47-.02-.1-.11-.18-.22-.18h-.96c-.12 0-.21.09-.21.22 0 1.24.68 2.74 3.94 2.74 2.35 0 3.7-.93 3.7-2.55 0-1.61-1.08-2.03-3.37-2.34-2.31-.3-2.54-.46-2.54-1 0-.45.2-1.05 1.91-1.05 1.5 0 2.09.33 2.32 1.36.02.1.11.17.21.17h.97c.05 0 .11-.02.15-.07.04-.04.07-.1.05-.16-.14-1.78-1.32-2.6-3.7-2.6z\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/ocaml.svg\":\n/*!*********************************************!*\\\n  !*** ./style/icon/language_icons/ocaml.svg ***!\n  \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><defs><linearGradient id=\\\"prefix__a\\\" x1=\\\"-666.97\\\" x2=\\\"-666.97\\\" y1=\\\"142.12\\\" y2=\\\"142.12\\\" gradientTransform=\\\"translate(103.96 1.86) scale(.13619)\\\" gradientUnits=\\\"userSpaceOnUse\\\"><stop stop-color=\\\"#F29100\\\" offset=\\\"0\\\"/><stop stop-color=\\\"#EC670F\\\" offset=\\\"1\\\"/></linearGradient></defs><path d=\\\"M12.019 15.021l.003-.008c-.005-.021-.006-.026-.003.008z\\\" fill=\\\"none\\\"/><path d=\\\"M4.51 3.273a2.523 2.523 0 00-2.524 2.523V11.3c.361-.13.88-.898 1.043-1.085.285-.327.337-.743.478-1.006.323-.597.379-1.009 1.113-1.009.342 0 .478.08.71.39.16.216.438.615.568.882.15.307.396.724.503.808.08.062.16.11.233.137.119.044.218-.037.297-.1.102-.082.145-.247.24-.467.135-.317.283-.697.367-.83.146-.23.195-.501.352-.633.232-.195.535-.208.618-.225.466-.092.677.225.907.43.15.133.355.403.5.765.114.283.26.544.32.707.059.158.203.41.289.713.077.275.286.486.365.616 0 0 .121.34.858.65.16.067.482.176.674.246.32.116.63.101 1.025.054.281 0 .434-.408.562-.734.075-.193.148-.745.197-.902.048-.153-.064-.27.031-.405.112-.156.178-.164.242-.368.138-.436.936-.458 1.384-.458.374 0 .327.363.96.239.364-.072.714.046 1.1.149.324.086.63.184.812.398.119.139.412.834.113.863.029.035.05.099.104.134-.067.262-.357.075-.518.041-.217-.045-.37.007-.583.101-.363.162-.894.143-1.21.407-.27.223-.269.721-.394 1 0 0-.348.895-1.106 1.443-.194.14-.574.477-1.4.605-.372.057-.719.062-1.1.043-.186-.009-.362-.018-.549-.02-.11-.002-.48-.013-.461.022l-.041.103.024.138c.015.083.019.149.022.225.006.157-.013.32-.005.478.017.328.138.627.154.958.017.368.199.758.375 1.059.067.114.169.128.213.269.052.161.003.333.028.505.1.668.292 1.366.592 1.97a.16.16 0 00.008.014c.371-.062.743-.196 1.226-.267.885-.132 2.115-.064 2.906-.138 2-.188 3.085.82 4.882.407V5.796a2.523 2.523 0 00-2.523-2.523zm-.907 11.144c-.015 0-.03 0-.046.003-.159.025-.313.08-.412.24-.08.13-.108.355-.164.505-.064.175-.176.338-.274.505-.18.305-.504.581-.644.879-.028.06-.053.13-.076.2v3.402c.163.028.333.062.524.113 1.407.375 1.75.407 3.13.25l.13-.018c.105-.22.187-.968.255-1.2.054-.178.127-.32.155-.5.026-.173-.003-.337-.017-.493-.04-.393.285-.533.44-.87.14-.304.22-.651.336-.963.11-.298.284-.721.579-.872-.036-.041-.617-.06-.772-.076a5.064 5.064 0 01-.5-.07c-.314-.064-.656-.126-.965-.2a10.15 10.15 0 01-.947-.328c-.298-.138-.503-.497-.732-.507zm5.737.83c-.74.149-.97.876-1.32 1.451-.192.319-.396.59-.548.928-.14.312-.128.657-.368.924a2.55 2.55 0 00-.528.922c-.023.067-.088.776-.158.943l1.101-.078c1.026.07.73.464 2.332.378l2.529-.078a7.127 7.127 0 00-.228-.588c-.07-.147-.16-.434-.218-.56a3.536 3.536 0 00-.309-.526c-.184-.215-.227-.23-.28-.503-.095-.473-.344-1.33-.637-1.923-.151-.306-.403-.562-.634-.784-.2-.195-.655-.522-.734-.505z\\\" fill=\\\"#ff9800\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/perl.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/language_icons/perl.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m12.5 14c-1 0-3 1-3 2 0 2 3 2 3 2v-1a1 1 0 0 1 -1 -1 1 1 0 0 1 1 -1v-1m0 5s-4-.5-4-2.5c0-3 3-3.75 4-3.75v-1.25c-1 0-5 1.5-5 4.5 0 4 5 4 5 4v-1m-1.93-11.97 1.19.53c.43-2.44 1.58-4.06 1.58-4.06-.43 1.03-.71 1.88-.89 2.55 1.21-2.5 3.66-4.05 3.66-4.05-1.18 1.18-2.05 2.46-2.64 3.53 1.58-1.68 3.77-2.78 3.77-2.78-2.69 1.72-3.9 4.45-4.2 5.21l.55.08c0 .52 0 1 .25 1.38.76 1.89 4.66 2.05 4.66 6.58s-4.03 6-6.17 6-6.83-.97-6.83-6 4.95-5.07 5.83-7.08c.12-.38-.76-1.89-.76-1.89z\\\" fill=\\\"#9575cd\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/php.svg\":\n/*!*******************************************!*\\\n  !*** ./style/icon/language_icons/php.svg ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?><!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\"><svg xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" version=\\\"1.1\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12,18.08C5.37,18.08 0,15.36 0,12C0,8.64 5.37,5.92 12,5.92C18.63,5.92 24,8.64 24,12C24,15.36 18.63,18.08 12,18.08M6.81,10.13C7.35,10.13 7.72,10.23 7.9,10.44C8.08,10.64 8.12,11 8.03,11.47C7.93,12 7.74,12.34 7.45,12.56C7.17,12.78 6.74,12.89 6.16,12.89H5.29L5.82,10.13H6.81M3.31,15.68H4.75L5.09,13.93H6.32C6.86,13.93 7.3,13.87 7.65,13.76C8,13.64 8.32,13.45 8.61,13.18C8.85,12.96 9.04,12.72 9.19,12.45C9.34,12.19 9.45,11.89 9.5,11.57C9.66,10.79 9.55,10.18 9.17,9.75C8.78,9.31 8.18,9.1 7.35,9.1H4.59L3.31,15.68M10.56,7.35L9.28,13.93H10.7L11.44,10.16H12.58C12.94,10.16 13.18,10.22 13.29,10.34C13.4,10.46 13.42,10.68 13.36,11L12.79,13.93H14.24L14.83,10.86C14.96,10.24 14.86,9.79 14.56,9.5C14.26,9.23 13.71,9.1 12.91,9.1H11.64L12,7.35H10.56M18,10.13C18.55,10.13 18.91,10.23 19.09,10.44C19.27,10.64 19.31,11 19.22,11.47C19.12,12 18.93,12.34 18.65,12.56C18.36,12.78 17.93,12.89 17.35,12.89H16.5L17,10.13H18M14.5,15.68H15.94L16.28,13.93H17.5C18.05,13.93 18.5,13.87 18.85,13.76C19.2,13.64 19.5,13.45 19.8,13.18C20.04,12.96 20.24,12.72 20.38,12.45C20.53,12.19 20.64,11.89 20.7,11.57C20.85,10.79 20.74,10.18 20.36,9.75C20,9.31 19.37,9.1 18.54,9.1H15.79L14.5,15.68Z\\\" fill=\\\"#1E88E5\\\" /></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/powershell.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/powershell.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M21.783 4.039c.488 0 .796.398.667.885l-3.145 14.151c-.11.488-.587.886-1.075.886H2.218c-.487 0-.796-.398-.666-.886l3.144-14.15c.11-.488.587-.886 1.075-.886h16.012M15.812 15.98h-3.98a.832.832 0 0 0-.827.836c0 .467.369.845.826.845h3.981a.845.845 0 0 0 .846-.845.843.843 0 0 0-.846-.836m-10.001.278a.867.867 0 0 0-.209 1.214.884.884 0 0 0 1.234.23c7.315-5.146 7.364-5.205 7.414-5.235a.844.844 0 0 0 .279-.597.903.903 0 0 0-.16-.558L9.473 6.06a.863.863 0 0 0-1.244-.03.868.868 0 0 0-.05 1.234l4.13 4.418z\\\" style=\\\"fill:#03a9f4;stroke-width:.99517\\\"/></svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/processing.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/processing.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 300 300\\\" xml:space=\\\"preserve\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><style type=\\\"text/css\\\">\\n\\t.st0{display:none;fill:#4CAF50;}\\n\\t.st1{fill:#263238;}\\n\\t.st2{fill:#FFFFFF;}\\n</style><g transform=\\\"matrix(13.507 0 0 13.507 -18.982 -9.1065)\\\" style=\\\"fill:#cfd8dc\\\"><path class=\\\"st2\\\" d=\\\"m6.7 8.6h2.1 2.3v11.1c.7.1 1.4.2 2.1.3v1.2h-6.4v-1.3c.7-.1 1.4-.2 2.1-.3v-9.6c-.3 0-.7 0-1.1-.1s-.7-.1-1-.2c0-.3-.1-.7-.1-1.1z\\\" style=\\\"fill:#cfd8dc\\\"/><path class=\\\"st2\\\" d=\\\"m11.3 5.7v-2.8c.4-.1.9-.3 1.5-.4.5-.1 1.3-.2 2.2-.1.5.1 1.1.2 1.7.6.2.2.7.6 1 1.3.5 1.1.1 2.2-.1 2.6-.6 1.4-2 1.9-2.2 2 .4.1 1 .2 1.6.7 1.1.9 1.2 2.1 1.3 2.4.2 1.7-1.1 2.9-1.3 3.2-.8.8-1.6 1-2.1 1.2-.8.3-1.6.3-2.1.3v-1.6h.9c.4-.1 1.1-.2 1.8-.7.2-.2.8-.7.8-1.7 0-.2.1-1.1-.6-1.8-.4-.4-.8-.5-1.4-.7s-1.2-.2-1.5-.2v-1.4c.3 0 .7-.1 1.2-.3s1-.3 1.4-.8c.2-.2.8-.9.7-1.9 0-.2-.1-.8-.6-1.2-.5-.5-1.2-.5-1.6-.5-.6 0-1.1.2-1.3.3-.1.5-.1 1.1-.2 1.6-.3-.1-.7-.1-1.1-.1z\\\" style=\\\"fill:#cfd8dc\\\"/></g></svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/prolog.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/prolog.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m12 15.385c.47397.71096 1.1088 1.295 1.862 1.6928l-1.862 1.862-1.862-1.862c.75327-.3978 1.3965-.9818 1.862-1.6928m4.2319-4.0626a1.6928 1.6928 0 0 0-1.6928 1.6928 1.6928 1.6928 0 0 0 1.6928 1.6928 1.6928 1.6928 0 0 0 1.6928-1.6928c0-.93948-.76174-1.6928-1.6928-1.6928m-8.4638 0a1.6928 1.6928 0 0 0-1.6928 1.6928 1.6928 1.6928 0 0 0 1.6928 1.6928 1.6928 1.6928 0 0 0 1.6928-1.6928c0-.93948-.76174-1.6928-1.6928-1.6928m8.4638-2.1159a3.3855 3.3855 0 0 1 3.3855 3.3855 3.3855 3.3855 0 0 1-3.3855 3.3855 3.3855 3.3855 0 0 1-3.3855-3.3855 3.3855 3.3855 0 0 1 3.3855-3.3855m-8.4638 0a3.3855 3.3855 0 0 1 3.3855 3.3855 3.3855 3.3855 0 0 1-3.3855 3.3855 3.3855 3.3855 0 0 1-3.3855-3.3855 3.3855 3.3855 0 0 1 3.3855-3.3855m-4.0287-6.5171c1.4896 3.1316.41472 5.4676-.584 7.7867-.3047.6771-.46551 1.3796-.46551 2.1159a5.0783 5.0783 0 0 0 5.0783 5.0783c.17774-.0085.35548-.01693.53322-.04232l2.5053 2.5053 1.1934 1.1765 1.1934-1.1765 2.5053-2.5053c.17774.02539.35548.03385.53322.04232a5.0783 5.0783 0 0 0 5.0783-5.0783c0-.73635-.16081-1.4388-.46551-2.1159-.99872-2.3191-2.0736-4.6551-.584-7.7867-2.2344 1.7435-5.4168 3.1231-8.2606 3.1316-2.8438-.00846-6.0262-1.3881-8.2606-3.1316z\\\" style=\\\"fill:#ef5350;stroke-width:.84638\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/purescript.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/purescript.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg width=\\\"100\\\" height=\\\"100\\\" enable-background=\\\"new 0 0 821.326 907.827\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 100 99.999997\\\" xml:space=\\\"preserve\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><g transform=\\\"translate(.1933 -.1)\\\" fill=\\\"#42a5f5\\\"><path d=\\\"m98.079 38.548-18.858-18.868-5.0864 5.0876 16.313 16.322-16.313 16.321 5.0864 5.0864 18.858-18.861c.67928-.68168 1.0547-1.5874 1.0547-2.5491-.003-.96174-.37659-1.8627-1.0547-2.5396\\\" clip-path=\\\"url(#SVGID_2_)\\\" stroke-width=\\\"1.1917\\\"/><path d=\\\"m25.483 42.794-5.0888-5.0888-18.865 18.863c-.67691.67691-1.0511 1.5826-1.0487 2.5444 0 .96174.37182 1.8639 1.0487 2.542l18.865 18.865 5.0888-5.0864-16.321-16.321z\\\" clip-path=\\\"url(#SVGID_2_)\\\" stroke-width=\\\"1.1917\\\"/><polygon transform=\\\"matrix(1.1917 0 0 1.1917 -306.84 -629.05)\\\" points=\\\"316.68 557.77 310.22 551.74 281.84 551.74 288.3 557.77\\\" clip-path=\\\"url(#SVGID_2_)\\\"/><polygon transform=\\\"matrix(1.1917 0 0 1.1917 -306.84 -629.05)\\\" points=\\\"310.22 572.9 316.68 566.86 288.3 566.86 281.84 572.9\\\" clip-path=\\\"url(#SVGID_2_)\\\"/><polygon transform=\\\"matrix(1.1917 0 0 1.1917 -306.84 -629.05)\\\" points=\\\"316.68 588.02 310.22 581.98 281.84 581.98 288.3 588.02\\\" clip-path=\\\"url(#SVGID_2_)\\\"/></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/qsharp.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/qsharp.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><g transform=\\\"translate(.40625)\\\"><g transform=\\\"translate(-.6031 .86453)\\\"><g transform=\\\"translate(.066291)\\\"><g transform=\\\"translate(-.13258)\\\" style=\\\"fill:#fbc02d\\\" aria-label=\\\"Q\\\"><path d=\\\"m12.201 15.549c.89923-1.1011 1.4681-2.9363 1.4681-4.7347 0-1.9636-.69736-3.8539-1.8719-5.1201-1.1562-1.2479-2.661-1.8535-4.5696-1.8535s-3.4134.60561-4.5696 1.8535c-1.1745 1.2663-1.8719 3.1565-1.8719 5.1568 0 2.0003.69736 3.8906 1.8719 5.1568 1.1562 1.2479 2.6793 1.8535 4.5696 1.8535 1.3764 0 2.4041-.27528 3.4685-.91758l1.5782 1.4865 1.3947-1.4865zm-3.3951-3.2115-1.3947 1.4865 1.4131 1.3397c-.42209.22022-1.0277.34868-1.6149.34868-2.2022 0-3.6703-1.8535-3.6703-4.6613 0-2.8078 1.4681-4.6613 3.6887-4.6613 2.2389 0 3.6887 1.8352 3.6887 4.6797 0 1.1011-.20187 2.0921-.60561 2.8996z\\\" style=\\\"fill:#fbc02d;stroke-width:1.3639\\\"/></g><path d=\\\"m17.719 3.8633-.61133 4h-1.5l-.33984 2h1.5l-.32031 2h-1.5l-.33984 2h1.5l-.60938 4h2l.60938-4h1l-.60938 4h2l.60938-4h1.5l.33984-2h-1.5l.32031-2h1.5l.33984-2h-1.5l.61133-4h-2l-.61133 4h-1l.61133-4zm1.0488 6h1l-.32031 2h-1z\\\" style=\\\"fill:#fbc02d\\\"/></g></g></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/ruby.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/language_icons/ruby.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m18.041 3.1767c2.2391.38208 2.8789 1.9193 2.8434 3.5275v-.035542l-1.0129 13.266-13.133.89744h.00889c-1.0929-.044427-3.5187-.15105-3.6342-3.5453l1.2173-2.2214 2.4613 5.74 2.097-6.7707-.044427.0089.017771-.01777 6.8507 2.1858-1.7682-6.9129 6.5308-.40873-5.1447-4.2117 2.7101-1.5105v.00889m-14.928 14.075v.01777-.01777m3.803-10.378c2.6301-2.6212 6.0333-4.1673 7.3394-2.8434 1.2973 1.3062-.071083 4.5227-2.7012 7.1351-2.6656 2.6123-6.0155 4.2473-7.3216 2.9322-1.3062-1.3239.035542-4.6116 2.6745-7.2239z\\\" style=\\\"fill:#f44336;stroke-width:.88855\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/rust.svg\":\n/*!********************************************!*\\\n  !*** ./style/icon/language_icons/rust.svg ***!\n  \\********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 144 144\\\" viewbox=\\\"0 0 144 144\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m68.252 26.207a3.5614 3.5614 0 0 1 7.1228 0 3.5614 3.5614 0 0 1 -7.1228 0m-42.486 32.245a3.5614 3.5614 0 0 1 7.1228 0 3.5614 3.5614 0 0 1 -7.1228 0m84.97.16616a3.5614 3.5614 0 0 1 7.1228 0 3.5614 3.5614 0 0 1 -7.1228 0m-74.661 4.8792c1.6386-.72764 2.3788-2.6481 1.6512-4.2902l-1.5802-3.5729h6.2141v28.01h-12.537a43.847 43.847 0 0 1 -1.4197 -16.738zm25.994.68867v-8.2561h14.798c.7643 0 5.3971.88347 5.3971 4.3475 0 2.8762-3.5534 3.9075-6.4754 3.9075zm-20.203 44.452a3.5614 3.5614 0 0 1 7.1228 0 3.5614 3.5614 0 0 1 -7.1228 0m52.769.16615a3.5614 3.5614 0 0 1 7.1228 0 3.5614 3.5614 0 0 1 -7.1228 0m1.1012-8.0762c-1.7543-.37585-3.48.74025-3.8559 2.498l-1.7876 8.342a43.847 43.847 0 0 1 -36.566 -.17532l-1.7864-8.342c-.37585-1.7555-2.1015-2.8739-3.8547-2.4969l-7.3646 1.5813a43.847 43.847 0 0 1 -3.8078 -4.4884h35.834c.40564 0 .67607-.0733.67607-.44231v-12.676c0-.36897-.27043-.44231-.67607-.44231h-10.48v-8.0349h11.335c1.0347 0 5.5323.29564 6.9704 6.0445.45033 1.7681 1.4392 7.5193 2.1153 9.3607.67378 2.0649 3.417 6.19 6.3402 6.19h18.501a43.847 43.847 0 0 1 -4.061 4.7004zm19.898-33.468a43.847 43.847 0 0 1 .0928 7.6121h-4.4987c-.45031 0-.63138.29564-.63138.7368v2.066c0 4.8631-2.7421 5.9208-5.145 6.1901-2.2883.25782-4.8253-.95796-5.1381-2.3582-1.3499-7.5926-3.5992-9.214-7.1514-12.016 4.4082-2.7994 8.9952-6.9291 8.9952-12.457 0-5.9689-4.0919-9.7285-6.881-11.572-3.9132-2.5794-8.2458-3.0962-9.4146-3.0962h-46.526a43.847 43.847 0 0 1 24.531 -13.845l5.4842 5.7535c1.2398 1.2983 3.2933 1.3464 4.5904.10542l6.1362-5.8692a43.847 43.847 0 0 1 30.017 21.379l-4.2008 9.4879c-.72534 1.642.0149 3.5625 1.6524 4.2902zm10.477.15355-.14324-1.4667 4.3268-4.0358c.88005-.82045.55117-2.4717-.57407-2.8911l-5.5312-2.0683-.43314-1.4278 3.4502-4.7921c.70356-.974.0572-2.529-1.1276-2.7238l-5.8325-.94879-.70128-1.3097 2.451-5.3799c.50189-1.0955-.43087-2.4969-1.6363-2.451l-5.9196.20626-.93504-1.1344 1.3602-5.7661c.27502-1.1711-.91326-2.3605-2.0843-2.0855l-5.7649 1.359-1.1367-.93504.20741-5.9196c.0459-1.1986-1.3567-2.1348-2.4499-1.6375l-5.3788 2.4522-1.3097-.70242-.95108-5.8337c-.19251-1.1825-1.7486-1.8288-2.7226-1.1275l-4.7955 3.4502-1.4255-.432-2.0683-5.5323c-.41939-1.1275-2.0718-1.4518-2.8899-.57638l-4.0358 4.3303-1.4667-.14323-3.1168-5.0361c-.63023-1.0198-2.3181-1.0198-2.9461 0l-3.1168 5.0361-1.4679.14323-4.0369-4.3303c-.81816-.87545-2.4705-.55117-2.8899.57638l-2.0683 5.5323-1.4266.432-4.7944-3.4502c-.974-.70357-2.5313-.055-2.7238 1.1275l-.95108 5.8337-1.3097.70242-5.3788-2.4522c-1.0932-.4996-2.4957.43887-2.4499 1.6375l.20626 5.9196-1.1367.93504-5.7649-1.359c-1.1711-.27272-2.3605.91441-2.0855 2.0855l1.3579 5.7661-.93275 1.1344-5.9196-.20626c-1.194-.03438-2.1348 1.3556-1.6375 2.451l2.4522 5.3799-.70242 1.3097-5.8325.94879c-1.1848.19251-1.8265 1.7498-1.1275 2.7238l3.4502 4.7921-.43314 1.4278-5.5323 2.0683c-1.123.41939-1.4518 2.0706-.57409 2.8911l4.328 4.0358-.14324 1.4667-5.035 3.1168c-1.0198.63023-1.0198 2.3181 0 2.9461l5.035 3.1168.14324 1.4667-4.328 4.0369c-.87774.81816-.54888 2.4682.57409 2.8899l5.5323 2.0683.43314 1.4278-3.4502 4.7932c-.70128.97629-.05614 2.5324 1.1287 2.7226l5.8314.9488.70242 1.312-2.4522 5.3776c-.4996 1.0932.44346 2.4992 1.6375 2.451l5.9173-.2074.93504 1.1367-1.3579 5.7672c-.27501 1.1688.91441 2.3559 2.0855 2.0809l5.7649-1.3579 1.1367.93275-.20626 5.9208c-.04584 1.1986 1.3567 2.1359 2.4499 1.6363l5.3788-2.451 1.3097.70241.95108 5.8303c.19251 1.1871 1.7498 1.8288 2.7238 1.1298l4.7921-3.4525 1.4278.43428 2.0683 5.53c.41939 1.123 2.0718 1.4541 2.8899.57409l4.0369-4.328 1.4679.14667 3.1168 5.035c.62794 1.0152 2.3158 1.0176 2.9461 0l3.1168-5.035 1.4667-.14667 4.0358 4.328c.81816.88003 2.4705.54888 2.8899-.57409l2.0683-5.53 1.4278-.43428 4.7932 3.4525c.974.69899 2.5301.0551 2.7226-1.1298l.95108-5.8303 1.3097-.70241 5.3788 2.451c1.0932.49961 2.4934-.43544 2.4499-1.6363l-.20627-5.9208 1.1356-.93275 5.7649 1.3579c1.1711.27501 2.3594-.91212 2.0844-2.0809l-1.3579-5.7672.93275-1.1367 5.9196.2074c1.194.0482 2.1382-1.3579 1.6363-2.451l-2.4511-5.3776.70129-1.312 5.8325-.9488c1.1871-.19021 1.8311-1.7463 1.1275-2.7226l-3.4502-4.7932.43314-1.4278 5.5312-2.0683c1.1253-.42168 1.4541-2.0718.5741-2.8899l-4.3268-4.0369.14322-1.4667 5.035-3.1168c1.0198-.62794 1.021-2.3158.00092-2.9461z\\\" fill=\\\"#ff7043\\\" stroke-width=\\\"1.1459\\\"/>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/sas.svg\":\n/*!*******************************************!*\\\n  !*** ./style/icon/language_icons/sas.svg ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n<!-- Created with Inkscape (http://www.inkscape.org/) by Marsupilami -->\\n<svg\\n   xmlns:svg=\\\"http://www.w3.org/2000/svg\\\"\\n   xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n   version=\\\"1.0\\\"\\n   width=\\\"1024\\\"\\n   height=\\\"420\\\"\\n   viewBox=\\\"0 0 129.24898 53.067852\\\"\\n   id=\\\"svg2320\\\">\\n  <defs\\n     id=\\\"defs2322\\\" />\\n  <g\\n     transform=\\\"translate(-310.37551,-505.82825)\\\"\\n     id=\\\"layer1\\\">\\n    <path\\n       d=\\\"M 18.46875,0 C 16.638866,-0.041377236 14.748438,0.1725 12.8125,0.65625 C 3.86,2.8925 -6.16125,14.40875 4.78125,27.6875 L 11.3125,35.59375 L 13.15625,37.84375 C 14.39375,39.315 16.41875,39.28875 17.90625,38.0625 C 19.40125,36.829998 19.82625,34.80875 18.59375,33.3125 C 18.592173,33.310397 18.071121,32.679752 17.84375,32.40625 L 17.875,32.40625 C 17.402936,31.838361 17.300473,31.743127 16.8125,31.15625 C 14.448752,28.313409 11.75,25.03125 11.75,25.03125 C 6.9987503,19.265 9.11875,12.14125 15.5625,8.09375 C 21.24,4.5275001 31.65875,5.80125 35.25,11.65625 C 32.988202,4.9805465 26.398246,0.17930136 18.46875,0 z M 19.78125,13.9375 C 18.937031,13.90875 18.055625,14.230625 17.3125,14.84375 C 15.815001,16.0775 15.39375,18.10125 16.625,19.59375 C 16.627499,19.597501 16.77625,19.7825 17.03125,20.09375 C 19.863614,23.496657 23.625,28.0625 23.625,28.0625 C 28.3775,33.82875 26.25625,40.92125 19.8125,44.96875 C 14.136251,48.53375 3.71625,47.2575 0.125,41.40625 C 2.90875,49.618751 12.23875,54.9875 22.5625,52.40625 C 31.5175,50.166248 41.53625,38.6825 30.59375,25.40625 L 22.9375,16.15625 L 22.0625,15.0625 C 21.44375,14.326875 20.625469,13.96625 19.78125,13.9375 z \\\"\\n       transform=\\\"translate(310.37551,505.82825)\\\"\\n       style=\\\"fill:#007cc2;fill-opacity:1;fill-rule:nonzero;stroke:none\\\"\\n       id=\\\"path2440\\\" />\\n    <path\\n       d=\\\"M 53.53125,6.3125 C 47.8625,6.3125 41.374998,9.2362506 41.375,16.28125 C 41.375,22.9875 46.708752,24.869999 52,26.15625 C 57.355,27.4425 62.656249,28.187498 62.65625,32.65625 C 62.65625,37.05875 58.121251,37.875002 54.78125,37.875 C 50.3725,37.875 46.218751,36.27125 46.03125,31.125 L 40.6875,31.125 C 41,39.79375 47.161249,42.968749 54.46875,42.96875 C 61.085,42.96875 68.343749,40.27125 68.34375,31.9375 C 68.34375,25.16375 63.041251,23.25625 57.6875,21.96875 C 52.7125,20.6825 47.031249,20.00625 47.03125,15.875 C 47.03125,12.3525 50.75625,11.40625 53.96875,11.40625 C 57.49875,11.40625 61.151251,12.810001 61.53125,17.28125 L 66.875,17.28125 C 66.435,8.74625 60.712498,6.3125001 53.53125,6.3125 z M 84.40625,6.3125 C 77.159998,6.3125001 70.90625,9.3625 70.59375,18.03125 L 75.9375,18.03125 C 76.190003,12.883749 79.5275,11.40625 84.0625,11.40625 C 87.466253,11.40625 91.3125,12.20625 91.3125,17.21875 C 91.312501,21.553749 86.2975,21.155 80.375,22.375 C 74.833751,23.526251 69.34375,25.23 69.34375,33.15625 C 69.343748,40.133748 74.20125,42.96875 80.125,42.96875 C 84.656249,42.968749 88.6025,41.255 91.5625,37.53125 C 91.562499,41.322498 93.3525,42.96875 96.125,42.96875 C 97.823751,42.968749 98.9925,42.60875 99.9375,42 L 99.9375,37.53125 C 99.244997,37.802498 98.7525,37.875 98.3125,37.875 C 96.612501,37.875002 96.625,36.68 96.625,33.96875 L 96.625,15.9375 C 96.624998,7.7424996 90.265,6.3125 84.40625,6.3125 z M 112.40625,6.3125 C 106.7375,6.3125 100.25,9.2362506 100.25,16.28125 C 100.25,22.9875 105.61625,24.869999 110.90625,26.15625 C 116.2625,27.4425 121.5625,28.187498 121.5625,32.65625 C 121.5625,37.05875 117.02625,37.875002 113.6875,37.875 C 109.2775,37.875 105.125,36.27125 104.9375,31.125 L 99.5625,31.125 C 99.87625,39.79375 106.06875,42.968749 113.375,42.96875 C 119.9875,42.96875 127.21875,40.27125 127.21875,31.9375 C 127.21875,25.16375 121.91625,23.25625 116.5625,21.96875 C 111.58875,20.6825 105.9375,20.00625 105.9375,15.875 C 105.9375,12.3525 109.63125,11.40625 112.84375,11.40625 C 116.37,11.40625 120.025,12.810001 120.40625,17.28125 L 125.78125,17.28125 C 125.3425,8.74625 119.59,6.3125001 112.40625,6.3125 z M 91.25,24.0625 L 91.25,29.96875 C 91.25,33.1525 88.36875,37.875 81.3125,37.875 C 78.040002,37.875002 75,36.51375 75,32.71875 C 75.000003,28.452501 78.0375,27.115 81.5625,26.4375 C 85.15375,25.761251 89.1725,25.6875 91.25,24.0625 z M 38.21875,39.40625 C 37.088748,39.406249 36.125,40.28375 36.125,41.46875 C 36.125001,42.658749 37.08875,43.53125 38.21875,43.53125 C 39.338748,43.53125 40.28125,42.65875 40.28125,41.46875 C 40.281252,40.283749 39.33875,39.40625 38.21875,39.40625 z M 127.15625,39.40625 C 126.0225,39.406249 125.0625,40.285 125.0625,41.46875 C 125.0625,42.66 126.0225,43.53125 127.15625,43.53125 C 128.275,43.53125 129.25,42.66 129.25,41.46875 C 129.25,40.285 128.275,39.40625 127.15625,39.40625 z M 38.21875,39.75 C 39.146248,39.750002 39.875,40.49 39.875,41.46875 C 39.875,42.456249 39.14625,43.1875 38.21875,43.1875 C 37.273748,43.187501 36.53125,42.45625 36.53125,41.46875 C 36.53125,40.489999 37.27375,39.75 38.21875,39.75 z M 127.15625,39.75 C 128.08375,39.750002 128.84375,40.49125 128.84375,41.46875 C 128.84375,42.4575 128.08375,43.1875 127.15625,43.1875 C 126.21,43.187499 125.5,42.4575 125.5,41.46875 C 125.5,40.49125 126.21,39.75 127.15625,39.75 z M 37.40625,40.28125 L 37.40625,42.65625 L 37.78125,42.65625 L 37.78125,41.625 L 38.1875,41.625 L 38.8125,42.65625 L 39.21875,42.65625 L 38.53125,41.59375 C 38.88375,41.553751 39.15625,41.395 39.15625,40.96875 C 39.156251,40.49875 38.8775,40.28125 38.3125,40.28125 L 37.40625,40.28125 z M 126.375,40.28125 L 126.375,42.65625 L 126.71875,42.65625 L 126.71875,41.625 L 127.15625,41.625 L 127.78125,42.65625 L 128.1875,42.65625 L 127.5,41.59375 C 127.84625,41.554998 128.125,41.395 128.125,40.96875 C 128.125,40.49875 127.8425,40.28125 127.28125,40.28125 L 126.375,40.28125 z M 37.78125,40.59375 L 38.28125,40.59375 C 38.528749,40.593749 38.78125,40.6425 38.78125,40.9375 C 38.78125,41.300001 38.5275,41.3125 38.21875,41.3125 L 37.78125,41.3125 L 37.78125,40.59375 z M 126.71875,40.59375 L 127.21875,40.59375 C 127.47125,40.593749 127.75,40.64125 127.75,40.9375 C 127.75,41.300001 127.4625,41.3125 127.15625,41.3125 L 126.71875,41.3125 L 126.71875,40.59375 z \\\"\\n       transform=\\\"translate(310.37551,505.82825)\\\"\\n       style=\\\"fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none\\\"\\n       id=\\\"path2448\\\" />\\n  </g>\\n</svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/sbt.svg\":\n/*!*******************************************!*\\\n  !*** ./style/icon/language_icons/sbt.svg ***!\n  \\*******************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<svg width=\\\"300\\\" height=\\\"300\\\" enable-background=\\\"new 0 0 370 160\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 300 300\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <g transform=\\\"translate(0,140)\\\">\\n  <path d=\\\"m105.46 69.517c-7.8746 0-13.452-7.5213-13.452-15.37v-0.32702c0-7.8484 5.5778-13.735 13.452-13.735h164.05c1.4765-4.9052 2.6249-11.446 3.2811-17.986h-137.81c-7.8746 0-14.273-6.0498-14.273-13.898 0-7.8484 6.3981-13.898 14.273-13.898h137.31c-0.82027-6.5403-1.9686-13.081-3.7732-17.986h-104.01c-7.8746 0-14.273-6.0498-14.273-13.898 0-7.8484 6.3981-13.898 14.273-13.898h91.87c-21.327-37.607-60.864-61.315-106.14-61.315-67.918 0-123.04 54.448-123.04 122.3 0 67.856 55.122 123.28 123.04 123.28 46.591 0 87.112-25.507 107.95-63.114h-152.73z\\\" fill=\\\"#0277bd\\\" stroke-width=\\\"1.6378\\\"/>\\n </g>\\n</svg>\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/scala.svg\":\n/*!*********************************************!*\\\n  !*** ./style/icon/language_icons/scala.svg ***!\n  \\*********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg enable-background=\\\"new 0 0 256 256\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 256 256\\\" xml:space=\\\"preserve\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><g transform=\\\"translate(-6.1456 .2445)\\\" fill=\\\"#f44336\\\" fill-rule=\\\"evenodd\\\"><rect transform=\\\"matrix(.98931 -.14586 0 1 0 0)\\\" x=\\\"60.251\\\" y=\\\"59.435\\\" width=\\\"150.71\\\" height=\\\"49.488\\\"/><rect transform=\\\"matrix(.98931 -.14586 0 1 0 0)\\\" x=\\\"60.237\\\" y=\\\"122.87\\\" width=\\\"150.71\\\" height=\\\"49.488\\\"/><rect transform=\\\"matrix(.98931 -.14586 0 1 0 0)\\\" x=\\\"60.231\\\" y=\\\"186.14\\\" width=\\\"150.71\\\" height=\\\"49.488\\\"/><rect transform=\\\"rotate(17.923)\\\" x=\\\"87.528\\\" y=\\\"67.767\\\" width=\\\"100.48\\\" height=\\\"9.2044\\\"/><rect transform=\\\"rotate(17.923)\\\" x=\\\"126.41\\\" y=\\\"23.362\\\" width=\\\"100.48\\\" height=\\\"9.2044\\\"/><rect transform=\\\"rotate(17.923)\\\" x=\\\"107.03\\\" y=\\\"128.07\\\" width=\\\"100.48\\\" height=\\\"9.2044\\\"/><rect transform=\\\"rotate(17.923)\\\" x=\\\"145.89\\\" y=\\\"83.566\\\" width=\\\"100.48\\\" height=\\\"9.2044\\\"/></g></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/scheme.svg\":\n/*!**********************************************!*\\\n  !*** ./style/icon/language_icons/scheme.svg ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 24 24\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"m5.1102 21.186 4.7769-13.883-.94161-2.1933h-1.5387v-2.2966h2.2966c.48229 0 .89568.29856 1.0679.72343l6.5798 15.353h1.5387v2.2966h-2.2966c-.49377 0-.90716-.31004-1.0679-.73492l-4.2947-10.002-3.6861 10.737z\\\" style=\\\"fill:#f44336;stroke-width:1.1483\\\"/></svg>\\n\");\n\n/***/ }),\n\n/***/ \"./style/icon/language_icons/typescript.svg\":\n/*!**************************************************!*\\\n  !*** ./style/icon/language_icons/typescript.svg ***!\n  \\**************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"\\n<svg clip-rule=\\\"evenodd\\\" fill-rule=\\\"evenodd\\\" stroke-linejoin=\\\"round\\\" stroke-miterlimit=\\\"1.414\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 500 500\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"m46 46v408h408v-408h-408zm310.02 198.17v.00586c3.9124.01226 8.3586.21357 11.703.57617 13.619 1.4734 24.225 7.349 33.248 18.416 4.4934 5.5129 6.0307 7.9253 5.7031 8.957-.21108.66564-3.294 2.874-13.096 9.3809-9.6287 6.3921-12.731 8.3066-13.451 8.3066-.73045 0-2.2517-1.5657-4.4453-4.5723-4.2244-5.7892-8.5373-8.4314-15.205-9.3125-7.1704-.9496-13.602 1.3105-16.752 5.8887-2.6923 3.9112-3.099 10.206-.95899 14.779 2.4792 5.2976 6.9671 8.2262 24.166 15.768 19.836 8.6975 29.888 14.651 37.209 22.039 7.8838 7.9563 11.878 17.143 13.105 30.137.59907 6.3332-.13284 13.84-1.9453 19.943-4.4447 14.961-16.439 25.916-34.02 31.072-4.8597 1.4248-9.3818 2.276-13.855 2.6035-6.8282.50274-16.603.22572-22.486-.63086-14.884-2.1677-31.686-10.829-40.064-20.65-4.1128-4.8205-9.3633-12.754-9.3633-14.15 0-.67351.33372-1.0557 1.6562-1.8965 3.9213-2.4911 26.394-15.338 26.83-15.338.26345 0 1.4373 1.3838 2.6074 3.0742 2.6512 3.8278 9.17 10.407 12.484 12.602 2.7074 1.7928 6.1691 3.2327 10.279 4.2715 2.3539.5868 3.6002.69141 8.7363.69141 5.2475-.00176 6.3243-.0901 8.6719-.72071 6.2096-1.6713 11.057-5.1293 13.111-9.3535.90039-1.8254.91797-2.0533.91797-6.4805v-4.5898l-1.1035-2.1894c-2.6734-5.3067-8.4338-8.9474-26.645-16.836-8.3655-3.6237-18.611-8.733-22.611-11.275-9.1282-5.801-15.455-12.433-19.607-20.551-4.13-8.073-4.7459-11.078-4.7559-23.217-.01017-9.5024-.02592-9.3858 1.9414-15.451 1.785-5.5038 5.439-11.652 9.4727-15.939 8.0511-8.5582 19.813-14.058 32.406-15.152 1.6108-.15244 3.768-.21208 6.1152-.20508zm-108.36 1.877h.00391c24.253.01227 38.156.0962 38.379.23633.42036.2603.47265 2.3708.47265 15.842v15.541l-24.201.08789-24.201.08789v68.713c0 37.793-.07654 68.938-.18164 69.213-.17115.46249-2.0325.49805-17.779.49805h-17.588l-.18164-.71094c-.11745-.39011-.20308-31.536-.20508-69.213l-.00586-68.504-24.201-.08594-24.201-.08789v-15.357c0-12.18.08414-15.442.4082-15.766.333-.34334 12.684-.43187 65.902-.48437 10.261-.01034 19.495-.01477 27.58-.00977z\\\" fill=\\\"#0288d1\\\"/>\\n</svg>\");\n\n/***/ })\n\n}]);\n//# sourceMappingURL=lib_index_js.be5d61b481146873348d.js.map"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/remoteEntry.0a192b189a42c6f0af60.js",
    "content": "var _JUPYTERLAB;\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"webpack/container/entry/jupyterlab-code-snippets\":\n/*!***********************!*\\\n  !*** container entry ***!\n  \\***********************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar moduleMap = {\n\t\"./index\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./extension\": () => {\n\t\treturn __webpack_require__.e(\"lib_index_js\").then(() => (() => ((__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\")))));\n\t},\n\t\"./style\": () => {\n\t\treturn Promise.all([__webpack_require__.e(\"vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f\"), __webpack_require__.e(\"style_index_js\")]).then(() => (() => ((__webpack_require__(/*! ./style/index.js */ \"./style/index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = __webpack_modules__;\n/******/ \t\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = __webpack_module_cache__;\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/ensure chunk */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.f = {};\n/******/ \t\t// This file contains only the entry chunk.\n/******/ \t\t// The chunk loading function for additional chunks\n/******/ \t\t__webpack_require__.e = (chunkId) => {\n/******/ \t\t\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n/******/ \t\t\t\t__webpack_require__.f[key](chunkId, promises);\n/******/ \t\t\t\treturn promises;\n/******/ \t\t\t}, []));\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/get javascript chunk filename */\n/******/ \t(() => {\n/******/ \t\t// This function allow to reference async chunks\n/******/ \t\t__webpack_require__.u = (chunkId) => {\n/******/ \t\t\t// return url for filenames based on template\n/******/ \t\t\treturn \"\" + chunkId + \".\" + {\"lib_index_js\":\"be5d61b481146873348d\",\"vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f\":\"8245c3041950ff727f29\",\"style_index_js\":\"93ff47ff4745f8384ae9\"}[chunkId] + \".js\";\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/load script */\n/******/ \t(() => {\n/******/ \t\tvar inProgress = {};\n/******/ \t\tvar dataWebpackPrefix = \"jupyterlab-code-snippets:\";\n/******/ \t\t// loadScript function to load a script via script tag\n/******/ \t\t__webpack_require__.l = (url, done, key, chunkId) => {\n/******/ \t\t\tif(inProgress[url]) { inProgress[url].push(done); return; }\n/******/ \t\t\tvar script, needAttach;\n/******/ \t\t\tif(key !== undefined) {\n/******/ \t\t\t\tvar scripts = document.getElementsByTagName(\"script\");\n/******/ \t\t\t\tfor(var i = 0; i < scripts.length; i++) {\n/******/ \t\t\t\t\tvar s = scripts[i];\n/******/ \t\t\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t\tif(!script) {\n/******/ \t\t\t\tneedAttach = true;\n/******/ \t\t\t\tscript = document.createElement('script');\n/******/ \t\t\n/******/ \t\t\t\tscript.charset = 'utf-8';\n/******/ \t\t\t\tscript.timeout = 120;\n/******/ \t\t\t\tif (__webpack_require__.nc) {\n/******/ \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n/******/ \t\t\t\t}\n/******/ \t\t\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n/******/ \t\t\t\tscript.src = url;\n/******/ \t\t\t}\n/******/ \t\t\tinProgress[url] = [done];\n/******/ \t\t\tvar onScriptComplete = (prev, event) => {\n/******/ \t\t\t\t// avoid mem leaks in IE.\n/******/ \t\t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\t\tclearTimeout(timeout);\n/******/ \t\t\t\tvar doneFns = inProgress[url];\n/******/ \t\t\t\tdelete inProgress[url];\n/******/ \t\t\t\tscript.parentNode && script.parentNode.removeChild(script);\n/******/ \t\t\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n/******/ \t\t\t\tif(prev) return prev(event);\n/******/ \t\t\t};\n/******/ \t\t\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n/******/ \t\t\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n/******/ \t\t\tscript.onload = onScriptComplete.bind(null, script.onload);\n/******/ \t\t\tneedAttach && document.head.appendChild(script);\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/sharing */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.S = {};\n/******/ \t\tvar initPromises = {};\n/******/ \t\tvar initTokens = {};\n/******/ \t\t__webpack_require__.I = (name, initScope) => {\n/******/ \t\t\tif(!initScope) initScope = [];\n/******/ \t\t\t// handling circular init calls\n/******/ \t\t\tvar initToken = initTokens[name];\n/******/ \t\t\tif(!initToken) initToken = initTokens[name] = {};\n/******/ \t\t\tif(initScope.indexOf(initToken) >= 0) return;\n/******/ \t\t\tinitScope.push(initToken);\n/******/ \t\t\t// only runs once\n/******/ \t\t\tif(initPromises[name]) return initPromises[name];\n/******/ \t\t\t// creates a new share scope if needed\n/******/ \t\t\tif(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};\n/******/ \t\t\t// runs all init snippets from all modules reachable\n/******/ \t\t\tvar scope = __webpack_require__.S[name];\n/******/ \t\t\tvar warn = (msg) => (typeof console !== \"undefined\" && console.warn && console.warn(msg));\n/******/ \t\t\tvar uniqueName = \"jupyterlab-code-snippets\";\n/******/ \t\t\tvar register = (name, version, factory, eager) => {\n/******/ \t\t\t\tvar versions = scope[name] = scope[name] || {};\n/******/ \t\t\t\tvar activeVersion = versions[version];\n/******/ \t\t\t\tif(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };\n/******/ \t\t\t};\n/******/ \t\t\tvar initExternal = (id) => {\n/******/ \t\t\t\tvar handleError = (err) => (warn(\"Initialization of sharing external failed: \" + err));\n/******/ \t\t\t\ttry {\n/******/ \t\t\t\t\tvar module = __webpack_require__(id);\n/******/ \t\t\t\t\tif(!module) return;\n/******/ \t\t\t\t\tvar initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))\n/******/ \t\t\t\t\tif(module.then) return promises.push(module.then(initFn, handleError));\n/******/ \t\t\t\t\tvar initResult = initFn(module);\n/******/ \t\t\t\t\tif(initResult && initResult.then) return promises.push(initResult['catch'](handleError));\n/******/ \t\t\t\t} catch(err) { handleError(err); }\n/******/ \t\t\t}\n/******/ \t\t\tvar promises = [];\n/******/ \t\t\tswitch(name) {\n/******/ \t\t\t\tcase \"default\": {\n/******/ \t\t\t\t\tregister(\"jupyterlab-code-snippets\", \"2.2.0\", () => (__webpack_require__.e(\"lib_index_js\").then(() => (() => (__webpack_require__(/*! ./lib/index.js */ \"./lib/index.js\"))))));\n/******/ \t\t\t\t}\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t\tif(!promises.length) return initPromises[name] = 1;\n/******/ \t\t\treturn initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/publicPath */\n/******/ \t(() => {\n/******/ \t\tvar scriptUrl;\n/******/ \t\tif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\n/******/ \t\tvar document = __webpack_require__.g.document;\n/******/ \t\tif (!scriptUrl && document) {\n/******/ \t\t\tif (document.currentScript)\n/******/ \t\t\t\tscriptUrl = document.currentScript.src\n/******/ \t\t\tif (!scriptUrl) {\n/******/ \t\t\t\tvar scripts = document.getElementsByTagName(\"script\");\n/******/ \t\t\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\t// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n/******/ \t\t// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\n/******/ \t\tif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\n/******/ \t\tscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n/******/ \t\t__webpack_require__.p = scriptUrl;\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/consumes */\n/******/ \t(() => {\n/******/ \t\tvar parseVersion = (str) => {\n/******/ \t\t\t// see webpack/lib/util/semver.js for original code\n/******/ \t\t\tvar p=p=>{return p.split(\".\").map((p=>{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;\n/******/ \t\t}\n/******/ \t\tvar versionLt = (a, b) => {\n/******/ \t\t\t// see webpack/lib/util/semver.js for original code\n/******/ \t\t\ta=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r<b.length&&\"u\"!=(typeof b[r])[0];var e=a[r],n=(typeof e)[0];if(r>=b.length)return\"u\"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return\"o\"==n&&\"n\"==f||(\"s\"==f||\"u\"==n);if(\"o\"!=n&&\"u\"!=n&&e!=t)return e<t;r++}\n/******/ \t\t}\n/******/ \t\tvar rangeToString = (range) => {\n/******/ \t\t\t// see webpack/lib/util/semver.js for original code\n/******/ \t\t\tvar r=range[0],n=\"\";if(1===range.length)return\"*\";if(r+.5){n+=0==r?\">=\":-1==r?\"<\":1==r?\"^\":2==r?\"~\":r>0?\"=\":\"!=\";for(var e=1,a=1;a<range.length;a++){e--,n+=\"u\"==(typeof(t=range[a]))[0]?\"-\":(e>0?\".\":\"\")+(e=2,t)}return n}var g=[];for(a=1;a<range.length;a++){var t=range[a];g.push(0===t?\"not(\"+o()+\")\":1===t?\"(\"+o()+\" || \"+o()+\")\":2===t?g.pop()+\" \"+g.pop():rangeToString(t))}return o();function o(){return g.pop().replace(/^\\((.+)\\)$/,\"$1\")}\n/******/ \t\t}\n/******/ \t\tvar satisfy = (range, version) => {\n/******/ \t\t\t// see webpack/lib/util/semver.js for original code\n/******/ \t\t\tif(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i<range.length?(typeof range[i])[0]:\"\";if(n>=version.length||\"o\"==(s=(typeof(f=version[n]))[0]))return!a||(\"u\"==g?i>e&&!r:\"\"==g!=r);if(\"u\"==s){if(!a||\"u\"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f<range[i])return!1;f!=range[i]&&(a=!1)}else if(\"s\"!=g&&\"n\"!=g){if(r||i<=e)return!1;a=!1,i--}else{if(i<=e||s<g!=r)return!1;a=!1}else\"s\"!=g&&\"n\"!=g&&(a=!1,i--)}}var t=[],o=t.pop.bind(t);for(n=1;n<range.length;n++){var u=range[n];t.push(1==u?o()|o():2==u?o()&o():u?satisfy(u,version):!o())}return!!o();\n/******/ \t\t}\n/******/ \t\tvar ensureExistence = (scopeName, key) => {\n/******/ \t\t\tvar scope = __webpack_require__.S[scopeName];\n/******/ \t\t\tif(!scope || !__webpack_require__.o(scope, key)) throw new Error(\"Shared module \" + key + \" doesn't exist in shared scope \" + scopeName);\n/******/ \t\t\treturn scope;\n/******/ \t\t};\n/******/ \t\tvar findVersion = (scope, key) => {\n/******/ \t\t\tvar versions = scope[key];\n/******/ \t\t\tvar key = Object.keys(versions).reduce((a, b) => {\n/******/ \t\t\t\treturn !a || versionLt(a, b) ? b : a;\n/******/ \t\t\t}, 0);\n/******/ \t\t\treturn key && versions[key]\n/******/ \t\t};\n/******/ \t\tvar findSingletonVersionKey = (scope, key) => {\n/******/ \t\t\tvar versions = scope[key];\n/******/ \t\t\treturn Object.keys(versions).reduce((a, b) => {\n/******/ \t\t\t\treturn !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;\n/******/ \t\t\t}, 0);\n/******/ \t\t};\n/******/ \t\tvar getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => {\n/******/ \t\t\treturn \"Unsatisfied version \" + version + \" from \" + (version && scope[key][version].from) + \" of shared singleton module \" + key + \" (required \" + rangeToString(requiredVersion) + \")\"\n/******/ \t\t};\n/******/ \t\tvar getSingleton = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\tvar version = findSingletonVersionKey(scope, key);\n/******/ \t\t\treturn get(scope[key][version]);\n/******/ \t\t};\n/******/ \t\tvar getSingletonVersion = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\tvar version = findSingletonVersionKey(scope, key);\n/******/ \t\t\tif (!satisfy(requiredVersion, version)) typeof console !== \"undefined\" && console.warn && console.warn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n/******/ \t\t\treturn get(scope[key][version]);\n/******/ \t\t};\n/******/ \t\tvar getStrictSingletonVersion = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\tvar version = findSingletonVersionKey(scope, key);\n/******/ \t\t\tif (!satisfy(requiredVersion, version)) throw new Error(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));\n/******/ \t\t\treturn get(scope[key][version]);\n/******/ \t\t};\n/******/ \t\tvar findValidVersion = (scope, key, requiredVersion) => {\n/******/ \t\t\tvar versions = scope[key];\n/******/ \t\t\tvar key = Object.keys(versions).reduce((a, b) => {\n/******/ \t\t\t\tif (!satisfy(requiredVersion, b)) return a;\n/******/ \t\t\t\treturn !a || versionLt(a, b) ? b : a;\n/******/ \t\t\t}, 0);\n/******/ \t\t\treturn key && versions[key]\n/******/ \t\t};\n/******/ \t\tvar getInvalidVersionMessage = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\tvar versions = scope[key];\n/******/ \t\t\treturn \"No satisfying version (\" + rangeToString(requiredVersion) + \") of shared module \" + key + \" found in shared scope \" + scopeName + \".\\n\" +\n/******/ \t\t\t\t\"Available versions: \" + Object.keys(versions).map((key) => {\n/******/ \t\t\t\treturn key + \" from \" + versions[key].from;\n/******/ \t\t\t}).join(\", \");\n/******/ \t\t};\n/******/ \t\tvar getValidVersion = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\tvar entry = findValidVersion(scope, key, requiredVersion);\n/******/ \t\t\tif(entry) return get(entry);\n/******/ \t\t\tthrow new Error(getInvalidVersionMessage(scope, scopeName, key, requiredVersion));\n/******/ \t\t};\n/******/ \t\tvar warnInvalidVersion = (scope, scopeName, key, requiredVersion) => {\n/******/ \t\t\ttypeof console !== \"undefined\" && console.warn && console.warn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion));\n/******/ \t\t};\n/******/ \t\tvar get = (entry) => {\n/******/ \t\t\tentry.loaded = 1;\n/******/ \t\t\treturn entry.get()\n/******/ \t\t};\n/******/ \t\tvar init = (fn) => (function(scopeName, a, b, c) {\n/******/ \t\t\tvar promise = __webpack_require__.I(scopeName);\n/******/ \t\t\tif (promise && promise.then) return promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], a, b, c));\n/******/ \t\t\treturn fn(scopeName, __webpack_require__.S[scopeName], a, b, c);\n/******/ \t\t});\n/******/ \t\t\n/******/ \t\tvar load = /*#__PURE__*/ init((scopeName, scope, key) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn get(findVersion(scope, key));\n/******/ \t\t});\n/******/ \t\tvar loadFallback = /*#__PURE__*/ init((scopeName, scope, key, fallback) => {\n/******/ \t\t\treturn scope && __webpack_require__.o(scope, key) ? get(findVersion(scope, key)) : fallback();\n/******/ \t\t});\n/******/ \t\tvar loadVersionCheck = /*#__PURE__*/ init((scopeName, scope, key, version) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn get(findValidVersion(scope, key, version) || warnInvalidVersion(scope, scopeName, key, version) || findVersion(scope, key));\n/******/ \t\t});\n/******/ \t\tvar loadSingleton = /*#__PURE__*/ init((scopeName, scope, key) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn getSingleton(scope, scopeName, key);\n/******/ \t\t});\n/******/ \t\tvar loadSingletonVersionCheck = /*#__PURE__*/ init((scopeName, scope, key, version) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn getSingletonVersion(scope, scopeName, key, version);\n/******/ \t\t});\n/******/ \t\tvar loadStrictVersionCheck = /*#__PURE__*/ init((scopeName, scope, key, version) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn getValidVersion(scope, scopeName, key, version);\n/******/ \t\t});\n/******/ \t\tvar loadStrictSingletonVersionCheck = /*#__PURE__*/ init((scopeName, scope, key, version) => {\n/******/ \t\t\tensureExistence(scopeName, key);\n/******/ \t\t\treturn getStrictSingletonVersion(scope, scopeName, key, version);\n/******/ \t\t});\n/******/ \t\tvar loadVersionCheckFallback = /*#__PURE__*/ init((scopeName, scope, key, version, fallback) => {\n/******/ \t\t\tif(!scope || !__webpack_require__.o(scope, key)) return fallback();\n/******/ \t\t\treturn get(findValidVersion(scope, key, version) || warnInvalidVersion(scope, scopeName, key, version) || findVersion(scope, key));\n/******/ \t\t});\n/******/ \t\tvar loadSingletonFallback = /*#__PURE__*/ init((scopeName, scope, key, fallback) => {\n/******/ \t\t\tif(!scope || !__webpack_require__.o(scope, key)) return fallback();\n/******/ \t\t\treturn getSingleton(scope, scopeName, key);\n/******/ \t\t});\n/******/ \t\tvar loadSingletonVersionCheckFallback = /*#__PURE__*/ init((scopeName, scope, key, version, fallback) => {\n/******/ \t\t\tif(!scope || !__webpack_require__.o(scope, key)) return fallback();\n/******/ \t\t\treturn getSingletonVersion(scope, scopeName, key, version);\n/******/ \t\t});\n/******/ \t\tvar loadStrictVersionCheckFallback = /*#__PURE__*/ init((scopeName, scope, key, version, fallback) => {\n/******/ \t\t\tvar entry = scope && __webpack_require__.o(scope, key) && findValidVersion(scope, key, version);\n/******/ \t\t\treturn entry ? get(entry) : fallback();\n/******/ \t\t});\n/******/ \t\tvar loadStrictSingletonVersionCheckFallback = /*#__PURE__*/ init((scopeName, scope, key, version, fallback) => {\n/******/ \t\t\tif(!scope || !__webpack_require__.o(scope, key)) return fallback();\n/******/ \t\t\treturn getStrictSingletonVersion(scope, scopeName, key, version);\n/******/ \t\t});\n/******/ \t\tvar installedModules = {};\n/******/ \t\tvar moduleToHandlerMapping = {\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/application\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/application\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/apputils\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/settingregistry\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/settingregistry\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/codeeditor\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/codeeditor\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/ui-components\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/ui-components\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/algorithm\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/algorithm\", [1,1,9,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/notebook\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/docregistry\": () => (loadVersionCheck(\"default\", \"@jupyterlab/docregistry\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/signaling\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/signaling\", [1,1,10,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/react\": () => (loadSingletonVersionCheck(\"default\", \"react\", [1,17,0,1])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/coreutils\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/coreutils\", [1,1,11,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/coreutils\", [1,5,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/fileeditor\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/fileeditor\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/cells\": () => (loadVersionCheck(\"default\", \"@jupyterlab/cells\", [1,3,5,3])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/widgets\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/widgets\", [1,1,33,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/dragdrop\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/dragdrop\", [1,1,13,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@lumino/messaging\": () => (loadSingletonVersionCheck(\"default\", \"@lumino/messaging\", [1,1,10,0])),\n/******/ \t\t\t\"webpack/sharing/consume/default/@jupyterlab/services\": () => (loadSingletonVersionCheck(\"default\", \"@jupyterlab/services\", [1,6,5,3]))\n/******/ \t\t};\n/******/ \t\t// no consumes in initial chunks\n/******/ \t\tvar chunkMapping = {\n/******/ \t\t\t\"lib_index_js\": [\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/application\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/apputils\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/settingregistry\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/codeeditor\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/ui-components\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/algorithm\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/notebook\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/docregistry\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/signaling\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/react\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/coreutils\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/coreutils\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/fileeditor\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/cells\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/widgets\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/dragdrop\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@lumino/messaging\",\n/******/ \t\t\t\t\"webpack/sharing/consume/default/@jupyterlab/services\"\n/******/ \t\t\t]\n/******/ \t\t};\n/******/ \t\t__webpack_require__.f.consumes = (chunkId, promises) => {\n/******/ \t\t\tif(__webpack_require__.o(chunkMapping, chunkId)) {\n/******/ \t\t\t\tchunkMapping[chunkId].forEach((id) => {\n/******/ \t\t\t\t\tif(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]);\n/******/ \t\t\t\t\tvar onFactory = (factory) => {\n/******/ \t\t\t\t\t\tinstalledModules[id] = 0;\n/******/ \t\t\t\t\t\t__webpack_require__.m[id] = (module) => {\n/******/ \t\t\t\t\t\t\tdelete __webpack_require__.c[id];\n/******/ \t\t\t\t\t\t\tmodule.exports = factory();\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t\tvar onError = (error) => {\n/******/ \t\t\t\t\t\tdelete installedModules[id];\n/******/ \t\t\t\t\t\t__webpack_require__.m[id] = (module) => {\n/******/ \t\t\t\t\t\t\tdelete __webpack_require__.c[id];\n/******/ \t\t\t\t\t\t\tthrow error;\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t\ttry {\n/******/ \t\t\t\t\t\tvar promise = moduleToHandlerMapping[id]();\n/******/ \t\t\t\t\t\tif(promise.then) {\n/******/ \t\t\t\t\t\t\tpromises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));\n/******/ \t\t\t\t\t\t} else onFactory(promise);\n/******/ \t\t\t\t\t} catch(e) { onError(e); }\n/******/ \t\t\t\t});\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/jsonp chunk loading */\n/******/ \t(() => {\n/******/ \t\t// no baseURI\n/******/ \t\t\n/******/ \t\t// object to store loaded and loading chunks\n/******/ \t\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t\t// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n/******/ \t\tvar installedChunks = {\n/******/ \t\t\t\"jupyterlab-code-snippets\": 0\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t__webpack_require__.f.j = (chunkId, promises) => {\n/******/ \t\t\t\t// JSONP chunk loading for javascript\n/******/ \t\t\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n/******/ \t\t\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n/******/ \t\t\n/******/ \t\t\t\t\t// a Promise means \"currently loading\".\n/******/ \t\t\t\t\tif(installedChunkData) {\n/******/ \t\t\t\t\t\tpromises.push(installedChunkData[2]);\n/******/ \t\t\t\t\t} else {\n/******/ \t\t\t\t\t\tif(true) { // all chunks have JS\n/******/ \t\t\t\t\t\t\t// setup Promise in chunk cache\n/******/ \t\t\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n/******/ \t\t\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n/******/ \t\t\n/******/ \t\t\t\t\t\t\t// start chunk loading\n/******/ \t\t\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n/******/ \t\t\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n/******/ \t\t\t\t\t\t\tvar error = new Error();\n/******/ \t\t\t\t\t\t\tvar loadingEnded = (event) => {\n/******/ \t\t\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n/******/ \t\t\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n/******/ \t\t\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n/******/ \t\t\t\t\t\t\t\t\tif(installedChunkData) {\n/******/ \t\t\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n/******/ \t\t\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n/******/ \t\t\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n/******/ \t\t\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n/******/ \t\t\t\t\t\t\t\t\t\terror.type = errorType;\n/******/ \t\t\t\t\t\t\t\t\t\terror.request = realSrc;\n/******/ \t\t\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n/******/ \t\t\t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t\t};\n/******/ \t\t\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n/******/ \t\t\t\t\t\t} else installedChunks[chunkId] = 0;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t// no prefetching\n/******/ \t\t\n/******/ \t\t// no preloaded\n/******/ \t\t\n/******/ \t\t// no HMR\n/******/ \t\t\n/******/ \t\t// no HMR manifest\n/******/ \t\t\n/******/ \t\t// no on chunks loaded\n/******/ \t\t\n/******/ \t\t// install a JSONP callback for chunk loading\n/******/ \t\tvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n/******/ \t\t\tvar [chunkIds, moreModules, runtime] = data;\n/******/ \t\t\t// add \"moreModules\" to the modules object,\n/******/ \t\t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\t\tvar moduleId, chunkId, i = 0;\n/******/ \t\t\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n/******/ \t\t\t\tfor(moduleId in moreModules) {\n/******/ \t\t\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n/******/ \t\t\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif(runtime) var result = runtime(__webpack_require__);\n/******/ \t\t\t}\n/******/ \t\t\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n/******/ \t\t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\t\tchunkId = chunkIds[i];\n/******/ \t\t\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n/******/ \t\t\t\t\tinstalledChunks[chunkId][0]();\n/******/ \t\t\t\t}\n/******/ \t\t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t\t}\n/******/ \t\t\n/******/ \t\t}\n/******/ \t\t\n/******/ \t\tvar chunkLoadingGlobal = self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || [];\n/******/ \t\tchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\n/******/ \t\tchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/nonce */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.nc = undefined;\n/******/ \t})();\n/******/ \t\n/************************************************************************/\n/******/ \t\n/******/ \t// module cache are used so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \tvar __webpack_exports__ = __webpack_require__(\"webpack/container/entry/jupyterlab-code-snippets\");\n/******/ \t(_JUPYTERLAB = typeof _JUPYTERLAB === \"undefined\" ? {} : _JUPYTERLAB)[\"jupyterlab-code-snippets\"] = __webpack_exports__;\n/******/ \t\n/******/ })()\n;\n//# sourceMappingURL=remoteEntry.0a192b189a42c6f0af60.js.map"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/style.js",
    "content": "/* This is a generated file of CSS imports */\n/* It was generated by @jupyterlab/builder in Build.ensureAssets() */\n\nimport 'jupyterlab-code-snippets/style/index.js';\n"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/style_index_js.93ff47ff4745f8384ae9.js",
    "content": "(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push([[\"style_index_js\"],{\n\n/***/ \"./node_modules/css-loader/dist/cjs.js!./style/base.css\":\n/*!**************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/cjs.js!./style/base.css ***!\n  \\**************************************************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _icon_dragtab_jupyter_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon/dragtab_jupyter.svg */ \"./style/icon/dragtab_jupyter.svg\");\n/* harmony import */ var _icon_dragtab_jupyter_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_icon_dragtab_jupyter_svg__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _icon_jupyter_searcharrowdown_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon/jupyter_searcharrowdown.svg */ \"./style/icon/jupyter_searcharrowdown.svg\");\n/* harmony import */ var _icon_jupyter_searcharrowdown_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_jupyter_searcharrowdown_svg__WEBPACK_IMPORTED_MODULE_4__);\n// Imports\n\n\n\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()((_icon_dragtab_jupyter_svg__WEBPACK_IMPORTED_MODULE_3___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()((_icon_jupyter_searcharrowdown_svg__WEBPACK_IMPORTED_MODULE_4___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\n  --preview-distance: 0px;\\n  --preview-max-height: 75px;\\n  --more-options-top: 0px;\\n  --more-options-left: 0px;\\n}\\n\\n#code-snippet-extension {\\n  background-color: var(--jp-layout-color0);\\n  overflow: auto;\\n}\\n\\n.jp-codeSnippet-fileDialog label {\\n  margin-bottom: 5px;\\n}\\n\\n/*Code Snippet Container CSS*/\\n.jp-codeSnippetsContainer-button,\\n.jp-codeSnippetsContainer-button.jp-mod-styled {\\n  background-color: transparent;\\n  vertical-align: middle;\\n  padding: 0;\\n  padding-right: 8px;\\n}\\n\\n.jp-codeSnippetsContainer-button:hover {\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippetsContainer-title {\\n  align-items: center;\\n  display: flex;\\n  justify-content: space-between;\\n  margin-top: 5px;\\n  height: 30px;\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippetsContainer-name {\\n  font-size: var(--jp-ui-font-size1);\\n  white-space: nowrap;\\n  overflow: hidden;\\n  color: var(--jp-ui-font-color0);\\n  display: flex;\\n  align-items: center;\\n  width: 100%;\\n}\\n\\n.jp-codeSnippetsContainer-name span:nth-child(2) {\\n  white-space: nowrap;\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  height: 19px;\\n}\\n\\n.jp-codeSnippet-name:hover {\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippetsContainer-button {\\n  background-repeat: no-repeat;\\n  background-position: center;\\n  border: none;\\n  height: 100%;\\n}\\n\\n/* Size of the icons in code snippet */\\n.jp-codeSnippetsContainer-action-buttons {\\n  height: 100%;\\n  overflow: hidden;\\n}\\n\\n.jp-codeSnippet-item {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n  display: flex;\\n  margin: 0;\\n  padding: 0;\\n  height: fit-content;\\n  cursor: context-menu;\\n}\\n\\n.jp-codeSnippet-item:hover {\\n  background-color: var(--jp-layout-color2);\\n}\\n\\n#jp-codeSnippet-rename {\\n  background-color: var(--jp-layout-color2);\\n  border: 1px solid var(--jp-layout-color1);\\n  border-radius: 4px;\\n  font-size: var(--jp-ui-font-size1);\\n  box-sizing: border-box;\\n  margin: 0px;\\n}\\n\\n.jp-codeSnippet-metadata {\\n  flex-basis: 95%;\\n  width: 100%;\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: space-evenly;\\n  overflow: hidden;\\n}\\n\\n.jp-codeSnippet-description p {\\n  font-size: var(--jp-ui-font-size0);\\n  line-height: 15px;\\n  color: var(--jp-layout-color4);\\n  margin-bottom: 10px;\\n  width: 90%;\\n  display: -webkit-box;\\n  -webkit-box-orient: vertical;\\n  -webkit-line-clamp: 2;\\n  overflow: hidden;\\n}\\n\\n/* Header bar of code snippets */\\n.jp-codeSnippetsHeader {\\n  font-size: var(--jp-ui-font-size1);\\n  font-weight: 600;\\n  text-transform: uppercase;\\n  padding: 8px;\\n  color: var(--jp-ui-font-color0);\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center;\\n}\\n\\n/* Save Notification CSS */\\n.jp-codeSnippet-confirm {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  top: 0px;\\n  left: 0px;\\n  margin: 0;\\n  padding: 0;\\n  width: 100%;\\n  height: 100%;\\n  background: var(--jp-dialog-background);\\n}\\n\\n.jp-codeSnippet-Message-content {\\n  background: var(--jp-layout-color1);\\n  display: flex;\\n  align-items: center;\\n  padding: 0px;\\n  padding-left: 40px;\\n  border-top: 7px solid #388e3c;\\n  width: 250px;\\n  min-width: 200px;\\n  min-height: 50px;\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z20);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color1);\\n  margin: auto 6px 30px auto;\\n  resize: none;\\n}\\n\\n.jp-codeSnippet-Message-content .jp-Dialog-header {\\n  padding: 0px;\\n}\\n\\n.jp-codeSnippet-Message-content .jp-Dialog-footer {\\n  padding: 0px;\\n}\\n\\n.jp-codeSnippet-Message-body {\\n  display: flex;\\n  flex-direction: row;\\n  align-items: center;\\n}\\n\\n.jp-codeSnippet-confirm-text {\\n  width: 183px;\\n  font-style: normal;\\n  font-weight: normal;\\n  font-size: 13px;\\n  text-align: left;\\n  padding-left: 10px;\\n}\\n\\n/* Code Snippet Preview CSS */\\n.jp-codeSnippet-preview {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  margin: 0;\\n  top: var(--preview-distance);\\n}\\n\\n.jp-codeSnippet-preview.inactive {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-preview-content {\\n  background: var(--jp-layout-color1);\\n  padding: 5px;\\n  width: 180px;\\n  height: fit-content;\\n  max-height: var(--preview-max-height);\\n  /*height: 106px;*/\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z2);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color1);\\n  margin: 10px 10px 10px 0px;\\n}\\n\\n/* Code Snippet Drag and Drop CSS */\\n.jp-codeSnippet-drag-hover-selected {\\n  background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \");\\n  margin-right: -2px;\\n  background-color: var(--jp-layout-color2);\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.jp-codeSnippet-drag-image {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\\n  background: var(--jp-cell-editor-background);\\n  width: var(--jp-private-notebook-dragImage-width);\\n  height: var(--jp-private-notebook-dragImage-height);\\n}\\n\\n.jp-codeSnippet-item.jp-codeSnippet-dropTarget {\\n  border-top: 2px solid var(--jp-private-notebook-selected-color);\\n}\\n\\n.jp-codeSnippet-drag-hover {\\n  flex-basis: 5%;\\n  min-width: 20px;\\n  padding-right: 5px;\\n  margin-right: 5px;\\n  cursor: move;\\n}\\n\\n/* Code Snippet Editor CSS */\\n.jp-codeSnippet-editor-title {\\n  margin-left: 2%;\\n  margin-top: 2%;\\n  margin-bottom: 20px;\\n  color: var(--jp-ui-font-color0);\\n  font-size: 25px;\\n}\\n\\n.jp-codeSnippet-editor-label {\\n  margin-left: 2%;\\n  margin-bottom: 5px;\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippet-editor-name,\\n.jp-codeSnippet-editor-description {\\n  display: block;\\n  margin-left: 2%;\\n  border-top: transparent;\\n  border-left: transparent;\\n  border-right: transparent;\\n  width: 94%;\\n  height: 32px;\\n  font-size: var(--jp-ui-font-size1);\\n  border-radius: 2px;\\n  background: var(--jp-input-background);\\n  box-sizing: border-box;\\n  border: var(--jp-border-width) solid var(--jp-border-color1);\\n  padding-left: 7px;\\n  padding-right: 7px;\\n  color: var(--jp-ui-font-color0);\\n  outline: none;\\n  appearance: none;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  margin-top: 5px;\\n  margin-bottom: 15px;\\n}\\n\\n.jp-codeSnippet-editor-language {\\n  display: block;\\n  margin-bottom: 20px;\\n  margin-left: 2%;\\n  width: 176px;\\n  height: 32px;\\n  font-size: var(--jp-ui-font-size1);\\n  border-radius: 2px;\\n  appearance: none;\\n  -webkit-appearance: none; /* chrome and safari */\\n  -moz-appearance: none; /* Mozilla */\\n  -ms-appearance: none; /* Internet explorer */\\n  color: var(--jp-ui-font-color0);\\n  outline: none;\\n  background: var(--jp-input-background);\\n  box-sizing: border-box;\\n  border: var(--jp-border-width) solid var(--jp-border-color1);\\n  padding-left: 7px;\\n  padding-right: 7px;\\n  background-image: url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \");\\n  background-repeat: no-repeat;\\n  background-position: 95% center;\\n  margin-top: 5px;\\n}\\n\\n.jp-codeSnippet-editor-language:hover {\\n  background-image: none;\\n}\\n\\n.jp-codeSnippet-editor-tagList {\\n  list-style: none;\\n  margin-left: 2%;\\n  margin-bottom: 8px;\\n  margin-top: -8px;\\n}\\n\\n.jp-codeSnippet-editor-tag {\\n  margin-left: 3px;\\n  margin-right: 3px;\\n}\\n\\n.jp-codeSnippet-editor-tag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-editor-tag input {\\n  border: none;\\n  background: transparent;\\n}\\n\\n.jp-codeSnippet-editor-tag.applied-tag button {\\n  color: var(--jp-ui-font-color1);\\n}\\n\\n.jp-codeSnippet-editor-tag.unapplied-tag button {\\n  color: var(--jp-ui-font-color2);\\n}\\n\\n.jp-codeSnippet-editor-tag.tag.unapplied-tag input {\\n  border: none;\\n  background: transparent;\\n}\\n\\n.jp-codeSnippet-editor-active {\\n  border: 1px solid var(--jp-cell-editor-active-border-color);\\n  background-color: var(--jp-input-active-background);\\n}\\n.jp-codeSnippetInputArea {\\n  display: flex;\\n  flex-direction: column;\\n  height: 100%;\\n  width: 98.5%;\\n  padding-left: 12px;\\n}\\n\\n.jp-codeSnippetInputArea-editor {\\n  overflow: auto;\\n  margin-left: 2%;\\n  margin-right: 3%;\\n  margin-top: 5px;\\n}\\n\\n.jp-codeSnippetInput-editor {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\\n  border-radius: 0px;\\n  background: var(--jp-cell-editor-background);\\n}\\n\\n.jp-codeSnippetInput-editor.active {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);\\n  box-shadow: var(--jp-input-box-shadow);\\n  background-color: var(--jp-cell-editor-active-background);\\n}\\n\\n.jp-codeSnippetInput-editor .CodeMirror.cm-s-jupyter {\\n  background: transparent;\\n}\\n\\n.jp-codeSnippetInputArea .saveBtn {\\n  width: 10%;\\n  background: var(--jp-brand-color1);\\n  color: var(--jp-ui-inverse-font-color0);\\n  align-self: flex-end;\\n  margin-top: 12px;\\n  margin-right: 3%;\\n  margin-bottom: 12px;\\n}\\n\\n/* code snippet create button */\\n.jp-createSnippetBtn {\\n  cursor: pointer;\\n  border: none;\\n  background: none;\\n  padding: 0px;\\n}\\n\\n/* @import url('~@jupyterlab/codeeditor/style/index.css'); */\\n\\n/* Code Snippet Filter CSS */\\n.jp-codeSnippet-searchbar {\\n  margin: 0px 8px;\\n}\\n\\n.jp-codeSnippet-filterTools {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n}\\n\\nmark.jp-codeSnippet-search-bolding {\\n  background-color: transparent;\\n  font-weight: bold;\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippet-filter {\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  margin: 10px 10px 0 10px;\\n}\\n\\n.jp-codeSnippet-filter .jp-codeSnippet-filter-btn {\\n  align-self: flex-end;\\n  padding: 0px;\\n  padding-bottom: 10px;\\n  border: none;\\n  background: none;\\n  cursor: pointer;\\n  color: var(--jp-brand-color2);\\n}\\n\\n.jp-codeSnippet-filter-arrow-up.idle,\\n.jp-codeSnippet-filter-option.idle {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-filter-arrow-up {\\n  position: absolute;\\n  margin-top: 20px;\\n  border: var(--jp-border-width) solid var(--jp-border-color2);\\n  border-width: 0 var(--jp-border-width) var(--jp-border-width) 0;\\n  padding: 4px;\\n  margin-right: 38px;\\n  align-self: flex-end;\\n  transform: rotate(-135deg);\\n  -webkit-transform: rotate(-135deg);\\n  background-color: var(--jp-layout-color0);\\n}\\n\\n.jp-codeSnippet-filter-option {\\n  border: var(--jp-border-width) solid var(--jp-border-color2);\\n  height: 140px;\\n  width: 100%;\\n  margin-bottom: 10px;\\n  overflow: auto;\\n}\\n\\n.jp-codeSnippet-filter-title {\\n  text-transform: uppercase;\\n  color: var(--jp-ui-font-color2);\\n  font-size: var(--jp-ui-font-size1);\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n  margin: 10px 10px;\\n  padding-bottom: 5px;\\n}\\n\\n.jp-codeSnippet-filter-tags {\\n  margin: 0px 8px;\\n}\\n\\n.jp-codeSnippet-filter-tag {\\n  margin-left: 3px;\\n  margin-right: 3px;\\n}\\n\\n.jp-codeSnippet-filter-tag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-tools {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n}\\n\\n/* Code Snippet Tags in InputDialog */\\n.jp-codeSnippet-inputTagList {\\n  list-style: none;\\n}\\n\\n.jp-codeSnippet-inputTag {\\n  margin-left: 8px;\\n  margin-right: 8px;\\n}\\n\\n.jp-codeSnippet-inputTag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-inputTag input {\\n  font-size: var(--jp-ui-font-size1);\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n  width: 50px;\\n}\\n\\n.jp-codeSnippet-tags {\\n  margin-top: 8px;\\n}\\n\\n/* .jp-codeSnippet-tag,\\n.jp-codeSnippet-inputTag,\\n.jp-codeSnippet-filter-tag {\\n  height: 5px;\\n} */\\n\\n/* USER Input Form Style\\n.jp-codeSnippet-form {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  top: 0px;\\n  left: 0px;\\n  margin: 0;\\n  padding: 0;\\n  width: 100%;\\n  height: 100%;\\n  background: var(--jp-dialog-background);\\n} */\\n\\n/* .jp-codesnippet-editor-name:required {\\n    border-color: #808080;\\n    border-width: 3px;\\n  } */\\n\\n.jp-codeSnippet-dialog-name-input.touched:invalid,\\n.jp-codeSnippet-dialog-desc-input.touched:invalid,\\n.jp-codeSnippet-dialog-lang-input.touched:invalid,\\n.jp-codeSnippet-editor-name.touched:invalid,\\n.jp-codeSnippet-editor-description.touched:invalid,\\n.jp-codeSnippet-editor-language.touched:invalid {\\n  border: var(--jp-border-width) solid var(--jp-error-color1);\\n}\\n\\n.jp-codeSnippet-dialog-name-input.jp-mod-styled,\\n.jp-codeSnippet-dialog-desc-input.jp-mod-styled,\\n.jp-codeSnippet-dialog-lang-input.jp-mod-styled {\\n  margin-bottom: 10px;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-inputName-validity,\\n.jp-codeSnippet-inputDesc-validity {\\n  font-size: var(--jp-ui-font-size0);\\n  color: var(--jp-ui-font-color1);\\n  margin: 5px;\\n  margin-bottom: 8px;\\n}\\n\\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputName-validity,\\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputDesc-validity {\\n  margin-bottom: 20px;\\n  margin-top: 5px;\\n  margin-left: 3%;\\n}\\n\\n/* 3 Dots Dropdown On Code Snippet */\\n.jp-codeSnippet-options {\\n  position: absolute;\\n  z-index: 10000;\\n  height: 100%;\\n  width: 100%;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  margin: 0;\\n  background-color: transparent;\\n}\\n\\n.jp-codeSnippet-options.inactive {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-more-options-content {\\n  width: 183px;\\n  font-style: normal;\\n  font-weight: normal;\\n  font-size: 13px;\\n  text-align: left;\\n}\\n\\n.jp-codeSnippet-options-content {\\n  background: var(--jp-layout-color1);\\n  padding: 10px;\\n  border: 1px solid var(--jp-border-color0);\\n  width: 180px;\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z1);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size0);\\n  color: var(--jp-ui-font-color1);\\n  position: absolute;\\n  top: var(--more-options-top);\\n  left: var(--more-options-left);\\n}\\n\\n.jp-codeSnippet-options-body {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.jp-codeSnippet-more-options-copy {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-copy:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-insert {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-insert:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-edit {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-edit:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-delete {\\n  color: var(--jp-error-color0);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-delete:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-export {\\n  color: var(--jp-brand-color0);\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-export:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-dropdown-delete-button {\\n  border: none;\\n}\\n\\n.jp-dropdown-cancel-button {\\n  outline: 1px solid var(--jp-brand-color1);\\n  outline-offset: 4px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./style/base.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,uBAAuB;EACvB,0BAA0B;EAC1B,uBAAuB;EACvB,wBAAwB;AAC1B;;AAEA;EACE,yCAAyC;EACzC,cAAc;AAChB;;AAEA;EACE,kBAAkB;AACpB;;AAEA,6BAA6B;AAC7B;;EAEE,6BAA6B;EAC7B,sBAAsB;EACtB,UAAU;EACV,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,mBAAmB;EACnB,aAAa;EACb,8BAA8B;EAC9B,eAAe;EACf,YAAY;EACZ,+BAA+B;AACjC;;AAEA;EACE,kCAAkC;EAClC,mBAAmB;EACnB,gBAAgB;EAChB,+BAA+B;EAC/B,aAAa;EACb,mBAAmB;EACnB,WAAW;AACb;;AAEA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,uBAAuB;EACvB,YAAY;AACd;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,4BAA4B;EAC5B,2BAA2B;EAC3B,YAAY;EACZ,YAAY;AACd;;AAEA,sCAAsC;AACtC;EACE,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,mEAAmE;EACnE,aAAa;EACb,SAAS;EACT,UAAU;EACV,mBAAmB;EACnB,oBAAoB;AACtB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,yCAAyC;EACzC,yCAAyC;EACzC,kBAAkB;EAClB,kCAAkC;EAClC,sBAAsB;EACtB,WAAW;AACb;;AAEA;EACE,eAAe;EACf,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,6BAA6B;EAC7B,gBAAgB;AAClB;;AAEA;EACE,kCAAkC;EAClC,iBAAiB;EACjB,8BAA8B;EAC9B,mBAAmB;EACnB,UAAU;EACV,oBAAoB;EACpB,4BAA4B;EAC5B,qBAAqB;EACrB,gBAAgB;AAClB;;AAEA,gCAAgC;AAChC;EACE,kCAAkC;EAClC,gBAAgB;EAChB,yBAAyB;EACzB,YAAY;EACZ,+BAA+B;EAC/B,aAAa;EACb,8BAA8B;EAC9B,mBAAmB;AACrB;;AAEA,0BAA0B;AAC1B;EACE,kBAAkB;EAClB,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,QAAQ;EACR,SAAS;EACT,SAAS;EACT,UAAU;EACV,WAAW;EACX,YAAY;EACZ,uCAAuC;AACzC;;AAEA;EACE,mCAAmC;EACnC,aAAa;EACb,mBAAmB;EACnB,YAAY;EACZ,kBAAkB;EAClB,6BAA6B;EAC7B,YAAY;EACZ,gBAAgB;EAChB,gBAAgB;EAChB,sBAAsB;EACtB,mCAAmC;EACnC,qBAAqB;EACrB,sCAAsC;EACtC,kCAAkC;EAClC,+BAA+B;EAC/B,0BAA0B;EAC1B,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,mBAAmB;AACrB;;AAEA;EACE,YAAY;EACZ,kBAAkB;EAClB,mBAAmB;EACnB,eAAe;EACf,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA,6BAA6B;AAC7B;EACE,kBAAkB;EAClB,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,SAAS;EACT,4BAA4B;AAC9B;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,mCAAmC;EACnC,YAAY;EACZ,YAAY;EACZ,mBAAmB;EACnB,qCAAqC;EACrC,iBAAiB;EACjB,sBAAsB;EACtB,kCAAkC;EAClC,qBAAqB;EACrB,sCAAsC;EACtC,kCAAkC;EAClC,+BAA+B;EAC/B,0BAA0B;AAC5B;;AAEA,mCAAmC;AACnC;EACE,yDAAiD;EACjD,kBAAkB;EAClB,yCAAyC;EACzC,2BAA2B;EAC3B,4BAA4B;AAC9B;;AAEA;EACE,uEAAuE;EACvE,4CAA4C;EAC5C,iDAAiD;EACjD,mDAAmD;AACrD;;AAEA;EACE,+DAA+D;AACjE;;AAEA;EACE,cAAc;EACd,eAAe;EACf,kBAAkB;EAClB,iBAAiB;EACjB,YAAY;AACd;;AAEA,4BAA4B;AAC5B;EACE,eAAe;EACf,cAAc;EACd,mBAAmB;EACnB,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,eAAe;EACf,kBAAkB;EAClB,kCAAkC;EAClC,+BAA+B;AACjC;;AAEA;;EAEE,cAAc;EACd,eAAe;EACf,uBAAuB;EACvB,wBAAwB;EACxB,yBAAyB;EACzB,UAAU;EACV,YAAY;EACZ,kCAAkC;EAClC,kBAAkB;EAClB,sCAAsC;EACtC,sBAAsB;EACtB,4DAA4D;EAC5D,iBAAiB;EACjB,kBAAkB;EAClB,+BAA+B;EAC/B,aAAa;EACb,gBAAgB;EAChB,wBAAwB;EACxB,qBAAqB;EACrB,eAAe;EACf,mBAAmB;AACrB;;AAEA;EACE,cAAc;EACd,mBAAmB;EACnB,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,kCAAkC;EAClC,kBAAkB;EAClB,gBAAgB;EAChB,wBAAwB,EAAE,sBAAsB;EAChD,qBAAqB,EAAE,YAAY;EACnC,oBAAoB,EAAE,sBAAsB;EAC5C,+BAA+B;EAC/B,aAAa;EACb,sCAAsC;EACtC,sBAAsB;EACtB,4DAA4D;EAC5D,iBAAiB;EACjB,kBAAkB;EAClB,yDAAyD;EACzD,4BAA4B;EAC5B,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,+BAA+B;EAC/B,UAAU;EACV,kCAAkC;AACpC;;AAEA;EACE,YAAY;EACZ,uBAAuB;AACzB;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,+BAA+B;AACjC;;AAEA;EACE,YAAY;EACZ,uBAAuB;AACzB;;AAEA;EACE,2DAA2D;EAC3D,mDAAmD;AACrD;AACA;EACE,aAAa;EACb,sBAAsB;EACtB,YAAY;EACZ,YAAY;EACZ,kBAAkB;AACpB;;AAEA;EACE,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,eAAe;AACjB;;AAEA;EACE,uEAAuE;EACvE,kBAAkB;EAClB,4CAA4C;AAC9C;;AAEA;EACE,8EAA8E;EAC9E,sCAAsC;EACtC,yDAAyD;AAC3D;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,UAAU;EACV,kCAAkC;EAClC,uCAAuC;EACvC,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA,+BAA+B;AAC/B;EACE,eAAe;EACf,YAAY;EACZ,gBAAgB;EAChB,YAAY;AACd;;AAEA,4DAA4D;;AAE5D,4BAA4B;AAC5B;EACE,eAAe;AACjB;;AAEA;EACE,mEAAmE;AACrE;;AAEA;EACE,6BAA6B;EAC7B,iBAAiB;EACjB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,wBAAwB;AAC1B;;AAEA;EACE,oBAAoB;EACpB,YAAY;EACZ,oBAAoB;EACpB,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,6BAA6B;AAC/B;;AAEA;;EAEE,aAAa;AACf;;AAEA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,4DAA4D;EAC5D,+DAA+D;EAC/D,YAAY;EACZ,kBAAkB;EAClB,oBAAoB;EACpB,0BAA0B;EAC1B,kCAAkC;EAClC,yCAAyC;AAC3C;;AAEA;EACE,4DAA4D;EAC5D,aAAa;EACb,WAAW;EACX,mBAAmB;EACnB,cAAc;AAChB;;AAEA;EACE,yBAAyB;EACzB,+BAA+B;EAC/B,kCAAkC;EAClC,mEAAmE;EACnE,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,+BAA+B;EAC/B,UAAU;EACV,kCAAkC;AACpC;;AAEA;EACE,mEAAmE;AACrE;;AAEA,qCAAqC;AACrC;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,+BAA+B;EAC/B,UAAU;EACV,kCAAkC;AACpC;;AAEA;EACE,kCAAkC;EAClC,gBAAgB;EAChB,YAAY;EACZ,+BAA+B;EAC/B,UAAU;EACV,kCAAkC;EAClC,WAAW;AACb;;AAEA;EACE,eAAe;AACjB;;AAEA;;;;GAIG;;AAEH;;;;;;;;;;;;;;;GAeG;;AAEH;;;KAGK;;AAEL;;;;;;EAME,2DAA2D;AAC7D;;AAEA;;;EAGE,mBAAmB;EACnB,kCAAkC;AACpC;;AAEA;;EAEE,kCAAkC;EAClC,+BAA+B;EAC/B,WAAW;EACX,kBAAkB;AACpB;;AAEA;;EAEE,mBAAmB;EACnB,eAAe;EACf,eAAe;AACjB;;AAEA,oCAAoC;AACpC;EACE,kBAAkB;EAClB,cAAc;EACd,YAAY;EACZ,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,uBAAuB;EACvB,SAAS;EACT,6BAA6B;AAC/B;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,YAAY;EACZ,kBAAkB;EAClB,mBAAmB;EACnB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,mCAAmC;EACnC,aAAa;EACb,yCAAyC;EACzC,YAAY;EACZ,sBAAsB;EACtB,kCAAkC;EAClC,qBAAqB;EACrB,sCAAsC;EACtC,kCAAkC;EAClC,+BAA+B;EAC/B,kBAAkB;EAClB,4BAA4B;EAC5B,8BAA8B;AAChC;;AAEA;EACE,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,6BAA6B;EAC7B,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,yCAAyC;EACzC,eAAe;AACjB;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yCAAyC;EACzC,mBAAmB;AACrB\",\"sourcesContent\":[\":root {\\n  --preview-distance: 0px;\\n  --preview-max-height: 75px;\\n  --more-options-top: 0px;\\n  --more-options-left: 0px;\\n}\\n\\n#code-snippet-extension {\\n  background-color: var(--jp-layout-color0);\\n  overflow: auto;\\n}\\n\\n.jp-codeSnippet-fileDialog label {\\n  margin-bottom: 5px;\\n}\\n\\n/*Code Snippet Container CSS*/\\n.jp-codeSnippetsContainer-button,\\n.jp-codeSnippetsContainer-button.jp-mod-styled {\\n  background-color: transparent;\\n  vertical-align: middle;\\n  padding: 0;\\n  padding-right: 8px;\\n}\\n\\n.jp-codeSnippetsContainer-button:hover {\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippetsContainer-title {\\n  align-items: center;\\n  display: flex;\\n  justify-content: space-between;\\n  margin-top: 5px;\\n  height: 30px;\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippetsContainer-name {\\n  font-size: var(--jp-ui-font-size1);\\n  white-space: nowrap;\\n  overflow: hidden;\\n  color: var(--jp-ui-font-color0);\\n  display: flex;\\n  align-items: center;\\n  width: 100%;\\n}\\n\\n.jp-codeSnippetsContainer-name span:nth-child(2) {\\n  white-space: nowrap;\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  height: 19px;\\n}\\n\\n.jp-codeSnippet-name:hover {\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippetsContainer-button {\\n  background-repeat: no-repeat;\\n  background-position: center;\\n  border: none;\\n  height: 100%;\\n}\\n\\n/* Size of the icons in code snippet */\\n.jp-codeSnippetsContainer-action-buttons {\\n  height: 100%;\\n  overflow: hidden;\\n}\\n\\n.jp-codeSnippet-item {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n  display: flex;\\n  margin: 0;\\n  padding: 0;\\n  height: fit-content;\\n  cursor: context-menu;\\n}\\n\\n.jp-codeSnippet-item:hover {\\n  background-color: var(--jp-layout-color2);\\n}\\n\\n#jp-codeSnippet-rename {\\n  background-color: var(--jp-layout-color2);\\n  border: 1px solid var(--jp-layout-color1);\\n  border-radius: 4px;\\n  font-size: var(--jp-ui-font-size1);\\n  box-sizing: border-box;\\n  margin: 0px;\\n}\\n\\n.jp-codeSnippet-metadata {\\n  flex-basis: 95%;\\n  width: 100%;\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: space-evenly;\\n  overflow: hidden;\\n}\\n\\n.jp-codeSnippet-description p {\\n  font-size: var(--jp-ui-font-size0);\\n  line-height: 15px;\\n  color: var(--jp-layout-color4);\\n  margin-bottom: 10px;\\n  width: 90%;\\n  display: -webkit-box;\\n  -webkit-box-orient: vertical;\\n  -webkit-line-clamp: 2;\\n  overflow: hidden;\\n}\\n\\n/* Header bar of code snippets */\\n.jp-codeSnippetsHeader {\\n  font-size: var(--jp-ui-font-size1);\\n  font-weight: 600;\\n  text-transform: uppercase;\\n  padding: 8px;\\n  color: var(--jp-ui-font-color0);\\n  display: flex;\\n  justify-content: space-between;\\n  align-items: center;\\n}\\n\\n/* Save Notification CSS */\\n.jp-codeSnippet-confirm {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  top: 0px;\\n  left: 0px;\\n  margin: 0;\\n  padding: 0;\\n  width: 100%;\\n  height: 100%;\\n  background: var(--jp-dialog-background);\\n}\\n\\n.jp-codeSnippet-Message-content {\\n  background: var(--jp-layout-color1);\\n  display: flex;\\n  align-items: center;\\n  padding: 0px;\\n  padding-left: 40px;\\n  border-top: 7px solid #388e3c;\\n  width: 250px;\\n  min-width: 200px;\\n  min-height: 50px;\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z20);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color1);\\n  margin: auto 6px 30px auto;\\n  resize: none;\\n}\\n\\n.jp-codeSnippet-Message-content .jp-Dialog-header {\\n  padding: 0px;\\n}\\n\\n.jp-codeSnippet-Message-content .jp-Dialog-footer {\\n  padding: 0px;\\n}\\n\\n.jp-codeSnippet-Message-body {\\n  display: flex;\\n  flex-direction: row;\\n  align-items: center;\\n}\\n\\n.jp-codeSnippet-confirm-text {\\n  width: 183px;\\n  font-style: normal;\\n  font-weight: normal;\\n  font-size: 13px;\\n  text-align: left;\\n  padding-left: 10px;\\n}\\n\\n/* Code Snippet Preview CSS */\\n.jp-codeSnippet-preview {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  margin: 0;\\n  top: var(--preview-distance);\\n}\\n\\n.jp-codeSnippet-preview.inactive {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-preview-content {\\n  background: var(--jp-layout-color1);\\n  padding: 5px;\\n  width: 180px;\\n  height: fit-content;\\n  max-height: var(--preview-max-height);\\n  /*height: 106px;*/\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z2);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color1);\\n  margin: 10px 10px 10px 0px;\\n}\\n\\n/* Code Snippet Drag and Drop CSS */\\n.jp-codeSnippet-drag-hover-selected {\\n  background-image: url(./icon/dragtab_jupyter.svg);\\n  margin-right: -2px;\\n  background-color: var(--jp-layout-color2);\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.jp-codeSnippet-drag-image {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\\n  background: var(--jp-cell-editor-background);\\n  width: var(--jp-private-notebook-dragImage-width);\\n  height: var(--jp-private-notebook-dragImage-height);\\n}\\n\\n.jp-codeSnippet-item.jp-codeSnippet-dropTarget {\\n  border-top: 2px solid var(--jp-private-notebook-selected-color);\\n}\\n\\n.jp-codeSnippet-drag-hover {\\n  flex-basis: 5%;\\n  min-width: 20px;\\n  padding-right: 5px;\\n  margin-right: 5px;\\n  cursor: move;\\n}\\n\\n/* Code Snippet Editor CSS */\\n.jp-codeSnippet-editor-title {\\n  margin-left: 2%;\\n  margin-top: 2%;\\n  margin-bottom: 20px;\\n  color: var(--jp-ui-font-color0);\\n  font-size: 25px;\\n}\\n\\n.jp-codeSnippet-editor-label {\\n  margin-left: 2%;\\n  margin-bottom: 5px;\\n  font-size: var(--jp-ui-font-size1);\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippet-editor-name,\\n.jp-codeSnippet-editor-description {\\n  display: block;\\n  margin-left: 2%;\\n  border-top: transparent;\\n  border-left: transparent;\\n  border-right: transparent;\\n  width: 94%;\\n  height: 32px;\\n  font-size: var(--jp-ui-font-size1);\\n  border-radius: 2px;\\n  background: var(--jp-input-background);\\n  box-sizing: border-box;\\n  border: var(--jp-border-width) solid var(--jp-border-color1);\\n  padding-left: 7px;\\n  padding-right: 7px;\\n  color: var(--jp-ui-font-color0);\\n  outline: none;\\n  appearance: none;\\n  -webkit-appearance: none;\\n  -moz-appearance: none;\\n  margin-top: 5px;\\n  margin-bottom: 15px;\\n}\\n\\n.jp-codeSnippet-editor-language {\\n  display: block;\\n  margin-bottom: 20px;\\n  margin-left: 2%;\\n  width: 176px;\\n  height: 32px;\\n  font-size: var(--jp-ui-font-size1);\\n  border-radius: 2px;\\n  appearance: none;\\n  -webkit-appearance: none; /* chrome and safari */\\n  -moz-appearance: none; /* Mozilla */\\n  -ms-appearance: none; /* Internet explorer */\\n  color: var(--jp-ui-font-color0);\\n  outline: none;\\n  background: var(--jp-input-background);\\n  box-sizing: border-box;\\n  border: var(--jp-border-width) solid var(--jp-border-color1);\\n  padding-left: 7px;\\n  padding-right: 7px;\\n  background-image: url(./icon/jupyter_searcharrowdown.svg);\\n  background-repeat: no-repeat;\\n  background-position: 95% center;\\n  margin-top: 5px;\\n}\\n\\n.jp-codeSnippet-editor-language:hover {\\n  background-image: none;\\n}\\n\\n.jp-codeSnippet-editor-tagList {\\n  list-style: none;\\n  margin-left: 2%;\\n  margin-bottom: 8px;\\n  margin-top: -8px;\\n}\\n\\n.jp-codeSnippet-editor-tag {\\n  margin-left: 3px;\\n  margin-right: 3px;\\n}\\n\\n.jp-codeSnippet-editor-tag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-editor-tag input {\\n  border: none;\\n  background: transparent;\\n}\\n\\n.jp-codeSnippet-editor-tag.applied-tag button {\\n  color: var(--jp-ui-font-color1);\\n}\\n\\n.jp-codeSnippet-editor-tag.unapplied-tag button {\\n  color: var(--jp-ui-font-color2);\\n}\\n\\n.jp-codeSnippet-editor-tag.tag.unapplied-tag input {\\n  border: none;\\n  background: transparent;\\n}\\n\\n.jp-codeSnippet-editor-active {\\n  border: 1px solid var(--jp-cell-editor-active-border-color);\\n  background-color: var(--jp-input-active-background);\\n}\\n.jp-codeSnippetInputArea {\\n  display: flex;\\n  flex-direction: column;\\n  height: 100%;\\n  width: 98.5%;\\n  padding-left: 12px;\\n}\\n\\n.jp-codeSnippetInputArea-editor {\\n  overflow: auto;\\n  margin-left: 2%;\\n  margin-right: 3%;\\n  margin-top: 5px;\\n}\\n\\n.jp-codeSnippetInput-editor {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\\n  border-radius: 0px;\\n  background: var(--jp-cell-editor-background);\\n}\\n\\n.jp-codeSnippetInput-editor.active {\\n  border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);\\n  box-shadow: var(--jp-input-box-shadow);\\n  background-color: var(--jp-cell-editor-active-background);\\n}\\n\\n.jp-codeSnippetInput-editor .CodeMirror.cm-s-jupyter {\\n  background: transparent;\\n}\\n\\n.jp-codeSnippetInputArea .saveBtn {\\n  width: 10%;\\n  background: var(--jp-brand-color1);\\n  color: var(--jp-ui-inverse-font-color0);\\n  align-self: flex-end;\\n  margin-top: 12px;\\n  margin-right: 3%;\\n  margin-bottom: 12px;\\n}\\n\\n/* code snippet create button */\\n.jp-createSnippetBtn {\\n  cursor: pointer;\\n  border: none;\\n  background: none;\\n  padding: 0px;\\n}\\n\\n/* @import url('~@jupyterlab/codeeditor/style/index.css'); */\\n\\n/* Code Snippet Filter CSS */\\n.jp-codeSnippet-searchbar {\\n  margin: 0px 8px;\\n}\\n\\n.jp-codeSnippet-filterTools {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n}\\n\\nmark.jp-codeSnippet-search-bolding {\\n  background-color: transparent;\\n  font-weight: bold;\\n  color: var(--jp-ui-font-color0);\\n}\\n\\n.jp-codeSnippet-filter {\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  margin: 10px 10px 0 10px;\\n}\\n\\n.jp-codeSnippet-filter .jp-codeSnippet-filter-btn {\\n  align-self: flex-end;\\n  padding: 0px;\\n  padding-bottom: 10px;\\n  border: none;\\n  background: none;\\n  cursor: pointer;\\n  color: var(--jp-brand-color2);\\n}\\n\\n.jp-codeSnippet-filter-arrow-up.idle,\\n.jp-codeSnippet-filter-option.idle {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-filter-arrow-up {\\n  position: absolute;\\n  margin-top: 20px;\\n  border: var(--jp-border-width) solid var(--jp-border-color2);\\n  border-width: 0 var(--jp-border-width) var(--jp-border-width) 0;\\n  padding: 4px;\\n  margin-right: 38px;\\n  align-self: flex-end;\\n  transform: rotate(-135deg);\\n  -webkit-transform: rotate(-135deg);\\n  background-color: var(--jp-layout-color0);\\n}\\n\\n.jp-codeSnippet-filter-option {\\n  border: var(--jp-border-width) solid var(--jp-border-color2);\\n  height: 140px;\\n  width: 100%;\\n  margin-bottom: 10px;\\n  overflow: auto;\\n}\\n\\n.jp-codeSnippet-filter-title {\\n  text-transform: uppercase;\\n  color: var(--jp-ui-font-color2);\\n  font-size: var(--jp-ui-font-size1);\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n  margin: 10px 10px;\\n  padding-bottom: 5px;\\n}\\n\\n.jp-codeSnippet-filter-tags {\\n  margin: 0px 8px;\\n}\\n\\n.jp-codeSnippet-filter-tag {\\n  margin-left: 3px;\\n  margin-right: 3px;\\n}\\n\\n.jp-codeSnippet-filter-tag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-tools {\\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\\n}\\n\\n/* Code Snippet Tags in InputDialog */\\n.jp-codeSnippet-inputTagList {\\n  list-style: none;\\n}\\n\\n.jp-codeSnippet-inputTag {\\n  margin-left: 8px;\\n  margin-right: 8px;\\n}\\n\\n.jp-codeSnippet-inputTag button {\\n  cursor: pointer;\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-inputTag input {\\n  font-size: var(--jp-ui-font-size1);\\n  background: none;\\n  border: none;\\n  color: var(--jp-ui-font-color2);\\n  padding: 0;\\n  font-size: var(--jp-ui-font-size1);\\n  width: 50px;\\n}\\n\\n.jp-codeSnippet-tags {\\n  margin-top: 8px;\\n}\\n\\n/* .jp-codeSnippet-tag,\\n.jp-codeSnippet-inputTag,\\n.jp-codeSnippet-filter-tag {\\n  height: 5px;\\n} */\\n\\n/* USER Input Form Style\\n.jp-codeSnippet-form {\\n  position: absolute;\\n  z-index: 10000;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  top: 0px;\\n  left: 0px;\\n  margin: 0;\\n  padding: 0;\\n  width: 100%;\\n  height: 100%;\\n  background: var(--jp-dialog-background);\\n} */\\n\\n/* .jp-codesnippet-editor-name:required {\\n    border-color: #808080;\\n    border-width: 3px;\\n  } */\\n\\n.jp-codeSnippet-dialog-name-input.touched:invalid,\\n.jp-codeSnippet-dialog-desc-input.touched:invalid,\\n.jp-codeSnippet-dialog-lang-input.touched:invalid,\\n.jp-codeSnippet-editor-name.touched:invalid,\\n.jp-codeSnippet-editor-description.touched:invalid,\\n.jp-codeSnippet-editor-language.touched:invalid {\\n  border: var(--jp-border-width) solid var(--jp-error-color1);\\n}\\n\\n.jp-codeSnippet-dialog-name-input.jp-mod-styled,\\n.jp-codeSnippet-dialog-desc-input.jp-mod-styled,\\n.jp-codeSnippet-dialog-lang-input.jp-mod-styled {\\n  margin-bottom: 10px;\\n  font-size: var(--jp-ui-font-size1);\\n}\\n\\n.jp-codeSnippet-inputName-validity,\\n.jp-codeSnippet-inputDesc-validity {\\n  font-size: var(--jp-ui-font-size0);\\n  color: var(--jp-ui-font-color1);\\n  margin: 5px;\\n  margin-bottom: 8px;\\n}\\n\\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputName-validity,\\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputDesc-validity {\\n  margin-bottom: 20px;\\n  margin-top: 5px;\\n  margin-left: 3%;\\n}\\n\\n/* 3 Dots Dropdown On Code Snippet */\\n.jp-codeSnippet-options {\\n  position: absolute;\\n  z-index: 10000;\\n  height: 100%;\\n  width: 100%;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: center;\\n  margin: 0;\\n  background-color: transparent;\\n}\\n\\n.jp-codeSnippet-options.inactive {\\n  display: none;\\n}\\n\\n.jp-codeSnippet-more-options-content {\\n  width: 183px;\\n  font-style: normal;\\n  font-weight: normal;\\n  font-size: 13px;\\n  text-align: left;\\n}\\n\\n.jp-codeSnippet-options-content {\\n  background: var(--jp-layout-color1);\\n  padding: 10px;\\n  border: 1px solid var(--jp-border-color0);\\n  width: 180px;\\n  box-sizing: border-box;\\n  box-shadow: var(--jp-elevation-z1);\\n  word-wrap: break-word;\\n  border-radius: var(--jp-border-radius);\\n  font-size: var(--jp-ui-font-size0);\\n  color: var(--jp-ui-font-color1);\\n  position: absolute;\\n  top: var(--more-options-top);\\n  left: var(--more-options-left);\\n}\\n\\n.jp-codeSnippet-options-body {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.jp-codeSnippet-more-options-copy {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-copy:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-insert {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-insert:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-edit {\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-edit:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-delete {\\n  color: var(--jp-error-color0);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-delete:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-export {\\n  color: var(--jp-brand-color0);\\n  padding-bottom: 5px;\\n  cursor: pointer;\\n}\\n\\n.jp-codeSnippet-more-options-export:hover {\\n  background-color: var(--jp-layout-color2);\\n  cursor: pointer;\\n}\\n\\n.jp-dropdown-delete-button {\\n  border: none;\\n}\\n\\n.jp-dropdown-cancel-button {\\n  outline: 1px solid var(--jp-brand-color1);\\n  outline-offset: 4px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./style/base.css\":\n/*!************************!*\\\n  !*** ./style/base.css ***!\n  \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_base_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./base.css */ \"./node_modules/css-loader/dist/cjs.js!./style/base.css\");\n\n            \n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_base_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"], options);\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_base_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"].locals || {});\n\n/***/ }),\n\n/***/ \"./style/icon/dragtab_jupyter.svg\":\n/*!****************************************!*\\\n  !*** ./style/icon/dragtab_jupyter.svg ***!\n  \\****************************************/\n/***/ ((module) => {\n\nmodule.exports = \"data:image/svg+xml,%3Csvg width='11' height='17' viewBox='0 0 11 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath d='M4.5 14.3281C4.5 15.4395 3.6 16.3489 2.5 16.3489C1.4 16.3489 0.5 15.4395 0.5 14.3281C0.5 13.2166 1.4 12.3073 2.5 12.3073C3.6 12.3073 4.5 13.2166 4.5 14.3281ZM2.5 6.24475C1.4 6.24475 0.5 7.15413 0.5 8.26558C0.5 9.37704 1.4 10.2864 2.5 10.2864C3.6 10.2864 4.5 9.37704 4.5 8.26558C4.5 7.15413 3.6 6.24475 2.5 6.24475ZM2.5 0.182251C1.4 0.182251 0.5 1.09163 0.5 2.20308C0.5 3.31454 1.4 4.22392 2.5 4.22392C3.6 4.22392 4.5 3.31454 4.5 2.20308C4.5 1.09163 3.6 0.182251 2.5 0.182251ZM8.5 4.22392C9.6 4.22392 10.5 3.31454 10.5 2.20308C10.5 1.09163 9.6 0.182251 8.5 0.182251C7.4 0.182251 6.5 1.09163 6.5 2.20308C6.5 3.31454 7.4 4.22392 8.5 4.22392ZM8.5 6.24475C7.4 6.24475 6.5 7.15413 6.5 8.26558C6.5 9.37704 7.4 10.2864 8.5 10.2864C9.6 10.2864 10.5 9.37704 10.5 8.26558C10.5 7.15413 9.6 6.24475 8.5 6.24475ZM8.5 12.3073C7.4 12.3073 6.5 13.2166 6.5 14.3281C6.5 15.4395 7.4 16.3489 8.5 16.3489C9.6 16.3489 10.5 15.4395 10.5 14.3281C10.5 13.2166 9.6 12.3073 8.5 12.3073Z' fill='%23828282'/%3E %3C/svg%3E\"\n\n/***/ }),\n\n/***/ \"./style/icon/jupyter_searcharrowdown.svg\":\n/*!************************************************!*\\\n  !*** ./style/icon/jupyter_searcharrowdown.svg ***!\n  \\************************************************/\n/***/ ((module) => {\n\nmodule.exports = \"data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E %3Cpath d='M10.5622 0.464844L5.96549 5.06151L1.36883 0.464844L0.132161 1.70151L5.96549 7.53484L11.7988 1.70151L10.5622 0.464844Z' fill='%23616161'/%3E %3C/svg%3E\"\n\n/***/ }),\n\n/***/ \"./style/index.js\":\n/*!************************!*\\\n  !*** ./style/index.js ***!\n  \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _base_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base.css */ \"./style/base.css\");\n\n\n\n/***/ })\n\n}]);\n//# sourceMappingURL=style_index_js.93ff47ff4745f8384ae9.js.map"
  },
  {
    "path": "jupyterlab-code-snippets/labextension/static/vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js",
    "content": "\"use strict\";\n(self[\"webpackChunkjupyterlab_code_snippets\"] = self[\"webpackChunkjupyterlab_code_snippets\"] || []).push([[\"vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f\"],{\n\n/***/ \"./node_modules/css-loader/dist/runtime/api.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/api.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\n\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item);\n\n      if (item[2]) {\n        return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n  // eslint-disable-next-line func-names\n\n\n  list.i = function (modules, mediaQuery, dedupe) {\n    if (typeof modules === \"string\") {\n      // eslint-disable-next-line no-param-reassign\n      modules = [[null, modules, \"\"]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var i = 0; i < this.length; i++) {\n        // eslint-disable-next-line prefer-destructuring\n        var id = this[i][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _i = 0; _i < modules.length; _i++) {\n      var item = [].concat(modules[_i]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        // eslint-disable-next-line no-continue\n        continue;\n      }\n\n      if (mediaQuery) {\n        if (!item[2]) {\n          item[2] = mediaQuery;\n        } else {\n          item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/cssWithMappingToString.js\":\n/*!************************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/cssWithMappingToString.js ***!\n  \\************************************************************************/\n/***/ ((module) => {\n\n\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n  var _item = _slicedToArray(item, 4),\n      content = _item[1],\n      cssMapping = _item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (typeof btoa === \"function\") {\n    // eslint-disable-next-line no-undef\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n    var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n    var sourceMapping = \"/*# \".concat(data, \" */\");\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n  }\n\n  return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/getUrl.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***!\n  \\********************************************************/\n/***/ ((module) => {\n\n\n\nmodule.exports = function (url, options) {\n  if (!options) {\n    // eslint-disable-next-line no-param-reassign\n    options = {};\n  } // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n\n\n  url = url && url.__esModule ? url.default : url;\n\n  if (typeof url !== \"string\") {\n    return url;\n  } // If url is already wrapped in quotes, remove them\n\n\n  if (/^['\"].*['\"]$/.test(url)) {\n    // eslint-disable-next-line no-param-reassign\n    url = url.slice(1, -1);\n  }\n\n  if (options.hash) {\n    // eslint-disable-next-line no-param-reassign\n    url += options.hash;\n  } // Should url be wrapped?\n  // See https://drafts.csswg.org/css-values-3/#urls\n\n\n  if (/[\"'() \\t\\n]/.test(url) || options.needQuotes) {\n    return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n  }\n\n  return url;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!\n  \\****************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : 0;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && typeof btoa !== 'undefined') {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};\n\n/***/ })\n\n}]);\n//# sourceMappingURL=vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_cssW-7d5e6f.8245c3041950ff727f29.js.map"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"jupyterlab-code-snippets\",\n  \"version\": \"2.2.0\",\n  \"description\": \"EXPERIMENTAL: Save, reuse, and share code snippets using JupyterLab Code Snippets\",\n  \"keywords\": [\n    \"jupyter\",\n    \"jupyterlab\",\n    \"jupyterlab-extension\"\n  ],\n  \"homepage\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git/issues\"\n  },\n  \"license\": \"BSD-3-Clause\",\n  \"author\": {\n    \"name\": \"Jay Ahn, Kiran Pinnipati\",\n    \"email\": \"aju960219@gmail.com\"\n  },\n  \"files\": [\n    \"lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}\",\n    \"style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}\",\n    \"schema/*.json\",\n    \"style/index.js\"\n  ],\n  \"main\": \"lib/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"style\": \"style/index.css\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/jupytercalpoly/jupyterlab-code-snippets.git\"\n  },\n  \"scripts\": {\n    \"build\": \"jlpm run build:lib && jlpm run build:labextension:dev\",\n    \"build:labextension\": \"jupyter labextension build .\",\n    \"build:labextension:dev\": \"jupyter labextension build --development True .\",\n    \"build:lib\": \"tsc\",\n    \"build:prod\": \"jlpm run clean && jlpm run build:lib && jlpm run build:labextension\",\n    \"clean\": \"jlpm run clean:lib\",\n    \"clean:labextension\": \"rimraf jupyterlab-code-snippets/labextension\",\n    \"clean:lib\": \"rimraf lib tsconfig.tsbuildinfo\",\n    \"clean:all\": \"jlpm clean:lib && jlpm clean:labextension\",\n    \"eslint\": \"eslint . --ext .ts,.tsx --fix\",\n    \"eslint:check\": \"eslint . --ext .ts,.tsx\",\n    \"format\": \"prettier \\\"src/**/*.{ts, tsx}\\\" --check\",\n    \"install:extension\": \"jlpm build\",\n    \"prepare\": \"jlpm run clean && jlpm run build:prod\",\n    \"watch\": \"run-p watch:src watch:labextension\",\n    \"watch:labextension\": \"jupyter labextension watch .\",\n    \"watch:src\": \"tsc -w\",\n    \"test\": \"jest --watch\",\n    \"test:cov\": \"jest --collect-coverage\",\n    \"cypress\": \"cypress open\",\n    \"postintall\": \"husky install\",\n    \"prepublishOnly\": \"pinst --disable\",\n    \"postpublish\": \"pinst --enable\"\n  },\n  \"dependencies\": {\n    \"@jupyterlab/application\": \"^3.5.2\",\n    \"@jupyterlab/apputils\": \"^3.5.2\",\n    \"@jupyterlab/cells\": \"^3.5.0\",\n    \"@jupyterlab/celltags\": \"^3.5.2\",\n    \"@jupyterlab/coreutils\": \"5.5.2\",\n    \"@jupyterlab/docmanager\": \"^3.5.2\",\n    \"@jupyterlab/docregistry\": \"^3.5.0\",\n    \"@jupyterlab/fileeditor\": \"^3.5.2\",\n    \"@jupyterlab/nbconvert-css\": \"^3.5.2\",\n    \"@jupyterlab/nbformat\": \"^3.5.2\",\n    \"@jupyterlab/notebook\": \"^3.5.2\",\n    \"@jupyterlab/rendermime\": \"^3.5.2\",\n    \"@jupyterlab/services\": \"^6.5.2\",\n    \"@lumino/algorithm\": \"^1.3.3\",\n    \"@lumino/coreutils\": \"^1.5.3\",\n    \"@lumino/dragdrop\": \"^1.7.1\",\n    \"@lumino/messaging\": \"^1.4.3\",\n    \"@lumino/properties\": \"^1.2.3\",\n    \"@lumino/signaling\": \"^1.4.3\",\n    \"@lumino/widgets\": \"^1.36.0\",\n    \"@types/react\": \"^16.9.56\",\n    \"@types/react-dom\": \"^16.9.9\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7\",\n    \"@babel/preset-env\": \"^7.12.1\",\n    \"@babel/preset-react\": \"^7.12.5\",\n    \"@jupyterlab/builder\": \"^3.5.2\",\n    \"@jupyterlab/testutils\": \"^3.5.2\",\n    \"@testing-library/react\": \"^11.1.1\",\n    \"@types/enzyme\": \"^3.10.8\",\n    \"@types/enzyme-adapter-react-16\": \"^1.0.6\",\n    \"@types/jest\": \"^26.0.15\",\n    \"@types/node-fetch\": \"^2.5.7\",\n    \"@types/react-test-renderer\": \"^16.9.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^4.8.1\",\n    \"@typescript-eslint/parser\": \"^4.8.1\",\n    \"babel-jest\": \"^26.6.3\",\n    \"cypress\": \"^6.5.0\",\n    \"enzyme\": \"^3.11.0\",\n    \"enzyme-adapter-react-16\": \"^1.15.5\",\n    \"eslint\": \"^7.14.0\",\n    \"eslint-config-prettier\": \"^6.15.0\",\n    \"eslint-plugin-prettier\": \"^3.1.4\",\n    \"eslint-plugin-react\": \"^7.20.4\",\n    \"got\": \"^11.8.5\",\n    \"husky\": \"^5.1.3\",\n    \"jest\": \"^26.6.3\",\n    \"jest-fetch-mock\": \"^3.0.3\",\n    \"lint-staged\": \"^10.5.4\",\n    \"marked\": \"^4.0.17\",\n    \"mkdirp\": \"^1.0.3\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"pinst\": \"^2.1.6\",\n    \"prettier\": \"^2.2.1\",\n    \"react-test-renderer\": \"^17.0.1\",\n    \"rimraf\": \"^3.0.2\",\n    \"ts-jest\": \"^26.4.4\",\n    \"typescript\": \"~4.1.3\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"^16.9.56\"\n  },\n  \"sideEffects\": [\n    \"style/*.css\",\n    \"style/index.js\"\n  ],\n  \"jupyterlab\": {\n    \"extension\": true,\n    \"schemaDir\": \"schema\",\n    \"outputDir\": \"jupyterlab-code-snippets/labextension\"\n  },\n  \"lint-staged\": {\n    \"src/*.{js,jsx,ts,tsx}\": [\n      \"eslint --cache --fix\"\n    ],\n    \"src/*.js\": \"eslint --cache --fix\"\n  },\n  \"styleModule\": \"style/index.js\"\n}\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"hatchling>=1.4.0\", \"jupyterlab>=3.4.7,<4.0.0\", \"hatch-nodejs-version\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"jupyterlab-code-snippets\"\nreadme = \"README.md\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.7\"\nclassifiers = [\n    \"Framework :: Jupyter\",\n    \"Framework :: Jupyter :: JupyterLab\",\n    \"Framework :: Jupyter :: JupyterLab :: 3\",\n    \"Framework :: Jupyter :: JupyterLab :: Extensions\",\n    \"Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt\",\n    \"License :: OSI Approved :: BSD License\",\n    \"Programming Language :: Python\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.7\",\n    \"Programming Language :: Python :: 3.8\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n]\ndependencies = [\n]\ndynamic = [\"version\", \"description\", \"authors\", \"urls\", \"keywords\"]\n\n[tool.hatch.version]\nsource = \"nodejs\"\n\n[tool.hatch.metadata.hooks.nodejs]\nfields = [\"description\", \"authors\", \"urls\"]\n\n[tool.hatch.build.targets.sdist]\nartifacts = [\"jupyterlab-code-snippets/labextension\"]\nexclude = [\".github\", \"binder\"]\n\n[tool.hatch.build.targets.wheel.shared-data]\n\"jupyterlab-code-snippets/labextension\" = \"share/jupyter/labextensions/jupyterlab-code-snippets\"\n\"install.json\" = \"share/jupyter/labextensions/jupyterlab-code-snippets/install.json\"\n\n[tool.hatch.build.hooks.version]\npath = \"jupyterlab-code-snippets/_version.py\"\n\n[tool.hatch.build.hooks.jupyter-builder]\ndependencies = [\"hatch-jupyter-builder>=0.5\"]\nbuild-function = \"hatch_jupyter_builder.npm_builder\"\nensured-targets = [\n    \"jupyterlab-code-snippets/labextension/static/style.js\",\n    \"jupyterlab-code-snippets/labextension/package.json\",\n]\nskip-if-exists = [\"jupyterlab-code-snippets/labextension/static/style.js\"]\n\n[tool.hatch.build.hooks.jupyter-builder.build-kwargs]\nbuild_cmd = \"build:prod\"\nnpm = [\"jlpm\"]\n\n[tool.hatch.build.hooks.jupyter-builder.editable-build-kwargs]\nbuild_cmd = \"install:extension\"\nnpm = [\"jlpm\"]\nsource_dir = \"src\"\nbuild_dir = \"jupyterlab-code-snippets/labextension\"\n\n[tool.jupyter-releaser.options]\nversion_cmd = \"hatch version\"\n\n[tool.jupyter-releaser.hooks]\nbefore-build-npm = [\"python -m pip install jupyterlab~=3.1\", \"jlpm\", \"jlpm build:prod\"]\nbefore-build-python = [\"jlpm clean:all\"]\n\n[tool.check-wheel-contents]\nignore = [\"W002\"]\n"
  },
  {
    "path": "schema/snippets.json",
    "content": "{\n    \"jupyter.lab.setting-icon\": \"custom-ui-components:codeSnippetIcon\",\n    \"jupyter.lab.setting-icon-label\": \"Code Snippet\",\n    \"title\": \"Code Snippet Manager\",\n    \"description\": \"Code Snippet Manager Settings\",\n    \"version\": \"1.0.0\",\n    \"jupyter.lab.shortcuts\": [\n        {\n          \"command\": \"codeSnippet:save-as-snippet\",\n          \"keys\": [\"Accel Shift A\"],\n          \"selector\": \".jp-Notebook\"\n        },\n        {\n          \"command\": \"codeSnippet:save-as-snippet\",\n          \"keys\": [\"Accel Shift A\"],\n          \"selector\": \".jp-FileEditor\"\n        }\n    ],\n    \"properties\": {\n        \"snippets\": {\n            \"title\": \"List of code snippets\",\n            \"description\": \"A snippet is defined by a 'id', 'name', and 'language'\",\n            \"items\": { \"$ref\": \"#/definitions/snippet\" },\n            \"type\": \"array\",\n            \"default\": []\n        },\n        \"snippetPreviewFontSize\": {\n            \"title\": \"Font Size of Preview\",\n            \"type\": \"number\",\n            \"default\": 3,\n            \"description\": \"Change the font size of preview to see its content\"\n        }\n    },\n    \"additionalProperties\": false,\n    \"type\": \"object\",\n    \"definitions\": {\n        \"snippet\": {\n            \"properties\": {\n                \"id\": {\n                    \"title\": \"Unique id\", \n                    \"type\": \"number\" \n                },\n                \"name\": { \n                    \"title\": \"Unique name\",\n                    \"type\": \"string\"\n                 },\n                \"description\": {\n                    \"title\": \"Description\", \n                    \"type\": \"string\"\n                },\n                \"language\": { \n                    \"title\": \"Language\", \n                    \"type\": \"string\"\n                },\n                \"code\": {\n                    \"title\": \"Code\",\n                    \"type\": \"string\"\n                },\n                \"tags\": {\n                    \"title\": \"Tags\",\n                    \"items\": { \"$ref\": \"#/definitions/tag\"},\n                    \"type\": \"array\",\n                    \"default\": []\n                }\n            },\n            \"required\": [\"id\", \"name\", \"language\", \"code\"],\n            \"additionalProperties\": false,\n            \"type\": \"object\"\n        },\n        \"tag\": {\n            \"title\": \"Unique Tag Name\",\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "setup.py",
    "content": "__import__('setuptools').setup()\n"
  },
  {
    "path": "snippets_example/carbon_emissions.json",
    "content": "{\"name\":\"carbon_emissions\",\"description\":\"Total carbon dioxide, in gigatonnes, by region, over time\",\"language\":\"R\",\"code\":[\"co2_regions <- nations %>%\",\"  filter(year <= 2014) %>%\",\"  mutate(co2 = co2_percap * population / 10^9) %>%\",\"  group_by(region, year) %>%\",\"  summarize(total_co2 = sum(co2, na.rm = TRUE))\"],\"id\":15,\"tags\":[\"Countries Project\"]}"
  },
  {
    "path": "snippets_example/filter_income.json",
    "content": "{\"name\":\"filter_income\",\"description\":\"Find the ten high income countries with the shortest life expectancy from country data.\",\"language\":\"R\",\"code\":[\"high_income_short_life <- longevity %>%\",\"  filter(income == \\\"High income\\\") %>%\",\"  arrange(life_expect) %>%\",\"  head(10)\"],\"id\":8,\"tags\":[\"Countries Project\"]}"
  },
  {
    "path": "snippets_example/gdp_calculator.json",
    "content": "{\"name\":\"gdp_calculator\",\"description\":\"Calculate total GDP, in trillions of dollars, by region, over time\",\"language\":\"R\",\"code\":[\"gdp_regions <- nations %>%\",\"  mutate(gdp = gdp_percap * population,\",\"         gdp_tn = gdp/1000000000000) %>%\",\"  group_by(region, year) %>%\",\"  summarize(total_gdp_tn = sum(gdp_tn, na.rm = TRUE))\",\"\"],\"id\":11,\"tags\":[\"Countries Project\"]}"
  },
  {
    "path": "snippets_example/generate_hundred.json",
    "content": "{\"name\":\"generate_hundred\",\"description\":\"Scala program to print numbers from 1 to 100  using for loop with until to determine loop range.\",\"language\":\"Scala\",\"code\":[\"object ExampleForLoop2 {\",\"   def main(args: Array[String]) {\",\"      var counter: Int=0;\",\"      \",\"      for(counter <- 1 until 101)\",\"        print(counter + \\\" \\\");\",\"    \",\"      // to print new line\",\"      println();\",\"   }\",\"}\"],\"id\":13,\"tags\":[\"math\"]}"
  },
  {
    "path": "snippets_example/import_cleaning.json",
    "content": "{\"name\":\"import_cleaning\",\"description\":\"Import statements for cleaning.\",\"language\":\"Python\",\"code\":[\"# Importing the necessary libraries.\",\"import pandas as pd\",\"import numpy as np\"],\"id\":5,\"tags\":[\"import statements\"]}"
  },
  {
    "path": "snippets_example/import_matlib.json",
    "content": "{\"name\":\"import_matlib\",\"description\":\"import statements for matlib\",\"language\":\"Python\",\"code\":[\"import matplotlib as mpl\",\"import matplotlib.pyplot as plt\"],\"id\":1,\"tags\":[\"import statements\"]}"
  },
  {
    "path": "snippets_example/life_exp_eur_asia.json",
    "content": "{\"name\":\"life_exp_eur_asia\",\"description\":\"Find countries in North America or Europe and Central Asia with a life expectancy in 2016 of 75 to 80.\",\"language\":\"R\",\"code\":[\"eur_na_75_80 <- longevity %>%\",\"  filter(life_expect > 75 & life_expect < 80 & (region == \\\"Europe & Central Asia\\\" | region == \\\"North America\\\")) %>%\",\"  arrange(desc(life_expect))\"],\"id\":9,\"tags\":[\"Countries Project\"]}"
  },
  {
    "path": "snippets_example/lorenz_deriv.json",
    "content": "{\"name\":\"lorenz_deriv\",\"description\":\"Math equation for lorenz.\",\"language\":\"Python\",\"code\":[\"    def lorenz_deriv(x_y_z, t0, sigma=sigma, beta=beta, rho=rho):\",\"        \\\"\\\"\\\"Compute the time-derivative of a Lorenz system.\\\"\\\"\\\"\",\"        x, y, z = x_y_z\",\"        return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]\"],\"id\":4,\"tags\":[\"custom\",\"math\",\"lorenz\"]}"
  },
  {
    "path": "snippets_example/matplotlib_import.json",
    "content": "{\"name\":\"matplotlib_import\",\"description\":\"Import statements to start plotting with matplotlib.\",\"language\":\"Python\",\"code\":[\"import matplotlib as mpl\",\"import matplotlib.pyplot as plt\"],\"id\":3,\"tags\":[\"import statements\"]}"
  },
  {
    "path": "snippets_example/matrix_lstsqr.json",
    "content": "{\"name\":\"matrix_lstsqr\",\"description\":\"Math equation for least squares\",\"language\":\"Python\",\"code\":[\"import numpy as np\",\"\",\"def matrix_lstsqr(x, y):\",\"    \\\"\\\"\\\" Computes the least-squares solution to a linear matrix equation. \\\"\\\"\\\"\",\"    X = np.vstack([x, np.ones(len(x))]).T\",\"    return (np.linalg.inv(X.T.dot(X)).dot(X.T)).dot(y)\"],\"id\":2,\"tags\":[\"math\"]}"
  },
  {
    "path": "snippets_example/most_frequent.json",
    "content": "{\"name\":\"most_frequent\",\"description\":\"This method returns the most frequent element that appears in a list.\",\"language\":\"Python\",\"code\":[\"def most_frequent(list):\",\"    return max(set(list), key = list.count)\",\"  \",\"\",\"numbers = [1,2,1,2,3,2,1,4,2]\",\"most_frequent(numbers)  \"],\"id\":6}"
  },
  {
    "path": "snippets_example/parallel_strings.json",
    "content": "{\"name\":\"parallel_strings\",\"description\":\"A simple queue function to generate four random strings in parallel.\",\"language\":\"Python\",\"code\":[\"import multiprocessing as mp\",\"import random\",\"import string\",\"\",\"random.seed(123)\",\"\",\"# Define an output queue\",\"output = mp.Queue()\",\"\",\"# define a example function\",\"def rand_string(length, output):\",\"    \\\"\\\"\\\" Generates a random string of numbers, lower- and uppercase chars. \\\"\\\"\\\"\",\"    rand_str = ''.join(random.choice(\",\"                        string.ascii_lowercase \",\"                        + string.ascii_uppercase \",\"                        + string.digits)\",\"                   for i in range(length))\",\"    output.put(rand_str)\",\"\",\"# Setup a list of processes that we want to run\",\"processes = [mp.Process(target=rand_string, args=(5, output)) for x in range(4)]\",\"\",\"# Run processes\",\"for p in processes:\",\"    p.start()\",\"\",\"# Exit the completed processes\",\"for p in processes:\",\"    p.join()\",\"\",\"# Get process results from the output queue\",\"results = [output.get() for p in processes]\",\"\",\"print(results)\"],\"id\":16,\"tags\":[\"multiprocessing\"]}"
  },
  {
    "path": "snippets_example/plotting_sine.json",
    "content": "{\"name\":\"plotting_sine\",\"description\":\"Plotting code for sine graph using matplotlib.\",\"language\":\"Python\",\"code\":[\"import matplotlib.pyplot as plt\",\"import numpy as np\",\"\",\"x = np.linspace(0, 10, 100)\",\"\",\"plt.plot(x, np.sin(x))\",\"plt.plot(x, np.cos(x))\",\"\",\"plt.show()\"],\"id\":14,\"tags\":[\"math\"]}"
  },
  {
    "path": "snippets_example/progress_bar.json",
    "content": "{\"name\":\"progress_bar\",\"description\":\"Create a progress bar.\",\"language\":\"Python\",\"code\":[\"class ProgressBar():\",\"    def __init__(self, width=50):\",\"        self.pointer = 0\",\"        self.width = width\",\"\",\"    def __call__(self,x):\",\"         # x in percent\",\"         self.pointer = int(self.width*(x/100.0))\",\"         return \\\"|\\\" + \\\"#\\\"*self.pointer + \\\"-\\\"*(self.width-self.pointer)+\\\\\",\"                \\\"|\\\\n %d percent done\\\" % int(x) \"],\"id\":10,\"tags\":[\"Time\"]}"
  },
  {
    "path": "snippets_example/sum_array.json",
    "content": "{\"name\":\"sum_array\",\"description\":\"Scala program of array. Declare, print, and calculate sum of all elements.\",\"language\":\"Scala\",\"code\":[\"object ExampleArray1 {\",\"    \",\"   def main(args: Array[String]) {\",\"       \",\"      var numbers = Array(10,20,30,40,50);\",\"      var N:Int=0;\",\"      \",\"      //print all array elements\",\"      println(\\\"All array elements: \\\");\",\"      for ( N <- numbers ) {\",\"         println(N);\",\"      }\",\"      //calculating SUM of all elements\",\"      var sum: Int=0;\",\"      for ( N <- numbers ) {\",\"         sum+=N;\",\"      }      \",\"      println(\\\"Sum of all array elements: \\\"+sum);\",\"\",\"   }\",\"}\"],\"id\":12,\"tags\":[\"math\"]}"
  },
  {
    "path": "snippets_example/time_calculation.json",
    "content": "{\"name\":\"time_calculation\",\"description\":\"Snippet that measures the amount of time a section of code takes to run.\",\"language\":\"Python\",\"code\":[\"import time\",\"\",\"start_time = time.time()\",\"\",\"a = 1\",\"b = 2\",\"c = a + b\",\"print(c) #3\",\"\",\"end_time = time.time()\",\"total_time = end_time - start_time\",\"print(\\\"Time: \\\", total_time)\",\"\",\"# ('Time: ', 1.1205673217773438e-05)\"],\"id\":7,\"tags\":[\"Time\"]}"
  },
  {
    "path": "src/CodeSnippetContentsService.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { ContentsManager, Drive, Contents } from '@jupyterlab/services';\n\n/**\n * Singleton contentsService class\n */\nexport class CodeSnippetContentsService {\n  drive: Drive;\n  contentsManager: ContentsManager;\n  private static instance: CodeSnippetContentsService;\n  private constructor() {\n    const drive = new Drive({ name: 'snippetDrive ' });\n    const contentsManager = new ContentsManager({ defaultDrive: drive });\n    this.drive = drive;\n    this.contentsManager = contentsManager;\n  }\n\n  static getInstance(): CodeSnippetContentsService {\n    if (!this.instance) {\n      this.instance = new CodeSnippetContentsService();\n    }\n    return this.instance;\n  }\n\n  /**\n   * Create a file/directory if it does not exist. Otherwise, save the change in a file/directory in the given path\n   * @param path path to a file/directory\n   * @param options options that specify if it's a file or directory and additial information\n   * Usage: save('snippets', { type: 'directory' }) to create/save a directory\n   *        save('snippets/test.json', {type: 'file', format: 'text', content: 'Lorem ipsum dolor sit amet'})\n   */\n  async save(\n    path: string,\n    options?: Partial<Contents.IModel>\n  ): Promise<Contents.IModel> {\n    try {\n      const changedModel = await this.contentsManager.save(path, options);\n      return changedModel;\n    } catch (error) {\n      return error;\n    }\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetDisplay.tsx",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code are from Elyra Code Snippet.\n\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\nimport {\n  Clipboard,\n  Dialog,\n  InputDialog,\n  showDialog,\n} from '@jupyterlab/apputils';\nimport { PathExt } from '@jupyterlab/coreutils';\nimport { DocumentWidget } from '@jupyterlab/docregistry';\nimport { FileEditor } from '@jupyterlab/fileeditor';\nimport { Notebook, NotebookPanel } from '@jupyterlab/notebook';\nimport {\n  LabIcon,\n  addIcon,\n  pythonIcon,\n  fileIcon,\n  rKernelIcon,\n  markdownIcon,\n} from '@jupyterlab/ui-components';\nimport { CodeEditor, IEditorServices } from '@jupyterlab/codeeditor';\nimport * as nbformat from '@jupyterlab/nbformat';\nimport { JupyterFrontEnd } from '@jupyterlab/application';\nimport { CodeCellModel, MarkdownCell, CodeCell } from '@jupyterlab/cells';\n\nimport { Widget } from '@lumino/widgets';\nimport { find, StringExt } from '@lumino/algorithm';\nimport { Drag } from '@lumino/dragdrop';\nimport { MimeData, ReadonlyPartialJSONObject } from '@lumino/coreutils';\n\nimport React from 'react';\nimport { CodeSnippetService, ICodeSnippet } from './CodeSnippetService';\nimport { FilterTools } from './CodeSnippetFilterTools';\nimport { showPreview } from './CodeSnippetPreview';\nimport { showMoreOptions } from './CodeSnippetMenu';\n\nimport { CodeSnippetContentsService } from './CodeSnippetContentsService';\n\nimport moreSVGstr from '../style/icon/jupyter_moreicon.svg';\nimport {\n  babelIcon,\n  javaIcon,\n  juliaIcon,\n  matlabIcon,\n  schemeIcon,\n  processingIcon,\n  scalaIcon,\n  groovyIcon,\n  forthIcon,\n  haskellIcon,\n  rubyIcon,\n  typescriptIcon,\n  javascriptIcon,\n  coffeescriptIcon,\n  livescriptIcon,\n  csharpIcon,\n  fsharpIcon,\n  goIcon,\n  erlangIcon,\n  ocamlIcon,\n  fortranIcon,\n  perlIcon,\n  phpIcon,\n  clojureIcon,\n  luaIcon,\n  purescriptIcon,\n  cppIcon,\n  prologIcon,\n  lispIcon,\n  cIcon,\n  kotlinIcon,\n  nodejsIcon,\n  coconutIcon,\n  sbtIcon,\n  rustIcon,\n  qsharpIcon,\n  sasIcon,\n  powershellIcon,\n} from './CodeSnippetLanguages';\nimport { showMessage } from './CodeSnippetMessage';\n\n/**\n * The CSS class added to code snippet widget.\n */\nconst CODE_SNIPPETS_HEADER_CLASS = 'jp-codeSnippetsHeader';\nconst CODE_SNIPPET_TITLE = 'jp-codeSnippet-title';\nconst CODE_SNIPPETS_CONTAINER = 'jp-codeSnippetsContainer';\nconst DISPLAY_NAME_CLASS = 'jp-codeSnippetsContainer-name';\nconst BUTTON_CLASS = 'jp-codeSnippetsContainer-button';\nconst TITLE_CLASS = 'jp-codeSnippetsContainer-title';\nconst ACTION_BUTTONS_WRAPPER_CLASS = 'jp-codeSnippetsContainer-action-buttons';\nconst ACTION_BUTTON_CLASS = 'jp-codeSnippetsContainer-actionButton';\nconst SEARCH_BOLD = 'jp-codeSnippet-search-bolding';\nconst SNIPPET_DRAG_IMAGE = 'jp-codeSnippet-drag-image';\nconst CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';\nconst CODE_SNIPPET_DRAG_HOVER_SELECTED = 'jp-codeSnippet-drag-hover-selected';\nconst CODE_SNIPPET_METADATA = 'jp-codeSnippet-metadata';\nconst CODE_SNIPPET_DESC = 'jp-codeSnippet-description';\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_MORE_OPTIONS = 'jp-codeSnippet-options';\nconst CODE_SNIPPET_MORE_OTPIONS_CONTENT = 'jp-codeSnippet-more-options-content';\nconst CODE_SNIPPET_MORE_OTPIONS_COPY = 'jp-codeSnippet-more-options-copy';\nconst CODE_SNIPPET_MORE_OTPIONS_INSERT = 'jp-codeSnippet-more-options-insert';\nconst CODE_SNIPPET_MORE_OTPIONS_EDIT = 'jp-codeSnippet-more-options-edit';\nconst CODE_SNIPPET_MORE_OTPIONS_DELETE = 'jp-codeSnippet-more-options-delete';\nconst CODE_SNIPPET_MORE_OTPIONS_EXPORT = 'jp-codeSnippet-more-options-export';\nconst CODE_SNIPPET_CREATE_NEW_BTN = 'jp-createSnippetBtn';\nconst CODE_SNIPPET_NAME = 'jp-codeSnippet-name';\nconst OPTIONS_BODY = 'jp-codeSnippet-options-body';\n\n/**\n * The threshold in pixels to start a drag event.\n */\nconst DRAG_THRESHOLD = 3;\n\n/**\n * A class used to indicate a snippet item.\n */\nconst CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';\n\n/**\n * The mimetype used for Jupyter cell data.\n */\nconst JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';\n\n/**\n * Icon for more options\n */\nconst moreOptionsIcon = new LabIcon({\n  name: 'custom-ui-components:moreOptions',\n  svgstr: moreSVGstr,\n});\n\n/**\n * CodeSnippetDisplay props.\n */\ninterface ICodeSnippetDisplayProps {\n  codeSnippets: ICodeSnippet[];\n  codeSnippetManager: CodeSnippetService;\n  app: JupyterFrontEnd;\n  getCurrentWidget: () => Widget;\n  openCodeSnippetEditor: (args: ReadonlyPartialJSONObject) => void;\n  editorServices: IEditorServices;\n  updateCodeSnippetWidget: () => void;\n}\n\n/**\n * CodeSnippetDisplay state.\n */\ninterface ICodeSnippetDisplayState {\n  searchValue: string;\n  filterTags: string[];\n  selectedLangTags: string[];\n  searchOptions: string[];\n}\n\n/**\n * A React Component for code-snippets display list.\n */\nexport class CodeSnippetDisplay extends React.Component<\n  ICodeSnippetDisplayProps,\n  ICodeSnippetDisplayState\n> {\n  _drag: Drag;\n  _dragData: { pressX: number; pressY: number; dragImage: HTMLElement };\n  constructor(props: ICodeSnippetDisplayProps) {\n    super(props);\n    this.state = {\n      searchValue: '',\n      filterTags: [],\n      selectedLangTags: [],\n      searchOptions: [],\n    };\n    this._drag = null;\n    this._dragData = null;\n    this.handleDragMove = this.handleDragMove.bind(this);\n    this._evtMouseUp = this._evtMouseUp.bind(this);\n    this.handleRenameSnippet = this.handleRenameSnippet.bind(this);\n    this.setSearchOptions = this.setSearchOptions.bind(this);\n  }\n\n  filterSnippets = (\n    codeSnippets: ICodeSnippet[],\n    searchValue: string,\n    filterTags: string[],\n    selectedLangTags: string[]\n  ): {\n    filteredCodeSnippets: ICodeSnippet[];\n    matchedIndices: { [id: number]: number[] };\n  } => {\n    // filter with search\n    let filteredSnippets = codeSnippets.slice();\n    const matchedIndices: { [id: number]: number[] } = {};\n\n    if (searchValue !== '') {\n      const matchResults: StringExt.IMatchResult[] = [];\n      const filteredSnippetsScore: {\n        score: number;\n        snippet: ICodeSnippet;\n      }[] = [];\n\n      // language, title, code\n      filteredSnippets.forEach((snippet) => {\n        const matchResult = StringExt.matchSumOfSquares(\n          (snippet.language + snippet.name + snippet.code).toLowerCase(),\n          searchValue.replace(' ', '').toLowerCase()\n        );\n        if (matchResult) {\n          matchResults.push(matchResult);\n          filteredSnippetsScore.push({\n            score: matchResult.score,\n            snippet: snippet,\n          });\n        }\n      });\n\n      // sort snippets by its score\n      filteredSnippetsScore.sort((a, b) => a.score - b.score);\n      const newFilteredSnippets: ICodeSnippet[] = [];\n      filteredSnippetsScore.forEach((snippetScore) =>\n        newFilteredSnippets.push(snippetScore.snippet)\n      );\n      filteredSnippets = newFilteredSnippets;\n\n      // sort the matchResults by its score\n      matchResults.sort((a, b) => a.score - b.score);\n\n      matchResults.forEach((res, id) => {\n        matchedIndices[filteredSnippets[id].id] = res.indices;\n      });\n    }\n\n    // filter with tags\n    if (filterTags.length !== 0) {\n      filteredSnippets = filteredSnippets.filter((codeSnippet) => {\n        return filterTags.some((filterTag) => {\n          if (codeSnippet.tags) {\n            if (selectedLangTags.length !== 0) {\n              // lang tags selected\n              if (\n                codeSnippet.tags.includes(filterTag) &&\n                selectedLangTags.includes(codeSnippet.language)\n              ) {\n                return true;\n              }\n              //if only language tags are selected\n              else if (\n                filterTags.length === selectedLangTags.length &&\n                filterTags.every((value) => selectedLangTags.includes(value))\n              ) {\n                if (selectedLangTags.includes(codeSnippet.language)) {\n                  return true;\n                }\n              }\n            } else {\n              // no lang tags selected\n              if (codeSnippet.tags.includes(filterTag)) {\n                return true;\n              }\n            }\n          }\n          return false;\n        });\n      });\n    }\n    // find id's that are not in filteredSnippets\n    const willBeRemovedIds = [];\n    for (const key in matchedIndices) {\n      let hasKey = false;\n      for (const codeSnippet of filteredSnippets) {\n        if (codeSnippet.id === parseInt(key)) {\n          hasKey = true;\n        }\n      }\n      if (hasKey === false) {\n        willBeRemovedIds.push(parseInt(key));\n      }\n    }\n\n    // if the snippet does not have the tag, remove its mathed index\n    willBeRemovedIds.forEach((id: number) => delete matchedIndices[id]);\n\n    return {\n      filteredCodeSnippets: filteredSnippets,\n      matchedIndices: matchedIndices,\n    };\n  };\n\n  // Handle code snippet insert into a notebook or document\n  private insertCodeSnippet = async (snippet: ICodeSnippet): Promise<void> => {\n    const widget: Widget = this.props.getCurrentWidget();\n\n    if (\n      widget instanceof DocumentWidget &&\n      (widget as DocumentWidget).content instanceof FileEditor\n    ) {\n      const documentWidget = widget as DocumentWidget;\n      // code editor\n      const fileEditor = (documentWidget.content as FileEditor).editor;\n      const markdownRegex = /^\\.(md|mkdn?|mdown|markdown)$/;\n\n      if (\n        PathExt.extname(documentWidget.context.path).match(markdownRegex) !==\n        null\n      ) {\n        // Wrap snippet into a code block when inserting it into a markdown file\n        fileEditor.replaceSelection(\n          '```' + snippet.language + '\\n' + snippet.code + '\\n```'\n        );\n      } else if (documentWidget.constructor.name === 'PythonFileEditor') {\n        this.verifyLanguageAndInsert(snippet, 'python', fileEditor);\n      } else {\n        fileEditor.replaceSelection(snippet.code);\n      }\n    } else if (widget instanceof NotebookPanel) {\n      const notebookWidget = widget as NotebookPanel;\n      const notebookCell = (notebookWidget.content as Notebook).activeCell;\n      // editor\n      const notebookCellEditor = notebookCell.editor;\n\n      if (notebookCell instanceof CodeCell) {\n        const kernelInfo = await notebookWidget.sessionContext.session?.kernel\n          ?.info;\n        const kernelLanguage: string = kernelInfo?.language_info.name || '';\n        this.verifyLanguageAndInsert(\n          snippet,\n          kernelLanguage,\n          notebookCellEditor\n        );\n      } else if (notebookCell instanceof MarkdownCell) {\n        // Wrap snippet into a code block when inserting it into a markdown cell\n        notebookCellEditor.replaceSelection(\n          '```' + snippet.language + '\\n' + snippet.code + '\\n```'\n        );\n      } else {\n        notebookCellEditor.replaceSelection(snippet.code);\n      }\n    } else {\n      this.showErrDialog('Code snippet insert failed: Unsupported widget');\n    }\n  };\n\n  // Handle language compatibility between code snippet and editor\n  private verifyLanguageAndInsert = async (\n    snippet: ICodeSnippet,\n    editorLanguage: string,\n    editor: CodeEditor.IEditor\n  ): Promise<void> => {\n    if (\n      editorLanguage &&\n      snippet.language.toLowerCase() !== editorLanguage.toLowerCase()\n    ) {\n      const result = await this.showWarnDialog(editorLanguage, snippet.name);\n      if (result.button.accept) {\n        editor.replaceSelection(snippet.code);\n      }\n    } else {\n      // Language match or editorLanguage is unavailable\n      editor.replaceSelection(snippet.code);\n    }\n  };\n\n  // Display warning dialog when inserting a code snippet incompatible with editor's language\n  private showWarnDialog = async (\n    editorLanguage: string,\n    snippetName: string\n  ): Promise<Dialog.IResult<string>> => {\n    return showDialog({\n      title: 'Warning',\n      body:\n        'Code snippet \"' +\n        snippetName +\n        '\" is incompatible with ' +\n        editorLanguage +\n        '. Continue?',\n      buttons: [Dialog.cancelButton(), Dialog.okButton()],\n    });\n  };\n\n  // Display error dialog when inserting a code snippet into unsupported widget (i.e. not an editor)\n  private showErrDialog = (errMsg: string): Promise<Dialog.IResult<string>> => {\n    return showDialog({\n      title: 'Error',\n      body: errMsg,\n      buttons: [Dialog.okButton()],\n    });\n  };\n\n  // Create 6 dots drag/drop image on hover\n  private dragHoverStyle = (id: number): void => {\n    document\n      .querySelector(`#${CODE_SNIPPET_DRAG_HOVER}${id}`)\n      .classList // .getElementsByClassName(CODE_SNIPPET_DRAG_HOVER)\n      // [id].classList.\n      .add(CODE_SNIPPET_DRAG_HOVER_SELECTED);\n  };\n\n  // Remove 6 dots off hover\n  private dragHoverStyleRemove = (id: number): void => {\n    if (document.getElementsByClassName(CODE_SNIPPET_DRAG_HOVER_SELECTED)) {\n      document\n        .querySelector(`#${CODE_SNIPPET_DRAG_HOVER}${id}`)\n        .classList.remove(CODE_SNIPPET_DRAG_HOVER_SELECTED);\n    }\n  };\n\n  // Bold text in snippet name based on search\n  private boldNameOnSearch = (\n    id: number,\n    language: string,\n    name: string,\n    matchedIndices: number[]\n  ): JSX.Element => {\n    const displayName = language + name;\n\n    // check if the searchValue is not ''\n    if (this.state.searchValue !== '') {\n      const elements = [];\n      if (matchedIndices) {\n        // get first match index in the name\n        let i = 0;\n        while (i < matchedIndices.length) {\n          if (matchedIndices[i] >= language.length) {\n            elements.push(\n              displayName.substring(language.length, matchedIndices[i])\n            );\n            break;\n          }\n          i++;\n        }\n\n        // when there is no match in name but language\n        if (i >= matchedIndices.length) {\n          return <span>{name}</span>;\n        } else {\n          // current and next indices are bold indices\n          let currIndex = matchedIndices[i];\n          let nextIndex;\n          // check if the match is the end of the name\n          if (i < matchedIndices.length - 1) {\n            i++;\n            nextIndex = matchedIndices[i];\n          } else {\n            nextIndex = null;\n          }\n          while (nextIndex !== null) {\n            // make the current index bold\n            elements.push(\n              <mark key={id + '_' + currIndex} className={SEARCH_BOLD}>\n                {displayName.substring(currIndex, currIndex + 1)}\n              </mark>\n            );\n            // add the regular string until we reach the next bold index\n            elements.push(displayName.substring(currIndex + 1, nextIndex));\n            currIndex = nextIndex;\n            if (i < matchedIndices.length - 1) {\n              i++;\n              nextIndex = matchedIndices[i];\n            } else {\n              nextIndex = null;\n            }\n          }\n          if (nextIndex === null) {\n            elements.push(\n              <mark key={id + '_' + currIndex} className={SEARCH_BOLD}>\n                {displayName.substring(currIndex, currIndex + 1)}\n              </mark>\n            );\n            elements.push(\n              displayName.substring(currIndex + 1, displayName.length)\n            );\n          }\n          return <span>{elements}</span>;\n        }\n      }\n    }\n    return (\n      <span\n        title={'Double click to rename'}\n        className={CODE_SNIPPET_NAME}\n        onDoubleClick={this.handleRenameSnippet}\n      >\n        {name}\n      </span>\n    );\n  };\n\n  // rename snippet on double click\n  private async handleRenameSnippet(\n    event: React.MouseEvent<HTMLSpanElement, MouseEvent>\n  ): Promise<void> {\n    const target = event.target as HTMLElement;\n    const oldName = target.innerHTML;\n\n    const new_element = document.createElement('input');\n    new_element.setAttribute('type', 'text');\n    new_element.id = 'jp-codeSnippet-rename';\n    new_element.innerHTML = target.innerHTML;\n\n    target.replaceWith(new_element);\n    new_element.value = target.innerHTML;\n\n    new_element.focus();\n    new_element.setSelectionRange(0, new_element.value.length);\n\n    new_element.onblur = async (): Promise<void> => {\n      if (target.innerHTML !== new_element.value) {\n        const newName = new_element.value;\n\n        const isDuplicateName =\n          this.props.codeSnippetManager.duplicateNameExists(newName);\n\n        if (isDuplicateName) {\n          await showDialog({\n            title: 'Duplicate Name of Code Snippet',\n            body: <p> {`\"${newName}\" already exists.`} </p>,\n            buttons: [Dialog.okButton({ label: 'Dismiss' })],\n          });\n        } else {\n          this.props.codeSnippetManager\n            .renameSnippet(oldName, newName)\n            .then(async (res: boolean) => {\n              if (res) {\n                target.innerHTML = new_element.value;\n              } else {\n                console.log('Error in renaming snippet!');\n              }\n            });\n        }\n      }\n      new_element.replaceWith(target);\n    };\n    new_element.onkeydown = (event: KeyboardEvent): void => {\n      switch (event.code) {\n        case 'Enter': // Enter\n          event.stopPropagation();\n          event.preventDefault();\n          new_element.blur();\n          break;\n        case 'NumpadEnter': // Enter\n          event.stopPropagation();\n          event.preventDefault();\n          new_element.blur();\n          break;\n        case 'Escape': // Escape\n          event.stopPropagation();\n          event.preventDefault();\n          new_element.blur();\n          break;\n        case 'ArrowUp': // Up arrow\n          event.stopPropagation();\n          event.preventDefault();\n          new_element.selectionStart = new_element.selectionEnd = 0;\n          break;\n        case 'ArrowDown': // Down arrow\n          event.stopPropagation();\n          event.preventDefault();\n          new_element.selectionStart = new_element.selectionEnd =\n            new_element.value.length;\n          break;\n        default:\n          break;\n      }\n    };\n  }\n\n  private handleDragSnippet(\n    event: React.MouseEvent<HTMLDivElement, MouseEvent>\n  ): void {\n    const { button } = event;\n\n    // if button is not the left click\n    if (!(button === 0)) {\n      return;\n    }\n\n    const target = event.target as HTMLElement;\n\n    this._dragData = {\n      pressX: event.clientX,\n      pressY: event.clientY,\n      dragImage: target.nextSibling.firstChild.cloneNode(true) as HTMLElement,\n    };\n\n    const dragImageTextColor = getComputedStyle(document.body).getPropertyValue(\n      '--jp-content-font-color3'\n    );\n\n    (this._dragData.dragImage.children[0] as HTMLElement).style.color =\n      dragImageTextColor;\n\n    // add CSS style\n    this._dragData.dragImage.classList.add(SNIPPET_DRAG_IMAGE);\n    target.addEventListener('mouseup', this._evtMouseUp, true);\n    target.addEventListener('mousemove', this.handleDragMove, true);\n\n    // since a browser has its own drag'n'drop support for images and some other elements.\n    target.ondragstart = (): boolean => false;\n\n    event.preventDefault();\n  }\n\n  private _evtMouseUp(event: MouseEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const target = event.target as HTMLElement;\n\n    target.removeEventListener('mousemove', this.handleDragMove, true);\n\n    target.removeEventListener('mouseup', this._evtMouseUp, true);\n  }\n\n  private handleDragMove(event: MouseEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const data = this._dragData;\n\n    if (\n      data &&\n      this.shouldStartDrag(\n        data.pressX,\n        data.pressY,\n        event.clientX,\n        event.clientY\n      )\n    ) {\n      const idx = (event.target as HTMLElement).id.slice(\n        CODE_SNIPPET_DRAG_HOVER.length\n      );\n\n      const codeSnippet = this.props.codeSnippets.filter(\n        (codeSnippet) => codeSnippet.id === parseInt(idx)\n      )[0];\n\n      void this.startDrag(\n        data.dragImage,\n        codeSnippet,\n        event.clientX,\n        event.clientY\n      );\n    }\n  }\n\n  /**\n   * Detect if a drag event should be started. This is down if the\n   * mouse is moved beyond a certain distance (DRAG_THRESHOLD).\n   *\n   * @param prevX - X Coordinate of the mouse pointer during the mousedown event\n   * @param prevY - Y Coordinate of the mouse pointer during the mousedown event\n   * @param nextX - Current X Coordinate of the mouse pointer\n   * @param nextY - Current Y Coordinate of the mouse pointer\n   */\n  private shouldStartDrag(\n    prevX: number,\n    prevY: number,\n    nextX: number,\n    nextY: number\n  ): boolean {\n    const dx = Math.abs(nextX - prevX);\n    const dy = Math.abs(nextY - prevY);\n    return dx >= 0 || dy >= DRAG_THRESHOLD;\n  }\n\n  private async startDrag(\n    dragImage: HTMLElement,\n    codeSnippet: ICodeSnippet,\n    clientX: number,\n    clientY: number\n  ): Promise<void> {\n    const target = event.target as HTMLElement;\n\n    const model = new CodeCellModel({});\n    model.value.text = codeSnippet.code;\n    model.metadata;\n\n    const selected: nbformat.ICell[] = [model.toJSON()];\n\n    this._drag = new Drag({\n      mimeData: new MimeData(),\n      dragImage: dragImage,\n      supportedActions: 'copy-move',\n      proposedAction: 'copy',\n      source: this,\n    });\n\n    this._drag.mimeData.setData(JUPYTER_CELL_MIME, selected);\n    const textContent = codeSnippet.code;\n    this._drag.mimeData.setData('text/plain', textContent);\n\n    // Remove mousemove and mouseup listeners and start the drag.\n    target.removeEventListener('mousemove', this.handleDragMove, true);\n    target.removeEventListener('mouseup', this._evtMouseUp, true);\n\n    return this._drag.start(clientX, clientY).then(() => {\n      this.dragHoverStyleRemove(codeSnippet.id);\n      this._drag = null;\n      this._dragData = null;\n    });\n  }\n\n  private _evtMouseLeave(): void {\n    const preview = document.querySelector('.jp-codeSnippet-preview');\n    if (preview) {\n      if (!preview.classList.contains('inactive')) {\n        preview.classList.add('inactive');\n      }\n    }\n  }\n\n  //Set the position of the preview to be next to the snippet title.\n  private _setPreviewPosition(id: number): void {\n    const realTarget = document.querySelector(`#${TITLE_CLASS}${id}`);\n    const newTarget = document.querySelector(`#${CODE_SNIPPET_ITEM}${id}`);\n    // (CODE_SNIPPET_ITEM)[id];\n    // distDown is the number of pixels to shift the preview down\n    const distDown: number = realTarget.getBoundingClientRect().top - 43; //this is bumping it up\n    const elementSnippet = newTarget as HTMLElement;\n    const heightSnippet = elementSnippet.clientHeight;\n    const heightPreview = heightSnippet.toString(10) + 'px';\n    document.documentElement.style.setProperty(\n      '--preview-max-height',\n      heightPreview\n    );\n    const final = distDown.toString(10) + 'px';\n    document.documentElement.style.setProperty('--preview-distance', final);\n  }\n\n  //Set the position of the option to be under to the three dots on snippet.\n  private _setOptionsPosition(\n    event: React.MouseEvent<HTMLElement, MouseEvent>\n  ): void {\n    const target = event.target as HTMLElement;\n    let top: number;\n    if (target.tagName === 'path') {\n      top = target.getBoundingClientRect().top + 10;\n    } else {\n      top = target.getBoundingClientRect().top + 18;\n    }\n    if (top > 0.7 * window.screen.height) {\n      top -= 120;\n    }\n    const leftAsString =\n      (target.parentElement.style.left + event.pageX).toString() + 'px';\n\n    const topAsString = top.toString(10) + 'px';\n\n    document.documentElement.style.setProperty(\n      '--more-options-top',\n      topAsString\n    );\n    document.documentElement.style.setProperty(\n      '--more-options-left',\n      leftAsString\n    );\n  }\n\n  private renderLanguageIcon(language: string): JSX.Element {\n    switch (language) {\n      case 'Python': {\n        return (\n          <pythonIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Gfm': {\n        return (\n          <markdownIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Java': {\n        return (\n          <javaIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'R': {\n        return (\n          <rKernelIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Julia': {\n        return (\n          <juliaIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Matlab': {\n        return (\n          <matlabIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Scheme': {\n        return (\n          <schemeIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Processing': {\n        return (\n          <processingIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Scala': {\n        return (\n          <scalaIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Groovy': {\n        return (\n          <groovyIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Fortran': {\n        return (\n          <fortranIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Haskell': {\n        return (\n          <haskellIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Ruby': {\n        return (\n          <rubyIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'TypeScript': {\n        return (\n          <typescriptIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'JavaScript': {\n        return (\n          <javascriptIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'CoffeeScript': {\n        return (\n          <coffeescriptIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'LiveScript': {\n        return (\n          <livescriptIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'C#': {\n        return (\n          <csharpIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'F#': {\n        return (\n          <fsharpIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Go': {\n        return (\n          <goIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Erlang': {\n        return (\n          <erlangIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'OCaml': {\n        return (\n          <ocamlIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Forth': {\n        return (\n          <forthIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Perl': {\n        return (\n          <perlIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'PHP': {\n        return (\n          <phpIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Clojure': {\n        return (\n          <clojureIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Lua': {\n        return (\n          <luaIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'PureScript': {\n        return (\n          <purescriptIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'C++': {\n        return (\n          <cppIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Prolog': {\n        return (\n          <prologIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Common Lisp': {\n        return (\n          <lispIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'C': {\n        return (\n          <cIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Kotlin': {\n        return (\n          <kotlinIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'NodeJS': {\n        return (\n          <nodejsIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Coconut': {\n        return (\n          <coconutIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Babel': {\n        return (\n          <babelIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'SAS': {\n        return (\n          <sasIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'sbt': {\n        return (\n          <sbtIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Rust': {\n        return (\n          <rustIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Q#': {\n        return (\n          <qsharpIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Markdown': {\n        return (\n          <markdownIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      case 'Powershell': {\n        return (\n          <powershellIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n      default: {\n        return (\n          <fileIcon.react\n            tag=\"span\"\n            height=\"16px\"\n            width=\"16px\"\n            right=\"7px\"\n            top=\"5px\"\n            margin-right=\"3px\"\n          />\n        );\n      }\n    }\n  }\n\n  // Render display of code snippet list\n  private renderCodeSnippet = (\n    codeSnippet: ICodeSnippet,\n    matchedIndices: number[]\n  ): JSX.Element => {\n    const id = codeSnippet.id;\n    const buttonClasses = BUTTON_CLASS;\n    const displayName = '[' + codeSnippet.language + '] ' + codeSnippet.name;\n    const name = codeSnippet.name;\n    const language = codeSnippet.language;\n\n    const actionButtons = [\n      {\n        title: 'Insert, copy, edit, and delete',\n        icon: moreOptionsIcon,\n        onClick: (event: React.MouseEvent<HTMLElement, MouseEvent>): void => {\n          showMoreOptions({\n            body: new OptionsHandler(this, codeSnippet),\n          });\n          this._setOptionsPosition(event);\n        },\n      },\n    ];\n    return (\n      <div\n        key={codeSnippet.name}\n        className={CODE_SNIPPET_ITEM}\n        id={`${CODE_SNIPPET_ITEM}${id}`}\n        title={'Right click for more options'}\n        onMouseOver={(): void => {\n          this.dragHoverStyle(id);\n        }}\n        onMouseOut={(): void => {\n          this.dragHoverStyleRemove(id);\n        }}\n        onContextMenu={(\n          event: React.MouseEvent<HTMLElement, MouseEvent>\n        ): void => {\n          event.preventDefault();\n          showMoreOptions({\n            body: new OptionsHandler(this, codeSnippet),\n          });\n          this._setOptionsPosition(event);\n        }}\n      >\n        <div\n          className={CODE_SNIPPET_DRAG_HOVER}\n          title=\"Drag to move\"\n          id={`${CODE_SNIPPET_DRAG_HOVER}${id}`}\n          onMouseDown={(event): void => {\n            this.handleDragSnippet(event);\n          }}\n        ></div>\n        <div\n          className={CODE_SNIPPET_METADATA}\n          onMouseEnter={(): void => {\n            showPreview(\n              {\n                id: id,\n                title: displayName,\n                body: new PreviewHandler(),\n                codeSnippet: codeSnippet,\n              },\n              this.props.editorServices\n            );\n            this._setPreviewPosition(id);\n          }}\n          onMouseLeave={(): void => {\n            this._evtMouseLeave();\n          }}\n        >\n          <div\n            key={displayName}\n            className={TITLE_CLASS}\n            id={`${TITLE_CLASS}${id}`}\n          >\n            <div id={id.toString()} className={DISPLAY_NAME_CLASS}>\n              {this.renderLanguageIcon(language)}\n              {this.boldNameOnSearch(id, language, name, matchedIndices)}\n            </div>\n            <div className={ACTION_BUTTONS_WRAPPER_CLASS} id={id.toString()}>\n              {actionButtons.map((btn) => {\n                return (\n                  <button\n                    key={btn.title}\n                    title={btn.title}\n                    className={buttonClasses + ' ' + ACTION_BUTTON_CLASS}\n                    onClick={(\n                      event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n                    ): void => {\n                      btn.onClick(event);\n                    }}\n                  >\n                    <btn.icon.react\n                      tag=\"span\"\n                      elementPosition=\"center\"\n                      width=\"16px\"\n                      height=\"16px\"\n                    />\n                  </button>\n                );\n              })}\n            </div>\n          </div>\n          {this.renderDescription(codeSnippet, id)}\n        </div>\n      </div>\n    );\n  };\n\n  renderDescription(codeSnippet: ICodeSnippet, id: number): JSX.Element {\n    if (codeSnippet.description && codeSnippet.description.length !== 0) {\n      return (\n        <div className={CODE_SNIPPET_DESC} id={id.toString()}>\n          <p id={id.toString()}>{`${codeSnippet.description}`}</p>\n        </div>\n      );\n    } else {\n      return null;\n    }\n  }\n\n  handleFilter = (\n    searchValue: string,\n    filterTags: string[],\n    selectedLangTags: string[]\n  ): void => {\n    this.setState({\n      searchValue: searchValue,\n      filterTags: filterTags,\n      selectedLangTags: selectedLangTags,\n    });\n  };\n\n  getActiveTags(): string[][] {\n    let tags: string[] = [];\n    const languages: string[] = [];\n    for (const codeSnippet of this.props.codeSnippets) {\n      if (codeSnippet.tags) {\n        tags = tags.concat(\n          codeSnippet.tags.filter((tag) => !tags.includes(tag))\n        );\n      }\n      if (!languages.includes(codeSnippet.language)) {\n        languages.push(codeSnippet.language);\n      }\n    }\n    return [tags, languages];\n  }\n\n  getActiveTagsDictionary = (): Map<string, string[]> => {\n    const tagsAndLangs: Map<string, string[]> = new Map<string, string[]>();\n    for (const codeSnippet of this.props.codeSnippets) {\n      if (codeSnippet.tags) {\n        // check if tag is in dict, if it is add lang to value (if not already present)\n        // if tag not in dict add tag as key and lang as first val\n        for (const tag of codeSnippet.tags) {\n          if (tag !== codeSnippet.language) {\n            if (tagsAndLangs.has(tag)) {\n              const langs = tagsAndLangs.get(tag);\n              if (!langs.includes(codeSnippet.language)) {\n                langs.push(codeSnippet.language);\n              }\n              tagsAndLangs.set(tag, langs);\n            } else {\n              tagsAndLangs.set(tag, [codeSnippet.language]);\n            }\n          }\n        }\n      }\n    }\n    return tagsAndLangs;\n  };\n\n  private deleteCommand(codeSnippet: ICodeSnippet): void {\n    showDialog({\n      title: 'Delete snippet?',\n      body: 'Are you sure you want to delete \"' + codeSnippet.name + '\"? ',\n      buttons: [\n        Dialog.cancelButton(),\n        Dialog.warnButton({\n          label: 'Delete',\n        }),\n      ],\n    }).then((response: any): void => {\n      if (response.button.accept) {\n        const widgetId = `${CODE_SNIPPET_EDITOR}-${codeSnippet.id}`;\n        const editor = find(\n          this.props.app.shell.widgets('main'),\n          (widget: Widget, _: number) => {\n            return widget.id === widgetId;\n          }\n        );\n\n        if (editor) {\n          editor.dispose();\n        }\n        // deleting snippets when there is one snippet active\n        this.props.codeSnippetManager\n          .deleteSnippet(codeSnippet.id)\n          .then((result: boolean) => {\n            if (result) {\n              this.props.updateCodeSnippetWidget();\n            } else {\n              console.log('Error in deleting the snippet');\n              return;\n            }\n          });\n      }\n    });\n  }\n\n  private exportCommand(codeSnippet: ICodeSnippet): void {\n    // Request a text\n    InputDialog.getText({\n      title: 'Export Snippet?',\n      label: 'Directory to Export: ',\n      placeholder: 'share/snippet',\n      okLabel: 'Export',\n    }).then((value: Dialog.IResult<string>) => {\n      if (value.button.accept) {\n        const dirs = value.value.split('/');\n\n        const codeSnippetContentsManager =\n          CodeSnippetContentsService.getInstance();\n\n        let path = '';\n        for (let i = 0; i < dirs.length; i++) {\n          path += dirs[i] + '/';\n          codeSnippetContentsManager\n            .save(path, { type: 'directory' })\n            .catch((_) => {\n              alert('Path should be a relative path');\n            });\n        }\n\n        path += codeSnippet.name + '.json';\n\n        codeSnippetContentsManager.save(path, {\n          type: 'file',\n          format: 'text',\n          content: JSON.stringify(codeSnippet),\n        });\n        showMessage('export');\n      }\n    });\n  }\n\n  // remove dropdown menu\n  private removeOptionsNode(): void {\n    const temp = document.getElementsByClassName(CODE_SNIPPET_MORE_OPTIONS)[0];\n    if (!temp.classList.contains('inactive')) {\n      temp.classList.add('inactive');\n    }\n  }\n\n  // create dropdown menu\n  public createOptionsNode(codeSnippet: ICodeSnippet): HTMLElement {\n    const body = document.createElement('div');\n    body.className = OPTIONS_BODY;\n\n    const optionsContainer = document.createElement('div');\n    optionsContainer.className = CODE_SNIPPET_MORE_OTPIONS_CONTENT;\n    const insertSnip = document.createElement('div');\n    insertSnip.className = CODE_SNIPPET_MORE_OTPIONS_INSERT;\n    insertSnip.textContent = 'Insert snippet';\n    insertSnip.onclick = (): void => {\n      this.insertCodeSnippet(codeSnippet);\n      this.removeOptionsNode();\n    };\n    const copySnip = document.createElement('div');\n    copySnip.className = CODE_SNIPPET_MORE_OTPIONS_COPY;\n    copySnip.textContent = 'Copy snippet to clipboard';\n    copySnip.onclick = (): void => {\n      Clipboard.copyToSystem(codeSnippet.code);\n      showMessage('copy');\n      this.removeOptionsNode();\n    };\n    const editSnip = document.createElement('div');\n    editSnip.className = CODE_SNIPPET_MORE_OTPIONS_EDIT;\n    editSnip.textContent = 'Edit snippet';\n    editSnip.onclick = (): void => {\n      const allSnippetTags = this.getActiveTags()[0]; // snippet tags only\n      const allLangTags = this.getActiveTags()[1];\n      this.props.openCodeSnippetEditor({\n        name: codeSnippet.name,\n        description: codeSnippet.description,\n        language: codeSnippet.language,\n        code: codeSnippet.code,\n        id: codeSnippet.id,\n        tags: codeSnippet.tags, // snippet tags\n        allSnippetTags: allSnippetTags,\n        allLangTags: allLangTags,\n        fromScratch: false,\n      });\n      this.removeOptionsNode();\n    };\n    const deleteSnip = document.createElement('div');\n    deleteSnip.className = CODE_SNIPPET_MORE_OTPIONS_DELETE;\n    deleteSnip.textContent = 'Delete snippet';\n    deleteSnip.onclick = (): void => {\n      this.deleteCommand(codeSnippet);\n      this.removeOptionsNode();\n    };\n\n    const exportSnip = document.createElement('div');\n    exportSnip.className = CODE_SNIPPET_MORE_OTPIONS_EXPORT;\n    exportSnip.textContent = 'Export snippet';\n    exportSnip.onclick = (): void => {\n      this.exportCommand(codeSnippet);\n      this.removeOptionsNode();\n    };\n\n    optionsContainer.appendChild(insertSnip);\n    optionsContainer.appendChild(copySnip);\n    optionsContainer.appendChild(editSnip);\n    optionsContainer.appendChild(exportSnip);\n    optionsContainer.appendChild(deleteSnip);\n    body.append(optionsContainer);\n    return body;\n  }\n\n  setSearchOptions(selectedOptions: string[]): void {\n    this.setState({\n      searchOptions: selectedOptions,\n    });\n  }\n\n  render(): React.ReactElement {\n    const { filteredCodeSnippets, matchedIndices } = this.filterSnippets(\n      this.props.codeSnippets,\n      this.state.searchValue,\n      this.state.filterTags,\n      this.state.selectedLangTags\n    );\n\n    return (\n      <div>\n        <header className={CODE_SNIPPETS_HEADER_CLASS}>\n          <span className={CODE_SNIPPET_TITLE}>{'Snippets'}</span>\n          <button\n            className={CODE_SNIPPET_CREATE_NEW_BTN}\n            onClick={(): void => {\n              this.props.openCodeSnippetEditor({\n                name: '',\n                description: '',\n                language: 'Python',\n                code: '',\n                id: this.props.codeSnippets.length,\n                tags: [],\n                allSnippetTags: this.getActiveTags()[0],\n                allLangTags: this.getActiveTags()[1],\n                fromScratch: true,\n              });\n            }}\n          >\n            <addIcon.react tag=\"span\" right=\"7px\" top=\"5px\" />\n          </button>\n        </header>\n        <FilterTools\n          tagDictionary={this.getActiveTagsDictionary()}\n          languageTags={this.getActiveTags()[1]}\n          snippetTags={this.getActiveTags()[0]}\n          onFilter={this.handleFilter}\n        />\n        <div className={CODE_SNIPPETS_CONTAINER}>\n          <div>\n            {filteredCodeSnippets.map((codeSnippet) =>\n              this.renderCodeSnippet(\n                codeSnippet,\n                matchedIndices[codeSnippet.id]\n              )\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nclass OptionsHandler extends Widget {\n  constructor(display: CodeSnippetDisplay, codeSnippet: ICodeSnippet) {\n    super({ node: display.createOptionsNode(codeSnippet) });\n  }\n}\n\nclass PreviewHandler extends Widget {\n  constructor() {\n    super({ node: Private.createPreviewNode() });\n  }\n}\n\nclass Private {\n  static createPreviewContent(): HTMLElement {\n    const body = document.createElement('div');\n    return body;\n  }\n  /**\n   * Create structure for preview of snippet data.\n   */\n  static createPreviewNode(): HTMLElement {\n    return this.createPreviewContent();\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetEditor.tsx",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code are from Elyra Code Snippet.\n\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\nimport { CodeEditor, IEditorServices } from '@jupyterlab/codeeditor';\nimport {\n  ReactWidget,\n  showDialog,\n  Dialog,\n  WidgetTracker,\n} from '@jupyterlab/apputils';\nimport { Button } from '@jupyterlab/ui-components';\n\nimport { Message } from '@lumino/messaging';\n\nimport React from 'react';\n\nimport { CodeSnippetService, ICodeSnippet } from './CodeSnippetService';\nimport { CodeSnippetWidget } from './CodeSnippetWidget';\nimport { SUPPORTED_LANGUAGES } from './CodeSnippetLanguages';\nimport { CodeSnippetEditorTags, ITag } from './CodeSnippetEditorTags';\nimport { showMessage } from './CodeSnippetMessage';\nimport { validateInputs, saveOverWriteFile } from './CodeSnippetUtilities';\n\n/**\n * CSS style classes\n */\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_EDITOR_TITLE = 'jp-codeSnippet-editor-title';\nconst CODE_SNIPPET_EDITOR_METADATA = 'jp-codeSnippet-editor-metadata';\nconst CODE_SNIPPET_EDITOR_INPUT_ACTIVE = 'jp-codeSnippet-editor-active';\nconst CODE_SNIPPET_EDITOR_NAME_INPUT = 'jp-codeSnippet-editor-name';\nconst CODE_SNIPPET_EDITOR_LABEL = 'jp-codeSnippet-editor-label';\nconst CODE_SNIPPET_EDITOR_DESC_INPUT = 'jp-codeSnippet-editor-description';\nconst CODE_SNIPPET_EDITOR_LANG_INPUT = 'jp-codeSnippet-editor-language';\nconst CODE_SNIPPET_EDITOR_MIRROR = 'jp-codeSnippetInput-editor';\nconst CODE_SNIPPET_EDITOR_INPUTAREA = 'jp-codeSnippetInputArea';\nconst CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR = 'jp-codeSnippetInputArea-editor';\n\nconst EDITOR_DIRTY_CLASS = 'jp-mod-dirty';\n\nexport interface ICodeSnippetEditorMetadata extends ICodeSnippet {\n  allSnippetTags: string[]; // all snippet tags mean all the tags that snippets have, while tags refer to those specific to a snippet\n  allLangTags: string[];\n  fromScratch: boolean;\n}\n\nexport class CodeSnippetEditor extends ReactWidget {\n  editorServices: IEditorServices;\n  private editor: CodeEditor.IEditor;\n  private saved: boolean;\n  private oldCodeSnippetName: string;\n  private _codeSnippetEditorMetaData: ICodeSnippetEditorMetadata;\n  private _hasRefreshedSinceAttach: boolean;\n  contentsService: CodeSnippetService;\n  codeSnippetWidget: CodeSnippetWidget;\n  tracker: WidgetTracker;\n\n  constructor(\n    editorServices: IEditorServices,\n    tracker: WidgetTracker,\n    codeSnippetWidget: CodeSnippetWidget,\n    args: ICodeSnippetEditorMetadata\n  ) {\n    super();\n    this.addClass(CODE_SNIPPET_EDITOR);\n    this.contentsService = CodeSnippetService.getCodeSnippetService();\n    this.editorServices = editorServices;\n    this.tracker = tracker;\n\n    this._codeSnippetEditorMetaData = args;\n\n    this.oldCodeSnippetName = args.name;\n    this.saved = true;\n    this._hasRefreshedSinceAttach = false;\n    this.codeSnippetWidget = codeSnippetWidget;\n\n    this.renderCodeInput = this.renderCodeInput.bind(this);\n    this.handleInputFieldChange = this.handleInputFieldChange.bind(this);\n    this.activateCodeMirror = this.activateCodeMirror.bind(this);\n    this.saveChange = this.saveChange.bind(this);\n    this.updateSnippet = this.updateSnippet.bind(this);\n    this.handleChangeOnTag = this.handleChangeOnTag.bind(this);\n  }\n\n  get codeSnippetEditorMetadata(): ICodeSnippetEditorMetadata {\n    return this._codeSnippetEditorMetaData;\n  }\n\n  private deactivateEditor(\n    event: React.MouseEvent<HTMLDivElement, MouseEvent>\n  ): void {\n    let target = event.target as HTMLElement;\n\n    while (target && target.parentElement) {\n      if (\n        target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR) ||\n        target.classList.contains(CODE_SNIPPET_EDITOR_NAME_INPUT) ||\n        target.classList.contains(CODE_SNIPPET_EDITOR_DESC_INPUT)\n      ) {\n        break;\n      }\n      target = target.parentElement;\n    }\n\n    const nameInput = document.querySelector(\n      `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`\n    );\n    const descriptionInput = document.querySelector(\n      `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`\n    );\n    const editor = document.querySelector(\n      `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} #code-${this._codeSnippetEditorMetaData.id}`\n    );\n\n    if (target.classList.contains(CODE_SNIPPET_EDITOR_NAME_INPUT)) {\n      this.deactivateDescriptionField(descriptionInput);\n      this.deactivateCodeMirror(editor);\n    } else if (target.classList.contains(CODE_SNIPPET_EDITOR_DESC_INPUT)) {\n      this.deactivateNameField(nameInput);\n      this.deactivateCodeMirror(editor);\n    } else if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n      this.deactivateNameField(nameInput);\n      this.deactivateDescriptionField(descriptionInput);\n    } else {\n      this.deactivateNameField(nameInput);\n      this.deactivateDescriptionField(descriptionInput);\n      this.deactivateCodeMirror(editor);\n    }\n  }\n\n  private deactivateNameField(nameInput: Element): void {\n    if (nameInput.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n      nameInput.classList.remove(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n    }\n  }\n\n  private deactivateDescriptionField(descriptionInput: Element): void {\n    if (descriptionInput.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n      descriptionInput.classList.remove(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n    }\n  }\n\n  private activeFieldState(\n    event: React.MouseEvent<HTMLInputElement, MouseEvent>\n  ): void {\n    const target = event.target as HTMLElement;\n    if (!target.classList.contains(CODE_SNIPPET_EDITOR_INPUT_ACTIVE)) {\n      target.classList.add(CODE_SNIPPET_EDITOR_INPUT_ACTIVE);\n    }\n  }\n\n  onUpdateRequest(msg: Message): void {\n    super.onUpdateRequest(msg);\n\n    if (\n      !this.editor &&\n      document.getElementById('code-' + this._codeSnippetEditorMetaData.id)\n    ) {\n      const editorFactory = this.editorServices.factoryService.newInlineEditor;\n      const getMimeTypeByLanguage =\n        this.editorServices.mimeTypeService.getMimeTypeByLanguage;\n\n      this.editor = editorFactory({\n        host: document.getElementById(\n          'code-' + this._codeSnippetEditorMetaData.id\n        ),\n        model: new CodeEditor.Model({\n          value: this._codeSnippetEditorMetaData.code,\n          mimeType: getMimeTypeByLanguage({\n            name: this._codeSnippetEditorMetaData.language,\n            codemirror_mode: this._codeSnippetEditorMetaData.language,\n          }),\n        }),\n      });\n      this.editor.model.value.changed.connect((args: any) => {\n        this._codeSnippetEditorMetaData.code = args.text.split('\\n');\n        if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n          this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n        }\n        this.saved = false;\n      });\n    }\n    if (this.isVisible) {\n      this._hasRefreshedSinceAttach = true;\n      this.editor.refresh();\n    }\n  }\n\n  onAfterAttach(msg: Message): void {\n    super.onAfterAttach(msg);\n\n    this._hasRefreshedSinceAttach = false;\n    if (this.isVisible) {\n      this.update();\n    }\n\n    window.addEventListener('beforeunload', (e) => {\n      if (!this.saved) {\n        e.preventDefault();\n        e.returnValue = '';\n      }\n    });\n  }\n\n  onAfterShow(msg: Message): void {\n    if (!this._hasRefreshedSinceAttach) {\n      this.update();\n    }\n  }\n\n  /**\n   * Initial focus on the editor when it gets activated!\n   * @param msg\n   */\n  onActivateRequest(msg: Message): void {\n    this.editor.focus();\n  }\n\n  onCloseRequest(msg: Message): void {\n    if (!this.saved) {\n      showDialog({\n        title: 'Close without saving?',\n        body: (\n          <p>\n            {' '}\n            {`\"${this._codeSnippetEditorMetaData.name}\" has unsaved changes, close without saving?`}{' '}\n          </p>\n        ),\n        buttons: [\n          Dialog.cancelButton(),\n          Dialog.warnButton({ label: 'Discard' }),\n          Dialog.okButton({ label: 'Save' }),\n        ],\n      }).then((response: any): void => {\n        if (response.button.accept) {\n          if (response.button.label === 'Discard') {\n            this.dispose();\n            super.onCloseRequest(msg);\n          } else if (response.button.label === 'Save') {\n            const name = (\n              document.querySelector(\n                `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`\n              ) as HTMLInputElement\n            ).value;\n            const description = (\n              document.querySelector(\n                `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`\n              ) as HTMLInputElement\n            ).value;\n            const language = (\n              document.querySelector(\n                `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`\n              ) as HTMLSelectElement\n            ).value;\n\n            const validity = validateInputs(name, description, language);\n            if (validity) {\n              this.updateSnippet().then((value) => {\n                if (value) {\n                  this.dispose();\n                  super.onCloseRequest(msg);\n                }\n              });\n            }\n          }\n        }\n      });\n    } else {\n      this.dispose();\n      super.onCloseRequest(msg);\n    }\n  }\n\n  /**\n   * Visualize the editor more look like an editor\n   * @param event\n   */\n  activateCodeMirror(\n    event: React.MouseEvent<HTMLDivElement, MouseEvent>\n  ): void {\n    let target = event.target as HTMLElement;\n\n    while (target && target.parentElement) {\n      if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n        break;\n      }\n      target = target.parentElement;\n    }\n\n    const editor = document.querySelector(\n      `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} #code-${this._codeSnippetEditorMetaData.id}`\n    );\n\n    if (target.classList.contains(CODE_SNIPPET_EDITOR_MIRROR)) {\n      if (!editor.classList.contains('active')) {\n        editor.classList.add('active');\n      }\n    }\n  }\n\n  deactivateCodeMirror(editor: Element): void {\n    if (editor.classList.contains('active')) {\n      editor.classList.remove('active');\n    }\n  }\n\n  handleInputFieldChange(event: React.ChangeEvent<HTMLInputElement>): void {\n    if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n      this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n    }\n\n    const target = event.target as HTMLElement;\n\n    if (!target.classList.contains('FieldChanged')) {\n      target.classList.add('FieldChanged');\n    }\n\n    this.saved = false;\n  }\n\n  saveChange(event: React.MouseEvent<HTMLElement, MouseEvent>): void {\n    const name = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`\n      ) as HTMLInputElement\n    ).value;\n    const description = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`\n      ) as HTMLInputElement\n    ).value;\n    const language = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`\n      ) as HTMLSelectElement\n    ).value;\n\n    const validity = validateInputs(name, description, language);\n    if (validity) {\n      this.updateSnippet();\n    }\n  }\n\n  async updateSnippet(): Promise<boolean> {\n    const name = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_NAME_INPUT}`\n      ) as HTMLInputElement\n    ).value;\n    const description = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_DESC_INPUT}`\n      ) as HTMLInputElement\n    ).value;\n    const language = (\n      document.querySelector(\n        `.${CODE_SNIPPET_EDITOR}-${this._codeSnippetEditorMetaData.id} .${CODE_SNIPPET_EDITOR_LANG_INPUT}`\n      ) as HTMLSelectElement\n    ).value;\n\n    this._codeSnippetEditorMetaData.name = name;\n    this._codeSnippetEditorMetaData.description = description;\n    this._codeSnippetEditorMetaData.language = language;\n\n    const newName = this._codeSnippetEditorMetaData.name;\n    const oldName = this.oldCodeSnippetName;\n\n    const newSnippet: ICodeSnippet = {\n      name: this._codeSnippetEditorMetaData.name,\n      description: this._codeSnippetEditorMetaData.description,\n      language: this._codeSnippetEditorMetaData.language,\n      code: this._codeSnippetEditorMetaData.code,\n      id: this._codeSnippetEditorMetaData.id,\n      tags: this._codeSnippetEditorMetaData.tags,\n    };\n\n    this._codeSnippetEditorMetaData;\n\n    const isDuplicatName = this.contentsService.duplicateNameExists(newName);\n\n    // update new name as an old name\n    this.oldCodeSnippetName = this._codeSnippetEditorMetaData.name;\n\n    // add new snippet\n    if (this._codeSnippetEditorMetaData.fromScratch) {\n      if (isDuplicatName) {\n        const oldSnippet = this.contentsService.getSnippetByName(newName)[0];\n        await saveOverWriteFile(this.contentsService, oldSnippet, newSnippet);\n      } else {\n        this.contentsService.addSnippet(newSnippet).then((res: boolean) => {\n          if (!res) {\n            console.log('Error in adding snippet');\n            return false;\n          }\n        });\n        showMessage('confirm');\n      }\n    }\n    // modify existing snippet\n    else {\n      if (newName !== oldName) {\n        if (isDuplicatName) {\n          // overwrite\n          const oldSnippet = this.contentsService.getSnippetByName(newName)[0];\n          await saveOverWriteFile(\n            this.contentsService,\n            oldSnippet,\n            newSnippet\n          ).then((res: boolean) => {\n            if (res) {\n              // get the id of snippet you are editting\n              const removedSnippet =\n                this.contentsService.getSnippetByName(oldName)[0];\n\n              // delete the one you are editing\n              this.contentsService.deleteSnippet(removedSnippet.id);\n            } else {\n              return false;\n            }\n          });\n        }\n      }\n      this.contentsService\n        .modifyExistingSnippet(oldName, newSnippet)\n        .then((res: boolean) => {\n          if (!res) {\n            console.log('Error in modifying snippet');\n            return false;\n          }\n        });\n    }\n\n    this.saved = true;\n\n    // remove the dirty state\n    this.title.className = this.title.className.replace(\n      ` ${EDITOR_DIRTY_CLASS}`,\n      ''\n    );\n\n    // change label\n    this.title.label =\n      '[' +\n      this._codeSnippetEditorMetaData.language +\n      '] ' +\n      this._codeSnippetEditorMetaData.name;\n\n    if (!this._codeSnippetEditorMetaData.fromScratch) {\n      // update tracker\n      this.tracker.save(this);\n    }\n\n    // update the display in code snippet explorer\n    this.codeSnippetWidget.updateCodeSnippetWidget();\n\n    // close editor if it's from scratch\n    if (this._codeSnippetEditorMetaData.fromScratch) {\n      this.dispose();\n    }\n    return true;\n  }\n\n  handleChangeOnTag(tags: ITag[]): void {\n    if (!this.title.className.includes(EDITOR_DIRTY_CLASS)) {\n      this.title.className += ` ${EDITOR_DIRTY_CLASS}`;\n    }\n\n    this._codeSnippetEditorMetaData.tags = tags\n      .filter((tag: ITag) => tag.clicked)\n      .map((tag: ITag) => tag.name);\n    this._codeSnippetEditorMetaData.allSnippetTags = tags.map(\n      (tag: ITag) => tag.name\n    );\n\n    this.saved = false;\n  }\n\n  handleOnBlur(event: React.FocusEvent<HTMLInputElement>): void {\n    const target = event.target as HTMLElement;\n    if (!target.classList.contains('touched')) {\n      target.classList.add('touched');\n    }\n  }\n\n  /**\n   * TODO: clean CSS style class - \"Use constant\"\n   */\n  renderCodeInput(): React.ReactElement {\n    return (\n      <section\n        className={CODE_SNIPPET_EDITOR_INPUTAREA_MIRROR}\n        onMouseDown={this.activateCodeMirror}\n      >\n        <div\n          className={CODE_SNIPPET_EDITOR_MIRROR}\n          id={'code-' + this._codeSnippetEditorMetaData.id.toString()}\n        ></div>\n      </section>\n    );\n  }\n\n  renderLanguages(): React.ReactElement {\n    SUPPORTED_LANGUAGES.sort();\n\n    return (\n      <div>\n        <input\n          className={CODE_SNIPPET_EDITOR_LANG_INPUT}\n          list=\"languages\"\n          name=\"language\"\n          defaultValue={this._codeSnippetEditorMetaData.language}\n          onChange={this.handleInputFieldChange}\n          required\n        />\n        <datalist id=\"languages\">\n          {SUPPORTED_LANGUAGES.map((lang) => this.renderLanguageOptions(lang))}\n        </datalist>\n      </div>\n    );\n  }\n\n  renderLanguageOptions(option: string): JSX.Element {\n    return <option key={option} value={option} />;\n  }\n\n  render(): React.ReactElement {\n    const fromScratch = this._codeSnippetEditorMetaData.fromScratch;\n    return (\n      <div\n        className={CODE_SNIPPET_EDITOR_INPUTAREA}\n        onMouseDown={(\n          event: React.MouseEvent<HTMLDivElement, MouseEvent>\n        ): void => {\n          this.deactivateEditor(event);\n        }}\n      >\n        <span className={CODE_SNIPPET_EDITOR_TITLE}>\n          {fromScratch ? 'New Code Snippet' : 'Edit Code Snippet'}\n        </span>\n        <section className={CODE_SNIPPET_EDITOR_METADATA}>\n          <label className={CODE_SNIPPET_EDITOR_LABEL}>Name (required)</label>\n          <input\n            className={CODE_SNIPPET_EDITOR_NAME_INPUT}\n            defaultValue={this._codeSnippetEditorMetaData.name}\n            placeholder={'Ex. starter code'}\n            type=\"text\"\n            required\n            onMouseDown={(\n              event: React.MouseEvent<HTMLInputElement, MouseEvent>\n            ): void => this.activeFieldState(event)}\n            onChange={(event: React.ChangeEvent<HTMLInputElement>): void => {\n              this.handleInputFieldChange(event);\n            }}\n            onBlur={this.handleOnBlur}\n          ></input>\n          <label className={CODE_SNIPPET_EDITOR_LABEL}>\n            Description (optional)\n          </label>\n          <input\n            className={CODE_SNIPPET_EDITOR_DESC_INPUT}\n            defaultValue={this._codeSnippetEditorMetaData.description}\n            placeholder={'Description'}\n            type=\"text\"\n            onMouseDown={(\n              event: React.MouseEvent<HTMLInputElement, MouseEvent>\n            ): void => this.activeFieldState(event)}\n            onChange={(event: React.ChangeEvent<HTMLInputElement>): void => {\n              this.handleInputFieldChange(event);\n            }}\n            onBlur={this.handleOnBlur}\n          ></input>\n          <label className={CODE_SNIPPET_EDITOR_LABEL}>\n            Language (required)\n          </label>\n          {this.renderLanguages()}\n          <label className={CODE_SNIPPET_EDITOR_LABEL}>Tags</label>\n          <CodeSnippetEditorTags\n            allSnippetTags={\n              this._codeSnippetEditorMetaData.allSnippetTags\n                ? this._codeSnippetEditorMetaData.allSnippetTags.map(\n                    (tag: string): ITag => ({\n                      name: tag,\n                      clicked:\n                        this._codeSnippetEditorMetaData.tags &&\n                        this._codeSnippetEditorMetaData.tags.includes(tag)\n                          ? true\n                          : false,\n                    })\n                  )\n                : []\n            }\n            langTags={this._codeSnippetEditorMetaData.allLangTags}\n            handleChange={this.handleChangeOnTag}\n          />\n        </section>\n        <span className={CODE_SNIPPET_EDITOR_LABEL}>Code</span>\n        {this.renderCodeInput()}\n        <Button className=\"saveBtn\" onClick={this.saveChange}>\n          {fromScratch ? 'Create & Close' : 'Save'}\n        </Button>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetEditorTags.tsx",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { checkIcon, addIcon } from '@jupyterlab/ui-components';\nimport React from 'react';\n\nexport interface ITag {\n  name: string;\n  clicked: boolean;\n}\n\ninterface ICodeSnippetEditorTagProps {\n  allSnippetTags: ITag[]; // snippet tags only\n  langTags: string[];\n  handleChange: (tags: ITag[]) => void;\n}\ninterface ICodeSnippetEditorTagState {\n  allSnippetTags: ITag[];\n  plusIconClicked: boolean;\n}\n\n/**\n * CSS STYLING\n */\nconst CODE_SNIPPET_EDITOR_TAG = 'jp-codeSnippet-editor-tag';\nconst CODE_SNIPPET_EDITOR_TAG_PLUS_ICON = 'jp-codeSnippet-editor-tag-plusIcon';\nconst CODE_SNIPPET_EDITOR_TAG_LIST = 'jp-codeSnippet-editor-tagList';\n\nexport class CodeSnippetEditorTags extends React.Component<\n  ICodeSnippetEditorTagProps,\n  ICodeSnippetEditorTagState\n> {\n  constructor(props: ICodeSnippetEditorTagProps) {\n    super(props);\n    this.state = {\n      allSnippetTags: [],\n      plusIconClicked: false,\n    };\n    this.renderTags = this.renderTags.bind(this);\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  componentDidMount(): void {\n    this.setState({\n      allSnippetTags: this.props.allSnippetTags,\n      plusIconClicked: false,\n    });\n  }\n\n  componentDidUpdate(prevProps: ICodeSnippetEditorTagProps): void {\n    if (prevProps !== this.props) {\n      this.setState({\n        allSnippetTags: this.props.allSnippetTags,\n      });\n    }\n  }\n\n  handleClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n    const target = event.target as HTMLElement;\n    const clickedTag = target.innerText;\n\n    this.handleClickHelper(clickedTag);\n  }\n\n  handleOnChange(): void {\n    this.props.handleChange(this.state.allSnippetTags);\n  }\n\n  handleClickHelper(\n    // parent: HTMLElement,\n    clickedTag: string\n  ): void {\n    this.setState(\n      (state) => ({\n        allSnippetTags: state.allSnippetTags.map((tag: ITag) =>\n          tag.name === clickedTag ? { ...tag, clicked: !tag.clicked } : tag\n        ),\n      }),\n      this.handleOnChange\n    );\n  }\n\n  addTagOnClick(event: React.MouseEvent<HTMLInputElement>): void {\n    this.setState({ plusIconClicked: true });\n    const inputElement = event.target as HTMLInputElement;\n    if (inputElement.value === 'Add Tag') {\n      inputElement.value = '';\n      inputElement.style.width = '62px';\n      inputElement.style.minWidth = '62px';\n    }\n  }\n\n  addTagOnKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n    const inputElement = event.target as HTMLInputElement;\n\n    if (inputElement.value !== '' && event.key === 'Enter') {\n      if (\n        this.state.allSnippetTags.find(\n          (tag: ITag) => tag.name === inputElement.value\n        )\n      ) {\n        alert('Duplicate Tag Name!');\n        return;\n      }\n\n      if (this.props.langTags.includes(inputElement.value)) {\n        alert(\n          'This tag already exists in language tags!\\nIf you want to create this tag, lowercase the first letter.'\n        );\n        return;\n      }\n\n      const newTag = { name: inputElement.value, clicked: true };\n\n      this.setState(\n        (state) => ({\n          allSnippetTags: [...state.allSnippetTags, newTag],\n          plusIconClicked: false,\n        }),\n        this.handleOnChange\n      );\n    }\n  }\n\n  addTagOnBlur(event: React.FocusEvent<HTMLInputElement>): void {\n    const inputElement = event.target as HTMLInputElement;\n    inputElement.value = 'Add Tag';\n    inputElement.style.width = '50px';\n    inputElement.style.minWidth = '50px';\n    inputElement.blur();\n    this.setState({ plusIconClicked: false });\n  }\n\n  renderTags(): JSX.Element {\n    const hasTags = this.state.allSnippetTags;\n    const inputBox =\n      this.state.plusIconClicked === true ? (\n        <ul\n          className={`${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag`}\n          key={'editor-new-tag'}\n        >\n          <input\n            onClick={(\n              event: React.MouseEvent<HTMLInputElement, MouseEvent>\n            ): void => this.addTagOnClick(event)}\n            onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>): void =>\n              this.addTagOnKeyDown(event)\n            }\n            onBlur={(event: React.FocusEvent<HTMLInputElement>): void =>\n              this.addTagOnBlur(event)\n            }\n            autoFocus\n          />\n        </ul>\n      ) : (\n        <ul className={`${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag`}>\n          <button\n            onClick={(): void => this.setState({ plusIconClicked: true })}\n          >\n            Add Tag\n          </button>\n          <addIcon.react\n            tag=\"span\"\n            className={CODE_SNIPPET_EDITOR_TAG_PLUS_ICON}\n            elementPosition=\"center\"\n            height=\"16px\"\n            width=\"16px\"\n            marginLeft=\"2px\"\n          />\n        </ul>\n      );\n    return (\n      <li className={CODE_SNIPPET_EDITOR_TAG_LIST}>\n        {hasTags\n          ? this.state.allSnippetTags.map((tag: ITag, index: number) =>\n              ((): JSX.Element => {\n                if (!tag.clicked) {\n                  return (\n                    <ul\n                      className={`${CODE_SNIPPET_EDITOR_TAG} tag unapplied-tag`}\n                      id={'editor' + '-' + tag.name + '-' + index}\n                      key={'editor' + '-' + tag.name + '-' + index}\n                    >\n                      <button onClick={this.handleClick}>{tag.name}</button>\n                    </ul>\n                  );\n                } else {\n                  return (\n                    <ul\n                      className={`${CODE_SNIPPET_EDITOR_TAG} tag applied-tag`}\n                      id={'editor' + '-' + tag.name + '-' + index}\n                      key={'editor' + '-' + tag.name + '-' + index}\n                    >\n                      <button onClick={this.handleClick}>{tag.name}</button>\n                      <checkIcon.react\n                        tag=\"span\"\n                        elementPosition=\"center\"\n                        height=\"18px\"\n                        width=\"18px\"\n                        marginLeft=\"5px\"\n                        marginRight=\"-3px\"\n                      />\n                    </ul>\n                  );\n                }\n              })()\n            )\n          : null}\n        {inputBox}\n      </li>\n    );\n  }\n\n  render(): JSX.Element {\n    return <div>{this.renderTags()}</div>;\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetFilterTools.tsx",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { InputGroup, checkIcon } from '@jupyterlab/ui-components';\nimport React from 'react';\n\ninterface IFilterSnippetProps {\n  tagDictionary: Map<string, string[]>;\n  languageTags: string[]; // just lang tags\n  snippetTags: string[]; // just snippet tags\n  onFilter: (\n    searchValue: string,\n    filterTags: string[],\n    selectedLangTags: string[]\n  ) => void;\n}\n\ninterface IFilterSnippetState {\n  show: boolean;\n  selectedTags: string[];\n  searchValue: string;\n}\n\nconst FILTER_ARROW_UP = 'jp-codeSnippet-filter-arrow-up';\nconst FILTER_OPTION = 'jp-codeSnippet-filter-option';\nconst FILTER_TAGS = 'jp-codeSnippet-filter-tags';\nconst FILTER_TAG = 'jp-codeSnippet-filter-tag';\nconst FILTER_CHECK = 'jp-codeSnippet-filter-check';\nconst FILTER_TITLE = 'jp-codeSnippet-filter-title';\nconst FILTER_TOOLS = 'jp-codeSnippet-filterTools';\nconst FILTER_SEARCHBAR = 'jp-codeSnippet-searchbar';\nconst FILTER_SEARCHWRAPPER = 'jp-codeSnippet-searchwrapper';\nconst FILTER_CLASS = 'jp-codeSnippet-filter';\nconst FILTER_BUTTON = 'jp-codeSnippet-filter-btn';\n\nexport class FilterTools extends React.Component<\n  IFilterSnippetProps,\n  IFilterSnippetState\n> {\n  constructor(props: IFilterSnippetProps) {\n    super(props);\n    this.state = { show: false, selectedTags: [], searchValue: '' }; //--> selectedTags & selectedLangTags\n    this.createFilterBox = this.createFilterBox.bind(this);\n    this.renderFilterOption = this.renderFilterOption.bind(this);\n    this.renderTags = this.renderTags.bind(this);\n    this.renderAppliedTag = this.renderAppliedTag.bind(this);\n    this.renderUnappliedTag = this.renderUnappliedTag.bind(this);\n    this.handleClick = this.handleClick.bind(this);\n    this.filterSnippets = this.filterSnippets.bind(this);\n  }\n\n  componentDidUpdate(prevProps: IFilterSnippetProps): void {\n    if (prevProps !== this.props) {\n      // get all the tags together in one list\n      const concatTags = this.props.snippetTags.concat(this.props.languageTags);\n      this.setState((state) => ({\n        selectedTags: state.selectedTags\n          .filter((tag) => concatTags.includes(tag))\n          .sort(),\n      }));\n    }\n  }\n\n  createFilterBox(): void {\n    const filterArrow = document.querySelector(`.${FILTER_ARROW_UP}`);\n\n    const filterOption = document.querySelector(`.${FILTER_OPTION}`);\n\n    filterArrow.classList.toggle('idle');\n    filterOption.classList.toggle('idle');\n  }\n\n  renderTags(tags: string[], type: string): JSX.Element {\n    const selectedLanguageTags = this.state.selectedTags.filter((tag) =>\n      this.props.languageTags.includes(tag)\n    );\n    return (\n      <div className={FILTER_TAGS}>\n        {tags.sort().map((tag: string, index: number) => {\n          // language tags\n          if (type === 'language' && this.props.languageTags.includes(tag)) {\n            if (this.state.selectedTags.includes(tag)) {\n              return this.renderAppliedTag(tag, index.toString());\n            } else {\n              return this.renderUnappliedTag(tag, index.toString());\n            }\n          } else if (\n            // snippet tags\n            type === 'snippet' &&\n            !this.props.languageTags.includes(tag)\n          ) {\n            if (selectedLanguageTags.length !== 0) {\n              // if languages are selected, only display snippet tags that have snippets in those languages\n              const langsMatch = this.props.tagDictionary\n                .get(tag)\n                .some((r) => selectedLanguageTags.includes(r));\n              if (langsMatch) {\n                if (this.state.selectedTags.includes(tag)) {\n                  return this.renderAppliedTag(tag, index.toString());\n                } else {\n                  return this.renderUnappliedTag(tag, index.toString());\n                }\n              }\n            } else {\n              if (this.state.selectedTags.includes(tag)) {\n                return this.renderAppliedTag(tag, index.toString());\n              } else {\n                return this.renderUnappliedTag(tag, index.toString());\n              }\n            }\n          }\n        })}\n      </div>\n    );\n  }\n\n  renderAppliedTag(tag: string, index: string): JSX.Element {\n    return (\n      <div\n        className={`${FILTER_TAG} tag applied-tag`}\n        id={'filter' + '-' + tag + '-' + index}\n        key={'filter' + '-' + tag + '-' + index}\n      >\n        <button onClick={this.handleClick}>{tag}</button>\n        <checkIcon.react\n          className={FILTER_CHECK}\n          tag=\"span\"\n          elementPosition=\"center\"\n          height=\"18px\"\n          width=\"18px\"\n          marginLeft=\"5px\"\n          marginRight=\"-3px\"\n        />\n      </div>\n    );\n  }\n\n  renderUnappliedTag(tag: string, index: string): JSX.Element {\n    return (\n      <div\n        className={`${FILTER_TAG} tag unapplied-tag`}\n        id={'filter' + '-' + tag + '-' + index}\n        key={'filter' + '-' + tag + '-' + index}\n      >\n        <button onClick={this.handleClick}>{tag}</button>\n      </div>\n    );\n  }\n\n  handleClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>): void {\n    const target = event.target as HTMLElement;\n    const clickedTag = target.innerText;\n    const parent = target.parentElement;\n\n    this.setState(\n      (state) => ({\n        selectedTags: this.handleClickHelper(\n          parent,\n          state.selectedTags,\n          clickedTag\n        ),\n      }),\n      this.filterSnippets\n    );\n  }\n\n  handleClickHelper(\n    parent: HTMLElement,\n    currentTags: string[],\n    clickedTag: string\n  ): string[] {\n    if (parent.classList.contains('unapplied-tag')) {\n      parent.classList.replace('unapplied-tag', 'applied-tag');\n      currentTags.splice(-1, 0, clickedTag);\n    } else if (parent.classList.contains('applied-tag')) {\n      parent.classList.replace('applied-tag', 'unapplied-tag');\n\n      const idx = currentTags.indexOf(clickedTag);\n      currentTags.splice(idx, 1);\n    }\n    return currentTags.sort();\n  }\n\n  handleSearch = (event: React.ChangeEvent<HTMLInputElement>): void => {\n    this.setState({ searchValue: event.target.value }, this.filterSnippets);\n  };\n\n  filterSnippets(): void {\n    this.props.onFilter(\n      this.state.searchValue,\n      this.state.selectedTags,\n      this.state.selectedTags.filter((tag) =>\n        this.props.languageTags.includes(tag)\n      )\n    );\n  }\n\n  renderFilterOption(): JSX.Element {\n    // get all the tags together in one list\n    const concatTags = this.props.snippetTags.concat(this.props.languageTags);\n    return (\n      <div className={`${FILTER_OPTION} idle`}>\n        <div className={FILTER_TITLE}>\n          <span>language tags</span>\n        </div>\n        {this.renderTags(concatTags, 'language')}\n        <div className={FILTER_TITLE}>\n          <span>snippet tags</span>\n        </div>\n        {this.renderTags(concatTags, 'snippet')}\n      </div>\n    );\n  }\n\n  render(): JSX.Element {\n    return (\n      <div className={FILTER_TOOLS}>\n        <div className={FILTER_SEARCHBAR}>\n          <InputGroup\n            className={FILTER_SEARCHWRAPPER}\n            type=\"text\"\n            placeholder=\"SEARCH SNIPPETS\"\n            onChange={this.handleSearch}\n            rightIcon=\"ui-components:search\"\n            value={this.state.searchValue}\n          />\n        </div>\n        <div className={FILTER_CLASS}>\n          <button className={FILTER_BUTTON} onClick={this.createFilterBox}>\n            Filter By Tags\n          </button>\n          <div className={`${FILTER_ARROW_UP} idle`}></div>\n          {this.renderFilterOption()}\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetInputDialog.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { Dialog } from '@jupyterlab/apputils';\nimport { addIcon, checkIcon } from '@jupyterlab/ui-components';\nimport { Contents } from '@jupyterlab/services';\n\nimport { Widget } from '@lumino/widgets';\nimport { Message } from '@lumino/messaging';\n\nimport { ICodeSnippet, CodeSnippetService } from './CodeSnippetService';\nimport { showMessage } from './CodeSnippetMessage';\n\nimport { CodeSnippetWidget } from './CodeSnippetWidget';\nimport { SUPPORTED_LANGUAGES } from './CodeSnippetLanguages';\nimport { validateInputs, saveOverWriteFile } from './CodeSnippetUtilities';\n\n/**\n * The class name added to file dialogs.\n */\nconst FILE_DIALOG_CLASS = 'jp-codeSnippet-fileDialog';\n\n/**\n * CSS STYLING\n */\nconst CODE_SNIPPET_DIALOG_NAME_INPUT = 'jp-codeSnippet-dialog-name-input';\nconst CODE_SNIPPET_DIALOG_DESC_INPUT = 'jp-codeSnippet-dialog-desc-input';\nconst CODE_SNIPPET_DIALOG_LANG_INPUT = 'jp-codeSnippet-dialog-lang-input';\nconst CODE_SNIPPET_INPUTTAG_PLUS_ICON = 'jp-codeSnippet-inputTag-plusIcon';\nconst CODE_SNIPPET_INPUTTAG_LIST = 'jp-codeSnippet-inputTagList';\nconst CODE_SNIPPET_INPUT_TAG = 'jp-codeSnippet-inputTag';\nconst CODE_SNIPPET_INPUT_TAG_CHECK = 'jp-codeSnippet-inputTag-check';\n\nclass CodeSnippetDialog extends Dialog<any> {\n  first: HTMLElement;\n  protected onAfterAttach(msg: Message): void {\n    const node = this.node;\n    node.addEventListener('keydown', this, false);\n    node.addEventListener('contextmenu', this, true);\n    node.addEventListener('click', this, true);\n    document.addEventListener('focus', this, true);\n\n    const body = this.node.querySelector('.jp-Dialog-body');\n    const el = body.querySelector(\n      `.${CODE_SNIPPET_DIALOG_NAME_INPUT}`\n    ) as HTMLElement;\n    this.first = el;\n    el.focus();\n  }\n\n  protected onAfterDetach(msg: Message): void {\n    const node = this.node;\n    node.removeEventListener('keydown', this, false);\n    node.removeEventListener('contextmenu', this, true);\n    node.removeEventListener('click', this, true);\n    document.removeEventListener('focus', this, true);\n  }\n\n  protected _evtKeydown(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Escape':\n        event.stopPropagation();\n        event.preventDefault();\n        this.reject();\n        break;\n      case 'Tab': {\n        const last_button = document.querySelector('.jp-mod-accept');\n        if (document.activeElement === last_button && !event.shiftKey) {\n          event.stopPropagation();\n          event.preventDefault();\n          this.first.focus();\n        }\n        break;\n      }\n      case 'Enter':\n        event.stopPropagation();\n        event.preventDefault();\n        this.resolve();\n        break;\n      default:\n        break;\n    }\n  }\n}\n\nfunction showCodeSnippetDialog<T>(\n  options: Partial<Dialog.IOptions<T>> = {}\n): Promise<Dialog.IResult<T>> {\n  const dialog = new CodeSnippetDialog(options);\n  return dialog.launch();\n}\n\n/**\n * Save an input with a dialog. This is what actually displays everything.\n * Result.value is the value retrieved from .getValue(). ---> .getValue() returns an array of inputs.\n */\nexport function CodeSnippetInputDialog(\n  codeSnippetWidget: CodeSnippetWidget,\n  code: string,\n  language: string,\n  idx: number\n): Promise<Contents.IModel | null> {\n  const tags: string[] = [];\n  const langTags: string[] = [];\n  const codeSnippetManager = CodeSnippetService.getCodeSnippetService();\n\n  const snippets = codeSnippetManager.snippets;\n\n  // get all active tags\n  for (const snippet of snippets) {\n    if (snippet.tags) {\n      for (const tag of snippet.tags) {\n        if (!tags.includes(tag)) {\n          tags.push(tag);\n        }\n      }\n    }\n    if (!langTags.includes(snippet.language)) {\n      langTags.push(snippet.language);\n    }\n  }\n\n  const body: InputHandler = new InputHandler(tags, language, langTags);\n\n  return showInputDialog(\n    codeSnippetWidget,\n    tags,\n    idx,\n    codeSnippetManager,\n    code,\n    language,\n    body\n  );\n}\n\n/**\n * This function creates the actual input form and processes the inputs given.\n */\nexport function showInputDialog(\n  codeSnippetWidget: CodeSnippetWidget,\n  tags: string[],\n  idx: number,\n  codeSnippetManager: CodeSnippetService,\n  code: string,\n  language: string,\n  body: InputHandler\n): Promise<Contents.IModel | null> {\n  return showCodeSnippetDialog({\n    title: 'Save Code Snippet',\n    body: body,\n    buttons: [Dialog.cancelButton(), Dialog.okButton({ label: 'Save' })],\n  }).then((result: Dialog.IResult<string[]>) => {\n    if (!result.value) {\n      return null;\n    }\n\n    const nameInput = result.value[0];\n    const descriptionInput = result.value[1];\n    const languageInput = result.value[2];\n\n    if (!validateInputs(nameInput, descriptionInput, languageInput)) {\n      showInputDialog(\n        codeSnippetWidget,\n        tags,\n        idx,\n        codeSnippetManager,\n        code,\n        language,\n        body\n      );\n    } else {\n      const tags = result.value.slice(3);\n      const newSnippet: ICodeSnippet = {\n        name: nameInput.replace(' ', ''),\n        description: descriptionInput,\n        language: languageInput,\n        code: code,\n        id: idx,\n        tags: tags,\n      };\n\n      for (const snippet of codeSnippetManager.snippets) {\n        if (snippet.name === newSnippet.name) {\n          saveOverWriteFile(codeSnippetManager, snippet, newSnippet).then(\n            (res: boolean) => {\n              if (res) {\n                codeSnippetWidget.renderCodeSnippetsSignal.emit(\n                  codeSnippetManager.snippets\n                );\n              }\n            }\n          );\n          return;\n        }\n      }\n\n      createNewSnippet(codeSnippetWidget, newSnippet, codeSnippetManager);\n    }\n  });\n}\n\nfunction createNewSnippet(\n  codeSnippetWidget: CodeSnippetWidget,\n  newSnippet: ICodeSnippet,\n  codeSnippetManager: CodeSnippetService\n): void {\n  codeSnippetManager.addSnippet(newSnippet).then((res: boolean) => {\n    if (!res) {\n      console.log('Error in adding snippet');\n      return;\n    }\n  });\n\n  codeSnippetWidget.renderCodeSnippetsSignal.emit(codeSnippetManager.snippets);\n  showMessage('confirm');\n}\n\n/**\n * Test whether a name is a valid file name\n *\n * Disallows \"/\", \"\\\", and \":\" in file names, as well as names with zero length.\n */\nexport function isValidFileName(name: string): boolean {\n  const validNameExp = /[/\\\\:]/;\n  return name.length > 0 && !validNameExp.test(name);\n}\n\n/**\n * A widget used to get input data.\n */\nclass InputHandler extends Widget {\n  /**\n   * Construct a new \"code snippet\" dialog.\n   * readonly inputNode: HTMLInputElement; <--- in Widget class\n   */\n  constructor(snippetTags: string[], language: string, langTags: string[]) {\n    super({ node: Private.createInputNode(snippetTags, language, langTags) });\n    this.addClass(FILE_DIALOG_CLASS);\n  }\n\n  getValue(): string[] {\n    const inputs = [];\n    inputs.push(\n      (\n        this.node.querySelector(\n          `.${CODE_SNIPPET_DIALOG_NAME_INPUT}`\n        ) as HTMLInputElement\n      ).value,\n      (\n        this.node.querySelector(\n          `.${CODE_SNIPPET_DIALOG_DESC_INPUT}`\n        ) as HTMLInputElement\n      ).value,\n      (\n        this.node.querySelector(\n          `.${CODE_SNIPPET_DIALOG_LANG_INPUT}`\n        ) as HTMLInputElement\n      ).value\n    );\n\n    inputs.push(...Private.selectedTags);\n\n    // reset selectedTags\n    Private.selectedTags = [];\n\n    return inputs;\n  }\n}\n\n/**\n * A namespace for private data.\n */\nclass Private {\n  static selectedTags: string[] = [];\n  static allSnippetTags: string[];\n  static allLangTags: string[];\n\n  static handleOnBlur(event: Event): void {\n    const target = event.target as HTMLElement;\n    if (!target.classList.contains('touched')) {\n      target.classList.add('touched');\n    }\n  }\n\n  /**\n   * Create the node for a code snippet form handler. This is what's creating all of the elements to be displayed.\n   */\n  static createInputNode(\n    snippetTags: string[],\n    language: string,\n    langTags: string[]\n  ): HTMLElement {\n    Private.allSnippetTags = snippetTags;\n    Private.allLangTags = langTags;\n    const body = document.createElement('form');\n\n    const nameTitle = document.createElement('label');\n    nameTitle.textContent = 'Snippet Name (required)';\n    const name = document.createElement('input');\n    name.className = CODE_SNIPPET_DIALOG_NAME_INPUT;\n    name.required = true;\n    name.placeholder = 'Ex. starter code';\n    name.onblur = Private.handleOnBlur;\n\n    const descriptionTitle = document.createElement('label');\n    descriptionTitle.textContent = 'Description (optional)';\n    const description = document.createElement('input');\n    description.className = CODE_SNIPPET_DIALOG_DESC_INPUT;\n    description.placeholder = 'Description';\n    description.onblur = Private.handleOnBlur;\n\n    const languageTitle = document.createElement('label');\n    languageTitle.textContent = 'Language (required)';\n    const languageInput = document.createElement('input');\n    languageInput.className = CODE_SNIPPET_DIALOG_LANG_INPUT;\n    languageInput.setAttribute('list', 'languages');\n    // capitalize the first character\n    languageInput.value = language[0].toUpperCase() + language.slice(1);\n    languageInput.required = true;\n    const languageOption = document.createElement('datalist');\n    languageOption.id = 'languages';\n    languageOption.onblur = Private.handleOnBlur;\n\n    SUPPORTED_LANGUAGES.sort();\n    for (const supportedLanguage of SUPPORTED_LANGUAGES) {\n      const option = document.createElement('option');\n      option.value = supportedLanguage;\n      languageOption.appendChild(option);\n    }\n\n    const tagList = document.createElement('li');\n    tagList.classList.add(CODE_SNIPPET_INPUTTAG_LIST);\n    for (const tag of snippetTags) {\n      const tagElem = document.createElement('ul');\n      tagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag unapplied-tag`;\n      const tagBtn = document.createElement('button');\n      tagBtn.innerText = tag;\n      tagBtn.onclick = Private.handleClick;\n      tagElem.appendChild(tagBtn);\n      tagList.appendChild(tagElem);\n    }\n\n    const addTagElem = document.createElement('ul');\n    addTagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag unapplied-tag`;\n    const newTagName = document.createElement('button');\n    newTagName.innerText = 'Add Tag';\n    newTagName.style.cursor = 'pointer';\n    addTagElem.appendChild(newTagName);\n    const plusIcon = addIcon.element({\n      tag: 'span',\n      className: CODE_SNIPPET_INPUTTAG_PLUS_ICON,\n      elementPosition: 'center',\n      height: '16px',\n      width: '16px',\n      marginLeft: '2px',\n    });\n\n    newTagName.onclick = Private.addTag;\n\n    addTagElem.appendChild(plusIcon);\n    tagList.append(addTagElem);\n\n    body.appendChild(nameTitle);\n    body.appendChild(name);\n    body.appendChild(descriptionTitle);\n    body.appendChild(description);\n    body.appendChild(languageTitle);\n    body.appendChild(languageInput);\n    body.appendChild(languageOption);\n    body.appendChild(tagList);\n    return body;\n  }\n\n  // replace the newTagName to input and delete plusIcon and insertbefore current tag on keydown or blur (refer to cell tags)\n  static addTag(event: MouseEvent): boolean {\n    const target = event.target as HTMLElement;\n\n    const plusIcon = document.querySelector(\n      '.jp-codeSnippet-inputTag-plusIcon'\n    );\n    plusIcon.remove();\n\n    const newTagName = document.createElement('input');\n    target.parentElement.replaceChild(newTagName, target);\n\n    newTagName.onkeydown = Private.addTagOnKeyDown;\n    newTagName.onblur = Private.addTagOnBlur;\n    newTagName.focus();\n    return false;\n  }\n\n  static addTagOnKeyDown(event: KeyboardEvent): void {\n    const inputElement = event.target as HTMLInputElement;\n\n    if (inputElement.value !== '' && event.key === 'Enter') {\n      // duplicate tag\n      if (Private.allSnippetTags.includes(inputElement.value)) {\n        alert('Duplicate Tag Name!');\n        return;\n      }\n\n      if (Private.allLangTags.includes(inputElement.value)) {\n        alert(\n          'This tag already exists in language tags!\\nIf you want to create this tag, lowercase the first letter.'\n        );\n        return;\n      }\n\n      event.preventDefault();\n\n      // create new tag\n      const tagList = document.querySelector('.jp-codeSnippet-inputTagList');\n      const tagElem = document.createElement('ul');\n      tagElem.className = `${CODE_SNIPPET_INPUT_TAG} tag applied-tag`;\n      const tagBtn = document.createElement('button');\n      tagBtn.innerText = inputElement.value;\n      tagBtn.onclick = Private.handleClick;\n      tagElem.appendChild(tagBtn);\n      tagList.insertBefore(tagElem, inputElement.parentElement);\n\n      // add check mark when tag gets selected\n      const iconContainer = checkIcon.element({\n        className: CODE_SNIPPET_INPUT_TAG_CHECK,\n        tag: 'span',\n        elementPosition: 'center',\n        height: '18px',\n        width: '18px',\n        marginLeft: '5px',\n        marginRight: '-3px',\n      });\n      const color = getComputedStyle(document.documentElement).getPropertyValue(\n        '--jp-ui-font-color1'\n      );\n      tagBtn.style.color = color;\n      tagElem.appendChild(iconContainer);\n\n      // add it to the selected tags\n      Private.selectedTags.push(tagBtn.innerText);\n      Private.allSnippetTags.push(tagBtn.innerText);\n\n      // reset InputElement\n      inputElement.blur();\n      event.stopPropagation();\n    } else if (event.key === 'Escape') {\n      inputElement.blur();\n      event.stopPropagation();\n    }\n  }\n\n  static addTagOnBlur(event: FocusEvent): void {\n    const inputElement = event.target as HTMLInputElement;\n\n    // add plusIcon\n    const plusIcon = addIcon.element({\n      tag: 'span',\n      className: CODE_SNIPPET_INPUTTAG_PLUS_ICON,\n      elementPosition: 'center',\n      height: '16px',\n      width: '16px',\n      marginLeft: '2px',\n    });\n\n    // change input to span\n    const newTagName = document.createElement('button');\n    newTagName.innerText = 'Add Tag';\n    newTagName.style.cursor = 'pointer';\n    inputElement.parentElement.replaceChild(newTagName, inputElement);\n\n    newTagName.parentElement.appendChild(plusIcon);\n    newTagName.onclick = Private.addTag;\n  }\n\n  static handleClick(event: MouseEvent): boolean {\n    const target = event.target as HTMLElement;\n    const parent = target.parentElement;\n\n    if (parent.classList.contains('unapplied-tag')) {\n      Private.selectedTags.push(target.innerText);\n      parent.classList.replace('unapplied-tag', 'applied-tag');\n      const iconContainer = checkIcon.element({\n        className: CODE_SNIPPET_INPUT_TAG_CHECK,\n        tag: 'span',\n        elementPosition: 'center',\n        height: '18px',\n        width: '18px',\n        marginLeft: '5px',\n        marginRight: '-3px',\n      });\n      const color = getComputedStyle(document.documentElement).getPropertyValue(\n        '--jp-ui-font-color1'\n      );\n      target.style.color = color;\n      if (parent.children.length === 1) {\n        parent.appendChild(iconContainer);\n      }\n    } else if (parent.classList.contains('applied-tag')) {\n      const idx = Private.selectedTags.indexOf(target.innerText);\n      Private.selectedTags.splice(idx, 1);\n\n      parent.classList.replace('applied-tag', 'unapplied-tag');\n      const color = getComputedStyle(document.documentElement).getPropertyValue(\n        '--jp-ui-font-color2'\n      );\n      target.style.color = color;\n\n      if (parent.children.length !== 1) {\n        // remove check icon\n        parent.removeChild(parent.children.item(1));\n      }\n    }\n    return false;\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetLanguages.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { LabIcon } from '@jupyterlab/ui-components';\n\nimport babelSVGstr from '../style/icon/language_icons/babel.svg';\nimport cSVGstr from '../style/icon/language_icons/c.svg';\nimport clojureSVGstr from '../style/icon/language_icons/clojure.svg';\nimport coconutSVGstr from '../style/icon/language_icons/coconut.svg';\nimport coffeescriptSVGstr from '../style/icon/language_icons/coffeescript.svg';\nimport cppSVGstr from '../style/icon/language_icons/cpp.svg';\nimport csharpSVGstr from '../style/icon/language_icons/csharp.svg';\nimport erlangSVGstr from '../style/icon/language_icons/erlang.svg';\nimport forthSVGstr from '../style/icon/language_icons/forth.svg';\nimport fortranSVGstr from '../style/icon/language_icons/fortran.svg';\nimport fsharpSVGstr from '../style/icon/language_icons/fsharp.svg';\nimport goSVGstr from '../style/icon/language_icons/go.svg';\nimport groovySVGstr from '../style/icon/language_icons/groovy.svg';\nimport haskellSVGstr from '../style/icon/language_icons/haskell.svg';\nimport javaSVGstr from '../style/icon/language_icons/java.svg';\nimport javascriptSVGstr from '../style/icon/language_icons/javascript.svg';\nimport juliaSVGstr from '../style/icon/language_icons/julia.svg';\nimport kotlinSVGstr from '../style/icon/language_icons/kotlin.svg';\nimport lispSVGstr from '../style/icon/language_icons/lisp.svg';\nimport livescriptSVGstr from '../style/icon/language_icons/livescript.svg';\nimport luaSVGstr from '../style/icon/language_icons/lua.svg';\nimport matlabSVGstr from '../style/icon/language_icons/matlab.svg';\nimport nodejsSVGstr from '../style/icon/language_icons/nodejs.svg';\nimport ocamlSVGstr from '../style/icon/language_icons/ocaml.svg';\nimport perlSVGstr from '../style/icon/language_icons/perl.svg';\nimport phpSVGstr from '../style/icon/language_icons/php.svg';\nimport processingSVGstr from '../style/icon/language_icons/processing.svg';\nimport prologSVGstr from '../style/icon/language_icons/prolog.svg';\nimport purescriptSVGstr from '../style/icon/language_icons/purescript.svg';\nimport qsharpSVGstr from '../style/icon/language_icons/qsharp.svg';\nimport rubySVGstr from '../style/icon/language_icons/ruby.svg';\nimport rustSVGstr from '../style/icon/language_icons/rust.svg';\nimport sasSVGstr from '../style/icon/language_icons/sas.svg';\nimport sbtSVGstr from '../style/icon/language_icons/sbt.svg';\nimport scalaSVGstr from '../style/icon/language_icons/scala.svg';\nimport schemeSVGstr from '../style/icon/language_icons/scheme.svg';\nimport typescriptSVGstr from '../style/icon/language_icons/typescript.svg';\nimport markdownSVGstr from '../style/icon/language_icons/markdown.svg';\nimport powershellSVGstr from '../style/icon/language_icons/powershell.svg';\n\n/**\n * List of languages supported by JupyterLab\n */\nexport const SUPPORTED_LANGUAGES = [\n  'Python',\n  'Java',\n  'R',\n  'Julia',\n  'Matlab',\n  'Octave',\n  'Scheme',\n  'Processing',\n  'Scala',\n  'Groovy',\n  'Agda',\n  'Fortran',\n  'Haskell',\n  'Ruby',\n  'TypeScript',\n  'JavaScript',\n  'CoffeeScript',\n  'LiveScript',\n  'C#',\n  'F#',\n  'Go',\n  'Galileo',\n  'Gfm',\n  'Erlang',\n  'PARI/GP',\n  'Aldor',\n  'OCaml',\n  'Forth',\n  'Perl',\n  'PHP',\n  'Scilab',\n  'bash',\n  'zsh',\n  'Clojure',\n  'Hy',\n  'Lua',\n  'PureScript',\n  'Q',\n  'Cryptol',\n  'C++',\n  'Xonsh',\n  'Prolog',\n  'Common Lisp',\n  'Maxima',\n  'C',\n  'Kotlin',\n  'Pike',\n  'NodeJS',\n  'Singular',\n  'TaQL',\n  'Coconut',\n  'Babel',\n  'Clojurescript',\n  'sbt',\n  'Guile',\n  'SAS',\n  'Stata',\n  'Racekt',\n  'SQL',\n  'HiveQL',\n  'Rust',\n  'Rascal',\n  'Q#',\n  'Markdown',\n  'Powershell',\n];\n\n/**\n * Language icons\n */\nexport const babelIcon = new LabIcon({\n  name: 'custom-ui-components:babel',\n  svgstr: babelSVGstr,\n});\n\nexport const javaIcon = new LabIcon({\n  name: 'custom-ui-components:java',\n  svgstr: javaSVGstr,\n});\n\nexport const juliaIcon = new LabIcon({\n  name: 'custom-ui-components:julia',\n  svgstr: juliaSVGstr,\n});\n\nexport const matlabIcon = new LabIcon({\n  name: 'custom-ui-components:matlab',\n  svgstr: matlabSVGstr,\n});\n\nexport const schemeIcon = new LabIcon({\n  name: 'custom-ui-components:scheme',\n  svgstr: schemeSVGstr,\n});\n\nexport const processingIcon = new LabIcon({\n  name: 'custom-ui-components:processing',\n  svgstr: processingSVGstr,\n});\n\nexport const scalaIcon = new LabIcon({\n  name: 'custom-ui-components:scala',\n  svgstr: scalaSVGstr,\n});\n\nexport const groovyIcon = new LabIcon({\n  name: 'custom-ui-components:groovy',\n  svgstr: groovySVGstr,\n});\n\nexport const fortranIcon = new LabIcon({\n  name: 'custom-ui-components:fortran',\n  svgstr: fortranSVGstr,\n});\n\nexport const haskellIcon = new LabIcon({\n  name: 'custom-ui-components:haskell',\n  svgstr: haskellSVGstr,\n});\n\nexport const rubyIcon = new LabIcon({\n  name: 'custom-ui-components:ruby',\n  svgstr: rubySVGstr,\n});\n\nexport const typescriptIcon = new LabIcon({\n  name: 'custom-ui-components:typescript',\n  svgstr: typescriptSVGstr,\n});\n\nexport const javascriptIcon = new LabIcon({\n  name: 'custom-ui-components:javascript',\n  svgstr: javascriptSVGstr,\n});\n\nexport const coffeescriptIcon = new LabIcon({\n  name: 'custom-ui-components:coffeescript',\n  svgstr: coffeescriptSVGstr,\n});\n\nexport const livescriptIcon = new LabIcon({\n  name: 'custom-ui-components:livescript',\n  svgstr: livescriptSVGstr,\n});\nexport const csharpIcon = new LabIcon({\n  name: 'custom-ui-components:csharp',\n  svgstr: csharpSVGstr,\n});\n\nexport const fsharpIcon = new LabIcon({\n  name: 'custom-ui-components:fsharp',\n  svgstr: fsharpSVGstr,\n});\n\nexport const goIcon = new LabIcon({\n  name: 'custom-ui-components:go',\n  svgstr: goSVGstr,\n});\n\nexport const erlangIcon = new LabIcon({\n  name: 'custom-ui-components:erlang',\n  svgstr: erlangSVGstr,\n});\n\nexport const ocamlIcon = new LabIcon({\n  name: 'custom-ui-components:ocaml',\n  svgstr: ocamlSVGstr,\n});\n\nexport const forthIcon = new LabIcon({\n  name: 'custom-ui-components:forth',\n  svgstr: forthSVGstr,\n});\n\nexport const perlIcon = new LabIcon({\n  name: 'custom-ui-components:perl',\n  svgstr: perlSVGstr,\n});\n\nexport const phpIcon = new LabIcon({\n  name: 'custom-ui-components:php',\n  svgstr: phpSVGstr,\n});\n\nexport const clojureIcon = new LabIcon({\n  name: 'custom-ui-components:clojure',\n  svgstr: clojureSVGstr,\n});\n\nexport const luaIcon = new LabIcon({\n  name: 'custom-ui-components:lua',\n  svgstr: luaSVGstr,\n});\n\nexport const purescriptIcon = new LabIcon({\n  name: 'custom-ui-components:purescript',\n  svgstr: purescriptSVGstr,\n});\n\nexport const cppIcon = new LabIcon({\n  name: 'custom-ui-components:cpp',\n  svgstr: cppSVGstr,\n});\n\nexport const prologIcon = new LabIcon({\n  name: 'custom-ui-components:prolog',\n  svgstr: prologSVGstr,\n});\n\nexport const lispIcon = new LabIcon({\n  name: 'custom-ui-components:lisp',\n  svgstr: lispSVGstr,\n});\n\nexport const cIcon = new LabIcon({\n  name: 'custom-ui-components:c',\n  svgstr: cSVGstr,\n});\n\nexport const kotlinIcon = new LabIcon({\n  name: 'custom-ui-components:kotlin',\n  svgstr: kotlinSVGstr,\n});\n\nexport const nodejsIcon = new LabIcon({\n  name: 'custom-ui-components:nodejs',\n  svgstr: nodejsSVGstr,\n});\n\nexport const sasIcon = new LabIcon({\n  name: 'custom-ui-components:sas',\n  svgstr: sasSVGstr,\n});\n\nexport const coconutIcon = new LabIcon({\n  name: 'custom-ui-components:coconut',\n  svgstr: coconutSVGstr,\n});\n\nexport const sbtIcon = new LabIcon({\n  name: 'custom-ui-components:sbt',\n  svgstr: sbtSVGstr,\n});\n\nexport const rustIcon = new LabIcon({\n  name: 'custom-ui-components:rust',\n  svgstr: rustSVGstr,\n});\n\nexport const qsharpIcon = new LabIcon({\n  name: 'custom-ui-components:qsharp',\n  svgstr: qsharpSVGstr,\n});\n\nexport const markdownIcon = new LabIcon({\n  name: 'custom-ui-components:markdown',\n  svgstr: markdownSVGstr,\n});\n\nexport const powershellIcon = new LabIcon({\n  name: 'custom-ui-components:powershell',\n  svgstr: powershellSVGstr,\n});\n"
  },
  {
    "path": "src/CodeSnippetMenu.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { WidgetTracker, ReactWidget } from '@jupyterlab/apputils';\n\nimport { Widget, PanelLayout, Panel } from '@lumino/widgets';\nimport { Message, MessageLoop } from '@lumino/messaging';\nimport { PromiseDelegate } from '@lumino/coreutils';\nimport { ArrayExt } from '@lumino/algorithm';\n\n/**\n * The class name for options box\n */\nconst OPTIONS_CLASS = 'jp-codeSnippet-options';\nconst OPTIONS_CONTENT = 'jp-codeSnippet-options-content';\nconst OPTIONS_BODY = 'jp-codeSnippet-options-body';\n\n/**\n * Create and show a code snippet options.\n *\n * @param options - The code snippet options setup options.\n *\n * @returns A promise that resolves with whether the code snippet options was accepted.\n */\nexport function showMoreOptions(\n  options: Partial<OptionsMessage.IOptions> = {}\n): Promise<void> {\n  const optionsMessage = new OptionsMessage(options);\n  return optionsMessage.launch();\n}\n\n/**\n * A widget used to show options message.\n */\nexport class OptionsMessage extends Widget {\n  constructor(options: Partial<OptionsMessage.IOptions> = {}) {\n    super();\n    this.addClass(OPTIONS_CLASS);\n    const renderer = OptionsMessage.defaultRenderer;\n\n    this._host = options.host || document.body;\n    const layout = (this.layout = new PanelLayout());\n    const content = new Panel();\n    content.addClass(OPTIONS_CONTENT);\n    layout.addWidget(content);\n\n    const body = renderer.createBody(options.body);\n    content.addWidget(body);\n\n    if (OptionsMessage.tracker.size > 0) {\n      const previous = OptionsMessage.tracker.currentWidget;\n      previous.reject();\n      OptionsMessage.tracker.dispose();\n    }\n\n    void OptionsMessage.tracker.add(this);\n  }\n  /**\n   * Launch the code snippet options as a modal window.\n   *\n   * @returns a promise that resolves with the result of the code snippet options.\n   */\n  launch(): Promise<void> {\n    // Return the existing code snippet options if already open.\n    if (this._promise) {\n      return this._promise.promise;\n    }\n    const promise = (this._promise = new PromiseDelegate<void>());\n    const promises = Promise.all(Private.launchQueue);\n    Private.launchQueue.push(this._promise.promise);\n    return promises.then(() => {\n      Widget.attach(this, this._host);\n      return promise.promise;\n    });\n  }\n\n  /**\n   * Handle the DOM events for the directory listing.\n   *\n   * @param event - The DOM event sent to the widget.\n   *\n   * #### Notes\n   * This method implements the DOM `EventListener` interface and is\n   * called in response to events on the panel's DOM node. It should\n   * not be called directly by user code.\n   */\n  handleEvent(event: Event): void {\n    switch (event.type) {\n      case 'click':\n        this._evtClick(event as MouseEvent);\n        break;\n      case 'contextmenu':\n        this._evtClick(event as MouseEvent);\n        break;\n      default:\n        break;\n    }\n  }\n\n  /**\n   * Handle the `'click'` event for a code snippet options button.\n   *\n   * @param event - The DOM event sent to the widget\n   */\n  protected _evtClick(event: MouseEvent): void {\n    const content = this.node.getElementsByClassName(\n      OPTIONS_CONTENT\n    )[0] as HTMLElement;\n    if (!content.contains(event.target as HTMLElement)) {\n      event.stopPropagation();\n      event.preventDefault();\n      this.reject();\n    }\n  }\n\n  /**\n   * Reject the current code snippet options with a default reject value.\n   *\n   * #### Notes\n   * Will be a no-op if the code snippet options is not shown.\n   */\n  reject(): void {\n    if (!this._promise) {\n      return;\n    }\n    this._resolve();\n  }\n\n  /**\n   * Resolve a button item.\n   */\n  private _resolve(): void {\n    // Prevent loopback.\n    const promise = this._promise;\n    if (!promise) {\n      this.dispose();\n      return;\n    }\n    this._promise = null;\n    ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n    this.dispose();\n    promise.resolve();\n  }\n\n  /**\n   * Dispose of the resources used by the code snippet options.\n   */\n  dispose(): void {\n    const promise = this._promise;\n    if (promise) {\n      this._promise = null;\n      promise.reject(void 0);\n      ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n    }\n    super.dispose();\n  }\n\n  /**\n   *  A message handler invoked on an `'after-attach'` message.\n   */\n  protected onAfterAttach(msg: Message): void {\n    const node = this.node;\n    node.addEventListener('click', this, true);\n    node.addEventListener('contextmenu', this, true);\n  }\n\n  /**\n   *  A message handler invoked on an `'after-detach'` message.\n   */\n  protected onAfterDetach(msg: Message): void {\n    const node = this.node;\n    node.removeEventListener('click', this, true);\n    node.removeEventListener('contextmenu', this, true);\n  }\n\n  private _promise: PromiseDelegate<void> | null;\n  private _host: HTMLElement;\n}\n\nexport namespace OptionsMessage {\n  /**\n   * The body input types.\n   */\n  export type Body = Widget;\n\n  export interface IOptions {\n    /**\n     * The main body element for the code snippet options or a message to display.\n     * Defaults to an empty string.\n     *\n     * #### Notes\n     * If a widget is given as the body, it will be disposed after the\n     * code snippet options is resolved.  If the widget has a `getValue()` method,\n     * the method will be called prior to disposal and the value\n     * will be provided as part of the code snippet options result.\n     * A string argument will be used as raw `textContent`.\n     * All `input` and `select` nodes will be wrapped and styled.\n     */\n    body: Body;\n\n    /**\n     * The host element for the code snippet options. Defaults to `document.body`.\n     */\n    host: HTMLElement;\n\n    /**\n     * An optional renderer for code snippet options items.  Defaults to a shared\n     * default renderer.\n     */\n    renderer: IRenderer;\n  }\n\n  export interface IRenderer {\n    /**\n     * Create the body of the code snippet options.\n     *\n     * @param value - The input value for the body.\n     *\n     * @returns A widget for the body.\n     */\n    createBody(body: Body): Widget;\n  }\n\n  export class Renderer {\n    /**\n     * Create the body of the code snippet options.\n     *\n     * @param value - The input value for the body.\n     *\n     * @returns A widget for the body.\n     */\n    createBody(value: Body): Widget {\n      let body: Widget;\n      if (typeof value === 'string') {\n        body = new Widget({ node: document.createElement('span') });\n        body.node.textContent = value;\n      } else if (value instanceof Widget) {\n        body = value;\n      } else {\n        body = ReactWidget.create(value) as Widget;\n        // Immediately update the body even though it has not yet attached in\n        // order to trigger a render of the DOM nodes from the React element.\n        MessageLoop.sendMessage(body, Widget.Msg.UpdateRequest);\n      }\n      body.addClass(OPTIONS_BODY);\n      return body;\n    }\n  }\n  /**\n   * The default renderer instance.\n   */\n  export const defaultRenderer = new Renderer();\n\n  /**\n   * The code snippet options widget tracker.\n   */\n  export const tracker = new WidgetTracker<OptionsMessage>({\n    namespace: '@jupyterlab/code_snippet:OptionsWidget',\n  });\n}\n\n/**\n * The namespace for module private data.\n */\nnamespace Private {\n  /**\n   * The queue for launching code snippet optionss.\n   */\n  export const launchQueue: Promise<void>[] = [];\n}\n"
  },
  {
    "path": "src/CodeSnippetMessage.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// import { WidgetTracker, ReactWidget } from '@jupyterlab/apputils';\nimport { Dialog } from '@jupyterlab/apputils';\n\nimport { Widget } from '@lumino/widgets';\nimport { Message } from '@lumino/messaging';\n\nimport checkSVGstr from '../style/icon/jupyter_checkmark.svg';\n\n/**\n * The class name for message\n */\n// const CONFIRM_CLASS = 'jp-codeSnippet-confirm';\nconst CONFIRM_CONTENT = 'jp-codeSnippet-Message-content';\nconst CONFIRM_BODY = 'jp-codeSnippet-Message-body';\nconst CODE_SNIPPET_CONFIRM_TEXT = 'jp-codeSnippet-confirm-text';\n\n/**\n * Create and show a dialog.\n *\n * @param options - The dialog setup options.\n *\n * @returns A promise that resolves with whether the dialog was accepted.\n */\nexport function showMessage<T>(type: string): Promise<Dialog.IResult<T>> {\n  const confirmMessage = new CodeSnippetMessage({\n    body: new MessageHandler(type),\n    buttons: [],\n  });\n  return confirmMessage.launch();\n}\n\n/**\n * A widget used to show message.\n */\nexport class CodeSnippetMessage<T> extends Dialog<any> {\n  constructor(options: Partial<Dialog.IOptions<T>> = {}) {\n    super(options);\n    this.children().next().addClass(CONFIRM_CONTENT);\n  }\n\n  protected onAfterAttach(msg: Message): void {\n    const node = this.node;\n\n    node.addEventListener('click', this, true);\n    document.addEventListener('keydown', this, false);\n  }\n\n  /**\n   *  A message handler invoked on an `'after-detach'` message.\n   */\n  protected onAfterDetach(msg: Message): void {\n    const node = this.node;\n    node.removeEventListener('click', this, true);\n    document.removeEventListener('keydown', this, false);\n  }\n\n  handleEvent(event: Event): void {\n    switch (event.type) {\n      case 'keydown':\n        this._evtKeydown(event as KeyboardEvent);\n        break;\n      case 'click':\n        this._evtClick(event as MouseEvent);\n        break;\n    }\n  }\n\n  protected _evtKeydown(event: KeyboardEvent): void {\n    // Check for escape key\n    switch (event.key) {\n      case 'Escape':\n        event.stopPropagation();\n        event.preventDefault();\n        this.reject();\n        break;\n    }\n  }\n}\n\nclass MessageHandler extends Widget {\n  constructor(type: string) {\n    super({ node: Private.createMessageNode(type) });\n    this.addClass(CONFIRM_BODY);\n  }\n}\n\n/**\n * The namespace for module private data.\n */\nnamespace Private {\n  // create a confirm message when new snippet is created successfully\n  export function createMessageNode(type: string): HTMLElement {\n    const body = document.createElement('div');\n    body.innerHTML = checkSVGstr;\n\n    const messageContainer = document.createElement('div');\n    messageContainer.className = CODE_SNIPPET_CONFIRM_TEXT;\n    const message = document.createElement('text');\n    if (type === 'confirm') {\n      message.textContent = 'Saved as Snippet!';\n    } else if (type === 'copy') {\n      message.textContent = 'Saved to Clipboard!';\n    } else if (type === 'export') {\n      message.textContent = 'Exported the Snippet!';\n    }\n    messageContainer.appendChild(message);\n    body.append(messageContainer);\n    return body;\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetPreview.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\nimport { WidgetTracker, ReactWidget } from '@jupyterlab/apputils';\nimport { CodeEditor, IEditorServices } from '@jupyterlab/codeeditor';\n\nimport { Widget, PanelLayout, Panel } from '@lumino/widgets';\nimport { Message, MessageLoop } from '@lumino/messaging';\nimport { PromiseDelegate } from '@lumino/coreutils';\nimport { ArrayExt } from '@lumino/algorithm';\n\nimport { ICodeSnippet, CodeSnippetService } from './CodeSnippetService';\n\n/**\n * The class name for preview box.\n */\nconst PREVIEW_CLASS = 'jp-codeSnippet-preview';\nconst PREVIEW_CONTENT = 'jp-codeSnippet-preview-content';\nconst PREVIEW_BODY = 'jp-codeSnippet-preview-body';\n\n/**\n * Create and show a preview.\n *\n * @param options - The preview setup options.\n *\n */\nexport function showPreview(\n  options: Partial<Preview.IOptions> = {},\n  editorServices: IEditorServices\n): Promise<void> {\n  //Insert check method to see if the preview is already open\n  const preview = new Preview(options, editorServices);\n  if (preview.ready === false) {\n    return;\n  }\n  return preview.launch();\n}\n\n/**\n * A widget used to show preview\n */\nexport class Preview extends Widget {\n  ready: boolean;\n  _title: string;\n  _id: number;\n  editor: CodeEditor.IEditor;\n  codeSnippet: ICodeSnippet;\n  editorServices: IEditorServices;\n  codeSnippetService: CodeSnippetService;\n  private _hasRefreshedSinceAttach: boolean;\n  constructor(\n    options: Partial<Preview.IOptions> = {},\n    editorServices: IEditorServices\n  ) {\n    super();\n    this.ready = true;\n    this._title = options.title;\n    this._id = options.id;\n    this.codeSnippet = options.codeSnippet;\n    this.editorServices = editorServices;\n    this.codeSnippetService = CodeSnippetService.getCodeSnippetService();\n    this.addClass(PREVIEW_CLASS);\n    const layout = (this.layout = new PanelLayout());\n    const content = new Panel();\n    content.addClass(PREVIEW_CONTENT);\n    content.id = PREVIEW_CONTENT + this._id;\n    layout.addWidget(content);\n\n    if (Preview.tracker.size > 0) {\n      const previous = Preview.tracker.currentWidget;\n      previous.reject();\n      Preview.tracker.dispose();\n    }\n    if (this.ready === true) {\n      void Preview.tracker.add(this);\n    }\n  }\n  /**\n   * Launch the preview as a modal window.\n   */\n  launch(): Promise<void> {\n    // Return the existing preview if already open.\n    if (this._promise) {\n      return this._promise.promise;\n    }\n    const promise = (this._promise = new PromiseDelegate<void>());\n    const promises = Promise.all(Private.launchQueue);\n    Private.launchQueue.push(this._promise.promise);\n    return promises.then(() => {\n      Widget.attach(this, document.getElementById('jp-main-dock-panel'));\n      return promise.promise;\n    });\n  }\n\n  /**\n   * Reject the current preview with a default reject value.\n   *\n   * #### Notes\n   * Will be a no-op if the preview is not shown.\n   */\n  reject(): void {\n    if (!this._promise) {\n      return;\n    }\n    this._resolve();\n  }\n\n  /**\n   * Resolve a button item.\n   */\n  private _resolve(): void {\n    // Prevent loopback.\n    const promise = this._promise;\n    if (!promise) {\n      this.dispose();\n      return;\n    }\n    this._promise = null;\n    ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n    this.dispose();\n    promise.resolve();\n  }\n\n  /**\n   * Dispose of the resources used by the preview.\n   */\n  dispose(): void {\n    const promise = this._promise;\n    if (promise) {\n      this._promise = null;\n      promise.reject(void 0);\n      ArrayExt.removeFirstOf(Private.launchQueue, promise.promise);\n    }\n    super.dispose();\n  }\n\n  /**\n   *  A message handler invoked on an `'after-attach'` message.\n   */\n  protected onAfterAttach(msg: Message): void {\n    super.onAfterAttach(msg);\n    this._hasRefreshedSinceAttach = false;\n    if (this.isVisible) {\n      this.update();\n    }\n  }\n\n  onAfterShow(msg: Message): void {\n    if (!this._hasRefreshedSinceAttach) {\n      this.update();\n    }\n  }\n\n  onUpdateRequest(msg: Message): void {\n    super.onUpdateRequest(msg);\n\n    if (!this.editor && document.getElementById(PREVIEW_CONTENT + this._id)) {\n      const editorFactory = this.editorServices.factoryService.newInlineEditor;\n      const getMimeTypeByLanguage =\n        this.editorServices.mimeTypeService.getMimeTypeByLanguage;\n\n      let previewFontSize = this.codeSnippetService.settings.get(\n        'snippetPreviewFontSize'\n      ).composite as number;\n      if (\n        this.codeSnippetService.settings.get('snippetPreviewFontSize').user !==\n        undefined\n      ) {\n        previewFontSize = this.codeSnippetService.settings.get(\n          'snippetPreviewFontSize'\n        ).user as number;\n      }\n\n      this.editor = editorFactory({\n        host: document.getElementById(PREVIEW_CONTENT + this._id),\n        config: { readOnly: true, fontSize: previewFontSize },\n        model: new CodeEditor.Model({\n          value: this.codeSnippet.code,\n          mimeType: getMimeTypeByLanguage({\n            name: this.codeSnippet.language,\n            codemirror_mode: this.codeSnippet.language,\n          }),\n        }),\n      });\n    }\n    if (this.isVisible) {\n      this._hasRefreshedSinceAttach = true;\n      this.editor.refresh();\n    }\n  }\n\n  private _promise: PromiseDelegate<void> | null;\n}\n\nexport namespace Preview {\n  /**\n   * The body input types.\n   */\n  export type Body = Widget;\n\n  export interface IOptions {\n    title: string;\n    id: number;\n    /**\n     * The main body element for the preview or a message to display.\n     * Defaults to an empty string.\n     *\n     * #### Notes\n     * If a widget is given as the body, it will be disposed after the\n     * preview is resolved.  If the widget has a `getValue()` method,\n     * the method will be called prior to disposal and the value\n     * will be provided as part of the preview result.\n     * A string argument will be used as raw `textContent`.\n     * All `input` and `select` nodes will be wrapped and styled.\n     */\n    body: Body;\n    codeSnippet: ICodeSnippet;\n  }\n\n  export interface IRenderer {\n    /**\n     * Create the body of the preview.\n     *\n     * @param value - The input value for the body.\n     *\n     * @returns A widget for the body.\n     */\n    createBody(body: Body): Widget;\n  }\n\n  export class Renderer {\n    /**\n     * Create the body of the preview.\n     *\n     * @param value - The input value for the body.\n     *\n     * @returns A widget for the body.\n     */\n    createBody(value: Body): Widget {\n      let body: Widget;\n      if (typeof value === 'string') {\n        body = new Widget({ node: document.createElement('span') });\n        body.node.textContent = value;\n      } else if (value instanceof Widget) {\n        body = value;\n      } else {\n        body = ReactWidget.create(value);\n        // Immediately update the body even though it has not yet attached in\n        // order to trigger a render of the DOM nodes from the React element.\n        MessageLoop.sendMessage(body, Widget.Msg.UpdateRequest);\n      }\n      body.addClass(PREVIEW_BODY);\n      return body;\n    }\n  }\n  /**\n   * The default renderer instance.\n   */\n  export const defaultRenderer = new Renderer();\n\n  /**\n   * The preview widget tracker.\n   */\n  export const tracker = new WidgetTracker<Preview>({\n    namespace: '@jupyterlab/code_snippet:preview',\n  });\n}\n\n/**\n * The namespace for module private data.\n */\nnamespace Private {\n  /**\n   * The queue for launching previews.\n   */\n  export const launchQueue: Promise<void>[] = [];\n}\n"
  },
  {
    "path": "src/CodeSnippetService.ts",
    "content": "import { JupyterFrontEnd } from '@jupyterlab/application';\nimport { Settings } from '@jupyterlab/settingregistry';\nimport { JSONArray, JSONExt, PartialJSONValue } from '@lumino/coreutils';\n\nimport { CodeSnippetWidget } from './CodeSnippetWidget';\n\nexport interface ICodeSnippet {\n  name: string;\n  description?: string;\n  language: string;\n  // code separated by a new line\n  code: string;\n  id: number;\n  tags?: string[];\n}\n\nexport class CodeSnippetService {\n  private settingManager: Settings;\n  private static codeSnippetService: CodeSnippetService;\n  private codeSnippetList: ICodeSnippet[];\n\n  private constructor(settings: Settings, app: JupyterFrontEnd) {\n    this.settingManager = settings;\n\n    // when user changes the snippets using settingsEditor\n    this.settingManager.changed.connect(async (plugin) => {\n      const newCodeSnippetList = plugin.get('snippets').user;\n\n      if (\n        !JSONExt.deepEqual(\n          newCodeSnippetList,\n          this.codeSnippetList as unknown as PartialJSONValue\n        )\n      ) {\n        this.codeSnippetList = this.convertToICodeSnippetList(\n          newCodeSnippetList as JSONArray\n        );\n\n        const leftWidgets = app.shell.widgets('left').iter();\n\n        let current = leftWidgets.next();\n        while (current) {\n          if (current instanceof CodeSnippetWidget) {\n            current.updateCodeSnippetWidget();\n            break;\n          }\n          current = leftWidgets.next();\n        }\n\n        // order code snippet and sync it with setting\n        this.orderSnippets();\n        await plugin\n          .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n          .catch((e) => {\n            console.log(\n              'Error in syncing orders of snippets with those in settings'\n            );\n            console.log(e);\n          });\n      }\n    });\n\n    // load user's saved snippets\n    if (this.settingManager.get('snippets').user) {\n      const userSnippets = this.convertToICodeSnippetList(\n        this.settingManager.get('snippets').user as JSONArray\n      );\n      this.codeSnippetList = userSnippets;\n    }\n\n    // set default preview font size\n    if (this.settingManager.get('snippetPreviewFontSize').user === undefined) {\n      this.settingManager.set(\n        'snippetPreviewFontSize',\n        this.settingManager.default('snippetPreviewFontSize')\n      );\n    }\n  }\n\n  private convertToICodeSnippetList(snippets: JSONArray): ICodeSnippet[] {\n    const snippetList: ICodeSnippet[] = [];\n\n    snippets.forEach((snippet) => {\n      const newSnippet = snippet as unknown as ICodeSnippet;\n\n      snippetList.push(newSnippet);\n    });\n    return snippetList;\n  }\n\n  static init(settings: Settings, app: JupyterFrontEnd): void {\n    if (!this.codeSnippetService) {\n      this.codeSnippetService = new CodeSnippetService(settings, app);\n    }\n  }\n\n  static getCodeSnippetService(): CodeSnippetService {\n    return this.codeSnippetService;\n  }\n\n  get settings(): Settings {\n    return this.settingManager;\n  }\n\n  get snippets(): ICodeSnippet[] {\n    return this.codeSnippetList;\n  }\n\n  getSnippetByName(snippetName: string): ICodeSnippet[] {\n    return this.codeSnippetList.filter(\n      (snippet) => snippet.name.toLowerCase() === snippetName.toLowerCase()\n    );\n  }\n\n  async addSnippet(snippet: ICodeSnippet): Promise<boolean> {\n    const id = snippet.id;\n    this.codeSnippetList.splice(id, 0, snippet);\n\n    const numSnippets = this.codeSnippetList.length;\n\n    // update id's of snippets.\n    let i = id + 1;\n    for (; i < numSnippets; i++) {\n      this.codeSnippetList[i].id += 1;\n    }\n\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n    return true;\n  }\n\n  async deleteSnippet(id: number): Promise<boolean> {\n    let numSnippets = this.codeSnippetList.length;\n\n    // should never satisfy this condition\n    if (id >= numSnippets) {\n      console.log('error in codeSnippetService');\n    }\n\n    if (id === numSnippets - 1) {\n      this.codeSnippetList.pop();\n    } else {\n      this.codeSnippetList.splice(id, 1);\n\n      numSnippets = this.codeSnippetList.length;\n      let i = id;\n      for (; i < numSnippets; i++) {\n        this.codeSnippetList[i].id -= 1;\n      }\n    }\n\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n\n    return true;\n  }\n\n  async renameSnippet(oldName: string, newName: string): Promise<boolean> {\n    for (const snippet of this.codeSnippetList) {\n      if (snippet.name === oldName) {\n        snippet.name = newName;\n        break;\n      }\n    }\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n    return true;\n  }\n\n  duplicateNameExists(newName: string): boolean {\n    for (const snippet of this.codeSnippetList) {\n      if (snippet.name.toLowerCase() === newName.toLowerCase()) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  async modifyExistingSnippet(\n    oldName: string,\n    newSnippet: ICodeSnippet\n  ): Promise<boolean> {\n    for (const snippet of this.codeSnippetList) {\n      if (snippet.name.toLowerCase() === oldName.toLowerCase()) {\n        this.codeSnippetList.splice(snippet.id, 1, newSnippet);\n        break;\n      }\n    }\n\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n    return true;\n  }\n\n  async moveSnippet(fromIdx: number, toIdx: number): Promise<boolean> {\n    if (toIdx > fromIdx) {\n      toIdx = toIdx - 1;\n    }\n\n    if (toIdx === fromIdx) {\n      return;\n    }\n\n    const snippetToMove = this.codeSnippetList[fromIdx];\n    this.deleteSnippet(fromIdx).then((res: boolean) => {\n      if (!res) {\n        console.log('Error in moving snippet(delete)');\n        return false;\n      }\n    });\n    snippetToMove.id = toIdx;\n    this.addSnippet(snippetToMove).then((res: boolean) => {\n      if (!res) {\n        console.log('Error in moving snippet(add)');\n        return false;\n      }\n    });\n\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n    return true;\n  }\n\n  // order snippets just in case when it gets shared between users\n  async orderSnippets(): Promise<boolean> {\n    this.codeSnippetList.sort((a, b) => a.id - b.id);\n    this.codeSnippetList.forEach((snippet, i) => (snippet.id = i));\n\n    await this.settingManager\n      .set('snippets', this.codeSnippetList as unknown as PartialJSONValue)\n      .catch((_) => {\n        return false;\n      });\n    return true;\n  }\n}\n"
  },
  {
    "path": "src/CodeSnippetUtilities.ts",
    "content": "import { showDialog, Dialog } from '@jupyterlab/apputils';\n\nimport { SUPPORTED_LANGUAGES } from './CodeSnippetLanguages';\nimport { CodeSnippetService, ICodeSnippet } from './CodeSnippetService';\n\n/**\n * Test whether user typed in all required inputs.\n */\nexport function validateInputs(\n  name: string,\n  description: string,\n  language: string\n): boolean {\n  let status = true;\n  let message = '';\n  if (name === '') {\n    message += 'Name must be filled out\\n';\n    status = false;\n  }\n  if (language === '') {\n    message += 'Language must be filled out';\n    status = false;\n  }\n  if (!SUPPORTED_LANGUAGES.includes(language)) {\n    message += 'Language must be one of the options';\n    status = false;\n  }\n  if (status === false) {\n    alert(message);\n  }\n  return status;\n}\n\n/**\n * Rename a file, warning for overwriting another.\n */\nexport async function saveOverWriteFile(\n  codeSnippetManager: CodeSnippetService,\n  oldSnippet: ICodeSnippet,\n  newSnippet: ICodeSnippet\n): Promise<boolean> {\n  const newName = newSnippet.name;\n\n  return await shouldOverwrite(newName).then((res) => {\n    if (res) {\n      newSnippet.id = oldSnippet.id;\n\n      codeSnippetManager.deleteSnippet(oldSnippet.id).then((res: boolean) => {\n        if (!res) {\n          console.log('Error in overwriting a snippet (delete)');\n          return false;\n        }\n      });\n      codeSnippetManager.addSnippet(newSnippet).then((res: boolean) => {\n        if (!res) {\n          console.log('Error in overwriting a snippet (add)');\n          return false;\n        }\n      });\n      return true;\n    }\n  });\n}\n\n/**\n * Ask the user whether to overwrite a file.\n */\nasync function shouldOverwrite(newName: string): Promise<boolean> {\n  const options = {\n    title: 'Overwrite code snippet?',\n    body: `\"${newName}\" already exists, overwrite?`,\n    buttons: [Dialog.cancelButton(), Dialog.warnButton({ label: 'Overwrite' })],\n  };\n  return showDialog(options).then((result) => {\n    return result.button.accept;\n  });\n}\n"
  },
  {
    "path": "src/CodeSnippetWidget.tsx",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code are from Elyra Code Snippet.\n\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\nimport { ReactWidget, UseSignal } from '@jupyterlab/apputils';\nimport { JupyterFrontEnd } from '@jupyterlab/application';\nimport { IEditorServices } from '@jupyterlab/codeeditor';\n\nimport { Widget } from '@lumino/widgets';\nimport { Message } from '@lumino/messaging';\nimport { Signal } from '@lumino/signaling';\nimport { IDragEvent } from '@lumino/dragdrop';\nimport { MimeData, ReadonlyPartialJSONObject } from '@lumino/coreutils';\n\nimport { CodeSnippetService, ICodeSnippet } from './CodeSnippetService';\nimport { CodeSnippetDisplay } from './CodeSnippetDisplay';\nimport { CodeSnippetInputDialog } from './CodeSnippetInputDialog';\n\nimport React from 'react';\nimport { Notebook } from '@jupyterlab/notebook';\n\n/**\n * A class used to indicate a snippet item.\n */\nconst CODE_SNIPPET_ITEM = 'jp-codeSnippet-item';\n\n/**\n * The mimetype used for Jupyter cell data.\n */\nconst JUPYTER_CELL_MIME = 'application/vnd.jupyter.cells';\n\n/**\n * A class used to indicate a drop target.\n */\nconst DROP_TARGET_CLASS = 'jp-codeSnippet-dropTarget';\nconst CODE_SNIPPET_EDITOR = 'jp-codeSnippet-editor';\nconst CODE_SNIPPET_DRAG_HOVER = 'jp-codeSnippet-drag-hover';\n\nconst commands = {\n  OPEN_CODE_SNIPPET_EDITOR: `${CODE_SNIPPET_EDITOR}:open`,\n};\n\n/**\n * A widget for Code Snippets.\n */\nexport class CodeSnippetWidget extends ReactWidget {\n  getCurrentWidget: () => Widget;\n  // private _codeSnippetWidgetModel: CodeSnippetWidgetModel;\n  renderCodeSnippetsSignal: Signal<this, ICodeSnippet[]>;\n  app: JupyterFrontEnd;\n  codeSnippetManager: CodeSnippetService;\n  private editorServices: IEditorServices;\n\n  constructor(\n    getCurrentWidget: () => Widget,\n    app: JupyterFrontEnd,\n    editorServices: IEditorServices\n  ) {\n    super();\n    this.app = app;\n    this.editorServices = editorServices;\n    this.getCurrentWidget = getCurrentWidget;\n    this.renderCodeSnippetsSignal = new Signal<this, ICodeSnippet[]>(this);\n    this.codeSnippetManager = CodeSnippetService.getCodeSnippetService();\n\n    this.moveCodeSnippet = this.moveCodeSnippet.bind(this);\n    this.openCodeSnippetEditor = this.openCodeSnippetEditor.bind(this);\n    this.updateCodeSnippetWidget = this.updateCodeSnippetWidget.bind(this);\n\n    this.node.setAttribute('data-lm-dragscroll', 'true');\n  }\n\n  updateCodeSnippetWidget(): void {\n    if (this.codeSnippetManager) {\n      const newSnippets = this.codeSnippetManager.snippets;\n      newSnippets && this.renderCodeSnippetsSignal.emit(newSnippets);\n    }\n  }\n\n  onAfterShow(msg: Message): void {\n    this.updateCodeSnippetWidget();\n  }\n\n  openCodeSnippetEditor(args: ReadonlyPartialJSONObject): void {\n    this.app.commands.execute(commands.OPEN_CODE_SNIPPET_EDITOR, args);\n  }\n\n  /**\n   * Handle the DOM events for the widget.\n   *\n   * @param event - The DOM event sent to the widget.\n   *\n   * #### Notes\n   * This method implements the DOM `EventListener` interface and is\n   * called in response to events on the notebook panel's node. It should\n   * not be called directly by user code.\n   */\n  handleEvent(event: Event): void {\n    switch (event.type) {\n      case 'lm-dragenter':\n        this._evtDragEnter(event as IDragEvent);\n        break;\n      case 'lm-dragleave':\n        this._evtDragLeave(event as IDragEvent);\n        break;\n      case 'lm-dragover':\n        this._evtDragOver(event as IDragEvent);\n        break;\n      case 'lm-drop':\n        this._evtDrop(event as IDragEvent);\n        break;\n      default:\n        break;\n    }\n  }\n\n  /**\n   * A message handler invoked on an `'after-attach'` message.\n   * @param msg\n   */\n  protected onAfterAttach(msg: Message): void {\n    super.onAfterAttach(msg);\n\n    const node = this.node;\n    node.addEventListener('lm-dragenter', this);\n    node.addEventListener('lm-dragleave', this);\n    node.addEventListener('lm-dragover', this);\n    node.addEventListener('lm-drop', this);\n  }\n\n  /**\n   * Handle `before-detach` messages for the widget.\n   * @param msg\n   */\n  protected onBeforeDetach(msg: Message): void {\n    const node = this.node;\n    node.removeEventListener('lm-dragenter', this);\n    node.removeEventListener('lm-dragleave', this);\n    node.removeEventListener('lm-dragover', this);\n    node.removeEventListener('lm-drop', this);\n  }\n\n  /**\n   * Find the snippet containing the target html element.\n   *\n   * #### Notes\n   * Returns undefined if the cell is not found.\n   */\n  private _findSnippet(node: HTMLElement): HTMLElement {\n    // Trace up the DOM hierarchy to find the root cell node.\n    // Then find the corresponding child and select it.\n    let n: HTMLElement | null = node;\n\n    while (n && n !== this.node) {\n      if (n.classList.contains(CODE_SNIPPET_ITEM)) {\n        return n;\n      }\n      n = n.parentElement;\n    }\n    return undefined;\n  }\n\n  /**\n   * Handle the `'lm-dragenter'` event for the widget.\n   */\n  private _evtDragEnter(event: IDragEvent): void {\n    if (!event.mimeData.hasData(JUPYTER_CELL_MIME)) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const target = event.target as HTMLElement;\n\n    if (!event.mimeData.hasData('snippet/id')) {\n      const snippetId = target.id.slice(CODE_SNIPPET_DRAG_HOVER.length);\n      event.mimeData.setData('snippet/id', parseInt(snippetId));\n    }\n\n    const snippet = this._findSnippet(target);\n    if (snippet === undefined) {\n      return;\n    }\n    const snippetNode = snippet as HTMLElement;\n\n    snippetNode.classList.add(DROP_TARGET_CLASS);\n  }\n\n  /**\n   * Handle the `'lm-dragleave'` event for the widget.\n   */\n  private _evtDragLeave(event: IDragEvent): void {\n    if (!event.mimeData.hasData(JUPYTER_CELL_MIME)) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const elements = this.node.getElementsByClassName(DROP_TARGET_CLASS);\n\n    if (elements.length) {\n      (elements[0] as HTMLElement).classList.remove(DROP_TARGET_CLASS);\n    }\n  }\n\n  /**\n   * Handle the `'lm-dragover'` event for the widget.\n   */\n  private _evtDragOver(event: IDragEvent): void {\n    const data = this.findCellData(event.mimeData);\n    if (data === undefined) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    event.dropAction = event.proposedAction;\n    const elements = this.node.getElementsByClassName(DROP_TARGET_CLASS);\n    if (elements.length) {\n      (elements[0] as HTMLElement).classList.remove(DROP_TARGET_CLASS);\n    }\n    const target = event.target as HTMLElement;\n    const snippet = this._findSnippet(target);\n    if (snippet === undefined) {\n      return;\n    }\n    const snippetNode = snippet as HTMLElement;\n\n    snippetNode.classList.add(DROP_TARGET_CLASS);\n  }\n\n  private findCellData(mime: MimeData): string {\n    const code = mime.getData('text/plain');\n\n    return code;\n  }\n  /**\n   * Handle the `'lm-drop'` event for the widget.\n   */\n  private async _evtDrop(event: IDragEvent): Promise<void> {\n    const data = this.findCellData(event.mimeData);\n    if (data === undefined) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (event.proposedAction === 'none') {\n      event.dropAction = 'none';\n      return;\n    }\n\n    let target = event.target as HTMLElement;\n\n    while (target && target.parentElement) {\n      if (target.classList.contains(DROP_TARGET_CLASS)) {\n        target.classList.remove(DROP_TARGET_CLASS);\n        break;\n      }\n      target = target.parentElement;\n    }\n\n    const snippet = this._findSnippet(target);\n\n    // if target is CodeSnippetWidget, then snippet is undefined\n    let idx;\n    if (snippet !== undefined) {\n      idx = parseInt(snippet.id.slice(CODE_SNIPPET_ITEM.length));\n    } else {\n      idx = this.codeSnippetManager.snippets.length;\n    }\n\n    /**\n     * moving snippets inside the snippet panel\n     */\n    const source = event.source;\n    if (source instanceof CodeSnippetDisplay) {\n      event.dropAction = 'move';\n      if (event.mimeData.hasData('snippet/id')) {\n        const srcIdx = event.mimeData.getData('snippet/id') as number;\n        this.moveCodeSnippet(srcIdx, idx);\n      }\n    } else {\n      const notebook: Notebook =\n        event.mimeData.getData('internal:cells')[0].parent;\n\n      const language = notebook.model.defaultKernelLanguage;\n      // Handle the case where we are copying cells\n      event.dropAction = 'copy';\n\n      CodeSnippetInputDialog(this, data, language, idx);\n    }\n\n    // Reorder snippet just to make sure id's are in order.\n    this.codeSnippetManager.orderSnippets().then((res: boolean) => {\n      if (!res) {\n        console.log('Error in ordering snippets');\n        return;\n      }\n    });\n  }\n\n  // move code snippet within code snippet explorer\n  private moveCodeSnippet(srcIdx: number, targetIdx: number): void {\n    this.codeSnippetManager\n      .moveSnippet(srcIdx, targetIdx)\n      .then((res: boolean) => {\n        if (!res) {\n          console.log('Error in moving snippet');\n          return;\n        }\n      });\n    const newSnippets = this.codeSnippetManager.snippets;\n    this.renderCodeSnippetsSignal.emit(newSnippets);\n  }\n\n  render(): React.ReactElement {\n    return (\n      <UseSignal signal={this.renderCodeSnippetsSignal} initialArgs={[]}>\n        {(_, codeSnippets): React.ReactElement => (\n          <div>\n            <CodeSnippetDisplay\n              codeSnippets={codeSnippets}\n              codeSnippetManager={this.codeSnippetManager}\n              app={this.app}\n              getCurrentWidget={this.getCurrentWidget}\n              openCodeSnippetEditor={this.openCodeSnippetEditor}\n              editorServices={this.editorServices}\n              updateCodeSnippetWidget={this.updateCodeSnippetWidget}\n            />\n          </div>\n        )}\n      </UseSignal>\n    );\n  }\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "// Copyright (c) 2020, jupytercalpoly\n// Distributed under the terms of the BSD-3 Clause License.\n\n// Some lines of code are from Elyra Code Snippet.\n\n/*\n * Copyright 2018-2020 IBM Corporation\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions a* limitations under the License.\n */\n\nimport {\n  JupyterFrontEnd,\n  JupyterFrontEndPlugin,\n  ILayoutRestorer,\n} from '@jupyterlab/application';\nimport { ICommandPalette, WidgetTracker } from '@jupyterlab/apputils';\nimport { ISettingRegistry, Settings } from '@jupyterlab/settingregistry';\n\nimport { IEditorServices } from '@jupyterlab/codeeditor';\nimport { LabIcon } from '@jupyterlab/ui-components';\n\nimport { Widget } from '@lumino/widgets';\nimport { find } from '@lumino/algorithm';\n\nimport editorIconSVGstr from '../style/icon/jupyter_snippeteditoricon.svg';\nimport codeSnippetIconSVGstr from '../style/icon/jupyter_snippeticon.svg';\n\nimport { CodeSnippetInputDialog } from './CodeSnippetInputDialog';\nimport { CodeSnippetWidget } from './CodeSnippetWidget';\nimport {\n  CodeSnippetEditor,\n  ICodeSnippetEditorMetadata,\n} from './CodeSnippetEditor';\nimport { CodeSnippetService } from './CodeSnippetService';\nimport { NotebookPanel } from '@jupyterlab/notebook';\nimport { DocumentWidget } from '@jupyterlab/docregistry';\n\n// Code Snippet Constants\nconst CODE_SNIPPET_EXTENSION_ID = 'code-snippet-extension';\n\nconst CODE_SNIPPET_SETTING_ID = 'jupyterlab-code-snippets:snippets';\n\n/**\n * Snippet Editor Icon\n */\nconst editorIcon = new LabIcon({\n  name: 'custom-ui-components:codeSnippetEditorIcon',\n  svgstr: editorIconSVGstr,\n});\n\n/**\n * Snippet Icon\n */\nconst codeSnippetIcon = new LabIcon({\n  name: 'custom-ui-components:codeSnippetIcon',\n  svgstr: codeSnippetIconSVGstr,\n});\n\n/**\n * Initialization data for the code_snippets extension.\n */\nconst code_snippet_extension: JupyterFrontEndPlugin<void> = {\n  id: CODE_SNIPPET_EXTENSION_ID,\n  autoStart: true,\n  requires: [ICommandPalette, ILayoutRestorer, IEditorServices],\n  activate: activateCodeSnippet,\n};\n\nfunction activateCodeSnippet(\n  app: JupyterFrontEnd,\n  palette: ICommandPalette,\n  restorer: ILayoutRestorer,\n  editorServices: IEditorServices\n): void {\n  console.log('JupyterLab extension jupyterlab-code-snippets is activated!');\n\n  const getCurrentWidget = (): Widget => {\n    return app.shell.currentWidget;\n  };\n\n  const codeSnippetWidget = new CodeSnippetWidget(\n    getCurrentWidget,\n    app,\n    editorServices\n  );\n  codeSnippetWidget.id = CODE_SNIPPET_EXTENSION_ID;\n  codeSnippetWidget.title.icon = codeSnippetIcon;\n  codeSnippetWidget.title.caption = 'Code Snippet Explorer';\n\n  restorer.add(codeSnippetWidget, CODE_SNIPPET_EXTENSION_ID);\n\n  // Rank has been chosen somewhat arbitrarily to give priority to the running\n  // sessions widget in the sidebar.\n  app.shell.add(codeSnippetWidget, 'left', { rank: 900 });\n\n  // open code Snippet Editor\n  const openCodeSnippetEditor = (args: ICodeSnippetEditorMetadata): void => {\n    // codeSnippetEditors are in the main area\n    const widgetId = `jp-codeSnippet-editor-${args.id}`;\n\n    // when the editor is already open\n    const openEditor = find(\n      app.shell.widgets('main'),\n      (widget: Widget, _: number) => {\n        return widget.id === widgetId;\n      }\n    );\n\n    if (openEditor) {\n      app.shell.activateById(widgetId);\n      return;\n    }\n\n    const codeSnippetEditor = new CodeSnippetEditor(\n      editorServices,\n      tracker,\n      codeSnippetWidget,\n      args\n    );\n\n    codeSnippetEditor.id = widgetId;\n    codeSnippetEditor.addClass(widgetId);\n    codeSnippetEditor.title.label =\n      args.name === ''\n        ? 'New Code Snippet'\n        : '[' + args.language + '] ' + args.name;\n    codeSnippetEditor.title.closable = true;\n    codeSnippetEditor.title.icon = editorIcon;\n\n    if (!tracker.has(codeSnippetEditor)) {\n      tracker.add(codeSnippetEditor);\n    }\n\n    if (!codeSnippetEditor.isAttached) {\n      app.shell.add(codeSnippetEditor, 'main', {\n        mode: 'tab-after',\n      });\n    }\n\n    // Activate the code Snippet Editor\n    app.shell.activateById(codeSnippetEditor.id);\n  };\n\n  const editorSaveCommand = 'jp-codeSnippet-editor:save';\n  app.commands.addCommand(editorSaveCommand, {\n    execute: () => {\n      const editor = tracker.currentWidget;\n      editor.updateSnippet();\n    },\n  });\n\n  // Add keybinding to save\n  app.commands.addKeyBinding({\n    command: editorSaveCommand,\n    args: {},\n    keys: ['Accel S'],\n    selector: '.jp-codeSnippet-editor',\n  });\n\n  const editorCommand = 'jp-codeSnippet-editor:open';\n  app.commands.addCommand(editorCommand, {\n    execute: (args: any) => {\n      openCodeSnippetEditor(args);\n    },\n  });\n\n  // Add an application command\n  const saveCommand = 'codeSnippet:save-as-snippet';\n  const toggled = false;\n  app.commands.addCommand(saveCommand, {\n    label: 'Save As Code Snippet',\n    isEnabled: () => true,\n    isVisible: () => true,\n    isToggled: () => toggled,\n    iconClass: 'some-css-icon-class',\n    execute: () => {\n      let language = '';\n      // get the language of document or notebook\n      if (app.shell.currentWidget instanceof NotebookPanel) {\n        language = (app.shell.currentWidget as NotebookPanel).sessionContext\n          .kernelPreference.language;\n      } else if (app.shell.currentWidget instanceof DocumentWidget) {\n        language = (app.shell.currentWidget as DocumentWidget).context.model\n          .defaultKernelLanguage;\n      }\n\n      const highlightedCode = getSelectedText();\n      if (highlightedCode === '') {\n        //if user just right-clicks cell(s) to save\n        const curr = document.getElementsByClassName('jp-Cell jp-mod-selected');\n\n        let code = '';\n        // changed i = 1 to i = 0.\n        for (let i = 0; i < curr.length; i++) {\n          //loop through each cell\n          const text = curr[i] as HTMLElement;\n          const cellInputWrappers = text.getElementsByClassName(\n            'jp-Cell-inputWrapper'\n          );\n\n          for (const cellInputWrapper of cellInputWrappers) {\n            const codeLines =\n              cellInputWrapper.querySelectorAll('.CodeMirror-line');\n            for (const codeLine of codeLines) {\n              let codeLineText = codeLine.textContent;\n              if (codeLineText.charCodeAt(0) === 8203) {\n                //check if first char in line is invalid\n                codeLineText = ''; //replace invalid line with empty string\n              }\n              code += codeLineText + '\\n';\n            }\n          }\n        }\n        CodeSnippetInputDialog(\n          codeSnippetWidget,\n          code,\n          language,\n          codeSnippetWidget.codeSnippetManager.snippets.length\n        );\n      } else {\n        CodeSnippetInputDialog(\n          codeSnippetWidget,\n          highlightedCode,\n          language,\n          codeSnippetWidget.codeSnippetManager.snippets.length\n        );\n      }\n    },\n  });\n\n  // Put the saveCommand above in context menu\n  app.contextMenu.addItem({\n    type: 'separator',\n    selector: '.jp-Notebook',\n    rank: 13,\n  });\n\n  app.contextMenu.addItem({\n    command: saveCommand,\n    selector: '.jp-Notebook',\n    rank: 14,\n  });\n\n  app.contextMenu.addItem({\n    type: 'separator',\n    selector: '.jp-Notebook',\n    rank: 15,\n  });\n\n  // Put the saveCommand in non-notebook file context menu\n  app.contextMenu.addItem({\n    type: 'separator',\n    selector: '.jp-FileEditor',\n    rank: 7,\n  });\n\n  app.contextMenu.addItem({\n    command: saveCommand,\n    selector: '.jp-FileEditor',\n    rank: 8,\n  });\n\n  app.contextMenu.addItem({\n    type: 'separator',\n    selector: '.jp-FileEditor',\n    rank: 9,\n  });\n\n  // Track and restore the widget state\n  const tracker = new WidgetTracker<CodeSnippetEditor>({\n    namespace: 'codeSnippetEditor',\n  });\n\n  restorer.restore(tracker, {\n    command: editorCommand,\n    args: (widget) => {\n      const editorMetadata = widget.codeSnippetEditorMetadata;\n      return {\n        name: editorMetadata.name,\n        description: editorMetadata.description,\n        language: editorMetadata.language,\n        code: editorMetadata.code,\n        id: editorMetadata.id,\n        tags: editorMetadata.tags,\n        allSnippetTags: editorMetadata.allSnippetTags,\n        allLangTags: editorMetadata.allLangTags,\n        fromScratch: editorMetadata.fromScratch,\n      };\n    },\n    name: (widget) => {\n      return widget.id;\n    },\n  });\n}\n\nconst codeSnippetExtensionSetting: JupyterFrontEndPlugin<void> = {\n  id: CODE_SNIPPET_SETTING_ID,\n  autoStart: true,\n  requires: [ISettingRegistry],\n  activate: (app: JupyterFrontEnd, settingRegistry: ISettingRegistry) => {\n    void settingRegistry\n      .load(CODE_SNIPPET_SETTING_ID)\n      .then((settings) => {\n        CodeSnippetService.init(settings as Settings, app);\n        console.log(\n          'JupyterLab extension jupyterlab-code-snippets setting is activated!'\n        );\n      })\n      .catch((e) => console.log(e));\n  },\n};\n\nfunction getSelectedText(): string {\n  let selectedText;\n  // window.getSelection\n  if (window.getSelection) {\n    selectedText = window.getSelection();\n  }\n  // document.getSelection\n  else if (document.getSelection) {\n    selectedText = document.getSelection();\n  }\n  return selectedText.toString();\n}\n\nexport default [code_snippet_extension, codeSnippetExtensionSetting];\n"
  },
  {
    "path": "src/svg.d.ts",
    "content": "declare module '*.svg' {\n  const value: string;\n  export default value;\n}\n"
  },
  {
    "path": "style/base.css",
    "content": ":root {\n  --preview-distance: 0px;\n  --preview-max-height: 75px;\n  --more-options-top: 0px;\n  --more-options-left: 0px;\n}\n\n#code-snippet-extension {\n  background-color: var(--jp-layout-color0);\n  overflow: auto;\n}\n\n.jp-codeSnippet-fileDialog label {\n  margin-bottom: 5px;\n}\n\n/*Code Snippet Container CSS*/\n.jp-codeSnippetsContainer-button,\n.jp-codeSnippetsContainer-button.jp-mod-styled {\n  background-color: transparent;\n  vertical-align: middle;\n  padding: 0;\n  padding-right: 8px;\n}\n\n.jp-codeSnippetsContainer-button:hover {\n  cursor: pointer;\n}\n\n.jp-codeSnippetsContainer-title {\n  align-items: center;\n  display: flex;\n  justify-content: space-between;\n  margin-top: 5px;\n  height: 30px;\n  color: var(--jp-ui-font-color0);\n}\n\n.jp-codeSnippetsContainer-name {\n  font-size: var(--jp-ui-font-size1);\n  white-space: nowrap;\n  overflow: hidden;\n  color: var(--jp-ui-font-color0);\n  display: flex;\n  align-items: center;\n  width: 100%;\n}\n\n.jp-codeSnippetsContainer-name span:nth-child(2) {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  height: 19px;\n}\n\n.jp-codeSnippet-name:hover {\n  cursor: pointer;\n}\n\n.jp-codeSnippetsContainer-button {\n  background-repeat: no-repeat;\n  background-position: center;\n  border: none;\n  height: 100%;\n}\n\n/* Size of the icons in code snippet */\n.jp-codeSnippetsContainer-action-buttons {\n  height: 100%;\n  overflow: hidden;\n}\n\n.jp-codeSnippet-item {\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\n  display: flex;\n  margin: 0;\n  padding: 0;\n  height: fit-content;\n  cursor: context-menu;\n}\n\n.jp-codeSnippet-item:hover {\n  background-color: var(--jp-layout-color2);\n}\n\n#jp-codeSnippet-rename {\n  background-color: var(--jp-layout-color2);\n  border: 1px solid var(--jp-layout-color1);\n  border-radius: 4px;\n  font-size: var(--jp-ui-font-size1);\n  box-sizing: border-box;\n  margin: 0px;\n}\n\n.jp-codeSnippet-metadata {\n  flex-basis: 95%;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-evenly;\n  overflow: hidden;\n}\n\n.jp-codeSnippet-description p {\n  font-size: var(--jp-ui-font-size0);\n  line-height: 15px;\n  color: var(--jp-layout-color4);\n  margin-bottom: 10px;\n  width: 90%;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n  overflow: hidden;\n}\n\n/* Header bar of code snippets */\n.jp-codeSnippetsHeader {\n  font-size: var(--jp-ui-font-size1);\n  font-weight: 600;\n  text-transform: uppercase;\n  padding: 8px;\n  color: var(--jp-ui-font-color0);\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n/* Save Notification CSS */\n.jp-codeSnippet-confirm {\n  position: absolute;\n  z-index: 10000;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  top: 0px;\n  left: 0px;\n  margin: 0;\n  padding: 0;\n  width: 100%;\n  height: 100%;\n  background: var(--jp-dialog-background);\n}\n\n.jp-codeSnippet-Message-content {\n  background: var(--jp-layout-color1);\n  display: flex;\n  align-items: center;\n  padding: 0px;\n  padding-left: 40px;\n  border-top: 7px solid #388e3c;\n  width: 250px;\n  min-width: 200px;\n  min-height: 50px;\n  box-sizing: border-box;\n  box-shadow: var(--jp-elevation-z20);\n  word-wrap: break-word;\n  border-radius: var(--jp-border-radius);\n  font-size: var(--jp-ui-font-size1);\n  color: var(--jp-ui-font-color1);\n  margin: auto 6px 30px auto;\n  resize: none;\n}\n\n.jp-codeSnippet-Message-content .jp-Dialog-header {\n  padding: 0px;\n}\n\n.jp-codeSnippet-Message-content .jp-Dialog-footer {\n  padding: 0px;\n}\n\n.jp-codeSnippet-Message-body {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.jp-codeSnippet-confirm-text {\n  width: 183px;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 13px;\n  text-align: left;\n  padding-left: 10px;\n}\n\n/* Code Snippet Preview CSS */\n.jp-codeSnippet-preview {\n  position: absolute;\n  z-index: 10000;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  margin: 0;\n  top: var(--preview-distance);\n}\n\n.jp-codeSnippet-preview.inactive {\n  display: none;\n}\n\n.jp-codeSnippet-preview-content {\n  background: var(--jp-layout-color1);\n  padding: 5px;\n  width: 180px;\n  height: fit-content;\n  max-height: var(--preview-max-height);\n  /*height: 106px;*/\n  box-sizing: border-box;\n  box-shadow: var(--jp-elevation-z2);\n  word-wrap: break-word;\n  border-radius: var(--jp-border-radius);\n  font-size: var(--jp-ui-font-size1);\n  color: var(--jp-ui-font-color1);\n  margin: 10px 10px 10px 0px;\n}\n\n/* Code Snippet Drag and Drop CSS */\n.jp-codeSnippet-drag-hover-selected {\n  background-image: url(./icon/dragtab_jupyter.svg);\n  margin-right: -2px;\n  background-color: var(--jp-layout-color2);\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n.jp-codeSnippet-drag-image {\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\n  background: var(--jp-cell-editor-background);\n  width: var(--jp-private-notebook-dragImage-width);\n  height: var(--jp-private-notebook-dragImage-height);\n}\n\n.jp-codeSnippet-item.jp-codeSnippet-dropTarget {\n  border-top: 2px solid var(--jp-private-notebook-selected-color);\n}\n\n.jp-codeSnippet-drag-hover {\n  flex-basis: 5%;\n  min-width: 20px;\n  padding-right: 5px;\n  margin-right: 5px;\n  cursor: move;\n}\n\n/* Code Snippet Editor CSS */\n.jp-codeSnippet-editor-title {\n  margin-left: 2%;\n  margin-top: 2%;\n  margin-bottom: 20px;\n  color: var(--jp-ui-font-color0);\n  font-size: 25px;\n}\n\n.jp-codeSnippet-editor-label {\n  margin-left: 2%;\n  margin-bottom: 5px;\n  font-size: var(--jp-ui-font-size1);\n  color: var(--jp-ui-font-color0);\n}\n\n.jp-codeSnippet-editor-name,\n.jp-codeSnippet-editor-description {\n  display: block;\n  margin-left: 2%;\n  border-top: transparent;\n  border-left: transparent;\n  border-right: transparent;\n  width: 94%;\n  height: 32px;\n  font-size: var(--jp-ui-font-size1);\n  border-radius: 2px;\n  background: var(--jp-input-background);\n  box-sizing: border-box;\n  border: var(--jp-border-width) solid var(--jp-border-color1);\n  padding-left: 7px;\n  padding-right: 7px;\n  color: var(--jp-ui-font-color0);\n  outline: none;\n  appearance: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  margin-top: 5px;\n  margin-bottom: 15px;\n}\n\n.jp-codeSnippet-editor-language {\n  display: block;\n  margin-bottom: 20px;\n  margin-left: 2%;\n  width: 176px;\n  height: 32px;\n  font-size: var(--jp-ui-font-size1);\n  border-radius: 2px;\n  appearance: none;\n  -webkit-appearance: none; /* chrome and safari */\n  -moz-appearance: none; /* Mozilla */\n  -ms-appearance: none; /* Internet explorer */\n  color: var(--jp-ui-font-color0);\n  outline: none;\n  background: var(--jp-input-background);\n  box-sizing: border-box;\n  border: var(--jp-border-width) solid var(--jp-border-color1);\n  padding-left: 7px;\n  padding-right: 7px;\n  background-image: url(./icon/jupyter_searcharrowdown.svg);\n  background-repeat: no-repeat;\n  background-position: 95% center;\n  margin-top: 5px;\n}\n\n.jp-codeSnippet-editor-language:hover {\n  background-image: none;\n}\n\n.jp-codeSnippet-editor-tagList {\n  list-style: none;\n  margin-left: 2%;\n  margin-bottom: 8px;\n  margin-top: -8px;\n}\n\n.jp-codeSnippet-editor-tag {\n  margin-left: 3px;\n  margin-right: 3px;\n}\n\n.jp-codeSnippet-editor-tag button {\n  cursor: pointer;\n  background: none;\n  border: none;\n  color: var(--jp-ui-font-color2);\n  padding: 0;\n  font-size: var(--jp-ui-font-size1);\n}\n\n.jp-codeSnippet-editor-tag input {\n  border: none;\n  background: transparent;\n}\n\n.jp-codeSnippet-editor-tag.applied-tag button {\n  color: var(--jp-ui-font-color1);\n}\n\n.jp-codeSnippet-editor-tag.unapplied-tag button {\n  color: var(--jp-ui-font-color2);\n}\n\n.jp-codeSnippet-editor-tag.tag.unapplied-tag input {\n  border: none;\n  background: transparent;\n}\n\n.jp-codeSnippet-editor-active {\n  border: 1px solid var(--jp-cell-editor-active-border-color);\n  background-color: var(--jp-input-active-background);\n}\n.jp-codeSnippetInputArea {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  width: 98.5%;\n  padding-left: 12px;\n}\n\n.jp-codeSnippetInputArea-editor {\n  overflow: auto;\n  margin-left: 2%;\n  margin-right: 3%;\n  margin-top: 5px;\n}\n\n.jp-codeSnippetInput-editor {\n  border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);\n  border-radius: 0px;\n  background: var(--jp-cell-editor-background);\n}\n\n.jp-codeSnippetInput-editor.active {\n  border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);\n  box-shadow: var(--jp-input-box-shadow);\n  background-color: var(--jp-cell-editor-active-background);\n}\n\n.jp-codeSnippetInput-editor .CodeMirror.cm-s-jupyter {\n  background: transparent;\n}\n\n.jp-codeSnippetInputArea .saveBtn {\n  width: 10%;\n  background: var(--jp-brand-color1);\n  color: var(--jp-ui-inverse-font-color0);\n  align-self: flex-end;\n  margin-top: 12px;\n  margin-right: 3%;\n  margin-bottom: 12px;\n}\n\n/* code snippet create button */\n.jp-createSnippetBtn {\n  cursor: pointer;\n  border: none;\n  background: none;\n  padding: 0px;\n}\n\n/* @import url('~@jupyterlab/codeeditor/style/index.css'); */\n\n/* Code Snippet Filter CSS */\n.jp-codeSnippet-searchbar {\n  margin: 0px 8px;\n}\n\n.jp-codeSnippet-filterTools {\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\n}\n\nmark.jp-codeSnippet-search-bolding {\n  background-color: transparent;\n  font-weight: bold;\n  color: var(--jp-ui-font-color0);\n}\n\n.jp-codeSnippet-filter {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin: 10px 10px 0 10px;\n}\n\n.jp-codeSnippet-filter .jp-codeSnippet-filter-btn {\n  align-self: flex-end;\n  padding: 0px;\n  padding-bottom: 10px;\n  border: none;\n  background: none;\n  cursor: pointer;\n  color: var(--jp-brand-color2);\n}\n\n.jp-codeSnippet-filter-arrow-up.idle,\n.jp-codeSnippet-filter-option.idle {\n  display: none;\n}\n\n.jp-codeSnippet-filter-arrow-up {\n  position: absolute;\n  margin-top: 20px;\n  border: var(--jp-border-width) solid var(--jp-border-color2);\n  border-width: 0 var(--jp-border-width) var(--jp-border-width) 0;\n  padding: 4px;\n  margin-right: 38px;\n  align-self: flex-end;\n  transform: rotate(-135deg);\n  -webkit-transform: rotate(-135deg);\n  background-color: var(--jp-layout-color0);\n}\n\n.jp-codeSnippet-filter-option {\n  border: var(--jp-border-width) solid var(--jp-border-color2);\n  height: 140px;\n  width: 100%;\n  margin-bottom: 10px;\n  overflow: auto;\n}\n\n.jp-codeSnippet-filter-title {\n  text-transform: uppercase;\n  color: var(--jp-ui-font-color2);\n  font-size: var(--jp-ui-font-size1);\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\n  margin: 10px 10px;\n  padding-bottom: 5px;\n}\n\n.jp-codeSnippet-filter-tags {\n  margin: 0px 8px;\n}\n\n.jp-codeSnippet-filter-tag {\n  margin-left: 3px;\n  margin-right: 3px;\n}\n\n.jp-codeSnippet-filter-tag button {\n  cursor: pointer;\n  background: none;\n  border: none;\n  color: var(--jp-ui-font-color2);\n  padding: 0;\n  font-size: var(--jp-ui-font-size1);\n}\n\n.jp-codeSnippet-tools {\n  border-bottom: var(--jp-border-width) solid var(--jp-border-color2);\n}\n\n/* Code Snippet Tags in InputDialog */\n.jp-codeSnippet-inputTagList {\n  list-style: none;\n}\n\n.jp-codeSnippet-inputTag {\n  margin-left: 8px;\n  margin-right: 8px;\n}\n\n.jp-codeSnippet-inputTag button {\n  cursor: pointer;\n  background: none;\n  border: none;\n  color: var(--jp-ui-font-color2);\n  padding: 0;\n  font-size: var(--jp-ui-font-size1);\n}\n\n.jp-codeSnippet-inputTag input {\n  font-size: var(--jp-ui-font-size1);\n  background: none;\n  border: none;\n  color: var(--jp-ui-font-color2);\n  padding: 0;\n  font-size: var(--jp-ui-font-size1);\n  width: 50px;\n}\n\n.jp-codeSnippet-tags {\n  margin-top: 8px;\n}\n\n/* .jp-codeSnippet-tag,\n.jp-codeSnippet-inputTag,\n.jp-codeSnippet-filter-tag {\n  height: 5px;\n} */\n\n/* USER Input Form Style\n.jp-codeSnippet-form {\n  position: absolute;\n  z-index: 10000;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  top: 0px;\n  left: 0px;\n  margin: 0;\n  padding: 0;\n  width: 100%;\n  height: 100%;\n  background: var(--jp-dialog-background);\n} */\n\n/* .jp-codesnippet-editor-name:required {\n    border-color: #808080;\n    border-width: 3px;\n  } */\n\n.jp-codeSnippet-dialog-name-input.touched:invalid,\n.jp-codeSnippet-dialog-desc-input.touched:invalid,\n.jp-codeSnippet-dialog-lang-input.touched:invalid,\n.jp-codeSnippet-editor-name.touched:invalid,\n.jp-codeSnippet-editor-description.touched:invalid,\n.jp-codeSnippet-editor-language.touched:invalid {\n  border: var(--jp-border-width) solid var(--jp-error-color1);\n}\n\n.jp-codeSnippet-dialog-name-input.jp-mod-styled,\n.jp-codeSnippet-dialog-desc-input.jp-mod-styled,\n.jp-codeSnippet-dialog-lang-input.jp-mod-styled {\n  margin-bottom: 10px;\n  font-size: var(--jp-ui-font-size1);\n}\n\n.jp-codeSnippet-inputName-validity,\n.jp-codeSnippet-inputDesc-validity {\n  font-size: var(--jp-ui-font-size0);\n  color: var(--jp-ui-font-color1);\n  margin: 5px;\n  margin-bottom: 8px;\n}\n\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputName-validity,\n.jp-codeSnippet-editor-metadata .jp-codeSnippet-inputDesc-validity {\n  margin-bottom: 20px;\n  margin-top: 5px;\n  margin-left: 3%;\n}\n\n/* 3 Dots Dropdown On Code Snippet */\n.jp-codeSnippet-options {\n  position: absolute;\n  z-index: 10000;\n  height: 100%;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  margin: 0;\n  background-color: transparent;\n}\n\n.jp-codeSnippet-options.inactive {\n  display: none;\n}\n\n.jp-codeSnippet-more-options-content {\n  width: 183px;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 13px;\n  text-align: left;\n}\n\n.jp-codeSnippet-options-content {\n  background: var(--jp-layout-color1);\n  padding: 10px;\n  border: 1px solid var(--jp-border-color0);\n  width: 180px;\n  box-sizing: border-box;\n  box-shadow: var(--jp-elevation-z1);\n  word-wrap: break-word;\n  border-radius: var(--jp-border-radius);\n  font-size: var(--jp-ui-font-size0);\n  color: var(--jp-ui-font-color1);\n  position: absolute;\n  top: var(--more-options-top);\n  left: var(--more-options-left);\n}\n\n.jp-codeSnippet-options-body {\n  display: flex;\n  align-items: center;\n}\n\n.jp-codeSnippet-more-options-copy {\n  padding-bottom: 5px;\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-copy:hover {\n  background-color: var(--jp-layout-color2);\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-insert {\n  padding-bottom: 5px;\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-insert:hover {\n  background-color: var(--jp-layout-color2);\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-edit {\n  padding-bottom: 5px;\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-edit:hover {\n  background-color: var(--jp-layout-color2);\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-delete {\n  color: var(--jp-error-color0);\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-delete:hover {\n  background-color: var(--jp-layout-color2);\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-export {\n  color: var(--jp-brand-color0);\n  padding-bottom: 5px;\n  cursor: pointer;\n}\n\n.jp-codeSnippet-more-options-export:hover {\n  background-color: var(--jp-layout-color2);\n  cursor: pointer;\n}\n\n.jp-dropdown-delete-button {\n  border: none;\n}\n\n.jp-dropdown-cancel-button {\n  outline: 1px solid var(--jp-brand-color1);\n  outline-offset: 4px;\n}\n"
  },
  {
    "path": "style/index.css",
    "content": "@import url('base.css');"
  },
  {
    "path": "style/index.js",
    "content": "import './base.css';\n"
  },
  {
    "path": "test/codeSnippetContentsService.test.ts",
    "content": "import { CodeSnippetContentsService } from '../src/CodeSnippetContentsService';\nimport {\n  ServerConnection,\n  ContentsManager,\n  Contents\n} from '@jupyterlab/services';\nimport 'jest';\nimport { Response } from 'node-fetch';\n\nexport const DEFAULT_FILE: Contents.IModel = {\n  name: 'test',\n  path: 'foo/test',\n  type: 'file',\n  created: 'yesterday',\n  last_modified: 'today',\n  writable: true,\n  mimetype: 'text/plain',\n  content: 'hello, world!',\n  format: 'text'\n};\n\ninterface IService {\n  readonly serverSettings: ServerConnection.ISettings;\n}\n\nconst codeSnippetContentsService = CodeSnippetContentsService.getInstance();\nconst serverSettings = ServerConnection.makeSettings();\nconst manager = new ContentsManager({ serverSettings });\n\ncodeSnippetContentsService.contentsManager = manager;\n\nfunction handleRequest(item: IService, status: number, body: any) {\n  // Store the existing fetch function.\n  const oldFetch = item.serverSettings.fetch;\n\n  // A single use callback.\n  const temp = (info: RequestInfo, init: RequestInit) => {\n    // Restore fetch.\n    (item.serverSettings as any).fetch = oldFetch;\n\n    // Normalize the body.\n    if (typeof body !== 'string') {\n      body = JSON.stringify(body);\n    }\n\n    // Create the response and return it as a promise.\n    const response = new Response(body, { status });\n\n    return Promise.resolve(response as any);\n  };\n\n  // Override the fetch function.\n  (item.serverSettings as any).fetch = temp;\n}\n\ntest('test get instance', () => {\n  expect(codeSnippetContentsService).toBeInstanceOf(CodeSnippetContentsService);\n});\n\ntest('test save', async () => {\n  handleRequest(codeSnippetContentsService.contentsManager, 200, DEFAULT_FILE);\n\n  const saved = await codeSnippetContentsService.save('foo/bar', {\n    type: 'file',\n    format: 'text'\n  });\n\n  expect(saved.content).toBe('hello, world!');\n  expect(saved.path).toBe('foo/bar');\n});\n"
  },
  {
    "path": "test/sample.test.ts",
    "content": "test('two plus two is four', () => {\n  expect(2 + 2).toBe(4);\n});\n\n// mock function\n// const add = jest.fn();\n\n// import { cleanup } from '@testing-library/react';\n// // import { CodeSnippetDisplay } from '../src/CodeSnippetDisplay';\n// // import { ICodeSnippet } from '../src/CodeSnippetContentsService';\n// import { JupyterFrontEnd } from '@jupyterlab/application';\n// import { Widget } from '@lumino/widgets';\n// import { IEditorServices } from '@jupyterlab/codeeditor';\n// import { CodeSnippetWidget } from '../src/CodeSnippetWidget';\n\n// afterEach(cleanup);\n\n// it('renders without crashing', () => {\n//   let app: JupyterFrontEnd;\n//   let editorServices: IEditorServices;\n//   const getCurrentWidget = (): Widget => {\n//     return app.shell.currentWidget;\n//   };\n\n//   const codeSnippetWidget = new CodeSnippetWidget(\n//     getCurrentWidget,\n//     app,\n//     editorServices\n//   );\n\n//   expect(codeSnippetWidget).toBeInstanceOf(CodeSnippetWidget);\n// });\n\n// const openCodeSnippetEditor = (args: ICodeSnippetEditorMetadata): void => {\n//   // codeSnippetEditors are in the main area\n//   const widgetId = `jp-codeSnippet-editor-${args.id}`;\n\n//   const openEditor = find(\n//     app.shell.widgets('main'),\n//     (widget: Widget, _: number) => {\n//       return widget.id === widgetId;\n//     }\n//   );\n//   if (openEditor) {\n//     app.shell.activateById(widgetId);\n//     return;\n//   }\n\n//   const codeSnippetEditor = new CodeSnippetEditor(\n//     contentsService,\n//     editorServices,\n//     tracker,\n//     codeSnippetWidget,\n//     args\n//   );\n\n//   codeSnippetEditor.id = widgetId;\n//   codeSnippetEditor.addClass(widgetId);\n//   codeSnippetEditor.title.label =\n//     args.name === ''\n//       ? 'New Code Snippet'\n//       : '[' + args.language + '] ' + args.name;\n//   codeSnippetEditor.title.closable = true;\n//   codeSnippetEditor.title.icon = editorIcon;\n\n//   if (!tracker.has(codeSnippetEditor)) {\n//     tracker.add(codeSnippetEditor);\n//   }\n\n//   if (!codeSnippetEditor.isAttached) {\n//     app.shell.add(codeSnippetEditor, 'main', {\n//       mode: 'tab-after'\n//     });\n//   }\n\n//   // Activate the code Snippet Editor\n//   app.shell.activateById(codeSnippetEditor.id);\n// };\n\n// it('renders without crashing', () => {\n\n//   const codeSnippet: ICodeSnippet = {\n//     name: 'test',\n//     description: 'testing CodeSnippetDisplay component',\n//     id: 0,\n//     language: 'Python',\n//     code: []\n//   }\n\n//   const test = new CodeSnippetDisplay()\n//   odeSnippets={codeSnippets}\n//               app={this.app}\n//               getCurrentWidget={this.getCurrentWidget}\n//               openCodeSnippetEditor={this.openCodeSnippetEditor.bind(this)}\n//               editorServices={this.editorServices}\n//               _codeSnippetWidgetModel={this._codeSnippetWidgetModel}\n//               updateCodeSnippets={this.updateCodeSnippets}\n\n//   render(<CodeSnippetDisplay />)\n\n// });\n"
  },
  {
    "path": "testutils/jest-setup-files.js",
    "content": "import { configure } from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nglobal.fetch = require('jest-fetch-mock');\nconfigure({ adapter: new Adapter() });\n\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"allowSyntheticDefaultImports\": true,\n    \"composite\": true,\n    \"declaration\": true,\n    \"esModuleInterop\": true,\n    \"incremental\": true,\n    \"jsx\": \"react\",\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"noEmitOnError\": true,\n    \"noImplicitAny\": true,\n    \"noUnusedLocals\": true,\n    \"preserveWatchOutput\": true,\n    \"resolveJsonModule\": true,\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"strictNullChecks\": false,\n    \"target\": \"es2017\",\n    \"types\": []\n  },\n  \"include\": [\"src/*\"]\n}\n"
  },
  {
    "path": "tsconfig.test.json",
    "content": "{\n    \"compilerOptions\": {\n      \"declaration\": true,\n      \"noImplicitAny\": true,\n      \"noEmitOnError\": true,\n      \"noUnusedLocals\": true,\n      \"module\": \"commonjs\",\n      \"moduleResolution\": \"node\",\n      \"target\": \"es2015\",\n      \"outDir\": \"lib\",\n      \"lib\": [\n        \"es2015\",\n        \"es2015.collection\",\n        \"dom\",\n        \"es2015.iterable\",\n        \"es2017.object\"\n      ],\n      \"types\": [\"jest\", \"node\"],\n      \"typeRoots\": [\"./types\", \"./node_modules/@types\"],\n      \"jsx\": \"react\",\n      \"resolveJsonModule\": true,\n      \"esModuleInterop\": true,\n      \"strictNullChecks\": true,\n      \"skipLibCheck\": true\n    },\n    \"include\": [\"src/**/*\", \"test/**/*\"]\n  }\n"
  }
]